# 02 — 编辑已有分配的生效条件覆盖

**What to build:** 运营人员可以修改已有套餐分配的生效条件覆盖，或通过显式 JSON `null` 恢复跟随套餐默认。重复设置相同值按幂等成功处理；修改完成后重新读取并展示后端计算的有效值，同时明确告知该操作只影响后续购买，不改变任何已购买套餐。

**Blocked by:** `.scratch/ur55-package-expiry-base/issues/01-create-allocation-expiry-base-override.md` — 01 — 创建套餐分配时固化生效条件选择

**Status:** completed

- [x] 架构主通道为简单写，读取投影使用 Query 或现有只读门面；完整收口单条分配覆盖值修改，不扩展为批量修改或迁移套餐默认配置接口。
- [x] 提供修改单条套餐分配生效条件覆盖的后台 PATCH 接口，请求必须包含覆盖字段，并能区分字段缺失与显式 JSON `null`。
- [x] 接口仅接受 `null`、`from_purchase`、`from_activation`；`null` 恢复跟随默认，非法值和字段缺失统一返回参数错误。
- [x] 分配不存在、已软删除或越权时遵守统一防越权错误语义，不向调用方区分无权限与资源不存在。
- [x] 重复提交当前值按幂等成功处理，不修改已有套餐使用记录，也不产生与实际变更不符的业务副作用。
- [x] 修改成功后响应或重新查询结果包含默认值、覆盖值、最终有效值及其中文名称，最终值始终由后端计算。
- [x] 敏感配置变更写入统一审计，记录操作人、变更前后覆盖值及分配标识，但不把底层错误或无权资源信息暴露给客户端。
- [x] 前端编辑区域显示“仅影响后续新订单，不影响已购买套餐”，成功后重新拉取分配详情，不在本地推导最终有效值。
- [x] HTTP 集成测试覆盖两个覆盖值、显式恢复默认、字段缺失、非法值、不存在、软删除、越权、重复 PATCH 幂等及已购买记录不变。
