| 字段 | 内容 |
|---|---|
| Use Case ID | UC-RUNMODE-001 |
| 需求名称 | 管理员配置设备固定运行模式 |
| 所属项目 | ZhctTrayBindingMachine |
| 版本 | v0.1 |
| 状态 | Review |
| 优先级 | P0 |
| DoR | READY(P0 业务规则已由用户确认) |
| 日期 | 2026-08-29 |
当前 StartActivity 实际承担绑盘模式加载:申请相机等权限、检查基础配置、激活人脸 SDK、加载模型、初始化人脸库并同步绑盘人员数据。消费功能则在 ConsumptionActivity 内初始化扫码、订单、一卡通读卡和消费补传等能力。
只增加“是否进入消费页面”开关会把页面导航和设备运行模式混在一起,可能直接跳过某一模式的前置加载。最终方案是引入设备级持久运行模式,并为绑盘、消费建立相互独立的加载链路。
设备配置完成后运行模式相对固定。应用启动、开机自启和崩溃重启均自动进入已配置模式,不再展示功能选择页。绑盘页和消费页均隐藏返回按钮,系统返回键和返回手势也不执行返回。
FunctionSelectActivity 及其资源;本期只从正常运行链路移除。| 参与者 | 职责 | 权限/边界 | 入口 |
|---|---|---|---|
| 管理员 | 配置设备运行模式 | 通过现有管理员密码后才可进入设置页 | 标题栏 Logo 长按 |
| 普通操作员 | 使用绑盘或消费业务 | 不可切换模式,不可退出到功能选择页 | 业务首页 |
| Android 系统 | 启动、开机自启、崩溃恢复 | 只读取已持久化模式,不自行变更 | Launcher/广播/PendingIntent |
| 模式分发器 | 解析模式并选择加载链路 | 不执行业务初始化,不持有硬件资源 | ModeDispatchActivity |
新增 DeviceRunMode 枚举:BINDING 为默认绑盘模式,CONSUMPTION 为消费模式。运行模式通过独立 MMKV 键持久化,由枚举集中解析,禁止在页面中散落数字或字符串判断。
BR-001:未保存运行模式或读取到未知值时,必须回退为 BINDING。BR-002:运行模式只能由通过管理员密码进入设置页的管理员修改。BR-003:应用的所有冷启动入口必须先经过模式分发器。BR-004:绑盘模式只执行绑盘配置校验和初始化;消费模式只执行消费配置校验和初始化。BR-005:设置页校验通过后必须进入当前配置模式的加载页,禁止直接跳过加载进入业务页。BR-006:绑盘页和消费页均不显示返回按钮;系统返回键、返回手势和 onBackPressed() 均不导航。BR-007:模式切换保存后,在设置页点击返回立即生效,后续重启继续使用该模式。BR-008:消费读卡器仍由 ConsumptionActivity 管理,消费加载页不得抢占 USB 设备。BR-009:FunctionSelectActivity 保留兼容但不得出现在正常业务链路中。应用启动 / 开机自启 / 崩溃重启
|
v
ModeDispatchActivity
| |
| BINDING | CONSUMPTION
v v
StartActivity ConsumptionStartActivity
| |
v v
HomeActivity ConsumptionActivity
ModeDispatchActivity 是无业务界面的轻量分发入口。Manifest Launcher、开机广播和崩溃恢复 PendingIntent 最终都进入该入口。
| 组件 | 职责 | 明确不负责 |
|---|---|---|
DeviceRunMode | 定义模式及稳定持久化值 | MMKV 读写、页面跳转 |
DeviceRunModeStore | 读取、保存、兜底运行模式 | 页面展示、业务初始化 |
ModeTargetResolver | 将模式解析为加载目标,提供纯逻辑测试点 | 调用 Android startActivity |
ModeDispatchActivity | 执行冷启动分发 | 业务校验、人员同步、硬件初始化 |
StartActivity | 保留现有绑盘加载职责 | 消费人员和一卡通初始化 |
ConsumptionStartActivity | 公共配置校验、启动非阻塞补传调度并立即进入消费页 | 一卡通连接、人员同步、USB 读卡交易、订单消费流程 |
SettingModeRouter | 设置页校验通过后解析加载目标 | 保存设置项、执行初始化 |
绑盘和消费分别维护初始化状态。模式分发不根据旧的统一完成标记跳过加载页;加载页只可依据本模式状态决定完整加载、增量检查或快速通过。
HomeActivity。ConsumptionActivity,由业务页按实际需要连接一卡通并打开餐盘读取和 USB 读卡。消费模式不校验绑定方式、人脸激活、一卡通地址或 AppID,不加载人脸模型,也不执行人员同步。一卡通连接失败不得阻止进入消费页。
基础设置新增“设备运行模式”,点击后复用现有单选弹窗。设置页的页面按钮、物理返回键和系统返回手势统一调用同一返回方法:读取模式、执行模式专属校验、失败则停留并提示、成功则进入对应加载页并结束设置页。
现有按来源 Activity 和统一初始化标记决定返回目标的逻辑退出正常链路。
HomeActivity 和 ConsumptionActivity 的标题栏都不显示返回布局。| 步骤 | 角色 | 动作/系统响应 | 状态变化 | AC |
|---|---|---|---|---|
M1 | Android 系统 | 启动统一模式分发入口 | 应用进入分发中 | AC-001 |
M2 | 模式分发器 | 读取并解析持久运行模式 | 得到唯一模式 | AC-002 |
M3 | 模式分发器 | 启动对应加载页并结束自身 | 进入模式加载中 | AC-003 |
M4 | 模式加载页 | 执行本模式校验和初始化 | 模式就绪或可恢复失败 | AC-004 |
M5 | 模式加载页 | 就绪后启动业务页并结束自身 | 进入稳定业务运行 | AC-005 |
M6 | 普通操作员 | 尝试标题栏或系统返回 | 页面保持不变 | AC-006 |
| 分支 | 条件 | 系统行为 | 结果 | AC |
|---|---|---|---|---|
A1@M2 | 没有模式值 | 使用默认绑盘模式 | 进入绑盘加载 | AC-010 |
A2@M2 | 已配置消费模式 | 选择消费加载目标 | 进入消费加载 | AC-011 |
A3@M4 | 消费公共配置完整 | 启动非阻塞补传调度 | 立即进入消费页 | AC-012 |
A4@M1 | 从设置页返回 | 按所选模式校验并加载 | 新模式立即生效 | AC-013 |
| 异常/恢复 | 条件 | 系统处理 | 恢复方式 | AC |
|---|---|---|---|---|
E1@M2 / R1@E1 | 模式值未知 | 记录告警并回退绑盘 | 管理员重新选择 | AC-020 |
E2@M4 / R2@E2 | 模式配置不完整 | 不进入业务页并提示 | 进入设置修正 | AC-021 |
| AC | Given | When | Then | 证据 |
|---|---|---|---|---|
AC-001 | 任一冷启动入口 | 应用启动 | 首个业务路由经过模式分发器 | Manifest/Intent 测试 |
AC-002 | 已保存合法模式 | 分发器解析 | 返回唯一对应目标 | 单元测试 |
AC-003 | 已解析模式 | 执行分发 | 只启动对应加载页且分发页结束 | Activity 测试/日志 |
AC-004 | 进入任一加载页 | 执行初始化 | 只执行本模式任务 | 单元/集成测试与日志 |
AC-005 | 当前模式准备就绪 | 加载完成 | 进入对应业务页且加载页结束 | Activity 测试/人工验证 |
AC-006 | 位于任一业务页 | 触发任意返回 | 页面不跳转且无返回按钮 | UI/真机验证 |
AC-010 | 无模式配置 | 启动应用 | 进入绑盘加载 | 单元测试 |
AC-011 | 模式为消费 | 启动应用 | 进入消费加载 | 单元测试 |
AC-012 | 公共配置完整且一卡通不可连接 | 执行消费加载 | 不连接一卡通并立即进入消费页 | 单元/静态检查 |
AC-013 | 设置选择模式且配置有效 | 点击返回 | 进入对应模式加载页 | Activity 测试 |
AC-020 | 模式值未知 | 启动应用 | 告警并进入绑盘加载 | 单元测试 |
AC-021 | 模式配置缺失 | 返回或加载 | 留在设置/加载页并显示具体错误 | 单元/UI 测试 |
| Test ID | 层级 | 覆盖对象 | 预期 | 建议套件 |
|---|---|---|---|---|
UT-RUNMODE-001 | 单元 | 默认、合法、异常模式 | 默认及异常回退绑盘 | DeviceRunModeStoreTest |
UT-RUNMODE-002 | 单元 | 模式到加载目标 | 唯一正确映射 | ModeTargetResolverTest |
UT-RUNMODE-003 | 单元 | 分模式配置校验 | 消费不受绑定/人脸阻塞 | ModeConfigValidatorTest |
UT-RUNMODE-004 | 单元 | 设置页返回目标 | 只由当前模式决定 | SettingModeRouterTest |
UT-RUNMODE-005 | 单元 | 消费配置边界 | 一卡通和人脸状态均不阻塞消费启动 | ModeConfigurationPolicyTest |
UI-RUNMODE-001 | UI | 基础设置模式选择 | 正确展示、保存、回显 | Android UI/人工证据 |
UI-RUNMODE-002 | UI | 两业务页返回 | 无按钮且无跳转 | Android UI/真机证据 |
E2E-RUNMODE-001 | E2E | 新安装默认模式 | 启动至绑盘页 | 真机流程 |
E2E-RUNMODE-002 | E2E | 切换消费并重启 | 启动至消费页 | 真机流程 |
E2E-RUNMODE-003 | E2E | 开机/崩溃恢复 | 保持已配置模式 | 设备日志与页面证据 |
| 风险 | 影响 | 控制措施 |
|---|---|---|
| 冷启动入口遗漏 | 恢复场景仍进入绑盘 | 检查 Manifest、开机广播和崩溃 PendingIntent |
| 设置页仍按来源路由 | 配置与页面不一致 | 单一 SettingModeRouter |
| 消费加载提前打开读卡器 | USB 重复占用 | 禁止创建读卡管理器 |
| 消费仍检查人脸 | 无人脸设备无法退出设置 | 分模式校验反向测试 |
| 业务页能回功能选择 | 固定模式被绕开 | XML 隐藏和系统返回双重拦截 |
| 当前工作区存在大量未提交改动 | 修改重叠、回归定位困难 | 实施时最小差异,编辑前重读现场文件 |