All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m17s
2.8 KiB
2.8 KiB
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字段;钱包扣款改用ActualPaidAmountclient-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 0tb_package_usage新增retail_amount BIGINT NULLABLE
代码:
internal/service/order/service.go:admin 下单逻辑中totalAmount始终用零售价,成本价只写ActualPaidAmount和OrderItem.CostPrice;钱包扣款改用ActualPaidAmountinternal/service/order/service.go:套餐激活时同步写入PackageUsage.RetailAmountinternal/task/auto_purchase.go:同步写入PackageUsage.RetailAmountinternal/service/asset/service.go:GetPackages/GetCurrentPackage接收调用方账号类型参数,按角色决定是否返回paid_amountinternal/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 回填存量数据