增加条件流转

This commit is contained in:
caoqianming 2021-09-30 16:09:39 +08:00
parent bb53fbe220
commit 050d4e5bda
3 changed files with 12 additions and 6 deletions

View File

@ -77,7 +77,7 @@ class TicketListSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Ticket 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 @staticmethod
def setup_eager_loading(queryset): def setup_eager_loading(queryset):

View File

@ -91,7 +91,7 @@ class WfService(object):
@classmethod @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('流转错误') # raise APIException('流转错误')
source_state = ticket.state source_state = ticket.state
destination_state = transition.destination_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: 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 return destination_state
@classmethod @classmethod

View File

@ -128,7 +128,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin
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))
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) 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) 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) 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) 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): def handle(self, request, pk=None):
""" """
处理工单 处理工单
@ -185,7 +185,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin
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))
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 multi_all_person = ticket.multi_all_person
if multi_all_person: if multi_all_person:
multi_all_person[request.user.id] =dict(transition=transition.id) multi_all_person[request.user.id] =dict(transition=transition.id)