# package-usage-paid-amount-snapshot Specification ## Purpose 在套餐使用记录(`tb_package_usage`)创建时,快照购买该套餐对应订单的实付金额,使资产套餐接口能直接返回购买价格,无需 JOIN 订单表。 ## Requirements ### Requirement: 套餐使用记录快照实付金额 系统 SHALL 在创建 `PackageUsage` 记录时,将购买该套餐对应订单的实付金额(`tb_order.actual_paid_amount`)快照至 `tb_package_usage.paid_amount` 字段,单位为分(人民币)。 **字段规范**: - 数据库字段:`paid_amount BIGINT NULLABLE` - Go 字段:`PaidAmount *int64`(单位:分) - 赋值来源:`order.ActualPaidAmount`,直接赋值,不转换 - 为 null 的情况:线下支付(无实际收款)或无订单关联的企业分配套餐 **覆盖范围(所有 PackageUsage 写入点)**: - `internal/service/order/service.go` `activateMainPackage()` - `internal/service/order/service.go` `activateAddonPackage()` - `internal/task/auto_purchase.go` `activateMainPackage()` - `internal/task/auto_purchase.go` `activateAddonPackage()` **存量数据**:通过迁移 SQL `UPDATE tb_package_usage SET paid_amount = o.actual_paid_amount FROM tb_order o WHERE pu.order_id = o.id AND pu.order_id != 0` 回填,`order_id = 0` 的记录保持 null。 #### Scenario: 钱包支付套餐激活时快照实付金额 - **WHEN** 用户以钱包支付购买套餐,订单 `actual_paid_amount = 9900`(分) - **THEN** 激活生成的 `PackageUsage.paid_amount = 9900` #### Scenario: 微信支付回调后激活套餐时快照实付金额 - **WHEN** 微信支付回调触发 `HandlePaymentCallback`,`actual_paid_amount = 19900`,随后调用 `activatePackage` - **THEN** 生成的 `PackageUsage.paid_amount = 19900` #### Scenario: 线下支付套餐激活时 paid_amount 为 null - **WHEN** 管理员以线下支付方式为客户激活套餐,`order.actual_paid_amount = nil` - **THEN** `PackageUsage.paid_amount = nil`,接口响应中 `paid_amount` 字段缺省(omitempty) #### Scenario: 自动购包任务激活套餐时快照实付金额 - **WHEN** C 端钱包充值触发 `auto_purchase` 任务,自动购买套餐,扣款 `paidAmount = 5900` - **THEN** 激活生成的 `PackageUsage.paid_amount = 5900` #### Scenario: 加油包激活时独立快照实付金额 - **WHEN** 用户购买加油包,对应订单 `actual_paid_amount = 2900` - **THEN** 加油包 `PackageUsage.paid_amount = 2900`,与主套餐的 `paid_amount` 相互独立