fix(track): 出库回调的时间戳带 +08:00 偏移,修 8 小时时差

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 ✅
This commit is contained in:
yueli
2026-09-23 09:16:29 +08:00
parent c272c01388
commit 822f8976a9

View File

@ -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: