一卡通人员全量转发与可选本地保存设计

文档信息

Use Case IDUC-ONECARD-002版本 / 状态v1.5 / 人员编号已改为 OUTID,待真机业务转发验证
名称终端全量获取新开普人员并分批转发业务服务器DoRREADY
优先级P0目标项目 / 日期ZhctTrayBindingMachine / 2026-09-03

1. 背景与现场结论

现有实现先按 1000 条从新开普一卡通拉取并写入 SQLite,形成完整本地快照后,再从 SQLite 按 1000 条读取并转发业务服务器。

2. 已确认需求与技术决定

  1. 先取得总人数,再按每批最多 1000 人调用 GetCustomerByNum;首批 custid=0,后续按上一批最大 CUSTOMERID + 1 推进。
  2. 所有分页须全部解析、跨批去重和严格核数,并在发出第一批业务请求前完成全部字段映射校验。
  3. 调用 POST /api/oneCardTerminal/syncPersons 时每批最多 1000 条,按原顺序串行转发。
  4. 采用 JSON,Content-Type: application/json; charset=UTF-8
  5. 请求增加 one_card_type,固定为 新开普,协议常量集中定义。
  6. “一卡通设置”增加“本地是否保存人员数据”,默认关闭并由 MMKV 持久化。
  7. 开关关闭时不创建、不写入本地快照;打开时仅在全部业务批次成功且 failed == 0 后静默保存。
  8. 本地保存失败只记录错误,不反向改判已完成的业务转发。
  9. 不修改业务 Base URL、鉴权和网络日志策略。

3. 范围

In Scope

Out of Scope

4. 参与者与数据边界

参与者 / 系统职责数据边界交互方式
设备管理员配置地址、AppID 和保存开关当前设备配置一卡通设置
绑盘机终端拉取、校验、转发、可选保存本轮全量人员后台同步任务
新开普一卡通提供总数和人员字段新开普人员数据SOAP
业务服务器接收标准化人员每批最多 1000 条JSON HTTP API
SQLite可选保存完整快照仅成功转发的全量数据本地事务

5. 成功与失败后置条件

6. 主流程

步骤系统动作数据 / 状态AC
M1读取一卡通地址、AppID 和保存开关开关默认 falseAC-001
M2连接并取得 GetCustomerCount非负总人数AC-002
M3人数大于 0 时循环请求 GetCustomerByNum,单批最多 1000 人每批解析后释放原始 XMLAC-003
M4累计分页、核数、校验游标与跨批账号唯一完整内存列表AC-004
M5映射全部业务 DTO网络上传前完成全量校验AC-005
M6按 1000 条切分并串行转发汇总 total/created/updated/unchanged/failed 和 trace IDAC-006
M7成功后检查保存开关关闭则结束,打开则保存AC-007
M8事务替换本地快照成功保存或失败回滚AC-008
M9释放资源并回报业务同步结果不显示本地保存进度AC-009

7. 分支与异常 / 恢复

ID条件处理恢复
A1@M3总人数为 0不调用要求 num > 0 的查询,以空列表完成业务阶段开关打开时保存空快照
A2@M7开关关闭跳过全部 SQLite 写入下一轮打开后生效
E1@M2-M4SOAP / 解析 / 核数失败不上传、不保存,记录阶段下一轮全量重试
E2@M5字段缺失或非法报告字段与人员标识,确保未上传修正数据或映射后重试
E3@M6HTTP、code、空响应或汇总异常停止后续批次,不保存依赖业务幂等全量重试
E4@M6failed > 0累计并继续后续批次,最终不保存按 trace ID 排查后重试
E5@M8SQLite 异常事务回滚,保留旧快照下一轮成功转发后重试

8. 字段与接口契约

业务字段新开普字段JSON 类型规则
bmCUSTDEPTString必填,最长 200
xhOUTIDString必填,最长 60;人员外部唯一编号
nameNAMEString必填,最长 40
sexSEXInteger必填;1 男、0 女
customeridCUSTOMERIDInteger必填并与记录 ID 一致
cardnoCARDNOInteger必填,十进制整数
statusSTATUSInteger保持源值
cardsnCARDSNInteger必填,十进制整数

不得截断字符串或为非法值补默认值。

业务请求:POST /api/oneCardTerminal/syncPersonsContent-Type: application/json; charset=UTF-8;每批 1..1000 条。

{
  "one_card_type": "新开普",
  "items": [{
    "bm": "013",
    "xh": "employee001",
    "name": "示例人员",
    "sex": 1,
    "customerid": 1,
    "cardno": 655493,
    "status": 1,
    "cardsn": 2
  }]
}

接口资料中的 OpenAPI form-urlencoded 描述与 JSON 示例冲突,本轮以用户确认的 JSON 契约为准;下载目录中的原资料不改动。

业务成功响应兼容 unchanged(已存在且无需更新);旧响应缺失时按 0 处理,汇总按 created + updated + unchanged + failed == total 校验。

9. 设置与本地保存契约

10. 实现边界

11. 验收标准

ACGiven / WhenThen证据
AC-001从未保存开关 / 打开设置显示关闭UI / MMKV 测试
AC-002连接正常 / 启动同步总人数驱动全量获取测试 / 日志
AC-003总数 26,089 / 获取27 次请求:前 26 批 1000、末批 89,游标按最大账号加一推进mock / 真机日志
AC-004数量或账号异常 / 解析上传前失败单元测试
AC-005源字段 CUSTDEPT / OUTID / 映射生成 bm / xh,不使用 EMPCODEmapper 测试 / 真机统计
AC-0062,601 人 / 转发1000、1000、601 串行发送并带固定 type服务测试
AC-007开关关闭 / 转发成功SQLite 不写入协调器测试
AC-008开关打开 / 转发成功完整快照保存,异常回滚仓库测试
AC-009批次失败或人员失败 / 结束不保存本地测试 / 日志
AC-010业务收到请求 / 核对JSON UTF-8 且每批不超 1000契约测试 / 日志
AC-011业务响应包含 unchanged / 校验计入 total 汇总,不误报汇总无效服务测试 / 日志

12. 测试矩阵

Test ID层级覆盖预期
UT-001单元开关默认 / 保存默认 false,切换持久化
UT-002单元全量获取 0、1、2,601、26,089分页正确、跨批去重并严格核数
UT-003单元字段映射CUSTDEPT / OUTID 正确映射,缺失 OUTID 时拒绝
UT-004单元请求序列化固定 one_card_type、items 和 1000 上限
UT-005单元业务分批边界和顺序正确
UT-006单元协调器仅成功且开关打开才保存
UT-007单元业务响应 unchanged计入 total,缺失时按 0 兼容
IT-001Android 仓库快照原子替换成功一致,异常保留旧快照
BUILD-001构建单测 / APKtestDebugUnitTest、assembleDebug 通过
DEVICE-001真机26,089 条,默认关闭27 个源端分页、27 批转发、无 OOM、不落库
DEVICE-002真机保存开关打开转发后静默落库,数量一致

13. 非功能、安全与可观测性

14. 风险、回滚与待确认项

风险:内存仍保留完整轻量人员列表;中途失败时已成功业务批次无法回滚;原接口资料的 Content-Type 表述不一致。

15. 追踪矩阵

步骤页面 / API规则AC / Test实现
M1一卡通设置 / MMKV默认关闭、单轮冻结AC-001 / UT-001已实现,构建通过
M2-M5后台任务 / SOAP源端 1000 人分页、先全量校验AC-002~005 / UT-002~003真机 26,089 人、27 页通过,无 OOM
M6syncPersonsJSON、1000 条、串行AC-006/010 / UT-004~005已实现,单测通过
M7-M8SQLite成功后按开关原子保存AC-007~009 / UT-006/IT-001已实现,真机 SQLite 待验
M9状态 / 日志静默保存、资源释放AC-009 / BUILD/DEVICE构建通过,真机待验

16. 变更记录

版本日期变更内容来源
v1.02026-09-03一次全量拉取、业务端 1000 条 JSON 分批、字段纠正、固定一卡通类型和可选后置本地保存用户确认、真机日志、现有代码及接口资料
v1.12026-09-03回写 sync_user_list 实现状态、自动化结果和真机待验边界源码差异、153 个单测和 Debug 构建
v1.22026-09-03一次全量响应 OOM 后,将一卡通获取改为每批最多 1000 人,仍保持全部拉取后再业务上传AndroidRuntime 崩溃栈、用户确认
v1.32026-09-0326,089 人分 27 页拉取成功;业务端累计拒绝 26,081 人,作为独立问题待查设备日志与 trace ID
v1.42026-09-03兼容业务响应新增的 unchanged,汇总改为 created + updated + unchanged + failed = total真机响应与用户确认
v1.52026-09-03根据唯一性证据将人员编号从 EMPCODE 改为 OUTID旧快照字段基数、业务响应成功数、用户确认