feat(cleaner): add preload API for cleaner operation history
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,12 @@ import type {
|
|||||||
ExportResultItem,
|
ExportResultItem,
|
||||||
ExportResultResponse
|
ExportResultResponse
|
||||||
} from './cleaner.types'
|
} from './cleaner.types'
|
||||||
|
import type {
|
||||||
|
CleanerBatchStats,
|
||||||
|
CleanerExecutionRecord,
|
||||||
|
CleanerOrderRecord,
|
||||||
|
CleanerMaterialRecord
|
||||||
|
} from './cleaner-history.types'
|
||||||
import type { IpcResult } from './ipc.types'
|
import type { IpcResult } from './ipc.types'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -113,6 +119,45 @@ export interface CleanerAPI {
|
|||||||
* @returns Unsubscribe function
|
* @returns Unsubscribe function
|
||||||
*/
|
*/
|
||||||
onProgress: (callback: (data: CleanerProgress) => void) => () => void
|
onProgress: (callback: (data: CleanerProgress) => void) => () => void
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get cleaner operation history batches
|
||||||
|
* @param options - Query options (limit, offset, usernames)
|
||||||
|
*/
|
||||||
|
getHistoryBatches: (options?: {
|
||||||
|
limit?: number
|
||||||
|
offset?: number
|
||||||
|
usernames?: string[]
|
||||||
|
}) => Promise<IpcResult<CleanerBatchStats[]>>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get detailed execution and order records for a specific batch
|
||||||
|
* @param batchId - Batch ID
|
||||||
|
*/
|
||||||
|
getHistoryBatchDetails: (batchId: string) => Promise<
|
||||||
|
IpcResult<{
|
||||||
|
executions: CleanerExecutionRecord[]
|
||||||
|
orders: CleanerOrderRecord[]
|
||||||
|
}>
|
||||||
|
>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get material-level details for a specific order in a batch attempt
|
||||||
|
* @param batchId - Batch ID
|
||||||
|
* @param attemptNumber - Attempt number
|
||||||
|
* @param orderNumber - Order number
|
||||||
|
*/
|
||||||
|
getHistoryMaterialDetails: (
|
||||||
|
batchId: string,
|
||||||
|
attemptNumber: number,
|
||||||
|
orderNumber: string
|
||||||
|
) => Promise<IpcResult<CleanerMaterialRecord[]>>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a cleaner history batch
|
||||||
|
* @param batchId - Batch ID
|
||||||
|
*/
|
||||||
|
deleteHistoryBatch: (batchId: string) => Promise<IpcResult<{ deleted: boolean }>>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,6 +3,14 @@ import type {
|
|||||||
CleanerProgress,
|
CleanerProgress,
|
||||||
ExportResultItem
|
ExportResultItem
|
||||||
} from '../../main/types/cleaner.types'
|
} from '../../main/types/cleaner.types'
|
||||||
|
import type {
|
||||||
|
CleanerBatchStats,
|
||||||
|
CleanerExecutionRecord,
|
||||||
|
CleanerOrderRecord,
|
||||||
|
CleanerMaterialRecord,
|
||||||
|
GetCleanerBatchesOptions
|
||||||
|
} from '../../main/types/cleaner-history.types'
|
||||||
|
import type { IpcResult } from '../../main/types/ipc.types'
|
||||||
import { IPC_CHANNELS } from '../../shared/ipc-channels'
|
import { IPC_CHANNELS } from '../../shared/ipc-channels'
|
||||||
import { invokeIpc, ipcRenderer } from '../lib/ipc'
|
import { invokeIpc, ipcRenderer } from '../lib/ipc'
|
||||||
|
|
||||||
@@ -15,5 +23,28 @@ export const cleanerApi = {
|
|||||||
callback(data)
|
callback(data)
|
||||||
ipcRenderer.on(IPC_CHANNELS.CLEANER_PROGRESS, subscription)
|
ipcRenderer.on(IPC_CHANNELS.CLEANER_PROGRESS, subscription)
|
||||||
return () => ipcRenderer.removeListener(IPC_CHANNELS.CLEANER_PROGRESS, subscription)
|
return () => ipcRenderer.removeListener(IPC_CHANNELS.CLEANER_PROGRESS, subscription)
|
||||||
}
|
},
|
||||||
|
|
||||||
|
// Cleaner operation history
|
||||||
|
getHistoryBatches: (options?: GetCleanerBatchesOptions): Promise<IpcResult<CleanerBatchStats[]>> =>
|
||||||
|
invokeIpc(IPC_CHANNELS.CLEANER_HISTORY_GET_BATCHES, options),
|
||||||
|
|
||||||
|
getHistoryBatchDetails: (
|
||||||
|
batchId: string
|
||||||
|
): Promise<
|
||||||
|
IpcResult<{
|
||||||
|
executions: CleanerExecutionRecord[]
|
||||||
|
orders: CleanerOrderRecord[]
|
||||||
|
}>
|
||||||
|
> => invokeIpc(IPC_CHANNELS.CLEANER_HISTORY_GET_BATCH_DETAILS, batchId),
|
||||||
|
|
||||||
|
getHistoryMaterialDetails: (
|
||||||
|
batchId: string,
|
||||||
|
attemptNumber: number,
|
||||||
|
orderNumber: string
|
||||||
|
): Promise<IpcResult<CleanerMaterialRecord[]>> =>
|
||||||
|
invokeIpc(IPC_CHANNELS.CLEANER_HISTORY_GET_MATERIAL_DETAILS, batchId, attemptNumber, orderNumber),
|
||||||
|
|
||||||
|
deleteHistoryBatch: (batchId: string): Promise<IpcResult<{ deleted: boolean }>> =>
|
||||||
|
invokeIpc(IPC_CHANNELS.CLEANER_HISTORY_DELETE_BATCH, batchId)
|
||||||
} as const
|
} as const
|
||||||
|
|||||||
85
src/preload/index.d.ts
vendored
85
src/preload/index.d.ts
vendored
@@ -190,6 +190,91 @@ export interface OperationHistoryRecord {
|
|||||||
errorMessage: string | null
|
errorMessage: string | null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface CleanerHistoryBatchStats {
|
||||||
|
batchId: string
|
||||||
|
userId: number
|
||||||
|
username: string
|
||||||
|
operationTime: string
|
||||||
|
status: string
|
||||||
|
totalAttempts: number
|
||||||
|
totalOrders: number
|
||||||
|
ordersProcessed: number
|
||||||
|
totalMaterialsDeleted: number
|
||||||
|
totalMaterialsFailed: number
|
||||||
|
successCount: number
|
||||||
|
failedCount: number
|
||||||
|
isDryRun: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CleanerHistoryExecutionRecord {
|
||||||
|
id?: number
|
||||||
|
batchId: string
|
||||||
|
attemptNumber: number
|
||||||
|
userId: number
|
||||||
|
username: string
|
||||||
|
operationTime: Date
|
||||||
|
endTime: Date | null
|
||||||
|
status: string
|
||||||
|
isDryRun: boolean
|
||||||
|
totalOrders: number
|
||||||
|
ordersProcessed: number
|
||||||
|
totalMaterialsDeleted: number
|
||||||
|
totalMaterialsSkipped: number
|
||||||
|
totalMaterialsFailed: number
|
||||||
|
totalUncertainDeletions: number
|
||||||
|
errorMessage: string | null
|
||||||
|
appVersion: string | null
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CleanerHistoryOrderRecord {
|
||||||
|
id?: number
|
||||||
|
batchId: string
|
||||||
|
attemptNumber: number
|
||||||
|
orderNumber: string
|
||||||
|
status: string
|
||||||
|
materialsDeleted: number
|
||||||
|
materialsSkipped: number
|
||||||
|
materialsFailed: number
|
||||||
|
uncertainDeletions: number
|
||||||
|
retryCount: number
|
||||||
|
retrySuccess: boolean
|
||||||
|
errorMessage: string | null
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CleanerHistoryMaterialRecord {
|
||||||
|
id?: number
|
||||||
|
batchId: string
|
||||||
|
attemptNumber: number
|
||||||
|
orderNumber: string
|
||||||
|
materialCode: string
|
||||||
|
materialName: string
|
||||||
|
rowNumber: number
|
||||||
|
result: string
|
||||||
|
reason: string | null
|
||||||
|
attemptCount: number
|
||||||
|
finalErrorCategory: string | null
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CleanerHistoryAPI {
|
||||||
|
getHistoryBatches: (options?: {
|
||||||
|
limit?: number
|
||||||
|
offset?: number
|
||||||
|
usernames?: string[]
|
||||||
|
}) => Promise<IpcResult<CleanerHistoryBatchStats[]>>
|
||||||
|
getHistoryBatchDetails: (batchId: string) => Promise<
|
||||||
|
IpcResult<{
|
||||||
|
executions: CleanerHistoryExecutionRecord[]
|
||||||
|
orders: CleanerHistoryOrderRecord[]
|
||||||
|
}>
|
||||||
|
>
|
||||||
|
getHistoryMaterialDetails: (
|
||||||
|
batchId: string,
|
||||||
|
attemptNumber: number,
|
||||||
|
orderNumber: string
|
||||||
|
) => Promise<IpcResult<CleanerHistoryMaterialRecord[]>>
|
||||||
|
deleteHistoryBatch: (batchId: string) => Promise<IpcResult<{ deleted: boolean }>>
|
||||||
|
}
|
||||||
|
|
||||||
export interface ProcessAPI {
|
export interface ProcessAPI {
|
||||||
versions: {
|
versions: {
|
||||||
electron: string
|
electron: string
|
||||||
|
|||||||
Reference in New Issue
Block a user