From feb8bd6770dbc73a742b2591266fd29dd17eac8f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 13 Jan 2026 10:29:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20wpr=5Fbxerp=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/scripts/wpr_bxerp.py | 85 ++++++++++++++++++++++++----------- apps/wpmw/views.py | 10 +++++ 2 files changed, 68 insertions(+), 27 deletions(-) diff --git a/apps/wpm/scripts/wpr_bxerp.py b/apps/wpm/scripts/wpr_bxerp.py index 8ef74e42..7efb4cba 100644 --- a/apps/wpm/scripts/wpr_bxerp.py +++ b/apps/wpm/scripts/wpr_bxerp.py @@ -1,36 +1,67 @@ from apps.wpmw.models import Wpr -from apps.wpm.models import Mlogbw -from apps.qm.models import Ftest, FtestDefect, FtestItem +from apps.wpm.models import Mlogbw, Mlog, MlogUser +from apps.qm.models import Ftest, FtestDefect, FtestItem, TestItem from rest_framework.exceptions import ParseError from apps.mtm.models import Mgroup -def main(wprId, mgroup:Mgroup): +def main(wprId, mgroup:Mgroup=None): wpr = Wpr.objects.get(id=wprId) + if mgroup is None: + mgroup_ids = Mlogbw.objects.filter( + wpr=wpr, + mlogb__mlog__submit_time__isnull=False, + mlogb__mlog__is_fix=False + ).values_list( + 'mlogb__mlog__mgroup', + flat=True + ).distinct() + mgroups = Mgroup.objects.filter(id__in=mgroup_ids) + else: + mgroups = [mgroup] data = {} - mgroup_name = mgroup.name - mlogbw = Mlogbw.objects.filter(wpr=wpr, mlogb__mlog__mgroup=mgroup, mlogb__mlog__submit_time__isnull=False).order_by("-update_time").first() - if mlogbw: - data[f"{mgroup_name}_批次号"] = mlogbw.mlogb.batch - data[f"{mgroup_name}_日期"] = mlogbw.mlogb.mlog.handle_date.strftime("%Y-%m-%d") - ftestitems = FtestItem.objects.filter(ftest__mlogbw_ftest__wpr=wpr, + for mgroup in mgroups: + mgroup_name = mgroup.name + mlogbw = Mlogbw.objects.filter(wpr=wpr, + mlogb__mlog__mgroup=mgroup, + mlogb__mlog__submit_time__isnull=False, mlogb__mlog__is_fix=False).order_by("-update_time").first() + if mlogbw: + mlog:Mlog = mlogbw.mlogb.mlog + data[f"{mgroup_name}_批次号"] = mlogbw.mlogb.batch + data[f"{mgroup_name}_设备编号"] = mlog.equipment.number if mlog.equipment else None + data[f"{mgroup_name}_操作人"] = mlog.handle_user.name if mlog.handle_user else None + data[f"{mgroup_name}_日期"] = mlog.handle_date.strftime("%Y-%m-%d") + # 日志操作数据 + if mlog.oinfo_json: + oinfo_keys = list(mlog.oinfo_json.keys()) + oinfo_keys_qs = TestItem.objects.filter(id__in=oinfo_keys) + for item in oinfo_keys_qs: + data[f"{mgroup_name}_操作项_{item.name}"] = mlog.oinfo_json[item.id] + # 子工序操作人和日期 + mlogusers = MlogUser.objects.filter(mlog=mlog) + if mlogusers.exists(): + datab = mlogusers.values("handle_user__name", "process__name", "handle_date") + for ind, item in enumerate(datab): + data[f"{mgroup_name}_{item['process__name']}_操作人"] = item["handle_user__name"] + data[f"{mgroup_name}_{item['process__name']}_日期"] = item["handle_date"].strftime("%Y-%m-%d") + # 检测数据 + ftestitems = FtestItem.objects.filter(ftest__mlogbw_ftest__wpr=wpr, + ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup, + ftest__mlogbw_ftest__mlogb__mlog__submit_time__isnull=False, + ftest__mlogbw_ftest__mlogb__mlog__is_fix=False) + for ftestitem in ftestitems: + data[f"{mgroup_name}_检测项_{ftestitem.testitem.name}"] = ftestitem.test_val_json + + ftestdefects = FtestDefect.objects.filter(ftest__mlogbw_ftest__wpr=wpr, ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup, ftest__mlogbw_ftest__mlogb__mlog__submit_time__isnull=False, ftest__mlogbw_ftest__mlogb__mlog__is_fix=False) - for ftestitem in ftestitems: - data[f"{mgroup_name}_检测项_{ftestitem.testitem.name}"] = ftestitem.test_val_json - - ftestdefects = FtestDefect.objects.filter(ftest__mlogbw_ftest__wpr=wpr, - ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup, - ftest__mlogbw_ftest__mlogb__mlog__submit_time__isnull=False, - ftest__mlogbw_ftest__mlogb__mlog__is_fix=False) - for ftestdefect in ftestdefects: - data[f"{mgroup_name}_缺陷项_{ftestdefect.defect.name}"] = 1 if ftestdefect.has is True else 0 - - old_data:dict = wpr.data - if old_data: - for item in list(old_data.keys()): - if f'{mgroup_name}_' in item: - del old_data[item] - old_data.update(data) - wpr.data = old_data - wpr.save(update_fields=["data"]) \ No newline at end of file + for ftestdefect in ftestdefects: + data[f"{mgroup_name}_缺陷项_{ftestdefect.defect.name}"] = 1 if ftestdefect.has is True else 0 + old_data:dict = wpr.data + if old_data: + for item in list(old_data.keys()): + if f'{mgroup_name}_' in item: + del old_data[item] + old_data.update(data) + wpr.data = old_data + wpr.save(update_fields=["data"]) \ No newline at end of file diff --git a/apps/wpmw/views.py b/apps/wpmw/views.py index 3663f180..dcad152a 100644 --- a/apps/wpmw/views.py +++ b/apps/wpmw/views.py @@ -34,6 +34,16 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu "number_suffix": RawSQL("COALESCE(NULLIF(regexp_replace(wpmw_wpr.number, '.*?(\\d+)$', '\\1'), ''), '0')::bigint", []), } + def add_info_for_list(self, data): + parent_ids = [item["wpr_from"] for item in data if item["wpr_from"]] + if parent_ids: + parent_data = Wpr.objects.filter(id__in=parent_ids).values("id", "number", "data") + parent_map = {item["id"]: item for item in parent_data} + for item in data: + if item["wpr_from"]: + item["parent"] = parent_map[item["wpr_from"]] + return data + def filter_queryset(self, queryset): qs = super().filter_queryset(queryset) if "mb__isnull" in self.request.query_params or "wm__isnull" in self.request.query_params: