diff --git a/apps/wf/serializers.py b/apps/wf/serializers.py index 0ed461c5..aaca854c 100755 --- a/apps/wf/serializers.py +++ b/apps/wf/serializers.py @@ -259,3 +259,8 @@ class TicketAddNodeEndSerializer(serializers.Serializer): class TicketDestorySerializer(serializers.Serializer): ids = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=Ticket.objects.all()), label='工单ID列表') + + +class TicketStateUpateSerializer(serializers.Serializer): + state = serializers.PrimaryKeyRelatedField(queryset=State.objects.all(), label='状态ID值') + suggestion = serializers.CharField(label="变更理由", required=False) diff --git a/apps/wf/services.py b/apps/wf/services.py index 32d27639..53f0bfed 100755 --- a/apps/wf/services.py +++ b/apps/wf/services.py @@ -152,7 +152,6 @@ class WfService(object): multi_all_person={}) multi_all_person_dict = {} destination_participant_type, destination_participant = state.participant_type, state.participant - print(state.name, destination_participant_type, destination_participant) if destination_participant_type == State.PARTICIPANT_TYPE_FIELD: destination_participant = new_ticket_data.get(destination_participant, 0) if destination_participant \ in new_ticket_data else Ticket.ticket_data.get(destination_participant, 0) @@ -394,6 +393,23 @@ class WfService(object): return ticket + @classmethod + def update_ticket_state(cls, ticket: Ticket, new_state: State, suggestion: str, handler: User): + participant_info = cls.get_ticket_state_participant_info( + new_state, ticket, {}) + source_state = ticket.state + ticket.state = new_state + ticket.participant_type = participant_info.get('destination_participant_type', 0) + ticket.participant = participant_info.get('destination_participant', 0) + ticket.multi_all_person = {} + ticket.save() + TicketFlow.objects.create(ticket=ticket, state=source_state, + ticket_data=WfService.get_ticket_all_field_value(ticket), + suggestion=suggestion, participant_type=State.PARTICIPANT_TYPE_PERSONAL, + intervene_type=Transition.TRANSITION_INTERVENE_TYPE_ALTER_STATE, + participant=handler) + cls.task_ticket(ticket=ticket) + @classmethod def task_ticket(cls, ticket: Ticket): """ diff --git a/apps/wf/views.py b/apps/wf/views.py index 8d2ff8dc..98dcb244 100755 --- a/apps/wf/views.py +++ b/apps/wf/views.py @@ -12,7 +12,7 @@ from apps.wf.serializers import CustomFieldCreateUpdateSerializer, CustomFieldSe TicketCreateSerializer, TicketDeliverSerializer, TicketDestorySerializer, TicketFlowSerializer, \ TicketHandleSerializer, TicketRetreatSerializer, \ TicketSerializer, TransitionSerializer, WorkflowSerializer, \ - TicketListSerializer, TicketDetailSerializer, WorkflowCloneSerializer + TicketListSerializer, TicketDetailSerializer, WorkflowCloneSerializer, TicketStateUpateSerializer from rest_framework.viewsets import GenericViewSet, ModelViewSet from rest_framework.decorators import action from apps.wf.models import CustomField, Ticket, Workflow, State, Transition, TicketFlow @@ -173,6 +173,7 @@ class WorkflowViewSet(CustomModelViewSet): tr.save() return Response() + class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, CustomGenericViewSet): perms_map = {'get': '*', 'post': 'workflow.update', 'put': 'workflow.update', 'delete': 'workflow.update'} @@ -498,6 +499,19 @@ class TicketViewSet(CreateUpdateCustomMixin, CreateModelMixin, ListModelMixin, R run_task.delay(ticket.id) return Response() + @action(methods=['put'], detail=True, perms_map={'put': 'ticket.state_update'}, + serializer_class=TicketStateUpateSerializer) + def state(self, request, pk=None): + """修改工单状态 + + 修改工单状态 + """ + sr = TicketStateUpateSerializer(data=request.data) + sr.is_valid(raise_exception=True) + vdata = sr.validated_data + ticket = self.get_object() + pass + class TicketFlowViewSet(ListModelMixin, RetrieveModelMixin, CustomGenericViewSet): """