bindbox-game/.trae/documents/订单详情枚举展示与退款流程完善方案.md
邹方成 6ee627139c
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 40s
feat: 新增支付测试小程序与微信支付集成
feat(pay): 添加支付API基础结构
feat(miniapp): 创建支付测试小程序页面与配置
feat(wechatpay): 配置微信支付参数与证书
fix(guild): 修复成员列表查询条件
docs: 更新代码规范文档与需求文档
style: 统一前后端枚举显示与注释格式
refactor(admin): 重构用户奖励发放接口参数处理
test(title): 添加称号效果参数验证测试
2025-11-17 00:42:08 +08:00

4.5 KiB
Raw Blame History

目标

  • 列表与详情页统一显示“用户、状态、来源、发货状态”等中文枚举名称
  • 在订单详情提供“退款”入口(支持全额/部分退款),并完善数据还原(积分、库存/履约、优惠券)与幂等、校验流程
  • 支持用户发起退款申请→后台审核→执行退款的闭环

前端改造

枚举与显示

  • 新增/复用前端常量映射:
    • 订单状态:{1: 待支付, 2: 已支付, 3: 已取消, 4: 已退款}
    • 来源类型:{1: 商城直购, 2: 抽奖票据, 3: 其他}
    • 发货状态:{1: 待发货, 2: 已发货, 3: 已签收, 4: 异常}
    • 抽奖结果:is_winner(0/1)→否/是level(1/2/3)→S/A/B
  • 列表与详情使用映射显示中文名;用户信息显示 nickname(无则显示 用户ID

退款入口与交互

  • 详情页添加“退款”按钮:显示可退款金额(默认 actual_amount)、支持部分退款(输入退款金额与原因)
  • 提交后刷新详情;在详情页增加“退款记录”区块,显示每笔退款状态与时间、原因
  • 禁用策略:
    • 已取消或已退款不可再次退款
    • 货已签收或虚拟已履约需走人工审批(按钮灰显或改为“申请退款”)

后端接口与流程

管理端

  • 创建退款:POST /api/admin/pay/refunds
    • 入参:order_no, amount, reason
    • 校验:订单存在且status=2amount>0 && <= 未退款余额
    • 幂等:生成refund_no唯一;重复请求返回既有状态
    • 执行:
      • 微信真实退款:调用/v3/refund/domestic/refunds(成功→记录到payment_refunds并落账)
      • 数据还原:
        • 积分:写 user_points_ledger(action=refund_restore, points=points_amount)(按原抵扣金额,部分退款按比例/策略)
        • 虚拟履约:若is_consumed=1且可撤销,标记撤销或新建“撤销记录”;否则保留人工处理标记
        • 发货:如已发/已签收不自动撤销,标记异常并提示人工流程(退货入库)
      • 订单状态:
        • 全额退款→置status=4已退款
        • 部分退款→保持status=2已支付,记录累计退款额(在payment_refunds中维护)
  • 查询退款:GET /api/admin/pay/refundsGET /api/admin/pay/refunds/:refund_no
  • 在订单详情接口增加退款列表聚合(展示退款记录)

用户端退款(申请→审核→执行)

  • 用户申请:POST /api/app/orders/:order_no/refund/apply(金额与原因)
  • 管理端审核:POST /api/admin/pay/refunds/:refund_no/approve | /reject
  • 审核通过→执行退款(同管理端创建退款);拒绝→记录原因

数据模型建议(支付域)

  • payment_refundsrefund_no唯一,order_id/order_no/channel/status(submitted/success/abnormal/closed), amount_refund, reason, success_time, raw
  • 在现有orders保持order_no唯一;在退款、通知增加幂等校验(refund_no/notify_id

校验与边界

  • 金额单位统一“分”;仅信任后端计算出的可退余额
  • 订单来源:抽奖类订单(source_type=2)需校验抽奖资产状态(user_inventory)是否可撤销
  • 已签收/履约完成:默认不自动撤销,需人工处理或审批流;在系统中标注并可导出

幂等与一致性

  • 退款:refund_no唯一;重复请求返回现有记录
  • 回调解密与验签:使用 SDK notify.Handler;退款结果通过回调或主动查询推进记录状态
  • 状态推进使用事务与条件更新(如WHERE status=2)保证并发安全

前端展示增强(详情)

  • 信息区块:订单、活动、付款、订单项、发货、积分、退款记录
  • 显示中文枚举;金额统一格式化(分→元)或保留分展示
  • 退款弹窗:输入金额/原因;显示可退款上限与提示规则(履约/签收需审批)

验收标准

  • 列表与详情均显示中文枚举;详情展示活动与付款信息完整
  • 管理端可创建退款并正确落账(占位或真实接入);用户申请退款可走审批流程
  • 幂等与边界校验完善;构建与联调通过

实施步骤

  1. 前端:新增枚举常量并替换列表/详情的显示;详情页加退款按钮与退款记录展示
  2. 后端:完善退款创建与查询接口、数据还原逻辑与幂等;补充详情接口聚合退款记录
  3. 用户端:新增退款申请与后台审核接口(可按你需求分阶段)
  4. 测试与联调:金额/并发/履约/签收边界;通知与查询兜底