feat(收口): 补齐 8 月迭代缺口并同步 Spec 与证据链
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
- 新增六对成对迁移 000232–000237:H5 弹窗类型、退款结算标识与申请人备注、优先轮询事实字段与两个新终态、通道阈值命中留痕、手机号最近解绑人、提现资格校验留痕 - 退款:原因必填与申请人备注、来源支付与渠道流水冻结、线下处理流水号补录审计、按订单查询可选退款方式、企微审批材料补齐且新增字段缺失映射即明确失败 - 优先轮询:人工关闭、有效期到期独立周期任务、失败与过期人工重触发、事实字段与异常重试查询、资产解析端点只读投影 - 通道阈值:命中事实同事务留痕与命中记录查询;员工账单:列表筛选与详情投影;商户池:列表投影与统计周期语义;H5:弹窗类型与类别排序 - 手机号:有效关联数量与最近解绑人、短信验证码失败次数限制;导出:佣金明细十五列与报表序号列 - 时间筛选:三处新增筛选纳入统一严格解析契约,员工账单产生时间参数改名 - 同步 12 份主 Spec 需求、两端点与异步任务证据链,门禁 context-health 与 OpenSpec 校验通过
This commit is contained in:
@@ -79,6 +79,8 @@
|
||||
|
||||
仅超级管理员和平台用户可在其资产数据范围内查看关联手机号。资产详情 MUST 列出该资产全部当前关联手机号;资产列表、卡与设备两类导出以及批量任务结果中,具备资产数据权限的账号可见完整关联手机号,不做脱敏。按资产查询 MUST 一次批量聚合完成。后台 MUST NOT 提供补录或修改关联的入口。
|
||||
|
||||
关联查询 SHALL 额外返回两项投影:该手机号当前有效关联资产数量,以及每条关系的最近解绑人与最近解绑时间。数量口径 MUST 与该手机号「最多关联十项」的上限判定完全一致(只统计当前有效关系、卡与设备分别计一项),MUST 按当页涉及的手机号集合一次批量聚合,MUST NOT 逐手机号或逐资产放大查询次数。最近解绑人 MUST 取最近一次解除该关系的后台账号名称与账号标识快照,并随既有解绑方式、解绑时间、解绑原因一并返回;关系仍有效时该字段为空,MUST NOT 以创建人或最后更新人填充。以上字段 MUST 只读,MUST NOT 改变既有解绑、换绑、上限判定与审计规则。
|
||||
|
||||
#### Scenario: 数据范围外不可见
|
||||
|
||||
- **WHEN** 平台用户查询其资产数据范围之外的资产的关联手机号
|
||||
@@ -99,6 +101,29 @@
|
||||
- **WHEN** 导出 IoT 卡场景或设备场景
|
||||
- **THEN** 两类导出均包含关联手机号列,且设备导出列组解析对新增列保持正确
|
||||
|
||||
#### Scenario: 数量与上限口径一致
|
||||
|
||||
- **GIVEN** 某手机号当前有效关联十项资产
|
||||
- **WHEN** 查询其中任一关联
|
||||
- **THEN** 返回的当前有效关联资产数量为十,与上限判定使用的计数相同
|
||||
|
||||
#### Scenario: 已解绑关系展示解绑人
|
||||
|
||||
- **GIVEN** 一条关系已被后台账号 A 通过单项解绑失效
|
||||
- **WHEN** 查询该关系
|
||||
- **THEN** 返回最近解绑人为 A 的名称与标识、解绑时间与解绑原因
|
||||
|
||||
#### Scenario: 有效关系无解绑人
|
||||
|
||||
- **WHEN** 查询一条仍有效的关联
|
||||
- **THEN** 最近解绑人与最近解绑时间均为空,且不以创建人或更新时间填充
|
||||
|
||||
#### Scenario: 数量批量聚合
|
||||
|
||||
- **GIVEN** 一页返回多项资产或手机号的关联
|
||||
- **WHEN** 查询该页
|
||||
- **THEN** 系统按该页涉及的手机号集合一次读取计数,查询次数不随行数线性增长
|
||||
|
||||
### Requirement: 后台解除关联
|
||||
|
||||
仅超级管理员和平台用户可在资产数据范围内解除关联,必须二次确认并填写原因;代理、企业和个人客户无后台解除能力。单项解除必须指定一条资产—手机号关系;勾选批量解除与 CSV 导入解除按资产解除该项资产全部当前有效关系。逐资产独立执行并返回成功数、失败数与逐项结果。越权、资产不存在与已无有效关系三种情况 MUST 对调用方返回统一失败文案「无权限操作该资源或资源不存在」。
|
||||
@@ -154,6 +179,46 @@ CSV 导入按资产标识定位资产,逐行独立执行:成功行提交,
|
||||
- **WHEN** 导入资产或修改后台资产属性
|
||||
- **THEN** 关联记录数不变,不产生任何手机号—资产关系
|
||||
|
||||
|
||||
### 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** 校验正常通过,不因计数故障被拒绝,且计数不可用的事实被记录
|
||||
|
||||
## 可达操作索引
|
||||
|
||||
本节只用于入口导航,不是行为 Requirement;业务义务以上述 Requirements 为准。
|
||||
|
||||
Reference in New Issue
Block a user