refactor(utils): 修复密码哈希比较逻辑错误 feat(user): 新增按状态筛选优惠券接口 docs: 添加虚拟发货与任务中心相关文档 fix(wechat): 修正Code2Session上下文传递问题 test: 补充订单折扣与积分转换测试用例 build: 更新配置文件与构建脚本 style: 清理多余的空行与注释
3.6 KiB
3.6 KiB
目标与原则
- 禁用“积分直接购买/抵扣”用于抽奖订单;保留积分兑换优惠券/商品能力。
- 优惠券支持“部分使用”,且订单累计抵扣≤总价的50%。
- 不新增任何新表:仅在
user_coupons增加一列balance_amount,订单侧复用orders.remark记录使用明细。
数据变更(最小)
user_coupons新增:balance_amount(分,默认NULL/0)。- 直减金额券:发券时初始化为模板面值;使用时扣减;余额为0时
status=2/used_at。 - 满减/折扣券:不产生余额(保持一次性)。
- 直减金额券:发券时初始化为模板面值;使用时扣减;余额为0时
- 不新增
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:110–176)
- 移除积分抵扣分支;
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:11–55)
- 直减券初始化
balance_amount=discount_value;其他类型balance_amount=NULL/0。
- 直减券初始化
- 退款(internal/api/admin/pay_refund_admin.go:189–228;internal/api/pay/wechat_notify.go:28–174)
- 解析
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:110–176。
- 发券:internal/service/user/coupon_add.go:11–55。
- 退款:internal/api/admin/pay_refund_admin.go:189–228;internal/api/pay/wechat_notify.go:28–174。
- 用户券模型:internal/repository/mysql/model/user_coupons.gen.go(新增
balance_amount)。