All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 10m49s
32 lines
2.8 KiB
Markdown
32 lines
2.8 KiB
Markdown
## Context
|
||
|
||
现有 H5 已有手机号绑定与全局开关;新关系不能由后台或换货推测建立。
|
||
|
||
## Decisions
|
||
|
||
- 新表以手机号、资产和有效状态保存关系,并对当前有效关系实施十项计数与唯一约束。
|
||
- 验证/换绑在事务内锁定相关手机号关系;换绑先检查总数再整体迁移。
|
||
- 批量导入复用逐行任务,读取按资产数据范围,日志仅保留脱敏手机号。
|
||
|
||
## H5 与后台动作契约
|
||
|
||
### H5 建联与换绑
|
||
|
||
- 既有登录签发 token 时,按全局强制绑定开关及当前访问资产查询有效关联;开关开启且当前手机号未关联该资产时,响应 `need_bind_phone=true`,并限制依赖该资产的业务入口直至验证成功。开关关闭时不创建新关联,也不删除历史关联。
|
||
- 既有 `bind_phone` 短信场景验证成功后,事务中锁定手机号和资产有效关系;同一手机号—资产已有效关联则幂等成功,否则先计算该手机号有效资产数。达到十项返回“该手机号最多关联10项有效资产”,不写关联或手机号变更。
|
||
- 既有 `change_phone_old`、`change_phone_new` 两个验证码均验证成功后,事务锁定旧、新手机号关系;计算新号码当前有效关系数加旧号码待迁移有效关系数,超过十项则整体失败。通过时把旧号码全部有效关系原子失效/迁移至新号码,并记录旧、新号码脱敏审计;任一步失败不变更任一关系。
|
||
|
||
### 后台查看与解除
|
||
|
||
- `GET /phone-asset-associations`:仅超级管理员、平台用户,先按资产数据范围过滤;支持资产标识、手机号(仅权限内完整值)、关联状态、创建时间筛选,返回资产、手机号、建立时间、建立来源固定为 `h5_sms_verification` 和状态。
|
||
- `DELETE /phone-asset-associations/:id`:请求必须含 `reason`(1~500 字符)和二次确认;锁定指定有效关联后复核资产数据范围,标记失效并审计操作者、资产、脱敏手机号、原因和时间。后台没有创建/补录接口。
|
||
- `POST /phone-asset-associations/batch-unbind`:请求去重的资产集合、原因、二次确认;每个资产独立解除其全部有效关系,返回成功数、失败数与逐资产结果。越权、资产不存在和已无有效关系对调用方使用统一失败文案。
|
||
- Excel 解绑复用既有异步导入:每行按资产标识处理,独立授权与事务,任务持久化行号、结果和失败原因;一行失败不得回滚已成功行。
|
||
|
||
### 边界
|
||
|
||
- 换货、资产导入、后台资产编辑和个人客户主手机号历史记录均不得创建、推断、复制或迁移该关系。新换货资产在首次 H5 访问时才依当前开关走验证。
|
||
|
||
## Migration Plan
|
||
|
||
新增成对迁移,不回填;隔离库验证开关、上限、换绑、权限解绑、换货边界及 up/down/up。 |