From cbc5d558d9c1a11bb766c4b815eb70ef0ea3e461 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 9 Sep 2025 10:37:56 +0800 Subject: [PATCH 01/11] =?UTF-8?q?feat:=20=E6=9D=BF=E6=AE=B5=E5=8F=B7?= =?UTF-8?q?=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/views.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/apps/wpm/views.py b/apps/wpm/views.py index fff09aff..d1fd6331 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -40,6 +40,8 @@ from datetime import datetime, timedelta from apps.utils.lock import lock_model_record_d_method from apps.em.models import Equipment from django.db.models import Prefetch +from drf_yasg.utils import swagger_auto_schema +from drf_yasg import openapi @@ -212,6 +214,14 @@ class MlogViewSet(CustomModelViewSet): return MlogSerializer return super().get_serializer_class() + @swagger_auto_schema(manual_parameters=[ + openapi.Parameter(name="query", in_=openapi.IN_QUERY, description="定制返回数据", + type=openapi.TYPE_STRING, required=False), + openapi.Parameter(name="with_children", in_=openapi.IN_QUERY, description="带有children(yes/no/count)", + type=openapi.TYPE_STRING, required=False), + openapi.Parameter(name="with_wpr", in_=openapi.IN_QUERY, description="带有wpr(yes/no)", + type=openapi.TYPE_STRING, required=False), + ]) def list(self, request, *args, **kwargs): from django.db import connection from django.conf import settings @@ -261,6 +271,8 @@ class MlogViewSet(CustomModelViewSet): # if item.get("material_out", None): # data_dict[item_dict["mlog"]]["mlogb"].append(item_dict) # data = list(data_dict.values()) + if self.request.query_params.get('with_wpr', False) == 'yes': + pass return data @lock_model_record_d_method(Mlog) @@ -859,7 +871,8 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust c_year2 = str(c_year)[-2:] c_month = now.month m_model = material_out.model - wpr = Wpr.objects.filter(material_start=material_out, create_time__year=c_year, create_time__month=c_month).order_by("number").last() + # 不按产品走,只按生产日期走 + wpr = Wpr.objects.filter(create_time__year=c_year, create_time__month=c_month).order_by("number").last() cq_w = 4 if '02d' in rule: cq_w = 2 From 81a16fd37e853d3d3e9d8623cf6b3600cefd239e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 9 Sep 2025 11:23:09 +0800 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20=E5=B7=A5=E6=AE=B5=E6=9C=AA?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=8F=AD=E6=AC=A1=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mtm/models.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/mtm/models.py b/apps/mtm/models.py index a4bb4b7f..a82dcdb3 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -188,6 +188,8 @@ class Mgroup(CommonBModel): w_s_time = timezone.localtime(w_s_time) shifts = Shift.objects.filter(rule=self.shift_rule).order_by('sort') + if not shifts: + raise ParseError(f"工段{self.name}未配置班次") # 处理跨天班次的情况 for shift in shifts: # 如果开始时间小于结束时间,表示班次在同一天内 @@ -202,7 +204,7 @@ class Mgroup(CommonBModel): # 如果当前时间在结束时间之前,属于前一天 else: return (w_s_time - timedelta(days=1)).date(), shift - return w_s_time.date(), None + # return w_s_time.date(), None class TeamMember(BaseModel): From d19fee8e6f9273ab11961c99f40d9cb6021be0f0 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 9 Sep 2025 11:28:04 +0800 Subject: [PATCH 03/11] =?UTF-8?q?feat:=20gen=5Fnumber=5Fwith=5Frule=20?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/views.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/apps/wpm/views.py b/apps/wpm/views.py index d1fd6331..ce525e72 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -839,13 +839,13 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust number = mlogbin.number_from if d_count_real == 1: if wpr_number_rule: - number = MlogbInViewSet.gen_number_with_rule(wpr_number_rule, material_out) + number = MlogbInViewSet.gen_number_with_rule(wpr_number_rule, material_out, mlog) if number_to_batch: mlogbout, _ = Mlogb.objects.get_or_create(mlogb_from=mlogbin, defaults=update_dict(m_dict, {"count_real": 1, "count_ok": 1, "count_ok_full": 1, "batch": number})) Mlogbw.objects.get_or_create(number=number, mlogb=mlogbout) else: if wpr_number_rule: - number_list = MlogbInViewSet.gen_number_with_rule(wpr_number_rule, material_out, gen_count=d_count_real) + number_list = MlogbInViewSet.gen_number_with_rule(wpr_number_rule, material_out, mlog, gen_count=d_count_real) for i in range(d_count_real): if wpr_number_rule: numberx = number_list[i] @@ -864,15 +864,18 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust MlogbInViewSet.p_create_after(mlogbin) @classmethod - def gen_number_with_rule(cls, rule, material_out:Material, gen_count=1): + def gen_number_with_rule(cls, rule, material_out:Material, mlog:Mlog, gen_count=1): from apps.wpmw.models import Wpr - now = datetime.now() - timedelta(hours=6, minutes=20) - c_year = now.year + handle_date = mlog.handle_date + c_year = handle_date.year c_year2 = str(c_year)[-2:] - c_month = now.month + c_month = handle_date.month m_model = material_out.model - # 不按产品走,只按生产日期走 - wpr = Wpr.objects.filter(create_time__year=c_year, create_time__month=c_month).order_by("number").last() + # 按生产日志查询 + wpr = Wpr.objects.filter(wpr_mlogbw__mlogb__material_out=material_out, + wpr_mlogbw__mlogb__mlog__is_fix=False, + wpr_mlogbw__mlogb__mlog__submit_time__isnull=False, + wpr_mlogbw__mlogb__mlog__handle_date__year=c_year, wpr_mlogbw__mlogb__mlog__handle_date__month=c_month).order_by("number").last() cq_w = 4 if '02d' in rule: cq_w = 2 From 3906b0f744351ac94c7354e9686a7edb5ad254d7 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 9 Sep 2025 13:37:56 +0800 Subject: [PATCH 04/11] =?UTF-8?q?feat:=20gen=5Fnumber=5Fwith=5Frule?= =?UTF-8?q?=E6=8C=89=E7=94=9F=E4=BA=A7=E6=97=A5=E5=BF=97=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=B7=A5=E6=AE=B5=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/wpm/views.py b/apps/wpm/views.py index ce525e72..32d9739d 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -273,6 +273,9 @@ class MlogViewSet(CustomModelViewSet): # data = list(data_dict.values()) if self.request.query_params.get('with_wpr', False) == 'yes': pass + # wpr_dict = {item["id"]: None for item in data} + # wpr_out_qs = Mlogbw.objects.filter(mlogb__mlog__id__in=wpr_dict.keys(), + # mlogb__material_out__isnull=False).values_list('mlogb__mlog', 'number') return data @lock_model_record_d_method(Mlog) @@ -872,7 +875,7 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust c_month = handle_date.month m_model = material_out.model # 按生产日志查询 - wpr = Wpr.objects.filter(wpr_mlogbw__mlogb__material_out=material_out, + wpr = Wpr.objects.filter(wpr_mlogbw__mlogb__mlog__mgroup=mlog.mgroup, wpr_mlogbw__mlogb__mlog__is_fix=False, wpr_mlogbw__mlogb__mlog__submit_time__isnull=False, wpr_mlogbw__mlogb__mlog__handle_date__year=c_year, wpr_mlogbw__mlogb__mlog__handle_date__month=c_month).order_by("number").last() From bc555b7bea69d83a7c4a8b30eaac9855b07a02ee Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 9 Sep 2025 14:05:59 +0800 Subject: [PATCH 05/11] =?UTF-8?q?feat:=20mlog=20list=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=BF=94=E5=9B=9Emlogbw=20number?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/views.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 32d9739d..eeccd4e7 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -219,7 +219,7 @@ class MlogViewSet(CustomModelViewSet): type=openapi.TYPE_STRING, required=False), openapi.Parameter(name="with_children", in_=openapi.IN_QUERY, description="带有children(yes/no/count)", type=openapi.TYPE_STRING, required=False), - openapi.Parameter(name="with_wpr", in_=openapi.IN_QUERY, description="带有wpr(yes/no)", + openapi.Parameter(name="with_mlogbw", in_=openapi.IN_QUERY, description="带有个列表(out)", type=openapi.TYPE_STRING, required=False), ]) def list(self, request, *args, **kwargs): @@ -271,11 +271,15 @@ class MlogViewSet(CustomModelViewSet): # if item.get("material_out", None): # data_dict[item_dict["mlog"]]["mlogb"].append(item_dict) # data = list(data_dict.values()) - if self.request.query_params.get('with_wpr', False) == 'yes': - pass - # wpr_dict = {item["id"]: None for item in data} - # wpr_out_qs = Mlogbw.objects.filter(mlogb__mlog__id__in=wpr_dict.keys(), - # mlogb__material_out__isnull=False).values_list('mlogb__mlog', 'number') + if self.request.query_params.get('with_mlogbw', False) == 'out': + wpr_dict = {item["id"]: [] for item in data} + wpr_out_qs = Mlogbw.objects.filter(mlogb__mlog__id__in=wpr_dict.keys(), + mlogb__material_out__isnull=False).values('mlogb__mlog__id', 'number') + for item in wpr_out_qs: + wpr_dict[item["mlogb__mlog__id"]].append(item["number"]) + + for item in data: + item["mlogbw_number_list"] = wpr_dict.get(item["id"], None) return data @lock_model_record_d_method(Mlog) From 6d09e5e4f35c802baeeef37025977b0714724071 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 9 Sep 2025 15:39:13 +0800 Subject: [PATCH 06/11] =?UTF-8?q?feat:=20handover=5Fsubmit=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/serializers.py | 1 + apps/wpm/services.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index f1c2f477..85e0102e 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -1273,6 +1273,7 @@ class HandoverSerializer(CustomModelSerializer): if tracking == Material.MA_TRACKING_SINGLE: handoverbw = item.get("handoverbw", []) if handoverbw: + item["count"] = len(handoverbw) t_count += len(handoverbw) elif wm.count == item["count"]: t_count += item["count"] diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 7dae7d1e..1d437ae8 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -929,6 +929,8 @@ def handover_submit(handover:Handover, user: User, now: Union[datetime.datetime, for item in handoverbws: wpr:Wpr = item.wpr Wpr.change_or_new(wpr=wpr, wm=wm_to, old_wm=wpr.wm, old_mb=wpr.mb) + if wm_to.count != Wpr.objects.filter(wm=wm_to).count(): + raise ParseError("交接与明细数量不一致2,操作失败") handover.submit_user = user handover.submit_time = now From d84b8e94fd17ba4ca32210d8eb0d1ed4544bb716 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 9 Sep 2025 16:19:05 +0800 Subject: [PATCH 07/11] =?UTF-8?q?feat:=20gen=5Fnumber=5Fwith=5Frule=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/views.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/wpm/views.py b/apps/wpm/views.py index eeccd4e7..2925f1c3 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -879,10 +879,12 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust c_month = handle_date.month m_model = material_out.model # 按生产日志查询 - wpr = Wpr.objects.filter(wpr_mlogbw__mlogb__mlog__mgroup=mlog.mgroup, + wpr = Wpr.objects.filter(wpr_mlogbw__mlogb__material_out__isnull=False, + wpr_mlogbw__mlogb__mlog__mgroup=mlog.mgroup, wpr_mlogbw__mlogb__mlog__is_fix=False, wpr_mlogbw__mlogb__mlog__submit_time__isnull=False, - wpr_mlogbw__mlogb__mlog__handle_date__year=c_year, wpr_mlogbw__mlogb__mlog__handle_date__month=c_month).order_by("number").last() + wpr_mlogbw__mlogb__mlog__handle_date__year=c_year, + wpr_mlogbw__mlogb__mlog__handle_date__month=c_month).order_by("number").last() cq_w = 4 if '02d' in rule: cq_w = 2 From df4b0622091e84165d124c7ea5d59b92712742aa Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 9 Sep 2025 16:38:58 +0800 Subject: [PATCH 08/11] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=89=A9?= =?UTF-8?q?=E6=96=99=E6=98=8E=E7=BB=86=E4=B8=8E=E6=89=B9=E6=AC=A1=E4=B8=8D?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=9A=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/serializers.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 85e0102e..ce24e66e 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -1275,6 +1275,13 @@ class HandoverSerializer(CustomModelSerializer): if handoverbw: item["count"] = len(handoverbw) t_count += len(handoverbw) + wprIds = [i["wpr"].id for i in handoverbw] + wm_ids = Wpr.objects.filter(id__in=wprIds).values_list("wm_id", flat=True) + if len(wm_ids) == 1 and wm_ids[0] == wm.id: + pass + else: + raise ParseError(f'第{ind+1}行-物料明细与批次不匹配') + elif wm.count == item["count"]: t_count += item["count"] else: From 6b423c80eb8bbe225c93f21beb39da9cf3fadcc3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 9 Sep 2025 16:49:51 +0800 Subject: [PATCH 09/11] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=89=A9?= =?UTF-8?q?=E6=96=99=E6=98=8E=E7=BB=86=E4=B8=8E=E6=89=B9=E6=AC=A1=E4=B8=8D?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=9A=84=E6=A0=A1=E9=AA=8C2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index ce24e66e..f6db5ec0 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -1276,7 +1276,7 @@ class HandoverSerializer(CustomModelSerializer): item["count"] = len(handoverbw) t_count += len(handoverbw) wprIds = [i["wpr"].id for i in handoverbw] - wm_ids = Wpr.objects.filter(id__in=wprIds).values_list("wm_id", flat=True) + wm_ids = list(Wpr.objects.filter(id__in=wprIds).values_list("wm_id", flat=True).distinct()) if len(wm_ids) == 1 and wm_ids[0] == wm.id: pass else: From d42bc29d2c1951af8f09c4c36bcfe807e899f741 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 10 Sep 2025 11:26:37 +0800 Subject: [PATCH 10/11] =?UTF-8?q?feat:=20=E5=87=BA=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=92=8C=E4=BA=A4=E6=8E=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=A4=84=E7=90=86=E6=97=B6=E9=83=BD=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E5=8D=95=E4=B8=AA=E7=9A=84=E5=BC=BA=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/serializers.py | 9 ++++++++- apps/inm/services.py | 12 ++++++++++++ apps/wpm/serializers.py | 2 +- apps/wpm/services.py | 8 +++++++- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 19c92e8b..6a183640 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -175,7 +175,7 @@ class MIOItemCreateSerializer(CustomModelSerializer): count = validated_data["count"] batch = validated_data["batch"] mioitemw = validated_data.pop('mioitemw', []) - instance = super().create(validated_data) + instance:MIOItem = super().create(validated_data) assemb_dict = {} for i in assemb: assemb_dict[i['material'].id] = i @@ -210,6 +210,13 @@ class MIOItemCreateSerializer(CustomModelSerializer): raise ParseError('不支持自动生成请提供产品明细') elif len(mioitemw) >= 1: mio_type = mio.type + if mio_type != "pur_in" and mio_type != "other_in": + wprIds = [i["wpr"].id for i in mioitemw] + mb_ids = list(Wpr.objects.filter(id__in=wprIds).values_list("mb__id", flat=True).distinct()) + if len(mb_ids) == 1 and mb_ids[0] == instance.mb.id: + pass + else: + raise ParseError(f'{batch}物料明细中存在{len(mb_ids)}个不同物料批次') for item in mioitemw: if item.get("wpr", None) is None and mio_type != "pur_in" and mio_type != "other_in": raise ParseError(f'{item["number"]}_请提供产品明细ID') diff --git a/apps/inm/services.py b/apps/inm/services.py index 67d47bc4..fa30767f 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -117,6 +117,12 @@ def do_out(item: MIOItem): mioitemws = MIOItemw.objects.filter(mioitem=item) if mioitemws.count() != item.count: raise ParseError("出入库与明细数量不一致,操作失败") + wprIds = [i["wpr"].id for i in mioitemws] + mb_ids = list(Wpr.objects.filter(id__in=wprIds).values_list("mb__id", flat=True).distinct()) + if len(mb_ids) == 1 and mb_ids[0] == mb.id: + pass + else: + raise ParseError(f'{xbatch}物料明细中存在{len(mb_ids)}个不同物料批次') for mioitemw in mioitemws: Wpr.change_or_new(wpr=mioitemw.wpr, wm=wm, old_mb=mb) @@ -229,6 +235,12 @@ def do_in(item: MIOItem): mioitemws = MIOItemw.objects.filter(mioitem=item) if mioitemws.count() != item.count: raise ParseError("出入库与明细数量不一致,操作失败") + wprIds = [i["wpr"].id for i in mioitemws] + wm_ids = list(Wpr.objects.filter(id__in=wprIds).values_list("wm__id", flat=True).distinct()) + if len(wm_ids) == 1 and wm_ids[0] == wm.id: + pass + else: + raise ParseError(f'{xbatch}物料明细中存在{len(wm_ids)}个不同物料批次') for mioitemw in mioitemws: Wpr.change_or_new(wpr=mioitemw.wpr, mb=mb, old_wm=wm) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index f6db5ec0..09e4c6f1 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -1280,7 +1280,7 @@ class HandoverSerializer(CustomModelSerializer): if len(wm_ids) == 1 and wm_ids[0] == wm.id: pass else: - raise ParseError(f'第{ind+1}行-物料明细与批次不匹配') + raise ParseError(f'{wm.batch}物料明细中存在{len(wm_ids)}个不同物料批次') elif wm.count == item["count"]: t_count += item["count"] diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 1d437ae8..bfda3756 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -756,7 +756,7 @@ def handover_submit(handover:Handover, user: User, now: Union[datetime.datetime, raise ParseError('拆批请选择车间库存') batches_to_limit = BatchLog.batches_to(batch=handover.wm.batch)["batches"] source_b, _ = BatchSt.g_create(batch=handover.wm.batch) - for item in handoverb_list: + for indx, item in enumerate(handoverb_list): wmId, xcount, handover_or_b = item if xcount <= 0: raise ParseError("存在非正数!") @@ -926,6 +926,12 @@ def handover_submit(handover:Handover, user: User, now: Union[datetime.datetime, handoverbws = Handoverbw.objects.filter(handoverb=handover_or_b) if handoverbws.count() != xcount: raise ParseError("交接与明细数量不一致,操作失败") + wprIds = [i["wpr"].id for i in handoverbws] + wm_ids = list(Wpr.objects.filter(id__in=wprIds).values_list("wm_id", flat=True).distinct()) + if len(wm_ids) == 1 and wm_ids[0] == wm_from.id: + pass + else: + raise ParseError(f'{batch}物料明细中存在{len(wm_ids)}个不同物料批次') for item in handoverbws: wpr:Wpr = item.wpr Wpr.change_or_new(wpr=wpr, wm=wm_to, old_wm=wpr.wm, old_mb=wpr.mb) From 8b7a87abb647e36a3bbe6dcb3b864baa11ddf010 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 10 Sep 2025 13:11:51 +0800 Subject: [PATCH 11/11] =?UTF-8?q?fix:=20=E5=87=BA=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=92=8C=E4=BA=A4=E6=8E=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=A4=84=E7=90=86=E6=97=B6=E9=83=BD=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E5=8D=95=E4=B8=AA=E7=9A=84=E5=BC=BA=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/services.py | 6 ++---- apps/wpm/services.py | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/inm/services.py b/apps/inm/services.py index fa30767f..b94e904f 100644 --- a/apps/inm/services.py +++ b/apps/inm/services.py @@ -117,8 +117,7 @@ def do_out(item: MIOItem): mioitemws = MIOItemw.objects.filter(mioitem=item) if mioitemws.count() != item.count: raise ParseError("出入库与明细数量不一致,操作失败") - wprIds = [i["wpr"].id for i in mioitemws] - mb_ids = list(Wpr.objects.filter(id__in=wprIds).values_list("mb__id", flat=True).distinct()) + mb_ids = list(Wpr.objects.filter(wpr_mioitemw__in=mioitemws).values_list("mb__id", flat=True).distinct()) if len(mb_ids) == 1 and mb_ids[0] == mb.id: pass else: @@ -235,8 +234,7 @@ def do_in(item: MIOItem): mioitemws = MIOItemw.objects.filter(mioitem=item) if mioitemws.count() != item.count: raise ParseError("出入库与明细数量不一致,操作失败") - wprIds = [i["wpr"].id for i in mioitemws] - wm_ids = list(Wpr.objects.filter(id__in=wprIds).values_list("wm__id", flat=True).distinct()) + wm_ids = list(Wpr.objects.filter(wpr_mioitemw__in=mioitemws).values_list("wm__id", flat=True).distinct()) if len(wm_ids) == 1 and wm_ids[0] == wm.id: pass else: diff --git a/apps/wpm/services.py b/apps/wpm/services.py index bfda3756..8dd1b259 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -926,8 +926,7 @@ def handover_submit(handover:Handover, user: User, now: Union[datetime.datetime, handoverbws = Handoverbw.objects.filter(handoverb=handover_or_b) if handoverbws.count() != xcount: raise ParseError("交接与明细数量不一致,操作失败") - wprIds = [i["wpr"].id for i in handoverbws] - wm_ids = list(Wpr.objects.filter(id__in=wprIds).values_list("wm_id", flat=True).distinct()) + wm_ids = list(Wpr.objects.filter(wpr_handoverbw__in=handoverbws).values_list("wm_id", flat=True).distinct()) if len(wm_ids) == 1 and wm_ids[0] == wm_from.id: pass else: