From 116539ff42a15ba2312ec1aa52a9059034f97bec Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Mon, 13 Apr 2026 14:24:18 +0800 Subject: [PATCH] feat(cleaner): record all material operations in database, including successful deletions Previously only skipped and failed materials were persisted. Now every material (deleted, uncertain, skipped, failed) is recorded in CleanerMaterialDetail for full audit traceability. Co-Authored-By: Claude Opus 4.6 --- .../cleaner/cleaner-application-service.ts | 15 ++++++++++++++- src/main/services/erp/cleaner.ts | 8 ++++++++ src/main/types/cleaner.types.ts | 8 ++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/services/cleaner/cleaner-application-service.ts b/src/main/services/cleaner/cleaner-application-service.ts index 776373a..8c2f6f3 100644 --- a/src/main/services/cleaner/cleaner-application-service.ts +++ b/src/main/services/cleaner/cleaner-application-service.ts @@ -433,9 +433,22 @@ export class CleanerApplicationService { detail.errors.length > 0 ? detail.errors.join('\n') : undefined ) - // Insert material details for skipped and failed materials + // Insert material details for all materials const materialDetails: InsertMaterialDetailInput[] = [] + for (const deleted of detail.deletedMaterials) { + materialDetails.push({ + orderNumber: detail.orderNumber, + materialCode: deleted.materialCode, + materialName: deleted.materialName, + rowNumber: deleted.rowNumber, + result: deleted.outcome, + reason: null, + attemptCount: 1, + finalErrorCategory: null + }) + } + for (const skipped of detail.skippedMaterials) { materialDetails.push({ orderNumber: detail.orderNumber, diff --git a/src/main/services/erp/cleaner.ts b/src/main/services/erp/cleaner.ts index 7a90cf0..14694ff 100644 --- a/src/main/services/erp/cleaner.ts +++ b/src/main/services/erp/cleaner.ts @@ -758,6 +758,7 @@ export class CleanerService { materialsSkipped: 0, errors: [], skippedMaterials: [], + deletedMaterials: [], retryCount: 0, retryAttempts: [], retriedAt: undefined, @@ -925,6 +926,12 @@ export class CleanerService { deleteResult.outcome === DeletionOutcome.Uncertain ) { detail.materialsDeleted += 1 + detail.deletedMaterials.push({ + materialCode, + materialName, + rowNumber: rowNumInt, + outcome: deleteResult.outcome + }) if (deleteResult.outcome === DeletionOutcome.Uncertain) { detail.uncertainDeletions += 1 } @@ -1106,6 +1113,7 @@ export class CleanerService { materialsSkipped: 0, errors: [message], skippedMaterials: [], + deletedMaterials: [], retryCount: 0, retryAttempts: [], retriedAt: undefined, diff --git a/src/main/types/cleaner.types.ts b/src/main/types/cleaner.types.ts index b8b7e4a..4633319 100644 --- a/src/main/types/cleaner.types.ts +++ b/src/main/types/cleaner.types.ts @@ -44,6 +44,13 @@ export interface SkippedMaterial { reason: string } +export interface DeletedMaterial { + materialCode: string + materialName: string + rowNumber: number + outcome: string +} + export interface RetryAttempt { attempt: number error: string @@ -56,6 +63,7 @@ export interface OrderCleanDetail { materialsSkipped: number errors: string[] skippedMaterials: SkippedMaterial[] + deletedMaterials: DeletedMaterial[] // Retry-related fields retryCount: number retryAttempts?: RetryAttempt[]