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

3.6 KiB
Raw Blame History

目标与原则

  • 禁用“积分直接购买/抵扣”用于抽奖订单;保留积分兑换优惠券/商品能力。
  • 优惠券支持“部分使用”且订单累计抵扣≤总价的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新订单
    • 计算totalcap = 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_discountapplied = 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_capcoupon_no_balanceinsufficient_pointsduplicate_redeem

迁移与兼容

  • 历史未使用直减券:初始化balance_amount=discount_value
  • 已使用券:balance_amount=0/NULL
  • 无新表;仅一列新增与remark编码扩展。

测试示例

  • 面值100券、票价50、封顶25→应付25remark|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)。