refactor: split validation handler responsibilities

This commit is contained in:
Misaka
2026-03-21 08:54:35 +08:00
parent 68e6c9483f
commit b979b73ba1
7 changed files with 678 additions and 724 deletions

View File

@@ -0,0 +1,95 @@
import fs from 'fs'
import { ConfigManager } from '../config/config-manager'
import { SqlServerService } from '../database/sql-server'
import type { ValidationDatabaseService } from './validation-database'
import { getValidationTableName } from './validation-database'
export function readProductionIds(filePath: string): string[] {
const content = fs.readFileSync(filePath, 'utf-8')
return content
.split('\n')
.map((line) => line.trim())
.filter((line) => line.length > 0)
}
export function identifyInputType(input: string): 'production_id' | 'order_number' | 'unknown' {
if (/^SC\d{14}$/.test(input)) {
return 'order_number'
}
if (/^\d{2}[A-Za-z]\d{1,6}$/.test(input)) {
return 'production_id'
}
return 'unknown'
}
export async function getSourceNumbersFromInputs(
inputs: string[],
dbService: ValidationDatabaseService
): Promise<string[]> {
const productionIds: string[] = []
const orderNumbers: string[] = []
const configManager = ConfigManager.getInstance()
const isSqlServer = configManager.getDatabaseType() === 'sqlserver'
for (const item of inputs) {
const type = identifyInputType(item)
if (type === 'order_number') {
orderNumbers.push(item)
} else if (type === 'production_id') {
productionIds.push(item)
}
}
if (productionIds.length > 0) {
const contractTableName = getValidationTableName('productionContractData_26年压力表合同数据')
const batchSize = 2000
if (isSqlServer) {
const sql = await import('mssql')
const allOrderNumbers: string[] = []
for (let i = 0; i < productionIds.length; i += batchSize) {
const batch = productionIds.slice(i, i + batchSize)
const placeholders = batch.map((_, idx) => `@p${idx}`).join(',')
const params: Record<string, { value: string; type: typeof sql.default.NVarChar }> = {}
batch.forEach((id, idx) => {
params[`p${idx}`] = { value: id, type: sql.default.NVarChar }
})
const contractSql = `
SELECT DISTINCT 生产订单号
FROM ${contractTableName}
WHERE 总排号 IN (${placeholders})
`
const contractResult = await (dbService as SqlServerService).queryWithParams(
contractSql,
params
)
allOrderNumbers.push(
...contractResult.rows.map((row: Record<string, unknown>) => row. as string)
)
}
orderNumbers.push(...allOrderNumbers)
} else {
const allOrderNumbers: string[] = []
for (let i = 0; i < productionIds.length; i += batchSize) {
const batch = productionIds.slice(i, i + batchSize)
const placeholders = batch.map(() => '?').join(',')
const contractSql = `
SELECT DISTINCT 生产订单号
FROM ${contractTableName}
WHERE 总排号 IN (${placeholders})
`
const contractResult = await dbService.query(contractSql, batch)
allOrderNumbers.push(...contractResult.rows.map((row) => row. as string))
}
orderNumbers.push(...allOrderNumbers)
}
}
return [...new Set(orderNumbers)]
}