From fb71f0697a7e318a15df17821eb043b674206f22 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 26 Sep 2025 14:07:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20mlog=20quick=E5=A2=9E=E5=8A=A0wprs=5Fin?= =?UTF-8?q?=E4=BC=A0=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/serializers.py | 6 +++++- apps/wpm/views.py | 29 ++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 0e4bbc6a..faedb975 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -721,6 +721,7 @@ class CountJsonFromSerializer(serializers.Serializer): class MlogbInSerializer(CustomModelSerializer): mlogbdefect = MlogbDefectSerializer(many=True, required=False) count_json_from = CountJsonFromSerializer(required=False, many=True) + wprs_in = serializers.ListField(child=serializers.CharField(), label="单个ID的列表", required=False) class Meta: model = Mlogb @@ -878,7 +879,9 @@ class MlogbwCreateUpdateSerializer(CustomModelSerializer): if wpr: mlogb: Mlogb = validated_data["mlogb"] if Mlogbw.objects.filter(mlogb=mlogb, wpr=wpr).exists(): - raise ParseError('该产品已选入') + raise ParseError(f'{wpr.number}-该产品已选入') + if Mlogbw.objects.filter(mlogb__mlog__submit_time__isnull=True, wpr=wpr).exists(): + raise ParseError(f'{wpr.number}-该产品已在其他日志中选入') ftest_data = validated_data.pop("ftest", None) mlogbw = super().create(validated_data) if ftest_data: @@ -1520,6 +1523,7 @@ class MlogQuickSerializer(serializers.Serializer): team = serializers.CharField(label="班组ID", required=False) equipment = serializers.CharField(label="设备ID", required=False) wm_in = serializers.CharField(label="输入车间库存ID") + wprs_in = serializers.ListField(child=serializers.CharField(), label="单个ID的列表", required=False) count_use = serializers.IntegerField(label="领用数量") is_fix = serializers.BooleanField(label="是否返修") mgroup = serializers.CharField(label="工段ID") diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 13168a1b..a3658820 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -481,10 +481,11 @@ class MlogViewSet(CustomModelViewSet): mlogbin_data["mtask"] = vdata["mtask"] if "route" in vdata: mlogbin_data["route"] = vdata["route"] + wprIds = vdata.get("wprs_in", []) sr_2 = MlogbInSerializer(data=mlogbin_data) sr_2.is_valid(raise_exception=True) mlogbin = sr_2.save() - MlogbInViewSet.p_create_after(mlogbin, skip_mlogbw=True) + MlogbInViewSet.p_create_after(mlogbin, wprIds=wprIds) return Response({"mlog": str(mlog.id), "mlogbin": str(mlogbin.id)}) class HandoverViewSet(CustomModelViewSet): @@ -714,7 +715,7 @@ class MlogbInViewSet(BulkCreateModelMixin, BulkUpdateModelMixin, BulkDestroyMode mlog.cal_mlog_count_from_mlogb() @classmethod - def p_create_after(cls, mlogbin:Mlogb, skip_mlogbw=False): + def p_create_after(cls, mlogbin:Mlogb, wprIds:list=[]): mlogbin_parent:Mlogb = mlogbin.parent mlog:Mlog = mlogbin.mlog mgroup:Mgroup = mlog.mgroup @@ -743,11 +744,24 @@ class MlogbInViewSet(BulkCreateModelMixin, BulkUpdateModelMixin, BulkDestroyMode wm_in: WMaterial = mlogbin.wm_in - if material_in.tracking == Material.MA_TRACKING_SINGLE and skip_mlogbw is False: # 自动创建mlogbw - wprs_can_use_qs = Wpr.objects.filter(wm=wm_in).exclude(wpr_mlogbw__mlogb__mlog__submit_time__isnull=True).order_by("number") - if wprs_can_use_qs.count() == mlogbin.count_use: + if material_in.tracking == Material.MA_TRACKING_SINGLE: # 自动创建mlogbw + if wprIds: + wprs_can_use_qs = Wpr.objects.filter(id__in=wprIds).exclude(wpr_mlogbw__mlogb__mlog__submit_time__isnull=True).order_by("number") + wm_ids = wprs_can_use_qs.values_list("wm__id", flat=True).distinct() + if len(wm_ids) == 1 and wm_ids[0] == wm_in.id: + pass + else: + raise ParseError("单个产品列表不属于当前批次") for wpr in wprs_can_use_qs: - Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbin, defaults={"number": wpr.number}) + Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbin, defaults={"number": wpr.number}) + mlogbin.count_use = Mlogbw.objects.filter(mlogb=mlogbin).count() + mlogbin.save(update_fields=["count_use"]) + else: + wprs_can_use_qs = Wpr.objects.filter(wm=wm_in).exclude(wpr_mlogbw__mlogb__mlog__submit_time__isnull=True).order_by("number") + if wprs_can_use_qs.count() == mlogbin.count_use: + for wpr in wprs_can_use_qs: + Mlogbw.objects.get_or_create(wpr=wpr, mlogb=mlogbin, defaults={"number": wpr.number}) + # if qct is None: # mlog.qct = Qct.get(material_out, "process") @@ -892,9 +906,10 @@ class MlogbInViewSet(BulkCreateModelMixin, BulkUpdateModelMixin, BulkDestroyMode def perform_create(self, serializer): + vdata = serializer.validated_data mlogbin: Mlogb = serializer.save() MlogViewSet.lock_and_check_can_update(mlogbin.mlog) - MlogbInViewSet.p_create_after(mlogbin) + MlogbInViewSet.p_create_after(mlogbin, wprIds=vdata.get('wprIds', [])) @classmethod def gen_number_with_rule(cls, rule, material_out:Material, mlog:Mlog, gen_count=1):