fix(db): complete PostgreSQL integration in validation and cleaner services

OrderNumberResolver, validation, and cleaner services had incomplete
PostgreSQL support - they only handled SQL Server and MySQL, causing
PostgreSQL to fall through to MySQL code paths with invalid syntax
(backticks, ? placeholders) and missing schema.table name splitting.

Changes:
- Add PostgreSQL SQL generation ($N params, double-quoted identifiers)
  in OrderNumberResolver, validation-application-service,
  production-input-service, and validation-database
- Add PostgreSQL to database factory functions in validation-database
  and cleaner-application-service
- Add UPPER, LOWER, and 40+ common SQL functions to SQL_KEYWORDS to
  prevent prepareSql() from quoting them as identifiers

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Misaka
2026-04-05 13:46:37 +08:00
parent 7601b5f176
commit f51cae0f6f
6 changed files with 164 additions and 20 deletions

View File

@@ -29,7 +29,7 @@ export async function getSourceNumbersFromInputs(
const productionIds: string[] = []
const orderNumbers: string[] = []
const configManager = ConfigManager.getInstance()
const isSqlServer = configManager.getDatabaseType() === 'sqlserver'
const dbType = configManager.getDatabaseType()
for (const item of inputs) {
const type = identifyInputType(item)
@@ -44,7 +44,7 @@ export async function getSourceNumbersFromInputs(
const contractTableName = getValidationTableName('productionContractData_26年压力表合同数据')
const batchSize = 2000
if (isSqlServer) {
if (dbType === 'sqlserver') {
const sql = await import('mssql')
const allOrderNumbers: string[] = []
@@ -71,6 +71,22 @@ export async function getSourceNumbersFromInputs(
)
}
orderNumbers.push(...allOrderNumbers)
} else if (dbType === 'postgresql') {
const allOrderNumbers: string[] = []
for (let i = 0; i < productionIds.length; i += batchSize) {
const batch = productionIds.slice(i, i + batchSize)
const placeholders = batch.map((_, idx) => `$${idx + 1}`).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)
} else {
const allOrderNumbers: string[] = []