## Why 后台代购/钱包支付场景下,`Order.TotalAmount` 被覆盖为成本价,导致 C 端订单列表和详情展示的是成本价(甚至 0 元),而非客户应看到的零售售价。同时,`/api/admin/assets/{identifier}/packages` 和 `/api/admin/assets/{identifier}/current-package` 两个接口的套餐价格字段(`paid_amount`)对所有后台账号一视同仁地返回成本价,非平台账号(代理商)不应看到平台进货成本。 ## What Changes - **修正 `Order.TotalAmount` 语义**:始终存储零售价(客户面值),不再被成本价覆盖 - **修正 `Order.ActualPaidAmount` 语义**:存储实际支付的成本价,钱包扣款改用此字段 - **新增 `OrderItem.CostPrice` 字段**:在 `tb_order_item` 存储成本单价快照,零售单价保留在 `UnitPrice` - **新增 `PackageUsage.RetailAmount` 字段**:在 `tb_package_usage` 快照零售价,来源为 `order.TotalAmount`;现有 `PaidAmount` 继续快照成本价(来源为 `order.ActualPaidAmount`) - **资产套餐接口按角色过滤**:`/packages` 和 `/current-package` 对非平台账号隐藏 `paid_amount`(成本价),仅返回 `retail_amount`(零售价);平台账号两个字段均返回 ## Capabilities ### New Capabilities 无新增 Capability。 ### Modified Capabilities - `admin-order-creation`:`TotalAmount` 语义修正为零售价;新增 `OrderItem.CostPrice` 字段;钱包扣款改用 `ActualPaidAmount` - `client-order-purchase`:C 端订单列表/详情的 `total_amount` 和套餐 `price` 字段改为展示零售价 - `package-usage-paid-amount-snapshot`:新增 `RetailAmount` 字段快照零售价;`PaidAmount` 继续快照成本价;资产套餐接口按调用方角色决定是否返回 `paid_amount` ## Impact **数据库**: - `tb_order_item` 新增 `cost_price BIGINT NOT NULL DEFAULT 0` - `tb_package_usage` 新增 `retail_amount BIGINT NULLABLE` **代码**: - `internal/service/order/service.go`:admin 下单逻辑中 `totalAmount` 始终用零售价,成本价只写 `ActualPaidAmount` 和 `OrderItem.CostPrice`;钱包扣款改用 `ActualPaidAmount` - `internal/service/order/service.go`:套餐激活时同步写入 `PackageUsage.RetailAmount` - `internal/task/auto_purchase.go`:同步写入 `PackageUsage.RetailAmount` - `internal/service/asset/service.go`:`GetPackages` / `GetCurrentPackage` 接收调用方账号类型参数,按角色决定是否返回 `paid_amount` - `internal/handler/admin/asset.go`:传入调用方账号类型 - `internal/model/dto/asset_dto.go`:`AssetPackageResponse` 新增 `RetailAmount` 字段 - `internal/model/order.go`:`OrderItem` 新增 `CostPrice` 字段 - `internal/model/package.go`:`PackageUsage` 新增 `RetailAmount` 字段 **迁移**:需要两条迁移 SQL 回填存量数据