feat: auto-generate markdown report after cleaner execution

- Add CleanerReportGenerator service to create execution reports
- Extend OrderCleanDetail with skippedMaterials for detailed tracking
- Record skip reasons for each material (protected range, pending qty, etc.)
- Generate timestamped markdown reports in logs/reports/ directory
- Reports include execution summary, order details, skip reasons, and errors
This commit is contained in:
Misaka_Company
2026-03-05 16:19:40 +08:00
parent 224a42e44b
commit a906f34ac2
4 changed files with 286 additions and 2 deletions

View File

@@ -74,6 +74,21 @@ export class CleanerService {
return true
}
getSkipReason(params: ShouldDeleteParams): string {
const { rowNumber, pendingQty, materialCode, deleteSet } = params
if (!deleteSet.has(materialCode)) {
return '物料不在删除清单中'
}
if (rowNumber >= 7000 && rowNumber < 8000) {
return '行号在 7000-7999 范围内(受保护)'
}
if (pendingQty && pendingQty.trim() !== '') {
return '累计待发数量不为空'
}
return '未知原因'
}
/**
* Execute the cleaning process
* Reference: Python clean() method lines 456-525
@@ -130,7 +145,8 @@ export class CleanerService {
orderNumber,
materialsDeleted: 0,
materialsSkipped: 0,
errors: [message]
errors: [message],
skippedMaterials: []
})
}
}
@@ -229,7 +245,8 @@ export class CleanerService {
orderNumber,
materialsDeleted: 0,
materialsSkipped: 0,
errors: []
errors: [],
skippedMaterials: []
}
// Query the order (Python lines 187-189)
@@ -371,6 +388,18 @@ export class CleanerService {
continue
} else if (!shouldDelete) {
detail.materialsSkipped++
const reason = this.getSkipReason({
rowNumber: rowNumInt,
pendingQty,
materialCode,
deleteSet
})
detail.skippedMaterials.push({
materialCode,
materialName,
rowNumber: rowNumInt,
reason
})
}
}