testrecord detail bug

This commit is contained in:
caoqianming 2021-12-16 15:09:45 +08:00
parent 9d4a75497d
commit 465d3cc6e9
5 changed files with 24 additions and 8 deletions

View File

@ -100,7 +100,7 @@ class TestRecordDetailSerializer(serializers.ModelSerializer):
def to_representation(self, instance): def to_representation(self, instance):
ret = super().to_representation(instance) ret = super().to_representation(instance)
if instance.origin_test and instance.type == TestRecord.TEST_PROCESS_RE: if instance.origin_test and instance.type == TestRecord.TEST_PROCESS_RE:
origin_test = ret['origin_test'] origin_test = ret['origin_test_']
o_dict = {} o_dict = {}
for i in origin_test['record_data']: for i in origin_test['record_data']:
o_dict[i['field_key']] = i['field_value'] o_dict[i['field_key']] = i['field_value']

View File

@ -197,7 +197,7 @@ class Ticket(CommonBModel):
('worked', '我处理的'), ('worked', '我处理的'),
('cc', '抄送我的') ('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='关联工作流') workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, verbose_name='关联工作流')
sn = models.CharField('流水号', max_length=25, help_text="工单的流水号") sn = models.CharField('流水号', max_length=25, help_text="工单的流水号")
state = models.ForeignKey(State, on_delete=models.CASCADE, verbose_name='当前状态', related_name='ticket_state') state = models.ForeignKey(State, on_delete=models.CASCADE, verbose_name='当前状态', related_name='ticket_state')

View File

@ -49,7 +49,7 @@ class TicketSimpleSerializer(serializers.ModelSerializer):
fields = '__all__' fields = '__all__'
class TicketCreateSerializer(serializers.ModelSerializer): class TicketCreateSerializer(serializers.ModelSerializer):
transition = serializers.IntegerField(label='流转ID') transition = serializers.PrimaryKeyRelatedField(queryset=Transition.objects.all(), write_only=True)
class Meta: class Meta:
model=Ticket model=Ticket
fields=['title','workflow', 'ticket_data', 'transition'] fields=['title','workflow', 'ticket_data', 'transition']

View File

@ -54,6 +54,13 @@ class WfService(object):
""" """
return CustomField.objects.filter(is_deleted=False, workflow=workflow).order_by('sort') 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 @classmethod
def get_ticket_transitions(cls, ticket:Ticket): def get_ticket_transitions(cls, ticket:Ticket):
""" """

View File

@ -137,14 +137,23 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin
rdata = request.data rdata = request.data
serializer = self.get_serializer(data=rdata) serializer = self.get_serializer(data=rdata)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
start_state = WfService.get_workflow_start_state(rdata['workflow']) vdata = serializer.validated_data #校验之后的数据
transition = Transition.objects.get(pk=rdata['transition']) start_state = WfService.get_workflow_start_state(vdata['workflow'])
ticket_data = rdata['ticket_data'] field_key_list = WfService.get_workflow_custom_fields_list(vdata['workflow'])
transition = vdata['transition']
ticket_data = vdata['ticket_data']
#校验必填项
if transition.field_require_check: 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 value == State.STATE_FIELD_REQUIRED:
if key not in ticket_data or not ticket_data[key]: if key not in ticket_data or not ticket_data[key]:
raise APIException('字段{}必填'.format(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) # 先创建出来 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) 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 act_state = Ticket.TICKET_ACT_STATE_DRAFT
else: else:
act_state = Ticket.TICKET_ACT_STATE_ONGOING act_state = Ticket.TICKET_ACT_STATE_ONGOING
title = rdata.get('title', '') title = vdata['title']
title_template = ticket.workflow.title_template title_template = ticket.workflow.title_template
if title_template: if title_template:
all_ticket_data = {**rdata, **rdata['ticket_data']} all_ticket_data = {**rdata, **rdata['ticket_data']}