## Context 套餐使用记录已有 `master_usage_id`,不能为展示重复存储关系。 ## Decisions - 查询批量读取资产全部套餐使用,按 `master_usage_id` 内存分组并稳定排序。 - 不改变套餐状态、金额或生命周期;缺失主记录只形成读模型异常项。 ## 查询与响应契约 - 后台资产详情及 H5 `GET /api/c/v1/asset/package-history` 保持既有资产权限、分页和套餐字段;不新增写接口、迁移、关联表或状态变更。查询需在资产范围内一次读取该资产全部相关 `PackageUsage`,不能按每个主套餐逐条查询加油包。 - 响应主项包含原套餐使用字段、`children` 加油包数组和 `expand_by_default`;主项 `master_usage_id` 必须为 `null`。子项保留自身 `package_usage_id`、`master_usage_id`、状态、购买创建时间、生效时间和原历史字段。 - 以 `master_usage_id IS NULL` 的记录为主套餐;关联存在的加油包嵌入对应主项。已生效加油包先按生效时间正序,待生效加油包后按购买创建时间正序;排序字段相同再按 `package_usage_id` 正序,保证后台和 H5 一致。 - 主套餐只要有一个关联子项即 `expand_by_default=true`;无子项为 `false`。主套餐、子项失效、过期、用尽、退款或历史状态均不得删除或改写层级。 - 加油包的 `master_usage_id` 指向物理不存在记录时,返回顶层异常项:保留原字段、`relationship_status=master_missing`、`relationship_status_name=关联主套餐缺失`、`children=[]`、`expand_by_default=false`;不得猜测替代主套餐或丢弃该项。 ## Verification 验证多主套餐、待生效/失效加油包、缺失主记录、后台/H5 数据范围和分页。