From 050d4e5bda391296ad2ae6eb139d96592c0fc28e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 30 Sep 2021 16:09:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9D=A1=E4=BB=B6=E6=B5=81?= =?UTF-8?q?=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wf/serializers.py | 2 +- hb_server/apps/wf/services.py | 10 ++++++++-- hb_server/apps/wf/views.py | 6 +++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/hb_server/apps/wf/serializers.py b/hb_server/apps/wf/serializers.py index 4d6b770..81512ed 100644 --- a/hb_server/apps/wf/serializers.py +++ b/hb_server/apps/wf/serializers.py @@ -77,7 +77,7 @@ class TicketListSerializer(serializers.ModelSerializer): class Meta: model = Ticket - fields = ['id', 'title', 'sn', 'workflow', 'workflow_', 'state', 'state_', 'act_state', 'create_time', 'update_time'] + fields = ['id', 'title', 'sn', 'workflow', 'workflow_', 'state', 'state_', 'act_state', 'create_time', 'update_time', 'participant_type'] @staticmethod def setup_eager_loading(queryset): diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index dd206ee..a3fc2b8 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -91,7 +91,7 @@ class WfService(object): @classmethod - def get_next_state_by_transition_and_ticket_info(cls, ticket:Ticket, transition: Transition)->object: + def get_next_state_by_transition_and_ticket_info(cls, ticket:Ticket, transition: Transition, ticket_data:dict={})->object: """ 获取下个节点状态 """ @@ -103,8 +103,14 @@ class WfService(object): # raise APIException('流转错误') source_state = ticket.state destination_state = transition.destination_state + ticket_all_value = cls.get_ticket_all_field_value(ticket) + ticket_all_value.update(**ticket_data) if transition.condition_expression: - pass + for i in transition.condition_expression: + expression = i['expression'].format(**ticket_all_value) + import datetime, time # 用于支持条件表达式中对时间的操作 + if eval(expression): + destination_state = State.objects.get(i['expression'].get('target')) return destination_state @classmethod diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index 4a00884..cd33e99 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -128,7 +128,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin if value == State.STATE_FIELD_REQUIRED: if key not in ticket_data or not ticket_data[key]: raise APIException('字段{}必填'.format(key)) - ticket = serializer.save(state=start_state, create_by=request.user) # 先创建出来 + ticket = serializer.save(state=start_state, create_by=request.user, act_state=Ticket.TICKET_ACT_STATE_DRAFT) # 先创建出来 next_state = WfService.get_next_state_by_transition_and_ticket_info(ticket=ticket, transition=transition) participant_info = WfService.get_ticket_state_participant_info(state=next_state, ticket=ticket, ticket_data=ticket.ticket_data) destination_participant_type = participant_info.get('destination_participant_type', 0) @@ -162,7 +162,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin return Response(TicketSerializer(instance=ticket).data) - @action(methods=['post'], detail=True, perms_map={'get':'*'}) + @action(methods=['post'], detail=True, perms_map={'post':'*'}) def handle(self, request, pk=None): """ 处理工单 @@ -185,7 +185,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin if value == State.STATE_FIELD_REQUIRED: if key not in ticket_data or not ticket_data[key]: raise APIException('字段{}必填'.format(key)) - destination_state = WfService.get_next_state_by_transition_and_ticket_info(ticket, transition) + destination_state = WfService.get_next_state_by_transition_and_ticket_info(ticket, transition, ticket_data) multi_all_person = ticket.multi_all_person if multi_all_person: multi_all_person[request.user.id] =dict(transition=transition.id)