diff --git a/apps/wpm/scripts/batch_gxerp.py b/apps/wpm/scripts/batch_gxerp.py index c2c2b07f..522dd0fc 100644 --- a/apps/wpm/scripts/batch_gxerp.py +++ b/apps/wpm/scripts/batch_gxerp.py @@ -1,7 +1,7 @@ from apps.wpm.models import BatchSt import logging 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 import decimal 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}_班次"]]) - mlogb2_qs = Mlogb.objects.filter(mlog__submit_time__isnull=False, - material_out__isnull=False, - mlog__mgroup__name="外观检验", - mlog__is_fix=True, batch=batch, need_inout=True) - if mlogb2_qs.exists(): - data["外观检验_返修_日期"] = [] - data["外观检验_返修_操作人"] = [] - data["外观检验_返修_count_real"] = 0 - data["外观检验_返修_count_ok"] = 0 - data["外观检验_返修_count_ok_full"] = 0 - for item in mlogb2_qs: - if item.mlog.handle_user: - data["外观检验_返修_操作人"].append(item.mlog.handle_user) - if item.mlog.handle_date: - data["外观检验_返修_日期"].append(item.mlog.handle_date) - data["外观检验_返修_count_real"] += item.count_real - data["外观检验_返修_count_ok"] += item.count_ok - data["外观检验_返修_count_ok_full"] += item.count_ok_full if item.count_ok_full else 0 - - data["外观检验_返修_日期"] = list(set(data["外观检验_返修_日期"])) - data["外观检验_返修_日期"] = ";".join([item.strftime("%Y-%m-%d") for item in data["外观检验_返修_日期"]]) - data["外观检验_返修_操作人"] = list(set(data["外观检验_返修_操作人"])) - data["外观检验_返修_操作人"] = ";".join([item.name for item in data["外观检验_返修_操作人"]]) - - mlogbd2_qs = MlogbDefect.objects.filter(mlogb__in=mlogb2_qs, count__gt=0).values("defect__name").annotate(total=Sum("count")) - - for item in mlogbd2_qs: - data[f"外观检验_返修_缺陷_{item['defect__name']}"] = item["total"] - data[f"外观检验_返修_缺陷_{item['defect__name']}_比例"] = round((item["total"] / data["外观检验_返修_count_real"])*100, 2) + # 按 mlog__submit_time, id 排序,每条 Mlogb 记录独立为一次返修 + # (同一 Mlog 下有多条同批次 Mlogb 时也能正确拆分为多次返修) + _all_fix_qs = Mlogb.objects.filter( + mlog__submit_time__isnull=False, + material_out__isnull=False, + mlog__mgroup__name="外观检验", + mlog__is_fix=True, + batch=batch, + need_inout=True, + ).order_by("mlog__submit_time", "id") + _fix_prefixes = [] + for fix_idx, fix_mlogb in enumerate(_all_fix_qs): + suffix = "" if fix_idx == 0 else str(fix_idx + 1) + prefix = f"外观检验_返修{suffix}_" + _fix_prefixes.append(prefix) + mlog = fix_mlogb.mlog + handle_date = mlog.handle_date + data[f"{prefix}count_real"] = fix_mlogb.count_real + data[f"{prefix}count_ok"] = fix_mlogb.count_ok + data[f"{prefix}count_ok_full"] = fix_mlogb.count_ok_full or 0 + data[f"{prefix}count_notok"] = fix_mlogb.count_notok or 0 + try: + data[f"{prefix}合格率"] = round((fix_mlogb.count_ok / fix_mlogb.count_real) * 100, 2) + except (decimal.InvalidOperation, ZeroDivisionError): + data[f"{prefix}合格率"] = 0 + try: + data[f"{prefix}完全合格率"] = round(((fix_mlogb.count_ok_full or 0) / fix_mlogb.count_real) * 100, 2) + except (decimal.InvalidOperation, ZeroDivisionError): + 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) @@ -141,13 +150,13 @@ def main(batch: str, mgroup_obj): data[f"外观检验_车间库存抽检_缺陷_{item['defect__name']}"] = item["total"] 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: data["外观检验_总合格率"] = round((data["外观检验_总合格数"] / data["外观检验_count_real"])*100, 2) except (decimal.InvalidOperation, ZeroDivisionError): 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: data["外观检验_完全总合格率"] = round((data["外观检验_完全总合格数"] / data["外观检验_count_real"])*100, 2) except (decimal.InvalidOperation, ZeroDivisionError):