# Delta Spec: device-series-bindng

## MODIFIED Requirements

### Requirement: 批量设置设备的套餐系列

系统 SHALL 允许代理批量为设备设置套餐系列。只能设置平台已启用的套餐系列，且代理必须有该系列的权限。

#### Scenario: 成功批量设置
- **WHEN** 代理提交多个设备 ID 和一个有效的 series_id
- **THEN** 系统更新这些设备的 series_id 字段

#### Scenario: 系列不存在
- **WHEN** 代理尝试设置一个不存在的系列 ID
- **THEN** 系统返回错误 "套餐系列不存在"

#### Scenario: 系列已禁用
- **WHEN** 代理尝试设置一个已禁用的套餐系列
- **THEN** 系统返回错误 "套餐系列已禁用"

#### Scenario: 代理无权限设置该系列
- **WHEN** 代理尝试设置一个未分配给自己店铺的系列
- **THEN** 系统返回错误 "您没有权限分配该套餐系列"

#### Scenario: 设备不存在
- **WHEN** 提交的设备 ID 中有不存在的设备
- **THEN** 系统返回错误，列出不存在的设备 ID

#### Scenario: 设备不属于当前店铺
- **WHEN** 代理尝试设置不属于自己店铺的设备
- **THEN** 系统返回错误 "无权操作该设备"

---

### Requirement: 清除设备的套餐系列关联

系统 SHALL 允许代理清除设备的套餐系列关联（将 series_id 设为 0）。

#### Scenario: 清除单设备关联
- **WHEN** 代理将设备的 series_id 设为 0
- **THEN** 系统清除该设备的套餐系列关联

#### Scenario: 批量清除关联
- **WHEN** 代理批量提交设备 ID 列表，series_id 为 0
- **THEN** 系统清除这些设备的套餐系列关联

---

### Requirement: 查询设备的套餐系列信息

系统 SHALL 在设备详情和列表中返回套餐系列关联信息。

#### Scenario: 设备详情包含系列信息
- **WHEN** 查询设备详情
- **THEN** 响应包含 series_id、关联的系列名称、佣金状态

#### Scenario: 设备列表支持按系列筛选
- **WHEN** 代理按 series_id 筛选设备列表
- **THEN** 系统只返回关联该系列的设备

---

### Requirement: Device 模型字段定义

系统 MUST 在 Device 模型中包含以下字段：
- `series_id`：套餐系列 ID（直接关联到 PackageSeries）
- `first_commission_paid`：一次性佣金是否已发放（默认 false）
- `accumulated_recharge`：累计充值金额（默认 0）

#### Scenario: 新设备默认值
- **WHEN** 创建新设备
- **THEN** series_id 为空，first_commission_paid 为 false，accumulated_recharge 为 0

#### Scenario: 字段在响应中可见
- **WHEN** 查询设备信息
- **THEN** 响应包含这三个字段

---

### Requirement: 设备级套餐购买使用 series_id

设备购买套餐时 MUST 使用 `device.series_id` 确定可购买的套餐系列。

#### Scenario: 设备有系列关联
- **WHEN** 设备的 series_id 为 5，用户购买 series_id 为 5 的套餐
- **THEN** 系统允许购买

#### Scenario: 设备未绑定系列
- **WHEN** 设备的 series_id 为空
- **THEN** 该设备无法购买设备级套餐，系统返回错误 "该设备未关联套餐系列，无法购买套餐"

#### Scenario: 套餐不属于设备的系列
- **WHEN** 设备的 series_id 为 5，用户购买 series_id 为 8 的套餐
- **THEN** 系统返回错误 "套餐不在可购买范围内"

---

## ADDED Requirements

### Requirement: 购买验证直接使用 series_id

系统 MUST 在验证设备购买套餐时，直接使用 `device.series_id` 验证套餐是否属于该系列，不再依赖设备下卡的 series_id。

#### Scenario: 设备和卡的系列不同
- **WHEN** 设备的 series_id 为 5，设备下的卡的 series_id 为 8
- **THEN** 购买设备级套餐时，系统使用设备的 series_id（5），忽略卡的 series_id

#### Scenario: 设备有系列，卡无系列
- **WHEN** 设备的 series_id 为 5，设备下的卡的 series_id 为空
- **THEN** 设备仍然可以购买 series_id 为 5 的设备级套餐

---

### Requirement: 返佣查询使用 (shop_id, series_id)

系统 MUST 在计算返佣时，通过 `(shop_id, series_id)` 查询 `ShopSeriesAllocation` 获取返佣配置。

#### Scenario: 店铺有系列权限
- **WHEN** 设备的 shop_id 为 10，series_id 为 5，且存在 ShopSeriesAllocation(shop_id=10, series_id=5)
- **THEN** 系统使用该分配记录的返佣配置计算佣金

#### Scenario: 店铺无系列权限
- **WHEN** 设备的 shop_id 为 10，series_id 为 5，但不存在对应的 ShopSeriesAllocation
- **THEN** 系统不计算返佣（个人客户场景或未分配系列）

#### Scenario: 个人客户无返佣
- **WHEN** 设备的 shop_id 为空（个人客户），series_id 为 5
- **THEN** 系统不查询 ShopSeriesAllocation，不计算返佣
