## Why `tb_package_usage` 在套餐激活时只快照了套餐名称(`package_name`),未快照购买时的实付金额。导致 `GET /api/admin/assets/{id}/current-package` 和 `GET /api/admin/assets/{id}/packages` 两个接口无法返回价格信息,也无法在不 JOIN 订单表的情况下展示历史购买价格。 ## What Changes - **新增数据库字段**:`tb_package_usage.paid_amount BIGINT`,单位分,nullable,用于快照购买时的实付金额 - **新增数据库迁移**:`000129_add_paid_amount_to_package_usage`,含存量数据回填(通过 `order_id` JOIN `tb_order`) - **Model 更新**:`PackageUsage` 结构体新增 `PaidAmount *int64` 字段 - **写入点赋值(4处)**: - `internal/service/order/service.go` `activateMainPackage()` — 主套餐激活 - `internal/service/order/service.go` `activateAddonPackage()` — 加油包激活 - `internal/task/auto_purchase.go` `activateMainPackage()` — 自动购包主套餐 - `internal/task/auto_purchase.go` `activateAddonPackage()` — 自动购包加油包 - **DTO 更新**:`AssetPackageResponse` 新增 `PaidAmount *int64` 字段 - **Service 查询更新**:Asset Service 的 `GetCurrentPackage` 和 `GetPackages` 填充 DTO `PaidAmount` 字段 ## Capabilities ### New Capabilities - `package-usage-paid-amount-snapshot`:在套餐使用记录中快照购买实付金额,使资产套餐接口能直接返回购买价格,无需 JOIN 订单表 ### Modified Capabilities - `asset-queries`:套餐列表和当前套餐接口响应新增 `paid_amount` 字段 ## Impact **数据库** - `tb_package_usage` 新增字段 `paid_amount BIGINT`(nullable,存量回填) **代码** | 层级 | 文件 | 改动 | |------|------|------| | Model | `internal/model/package.go` | `PackageUsage` 新增 `PaidAmount *int64` | | Service(写) | `internal/service/order/service.go` | 主套餐 + 加油包激活各加一行赋值 | | Service(写) | `internal/task/auto_purchase.go` | 自动购包主套餐 + 加油包各加一行赋值 | | DTO | `internal/model/dto/asset_dto.go` | `AssetPackageResponse` 新增 `PaidAmount *int64` | | Service(读) | `internal/service/asset/service.go` | `GetCurrentPackage` + `GetPackages` 填充 DTO 字段 | | 迁移 | `migrations/000129_add_paid_amount_to_package_usage.{up,down}.sql` | 加字段 + 回填 | **API** - `GET /api/admin/assets/{id}/current-package`:响应新增 `paid_amount`(分) - `GET /api/admin/assets/{id}/packages`:响应 items 新增 `paid_amount`(分) **特殊情况** - 线下支付订单:`actual_paid_amount` 为 null,`paid_amount` 快照为 null(字段 nullable) - 存量 `order_id = 0` 的记录(企业无订单分配):回填为 null,字段保持 nullable