feat: 资产解析接口新增实名时间字段
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m5s

- AssetResolveResponse 新增 real_name_at 字段:card 类型取 first_realname_at,device 类型取绑定卡中最小的实名时间
- BoundCardInfo 新增 real_name_at 字段:各卡自己的 first_realname_at
- RefreshCardDataFromGateway 手动刷新路径补写实名时间:检测到 0→1 变化时同步写入 first_realname_at
- 同步更新 asset-resolve 规格文档

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-09 12:12:28 +08:00
parent fce35e8a2d
commit 6dfc5c0301
9 changed files with 230 additions and 8 deletions

View File

@@ -45,6 +45,9 @@
- `activated_at`: 激活时间(未激活时为空)
- `created_at`: 创建时间
- `updated_at`: 更新时间
- `real_name_at``*time.Time`,可为 null最近一次完成实名的时间
- **card 类型**:直接取 `IotCard.first_realname_at`(未实名过则为 null
- **device 类型**:当前所有绑定卡 `first_realname_at` 中的最小值(无已实名卡则为 null
*状态与套餐字段device 和 card 均有)*:
- `real_name_status`: 实名状态(整型)
@@ -91,6 +94,7 @@
- `network_status`: 网络状态
- `current_month_usage_mb`: 本月已用流量(来自持久化缓存字段)
- `last_sync_at`: 最后与 Gateway 同步时间
- `real_name_at``*time.Time`,可为 null该卡最近一次完成实名的时间`IotCard.first_realname_at`
**流量展示计算规则**:
- `package_used_mb = current_month_usage_mb × virtual_ratio`
@@ -158,3 +162,44 @@
- **WHEN** 管理员输入 identifier 为 IoT 卡的手机号MSISDN
- **THEN** 注册表未命中fallback 查 tb_iot_card 的 msisdn 字段
- **THEN** 若存在多张卡的 MSISDN 相同返回第一条匹配记录MSISDN 非唯一,存在歧义,记录 warn 日志)
#### Scenario: 已实名的卡查询实名时间
- **WHEN** 通过标识符解析一张 `real_name_status = 1` 的卡
- **THEN** 响应中 `real_name_at` 返回该卡最近一次 `0→1` 变化时的时间戳
#### Scenario: 未实名的卡查询实名时间
- **WHEN** 通过标识符解析一张 `real_name_status = 0` 的卡
- **THEN** 响应中 `real_name_at` 返回 null
#### Scenario: 设备视角查询实名时间(部分卡已实名)
- **WHEN** 通过标识符解析一台设备,其中绑定了多张卡,部分卡已实名
- **THEN** 响应中 `real_name_at` 返回所有已实名绑定卡中 `first_realname_at` 最小的时间戳
#### Scenario: 设备视角查询实名时间(无已实名卡)
- **WHEN** 通过标识符解析一台设备,其所有绑定卡均未实名
- **THEN** 响应中 `real_name_at` 返回 null
#### Scenario: 设备绑定卡列表实名时间
- **WHEN** 通过标识符解析一台设备,绑定卡列表非空
- **THEN** `cards` 数组中每个 `DeviceCardInfo``real_name_at` 返回各卡自己的 `first_realname_at`(未实名则为 null
---
### Requirement: 手动刷新路径同步写入实名时间
系统 SHALL 在手动刷新路径(`RefreshCardDataFromGateway`)检测到实名状态由非已实名变为已实名(`0→1`)时,同步写入 `first_realname_at`,与轮询路径行为一致。
#### Scenario: 手动刷新触发实名状态变更
- **WHEN** 调用手动刷新接口,网关返回实名状态为已实名,且卡当前状态为未实名
- **THEN** `tb_iot_card.first_realname_at` 被更新为当前时间戳
#### Scenario: 手动刷新时实名状态无变化
- **WHEN** 调用手动刷新接口,网关返回实名状态与卡当前状态相同
- **THEN** `tb_iot_card.first_realname_at` 不被修改