fix:禅道413

This commit is contained in:
shijing 2026-05-21 16:18:01 +08:00
parent 99e2909514
commit 7d91682e8a
1 changed files with 41 additions and 32 deletions

View File

@ -1,7 +1,7 @@
from apps.wpm.models import BatchSt from apps.wpm.models import BatchSt
import logging import logging
from apps.qm.models import Defect, FtestWork, FtestworkDefect from apps.qm.models import Defect, FtestWork, FtestworkDefect
from apps.wpm.models import Mlogb, MlogbDefect from apps.wpm.models import Mlogb, MlogbDefect, Mlog
from apps.mtm.models import Mgroup from apps.mtm.models import Mgroup
import decimal import decimal
from django.db.models import Sum from django.db.models import Sum
@ -87,35 +87,44 @@ def main(batch: str, mgroup_obj):
data[f"{mgroup_name}_班次"] = ";".join([item for item in data[f"{mgroup_name}_班次"]]) data[f"{mgroup_name}_班次"] = ";".join([item for item in data[f"{mgroup_name}_班次"]])
mlogb2_qs = Mlogb.objects.filter(mlog__submit_time__isnull=False, # 按 mlog__submit_time, id 排序,每条 Mlogb 记录独立为一次返修
material_out__isnull=False, # (同一 Mlog 下有多条同批次 Mlogb 时也能正确拆分为多次返修)
mlog__mgroup__name="外观检验", _all_fix_qs = Mlogb.objects.filter(
mlog__is_fix=True, batch=batch, need_inout=True) mlog__submit_time__isnull=False,
if mlogb2_qs.exists(): material_out__isnull=False,
data["外观检验_返修_日期"] = [] mlog__mgroup__name="外观检验",
data["外观检验_返修_操作人"] = [] mlog__is_fix=True,
data["外观检验_返修_count_real"] = 0 batch=batch,
data["外观检验_返修_count_ok"] = 0 need_inout=True,
data["外观检验_返修_count_ok_full"] = 0 ).order_by("mlog__submit_time", "id")
for item in mlogb2_qs: _fix_prefixes = []
if item.mlog.handle_user: for fix_idx, fix_mlogb in enumerate(_all_fix_qs):
data["外观检验_返修_操作人"].append(item.mlog.handle_user) suffix = "" if fix_idx == 0 else str(fix_idx + 1)
if item.mlog.handle_date: prefix = f"外观检验_返修{suffix}_"
data["外观检验_返修_日期"].append(item.mlog.handle_date) _fix_prefixes.append(prefix)
data["外观检验_返修_count_real"] += item.count_real mlog = fix_mlogb.mlog
data["外观检验_返修_count_ok"] += item.count_ok handle_date = mlog.handle_date
data["外观检验_返修_count_ok_full"] += item.count_ok_full if item.count_ok_full else 0 data[f"{prefix}count_real"] = fix_mlogb.count_real
data[f"{prefix}count_ok"] = fix_mlogb.count_ok
data["外观检验_返修_日期"] = list(set(data["外观检验_返修_日期"])) data[f"{prefix}count_ok_full"] = fix_mlogb.count_ok_full or 0
data["外观检验_返修_日期"] = ";".join([item.strftime("%Y-%m-%d") for item in data["外观检验_返修_日期"]]) data[f"{prefix}count_notok"] = fix_mlogb.count_notok or 0
data["外观检验_返修_操作人"] = list(set(data["外观检验_返修_操作人"])) try:
data["外观检验_返修_操作人"] = ";".join([item.name for item in data["外观检验_返修_操作人"]]) data[f"{prefix}合格率"] = round((fix_mlogb.count_ok / fix_mlogb.count_real) * 100, 2)
except (decimal.InvalidOperation, ZeroDivisionError):
mlogbd2_qs = MlogbDefect.objects.filter(mlogb__in=mlogb2_qs, count__gt=0).values("defect__name").annotate(total=Sum("count")) data[f"{prefix}合格率"] = 0
try:
for item in mlogbd2_qs: data[f"{prefix}完全合格率"] = round(((fix_mlogb.count_ok_full or 0) / fix_mlogb.count_real) * 100, 2)
data[f"外观检验_返修_缺陷_{item['defect__name']}"] = item["total"] except (decimal.InvalidOperation, ZeroDivisionError):
data[f"外观检验_返修_缺陷_{item['defect__name']}_比例"] = round((item["total"] / data["外观检验_返修_count_real"])*100, 2) data[f"{prefix}完全合格率"] = 0
data[f"{prefix}日期"] = handle_date.strftime("%Y-%m-%d") if handle_date else ""
data[f"{prefix}小日期"] = handle_date.strftime("%Y-%m-%d") if handle_date else ""
data[f"{prefix}大日期"] = handle_date.strftime("%Y-%m-%d") if handle_date else ""
data[f"{prefix}操作人"] = mlog.handle_user.name if mlog.handle_user else ""
data[f"{prefix}班次"] = mlog.shift.name if mlog.shift else ""
fix_defect_qs = MlogbDefect.objects.filter(mlogb=fix_mlogb, count__gt=0).values("defect__name").annotate(total=Sum("count"))
for item in fix_defect_qs:
data[f"{prefix}缺陷_{item['defect__name']}"] = item["total"]
data[f"{prefix}缺陷_{item['defect__name']}_比例"] = round((item["total"] / fix_mlogb.count_real) * 100, 2)
# 车间库存抽检 # 车间库存抽检
ft_qs = FtestWork.objects.filter(type2=FtestWork.TYPE2_SOME, wm__mgroup__name="外观检验", batch=batch, submit_time__isnull=False) ft_qs = FtestWork.objects.filter(type2=FtestWork.TYPE2_SOME, wm__mgroup__name="外观检验", batch=batch, submit_time__isnull=False)
@ -141,13 +150,13 @@ def main(batch: str, mgroup_obj):
data[f"外观检验_车间库存抽检_缺陷_{item['defect__name']}"] = item["total"] data[f"外观检验_车间库存抽检_缺陷_{item['defect__name']}"] = item["total"]
if "外观检验_count_ok" in data: if "外观检验_count_ok" in data:
data["外观检验_总合格数"] = data["外观检验_count_ok"] + data.get("外观检验_返修_count_ok", 0) data["外观检验_总合格数"] = data["外观检验_count_ok"] + sum(data.get(f"{p}count_ok", 0) for p in _fix_prefixes)
try: try:
data["外观检验_总合格率"] = round((data["外观检验_总合格数"] / data["外观检验_count_real"])*100, 2) data["外观检验_总合格率"] = round((data["外观检验_总合格数"] / data["外观检验_count_real"])*100, 2)
except (decimal.InvalidOperation, ZeroDivisionError): except (decimal.InvalidOperation, ZeroDivisionError):
data["外观检验_总合格率"] = 0 data["外观检验_总合格率"] = 0
data["外观检验_完全总合格数"] = data["外观检验_count_ok_full"] + data.get("外观检验_返修_count_ok_full", 0) data["外观检验_完全总合格数"] = data["外观检验_count_ok_full"] + sum(data.get(f"{p}count_ok_full", 0) for p in _fix_prefixes)
try: try:
data["外观检验_完全总合格率"] = round((data["外观检验_完全总合格数"] / data["外观检验_count_real"])*100, 2) data["外观检验_完全总合格率"] = round((data["外观检验_完全总合格数"] / data["外观检验_count_real"])*100, 2)
except (decimal.InvalidOperation, ZeroDivisionError): except (decimal.InvalidOperation, ZeroDivisionError):