Files
junhong_cmp_fiber/openspec/specs/package-purchase-validation/spec.md
huang 61155952a7
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m56s
feat: 新增代理分配套餐上架状态(shelf_status)功能
- 新增数据库迁移:为 shop_package_allocation 表添加 shelf_status 字段
- 更新模型/DTO:ShopPackageAllocation 增加 ShelfStatus 字段及相关枚举
- 更新套餐分配 Service:支持上架/下架状态管理逻辑
- 更新套餐 Store/Service:根据 shelf_status 过滤可售套餐
- 更新购买验证 Service:引入上架状态校验逻辑
- 归档 OpenSpec 变更:2026-03-02-agent-allocation-shelf-status
- 同步更新主规范文档:allocation-shelf-status、package-management、purchase-validation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-02 15:38:54 +08:00

86 lines
3.5 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.
## ADDED Requirements
### Requirement: 验证卡/设备的套餐购买权限
创建订单前系统 MUST 验证卡/设备是否有权购买指定套餐。
#### Scenario: 卡有套餐系列关联
- **WHEN** 卡的 series_allocation_id 有值,且套餐属于该系列
- **THEN** 验证通过
#### Scenario: 卡无套餐系列关联
- **WHEN** 卡的 series_allocation_id 为空
- **THEN** 验证失败,返回 "该卡未关联套餐系列"
#### Scenario: 套餐不属于关联系列
- **WHEN** 套餐的 series_id 与卡关联的分配系列不匹配
- **THEN** 验证失败,返回 "该套餐不在可购买范围内"
#### Scenario: 系列分配已禁用
- **WHEN** 卡关联的系列分配状态为禁用
- **THEN** 验证失败,返回 "套餐系列已禁用"
---
### Requirement: 验证套餐状态
创建订单前系统 MUST 验证套餐处于可购买状态。**校验逻辑因购买场景而不同**:通过代理渠道购买时检查代理分配记录的 shelf_status通过平台自营渠道购买时检查套餐全局 shelf_status。`Package.status`(启用/禁用)为全局开关,任何场景下都必须检查。
#### Scenario: 代理渠道 - 套餐启用且代理上架
- **GIVEN** `Package.status=1`(启用),卖家代理的 `allocation.shelf_status=1`(上架)
- **WHEN** 客户通过该代理下单购买套餐
- **THEN** 套餐状态校验通过
#### Scenario: 代理渠道 - 套餐已禁用
- **GIVEN** `Package.status=2`(禁用)
- **WHEN** 客户通过任意代理下单购买套餐
- **THEN** 验证失败,返回 "套餐已禁用"
#### Scenario: 代理渠道 - 代理已下架套餐
- **GIVEN** `Package.status=1`(启用),卖家代理的 `allocation.shelf_status=2`(代理下架)
- **WHEN** 客户通过该代理下单购买套餐
- **THEN** 验证失败,返回 "套餐已下架"
#### Scenario: 代理渠道 - 平台下架不影响代理销售
- **GIVEN** `Package.status=1`(启用),`Package.shelf_status=2`(平台下架),卖家代理的 `allocation.shelf_status=1`(代理上架)
- **WHEN** 客户通过该代理下单购买套餐
- **THEN** 套餐状态校验通过(平台 shelf_status 不参与代理渠道校验)
#### Scenario: 平台自营渠道 - 套餐启用且平台上架
- **GIVEN** `Package.status=1`(启用),`Package.shelf_status=1`(平台上架)
- **WHEN** 客户通过平台自营渠道下单购买套餐
- **THEN** 套餐状态校验通过
#### Scenario: 平台自营渠道 - 套餐已下架
- **GIVEN** `Package.status=1`(启用),`Package.shelf_status=2`(平台下架)
- **WHEN** 客户通过平台自营渠道下单购买套餐
- **THEN** 验证失败,返回 "套餐已下架"
---
### Requirement: 获取购买价格
系统 MUST 根据买家身份返回正确的购买价格。
#### Scenario: 个人客户购买
- **WHEN** 个人客户购买套餐
- **THEN** 使用 Package.suggested_retail_price 作为支付金额
#### Scenario: 代理为店铺购买
- **WHEN** 代理为自己店铺购买套餐(囤货/测试)
- **THEN** 使用代理的成本价作为支付金额
---
### Requirement: 设备购买时的卡验证
设备购买套餐时 MUST 使用设备的 series_allocation_id 验证,不使用设备下单卡的关联。
#### Scenario: 设备有系列关联
- **WHEN** 设备的 series_allocation_id 有值
- **THEN** 使用设备的关联验证购买权限
#### Scenario: 设备无系列关联
- **WHEN** 设备的 series_allocation_id 为空
- **THEN** 验证失败,返回 "该设备未关联套餐系列"