消费前一卡通单人信息校验实施计划
目标:在消费首次完整读卡后强制查询一卡通服务端单人信息,以服务端卡状态决定是否允许消费,并将服务端姓名及权威卡字段贯穿页面、日志和本地交易快照。
架构:新增可注入的单人查询与卡信息校验边界,交易执行器在首次读卡和任何扣款之间同步执行校验。查询失败作为可重试的扣款前失败返回,消费页弹框触发同一卡片安全重试;卡片模型同时保存原始身份和服务端权威身份。
Task 1:服务端单人信息模型与严格解析
- 先写正常、缺字段、非法数字、账号不匹配和空姓名测试。
- 运行定向测试确认 RED。
- 实现
ServerCustomerInfo 与 ServerCustomerInfoParser。 - 运行解析器测试确认 GREEN。
Task 2:直接单人查询及卡片权威字段合并
- 测试单次请求只调用
GetInfoByCustID。 - 测试服务端字段覆盖业务 getter,同时保留
reader* 原始字段。 - 实现无状态查询重载、
CardInfoVerifier 和生产校验器。 - 将服务器和解析异常映射为
CUSTOMER_INFO_SYNC_FAILED。
Task 3:扣款前强制校验门禁
- 测试事件顺序必须为读卡、校验、扣款、后读卡。
- 测试查询失败及状态
3/4/其他 均不扣款。 - 把服务端状态规则调整为
1/3/4。 - 后读卡结果继承已验证姓名和身份,余额及计数保留后读卡值。
Task 4:人工重试与页面姓名
- 验证扣款前失败后订单门禁仍可重试。
- 在卡搜索管理器增加同一卡片重试入口。
- 消费页展示“同步人员卡信息失败”弹框,确认重试,取消后等待移卡。
- 页面姓名直接使用服务端查询结果。
Task 5:日志和本地快照增项
- 先写姓名、权威字段和
reader* 原始字段测试。 - 扩展结构化消费日志。
- 利用现有 JSON 快照将新增字段写入数据库,不新增重复列。
- 确认原始 APDU 仍不进入业务日志。
Task 6:全量验证与记录
- 更新 README 当前消费流程。
- 在 JDK 8 下运行完整单元测试。
- 构建 Debug APK。
- 执行
git diff --check、硬编码和注释审计。 - 在提示工程镜像生成同名 Markdown/HTML 变更记录。
- 不执行任何 Git 写操作。
完成标准
查询完成前绝不扣款;只有服务端状态 1 可继续;同步失败可由用户确认重试;服务端姓名进入页面、日志和数据库快照;完整单测与 Debug 构建通过,现场真实 SOAP 和真机扣款作为后续验收边界。