Files
junhong_cmp_fiber/openspec/changes/enforce-single-phone-per-asset/proposal.md
邹进 9ced14fa1b fix: 第1批 F1、M12 一资产一号与换货按手机号关联校验
- F1 一个资产同时只能有一个有效手机号关联,他号绑定返回 1192(不含号码),同号幂等
- 登录 need_bind_phone 改看资产是否已有有效关联,新增 asset_phone_bound、asset_phone_is_own;H5 绑定按客户/资产两侧状态分别写入
- 客户换号不再迁移资产关联
- M12 换货新资产有有效手机号关联即拒绝,号码只在 data.phone;换货完成清空旧资产客户绑定并失效旧资产关联(exchange_completed),均不迁移
- OpenSpec Change enforce-single-phone-per-asset:11/16,H5 短信与换货端到端验证待测试部署后完成
2026-10-12 00:10:41 +09:00

32 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Why
现行规则只限制“一个手机号最多关联 10 个资产”,不限制一个资产能绑几个号;资产已被别人绑定时 H5 仍出现绑定入口;客户换号会把资产关联一并迁走。换货校验又看的是“是否有人扫过码”(`tb_personal_customer_device`),后台解除手机号也解不开,测试库 6 台设备全部被拦。依据为《第1批-8-9月迭代缺陷修复技术方案》第 5、6 节(F1、M12);原在途 Change `limit-phones-per-asset` 与本规则相反,已于 2026-10-11 作废并删除。
## What Changes
- **BREAKING** 一个资产同时只能有一个有效手机号关联;同号重复验证幂等成功;其他号码绑定被拒,提示“该资产已绑定手机号,如需更换请联系管理员”,不带号码。换号须后台先解除再绑定。
- **BREAKING** `need_bind_phone` 的资产侧判断改为“当前资产是否已有有效关联”;客户自己没有手机号时仍强制绑定客户手机号。登录响应新增两个布尔值:资产是否已绑定手机号、是否为当前客户自己的号码,不返回号码。
- H5 绑定按“客户有无手机号 × 资产有无手机号”四种场景分别写客户手机号、资产手机号;资产侧号码可与客户手机号不同,两者不联动。
- **BREAKING** 客户更换手机号不再迁移资产关联。
- **BREAKING** 换货校验改为:新资产有有效手机号关联就拒绝,提示后台先解除;完整号码放在错误响应 `data.phone`,不进日志。
- **BREAKING** 换货完成时清空旧资产上的客户绑定(不迁移到新资产),并失效旧资产的手机号关联(失效方式 `exchange_completed`),释放名额。
## Capabilities
### New Capabilities
无。
### Modified Capabilities
- `phone-asset-association`:一资产一号、资产已绑定不强制、客户与资产手机号独立、换号不迁移关联、换货完成失效旧资产关联。
- `order-refund-exchange`:换货新资产校验改看手机号关联;换货完成清空旧资产客户绑定、不迁移到新资产。
## Impact
- 代码:`internal/service/phone_asset_association/association_write.go`(`Establish` 增加一资产一号判断,不加锁)、`internal/service/client_auth/service.go`(`need_bind_phone`、绑定入口拆分、`ChangePhone` 去掉 `migrateAssociations`)、`internal/model/dto/client_auth_dto.go`;`internal/service/exchange/service.go`(`ensureNewAssetBindingAvailableWithTx`、`switchCustomerBindingWithTx`)、`customer_binding` 新增 `ClearForExchange` 并删除只有换货使用的 `Migrate`;`phone_asset_association_store.go` 复用 `LockValidByAsset` + `InvalidateByIDs`;`pkg/errors` 新增错误码;`pkg/constants/phone_asset_association.go` 新增失效方式常量。
- 接口:H5 登录与绑定响应新增字段与错误码;换货被拒响应 `data.phone`,测试环境前端需读取展示;重新生成接口文档。
- 数据:无迁移(不加数据库唯一约束);交付前只读统计测试库“同一资产多条有效关联”(2026-10-11 为 0 条)。
- 运营与客服:换货后原客户手上的旧资产页面失效,需重新扫码才能再打开旧资产(谁扫谁能打开,规则不变);资产换号须后台解除。
- 已删除作废的 `openspec/changes/limit-phones-per-asset`(未实施、未归档)。