防逃单本地报警实施计划
目标
在现有 PC681 餐台扫码和称重链路内增加三类本地报警,并保持现有取餐记录与上传流程不变。
- A01 余额不足:新餐盘人员查询成功后,若汇总余额小于等于累计金额则报警;余额和累计金额同时为 0 时不报警。
- A02 未放餐盘取餐:打餐前、无有效餐盘、稳定重量相对基线累计下降达到现有起跳阈值时报警。
- A03 餐盘未绑定:餐盘人员查询成功但人员信息为空,或服务端明确返回“餐盘未绑定”时报警。
已确认边界
- 仅客户端判断,不新增服务端接口,不上传报警。
- 解除码固定为
888888,走现有统一串口扫码数据。 - 非报警状态读取解除码时只写一条去重后的本地轻量日志,不进入任何业务流程。
- 报警期间普通餐盘码不生效;A01/A03 必须先移走餐盘后才能刷解除卡;A02 可直接刷解除卡。
- 报警锁定应用内部操作,不限制退出应用;退出后自动解除,不恢复报警页面。
- 报警事件本地记录类型、内容、触发时间、解除方式和解除时间。
- 不新增 A01 专用取餐记录,保持现有重量变化记录和正常取餐上传链不变。
代码方案
- 新增纯 Java 规则与状态控制:余额规则、无餐盘减重检测、餐盘绑定结果识别、解除码去重、报警状态模型。
- 在 HomeActivity 的人员查询结果位置判断 A01/A03;在稳定重量入口判断 A02;在普通扫码处理前截获解除码。
- 新增不可取消的全屏报警弹窗,按 A01/A02/A03 展示不同标题和内容,统一提示工作人员刷解除卡;A01/A03 额外提示先移走餐盘。
- 扩展灯带控制器的报警优先模式,红灯持续闪烁时屏蔽普通绿灯/关灯请求。
- 报警语音约每 5 秒重复,A01 使用
voice_pay_balance_not_enough.mp3,A02 使用现有 please_put_the_tray_first.mp3,A03 使用现有 please_bind_the_tray_first.mp3。 - 使用本地日志记录报警触发/解除;使用 MMKV 保存最小活动快照,应用正常退出按
APP_EXIT 关闭,异常中断在下次启动按 PROCESS_INTERRUPTED 补记后清除,不恢复页面。
验收用例
- 余额 10、累计 10:A01;余额 0、累计 0:不报警;余额 11、累计 10:不报警。
- 无餐盘稳定基线下降 4g(阈值 5g):不报警;累计下降 5g:A02;重量增加:不报警。
- 非报警状态连续读取
888888:只记一条忽略日志,不进入取餐。 - A01 餐盘仍在时刷解除卡:不解除;移走餐盘后刷卡:解除。
- A02 刷解除卡:解除。
- A03 餐盘仍在时刷解除卡:不解除;移走餐盘后刷卡:解除。
- 报警期间普通餐盘码:忽略。
- 退出应用:报警解除并记录;异常结束后重启:不恢复页面,补记异常中断。
- 现有正常扫码、取餐和上传流程无回归。
实施顺序
- 基线测试与现有差异保护。
- 规则测试先行,再实现纯 Java 规则和状态机。
- 接入 HomeActivity 扫码、人员查询和稳定重量链路。
- 实现报警页面、灯光和语音。
- 实现本地审计和生命周期收口。
- 运行完整单元测试和 Debug 构建,完成代码复核和硬件验收清单。
不在本次范围
- 服务端、MQTT、角色权限、动态解除码。
- 现金余额与补贴余额拆分判断。
- 系统级 kiosk、Home 键限制。
- 重启恢复报警页面。
- 新增 A01 专用取餐数据或非报警解除码业务记录。
- Git 暂存、提交、推送、合并。