From 53c9afbca9f02400237253cabd318d4ed2e74bbf Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 6 Jun 2025 17:11:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20mlog=20=E7=9A=84cal=5Fcount=5Fnotok=5Ffu?= =?UTF-8?q?ll=E7=9A=84bug=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/models.py | 44 +++++++++++++++++++++++++++++++++++--------- apps/wpm/services.py | 37 ++----------------------------------- 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 4276c7b9..a3d60d12 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -310,6 +310,40 @@ class Mlog(CommonADModel): if without_count_ok_full: mlog_count_fields.remove("count_ok_full") return mlog_count_fields + + def cal_mlog_count_from_mlogb(self): + """ + 通过mlogb计算mlog count 合计 + """ + mlog = self + if mlog.fill_way == Mlog.MLOG_23: + a_dict = { + "total_count_use": Sum('count_use'), + "total_count_break": Sum('count_break'), + "total_count_break_t": Sum('count_break_t'), + "total_count_real": Sum('count_real'), + "total_count_ok": Sum('count_ok'), + "total_count_ok_full": Sum('count_ok_full'), + "total_count_notok": Sum('count_notok'), + } + f_names = [f.name for f in Mlogb._meta.fields if 'count_n_' in f.name] + for f in f_names: + a_dict[f'total_{f}'] = Sum(f) + mlogb_summary = Mlogb.objects.filter(mlog=mlog, need_inout=True).aggregate( + **a_dict + ) + # 更新Mlog对象的相应字段 + mlog.count_use = mlogb_summary['total_count_use'] or 0 + mlog.count_break = mlogb_summary['total_count_break'] or 0 + mlog.count_break_t = mlogb_summary['total_count_break_t'] or 0 + mlog.count_real = mlogb_summary['total_count_real'] or 0 + mlog.count_ok = mlogb_summary['total_count_ok'] or 0 + mlog.count_ok_full = mlogb_summary['total_count_ok_full'] or 0 + mlog.count_notok = mlogb_summary['total_count_notok'] or 0 + for f in f_names: + setattr(mlog, f, mlogb_summary[f'total_{f}'] or 0) + # 保存更新后的Mlog对象 + mlog.save() class MlogUser(BaseModel): """TN: 子级生产/检验日志操作人""" @@ -422,15 +456,7 @@ class Mlogb(BaseModel): self.save(update_fields=["count_ok", "count_notok", "count_ok_full"]) mlog = self.mlog if mlog: - mqs2 = MlogbDefect.get_defect_qs_from_mlog(mlog, "out") - count_notok = mqs2.filter(defect__okcate=30).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 - if mlog.count_ok_full < 0: - raise ParseError("完全合格数不能小于0") - mlog.count_notok = count_notok - mlog.count_ok = self.count_real - count_notok - mlog.save(update_fields=["count_ok", "count_notok", "count_ok_full"]) + mlog.cal_mlog_count_from_mlogb() class MlogbDefect(BaseModel): """TN: 生成记录的缺陷记录""" diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 7e4f3fcc..1dbf5e96 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -595,14 +595,14 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): xbatches = list(Mlogb.objects.filter(mlog=mlog).values_list('batch', flat=True)) ana_batch_thread(xbatches) -def cal_mtask_progress_from_mlog(mlog): +def cal_mtask_progress_from_mlog(mlog:Mlog): """ 更新mlog关联的任务进度(可线程中执行) """ if mlog.fill_way in [Mlog.MLOG_2, Mlog.MLOG_12] and mlog.mtask: update_mtask(mlog.mtask, fill_way=mlog.fill_way) elif mlog.fill_way == Mlog.MLOG_23: - cal_mlog_count_from_mlogb(mlog) + mlog.cal_mlog_count_from_mlogb() m_outs_qs = Mlogb.objects.filter(mlog=mlog, material_out__isnull=False) caled_mtask = [] for item in m_outs_qs.all(): @@ -613,39 +613,6 @@ def cal_mtask_progress_from_mlog(mlog): update_mtask(mtask, fill_way=mlog.fill_way) caled_mtask.append(mtask) -def cal_mlog_count_from_mlogb(mlog: Mlog): - """ - 通过mlogb计算mlog count 合计 - """ - if mlog.fill_way == Mlog.MLOG_23: - a_dict = { - "total_count_use": Sum('count_use'), - "total_count_break": Sum('count_break'), - "total_count_break_t": Sum('count_break_t'), - "total_count_real": Sum('count_real'), - "total_count_ok": Sum('count_ok'), - "total_count_ok_full": Sum('count_ok_full'), - "total_count_notok": Sum('count_notok'), - } - f_names = [f.name for f in Mlogb._meta.fields if 'count_n_' in f.name] - for f in f_names: - a_dict[f'total_{f}'] = Sum(f) - mlogb_summary = Mlogb.objects.filter(mlog=mlog, need_inout=True).aggregate( - **a_dict - ) - # 更新Mlog对象的相应字段 - mlog.count_use = mlogb_summary['total_count_use'] or 0 - mlog.count_break = mlogb_summary['total_count_break'] or 0 - mlog.count_break_t = mlogb_summary['total_count_break_t'] or 0 - mlog.count_real = mlogb_summary['total_count_real'] or 0 - mlog.count_ok = mlogb_summary['total_count_ok'] or 0 - mlog.count_ok_full = mlogb_summary['total_count_ok_full'] or 0 - mlog.count_notok = mlogb_summary['total_count_notok'] or 0 - for f in f_names: - setattr(mlog, f, mlogb_summary[f'total_{f}'] or 0) - # 保存更新后的Mlog对象 - mlog.save() - def cal_material_count_from_mlog(mlog: Mlog): """ 更新mlog关联的物料数量(可单独执行)