feat: 实现套餐管理模块,包含套餐系列、双状态管理、废弃模型清理
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m24s

- 新增套餐系列管理 (CRUD + 状态切换)
- 新增套餐管理 (CRUD + 启用/禁用 + 上架/下架双状态)
- 清理 8 个废弃分佣模型及对应数据库表
- Package 模型新增建议成本价、建议售价、上架状态字段
- 完整的 Store/Service/Handler 三层实现
- 包含单元测试和集成测试
- 归档 add-package-module change
- 新增多个 OpenSpec changes (订单支付、店铺套餐分配、一次性分佣、卡设备系列绑定)
This commit is contained in:
2026-01-27 19:55:47 +08:00
parent 30a0717316
commit 79c061b6fa
70 changed files with 7554 additions and 244 deletions

View File

@@ -0,0 +1,180 @@
## 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** 项目能够正常编译,无编译错误

View File

@@ -0,0 +1,99 @@
## ADDED Requirements
### Requirement: 创建套餐系列
系统 SHALL 允许平台管理员创建套餐系列,包含系列编码、系列名称、描述信息。系列编码 MUST 全局唯一(排除已删除记录)。新创建的套餐系列默认为启用状态。
#### Scenario: 成功创建套餐系列
- **WHEN** 管理员提交有效的套餐系列信息(系列编码、系列名称)
- **THEN** 系统创建套餐系列记录,返回创建的套餐系列详情,状态为启用(1)
#### Scenario: 系列编码重复
- **WHEN** 管理员提交的系列编码已存在(未删除)
- **THEN** 系统返回错误 "系列编码已存在"
#### Scenario: 缺少必填字段
- **WHEN** 管理员未提供系列编码或系列名称
- **THEN** 系统返回参数验证错误
---
### Requirement: 查询套餐系列列表
系统 SHALL 提供套餐系列列表查询功能,支持按系列名称模糊搜索、按状态筛选。结果 MUST 分页返回,按创建时间倒序排列。
#### Scenario: 查询所有套餐系列
- **WHEN** 管理员请求套餐系列列表,不带筛选条件
- **THEN** 系统返回所有未删除的套餐系列,分页显示
#### Scenario: 按名称搜索
- **WHEN** 管理员提供系列名称关键字
- **THEN** 系统返回名称包含该关键字的套餐系列
#### Scenario: 按状态筛选
- **WHEN** 管理员指定状态筛选(启用/禁用)
- **THEN** 系统只返回匹配状态的套餐系列
---
### Requirement: 查询套餐系列详情
系统 SHALL 允许管理员查询单个套餐系列的详细信息。
#### Scenario: 查询存在的套餐系列
- **WHEN** 管理员请求指定 ID 的套餐系列详情
- **THEN** 系统返回该套餐系列的完整信息
#### Scenario: 查询不存在的套餐系列
- **WHEN** 管理员请求不存在或已删除的套餐系列 ID
- **THEN** 系统返回 "套餐系列不存在" 错误
---
### Requirement: 更新套餐系列
系统 SHALL 允许管理员更新套餐系列的基本信息(系列名称、描述)。系列编码创建后 MUST NOT 允许修改。
#### Scenario: 成功更新套餐系列
- **WHEN** 管理员提交有效的更新信息
- **THEN** 系统更新套餐系列记录,返回更新后的详情
#### Scenario: 尝试修改系列编码
- **WHEN** 管理员尝试修改系列编码
- **THEN** 系统忽略系列编码字段,不进行修改
#### Scenario: 更新不存在的套餐系列
- **WHEN** 管理员更新不存在的套餐系列
- **THEN** 系统返回 "套餐系列不存在" 错误
---
### Requirement: 删除套餐系列
系统 SHALL 允许管理员删除套餐系列(软删除)。
#### Scenario: 成功删除套餐系列
- **WHEN** 管理员删除指定的套餐系列
- **THEN** 系统软删除该记录,后续查询不再返回
#### Scenario: 删除不存在的套餐系列
- **WHEN** 管理员删除不存在的套餐系列
- **THEN** 系统返回 "套餐系列不存在" 错误
---
### Requirement: 启用/禁用套餐系列
系统 SHALL 允许管理员切换套餐系列的启用状态。
#### Scenario: 启用套餐系列
- **WHEN** 管理员将禁用的套餐系列设置为启用
- **THEN** 系统更新状态为启用(1)
#### Scenario: 禁用套餐系列
- **WHEN** 管理员将启用的套餐系列设置为禁用
- **THEN** 系统更新状态为禁用(2)
#### Scenario: 状态未变化
- **WHEN** 管理员设置的状态与当前状态相同
- **THEN** 系统正常返回成功,不产生错误