c端当前套餐开始时间过期时间,以及excel导入字段
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m55s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m55s
This commit is contained in:
@@ -4,12 +4,18 @@
|
||||
|
||||
### Requirement: B1 资产基本信息查询接口
|
||||
|
||||
系统 SHALL 提供 `GET /api/c/v1/asset/info?identifier=xxx`,并且 MUST 要求个人客户认证(C 端 Token)。接口 MUST 复用 `asset.Service.Resolve()` 解析标识符,并在调用时使用 `gorm.SkipDataPermission(ctx)` 以绕过 shop_id 数据权限过滤。请求参数 MUST 包含 `identifier`(ICCID、虚拟号、设备号之一)。响应体 SHALL 返回 `asset_type`、`asset_id`、`identifier`、`virtual_no`、`status`、`real_name_status`、`carrier`、`generation`、`wallet_balance`。错误码/消息 MUST 至少包含:`INVALID_PARAM/参数错误`、`FORBIDDEN/无权限操作该资产或资源不存在`、`ASSET_NOT_FOUND/资产不存在`。
|
||||
系统 SHALL 提供 `GET /api/c/v1/asset/info?identifier=xxx`,并且 MUST 要求个人客户认证(C 端 Token)。接口 MUST 复用 `asset.Service.Resolve()` 解析标识符,并在调用时使用 `gorm.SkipDataPermission(ctx)` 以绕过 shop_id 数据权限过滤。请求参数 MUST 包含 `identifier`(ICCID、虚拟号、设备号之一)。响应体 SHALL 返回 `asset_type`、`asset_id`、`identifier`、`virtual_no`、`status`、`real_name_status`、`carrier`、`generation`、`wallet_balance`。当存在当前主套餐时,响应体 MUST 额外返回 `current_package`、`current_package_usage_id`、`current_package_activated_at`、`current_package_expires_at` 以及当前套餐流量字段。错误码/消息 MUST 至少包含:`INVALID_PARAM/参数错误`、`FORBIDDEN/无权限操作该资产或资源不存在`、`ASSET_NOT_FOUND/资产不存在`。
|
||||
|
||||
#### Scenario: 个人客户查询已绑定资产
|
||||
- **WHEN** 客户携带有效 Token 调用 `GET /api/c/v1/asset/info?identifier=8986xxxx` 且资产已绑定到本人
|
||||
- **THEN** 系统返回 200,包含资产基础信息与当前 generation
|
||||
|
||||
#### Scenario: 当前主套餐返回开始时间和过期时间
|
||||
- **GIVEN** 该资产存在一条生效中的主套餐使用记录
|
||||
- **WHEN** 客户调用 `GET /api/c/v1/asset/info`
|
||||
- **THEN** 响应体中的 `current_package_activated_at` 等于该主套餐的 `activated_at`
|
||||
- **AND** 响应体中的 `current_package_expires_at` 等于该主套餐的 `expires_at`
|
||||
|
||||
---
|
||||
|
||||
### Requirement: B2 可购买套餐列表接口
|
||||
|
||||
@@ -20,16 +20,17 @@ TBD - created by archiving change add-device-management. Update Purpose after ar
|
||||
- **列位置(固定,不可变)**:
|
||||
```
|
||||
第1列(索引0): 虚拟号(必填,全局唯一)
|
||||
第2列(索引1): 设备名称(可选)
|
||||
第3列(索引2): 设备型号(可选)
|
||||
第4列(索引3): 设备类型(可选)
|
||||
第5列(索引4): IMEI(可选)
|
||||
第6列(索引5): 制造商(可选)
|
||||
第7列(索引6): 最大SIM槽数(可选,默认4,范围1-4)
|
||||
第8列(索引7): 卡1 ICCID(可选,对应槽位1)
|
||||
第9列(索引8): 卡2 ICCID(可选,对应槽位2)
|
||||
第10列(索引9): 卡3 ICCID(可选,对应槽位3)
|
||||
第11列(索引10): 卡4 ICCID(可选,对应槽位4)
|
||||
第2列(索引1): SN(可选)
|
||||
第3列(索引2): 设备名称(可选)
|
||||
第4列(索引3): 设备型号(可选)
|
||||
第5列(索引4): 设备类型(可选)
|
||||
第6列(索引5): IMEI(可选)
|
||||
第7列(索引6): 制造商(可选)
|
||||
第8列(索引7): 最大SIM槽数(可选,默认4,范围1-4)
|
||||
第9列(索引8): 卡1 ICCID(可选,对应槽位1)
|
||||
第10列(索引9): 卡2 ICCID(可选,对应槽位2)
|
||||
第11列(索引10): 卡3 ICCID(可选,对应槽位3)
|
||||
第12列(索引11): 卡4 ICCID(可选,对应槽位4)
|
||||
```
|
||||
- **列格式**: 所有列应设置为文本格式(避免数字被转为科学记数法)
|
||||
|
||||
@@ -67,10 +68,16 @@ TBD - created by archiving change add-device-management. Update Purpose after ar
|
||||
|
||||
#### Scenario: 中文表头正常导入
|
||||
|
||||
- **GIVEN** Excel 文件第1行表头为 `虚拟号 | 设备名称 | 设备型号 | 设备类型 | IMEI | 制造商 | 最大SIM槽数 | 卡1 | 卡2 | 卡3 | 卡4`
|
||||
- **GIVEN** Excel 文件第1行表头为 `虚拟号 | SN | 设备名称 | 设备型号 | 设备类型 | IMEI | 制造商 | 最大SIM槽数 | 卡1 | 卡2 | 卡3 | 卡4`
|
||||
- **WHEN** 系统解析该 Excel 文件
|
||||
- **THEN** 系统跳过第1行,从第2行开始按列位置解析数据
|
||||
|
||||
#### Scenario: SN 列按固定顺序导入
|
||||
|
||||
- **GIVEN** 某行第2列(索引1)填写 `SN-001`
|
||||
- **WHEN** 系统解析并导入该行
|
||||
- **THEN** 创建设备记录时 `sn = "SN-001"`
|
||||
|
||||
#### Scenario: 仅填写卡2和卡3时保留原始槽位
|
||||
|
||||
- **GIVEN** 某行 `最大SIM槽数 = 3`
|
||||
|
||||
Reference in New Issue
Block a user