4. 数据模型设计:TMS轨迹表与ERP签收表结构及关联键
一致性校验测试的核心基础是数据模型。TMS(运输管理系统)的轨迹节点与ERP(企业资源计划系统)的签收记录,在表结构设计上存在天然差异。本章将详细定义两张核心表的结构、字段含义,并设计用于关联校验的键(运单号、订单号),为后续的校验规则与测试脚本奠定数据基础。
4.1 TMS轨迹表结构设计
TMS轨迹表用于记录运输过程中每个节点的状态变更,包括时间、地点、操作人及异常信息。每一条记录代表一个轨迹节点。
| 字段名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
track_id |
BIGINT | 主键 | 轨迹记录唯一标识,自增 |
waybill_no |
VARCHAR(64) | 关联键 | 运单号,TMS内部唯一 |
order_no |
VARCHAR(64) | 关联键 | 订单号,与ERP系统共享 |
node_code |
VARCHAR(32) | — | 节点编码,如 PICKUP、ARRIVE_HUB、DELIVERED |
node_name |
VARCHAR(128) | — | 节点中文名称,如“已揽收”、“到达分拨中心”、“已签收” |
operate_time |
DATETIME | — | 节点操作时间,精确到秒 |
location |
VARCHAR(256) | — | 操作地点描述,如“上海市浦东新区XX路XX号” |
operator |
VARCHAR(64) | — | 操作人姓名或工号 |
remark |
TEXT | — | 备注信息,用于记录异常原因或特殊说明 |
create_time |
DATETIME | — | 记录创建时间 |
设计要点: TMS轨迹表采用“事件驱动”模型,每个节点独立成行。运单号
waybill_no 在TMS内部唯一,而订单号 order_no 用于跨系统关联。节点编码 node_code 应使用枚举值,避免自由文本带来的校验歧义。
4.2 ERP签收表结构设计
ERP签收表记录最终签收环节的确认信息,通常只包含一次签收动作,但可能包含多次拒收或部分签收的明细。
| 字段名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
sign_id |
BIGINT | 主键 | 签收记录唯一标识 |
order_no |
VARCHAR(64) | 关联键 | 订单号,与TMS系统共享 |
waybill_no |
VARCHAR(64) | 关联键 | 运单号,用于与TMS轨迹匹配 |
sign_status |
TINYINT | — | 签收状态:1-正常签收,2-拒收,3-部分签收 |
sign_time |
DATETIME | — | 签收时间,精确到秒 |
sign_person |
VARCHAR(64) | — | 签收人姓名 |
sign_company |
VARCHAR(128) | — | 签收单位名称 |
reject_reason |
VARCHAR(512) | — | 拒收原因,仅当 sign_status=2 时有效 |
update_time |
DATETIME | — | 最后更新时间 |
注意: ERP签收表通常不记录运输过程中的中间节点,只保留最终签收结果。因此,校验测试需要将TMS的“已签收”节点与ERP的签收记录进行比对,而非逐节点匹配。
4.3 关联键设计:运单号与订单号
关联键是跨系统数据一致性的桥梁。本课程采用双关联键策略:运单号(waybill_no) 和 订单号(order_no)。
- 运单号(waybill_no):在TMS内唯一标识一次运输任务。ERP侧可能通过接口回传或手动录入获得该号。
- 订单号(order_no):在ERP内唯一标识一笔销售订单。TMS在接收运输任务时,必须携带该订单号。
关联规则如下:
- 正向匹配:使用
waybill_no作为主关联键,order_no作为辅助校验键。当运单号一致时,再验证订单号是否匹配。 - 反向追溯:当运单号匹配失败时,使用
order_no进行二次关联,查找是否存在订单号一致但运单号不一致的记录。 - 异常处理:若两个关联键均无法匹配,则标记为“孤立记录”,需人工介入核查。
校验测试核心逻辑: 对于同一笔订单,TMS轨迹表中必须存在一个节点编码为
DELIVERED 或 SIGNED 的记录,且该记录的 operate_time 与ERP签收表中的 sign_time 时间差应在允许阈值内(通常为 ±5 分钟)。
4.4 关联键校验逻辑与示例
在实际测试中,关联键的匹配并非总是完美。以下列出三种典型场景及对应的SQL校验逻辑。
4.4.1 场景一:完全匹配
TMS轨迹表中存在 waybill_no 和 order_no 均与ERP签收表一致的记录,且节点编码为“已签收”。
-- 查找完全匹配的记录
SELECT t.waybill_no, t.order_no, t.operate_time AS tms_time, e.sign_time AS erp_time
FROM tms_track t
INNER JOIN erp_sign e ON t.waybill_no = e.waybill_no AND t.order_no = e.order_no
WHERE t.node_code = 'DELIVERED'
AND ABS(TIMESTAMPDIFF(SECOND, t.operate_time, e.sign_time)) <= 300;
4.4.2 场景二:运单号匹配但订单号不匹配
可能由于系统间数据同步延迟或人工录入错误导致。此时需要标记为“订单号不一致”异常。
-- 查找运单号一致但订单号不一致的记录
SELECT t.waybill_no, t.order_no AS tms_order, e.order_no AS erp_order
FROM tms_track t
INNER JOIN erp_sign e ON t.waybill_no = e.waybill_no
WHERE t.order_no != e.order_no;
4.4.3 场景三:孤立记录
某张运单在TMS中存在轨迹,但在ERP中完全找不到对应的签收记录。
-- 查找TMS中存在但ERP中不存在的运单
SELECT t.waybill_no, t.order_no, MAX(t.operate_time) AS last_time
FROM tms_track t
LEFT JOIN erp_sign e ON t.waybill_no = e.waybill_no
WHERE e.sign_id IS NULL
GROUP BY t.waybill_no, t.order_no;
4.5 数据模型设计总结
本章定义的数据模型是后续所有校验测试的基石。核心要点如下:
- TMS轨迹表:事件驱动,多行记录,包含完整运输链路。
- ERP签收表:结果驱动,单行记录,聚焦最终签收状态。
- 关联键:采用
waybill_no+order_no双键策略,提高匹配容错率。 - 时间阈值:TMS签收节点时间与ERP签收时间允许 ±5 分钟偏差,超出则视为异常。
测试建议: 在准备测试数据时,应覆盖完全匹配、部分匹配、不匹配以及孤立记录四种情况。建议使用数据生成工具构造至少 100 条包含各种边界条件的测试记录,以充分验证校验逻辑的健壮性。