fix: support both MySQL and SQL Server in cleaner handler
This commit is contained in:
@@ -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> => {
|
||||||
|
|||||||
Reference in New Issue
Block a user