From 21f53dd3ef7b3d40704f2bae46605e5720253b66 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 19 Oct 2023 14:06:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=87=87=E8=B4=AD=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=B8=8E=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/pum/serializers.py | 26 +++++++++++++++++++++----- apps/pum/services.py | 25 +++++++++++++++---------- apps/pum/views.py | 8 +++++--- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/apps/pum/serializers.py b/apps/pum/serializers.py index bc59e3d9..57b5fa93 100644 --- a/apps/pum/serializers.py +++ b/apps/pum/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers from apps.utils.serializers import CustomModelSerializer -from apps.utils.constants import EXCLUDE_FIELDS_DEPT, EXCLUDE_FIELDS_BASE +from apps.utils.constants import EXCLUDE_FIELDS_DEPT, EXCLUDE_FIELDS_BASE, EXCLUDE_FIELDS from rest_framework.exceptions import ValidationError from apps.pum.models import Supplier, PuPlan, PuPlanItem, PuOrder, PuOrderItem @@ -28,24 +28,38 @@ class PuPlanSerializer(CustomModelSerializer): class PuPlanItemSerializer(CustomModelSerializer): material_ = MaterialSerializer(source='material', read_only=True) + pu_plan_number = serializers.CharField( + source='pu_plan.number', read_only=True) + create_by_name = serializers.CharField( + source='create_by.name', read_only=True) belong_dept_name = serializers.CharField( source='belong_dept.name', read_only=True) + note = serializers.CharField(required=False, allow_blank=True) class Meta: model = PuPlanItem fields = '__all__' - read_only_fields = EXCLUDE_FIELDS_DEPT + ['pu_order'] + read_only_fields = EXCLUDE_FIELDS + ['pu_order'] def create(self, validated_data): pu_plan = validated_data['pu_plan'] if pu_plan.state != PuPlan.PUPLAN_CREATE: raise ValidationError('该状态下不可添加需求') material = validated_data['material'] - user = self.context['request'].user - if PuPlanItem.objects.filter(material=material, belong_dept=user.belong_dept).exists(): + self.complete_belong_dept(validated_data) + if PuPlanItem.objects.filter(material=material, belong_dept=validated_data['belong_dept']).exists(): raise ValidationError('同部门已提交该物料需求,请确认!') return super().create(validated_data) + def complete_belong_dept(self, validated_data): + belong_dept = validated_data.get('belong_dept', None) + if belong_dept is None: + belong_dept = self.context['request'].user.belong_dept + if belong_dept is None: + raise ValidationError('所属部门不可为空') + else: + validated_data['belong_dept'] = belong_dept + def update(self, instance, validated_data): validated_data.pop('pu_plan') pu_plan = instance.pu_plan @@ -53,9 +67,11 @@ class PuPlanItemSerializer(CustomModelSerializer): raise ValidationError('该状态下不可编辑需求') material = validated_data['material'] user = self.context['request'].user + if instance.create_by != user: raise ValidationError('非创建人不可编辑') - if PuPlanItem.objects.exclude(id=instance.id).filter(material=material, belong_dept=user.belong_dept).exists(): + self.complete_belong_dept(validated_data) + if PuPlanItem.objects.exclude(id=instance.id).filter(material=material, belong_dept=validated_data['belong_dept']).exists(): raise ValidationError('同部门已提交该物料需求,请确认!') return super().update(instance, validated_data) diff --git a/apps/pum/services.py b/apps/pum/services.py index b36cdd8a..b6bc7de5 100644 --- a/apps/pum/services.py +++ b/apps/pum/services.py @@ -3,14 +3,16 @@ from apps.pum.models import PuOrderItem, PuPlan, PuPlanItem, PuOrder from django.db.models import F from apps.inm.models import MIO, MIOItem + class PumService: def change_puplan_state_when_puorder_sumbit(puorder: PuOrder): - puplanIds = PuPlanItem.objects.filter(pu_order=puorder).values_list('pu_plan', flat=True) + puplanIds = PuPlanItem.objects.filter( + pu_order=puorder).values_list('pu_plan', flat=True) for id in puplanIds: puplan = PuPlan.objects.get(id=id) state = puplan.state - if PuPlanItem.objects.filter(pu_plan=puplan).count() == PuPlan.objects.filter(pu_plan=puplan, pu_order__state__gte=PuOrder.PUORDER_SUBMITED).count(): + if PuPlanItem.objects.filter(pu_plan=puplan).count() == PuPlanItem.objects.filter(pu_plan=puplan, pu_order__state__gte=PuOrder.PUORDER_SUBMITED).count(): state = PuPlan.PUPLAN_ORDERED else: state = PuPlan.PUPLAN_ORDERING @@ -23,27 +25,30 @@ class PumService: """ pu_order = mio.pu_order for i in MIOItem.objects.filter(mio=mio): - pu_orderitem = PuOrderItem.objects.get(material=i.material, pu_order=pu_order) + pu_orderitem = PuOrderItem.objects.get( + material=i.material, pu_order=pu_order) delivered_count = pu_orderitem.delivered_count + i.count if delivered_count > pu_orderitem.count: raise ValidationError(f'{i.material.name}-超出采购订单所需数量') pu_orderitem.delivered_count = delivered_count pu_orderitem.save() pu_order_state = PuOrder.PUORDER_SHIP - qs = PuOrderItem.objects.filter(pu_order=pu_order, count__lte=F('delivered_count')) + qs = PuOrderItem.objects.filter( + pu_order=pu_order, count__gt=F('delivered_count')) # 查询未完全到货的 if qs.exists(): pass else: pu_order_state = PuOrder.PUORDER_DONE pu_order.state = pu_order_state pu_order.save() - # 查看计划进度 - qs2 = PuPlanItem.objects.filter(pu_order=pu_order).values_list('pu_plan', flat=True).distinct() + + # 更新采购计划进度 + qs2 = PuPlanItem.objects.filter(pu_order=pu_order).values_list( + 'pu_plan').distinct() for puplan in qs2: - qs3 = PuPlanItem.objects.filter(pu_plan=puplan).values_list('pu_order__state', flat=True) + qs3 = PuPlanItem.objects.filter(pu_plan=puplan).values_list( + 'pu_order__state', flat=True) states = set(list(qs3)) - if len(states) == 1 and states[0] == PuOrder.PUORDER_DONE: + if len(states) == 1 and list(states)[0] == PuOrder.PUORDER_DONE: puplan.state = PuPlan.PUPLAN_DONE puplan.save() - - diff --git a/apps/pum/views.py b/apps/pum/views.py index 2ed81254..e0304811 100644 --- a/apps/pum/views.py +++ b/apps/pum/views.py @@ -42,7 +42,7 @@ class PuPlanViewSet(CustomModelViewSet): filterset_fields = ['state'] def perform_destroy(self, instance): - if PuPlan.objects.filter(pu_plan=instance).exists(): + if PuPlanItem.objects.filter(pu_plan=instance).exists(): raise ParseError('该计划存在明细不可删除') return super().perform_destroy(instance) @@ -73,6 +73,8 @@ class PuPlanItemViewSet(CustomModelViewSet): queryset = PuPlanItem.objects.all() serializer_class = PuPlanItemSerializer filterset_class = PuPlanItemFilter + select_related_fields = ['material', 'pu_plan', + 'pu_order', 'create_by', 'belong_dept'] ordering_fields = ['create_time', 'material', 'need_date', 'need_count'] ordering = ['create_time'] @@ -117,10 +119,10 @@ class PuOrderViewSet(CustomModelViewSet): raise ParseError('订单信息不全') if puorder.create_by != user: raise PermissionDenied('非创建人不可提交') - if puorder.state != PuOrder.PUPLAN_CREATE: + if puorder.state != PuOrder.PUORDER_CREATE: raise ParseError('采购计划状态异常') puorder.submit_time = timezone.now() - puorder.state = PuPlan.PUPLAN_SUBMITED + puorder.state = PuOrder.PUORDER_SUBMITED puorder.save() PumService.change_puplan_state_when_puorder_sumbit(puorder) return Response()