Files
junhong_cmp_fiber/openspec/specs/package-management/spec.md
huang 79c061b6fa
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m24s
feat: 实现套餐管理模块,包含套餐系列、双状态管理、废弃模型清理
- 新增套餐系列管理 (CRUD + 状态切换)
- 新增套餐管理 (CRUD + 启用/禁用 + 上架/下架双状态)
- 清理 8 个废弃分佣模型及对应数据库表
- Package 模型新增建议成本价、建议售价、上架状态字段
- 完整的 Store/Service/Handler 三层实现
- 包含单元测试和集成测试
- 归档 add-package-module change
- 新增多个 OpenSpec changes (订单支付、店铺套餐分配、一次性分佣、卡设备系列绑定)
2026-01-27 19:55:47 +08:00

181 lines
6.3 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: 创建套餐
系统 SHALL 允许平台管理员创建套餐,包含套餐编码、套餐名称、所属系列、套餐类型、时长、流量配置、价格和建议价格。套餐编码 MUST 全局唯一(排除已删除记录)。新创建的套餐默认为启用状态(1)和下架状态(2)。
#### Scenario: 成功创建套餐
- **WHEN** 管理员提交有效的套餐信息
- **THEN** 系统创建套餐记录,状态为启用(1),上架状态为下架(2),返回创建的套餐详情
#### Scenario: 套餐编码重复
- **WHEN** 管理员提交的套餐编码已存在(未删除)
- **THEN** 系统返回错误 "套餐编码已存在"
#### Scenario: 关联不存在的套餐系列
- **WHEN** 管理员指定的系列 ID 不存在
- **THEN** 系统返回错误 "套餐系列不存在"
#### Scenario: 缺少必填字段
- **WHEN** 管理员未提供必填字段(套餐编码、套餐名称、套餐类型、时长、价格)
- **THEN** 系统返回参数验证错误
---
### Requirement: 查询套餐列表
系统 SHALL 提供套餐列表查询功能,支持按套餐名称模糊搜索、按系列 ID 筛选、按状态筛选、按上架状态筛选、按套餐类型筛选。结果 MUST 分页返回,按创建时间倒序排列。
#### Scenario: 查询所有套餐
- **WHEN** 管理员请求套餐列表,不带筛选条件
- **THEN** 系统返回所有未删除的套餐,分页显示
#### Scenario: 按系列筛选
- **WHEN** 管理员指定套餐系列 ID
- **THEN** 系统只返回属于该系列的套餐
#### Scenario: 按名称搜索
- **WHEN** 管理员提供套餐名称关键字
- **THEN** 系统返回名称包含该关键字的套餐
#### Scenario: 按状态筛选
- **WHEN** 管理员指定启用状态
- **THEN** 系统只返回匹配启用状态的套餐
#### Scenario: 按上架状态筛选
- **WHEN** 管理员指定上架状态
- **THEN** 系统只返回匹配上架状态的套餐
#### Scenario: 按套餐类型筛选
- **WHEN** 管理员指定套餐类型formal/addon
- **THEN** 系统只返回匹配类型的套餐
---
### Requirement: 查询套餐详情
系统 SHALL 允许管理员查询单个套餐的详细信息。
#### Scenario: 查询存在的套餐
- **WHEN** 管理员请求指定 ID 的套餐详情
- **THEN** 系统返回该套餐的完整信息
#### Scenario: 查询不存在的套餐
- **WHEN** 管理员请求不存在或已删除的套餐 ID
- **THEN** 系统返回 "套餐不存在" 错误
---
### Requirement: 更新套餐
系统 SHALL 允许管理员更新套餐的基本信息。套餐编码创建后 MUST NOT 允许修改。
#### Scenario: 成功更新套餐
- **WHEN** 管理员提交有效的更新信息
- **THEN** 系统更新套餐记录,返回更新后的详情
#### Scenario: 尝试修改套餐编码
- **WHEN** 管理员尝试修改套餐编码
- **THEN** 系统忽略套餐编码字段,不进行修改
#### Scenario: 更新不存在的套餐
- **WHEN** 管理员更新不存在的套餐
- **THEN** 系统返回 "套餐不存在" 错误
#### Scenario: 关联不存在的套餐系列
- **WHEN** 管理员将套餐关联到不存在的系列
- **THEN** 系统返回错误 "套餐系列不存在"
---
### Requirement: 删除套餐
系统 SHALL 允许管理员删除套餐(软删除)。
#### Scenario: 成功删除套餐
- **WHEN** 管理员删除指定的套餐
- **THEN** 系统软删除该记录,后续查询不再返回
#### Scenario: 删除不存在的套餐
- **WHEN** 管理员删除不存在的套餐
- **THEN** 系统返回 "套餐不存在" 错误
---
### Requirement: 启用/禁用套餐
系统 SHALL 允许管理员切换套餐的启用状态。禁用套餐时 MUST 同时将上架状态设置为下架。
#### Scenario: 启用套餐
- **WHEN** 管理员将禁用的套餐设置为启用
- **THEN** 系统更新状态为启用(1),上架状态保持不变
#### Scenario: 禁用套餐
- **WHEN** 管理员将启用的套餐设置为禁用
- **THEN** 系统更新状态为禁用(2),同时将上架状态设置为下架(2)
#### Scenario: 禁用已上架的套餐
- **WHEN** 管理员禁用一个当前已上架的套餐
- **THEN** 系统更新状态为禁用(2),上架状态强制设置为下架(2)
---
### Requirement: 上架/下架套餐
系统 SHALL 允许管理员切换套餐的上架状态。只有启用状态的套餐才能上架。
#### Scenario: 上架启用的套餐
- **WHEN** 管理员将启用且下架的套餐设置为上架
- **THEN** 系统更新上架状态为上架(1)
#### Scenario: 尝试上架禁用的套餐
- **WHEN** 管理员尝试上架一个禁用的套餐
- **THEN** 系统返回错误 "禁用的套餐不能上架,请先启用"
#### Scenario: 下架套餐
- **WHEN** 管理员将上架的套餐设置为下架
- **THEN** 系统更新上架状态为下架(2)
#### Scenario: 状态未变化
- **WHEN** 管理员设置的上架状态与当前状态相同
- **THEN** 系统正常返回成功,不产生错误
---
### Requirement: Package 模型新增字段
系统 MUST 在 Package 模型中新增以下字段:
- `suggested_cost_price`:建议成本价(分为单位),默认 0
- `suggested_retail_price`:建议售价(分为单位),默认 0
- `shelf_status`上架状态1-上架 2-下架,默认 2
#### Scenario: 创建套餐时设置建议价格
- **WHEN** 管理员创建套餐并设置建议成本价和建议售价
- **THEN** 系统保存这些价格信息
#### Scenario: 查询套餐时返回建议价格
- **WHEN** 管理员查询套餐详情或列表
- **THEN** 响应中包含 suggested_cost_price、suggested_retail_price、shelf_status 字段
---
### Requirement: 清理废弃模型
系统 MUST 删除以下废弃的分佣相关模型和对应的数据库表:
- `AgentHierarchy` (tb_agent_hierarchy)
- `CommissionRule` (tb_commission_rule)
- `CommissionLadder` (tb_commission_ladder)
- `CommissionCombinedCondition` (tb_commission_combined_condition)
- `CommissionApproval` (tb_commission_approval)
- `CommissionTemplate` (tb_commission_template)
- `CarrierSettlement` (tb_carrier_settlement)
- `AgentPackageAllocation` (tb_agent_package_allocation)
#### Scenario: 迁移后废弃表不存在
- **WHEN** 执行数据库迁移后
- **THEN** 上述 8 个表在数据库中不再存在
#### Scenario: 代码中无废弃模型引用
- **WHEN** 删除模型定义后
- **THEN** 项目能够正常编译,无编译错误