# 套餐价格回退与平台赠送策略功能总结 ## 1. 变更背景 本次改动解决了套餐价格语义长期混用的问题: - 普通可售套餐在建议零售价未配置时,会自动回退到成本价作为生效售价 - 赠送套餐不再通过 `0` 价临时猜语义,而是使用独立赠送标记 - 赠送套餐仅允许平台后台通过创建订单进行发放,不能进入代理分配、C 端购买或自动购包链路 ## 2. 核心规则 ### 2.1 价格配置状态 新增统一价格配置状态: - `0`:未配置 - `1`:赠送 0 价 - `2`:已配置非 0 普通可售套餐: - 建议售价留空 → 视为未配置,销售链路按成本价生效 - 建议售价填非 0 → 按原值生效 - 建议售价显式填 `0` → 拒绝保存 赠送套餐: - 必须显式配置 `0` - 仅平台可创建和维护 ### 2.2 后台套餐管理 后台创建、编辑、详情、列表现在同时返回: - 原始建议售价(未配置时为空) - 价格配置状态 - 是否赠送套餐 同时保留生效价字段,供销售链路或只读展示使用,但不会回写覆盖原始配置值。 ### 2.3 C 端与销售链路 以下链路统一改为使用生效售价: - C 端可购买套餐列表 - C 端下单 - 后台订单创建 - 自动购包 赠送套餐会被以下链路拦截或隐藏: - C 端可购列表 - H5/客户端购买 - 自动购包 - 代理授权与批量分配 ### 2.4 后台发放口径 “发放”统一解释为**平台后台创建订单**。 - 赠送套餐只能通过后台创建订单进入资产 - 赠送订单仅允许平台侧发起 - 赠送订单不要求线下支付凭证 - 赠送加油包仍然要求目标资产先存在主套餐 ## 3. 数据库变更 迁移版本:`000139_add_package_price_status_and_gift_policy` 主要新增: - `tb_package.price_config_status` - `tb_package.is_gift` - `tb_shop_package_allocation.retail_price_config_status` - `tb_order_item.package_price_config_status` - `tb_order_item.package_is_gift` - `tb_package_usage.package_price_config_status` - `tb_package_usage.package_is_gift` - `tb_package_price_review_queue` ## 4. 历史数据回填策略 - 历史非 0 建议售价 → 回填为“已配置非 0” - 历史 `0` 且满足“后台创建订单 0 元成交,且未进入代理分配” → 回填为赠送套餐 - 其余历史 `0` → 回填为未配置;若无法确认语义,则进入 `tb_package_price_review_queue` ## 5. 影响范围 主要涉及: - `internal/service/package/service.go` - `internal/service/purchase_validation/service.go` - `internal/service/order/service.go` - `internal/service/client_order/service.go` - `internal/task/auto_purchase.go` - `internal/handler/app/client_asset.go` - `internal/service/shop_series_grant/service.go` - `internal/service/shop_package_batch_allocation/service.go` ## 6. 验证方式 本次变更按项目约束使用以下方式验证: - `lsp_diagnostics` 静态诊断 - `make migrate-up` 迁移执行 - PostgreSQL 只读查询验证字段、默认值和回填结果 - 后续手工回归按《最终验收清单》执行