bindbox-game/.trae/documents/支付合规改造:禁用积分支付与优惠券50%封顶.md
邹方成 45815bfb7d chore: 清理无用文件与优化代码结构
refactor(utils): 修复密码哈希比较逻辑错误
feat(user): 新增按状态筛选优惠券接口
docs: 添加虚拟发货与任务中心相关文档
fix(wechat): 修正Code2Session上下文传递问题
test: 补充订单折扣与积分转换测试用例
build: 更新配置文件与构建脚本
style: 清理多余的空行与注释
2025-12-18 17:35:55 +08:00

56 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 目标与原则
- 禁用“积分直接购买/抵扣”用于抽奖订单;保留积分兑换优惠券/商品能力。
- 优惠券支持“部分使用”且订单累计抵扣≤总价的50%。
- 不新增任何新表:仅在`user_coupons`增加一列`balance_amount`,订单侧复用`orders.remark`记录使用明细。
## 数据变更(最小)
- `user_coupons`新增:`balance_amount`默认NULL/0
- 直减金额券发券时初始化为模板面值使用时扣减余额为0时`status=2/used_at`
- 满减/折扣券:不产生余额(保持一次性)。
- 不新增`order_coupons`表;订单使用明细写入`orders.remark`(结构化片段)。
## 使用明细编码remark复用
- 约定片段:`|c:<user_coupon_id>:<applied_amount>`,可重复出现多段代表多券。
- 示例票价50封顶25使用面值100券→`|c:12345:2500`单位分用户券余额从10000降至7500。
- 退款:解析`orders.remark`,逐段恢复对应`user_coupons.balance_amount += applied_amount`;余额>0则`status=1/clear used_at`
## 后端改动点
- 抽奖下单internal/api/activity/lottery_app.go:110176
- 移除积分抵扣分支;`order.PointsAmount`保持0新订单
- 计算`total``cap = total * rate(默认0.5)``remaining_cap = cap - order.DiscountAmount`
- 直减金额券:`applied = min(user_coupons.balance_amount, remaining_cap)`;更新`order.DiscountAmount/ActualAmount`,扣减余额并按规则更新`status/used_at`;在`orders.remark`追加`|c:<id>:<applied>`
- 满减/折扣券:计算规则折扣`rule_discount``applied = min(rule_discount, remaining_cap)`;一次性使用并在`remark`追加同样片段(余额不维护)。
- 券发放internal/service/user/coupon_add.go:1155
- 直减券初始化`balance_amount=discount_value`;其他类型`balance_amount=NULL/0`
- 退款internal/api/admin/pay_refund_admin.go:189228internal/api/pay/wechat_notify.go:28174
- 解析`orders.remark`恢复直减券余额与状态;同步回退`orders.discount_amount/ActualAmount`
## 配置与校验
- `coupons_max_discount_rate`默认0.5)。
- 兼容多券叠加:逐券按余额与剩余封顶扣减,超过封顶的券不使用;`remark`记录每次使用的`applied_amount`
## 前端改动
- 结算页:
- 展示“最多抵扣50%”;支持金额券余额显示与预估本次可抵扣金额。
- 当券面值大于封顶自动按封顶计算应付并提示“剩余XX元券余额保留”。
- 管理端订单详情:展示已应用的`c:<id>:<applied>`明细与用户券余额。
## 文档与错误码
- Swagger更新`/api/app/lottery/join`;保留/新增积分兑换券/商品接口文档。
- 错误码:`coupon_exceeds_cap``coupon_no_balance``insufficient_points``duplicate_redeem`
## 迁移与兼容
- 历史未使用直减券:初始化`balance_amount=discount_value`
- 已使用券:`balance_amount=0/NULL`
- 无新表;仅一列新增与`remark`编码扩展。
## 测试示例
- 面值100券、票价50、封顶25→应付25`remark``|c:<id>:2500`余额7500。
- 多券叠加至封顶;超过部分不使用;退款逐段恢复余额。
- 新订单不产生积分抵扣流水。
## 变更文件参考
- 抽奖下单internal/api/activity/lottery_app.go:110176。
- 发券internal/service/user/coupon_add.go:1155。
- 退款internal/api/admin/pay_refund_admin.go:189228internal/api/pay/wechat_notify.go:28174。
- 用户券模型internal/repository/mysql/model/user_coupons.gen.go新增`balance_amount`)。