在当前 add_banlance_tip 分支实现 A01 余额不足与 A02 未放餐盘取餐两类本地报警,使用统一串口扫码器读取解除卡,并保持现有正常取餐记录和上传流程不变。
BigDecimal 比较汇总余额与累计金额;余额 <= 累计金额 报警,0/0 不报警。SKIP_WEIGHT 时报警;增重不报警,稳定补餐高点更新为新基线。888888 在普通餐盘处理前被截获:非报警状态每个连续扫码周期只写一条本地忽略日志;报警状态按 A01/A02 规则解除。voice_pay_balance_not_enough.mp3,A02 使用现有 please_put_the_tray_first.mp3。APP_EXIT,异常中断在下次启动补记 PROCESS_INTERRUPTED。SKIP_WEIGHT 重建 A02 检测器,检测阈值与报警页面展示保持一致。WarnPop 报警链,避免与 A02 新报警重复;原工作区的红灯提示意图已迁移到新的高优先级持续闪烁实现。activity/HomeActivity.java:A01/A02 触发、解除码优先处理、报警生命周期与本地审计。antiescape/:报警模型、余额规则、无餐盘检测、解除码规则、状态控制、快照与声光控制。widget/AntiEscapeAlarmDialogFragment.java 与 dialog_anti_escape_alarm.xml:应用内锁屏报警。hardware/LightController.java:报警灯光优先模式。fragment/dark/DarkPickBeforeFragment.java:移除旧的重复报警入口。raw/voice_pay_balance_not_enough.mp3:余额不足语音。app/src/test/.../antiescape/:规则和状态回归测试。testDebugUnitTest:43 条测试通过,0 失败。assembleDebug:通过。git diff --check:通过。APP_EXIT 解除,以及强杀后下次启动不恢复页面并补记 PROCESS_INTERRUPTED。本次只修改并验证工作区,未执行暂存、提交、推送、合并、切换分支或创建分支。