From 0a2fe1c3a3a3deb720e59b1d27abc3528e2d2b3a Mon Sep 17 00:00:00 2001 From: youruo <15018737611@163.com> Date: Wed, 14 Oct 2026 13:12:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BA=91=E5=BA=93=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=85=A2=E6=9F=A5=E8=AF=A2=E5=85=A5=E5=8F=A3=20querySlow?= =?UTF-8?q?=EF=BC=88=E6=B1=A0=E7=BA=A7=E8=B6=85=E6=97=B6=E6=94=BE=E5=AE=BD?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mssql 12.2.0 驱动 request.timeout(请求级)实测不生效,超过池默认 60s 的查询必被掐断。动销分析销量 union 4 来源后全仓窗口需 ~2 分钟, 触发 Timeout: Request failed to complete in 60000ms。 - queryWithCandidateConnection 支持 options.connectRequestTimeoutMs 覆盖候选连接的池级 requestTimeout(池级实测生效) - 新增 querySlow(sqlText, params, options):独立临时连接 + 池级超时 默认 300s(env CLOUD_DB_SLOW_QUERY_TIMEOUT_MS 可调) - 动销分析取数优先走 querySlow(mock 环境无该方法时回退 query) --- backend/src/config/cloudDatabase.js | 38 ++++++++++++++++++- .../src/services/pickingBinSalesAnalysis.js | 5 ++- 2 files changed, 41 insertions(+), 2 deletions(-) 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,