Files
break 48c85a4916
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m35s
docs(归档): 归档已用完套餐展示与支付购包即时复机两个变更
- fix-depleted-package-display → archive/2026-09-14-fix-depleted-package-display;
  补记验证:`GetCurrentMainPackage`(package_usage_store.go:63-66)按 status IN (1,2) 读取主套餐,
  资产信息 `fillPackageInfo`(service/asset/service.go:348-349)复用该读取,
  已用完主套餐返回名称、使用记录、时间与流量指标,待生效/已过期/已失效仍不作为当前套餐;
  实现提交 ff25586,4 项任务全部完成。
- fix-immediate-package-payment-resume → archive/2026-09-14-fix-immediate-package-payment-resume;
  补记八月迭代同步验证:定点同步提交 b38b2b3 已是 Iteration/8-11 的 HEAD 祖先,
  在途支付商户装配保留(98c145f);services.go:277 `orderService.SetResumeCallback(stopResumeService)`
  在位,`go build ./cmd/api ./cmd/worker` 通过;2.1/2.2 据此勾选。
- 主 Spec 同步:personal-customer 新增「资产信息展示当前可用或已用完主套餐」;
  package-lifecycle 修改为支付成功后已生效主套餐触发一次即时自动复机检查。

openspec validate --all 为 38 passed / 0 failed;doctor healthy。
2026-09-14 09:49:03 +08:00

87 lines
4.3 KiB
Markdown
Raw Permalink 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.
# personal-customer 当前行为
## Purpose
描述个人客户身份与资产归属隔离的当前行为。
## Requirements
### Requirement: 个人客户身份
系统 SHALL 支持个人客户通过既有认证入口登录、退出并查询当前资料。有效登录材料对应的客户创建、资料同步或资产绑定 SHALL 不因审计事件构造、校验或持久化失败而失败;审计失败 SHALL 按运营审计要求记录。
#### Scenario: 个人客户身份
- **GIVEN** 个人客户提供有效登录材料
- **WHEN** 请求认证
- **THEN** 系统返回个人客户身份和访问凭证
#### Scenario: 登录审计失败
- **GIVEN** 个人客户提供有效登录材料且登录需要创建或绑定资产
- **WHEN** 对应审计事件写入失败
- **THEN** 系统仍完成客户和资产绑定并返回访问凭证
### Requirement: 资产归属查询
系统 SHALL 只向个人客户返回当前绑定或可识别的卡与设备资产。
#### Scenario: 资产归属查询
- **GIVEN** 客户已认证
- **WHEN** 查询资产列表或详情
- **THEN** 返回该客户可见的资产而不包含其他客户资产
### Requirement: 资产信息展示当前可用或已用完主套餐
系统 SHALL 在个人客户查询其已绑定资产的 `GET /api/c/v1/asset/info` 时,将当前世代中状态为生效中(`status=1`)或已用完(`status=2`)的主套餐作为当前套餐摘要返回。返回的套餐摘要 SHALL 包含套餐名称、套餐使用记录 ID、开始时间、到期时间、真流量与虚流量指标。待生效、已过期和已失效的主套餐不得作为当前套餐摘要返回。
#### Scenario: 已用完主套餐仍展示使用情况
- **GIVEN** 已认证个人客户拥有当前世代唯一的已用完主套餐,且该主套餐状态为 `status=2`
- **WHEN** 客户请求 `GET /api/c/v1/asset/info`
- **THEN** 响应返回该主套餐的名称、使用记录 ID、开始时间、到期时间及流量指标
- **AND** 响应不得将该套餐摘要字段返回为无套餐零值
#### Scenario: 生效中主套餐保持既有展示
- **GIVEN** 已认证个人客户拥有当前世代唯一的生效中主套餐,且该主套餐状态为 `status=1`
- **WHEN** 客户请求 `GET /api/c/v1/asset/info`
- **THEN** 响应返回该主套餐的既有套餐摘要和流量指标
#### Scenario: 不可展示状态不作为当前套餐
- **GIVEN** 已认证个人客户没有状态为 `status=1``status=2` 的主套餐
- **WHEN** 客户请求 `GET /api/c/v1/asset/info`
- **THEN** 响应的当前套餐摘要保持无套餐零值
## 可达操作索引
本节只用于入口导航,不是行为 Requirement业务义务以上述 Requirements 为准。
### 个人客户 - 认证
`POST /api/c/v1/auth/bind-phone`(绑定手机号);`POST /api/c/v1/auth/change-phone`(更换手机号);`POST /api/c/v1/auth/logout`(退出登录);`POST /api/c/v1/auth/miniapp-login`(小程序登录);`POST /api/c/v1/auth/send-code`(发送验证码);`POST /api/c/v1/auth/verify-asset`(资产验证);`POST /api/c/v1/auth/wechat-login`(公众号登录)。仅在开发模式开启时,系统 SHALL 额外提供 `POST /api/c/v1/auth/dev-login`
### 个人客户 - 账户
`GET /api/c/v1/profile`(获取个人资料);`PUT /api/c/v1/profile`(更新个人资料)。
### 个人客户 - 微信
`GET /api/c/v1/wechat/appid`(获取当前生效的公众号 AppID`GET /api/c/v1/wechat/jssdk-config`(获取微信 JSSDK 签名配置)。
### 个人客户 - 资产
`GET /api/c/v1/asset/info`(资产信息);`GET /api/c/v1/asset/package-history`(资产套餐历史);`GET /api/c/v1/asset/packages`(资产可购套餐列表);`POST /api/c/v1/asset/refresh`(资产刷新)。
### 个人客户 - 设备
`GET /api/c/v1/device/cards`(获取设备卡列表);`POST /api/c/v1/device/factory-reset`(恢复出厂设置);`POST /api/c/v1/device/reboot`(设备重启);`POST /api/c/v1/device/switch-card`(设备切卡);`POST /api/c/v1/device/wifi`设备WiFi配置
### 个人客户 - 实名
`GET /api/c/v1/realname/link`(获取实名认证链接)。
### 个人客户 - 换货
`POST /api/c/v1/exchange/{id}/shipping-info`(提交收货信息);`GET /api/c/v1/exchange/pending`(查询待处理换货单)。