From 822f8976a90de6e8e670df2fe5d7bc106a46c7f2 Mon Sep 17 00:00:00 2001 From: yueli Date: Wed, 23 Sep 2026 09:16:29 +0800 Subject: [PATCH] =?UTF-8?q?fix(track):=20=E5=87=BA=E5=BA=93=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E7=9A=84=E6=97=B6=E9=97=B4=E6=88=B3=E5=B8=A6=20+08:00?= =?UTF-8?q?=20=E5=81=8F=E7=A7=BB=EF=BC=8C=E4=BF=AE=208=20=E5=B0=8F?= =?UTF-8?q?=E6=97=B6=E6=97=B6=E5=B7=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit current_time = datetime.now(beijing_tz).replace(tzinfo=None) 是**去掉时区的北京 墙上时间**。MOM 自己的库里 outbound_time/outbound_time 都是 naive timestamp, 本地这么存没问题;但它一旦以无偏移形式("2026-09-23T15:00:00")发给 Track, Track 的 timestamptz 列会按 **UTC** 解释 —— 实测发 15:00 存成 15:00+00, 前端在北京渲染成 23:00,整整差 8 小时。 用 replace(tzinfo=beijing_tz) 把真实时刻装回去,发出去即 "2026-09-23T15:00:00+08:00" —— 语义明确,不依赖接收方去猜。 ⚠️ 只改发给 Track 的这一处,**不动 current_time 本身**:它还要写进 MOM 自己的 naive 列(TransOutbound.outbound_time、TransRepair.shipping_date),在上面挂 tzinfo 会改变那些写入的行为。 ⚠️ 原有代码把 inbound_time / outbound_time 只拼进 remark 字符串、从不落库,所以 这个歧义此前一直没有暴露 —— 本次开始落 timestamptz 列才浮出来。 实测(Track 侧 lica_production): 发 "2026-09-23T15:00:00+08:00" → 存 07:00+00 AT TIME ZONE 'Asia/Shanghai' 读回 = 2026-09-23 15:00:00 ✅ --- inventory-backend/app/services/outbound_service.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/inventory-backend/app/services/outbound_service.py b/inventory-backend/app/services/outbound_service.py index 35d81a5..9e971f1 100644 --- a/inventory-backend/app/services/outbound_service.py +++ b/inventory-backend/app/services/outbound_service.py @@ -459,8 +459,15 @@ class OutboundService: 'request_no': approval.request_no, 'consumer_name': common_data['consumer_name'], 'applicant_name': approval._get_user_name(approval.applicant_id), - # naive datetime 必须先转字符串,JSON 序列化不了 - 'outbound_time': current_time.isoformat(), + # ⚠️ 必须带 +08:00 偏移,不能直接发 current_time。 + # current_time 是 datetime.now(beijing_tz) 去掉 tzinfo 后的 + # **北京墙上时间**(MOM 自己的库是 naive 的 timestamp,所以 + # 本地这么存没问题)。但它一旦以无偏移的形式发出去, + # Track 的 timestamptz 列会按 **UTC** 解释,实测整整差 8 + # 小时(发 15:00 存成 15:00+00,前端在北京渲染成 23:00)。 + # 这里把 tzinfo 装回去还原真实时刻,发出去就是明确的 + # "2026-09-23T15:00:00+08:00"。 + 'outbound_time': current_time.replace(tzinfo=beijing_tz).isoformat(), 'remark': common_data['remark'], }) except Exception as e: