# Package Management Specification

## ADDED Requirements

### Requirement: 套餐列表查询

系统 SHALL 提供套餐列表查询功能，支持分页和多条件筛选。

#### Scenario: 查询所有套餐

- **WHEN** 用户访问套餐管理页面
- **THEN** 系统显示套餐列表，包含套餐编码、套餐名称、系列ID、套餐类型、流量、价格、状态、上架状态等
- **AND** 支持按套餐名称模糊搜索
- **AND** 支持按系列ID筛选
- **AND** 支持按状态筛选（启用/禁用）
- **AND** 支持按上架状态筛选（上架/下架）
- **AND** 支持按套餐类型筛选（formal/addon）
- **AND** 支持分页，每页最多100条记录

#### Scenario: 多条件组合查询

- **WHEN** 用户同时使用多个筛选条件
- **THEN** 系统返回满足所有条件的套餐列表

### Requirement: 创建套餐

系统 SHALL 允许管理员创建新的套餐。

#### Scenario: 成功创建套餐

- **WHEN** 用户填写必填字段（套餐编码、套餐名称、套餐类型、套餐时长、套餐价格）
- **AND** 可选填写系列ID、流量信息、成本价、建议售价等
- **AND** 提交表单
- **THEN** 系统创建套餐，默认状态为启用，默认上架状态为下架
- **AND** 返回创建的套餐详情

#### Scenario: 套餐编码唯一性验证

- **WHEN** 用户使用已存在的套餐编码创建套餐
- **THEN** 系统返回错误提示"套餐编码已存在"

#### Scenario: 验证套餐时长范围

- **WHEN** 套餐时长小于1个月或大于120个月
- **THEN** 系统返回验证错误"套餐时长必须在1-120个月之间"

#### Scenario: 流量类型与流量额度关系

- **WHEN** 流量类型为真流量（real）
- **THEN** 真流量额度（real_data_mb）必须大于0
- **AND** 总流量额度（data_amount_mb）等于真流量额度

- **WHEN** 流量类型为虚流量（virtual）
- **THEN** 虚流量额度（virtual_data_mb）必须大于0
- **AND** 真流量额度和虚流量额度之和等于总流量额度

### Requirement: 查看套餐详情

系统 SHALL 允许用户查看单个套餐的详细信息。

#### Scenario: 查询存在的套餐

- **WHEN** 用户通过套餐ID查询详情
- **THEN** 系统返回该套餐的完整信息，包括所有字段

#### Scenario: 查询不存在的套餐

- **WHEN** 用户查询不存在的套餐ID
- **THEN** 系统返回404错误

### Requirement: 更新套餐

系统 SHALL 允许管理员更新套餐信息。

#### Scenario: 成功更新套餐

- **WHEN** 用户修改套餐的可变字段（名称、时长、价格、流量等）
- **AND** 提交更新
- **THEN** 系统更新套餐信息
- **AND** 返回更新后的套餐详情

#### Scenario: 套餐编码不可修改

- **WHEN** 用户尝试修改套餐编码
- **THEN** 系统忽略该字段，不允许修改

### Requirement: 删除套餐

系统 SHALL 允许管理员删除套餐。

#### Scenario: 成功删除套餐

- **WHEN** 用户删除未被使用的套餐
- **THEN** 系统删除该套餐
- **AND** 返回成功状态

#### Scenario: 删除被分配的套餐

- **WHEN** 用户删除已被分配给代理商的套餐
- **THEN** 系统返回错误提示"该套餐已被分配，无法删除"

### Requirement: 套餐状态管理

系统 SHALL 支持套餐启用/禁用状态管理。

#### Scenario: 启用套餐

- **WHEN** 用户将禁用状态的套餐切换为启用
- **THEN** 系统更新状态为启用（status=1）

#### Scenario: 禁用套餐

- **WHEN** 用户将启用状态的套餐切换为禁用
- **THEN** 系统更新状态为禁用（status=2）
- **AND** 该套餐将不可用于新的分配或充值

### Requirement: 套餐上架状态管理

系统 SHALL 支持套餐上架/下架状态管理。

#### Scenario: 上架套餐

- **WHEN** 用户将下架状态的套餐切换为上架
- **THEN** 系统更新上架状态为上架（shelf_status=1）
- **AND** 该套餐将对代理商可见

#### Scenario: 下架套餐

- **WHEN** 用户将上架状态的套餐切换为下架
- **THEN** 系统更新上架状态为下架（shelf_status=2）
- **AND** 该套餐将对代理商不可见

### Requirement: 套餐类型支持

系统 SHALL 支持两种套餐类型。

#### Scenario: 正式套餐

- **WHEN** 创建套餐类型为 formal 的套餐
- **THEN** 系统记录为正式套餐

#### Scenario: 附加套餐

- **WHEN** 创建套餐类型为 addon 的套餐
- **THEN** 系统记录为附加套餐

### Requirement: 权限控制

系统 SHALL 对套餐管理功能实施权限控制。

#### Scenario: 未认证用户访问

- **WHEN** 未登录用户访问套餐管理接口
- **THEN** 系统返回401未认证错误

#### Scenario: 无权限用户访问

- **WHEN** 已登录但无权限的用户访问套餐管理接口
- **THEN** 系统返回403无权访问错误
