feat: add unmatched materials section to execution report

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) <noreply@anthropic.com>
This commit is contained in:
Misaka_Company
2026-02-26 14:52:58 +08:00
parent 784007c8d4
commit 2a784e66c0

View File

@@ -71,6 +71,7 @@ class DiscreteMaterialPlanCleaner:
'processed_materials': 0, # 已处理物料数 'processed_materials': 0, # 已处理物料数
'deleted_materials': [], # [{order_id, material_code, material_name}] 'deleted_materials': [], # [{order_id, material_code, material_name}]
'skipped_materials': [], # [{order_id, material_code, material_name, reason}] 'skipped_materials': [], # [{order_id, material_code, material_name, reason}]
'unmatched_materials': [], # [{order_id, material_code, material_name}] 不在删除列表的物料
'errors': [], # [{order_id, error_message}] 'errors': [], # [{order_id, error_message}]
'start_time': None, 'start_time': None,
'end_time': None, 'end_time': None,
@@ -370,6 +371,12 @@ class DiscreteMaterialPlanCleaner:
self._log( self._log(
f" 物料 {material_name} ({material_code}) 不在删除列表中,不做处理" 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): if self._is_button_enabled(next_btn):
last_row_number = current_row last_row_number = current_row
next_btn.click() 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"- 处理物料: {self.stats['processed_materials']}/{self.stats['total_materials']}")
report_lines.append(f"- 删除物料: {len(self.stats['deleted_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['skipped_materials'])}")
report_lines.append(f"- 未处理物料: {len(self.stats['unmatched_materials'])}")
report_lines.append(f"- 错误数量: {len(self.stats['errors'])}") report_lines.append(f"- 错误数量: {len(self.stats['errors'])}")
report_lines.append(f"- 执行模式: {'预览模式 (dryrun)' if self.dryrun else '正常执行'}") report_lines.append(f"- 执行模式: {'预览模式 (dryrun)' if self.dryrun else '正常执行'}")
if self.manager_names: 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(f"| {item['order_id']} | {item['material_code']} | {item['material_name']} | {item['reason']} |")
report_lines.append("") 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']: if self.stats['errors']:
report_lines.append("## 错误明细") report_lines.append("## 错误明细")