diff --git a/backend/src/config/cloudDatabase.js b/backend/src/config/cloudDatabase.js index d46496f..34d4470 100644 --- a/backend/src/config/cloudDatabase.js +++ b/backend/src/config/cloudDatabase.js @@ -764,7 +764,20 @@ async function connectWithCandidate(candidate) { } async function queryWithCandidateConnection(candidate, sqlText, params = {}, options = {}) { - const nextPool = new sql.ConnectionPool(candidate.mssqlConfig); + // request.timeout(请求级)在 mssql 12.x 上实测不生效(始终按池配置的默认值掐断), + // 慢查询必须通过「池配置级 requestTimeout」放宽,这里允许调用方覆盖候选连接的池级超时。 + let mssqlConfig = candidate.mssqlConfig; + const poolRequestTimeout = parsePositiveInt(options.connectRequestTimeoutMs, 0); + if (poolRequestTimeout > 0) { + mssqlConfig = { + ...candidate.mssqlConfig, + options: { + ...candidate.mssqlConfig.options, + requestTimeout: poolRequestTimeout, + }, + }; + } + const nextPool = new sql.ConnectionPool(mssqlConfig); try { await nextPool.connect(); @@ -1093,6 +1106,28 @@ const queryWithFreshConnection = async (sqlText, params = {}, options = {}) => { return []; }; +/** + * 慢查询专用入口:走独立临时连接,池级 requestTimeout 放宽到 SLOW_QUERY_POOL_TIMEOUT_MS。 + * 背景:mssql 12.x 的 request.timeout(请求级)不生效,超过池默认 60s 的查询必须用 + * 池配置级 requestTimeout 才能放宽。适用场景:动销分析这类多表大窗口聚合。 + */ +const SLOW_QUERY_POOL_TIMEOUT_MS = parsePositiveInt( + process.env.CLOUD_DB_SLOW_QUERY_TIMEOUT_MS, + 300000 +); + +const querySlow = async (sqlText, params = {}, options = {}) => { + const poolRequestTimeout = parsePositiveInt( + options.connectRequestTimeoutMs, + SLOW_QUERY_POOL_TIMEOUT_MS + ); + return queryWithFreshConnection(sqlText, params, { + ...options, + connectRequestTimeoutMs: poolRequestTimeout, + requestTimeout: poolRequestTimeout, + }); +}; + /** * 测试连接 */ @@ -1143,6 +1178,7 @@ const reload = async () => { module.exports = { getPool, query, + querySlow, queryWithFreshConnection, createPinnedQueryClient, test, diff --git a/backend/src/services/pickingBinSalesAnalysis.js b/backend/src/services/pickingBinSalesAnalysis.js index 013cb8d..6d294ab 100644 --- a/backend/src/services/pickingBinSalesAnalysis.js +++ b/backend/src/services/pickingBinSalesAnalysis.js @@ -198,7 +198,10 @@ async function fetchPickingBinSkuRows(cloudDb, wmsCoIds, options = {}) { HAVING ABS(SUM(CAST(b.binSkuQty AS DECIMAL(18, 2)))) > 0.0001 ORDER BY b.wmsCoId, b.binType, b.binName, b.skuId`; - const rows = await cloudDb.query( + // 该查询 union 了 4 个销量来源(含 qmcust 全渠道扫描),全仓窗口可能超过默认 60s; + // mssql 12.x 请求级 timeout 不生效,必须走池级放宽的慢查询入口。 + const runQuery = typeof cloudDb.querySlow === 'function' ? cloudDb.querySlow : cloudDb.query; + const rows = await runQuery( sqlText, { ...binIn.params,