from apps.wf.models import CustomField, State, Ticket, Transition, Workflow from rest_framework.exceptions import APIException class WfService(object): @staticmethod def get_worlflow_states(workflow:Workflow): """ 获取工作流状态列表 """ return State.objects.filter(workflow=workflow, is_deleted=False).order_by('sort') @staticmethod def get_workflow_transitions(workflow:Workflow): """ 获取工作流流转列表 """ return Transition.objects.filter(workflow=workflow, is_deleted=False) @staticmethod def get_workflow_start_state(workflow:Workflow): """ 获取工作流初始状态 """ try: wf_state_obj = State.objects.get(workflow=workflow, type=State.STATE_TYPE_START, is_deleted=False) return wf_state_obj except: raise Exception('工作流状态配置错误') @staticmethod def get_workflow_custom_fields(workflow:Workflow): """ 获取工单字段 """ return CustomField.objects.filter(is_deleted=False, workflow=workflow).order_by('sort') @classmethod def get_ticket_transitions(cls, ticket:Ticket): """ 获取工单当前状态下可用的流转条件 """ return cls.get_state_transitions(ticket.state) @classmethod def get_state_transitions(cls, state:State): """ 获取状态可执行的操作 """ return Transition.objects.filter(is_deleted=False, source_state=state).all() @classmethod def get_ticket_steps(cls, ticket:Ticket): steps = cls.get_worlflow_states(ticket.workflow) for i in steps: if ticket.state.is_hidden and ticket.state != i: steps.remove(i) return steps @classmethod def get_ticket_transitions(cls, ticket:Ticket): """ 获取工单可执行的操作 """ return cls.get_state_transitions(ticket.state) @classmethod def get_transition_by_args(cls, kwargs:dict): """ 查询并获取流转 """ kwargs['is_deleted'] = False return Transition.objects.filter(**kwargs).all() @classmethod def get_next_state_id_by_transition_and_ticket_info(cls, ticket:Ticket, transition: Transition, workflow:Workflow = None)->object: """ 获取下个节点状态 """ if ticket: # 如果是新建工单 source_state = ticket.state else: source_state = cls.get_workflow_start_state(workflow) if transition.source_state != source_state: raise APIException('流转错误') destination_state = transition.destination_state if transition.condition_expression: pass return destination_state @classmethod def get_ticket_state_participant_info(cls, state:State, ticket:Ticket, ticket_data:dict): """ 获取工单目标状态实际的处理人 """ if state.type == State.STATE_TYPE_START: """ 回到初始状态 """ elif state.type == State.STATE_TYPE_END: """ 到达结束状态 """