145 lines
6.7 KiB
Python
145 lines
6.7 KiB
Python
from rest_framework.response import Response
|
|
from rest_framework import serializers
|
|
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin
|
|
from apps.wf.serializers import CustomFieldSerializer, StateSerializer, TicketCreateSerializer, TicketSerializer, TransitionSerializer, WorkflowSerializer
|
|
from django.shortcuts import render
|
|
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
|
from rest_framework.decorators import action, api_view
|
|
from apps.wf.models import CustomField, Ticket, Workflow, State, Transition
|
|
from apps.system.mixins import CreateUpdateCustomMixin, CreateUpdateModelAMixin, OptimizationMixin
|
|
from apps.wf.services import WfService
|
|
from rest_framework.exceptions import APIException
|
|
|
|
# Create your views here.
|
|
class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
|
perms_map = {'get': '*', 'post': 'workflow_create',
|
|
'put': 'workflow_update', 'delete': 'workflow_delete'}
|
|
queryset = Workflow.objects.all()
|
|
serializer_class = WorkflowSerializer
|
|
search_fields = ['name', 'description']
|
|
filterset_fields = []
|
|
ordering_fields = ['create_time']
|
|
ordering = ['-create_time']
|
|
|
|
@action(methods=['get'], detail=True, perms_map={'get':'workflow_update'}, pagination_class=None, serializer_class=StateSerializer)
|
|
def states(self, request, pk=None):
|
|
"""
|
|
工作流下的状态节点
|
|
"""
|
|
wf = self.get_object()
|
|
serializer = self.serializer_class(instance=WfService.get_worlflow_states(wf), many=True)
|
|
return Response(serializer.data)
|
|
|
|
@action(methods=['get'], detail=True, perms_map={'get':'workflow_update'}, pagination_class=None, serializer_class=TransitionSerializer)
|
|
def transitions(self, request, pk=None):
|
|
"""
|
|
工作流下的流转规则
|
|
"""
|
|
wf = self.get_object()
|
|
serializer = self.serializer_class(instance=WfService.get_workflow_transitions(wf), many=True)
|
|
return Response(serializer.data)
|
|
|
|
@action(methods=['get'], detail=True, perms_map={'get':'workflow_update'}, pagination_class=None, serializer_class=CustomFieldSerializer)
|
|
def customfields(self, request, pk=None):
|
|
"""
|
|
工作流下的自定义字段
|
|
"""
|
|
wf = self.get_object()
|
|
serializer = self.serializer_class(instance=CustomField.objects.filter(workflow=wf), many=True)
|
|
return Response(serializer.data)
|
|
|
|
@action(methods=['get'], detail=True, perms_map={'get':'workflow_init'})
|
|
def init(self, request, pk=None):
|
|
"""
|
|
新建工单初始化
|
|
"""
|
|
ret={}
|
|
wf = self.get_object()
|
|
start_state = WfService.get_workflow_start_state(wf)
|
|
transitions = WfService.get_state_transitions(start_state)
|
|
ret['workflow'] = pk
|
|
ret['transitions'] = TransitionSerializer(instance=transitions, many=True).data
|
|
field_list = CustomFieldSerializer(instance=WfService.get_workflow_custom_fields(wf), many=True).data
|
|
ret['field_list'] = field_list
|
|
return Response(ret)
|
|
|
|
class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet):
|
|
perms_map = {'*':'*'}
|
|
queryset = State.objects.all()
|
|
serializer_class = StateSerializer
|
|
search_fields = ['name']
|
|
filterset_fields = ['workflow']
|
|
ordering = ['sort']
|
|
|
|
class TransitionViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet):
|
|
perms_map = {'*':'*'}
|
|
queryset = Transition.objects.all()
|
|
serializer_class = TransitionSerializer
|
|
search_fields = ['name']
|
|
filterset_fields = ['workflow']
|
|
ordering = ['id']
|
|
|
|
class CustomFieldViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet):
|
|
perms_map = {'*':'*'}
|
|
queryset = CustomField.objects.all()
|
|
serializer_class = CustomFieldSerializer
|
|
search_fields = ['field_name']
|
|
filterset_fields = ['workflow', 'field_type']
|
|
ordering = ['sort']
|
|
|
|
class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin, ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
|
perms_map = {'*':'*'}
|
|
queryset = Ticket.objects.all()
|
|
serializer_class = TicketSerializer
|
|
search_fields = ['title']
|
|
filterset_fields = ['workflow', 'state']
|
|
ordering = ['-create_time']
|
|
|
|
def get_serializer_class(self):
|
|
if self.action == 'create':
|
|
return TicketCreateSerializer
|
|
return super().get_serializer_class()
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
"""
|
|
新建工单
|
|
"""
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
start_state = WfService.get_workflow_start_state(serializer.data['workflow'])
|
|
transition = Transition.objects.get(pk=serializer.data['transition'])
|
|
ticket_data = serializer.data['ticket_data']
|
|
if transition.field_require_check:
|
|
for key, value in start_state.state_fields.items(): #校验必填项
|
|
if value == 2:
|
|
if key not in ticket_data or not ticket_data[key]:
|
|
raise APIException('字段{}必填'.format(key))
|
|
ticket = serializer.save()
|
|
next_state = WfService.get_next_state_id_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)
|
|
destination_participant = participant_info.get('destination_participant', '')
|
|
multi_all_person = participant_info.get('multi_all_person', '{}') # 多人需要全部处理情况
|
|
sn = WfService.get_ticket_sn(ticket.workflow)
|
|
if next_state.type == State.STATE_TYPE_END:
|
|
act_state = Ticket.TICKET_ACT_STATE_FINISH
|
|
elif next_state.type == State.STATE_TYPE_START:
|
|
pass
|
|
|
|
@action(methods=['get'], detail=True, perms_map={'get':'*'})
|
|
def flowsteps(self, request, pk=None):
|
|
"""
|
|
工单流转step, 用于显示当前状态的step图(线性结构)
|
|
"""
|
|
ticket = self.get_object()
|
|
steps = WfService.get_ticket_steps(ticket)
|
|
return Response(StateSerializer(instance=steps, many=True).data)
|
|
|
|
@action(methods=['get'], detail=True, perms_map={'get':'*'})
|
|
def transitions(self, request, pk=None):
|
|
"""
|
|
获取工单可执行的操作
|
|
"""
|
|
ticket = self.get_object()
|
|
transitions = WfService.get_ticket_transitions(ticket)
|
|
return Response(TransitionSerializer(instance=transitions, many=True).data) |