Files
break 5ed6b39deb
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
feat(收口): 补齐 8 月迭代缺口并同步 Spec 与证据链
- 新增六对成对迁移 000232–000237:H5 弹窗类型、退款结算标识与申请人备注、优先轮询事实字段与两个新终态、通道阈值命中留痕、手机号最近解绑人、提现资格校验留痕
- 退款:原因必填与申请人备注、来源支付与渠道流水冻结、线下处理流水号补录审计、按订单查询可选退款方式、企微审批材料补齐且新增字段缺失映射即明确失败
- 优先轮询:人工关闭、有效期到期独立周期任务、失败与过期人工重触发、事实字段与异常重试查询、资产解析端点只读投影
- 通道阈值:命中事实同事务留痕与命中记录查询;员工账单:列表筛选与详情投影;商户池:列表投影与统计周期语义;H5:弹窗类型与类别排序
- 手机号:有效关联数量与最近解绑人、短信验证码失败次数限制;导出:佣金明细十五列与报表序号列
- 时间筛选:三处新增筛选纳入统一严格解析契约,员工账单产生时间参数改名
- 同步 12 份主 Spec 需求、两端点与异步任务证据链,门禁 context-health 与 OpenSpec 校验通过
2026-09-18 15:34:29 +08:00

5.9 KiB
Raw Blame History

Purpose

按原始需求(111.md §15.7)为后台关联查看补齐「绑定资产数量」与「最近解绑人」两个投影字段,使运营无需逐条计数即可判断某手机号还可绑定多少资产、并在解绑后直接看到处理人。

MODIFIED Requirements

Requirement: 后台查看关联

仅超级管理员和平台用户可在其资产数据范围内查看关联手机号。资产详情 MUST 列出该资产全部当前关联手机号;资产列表、卡与设备两类导出以及批量任务结果中,具备资产数据权限的账号可见完整关联手机号,不做脱敏。按资产查询 MUST 一次批量聚合完成。后台 MUST NOT 提供补录或修改关联的入口。

关联查询 SHALL 额外返回两项投影:该手机号当前有效关联资产数量,以及每条关系的最近解绑人与最近解绑时间。数量口径 MUST 与该手机号「最多关联十项」的上限判定完全一致只统计当前有效关系、卡与设备分别计一项MUST 按当页涉及的手机号集合一次批量聚合MUST NOT 逐手机号或逐资产放大查询次数。最近解绑人 MUST 取最近一次解除该关系的后台账号名称与账号标识快照并随既有解绑方式、解绑时间、解绑原因一并返回关系仍有效时该字段为空MUST NOT 以创建人或最后更新人填充。以上字段 MUST 只读MUST NOT 改变既有解绑、换绑、上限判定与审计规则。

Scenario: 数据范围外不可见

  • WHEN 平台用户查询其资产数据范围之外的资产的关联手机号
  • THEN 系统不返回该资产的关联手机号

Scenario: 列表一次聚合

  • WHEN 请求一页包含多项资产的列表
  • THEN 系统按该页资产集合一次读取关联手机号并按资产装配,不逐资产查询

Scenario: 解绑后仍可查看完整快照

  • WHEN 一次批量解绑任务执行完成、关系已失效后查看该任务结果
  • THEN 结果中仍返回该次解除时记录的完整手机号快照

Scenario: 两类导出均含关联手机号

  • WHEN 导出 IoT 卡场景或设备场景
  • THEN 两类导出均包含关联手机号列,且设备导出列组解析对新增列保持正确

Scenario: 数量与上限口径一致

  • GIVEN 某手机号当前有效关联十项资产
  • WHEN 查询其中任一关联
  • THEN 返回的当前有效关联资产数量为十,与上限判定使用的计数相同

Scenario: 已解绑关系展示解绑人

  • GIVEN 一条关系已被后台账号 A 通过单项解绑失效
  • WHEN 查询该关系
  • THEN 返回最近解绑人为 A 的名称与标识、解绑时间与解绑原因

Scenario: 有效关系无解绑人

  • WHEN 查询一条仍有效的关联
  • THEN 最近解绑人与最近解绑时间均为空,且不以创建人或更新时间填充

Scenario: 数量批量聚合

  • GIVEN 一页返回多项资产或手机号的关联
  • WHEN 查询该页
  • THEN 系统按该页涉及的手机号集合一次读取计数,查询次数不随行数线性增长

ADDED Requirements

Requirement: 短信验证码校验失败次数限制

系统 SHALL 对短信验证码校验实施失败次数限制,作用域覆盖注册、绑定、换绑与换证的全部短信验证码校验流程:失败计数按窗口续期维护——每次校验失败在窗口内累加计数并重置窗口时长,相邻两次失败间隔不超过窗口时长即持续累加;计数达到上限后短时间内的后续校验 MUST 被拒绝并返回可定位的限流错误码与提示;校验成功 MUST 清零该手机号的失败计数。失败计数与锁定 MUST 以手机号维度按原子操作维护,并发提交 MUST NOT 绕过计数;锁定检查 MUST 先于验证码比对,锁定期内即使提交正确验证码也 MUST NOT 通过;锁定期为自计数达到上限起的一个窗口时长,锁定期间的提交在比对前即被拒绝且不再计数,因此锁定不因再次提交而续期;锁定到期后 MUST 自动恢复可校验状态MUST NOT 需要人工解锁。阈值与窗口 MUST 为固定常量或既有服务端配置MUST NOT 新增对外可配置项或接口。错误提示 MUST NOT 泄露验证码正确性、剩余失败次数或内部键名。

失败计数的写入或读取失败 MUST NOT 阻断校验流程的成功路径:计数不可用时系统 MUST 放行并记录MUST NOT 因限流计数故障阻断注册、绑定、换绑、换证与登录的成功路径。发送侧既有频率限制、验证码有效期与一次性消费语义 MUST 保持不变;校验失败 MUST NOT 消费验证码MUST NOT 影响既有链路的成功结果。

Scenario: 连续失败达到上限

  • WHEN 同一手机号在窗口内连续提交错误验证码达到上限
  • THEN 后续校验被拒绝并返回限流错误,即使提交的是正确验证码也不通过

Scenario: 锁定到期恢复

  • GIVEN 某手机号因失败次数达到上限被短时锁定
  • WHEN 锁定窗口结束且提交正确验证码
  • THEN 系统正常通过校验

Scenario: 成功后清零

  • GIVEN 某手机号已有若干次失败计数但未达上限
  • WHEN 一次校验成功
  • THEN 该手机号失败计数被清零,后续失败重新计数

Scenario: 并发提交不绕过计数

  • WHEN 同一手机号并发提交多个错误验证码
  • THEN 失败计数按实际提交次数累加,不因并发而丢失计数

Scenario: 失败不消费验证码

  • WHEN 一次校验因验证码错误或限流失败
  • THEN 该验证码保持可再次校验(在有效期与计数限制允许范围内),不产生任何业务事实

Scenario: 计数不可用不阻断成功路径

  • GIVEN 失败计数所依赖的存储不可用
  • WHEN 注册、绑定、换绑、换证或登录提交正确验证码
  • THEN 校验正常通过,不因计数故障被拒绝,且计数不可用的事实被记录