fix(设备实名): 无当前卡时按绑定卡实名回退并初始化单槽当前卡
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 14m42s

- 设备资产解析外层 real_name_status:存在当前使用卡时沿用该卡状态,无任何当前卡时任一有效绑定卡已实名即视为已实名
- 手工绑定与设备导入:设备最大槽位为 1 且有效绑定唯一时,在同一事务内将该绑定初始化为当前使用卡;多卡设备不推断
- 同步 asset-device、personal-customer 主 Spec;归档变更并附存量核对清单(75 条单槽唯一待修复绑定,其中 16 条已实名)
This commit is contained in:
2026-09-18 17:48:17 +08:00
parent d24e777a4c
commit 54c4ec7ba4
12 changed files with 465 additions and 4 deletions

View File

@@ -68,7 +68,6 @@
- **WHEN** 生产者向公共可靠事件存储提交超过字段上限的事件标识或父事件标识
- **THEN** 系统在持久化边界返回明确的参数错误而不是数据库字段错误
### Requirement: 资产与卡详情的优先轮询状态投影
资产解析接口(`GET /api/admin/assets/resolve/{identifier}`)的卡与设备两个分支 SHALL 返回该资产或卡的优先轮询状态投影,至少包含:是否处于优先轮询中、最近触发场景、最近轮询结果、最近轮询时间与失败原因。本能力 MUST NOT 为投影新增独立端点,投影 MUST 落在该既有解析端点内。投影口径 MUST 与该卡在优先轮询事实表中的未完成活动项一致存在待执行或执行中的项时「是否处于优先轮询中」为真最近触发场景取最近触发类型最近轮询结果取最近一次执行结果执行成功、轮询失败、已关闭、已过期或处理中最近轮询时间取最近一次执行或触发时间失败原因取最近一次可安全展示的失败原因。无任何优先轮询事实时字段以否或空值返回MUST NOT 以普通轮询结果填充。
@@ -103,6 +102,52 @@
- **WHEN** 调用者查询其数据范围外资产的详情
- **THEN** 响应与资产不存在不可区分,不返回任何优先轮询状态
### Requirement: 单槽单卡设备绑定时初始化当前卡标识
系统 SHALL 在设备最大槽位为 1 且该设备绑定的有效卡唯一时,将该绑定标记为当前使用卡;绑定成功后的设备卡列表 SHALL 把该卡作为当前卡对外返回。对多卡设备,系统 MUST NOT 在绑定时推断当前使用卡,其当前卡标识仍由运营商设备观测或显式切卡结果决定。系统 MUST 保证同一设备同一时刻至多一条有效绑定被标记为当前使用卡;解绑 SHALL 清除该绑定的当前卡标识。
#### Scenario: 单槽设备绑定唯一卡
- **GIVEN** 设备最大槽位为 1 且当前没有有效绑定卡
- **WHEN** 管理员为该设备绑定一张有效卡
- **THEN** 该绑定被标记为当前使用卡
- **AND** 后续设备卡列表中该卡返回为当前卡
#### Scenario: 多卡设备绑定不推断当前卡
- **GIVEN** 设备最大槽位大于 1
- **WHEN** 管理员为该设备绑定一张卡
- **THEN** 绑定结果不改变该设备既有的当前使用卡标识
#### Scenario: 解绑清除当前卡标识
- **GIVEN** 某有效绑定被标记为当前使用卡
- **WHEN** 该绑定被解绑
- **THEN** 该设备不再存在被标记为当前使用卡的有效绑定
### Requirement: 存量当前卡标识的核对与受控修复
系统 SHALL 提供只读核对口径,用于按「设备最大槽位为 1、有效绑定唯一、当前无任何当前卡标识」识别需要修复的存量绑定。受控修复 SHALL 仅将符合该口径的绑定标记为当前使用卡MUST NOT 修改其他绑定、MUST NOT 使同一设备出现多条当前使用卡。修复后设备卡列表 SHALL 反映该当前卡标识,设备实名判定 SHALL 按绑定卡事实返回。
#### Scenario: 只读核对识别待修复设备
- **GIVEN** 设备最大槽位为 1、存在唯一有效绑定且没有任何当前卡标识
- **WHEN** 维护者按核对口径查询
- **THEN** 该设备出现在待修复结果中,且查询本身不产生任何写入
#### Scenario: 受控修复后当前卡可见
- **GIVEN** 已按核对口径确认的设备
- **WHEN** 维护者执行受控修复
- **THEN** 该设备的唯一有效绑定被标记为当前使用卡
- **AND** 该设备的卡列表与资产信息按最新绑定事实返回
#### Scenario: 多卡设备不在修复范围
- **GIVEN** 设备最大槽位大于 1 或有效绑定多于一条
- **WHEN** 维护者按核对口径查询
- **THEN** 该设备不出现在待修复结果中
## 可达操作索引
本节只用于入口导航,不是行为 Requirement业务义务以上述 Requirements 为准。

View File

@@ -53,6 +53,35 @@
- **WHEN** 客户请求 `GET /api/c/v1/asset/info`
- **THEN** 响应的当前套餐摘要保持无套餐零值
### Requirement: 缺少当前使用卡时的设备实名判定
系统 SHALL 在个人客户查询设备资产 `GET /api/c/v1/asset/info` 时按下述规则返回外层 `real_name_status`:存在有效绑定卡的当前使用标识时,返回该卡的实名状态;不存在任何当前使用卡时,只要该设备存在任一已实名(`real_name_status=1`的有效绑定卡SHALL 返回已实名,否则返回未实名。返回的 `real_name_status_name` SHALL 与 `real_name_status` 保持一致。卡列表中的逐卡实名状态 MUST 保持按卡返回,不受本判定影响。该判定 MUST NOT 因运营商实时接口调用失败或超时而改变。
#### Scenario: 无当前使用卡但绑定卡已实名
- **GIVEN** 设备存在有效绑定卡且其中至少一张已实名,且该设备没有任何 `is_current=true` 的有效绑定卡
- **WHEN** 已认证个人客户请求该设备的 `GET /api/c/v1/asset/info`
- **THEN** 响应外层 `real_name_status` 返回 `1``real_name_status_name` 为已实名
- **AND** 卡列表中该已实名卡仍按其自身实名状态返回
#### Scenario: 无当前使用卡且绑定卡均未实名
- **GIVEN** 设备存在有效绑定卡且全部未实名,且该设备没有任何 `is_current=true` 的有效绑定卡
- **WHEN** 已认证个人客户请求该设备的 `GET /api/c/v1/asset/info`
- **THEN** 响应外层 `real_name_status` 返回 `0``real_name_status_name` 为未实名
#### Scenario: 有当前使用卡时沿用该卡状态
- **GIVEN** 设备存在一张 `is_current=true` 的未实名绑定卡,同时存在另一张已实名绑定卡
- **WHEN** 已认证个人客户请求该设备的 `GET /api/c/v1/asset/info`
- **THEN** 响应外层 `real_name_status` 返回该当前使用卡的未实名状态
#### Scenario: 运营商实时查询失败不改变实名判定
- **GIVEN** 设备的运营商实时状态查询失败或超时
- **WHEN** 已认证个人客户请求该设备的 `GET /api/c/v1/asset/info`
- **THEN** 响应仍按绑定卡事实返回外层实名状态,不因实时查询失败而返回未实名
## 可达操作索引
本节只用于入口导航,不是行为 Requirement业务义务以上述 Requirements 为准。