# Change: 支持套餐分配生效条件覆盖

## Why

代理套餐分配目前只能使用套餐本身的默认生效条件，运营无法针对某个店铺套餐授权选择购买即生效或实名即生效。分配页也无法区分套餐默认值、分配覆盖值和最终实际生效值，容易误解后续订单的生效规则。

## What Changes

- 在套餐授权/分配和已分配套餐编辑入口增加“生效条件”单选：跟随套餐默认、购买即生效、实名激活时生效。
- 新建分配时调用 `POST /api/admin/shop-package-allocations`，明确传递 `expiry_base_override`；选择“跟随套餐默认”时 MUST 显式传递 `null`，不得省略字段。
- 系列授权创建、系列授权新增套餐和批量套餐分配时，均 MUST 显式传递 `expiry_base_override`；该配置只作用于本次新建分配。
- 已分配套餐修改生效条件时调用 `PATCH /api/admin/shop-package-allocations/{id}/expiry-base`，请求体为 `expiry_base_override:null|from_purchase|from_activation`。
- 在分配详情、编辑弹框和代理系列授权套餐列表展示后端返回的默认生效条件、覆盖生效条件和最终生效条件的中文名称。
- 修改弹框提示“仅影响后续新订单，不影响已购买套餐”。
- 前端不根据默认值和覆盖值自行计算最终生效条件，直接使用后端返回的 `effective_expiry_base` 及其名称字段。

## Impact

- Affected specs:
  - `shop-package-allocation`
  - `shop-series-grant-packages`
- Affected code:
  - `src/types/api/packageManagement.ts`
  - 新增或扩展 `src/api/modules` 中的店铺套餐分配服务
  - `src/views/package-management/series-grants/index.vue`
  - `src/views/package-management/series-grants/packages.vue`
  - `src/views/package-management/series-grants/detail.vue`
- API contracts:
  - `POST /api/admin/shop-package-allocations`
  - `PATCH /api/admin/shop-package-allocations/{id}/expiry-base`
  - `POST /api/admin/shop-series-grants`
  - `PUT /api/admin/shop-series-grants/{id}/packages`
  - `POST /api/admin/shop-package-batch-allocations`
- Out of scope:
  - 已购买套餐或历史订单的生效条件迁移
  - 前端根据分配字段推导或覆盖实际生效条件
