From 465d3cc6e9d5f84f571f317520c05c06c02be7b3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Dec 2021 15:09:45 +0800 Subject: [PATCH] testrecord detail bug --- hb_server/apps/qm/serializers.py | 2 +- hb_server/apps/wf/models.py | 2 +- hb_server/apps/wf/serializers.py | 2 +- hb_server/apps/wf/services.py | 7 +++++++ hb_server/apps/wf/views.py | 19 ++++++++++++++----- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py index 6785b0c..d453937 100644 --- a/hb_server/apps/qm/serializers.py +++ b/hb_server/apps/qm/serializers.py @@ -100,7 +100,7 @@ class TestRecordDetailSerializer(serializers.ModelSerializer): def to_representation(self, instance): ret = super().to_representation(instance) if instance.origin_test and instance.type == TestRecord.TEST_PROCESS_RE: - origin_test = ret['origin_test'] + origin_test = ret['origin_test_'] o_dict = {} for i in origin_test['record_data']: o_dict[i['field_key']] = i['field_value'] diff --git a/hb_server/apps/wf/models.py b/hb_server/apps/wf/models.py index f343e2d..7b2e280 100644 --- a/hb_server/apps/wf/models.py +++ b/hb_server/apps/wf/models.py @@ -197,7 +197,7 @@ class Ticket(CommonBModel): ('worked', '我处理的'), ('cc', '抄送我的') ) - title = models.CharField('标题', max_length=500, blank=True, default='', help_text="工单标题") + title = models.CharField('标题', max_length=500, null=True, blank=True, help_text="工单标题") workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, verbose_name='关联工作流') sn = models.CharField('流水号', max_length=25, help_text="工单的流水号") state = models.ForeignKey(State, on_delete=models.CASCADE, verbose_name='当前状态', related_name='ticket_state') diff --git a/hb_server/apps/wf/serializers.py b/hb_server/apps/wf/serializers.py index e79f121..ae3bf88 100644 --- a/hb_server/apps/wf/serializers.py +++ b/hb_server/apps/wf/serializers.py @@ -49,7 +49,7 @@ class TicketSimpleSerializer(serializers.ModelSerializer): fields = '__all__' class TicketCreateSerializer(serializers.ModelSerializer): - transition = serializers.IntegerField(label='流转ID') + transition = serializers.PrimaryKeyRelatedField(queryset=Transition.objects.all(), write_only=True) class Meta: model=Ticket fields=['title','workflow', 'ticket_data', 'transition'] diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index badfc5e..46ef6b8 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -54,6 +54,13 @@ class WfService(object): """ return CustomField.objects.filter(is_deleted=False, workflow=workflow).order_by('sort') + @staticmethod + def get_workflow_custom_fields_list(workflow:Workflow): + """ + 获取工单字段key List + """ + return CustomField.objects.filter(is_deleted=False, workflow=workflow).order_by('sort').values_list('field_key', flat=True) + @classmethod def get_ticket_transitions(cls, ticket:Ticket): """ diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index 592e422..22da7aa 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -137,14 +137,23 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin rdata = request.data serializer = self.get_serializer(data=rdata) serializer.is_valid(raise_exception=True) - start_state = WfService.get_workflow_start_state(rdata['workflow']) - transition = Transition.objects.get(pk=rdata['transition']) - ticket_data = rdata['ticket_data'] + vdata = serializer.validated_data #校验之后的数据 + start_state = WfService.get_workflow_start_state(vdata['workflow']) + field_key_list = WfService.get_workflow_custom_fields_list(vdata['workflow']) + transition = vdata['transition'] + ticket_data = vdata['ticket_data'] + #校验必填项 if transition.field_require_check: - for key, value in start_state.state_fields.items(): #校验必填项 + for key, value in start_state.state_fields.items(): if value == State.STATE_FIELD_REQUIRED: if key not in ticket_data or not ticket_data[key]: raise APIException('字段{}必填'.format(key)) + save_ticket_data = {} + # 只保存必填项以及可选项 + for key, vlaue in ticket_data: + if key in field_key_list and key in start_state.state_fields and start_state.state_fields[key] in [ + State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL]: + save_ticket_data[key] = value ticket = serializer.save(state=start_state, create_by=request.user, act_state=Ticket.TICKET_ACT_STATE_DRAFT, belong_dept=request.user.dept) # 先创建出来 next_state = WfService.get_next_state_by_transition_and_ticket_info(ticket=ticket, transition=transition) @@ -159,7 +168,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin act_state = Ticket.TICKET_ACT_STATE_DRAFT else: act_state = Ticket.TICKET_ACT_STATE_ONGOING - title = rdata.get('title', '') + title = vdata['title'] title_template = ticket.workflow.title_template if title_template: all_ticket_data = {**rdata, **rdata['ticket_data']}