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:
@@ -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("## 错误明细")
|
||||||
|
|||||||
Reference in New Issue
Block a user