口径更新:自 2026-08-25 起,A02/A03 的完整且最新技术口径以《A02 / A03 防逃单报警技术业务全量说明》为准。本文件保留 A02 专项过程与现场证据;补录记录的 pick_time 已统一为认领人员确认并触发上传的当前时刻。
A02 在无餐盘状态发生稳定减重时触发。常规认领只有在取餐记录上传成功且本地候选记录删除成功后才解除;管理卡解除不生成取餐记录。
未选择方式时,普通餐盘码、放盘和管理卡均不能解除 A02,也不能进入普通打餐流程。
触发时固定并记录:alarmId、baselineWeight、triggerCurrentWeight、triggerPickWeight 与 triggerAt。报警未解除前,只要仍是取餐前页、无餐盘码且秤体稳定,页面按 max(0, baselineWeight - currentWeight) 实时显示本单逃单重量。
稳定重量恢复到 baselineWeight 或更高时,写 WEIGHT_RECOVERED 并自动解除;不创建取餐记录、不上传。餐盘认领码出现后冻结最后一次有效逃单重量,防止餐盘自重计入补录。
| 状态 | 可响应输入 | 行为 |
|---|---|---|
NONE | 无 | 展示两种方式,忽略所有扫描/放盘 |
WAIT_MANAGER_CARD | 有效管理卡 | 管理卡解除 |
WAIT_TRAY_CLAIM | 六位非管理卡餐盘码 | 查人并补录 |
| 查人、落库或上传中 | 无 | 等待当前处理结果 |
LOCAL_SAVE_FAILED | 管理卡 | 仅管理卡异常兜底 |
选择方式后等待 60 秒。超时写 ACTION_TIMEOUT 并返回 NONE,但报警、声光、重量和时长不变。尚未接收有效输入时可点“返回重新选择”,写 ACTION_CANCEL;餐盘码已接收、查人/上传中或 LOCAL_SAVE_FAILED 时不能返回。
WAIT_MANAGER_CARD。888880~888899。MANAGER_CARD 解除;三次本地保存失败时为 LOCAL_SAVE_FAILED_ADMIN_OVERRIDE。此路径不产生或上传取餐记录。
POST /p/api/selectPlate plate_code=<餐盘码> dishes_uuids=["<当前菜品 UUID>"]
只有 code=0 且 data.staff.uuid 存在时查人成功。code=0 但 staff 为空时,当前页面显示“餐盘未绑定人员”;准确含义是“查人结果为空”,需以网络响应为准。
查人成功后创建 pick_record,使用认领人员确认并触发上传的当前时间、最后有效逃单重量、餐盘、人员与当前菜品;报警触发时间只用于审计日志。记录附加 source=ANTI_ESCAPE_A02 和 alarm_id。保存失败自动重试 2 次,共 3 次;全部失败进入 LOCAL_SAVE_FAILED,停止认领且仅管理卡可解除。
POST /p/api/zhctPushMeal
staff_uuid=<人员 UUID>
code=<餐盘码>
equipment_code=<终端编号>
dish_info={create_date, details:[{uuid, weight}]}| 结果 | 本地记录 | A02 处理 |
|---|---|---|
code=0 且删除成功 | 删除 | TRAY_CLAIM_UPLOAD_SUCCESS 解除 |
| 网络类失败 | 即时重试 3 次;仍失败入定时队列 | TRAY_CLAIM_DEFERRED_NETWORK 离线解除,提示累计延迟 |
code=1 | 按旧策略删除候选记录 | 写 NEED_TRAY_BIND,保持报警 |
| 其他业务失败或删除失败 | 保留/调度 | 保持报警并展示原因 |
后台 UploadPickMealRecordWorker 继续处理离线队列;同一 alarmId 后续上传成功可解除仍在报警中的 A02,且当前餐盘仍在打餐页时会重新查人刷新累计。
| 文件 | 内容 |
|---|---|
/sdcard/Log/alarm_log_yyyyMMdd.txt | 日报警分类日志 |
/sdcard/Log/local_log_yyyyMMdd.txt | A02 业务过程日志 |
/sdcard/Log/网络请求_yyyyMMdd.txt | 接口 URL、请求、响应和 trace_id |
关键事件:TRIGGER、ACTION_SELECT、ACTION_CANCEL、ACTION_TIMEOUT、WEIGHT_RECOVERED、CLAIM_FAILED、CLAIM_SUCCESS、LOCAL_SAVE_ATTEMPT、LOCAL_SAVE_FAILED、UPLOAD_SUCCESS、UPLOAD_DEFERRED_NETWORK、NEED_TRAY_BIND、RESOLVE。排障应先按 alarmId 串联报警日志,再按餐盘码/时间查网络原始响应。
结论:餐盘 003400 能查到人员,不存在读码或查人绑定缺失;问题是服务端两个接口判定不一致。
17:45:32,/p/api/selectPlate 返回 code=0,人员 UUID FCF83901-C1C6-4074-DAD5-2B7EC655F91C,姓名尹旭亮;trace ID:6a8d643be1a1b。17:45:33,客户端以相同 UUID、code=003400 和终端 ykt_test_0001 调用 /p/api/zhctPushMeal。code=1:餐盘003400未绑定人员!!!;trace ID:6a8d643c899e9。ykt_test_0001-A02-1787651031820 的 CLAIM_SUCCESS 后紧跟 NEED_TRAY_BIND,因此按上传成功才解除的规则保持报警。客户端不能绕过 code=1 强制解除,否则违反业务前提。服务端需统一 selectPlate 与 zhctPushMeal 的绑定校验数据源或缓存策略;客户端应明确提示“上传校验返回餐盘未绑定”,并在一次 code=1 后防止同盘连续重复认领。
code=0 且本地删除成功后解除。code=1 时报警不解除,服务端修复后重新验收。| 模块 | 责任 |
|---|---|
HomeActivity | 触发、实时重量、门控、查人、落库、上传、解除、日志 |
NoTrayPickDetector / AntiEscapeAlarm | 重量证据和报警实体 |
AntiEscapeAlarmDialogFragment | A02 页面与状态提示 |
A02TrayClaimCodePolicy | 同盘去重、移盘确认 |
PickMealRecord / UploadPickMealRecordWorker | 候选记录、离线补传 |
CPTNetworkRequest | selectPlate、zhctPushMeal 接口声明 |