先说结论
这不是“多重试几次”的需求。只改设备重试,会在“服务端已经写入、设备没收到响应”时造成重复入账。完整方案必须同时包含:设备端先落库、稳定事件号、可靠补传、服务端幂等、原子事务和端到端观测。
把“偶尔上传不到”从不可复现的现场问题,转化为可恢复、可幂等、可追踪、可验收的端到端能力。
每条有效取餐必须成功,或留下明确可处理的失败状态。
建议目标,取得现网基线后再最终确认。
相同事件重复请求,只能返回“已处理”,不能再次累计金额。
WeightDouble116 双秤,设备类型为 4。/p/api/zhctPushMeal。/p/api/zhctPushMeal 兼容新增 event_id、scale_code、app_version。device_code + event_id 唯一约束。duplicate=true,不再次入账。| 状态 | 含义 | 系统动作 |
|---|---|---|
| PENDING | 已落库、待上传 | 进入唯一调度队列 |
| UPLOADING | 正在请求服务端 | 进程重启后恢复为待处理 |
| RETRY_WAIT | 网络、超时或 5xx | 保留数据,按退避时间再次上传 |
| SUCCESS | 首次成功或服务端确认重复 | 停止上传,按保留策略归档 |
| TERMINAL_FAILED | 参数或永久业务失败 | 停止自动重试,展示原因并告警 |
| 断网 | 断网连续取餐 10 次,重启设备后恢复网络,10 条均在 10 分钟内补传。 |
| 响应丢失 | 服务端入账后故意丢弃响应,设备重试但服务端只保留一条明细和一次金额累计。 |
| 双秤并发 | 左右秤 1 秒内同时结束取餐,生成两个不同事件号,均正确入账。 |
| 进程退出 | 落库后、发请求前杀掉 App,重启后仍能自动继续。 |
| 永久失败 | 餐盘未绑定等明确错误不无限重试,设备和后台均可查失败原因。 |
| 高峰压测 | 500 条事件、5% 模拟超时,无丢失、无重复入账,队列最终清零。 |
设备端持久化与补传、服务端幂等事务、基础状态查询和告警、真机弱网验收。
PC 上传记录页、永久失败人工处理、设备版本覆盖率和积压趋势。
不重做称重算法;不扩展完整离线支付;不直接用重量事件接口替代业务入账。
1–2 台设备先灰度,覆盖至少 3 个用餐高峰和一次人为断网恢复,无丢单、无重复、无积压后扩面。