From 330d44e2a3e9b58381d8523185f0b9b3d898ce8b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 7 Mar 2025 10:09:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=B8=80=E4=B8=8Bmlo?= =?UTF-8?q?gbdefect=E7=9A=84=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/models.py | 28 +++++++++++++++++++++++----- apps/wpm/services.py | 12 ++++++------ 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 79bc12e0..69682a0a 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -377,20 +377,20 @@ class Mlogb(BaseModel): @property def cal_count_pn_jgqbl(self): - mqs = MlogbDefect.objects.filter(mlogb=self, material_in___isnull=False) + mqs = MlogbDefect.get_defect_qs_from_mlogb(self, ftype="in") count_pn_jgqbl = mqs.aggregate(total=Sum("count"))["total"] or 0 self.count_pn_jgqbl = count_pn_jgqbl self.count_real = self.count_use - self.count_pn_jgqbl self.save(update_fields=["count_pn_jgqbl", "count_real"]) mlog = self.mlog if mlog: - count_pn_jgqbl = MlogbDefect.objects.filter(mlogb__mlog=mlog, material_in___isnull=False).aggregate(total=Sum("count"))["total"] or 0 + count_pn_jgqbl = MlogbDefect.get_defect_qs_from_mlog(mlog, ftype="in").aggregate(total=Sum("count"))["total"] or 0 mlog.count_pn_jgqbl = count_pn_jgqbl mlog.count_real = self.count_use - count_pn_jgqbl mlog.save(update_fields=["count_pn_jgqbl", "count_real"]) def cal_count_notok(self): - mqs = MlogbDefect.objects.filter(mlogb=self, material_out___isnull=False) + mqs = MlogbDefect.get_defect_qs_from_mlogb(self, ftype="out") count_notok = mqs.filter(defect__okcate=30).aggregate(total=Sum("count"))["total"] or 0 count_notok_full = mqs.exclude(defect__okcate=10).aggregate(total=Sum("count"))["total"] or 0 self.count_notok = count_notok @@ -399,8 +399,9 @@ class Mlogb(BaseModel): self.save(update_fields=["count_ok", "count_notok", "count_ok_full"]) mlog = self.mlog if mlog: - count_notok = MlogbDefect.objects.filter(defect__okcate=30, mlogb__mlog=mlog, material_out___isnull=False).aggregate(total=Sum("count"))["total"] or 0 - count_notok_full = MlogbDefect.objects.filter(mlogb__mlog=mlog, material_out___isnull=False).exclude(defect__okcate=10).aggregate(total=Sum("count"))["total"] or 0 + mqs2 = MlogbDefect.get_defect_qs_from_mlog(mlog, "out") + count_notok = mqs2.aggregate(total=Sum("count"))["total"] or 0 + count_notok_full = mqs2.exclude(defect__okcate=10).aggregate(total=Sum("count"))["total"] or 0 mlog.count_ok_full = self.count_real - count_notok_full mlog.count_notok = count_notok mlog.count_ok = self.count_real - count_notok @@ -413,6 +414,23 @@ class MlogbDefect(BaseModel): floor = models.IntegerField("层数", null=True, blank=True) count = models.PositiveIntegerField('数量', default=0) + @classmethod + def get_defect_qs(cls, ftype="all"): + qs = MlogbDefect.objects.filter(defect__isnull=False) + if ftype == "in": + qs = qs.filter(mlogb__material_in__isnull=False) + elif ftype == "out": + qs = qs.filter(mlogb__material_out__isnull=False) + return qs + + @classmethod + def get_defect_qs_from_mlogb(cls, mlogb:Mlogb, ftype="all"): + return cls.get_defect_qs(ftype).filter(mlogb=mlogb) + + @classmethod + def get_defect_qs_from_mlog(cls, mlog:Mlog, ftype="all"): + return cls.get_defect_qs(ftype).filter(mlogb__mlog=mlog) + class Mlogbw(BaseModel): """TN: 单个产品生产/检验日志 """ diff --git a/apps/wpm/services.py b/apps/wpm/services.py index e7a18d2a..1eace64f 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -169,7 +169,7 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): if m_ins.exists(): m_ins_list = [(mi.material_in, mi.batch if mi.batch else mi.batch, mi.count_use-mi.count_pn_jgqbl, None, mi) for mi in m_ins.all()] for item in m_ins: - mbd_qs = MlogbDefect.objects.filter(mlogb=item, defect__isnull=False) + mbd_qs = MlogbDefect.get_defect_qs_from_mlogb(item) for itemx in mbd_qs: if itemx.defect: m_ins_bl_list.append((item.material_in, item.batch, itemx.count, itemx.defect, item)) @@ -240,11 +240,11 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): m_outs_list = [(mo.material_out, mo.batch if mo.batch else mlog.batch, mo.count_ok_full if mo.count_ok_full is not None else mo.count_ok, mlog.count_real_eweight, None, mo) for mo in mlogb_out_qs.all()] if need_store_notok: for item in mlogb_out_qs: - mbd_qs = MlogbDefect.objects.filter(mlogb=item) + mbd_qs = MlogbDefect.get_defect_qs_from_mlogb(item) if item.qct is not None or mbd_qs.exists(): # if item.material_out.tracking == Material.MA_TRACKING_SINGLE: # Mlogbw.cal_count_notok(item) - for itemx in MlogbDefect.objects.filter(mlogb=item, defect__isnull=False): + for itemx in mbd_qs: m_outs_list.append((item.material_out, item.batch, itemx.count, 0, itemx.defect, item)) # # 获取所有主要的不合格项/先暂时保留 # bw_qs = Mlogbw.objects.filter(mlogb=item) @@ -374,11 +374,11 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): for mo in mlogb_out_qs.all()] if stored_notok: for item in mlogb_out_qs: - mbd_qs = MlogbDefect.objects.filter(mlogb=item) + mbd_qs = MlogbDefect.get_defect_qs_from_mlogb(item) if item.qct is not None or mbd_qs.exists(): # if item.material_out.tracking == Material.MA_TRACKING_SINGLE: # Mlogbw.cal_count_notok(item) - for itemx in MlogbDefect.objects.filter(mlogb=item): + for itemx in mbd_qs: m_outs_list.append((item.material_out, item.batch, itemx.count, 0, itemx.defect, item)) # if item.material_out.tracking == Material.MA_TRACKING_SINGLE: # # 获取所有主要的不合格项 @@ -466,7 +466,7 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): for mi in m_ins.all(): m_ins_list.append((mi.material_in, mi.batch, mi.count_use-mi.count_pn_jgqbl, None, mi)) for item in m_ins: - mbd_qs = MlogbDefect.objects.filter(mlogb=item, defect__isnull=False) + mbd_qs = MlogbDefect.get_defect_qs_from_mlogb(item) for itemx in mbd_qs: if itemx.defect: m_ins_bl_list.append((item.material_in, item.batch, itemx.count, itemx.defect, item))