feat: 套餐系统升级 - Worker 重构、流量重置、文档与规范更新
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m54s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m54s
- 重构 Worker 启动流程,引入 bootstrap 模块统一管理依赖注入 - 实现套餐流量重置服务(日/月/年周期重置) - 新增套餐激活排队、加油包绑定、囤货待实名激活逻辑 - 新增订单创建幂等性防重(Redis 业务键 + 分布式锁) - 更新 AGENTS.md/CLAUDE.md:新增注释规范、幂等性规范,移除测试要求 - 添加套餐系统升级完整文档(API文档、使用指南、功能总结、运维指南) - 归档 OpenSpec package-system-upgrade 变更,同步 specs 到主目录 - 新增 queue types 抽象和 Redis 常量定义
This commit is contained in:
@@ -1,24 +1,53 @@
|
||||
## ADDED Requirements
|
||||
## Requirements
|
||||
|
||||
### Requirement: 创建套餐
|
||||
|
||||
系统 SHALL 允许平台管理员创建套餐,包含套餐编码、套餐名称、所属系列、套餐类型、时长、流量配置、价格和建议价格。套餐编码 MUST 全局唯一(排除已删除记录)。新创建的套餐默认为启用状态(1)和下架状态(2)。
|
||||
系统 SHALL 允许平台管理员创建套餐,包含套餐编码、套餐名称、所属系列、套餐类型、时长、**周期类型(calendar_type)、流量重置周期(data_reset_cycle)、是否需要实名激活(enable_realname_activation)**、流量配置、价格和建议价格。套餐编码 MUST 全局唯一(排除已删除记录)。新创建的套餐默认为启用状态(1)和下架状态(2)。
|
||||
|
||||
#### Scenario: 成功创建套餐
|
||||
- **WHEN** 管理员提交有效的套餐信息
|
||||
- **THEN** 系统创建套餐记录,状态为启用(1),上架状态为下架(2),返回创建的套餐详情
|
||||
#### Scenario: 成功创建自然月套餐
|
||||
- **GIVEN** 管理员提供套餐信息,calendar_type=natural_month,duration_months=1
|
||||
- **WHEN** 提交创建请求
|
||||
- **THEN** 系统创建套餐,状态=1,上架状态=2,calendar_type=natural_month
|
||||
|
||||
#### Scenario: 成功创建按天套餐
|
||||
- **GIVEN** 管理员提供套餐信息,calendar_type=by_day,duration_days=30
|
||||
- **WHEN** 提交创建请求
|
||||
- **THEN** 系统创建套餐,calendar_type=by_day,duration_days=30
|
||||
|
||||
#### Scenario: 套餐编码重复
|
||||
- **WHEN** 管理员提交的套餐编码已存在(未删除)
|
||||
- **GIVEN** 数据库中存在套餐编码为 "PKG001" 的套餐(未删除)
|
||||
- **WHEN** 管理员创建套餐,编码为 "PKG001"
|
||||
- **THEN** 系统返回错误 "套餐编码已存在"
|
||||
|
||||
#### Scenario: 关联不存在的套餐系列
|
||||
- **WHEN** 管理员指定的系列 ID 不存在
|
||||
- **GIVEN** 管理员指定 series_id=999,但系列不存在
|
||||
- **WHEN** 提交创建请求
|
||||
- **THEN** 系统返回错误 "套餐系列不存在"
|
||||
|
||||
#### Scenario: 缺少必填字段
|
||||
- **WHEN** 管理员未提供必填字段(套餐编码、套餐名称、套餐类型、时长、价格)
|
||||
- **THEN** 系统返回参数验证错误
|
||||
- **GIVEN** 管理员未提供套餐编码
|
||||
- **WHEN** 提交创建请求
|
||||
- **THEN** 系统返回参数验证错误 "套餐编码为必填项"
|
||||
|
||||
#### Scenario: 创建自然月套餐时必须提供 duration_months
|
||||
- **GIVEN** 管理员创建套餐,calendar_type=natural_month,但未提供 duration_months
|
||||
- **WHEN** 提交创建请求
|
||||
- **THEN** 系统返回错误 "自然月套餐必须指定 duration_months"
|
||||
|
||||
#### Scenario: 创建按天套餐时必须提供 duration_days
|
||||
- **GIVEN** 管理员创建套餐,calendar_type=by_day,但未提供 duration_days
|
||||
- **WHEN** 提交创建请求
|
||||
- **THEN** 系统返回错误 "按天套餐必须指定 duration_days"
|
||||
|
||||
#### Scenario: 默认 data_reset_cycle 为 monthly
|
||||
- **GIVEN** 管理员创建主套餐,未指定 data_reset_cycle
|
||||
- **WHEN** 提交创建请求
|
||||
- **THEN** 系统自动设置 data_reset_cycle=monthly
|
||||
|
||||
#### Scenario: 默认 enable_realname_activation 为 true
|
||||
- **GIVEN** 管理员创建主套餐,未指定 enable_realname_activation
|
||||
- **WHEN** 提交创建请求
|
||||
- **THEN** 系统自动设置 enable_realname_activation=true
|
||||
|
||||
---
|
||||
|
||||
@@ -54,38 +83,84 @@
|
||||
|
||||
### Requirement: 查询套餐详情
|
||||
|
||||
系统 SHALL 允许管理员查询单个套餐的详细信息。
|
||||
系统 SHALL 允许管理员查询单个套餐的详细信息,**响应包含新增字段(calendar_type, data_reset_cycle, enable_realname_activation)**。
|
||||
|
||||
#### Scenario: 查询存在的套餐
|
||||
- **WHEN** 管理员请求指定 ID 的套餐详情
|
||||
- **THEN** 系统返回该套餐的完整信息
|
||||
- **GIVEN** 数据库中存在套餐 ID=1
|
||||
- **WHEN** 管理员请求套餐详情
|
||||
- **THEN** 系统返回该套餐的完整信息,包含所有新增字段
|
||||
|
||||
#### Scenario: 查询不存在的套餐
|
||||
- **WHEN** 管理员请求不存在或已删除的套餐 ID
|
||||
- **GIVEN** 管理员请求套餐 ID=999,但套餐不存在
|
||||
- **WHEN** 提交查询请求
|
||||
- **THEN** 系统返回 "套餐不存在" 错误
|
||||
|
||||
#### Scenario: 响应包含周期类型信息
|
||||
- **GIVEN** 套餐 calendar_type=natural_month,duration_months=1
|
||||
- **WHEN** 管理员查询套餐详情
|
||||
- **THEN** 响应包含 calendar_type=natural_month,duration_months=1
|
||||
|
||||
#### Scenario: 响应包含流量重置周期信息
|
||||
- **GIVEN** 套餐 data_reset_cycle=monthly
|
||||
- **WHEN** 管理员查询套餐详情
|
||||
- **THEN** 响应包含 data_reset_cycle=monthly
|
||||
|
||||
#### Scenario: 响应包含实名激活配置
|
||||
- **GIVEN** 套餐 enable_realname_activation=true
|
||||
- **WHEN** 管理员查询套餐详情
|
||||
- **THEN** 响应包含 enable_realname_activation=true
|
||||
|
||||
---
|
||||
|
||||
### Requirement: 更新套餐
|
||||
|
||||
系统 SHALL 允许管理员更新套餐的基本信息。套餐编码创建后 MUST NOT 允许修改。
|
||||
系统 SHALL 允许管理员更新套餐的基本信息,**包括周期类型、流量重置周期、实名激活配置等新增字段**。套餐编码创建后 MUST NOT 允许修改。
|
||||
|
||||
#### Scenario: 成功更新套餐
|
||||
- **WHEN** 管理员提交有效的更新信息
|
||||
#### Scenario: 成功更新套餐基本信息
|
||||
- **GIVEN** 管理员更新套餐名称和价格
|
||||
- **WHEN** 提交更新请求
|
||||
- **THEN** 系统更新套餐记录,返回更新后的详情
|
||||
|
||||
#### Scenario: 尝试修改套餐编码
|
||||
- **WHEN** 管理员尝试修改套餐编码
|
||||
- **GIVEN** 管理员尝试修改套餐编码
|
||||
- **WHEN** 提交更新请求
|
||||
- **THEN** 系统忽略套餐编码字段,不进行修改
|
||||
|
||||
#### Scenario: 更新不存在的套餐
|
||||
- **WHEN** 管理员更新不存在的套餐
|
||||
- **GIVEN** 管理员更新套餐 ID=999,但套餐不存在
|
||||
- **WHEN** 提交更新请求
|
||||
- **THEN** 系统返回 "套餐不存在" 错误
|
||||
|
||||
#### Scenario: 关联不存在的套餐系列
|
||||
- **WHEN** 管理员将套餐关联到不存在的系列
|
||||
- **GIVEN** 管理员将套餐的 series_id 改为 999,但系列不存在
|
||||
- **WHEN** 提交更新请求
|
||||
- **THEN** 系统返回错误 "套餐系列不存在"
|
||||
|
||||
#### Scenario: 更新套餐周期类型(从自然月改为按天)
|
||||
- **GIVEN** 套餐当前 calendar_type=natural_month,duration_months=1
|
||||
- **WHEN** 管理员更新 calendar_type=by_day,duration_days=30
|
||||
- **THEN** 系统更新成功,calendar_type=by_day,duration_days=30
|
||||
|
||||
#### Scenario: 更新套餐周期类型(从按天改为自然月)
|
||||
- **GIVEN** 套餐当前 calendar_type=by_day,duration_days=30
|
||||
- **WHEN** 管理员更新 calendar_type=natural_month,duration_months=1
|
||||
- **THEN** 系统更新成功,calendar_type=natural_month,duration_months=1
|
||||
|
||||
#### Scenario: 更新周期类型但未提供对应时长字段
|
||||
- **GIVEN** 套餐当前 calendar_type=by_day
|
||||
- **WHEN** 管理员更新 calendar_type=natural_month,但未提供 duration_months
|
||||
- **THEN** 系统返回错误 "自然月套餐必须指定 duration_months"
|
||||
|
||||
#### Scenario: 更新 data_reset_cycle
|
||||
- **GIVEN** 套餐当前 data_reset_cycle=monthly
|
||||
- **WHEN** 管理员更新 data_reset_cycle=daily
|
||||
- **THEN** 系统更新成功,data_reset_cycle=daily
|
||||
|
||||
#### Scenario: 更新 enable_realname_activation
|
||||
- **GIVEN** 套餐当前 enable_realname_activation=true
|
||||
- **WHEN** 管理员更新 enable_realname_activation=false
|
||||
- **THEN** 系统更新成功,enable_realname_activation=false
|
||||
|
||||
---
|
||||
|
||||
### Requirement: 删除套餐
|
||||
|
||||
Reference in New Issue
Block a user