feat(cleaner): track skipped materials and skip DB writes on dry run

Record materials not in the deletion list as "skipped" with reason
instead of just logging them. Skip inserting material details to
database during dry runs to avoid phantom records.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Misaka_Company
2026-04-13 15:58:00 +08:00
parent 116539ff42
commit 151485caed
4 changed files with 258 additions and 3 deletions

View File

@@ -37,6 +37,34 @@ vi.mock('../../../../src/main/services/erp/order-resolver', () => {
}
})
// Mock CleanerOperationHistoryDAO
vi.mock('../../../../src/main/services/database/cleaner-operation-history-dao', () => {
return {
CleanerOperationHistoryDAO: class {
async insertExecution() {
return true
}
async insertOrderRecords() {
return true
}
async updateOrderStatus() {
return true
}
async insertMaterialDetails() {
return true
}
async updateExecutionStatus() {
return true
}
async getBatchDetails() {
return {
executions: [{ attemptNumber: 1, isDryRun: false }]
}
}
}
}
})
// Control whether CleanerService.clean should throw
let cleanerShouldThrow = false
let cleanerError: Error = new Error('cleaner crashed')
@@ -108,6 +136,16 @@ function setupServiceMocks(service: CleanerApplicationService) {
})
;(service as any).recordCleanupAudit = vi.fn().mockResolvedValue(undefined)
;(service as any).generateAndUploadReport = vi.fn().mockResolvedValue(undefined)
;(service as any).getHistoryDao = vi.fn().mockReturnValue({
insertExecution: vi.fn().mockResolvedValue(true),
insertOrderRecords: vi.fn().mockResolvedValue(true),
updateOrderStatus: vi.fn().mockResolvedValue(true),
insertMaterialDetails: vi.fn().mockResolvedValue(true),
updateExecutionStatus: vi.fn().mockResolvedValue(true),
getBatchDetails: vi.fn().mockResolvedValue({
executions: [{ attemptNumber: 1, isDryRun: false }]
})
})
}
function makeInput(overrides: Record<string, any> = {}) {