From 2a784e66c0133b20bb265355bd1bd3d7dee4f620 Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Thu, 26 Feb 2026 14:52:58 +0800 Subject: [PATCH] feat: add unmatched materials section to execution report MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Track materials that are not in the delete list and display them in a new "未处理物料" (Unmatched Materials) section in the report. Co-Authored-By: Claude (glm-5) --- utils/discrete_material_plan_cleaner.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/utils/discrete_material_plan_cleaner.py b/utils/discrete_material_plan_cleaner.py index 47d7dd0..0ccc016 100644 --- a/utils/discrete_material_plan_cleaner.py +++ b/utils/discrete_material_plan_cleaner.py @@ -71,6 +71,7 @@ class DiscreteMaterialPlanCleaner: 'processed_materials': 0, # 已处理物料数 'deleted_materials': [], # [{order_id, material_code, material_name}] 'skipped_materials': [], # [{order_id, material_code, material_name, reason}] + 'unmatched_materials': [], # [{order_id, material_code, material_name}] 不在删除列表的物料 'errors': [], # [{order_id, error_message}] 'start_time': None, 'end_time': None, @@ -370,6 +371,12 @@ class DiscreteMaterialPlanCleaner: self._log( f"ℹ️ 物料 {material_name} ({material_code}) 不在删除列表中,不做处理" ) + # 记录到 unmatched_materials + self.stats['unmatched_materials'].append({ + 'order_id': order_id, + 'material_code': material_code, + 'material_name': material_name + }) if self._is_button_enabled(next_btn): last_row_number = current_row next_btn.click() @@ -495,6 +502,7 @@ class DiscreteMaterialPlanCleaner: report_lines.append(f"- 处理物料: {self.stats['processed_materials']}/{self.stats['total_materials']} 条") report_lines.append(f"- 删除物料: {len(self.stats['deleted_materials'])} 条") report_lines.append(f"- 跳过物料: {len(self.stats['skipped_materials'])} 条") + report_lines.append(f"- 未处理物料: {len(self.stats['unmatched_materials'])} 条") report_lines.append(f"- 错误数量: {len(self.stats['errors'])} 个") report_lines.append(f"- 执行模式: {'预览模式 (dryrun)' if self.dryrun else '正常执行'}") if self.manager_names: @@ -521,6 +529,16 @@ class DiscreteMaterialPlanCleaner: report_lines.append(f"| {item['order_id']} | {item['material_code']} | {item['material_name']} | {item['reason']} |") report_lines.append("") + # 未处理物料明细 + if self.stats['unmatched_materials']: + report_lines.append("## 未处理物料") + report_lines.append("") + report_lines.append("| 订单号 | 物料编码 | 物料名称 |") + report_lines.append("|--------|----------|----------|") + for item in self.stats['unmatched_materials']: + report_lines.append(f"| {item['order_id']} | {item['material_code']} | {item['material_name']} |") + report_lines.append("") + # 错误明细 if self.stats['errors']: report_lines.append("## 错误明细")