1. MES工单下发失败:状态机与接口返回码联合定位
问题定位思路:状态机、返回码、数据库字段三方对齐
食品MES中工单下发失败,最常见的误判是“接口报错就查接口”。实际上工单下发是状态机流转 + 接口调用 + 数据库落库三者协同的结果:业务规则拦截时接口往往返回业务错误码,而接口异常时数据库状态字段可能停留在中间态。定位的关键是把三者的值放在同一时间点上比对。
先明确本案例的参照约定:工单状态字段 work_order.status 取值 CREATED(10) → RELEASED(20) → DISPATCHED(30),下发动作要求当前状态必须为 RELEASED(20);接口返回码 code=0 表示成功,code=4xxx 为业务规则拦截,code=5xxx 为接口/系统异常。
联合定位的判断矩阵
把三处观测值对齐后,失败原因基本可以收敛到两类。下表是可直接套用的判断依据,其中“状态字段”指 work_order.status,“返回码”指下发接口响应中的 code。
| 状态字段 | 返回码 | dispatch_log | 判定 | 处理方向 |
|---|---|---|---|---|
| 20(RELEASED) | 4xxx | 有记录 | 业务规则拦截 | 查拦截规则:配方未审核、物料未齐套、产线未排产 |
| 20(RELEASED) | 5xxx | 有记录 | 接口/系统异常 | 查车间接口服务、网络、报文格式 |
| 10(CREATED) | 4xxx | 有记录 | 状态机前置条件不满足 | 工单未下达,先执行下达动作 |
| 30(DISPATCHED) | 0 | 有记录 | 重复下发 | 幂等校验,避免重复推送 |
| 20(RELEASED) | 无返回 | 无记录 | 调用未到达接口 | 查网关、超时、线程池阻塞 |
实操:用 SQL 与日志完成三方比对
以下查询用于一次性取出工单状态、下发时间与最近一次下发日志,便于与接口返回码对照。示例中的工单号为教学假设值。
-- 1. 查工单当前状态与下发时间
SELECT wo_no, status, dispatch_time, update_time
FROM work_order
WHERE wo_no = 'WO20240512001';
-- 2. 查最近一次下发日志(含返回码)
SELECT wo_no, req_time, resp_code, resp_msg
FROM dispatch_log
WHERE wo_no = 'WO20240512001'
ORDER BY req_time DESC
LIMIT 1;
若第 1 条查询返回 status=20、dispatch_time 为空,而第 2 条查询返回 resp_code=4001、resp_msg='配方未审核',则判定为业务规则拦截,而非接口故障。此时应检查该工单绑定的配方版本审核状态,而不是重启接口服务。
状态机流转条件建议在代码层显式校验:下发前断言
status == 20,不满足时直接返回业务错误码并记录日志,避免把状态问题伪装成接口异常。修复与验证步骤
- 根据判断矩阵确定根因类别,业务拦截类修正配方审核或物料齐套状态,接口异常类检查车间接口服务连通性与报文。
- 修正后重新触发下发,观察
dispatch_log新增记录的resp_code是否为 0。 - 确认
work_order.status已由 20 变为 30,且dispatch_time已写入。 - 在车间执行端确认工单已可见,完成闭环验证。
验证通过的条件是:返回码为 0、状态字段为 30、下发时间非空、车间端可见,四项同时满足才算真正修复,缺一项都说明问题只是被暂时绕过。