SanquanConsumption 变更记录
2026-09-28:主页展示 MQTT type=5 就餐消息
- 协议:新增纯 Java
MqttDiningMessageParser 和不可变展示模型;只处理 type=5,业务字段优先读取 data 并兼容根节点,姓名兼容 staff_name/name、金额兼容 pay_price/money/amount、余额兼容 remain_balance/balance,提示兼容 message/content。
- 展示:姓名、金额和余额齐全时,左侧圆形图标显示姓名首字(复姓同样只取首字),图标下显示完整姓名,就餐类型显示“自助餐”,金额和余额显示消息实值;随后刷新当天就餐记录。
- 默认与重复:默认值统一为“餐 / 未知 / ¥0 / ¥0”;
code!=0、重复就餐或字段不完整时不伪造业务数据,即使错误消息携带旧人员数据也恢复默认,右侧记录区域显示消息提示,例如“重复就餐”。
- 反馈:保留
type=5 消息反馈,消息 ID 继续优先读取 msg_uuid、兼容 msgid;测试页继续展示原始正文,主页只消费结构化字段。
- 验证:先验证新增测试因模型缺失而失败,再补实现;
./gradlew :app:testDebugUnitTest :app:assembleDebug :app:lintDebug --offline 执行成功。未收到真实现场 type=5 就餐报文,字段别名仍需通过脱敏报文或现场推送最终确认;本次未安装 APK、未发送 MQTT 测试消息。
2026-09-28:按扫码业务长连接动态更新状态图标
- 实机证据:读取 T1mini 已安装的源消费程序
com.diancan.sanquan 1.6,确认“请使用钉钉扫码支付”旁默认使用 16×16 红色图标,APK 同时提供同规格绿色图标并声明 SocketService。设备当时 Wi-Fi 已连接且通过系统网络验证,HTTP 就餐记录也正常展示,但图标仍为红色,因此该图标不是普通联网指示灯,而是钉钉扫码业务长连接是否可用的提示。
- 对应关系:源程序通过 Socket 长连接承接扫码业务;本项目通过 MQTT 接收业务消息,因此使用 MQTT 连接状态作为同职责信号。只有 MQTT 已连接显示绿色,未启用、配置不完整、连接中、连接失败、连接丢失或订阅失败均显示红色。
- 实现:为
MqttConnector 增加 DISCONNECTED、CONNECTING、CONNECTED 类型化状态并随原有状态文案一并回调,主页直接按枚举切换红绿圆点,不再通过中文文案包含关系推断状态。
- 解耦:付款处理中和支付失败仍更新提示文案及按钮状态,但不再改写长连接圆点,避免 HTTP 支付回调覆盖 MQTT 通道状态;状态控件命名调整为
payment_channel_status_dot 和 payment_status。
- 资源:源程序只使用红、绿两态,本项目同步移除不再使用的灰色空闲圆点资源,布局初始状态设为红色,MQTT 已连接回调到达后动态切绿。
- 验证:
./gradlew :app:testDebugUnitTest :app:assembleDebug :app:lintDebug --offline 执行成功,14 个单元测试全部通过并生成 Debug APK;已保留数据覆盖安装到 T1mini,启动后 MQTT 完成连接与主题订阅,圆点实际显示绿色且未出现崩溃。尚未通过中断网络或修改现场配置执行红绿双向切换,以免干扰设备通信。
2026-09-28:补齐左侧鹅卵石装饰分隔线
- 视觉:在付款二维码与底部连接状态之间补齐参考截图红框中的暖色鹅卵石串珠分隔线,并让分隔线横向覆盖左侧信息卡。
- 适配:新增
PebbleDividerView,根据面板可用宽度动态计算石子数量与间距,避免固定图片在不同横屏宽度下被拉伸;石子尺寸、间距、线宽与颜色统一由 Android 资源管理。
- 边界:该控件只负责装饰,不接收点击、不读取或修改支付、二维码及 MQTT 状态。
- 验证:XML 资源校验通过;
./gradlew :app:testDebugUnitTest :app:assembleDebug :app:lintDebug --offline 执行成功,14 个单元测试全部通过并生成 Debug APK。未覆盖安装或启动已连接餐机,实机视觉仍需在目标设备上确认。
2026-09-28:实现结算金额累加与商米扫码支付
- 金额:扩展
AmountInputController,使用 BigDecimal 精确累计多笔金额,输入区保留 1+3.6+2+0.91 表达式并显示 7.51元;支持跨加号删除、长按清空,空值和零值不会生成无效累加项。
- 扫码:新增
SunmiScannerClient,兼容 T1mini 当前旧版 com.summi.scan 和新版 com.sunmi.scanner.qrscanner;扫码结果只接收有效二维码,规范化后去除协议 C 前缀,不展示、不记录、不长期保存付款码。
- 支付:新增
PaymentRequestFactory,集中构造 custom_dish、订单类型、消费动作、消息编号和 MQTT 上下文字段;主页通过现有 /api/consume/orderPay 单次提交,支付期间阻止重复提交,成功后清空金额并刷新订单,失败时保留原表达式。
- 资源:删除“扫码 SDK 尚未接入”的占位弹框及专用尺寸,支付入口改为真实商米系统扫码页;主页提示调整为出示支付宝付款码。
- 验证:
./gradlew :app:testDebugUnitTest :app:assembleDebug :app:lintDebug --offline 通过;Debug APK 已覆盖安装到 T1mini。UI 自动化实测表达式 1+3.6+2+0.91、合计 7.51元,并确认扫码支付拉起 com.sunmi.sunmiqrcodescanner/.activity.ScanActivity,取消扫码后金额保持不变。
- 联调边界:本次未使用真实或生产个人付款码,因此没有执行实际扣款;真实支付成功、服务端失败码和余额回显仍需使用受控测试付款码联调,不能仅凭扫码页面拉起宣称支付闭环已验收。
2026-09-28:启动页补齐全屏沉浸式显示
- 主题:
LaunchActivity 复用主页无 ActionBar 全屏主题,避免启动阶段显示系统标题栏。
- 沉浸式:启动页创建后隐藏状态栏与导航栏,并在窗口重新获得焦点时重新应用,与主页、设置页行为一致。
- 验证:
./gradlew :app:testDebugUnitTest :app:assembleDebug :app:lintDebug --offline 通过;合并后 Manifest 确认启动页使用 Theme.SanquanConsumption.Main。尚未进行实机启动过程视觉验收。
2026-09-28:修正设置图标并迁移价格输入入口
- 设置图标:右上角按钮由非正方形区域调整为使用既有尺寸资源的正方形区域并垂直居中,增加
centerInside;齿轮替换为标准 Material Settings 对称矢量路径,避免不同设备密度下显示变形。
- 点击入口:移除“餐”字的可点击、可聚焦属性,将进入价格输入/结算面板的
showSettlement(true) 监听迁移到付款二维码;其他结算逻辑保持不变。
- 验证:
./gradlew :app:testDebugUnitTest :app:assembleDebug :app:lintDebug --offline 通过;Debug APK 已覆盖安装到 T1mini。UI 自动化确认设置按钮边界为 64×64、餐字 clickable=false、二维码 clickable=true,并实测二维码进入“结算”、点击餐字仍停留在“就餐记录”。
2026-09-28:补齐消费程序网络框架、餐段和请求日志
- 来源:对照
CusumptionMachine 的 APIService、RetrofitClient、RetrofitRequest、支付请求模型和本地日志实现,继续沿用同一套服务端契约。
- 接口:统一保留配对
/p/api/matecode、启动 /p/api/equipmentStart、订单列表 /api/consume/orderList、消费结算 /api/consume/orderPay,并新增餐段心跳 /p/api/heartbeat;支付请求同时携带源项目所需的鉴权头和请求体鉴权字段。
- 餐段:主页在前台运行时按源项目 30 秒心跳周期刷新
meal_times,将协议值 1/2/3/4 映射为早餐/午餐/晚餐/夜宵;未知值保持“未知”,不再展示写死的午餐时间。
- 日志:所有 HTTP 请求统一记录请求方法、接口路径、HTTP 状态、耗时及异常类型,按日写入应用专属目录
Android/data/com.cpt.sanquanconsumption/files/Log/network_yyyy-MM-dd.txt;不记录请求体、查询参数、配对码、付款码和鉴权头。
- 边界:消费结算接口和完整模型已可供刷脸、刷卡或扫码流程调用;当前项目尚无目标设备身份采集 SDK,因此主页不伪造用户、卡号或付款码发起真实扣款。
- 验证:新增餐段协议映射单测;
./gradlew :app:testDebugUnitTest :app:assembleDebug :app:lintDebug --offline 通过。服务端、扫码器和刷脸设备尚未连接,接口成功响应与真实扣款仍需联调验证。
2026-09-28:实现智能刷脸就餐系统消费主页面
- 视觉:以视频《三全消费机.mp4》和目标设备 1366×768 横屏为首要基准,新增橙色顶栏、暖色木纹背景、左侧消费信息卡、付款二维码占位图和右侧就餐记录表;主页面及设置页锁定横屏并使用沉浸式显示。
- 数据:新增
ConsumptionRecordAdapter,主页调用现有当天订单列表接口,展示序号、姓名、就餐类型、金额、余额和就餐时间;空数据与加载失败均显示明确状态,未写入虚假业务数据。
- 交互:点击“餐”切换金额结算面板;新增带两位小数及六位整数约束的
AmountInputController,支持数字、小数点、删除和长按清空;“关闭”返回记录列表,设置入口继续打开原设置页。
- 扫码边界:复现可关闭的扫码支付弹层;因目标设备扫码 SDK 和真实支付契约尚未接入,不模拟支付成功,“+”按钮只提示能力边界。
- 设置:保留 API 地址、配对码、设备编号、语音开关、版本更新及其原有保存、配对和检查更新逻辑;宽屏外围风格与主页统一,窄屏布局继续保留。
- 工程:增加 RecyclerView 依赖、集中维护主页字符串/颜色/尺寸/图形资源,并补充 HTTP(S) 下载应用查询声明。
targetSdk 30 为固定旧设备兼容边界,本次不改变,只在 lint 中排除 Google Play 上架时效检查。
- 验证:
./gradlew :app:testDebugUnitTest :app:assembleDebug :app:lintDebug --offline 通过;APK 清单确认主页和设置页均为横屏。当前无已连接设备或模拟器,尚未完成 1366×768 实机视觉与硬件扫码联调。
2026-09-21:移植设备基础流程与通信模块
- 来源:
CusumptionMachine 的配对、设备启动、版本、订单、HTTP 支付及 MQTT 接口契约。
- 变更:新增启动、设置、主页和 MQTT 测试页;实现配置保存与返回校验、Retrofit 网络接口、阿里云 MQTT 签名连接和
type=1、type=5 消息接收。测试消息按源项目接口反馈;人脸消息当前只接收并展示。
- 构建:将
compileSdk 调整为 33,以满足现有 AndroidX 依赖要求;补充网络及 MQTT 依赖和权限。
- 验证:
./gradlew :app:assembleDebug :app:testDebugUnitTest --offline 通过。尚未连接实际服务端和设备进行联调。
- 边界:目标项目没有人脸库和识别 SDK,本次不写入人脸数据;收到的人脸消息不向服务端回报处理完成。支付和订单接口已经提供,尚无对应业务页面调用。
2026-09-21:设置页风格对齐源项目
- 参照
CusumptionMachine 设置页,改为白底、灰色字段标签和分隔线、右侧值与箭头、行内语音开关及橙色版本更新按钮。
- 宽屏采用左侧导航加右侧基础设置列表;窄屏将返回入口放在顶部,列表内容保持一致。
- API 地址与配对码改为点击列表行后弹窗输入;返回仍只校验地址、配对码和设备编号。
- 验证:
./gradlew :app:assembleDebug :app:testDebugUnitTest --offline 通过。未在实体设备上做视觉验收。