fix: support both MySQL and SQL Server in cleaner handler

This commit is contained in:
Misaka_Company
2026-03-04 14:56:19 +08:00
parent 8dbdf6f394
commit 9833552652

View File

@@ -3,6 +3,7 @@ import { ErpAuthService } from '../services/erp/erp-auth'
import { CleanerService } from '../services/erp/cleaner' import { CleanerService } from '../services/erp/cleaner'
import { OrderNumberResolver } from '../services/erp/order-resolver' import { OrderNumberResolver } from '../services/erp/order-resolver'
import { MySqlService } from '../services/database/mysql' import { MySqlService } from '../services/database/mysql'
import { SqlServerService } from '../services/database/sql-server'
import { ResultExporter } from '../services/excel/result-exporter' import { ResultExporter } from '../services/excel/result-exporter'
import { createLogger } from '../services/logger' import { createLogger } from '../services/logger'
import { withErrorHandling, type IpcResult } from './index' import { withErrorHandling, type IpcResult } from './index'
@@ -16,19 +17,45 @@ import type {
const log = createLogger('CleanerHandler') const log = createLogger('CleanerHandler')
/** async function getDatabaseService(): Promise<MySqlService | SqlServerService> {
* Register IPC handlers for cleaner service const dbType = process.env.DB_TYPE?.toLowerCase()
*/
if (dbType === 'sqlserver' || dbType === 'mssql') {
const sqlServerService = new SqlServerService({
server: process.env.DB_SERVER || 'localhost',
port: parseInt(process.env.DB_SQLSERVER_PORT || '1433', 10),
user: process.env.DB_USERNAME || 'sa',
password: process.env.DB_PASSWORD || '',
database: process.env.DB_NAME || '',
options: {
encrypt: process.env.DB_TRUST_SERVER_CERTIFICATE === 'yes',
trustServerCertificate: process.env.DB_TRUST_SERVER_CERTIFICATE === 'yes'
}
})
await sqlServerService.connect()
return sqlServerService
} else {
const mysqlService = new MySqlService({
host: process.env.DB_MYSQL_HOST || 'localhost',
port: parseInt(process.env.DB_MYSQL_PORT || '3306', 10),
user: process.env.DB_USERNAME || 'root',
password: process.env.DB_PASSWORD || '',
database: process.env.DB_NAME || ''
})
await mysqlService.connect()
return mysqlService
}
}
export function registerCleanerHandlers(): void { export function registerCleanerHandlers(): void {
ipcMain.handle( ipcMain.handle(
'cleaner:run', 'cleaner:run',
async (_event, input: CleanerInput): Promise<IpcResult<CleanerResult>> => { async (_event, input: CleanerInput): Promise<IpcResult<CleanerResult>> => {
return withErrorHandling(async () => { return withErrorHandling(async () => {
let authService: ErpAuthService | null = null let authService: ErpAuthService | null = null
let mysqlService: MySqlService | null = null let dbService: MySqlService | SqlServerService | null = null
try { try {
// Check environment variables
const erpUrl = process.env.ERP_URL || '' const erpUrl = process.env.ERP_URL || ''
const erpUsername = process.env.ERP_USERNAME || '' const erpUsername = process.env.ERP_USERNAME || ''
const erpPassword = process.env.ERP_PASSWORD || '' const erpPassword = process.env.ERP_PASSWORD || ''
@@ -45,32 +72,24 @@ export function registerCleanerHandlers(): void {
) )
} }
// Resolve order numbers (convert productionIDs to 生产订单号) const dbType = process.env.DB_TYPE?.toLowerCase()
const mysqlConfig = { log.info(
host: process.env.DB_MYSQL_HOST || 'localhost', `Connecting to ${dbType === 'sqlserver' || dbType === 'mssql' ? 'SQL Server' : 'MySQL'} for order resolution...`
port: parseInt(process.env.DB_MYSQL_PORT || '3306', 10), )
user: process.env.DB_USERNAME || 'root',
password: process.env.DB_PASSWORD || '',
database: process.env.DB_NAME || ''
}
log.info('Connecting to MySQL for order resolution...')
mysqlService = new MySqlService(mysqlConfig)
try { try {
await mysqlService.connect() dbService = await getDatabaseService()
} catch (error) { } catch (error) {
throw new DatabaseQueryError( throw new DatabaseQueryError(
'MySQL 连接失败', '数据库连接失败',
'DB_CONNECTION_FAILED', 'DB_CONNECTION_FAILED',
error instanceof Error ? error : undefined error instanceof Error ? error : undefined
) )
} }
const resolver = new OrderNumberResolver(mysqlService) const resolver = new OrderNumberResolver(dbService)
const mappings = await resolver.resolve(input.orderNumbers) const mappings = await resolver.resolve(input.orderNumbers)
// Get valid order numbers and warnings
const validOrderNumbers = resolver.getValidOrderNumbers(mappings) const validOrderNumbers = resolver.getValidOrderNumbers(mappings)
const warnings = resolver.getWarnings(mappings) const warnings = resolver.getWarnings(mappings)
@@ -87,7 +106,6 @@ export function registerCleanerHandlers(): void {
log.info('Resolved order numbers', { count: validOrderNumbers.length }) log.info('Resolved order numbers', { count: validOrderNumbers.length })
// Create auth service and login
authService = new ErpAuthService({ authService = new ErpAuthService({
url: erpUrl, url: erpUrl,
username: erpUsername, username: erpUsername,
@@ -107,7 +125,6 @@ export function registerCleanerHandlers(): void {
} }
log.info('Login successful') log.info('Login successful')
// Create cleaner service and run cleaning with resolved order numbers
const cleaner = new CleanerService(authService) const cleaner = new CleanerService(authService)
const modifiedInput: CleanerInput = { const modifiedInput: CleanerInput = {
@@ -119,7 +136,6 @@ export function registerCleanerHandlers(): void {
log.info('Starting cleaning', { orderCount: validOrderNumbers.length }) log.info('Starting cleaning', { orderCount: validOrderNumbers.length })
const result = await cleaner.clean(modifiedInput) const result = await cleaner.clean(modifiedInput)
// Add warnings to result errors if any
if (warnings.length > 0) { if (warnings.length > 0) {
result.errors = [...warnings, ...result.errors] result.errors = [...warnings, ...result.errors]
} }
@@ -131,7 +147,6 @@ export function registerCleanerHandlers(): void {
return result return result
} finally { } finally {
// Clean up: close browser
if (authService) { if (authService) {
try { try {
await authService.close() await authService.close()
@@ -143,13 +158,12 @@ export function registerCleanerHandlers(): void {
} }
} }
// Clean up: disconnect MySQL if (dbService) {
if (mysqlService) {
try { try {
await mysqlService.disconnect() await dbService.disconnect()
log.debug('MySQL disconnected') log.debug('Database disconnected')
} catch (closeError) { } catch (closeError) {
log.warn('Error disconnecting MySQL', { log.warn('Error disconnecting database', {
error: closeError instanceof Error ? closeError.message : String(closeError) error: closeError instanceof Error ? closeError.message : String(closeError)
}) })
} }
@@ -159,9 +173,6 @@ export function registerCleanerHandlers(): void {
} }
) )
/**
* Export validation results to Excel
*/
ipcMain.handle( ipcMain.handle(
'cleaner:exportResults', 'cleaner:exportResults',
async (_event, items: ExportResultItem[]): Promise<ExportResultResponse> => { async (_event, items: ExportResultItem[]): Promise<ExportResultResponse> => {