消费前一卡通单人信息校验实施计划

目标:在消费首次完整读卡后强制查询一卡通服务端单人信息,以服务端卡状态决定是否允许消费,并将服务端姓名及权威卡字段贯穿页面、日志和本地交易快照。

架构:新增可注入的单人查询与卡信息校验边界,交易执行器在首次读卡和任何扣款之间同步执行校验。查询失败作为可重试的扣款前失败返回,消费页弹框触发同一卡片安全重试;卡片模型同时保存原始身份和服务端权威身份。

Task 1:服务端单人信息模型与严格解析

  1. 先写正常、缺字段、非法数字、账号不匹配和空姓名测试。
  2. 运行定向测试确认 RED。
  3. 实现 ServerCustomerInfo 与 ServerCustomerInfoParser。
  4. 运行解析器测试确认 GREEN。

Task 2:直接单人查询及卡片权威字段合并

  1. 测试单次请求只调用 GetInfoByCustID。
  2. 测试服务端字段覆盖业务 getter,同时保留 reader* 原始字段。
  3. 实现无状态查询重载、CardInfoVerifier 和生产校验器。
  4. 将服务器和解析异常映射为 CUSTOMER_INFO_SYNC_FAILED。

Task 3:扣款前强制校验门禁

  1. 测试事件顺序必须为读卡、校验、扣款、后读卡。
  2. 测试查询失败及状态 3/4/其他 均不扣款。
  3. 把服务端状态规则调整为 1/3/4。
  4. 后读卡结果继承已验证姓名和身份,余额及计数保留后读卡值。

Task 4:人工重试与页面姓名

  1. 验证扣款前失败后订单门禁仍可重试。
  2. 在卡搜索管理器增加同一卡片重试入口。
  3. 消费页展示“同步人员卡信息失败”弹框,确认重试,取消后等待移卡。
  4. 页面姓名直接使用服务端查询结果。

Task 5:日志和本地快照增项

  1. 先写姓名、权威字段和 reader* 原始字段测试。
  2. 扩展结构化消费日志。
  3. 利用现有 JSON 快照将新增字段写入数据库,不新增重复列。
  4. 确认原始 APDU 仍不进入业务日志。

Task 6:全量验证与记录

  1. 更新 README 当前消费流程。
  2. 在 JDK 8 下运行完整单元测试。
  3. 构建 Debug APK。
  4. 执行 git diff --check、硬编码和注释审计。
  5. 在提示工程镜像生成同名 Markdown/HTML 变更记录。
  6. 不执行任何 Git 写操作。

完成标准

查询完成前绝不扣款;只有服务端状态 1 可继续;同步失败可由用户确认重试;服务端姓名进入页面、日志和数据库快照;完整单测与 Debug 构建通过,现场真实 SOAP 和真机扣款作为后续验收边界。