## MODIFIED Requirements ### Requirement: 创建代理系列授权时提交初始套餐 系统 SHALL 在创建代理系列授权时要求提交 `packages`,且 `packages` 必须包含 1~100 个套餐项;套餐 ID 不得重复。创建成功响应 SHALL 保持完整授权详情结构不变。 #### Scenario: 创建授权并提交有效初始套餐 - **WHEN** 用户提交 `shop_id`、`series_id` 和包含 1~100 个不重复套餐项的 `packages` - **THEN** 前端提交 `POST /api/admin/shop-series-grants` - **AND** 每个套餐项携带必要的 `package_id`,新增或调价时携带 `cost_price` - **AND** 页面按接口返回的完整授权详情刷新授权信息 #### Scenario: 创建授权未选择套餐 - **WHEN** 用户未选择任何初始套餐 - **THEN** 前端阻止提交并提示至少选择 1 个套餐 #### Scenario: 创建授权超过套餐数量上限或包含重复套餐 - **WHEN** 用户选择超过 100 个套餐或同一 `package_id` 重复出现 - **THEN** 前端阻止提交并提示套餐数量或重复项错误 ### Requirement: 合并套餐候选与授权状态 系统 SHALL 在套餐列表和授权详情相关页面以 `package_id` 为唯一键合并套餐候选数据与授权详情中的 `packages[]`。已授权套餐即使不在当前候选搜索结果中,也 SHALL 保留并标记为已授权。 #### Scenario: 候选套餐与已授权套餐合并 - **WHEN** 套餐候选列表和授权详情均加载成功 - **THEN** 页面按 `package_id` 合并两者 - **AND** 详情中的套餐显示为已授权并保留其成本价、生效条件和状态字段 - **AND** 仅出现在候选列表中的套餐显示为未授权候选 #### Scenario: 候选搜索结果不包含已授权套餐 - **WHEN** 当前候选搜索结果缺少某个已授权套餐 - **THEN** 页面仍从授权详情保留该套餐 - **AND** 不将其误判为未授权或从当前编辑状态中删除 ### Requirement: 后续套餐管理使用批量操作删除 系统 SHALL 使用 `PUT /api/admin/shop-series-grants/{id}/packages` 管理既有授权套餐。新增和调价提交套餐项,删除套餐授权 SHALL 提交对应套餐项的 `remove: true`;操作成功后 SHALL 按接口返回的完整授权详情刷新页面。 #### Scenario: 新增或调整授权套餐 - **WHEN** 用户在已有授权中新增套餐或调整成本价 - **THEN** 前端提交 `packages[]` 中对应的套餐项及成本价 - **AND** 不调用独立删除接口 #### Scenario: 删除授权套餐 - **WHEN** 用户删除已有授权套餐 - **THEN** 前端提交 `{ package_id, remove: true }` - **AND** 页面使用接口返回的完整授权详情刷新套餐列表 #### Scenario: 套餐管理响应结构保持不变 - **WHEN** 套餐批量管理接口成功 - **THEN** 前端按详情响应读取授权基本信息、佣金配置、强充配置、`packages[]`、状态和时间字段 - **AND** 不要求后端返回新的响应包装结构