From 68e4164fe0e1b2672a16b239e8ad72d9ad2af6f7 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 28 Sep 2021 14:31:45 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=AE=B0=E5=BD=95=E8=A1=A8=E6=A0=BCseriali?= =?UTF-8?q?zer=E5=A2=9E=E5=8A=A0material?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/mtm/serializers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 004d3d3..410d24c 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -140,6 +140,7 @@ class UsedStepListSerializer(serializers.ModelSerializer): class RecordFormSerializer(serializers.ModelSerializer): step_ = StepSimpleSerializer(source='step', read_only=True) + material_ = MaterialSimpleSerializer(source='material', read_only=True) """ 记录表格序列化 """ @@ -150,13 +151,13 @@ class RecordFormSerializer(serializers.ModelSerializer): @staticmethod def setup_eager_loading(queryset): """ Perform necessary eager loading of data. """ - queryset = queryset.select_related('step') + queryset = queryset.select_related('step', 'material') return queryset class RecordFormCreateSerializer(serializers.ModelSerializer): class Meta: model = RecordForm - fields = ['name', 'type', 'step'] + fields = ['name', 'type', 'step', 'material'] class RecordFormUpdateSerializer(serializers.ModelSerializer): class Meta: From 71502088c98617f9bbdb8e4ade6fc0231f797450 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 28 Sep 2021 15:24:38 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=85=B3=E8=81=94=E5=B7=A5=E5=BA=8F=E7=9A=84serializer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/em/serializers.py | 5 +++++ hb_server/apps/mtm/serializers.py | 4 ++-- hb_server/apps/wf/services.py | 9 +++++++-- hb_server/apps/wf/views.py | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/hb_server/apps/em/serializers.py b/hb_server/apps/em/serializers.py index a200114..55d0674 100644 --- a/hb_server/apps/em/serializers.py +++ b/hb_server/apps/em/serializers.py @@ -1,3 +1,4 @@ +from apps.mtm.models import Step from rest_framework import serializers from rest_framework.serializers import ModelSerializer @@ -8,6 +9,7 @@ from apps.system.serializers import OrganizationSimpleSerializer, UserSimpleSeri class EquipmentSerializer(ModelSerializer): belong_dept_ = OrganizationSimpleSerializer(source='belong_dept', read_only=True) keeper_ = UserSimpleSerializer(source='keeper', read_only=True) + step_ = serializers.SerializerMethodField() class Meta: model = Equipment fields = '__all__' @@ -18,6 +20,9 @@ class EquipmentSerializer(ModelSerializer): queryset = queryset.select_related('belong_dept','keeper') return queryset + def get_step_(self, obj): + return Step.objects.filter(equipments=obj).values('id', 'name', 'number') + class EquipmentSimpleSerializer(ModelSerializer): class Meta: model = Equipment diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 410d24c..6a1dd98 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -1,6 +1,6 @@ -from apps.em.serializers import EquipmentSerializer, EquipmentSimpleSerializer +from apps.em.serializers import EquipmentSimpleSerializer from rest_framework import serializers -from rest_framework.exceptions import ValidationError +from rest_framework.exceptions import ParseError, ValidationError from .models import InputMaterial, Material, OutputMaterial, Process, ProductProcess, RecordForm, RecordFormField, Step, TechDoc, UsedStep from apps.system.serializers import FileSimpleSerializer, OrganizationSimpleSerializer diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index cd691d9..bee8799 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -168,8 +168,13 @@ class WfService(object): if user.id not in participant: return dict(permission=False, msg="非当前处理人") current_participant_count = len(participant) - if current_participant_count >1 and state.distribute_type == State.STATE_DISTRIBUTE_TYPE_ACTIVE: - return dict(permission=False, msg="需要先接单再处理") + if current_participant_count == 1: + if [user.id] != participant: + return dict(permission=False, msg="非当前处理人") + elif current_participant_count >1 and state.distribute_type == State.STATE_DISTRIBUTE_TYPE_ACTIVE: + if user.id not in participant: + return dict(permission=False, msg="非当前处理人") + return dict(permission=False, msg="需要先接单再处理", need_accept=True) if ticket.in_add_node: return dict(permission=False, msg="工单当前处于加签中,请加签完成后操作") return dict(permission=True, msg="") diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index 3740fec..3c2e13b 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -247,6 +247,20 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin transitions = WfService.get_ticket_transitions(ticket) return Response(TransitionSerializer(instance=transitions, many=True).data) + @action(methods=['post'], detail=True, perms_map={'post':'*'}) + def accpet(self, request, pk=None): + """ + 接单,当工单当前处理人实际为多个人时(角色、部门、多人都有可能, 注意角色和部门有可能实际只有一人) + """ + ticket = self.get_object() + result = WfService.ticket_handle_permission_check(ticket, request.user) + if result.get('need_accept', False): + ticket.participant_type = State.PARTICIPANT_TYPE_PERSONAL + ticket.participant = request.user.id + ticket.save() + # 接单日志 + else: + raise APIException('无需接单') class TicketFlowViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): """ From 2bc04c13c41fc0ba3ba0c82671aac5524f2d3772 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 28 Sep 2021 16:56:39 +0800 Subject: [PATCH 3/3] =?UTF-8?q?workflow=20state=E6=B7=BB=E5=8A=A0type=20se?= =?UTF-8?q?rializer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wf/models.py | 2 +- hb_server/apps/wf/serializers.py | 2 +- hb_server/apps/wf/views.py | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/wf/models.py b/hb_server/apps/wf/models.py index 740928c..c4cfc29 100644 --- a/hb_server/apps/wf/models.py +++ b/hb_server/apps/wf/models.py @@ -169,7 +169,7 @@ class TicketFlow(BaseModel): 工单流转日志 """ ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE, verbose_name='关联工单') - transition = models.ForeignKey(Transition, verbose_name='流转id', help_text='与worklow.Transition关联, 为0时表示认为干预的操作', on_delete=models.CASCADE) + transition = models.ForeignKey(Transition, verbose_name='流转id', help_text='与worklow.Transition关联, 为0时表示认为干预的操作', on_delete=models.CASCADE, null=True, blank=True) suggestion = models.CharField('处理意见', max_length=10000, default='', blank=True) participant_type = models.IntegerField('处理人类型', default=0, help_text='0.无处理人,1.个人,2.多人', choices=State.type2_choices) participant = models.ForeignKey(User, verbose_name='处理人', on_delete=models.SET_NULL, null=True, blank=True) diff --git a/hb_server/apps/wf/serializers.py b/hb_server/apps/wf/serializers.py index cddfaff..e674c31 100644 --- a/hb_server/apps/wf/serializers.py +++ b/hb_server/apps/wf/serializers.py @@ -23,7 +23,7 @@ class WorkflowSimpleSerializer(serializers.ModelSerializer): class StateSimpleSerializer(serializers.ModelSerializer): class Meta: model = State - fields = ['id', 'name'] + fields = ['id', 'name', 'type'] class TransitionSerializer(serializers.ModelSerializer): source_state_ = StateSimpleSerializer(source='source_state', read_only=True) diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index 3c2e13b..9df0518 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -259,6 +259,11 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin ticket.participant = request.user.id ticket.save() # 接单日志 + # 更新工单流转记录 + TicketFlow.objects.create(ticket=ticket, state=ticket.state, ticket_data=WfService.get_ticket_all_field_value(ticket), + suggestion='接单处理', participant_type=State.PARTICIPANT_TYPE_PERSONAL, + participant=request.user, transition=None) + return Response() else: raise APIException('无需接单')