feat(track): 出库回调补发单据上下文,让 Track 能展示「对应哪张单」
MOM 出库 webhook 此前只发 7 个字段(event/source_table/serial_number/quantity/ outbound_type/company_name/operator),单据信息在 MOM 侧全都有、但从来没被塞进 payload —— Track 侧扫码只能看到「已出库」,不知道是为谁、凭什么出的库。 补 6 个键:outbound_no / request_no / consumer_name / applicant_name / outbound_time / remark。这些字段整批共用,直接读 common_data 与 approval (两者在 notify_track 处都在作用域内),track_notifications 元组不必改结构。 同时补 common_data['request_id'] = approval.id —— 这是**表里真实存在的列** (见上一个提交的迁移),让出库流水能反查回来源申请单。 ⚠️ request_no / applicant_name 刻意**不**写进 common_data:它会被 ** 展开进 TransOutbound(**common_data),多一个不在表里的键直接 TypeError。只有真实 列才进 common_data,纯展示字段只在 payload 字典里现算。 ⚠️ 两者都必须在 approval 取出并校验**之后**赋值 —— common_data 在该行之前就已 构造,提前引用会 UnboundLocalError(上线时踩过,源码有注释记着)。 ⚠️ outbound_time 必须 .isoformat():current_time 是 naive datetime,直接进 JSON 会序列化失败。 ⚠️ applicant_name 复用 OutboundApproval._get_user_name()(to_dict 已在用), 在 MOM 侧解析成人名再发出去,避免 Track 拿着 applicant_id 跨库反查 sys_user —— Track 的 mom_cache 是按 username 索引的,对整型 ID 无能为力。 notify_track() 本身不动 —— 它不做字段白名单,payload 原样 httpx.post(json=...)。
This commit is contained in:
@ -285,6 +285,13 @@ class OutboundService:
|
|||||||
# 在那里引用 approval 会直接 UnboundLocalError(上线时踩过)。
|
# 在那里引用 approval 会直接 UnboundLocalError(上线时踩过)。
|
||||||
common_data['applicant_id'] = approval.applicant_id
|
common_data['applicant_id'] = approval.applicant_id
|
||||||
|
|
||||||
|
# ★ 来源申请单也一并记下(同样必须在 approval 取出**之后**)。只落
|
||||||
|
# applicant_id 的话,从一条出库明细反查不到它属于哪张单 —— 单号
|
||||||
|
# request_no、申请说明、明细快照 items_json 全都在申请单上。
|
||||||
|
# ⚠ 这是**表里真实存在的列**,可以进 common_data;下面 notify_track
|
||||||
|
# 里那些只发给 Track 的展示字段(request_no / applicant_name)不行。
|
||||||
|
common_data['request_id'] = approval.id
|
||||||
|
|
||||||
model_map = {
|
model_map = {
|
||||||
'stock_buy': StockBuy,
|
'stock_buy': StockBuy,
|
||||||
'stock_semi': StockSemi,
|
'stock_semi': StockSemi,
|
||||||
@ -442,6 +449,19 @@ class OutboundService:
|
|||||||
'outbound_type': common_data['outbound_type'],
|
'outbound_type': common_data['outbound_type'],
|
||||||
'company_name': company,
|
'company_name': company,
|
||||||
'operator': get_current_operator(),
|
'operator': get_current_operator(),
|
||||||
|
# ↓ 单据上下文:Track 侧据此在产品详情展示「这台设备对应
|
||||||
|
# MOM 的哪张出库单」。这几个字段整批共用,直接读
|
||||||
|
# common_data / approval(两者在 notify_track 处都在作用域内)。
|
||||||
|
# ⚠ 只发给 Track 的展示字段,**不要**写进 common_data ——
|
||||||
|
# 它会被 ** 展开进 TransOutbound(**common_data),
|
||||||
|
# 多一个不在表里的键会直接抛 TypeError。
|
||||||
|
'outbound_no': common_data['outbound_no'],
|
||||||
|
'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(),
|
||||||
|
'remark': common_data['remark'],
|
||||||
})
|
})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
import logging
|
import logging
|
||||||
|
|||||||
Reference in New Issue
Block a user