1. MES工单下发失败:状态机与接口返回码联合定位

问题定位思路:状态机、返回码、数据库字段三方对齐

食品MES中工单下发失败,最常见的误判是“接口报错就查接口”。实际上工单下发是状态机流转 + 接口调用 + 数据库落库三者协同的结果:业务规则拦截时接口往往返回业务错误码,而接口异常时数据库状态字段可能停留在中间态。定位的关键是把三者的值放在同一时间点上比对。

先明确本案例的参照约定:工单状态字段 work_order.status 取值 CREATED(10) → RELEASED(20) → DISPATCHED(30),下发动作要求当前状态必须为 RELEASED(20);接口返回码 code=0 表示成功,code=4xxx 为业务规则拦截,code=5xxx 为接口/系统异常。

① 工单状态机流转 CREATED status = 10 RELEASED status = 20 DISPATCHED status = 30 下达 下发 ② 下发接口调用与返回码 MES 下发服务 dispatch(woId) 车间执行接口 /wo/dispatch 返回码判读 0 成功 / 4xxx 业务拦截 / 5xxx 接口异常 ③ 数据库状态字段一致性 work_order.status 期望 20,实际 ? work_order.dispatch_time 是否已写入 dispatch_log 记录 返回码与时间戳

联合定位的判断矩阵

把三处观测值对齐后,失败原因基本可以收敛到两类。下表是可直接套用的判断依据,其中“状态字段”指 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,不满足时直接返回业务错误码并记录日志,避免把状态问题伪装成接口异常。

修复与验证步骤

  1. 根据判断矩阵确定根因类别,业务拦截类修正配方审核或物料齐套状态,接口异常类检查车间接口服务连通性与报文。
  2. 修正后重新触发下发,观察 dispatch_log 新增记录的 resp_code 是否为 0。
  3. 确认 work_order.status 已由 20 变为 30,且 dispatch_time 已写入。
  4. 在车间执行端确认工单已可见,完成闭环验证。

验证通过的条件是:返回码为 0、状态字段为 30、下发时间非空、车间端可见,四项同时满足才算真正修复,缺一项都说明问题只是被暂时绕过。