forked from lunanting/cangku
问题(2026-10-21 生产实测,PR #69 上线后发现): - 生产容器 `/etc/timezone = Etc/UTC`、`date` = UTC;而 MSSQL `GETDATE()` 返回北京时间, mssql 驱动 `useUTC:false` 把 DB 值构造成「墙钟当 UTC」的 Date ⇒ 比真实 now 快 8 小时。 - 于是**北京时间每天 00:00~08:00,服务端 `new Date()` 取到的「今天」是昨天**: round.date / deadline / windowEnd 整体错位。 实测 08:04 跑 13:00 轮得 `overdueUnshipped=3895`(历史未发池被整段纳入), 而本地(东八区)同一轮只有 6 单。 修法(只动这一个模块,不动容器时区): - registry 新增 `beijingNow()`:把真实时刻平移成「本地 getter 读出来正好是北京时间」的 Date, 本机已是东八区时平移量为 0,行为不变。 - `resolveActiveRound` / `describeRounds` 的 now 默认值改为 `beijingNow()`; service 的 `getShipTimeliness` 同样改用 `registry.beijingNow()`。 - ⚠️ 没改容器 TZ:`/opt/cangku/shared/backend.env` 里没有 TZ,改了会波及全部既有定时任务 (dailyRefresh / dailyInventorySnapshot 等都各自显式写了 Asia/Shanghai)。 测试: - 新增 2 个用例(跨日 00:00~08:00 不取成前一天;默认按北京时间判定 13:00 前 notStarted)。 - `node --test backend/test/warehouseShipTimeliness.test.js` → 19 / 19 pass。