消费页面一卡通自动寻卡与人员同步设计

目标

ConsumptionActivity 进入后同时启动读卡器自动寻卡和人员全量同步:读卡器自动完成 USB 权限、连接与持续寻卡;人员同步从新开普一卡通 WebService 每批拉取 1000 条,形成完整本地快照后,再通过项目当前业务服务器地址分批调用 POST /api/oneCardTerminal/syncPersons

已确认配置

总体架构

  1. ConsumptionCardSearchManager:管理 USB 广播、权限申请、读卡器连接、寻卡轮询和资源释放。
  2. ConsumptionPersonSyncCoordinator:按“连接一卡通 → 完整拉取 → 本地快照完成 → 业务系统上传”顺序编排一次同步。
  3. BusinessPersonSyncService:从指定同步快照读取人员、映射接口字段、每批最多 1000 条顺序上传并汇总结果。

读卡器与人员同步分别使用单线程执行器,互不占用对方线程;所有 UI 更新切回主线程。

读卡器链路

进入页面

寻卡与退出

人员全量拉取链路

  1. 从 MMKV 读取服务器地址与 AppID,没有保存值时使用确认的默认值。
  2. 调用 GetCustomerCount 验证连接并取得总人数。
  3. 复用 CustomerSyncService,每批 1000 条调用 GetCustomerByNum
  4. 每批写入 SQLiteCustomerRepository,仅在数量完整时完成快照并删除旧人员。
  5. 拉取、解析或落库失败时不调用业务系统。

业务系统上传链路

业务字段一卡通字段类型规则
bmBMString必填,最长 200 字符
xhXHString必填,最长 60 字符
nameNAMEString必填,最长 40 字符
sexSEXInteger原值转整数,1 男、0 女
customeridCUSTOMERIDInteger原值转十进制整数
cardnoCARDNOInteger原值转十进制整数
statusSTATUSInteger保持新开普原始状态值
cardsnCARDSNInteger原值转十进制整数

映射不截断字符串,也不为缺失或非法数值编造默认值。每批成功且 code == 0 后继续下一批;汇总 total/created/updated/failed 并记录 trace_id。业务失败数会累计,HTTP 错误、非零 code、空响应或数量不一致会停止后续批次。

页面状态

错误与恢复

测试与验收

  1. 覆盖配置默认值、保存值、非法输入、人员字段映射与边界。
  2. 覆盖 0、1000、1001 条、部分失败、非零响应、中途异常和拉取失败不上传。
  3. 覆盖自动寻卡连接、检测到卡、移卡确认和停止状态。
  4. 使用 JDK 8 运行单元测试、Debug 构建、格式检查与只读差异检查。

范围边界