From 73656dada885cdc9ccdc086a72d305848708fa45 Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Mon, 13 Apr 2026 11:38:54 +0800 Subject: [PATCH] feat(cleaner): add IPC handlers for cleaner operation history Co-Authored-By: Claude Opus 4.6 --- src/main/ipc/cleaner-history-handler.ts | 146 ++++++++++++++++++++++++ src/main/ipc/index.ts | 2 + 2 files changed, 148 insertions(+) create mode 100644 src/main/ipc/cleaner-history-handler.ts diff --git a/src/main/ipc/cleaner-history-handler.ts b/src/main/ipc/cleaner-history-handler.ts new file mode 100644 index 0000000..e04142c --- /dev/null +++ b/src/main/ipc/cleaner-history-handler.ts @@ -0,0 +1,146 @@ +/** + * IPC Handler for Cleaner Operation History + * + * Handles IPC requests for cleaner operation history management: + * - Get batch list (filtered by user for non-admin users) + * - Get batch details (executions + orders) + * - Get material details for a specific order + * - Delete batches + */ + +import { ipcMain } from 'electron' +import { CleanerOperationHistoryDAO } from '../services/database/cleaner-operation-history-dao' +import { SessionManager } from '../services/user/session-manager' +import { withErrorHandling, type IpcResult } from './index' +import { IPC_CHANNELS } from '../../shared/ipc-channels' +import { createLogger } from '../services/logger' +import type { + CleanerBatchStats, + CleanerExecutionRecord, + CleanerOrderRecord, + CleanerMaterialRecord, + GetCleanerBatchesOptions +} from '../types/cleaner-history.types' + +const log = createLogger('CleanerHistoryHandler') + +/** + * Register IPC handlers for cleaner operation history + */ +export function registerCleanerHistoryHandlers(): void { + const dao = new CleanerOperationHistoryDAO() + + /** + * Get batches list + * Admin users get all batches, regular users get only their own + */ + ipcMain.handle( + IPC_CHANNELS.CLEANER_HISTORY_GET_BATCHES, + async (_event, options?: GetCleanerBatchesOptions): Promise> => { + return withErrorHandling(async () => { + const currentUser = SessionManager.getInstance().getUserInfo() + + if (!currentUser) { + throw new Error('用户未登录') + } + + // Admin gets all batches, User gets only their own + const userId = currentUser.userType === 'Admin' ? undefined : currentUser.id + + log.info('Getting cleaner history batches', { + userId: currentUser.id, + userType: currentUser.userType, + filtered: userId !== undefined + }) + + return await dao.getBatches(userId, options) + }, 'cleanerHistory:getBatches') + } + ) + + /** + * Get batch details (executions + orders) + * Users can only view their own batch details, admins can view all + */ + ipcMain.handle( + IPC_CHANNELS.CLEANER_HISTORY_GET_BATCH_DETAILS, + async (_event, batchId: string): Promise> => { + return withErrorHandling(async () => { + const currentUser = SessionManager.getInstance().getUserInfo() + + if (!currentUser) { + throw new Error('用户未登录') + } + + log.info('Getting cleaner batch details', { batchId, userId: currentUser.id }) + + const details = await dao.getBatchDetails(batchId) + + // For non-admin users, verify they own this batch + if (currentUser.userType !== 'Admin' && details.executions.length > 0) { + const batchOwnerId = details.executions[0].userId + if (batchOwnerId !== currentUser.id) { + throw new Error('没有权限查看此批次详情') + } + } + + return details + }, 'cleanerHistory:getBatchDetails') + } + ) + + /** + * Get material details for a specific order + */ + ipcMain.handle( + IPC_CHANNELS.CLEANER_HISTORY_GET_MATERIAL_DETAILS, + async (_event, batchId: string, attemptNumber: number, orderNumber: string): Promise> => { + return withErrorHandling(async () => { + const currentUser = SessionManager.getInstance().getUserInfo() + + if (!currentUser) { + throw new Error('用户未登录') + } + + log.info('Getting cleaner material details', { batchId, attemptNumber, orderNumber }) + + return await dao.getMaterialDetails(batchId, attemptNumber, orderNumber) + }, 'cleanerHistory:getMaterialDetails') + } + ) + + /** + * Delete a batch + * Users can only delete their own batches, admins can delete any + */ + ipcMain.handle( + IPC_CHANNELS.CLEANER_HISTORY_DELETE_BATCH, + async (_event, batchId: string): Promise> => { + return withErrorHandling(async () => { + const currentUser = SessionManager.getInstance().getUserInfo() + + if (!currentUser) { + throw new Error('用户未登录') + } + + const isAdmin = currentUser.userType === 'Admin' + + log.info('Deleting cleaner batch', { + batchId, + userId: currentUser.id, + isAdmin + }) + + const result = await dao.deleteBatch(batchId, currentUser.id, isAdmin) + + if (!result.success) { + throw new Error(result.error || '删除批次失败') + } + + return { deleted: true } + }, 'cleanerHistory:deleteBatch') + } + ) + + log.info('Cleaner history IPC handlers registered') +} diff --git a/src/main/ipc/index.ts b/src/main/ipc/index.ts index fd2e5f6..53f1614 100644 --- a/src/main/ipc/index.ts +++ b/src/main/ipc/index.ts @@ -18,6 +18,7 @@ import { registerReportHandlers } from './report-handler' import { registerUpdateHandlers } from './update-handler' import { registerPlaywrightBrowserHandlers } from './playwright-browser' import { registerOperationHistoryHandlers } from './operation-history-handler' +import { registerCleanerHistoryHandlers } from './cleaner-history-handler' import { createLogger, logError } from '../services/logger' import { serializeError, sanitizeError } from '../services/logger/error-utils' import { getErrorMessage, getErrorCode, isBaseError } from '../types/errors' @@ -115,5 +116,6 @@ export function registerIpcHandlers(): void { registerUpdateHandlers() registerPlaywrightBrowserHandlers() registerOperationHistoryHandlers() + registerCleanerHistoryHandlers() log.info('All IPC handlers registered') }