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

74 lines
4.5 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.

## 目标
- 列表与详情页统一显示“用户、状态、来源、发货状态”等中文枚举名称
- 在订单详情提供“退款”入口(支持全额/部分退款),并完善数据还原(积分、库存/履约、优惠券)与幂等、校验流程
- 支持用户发起退款申请→后台审核→执行退款的闭环
## 前端改造
### 枚举与显示
- 新增/复用前端常量映射:
- 订单状态:`{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=2``amount>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/refunds``GET /api/admin/pay/refunds/:refund_no`
- 在订单详情接口增加退款列表聚合(展示退款记录)
### 用户端退款(申请→审核→执行)
- 用户申请:`POST /api/app/orders/:order_no/refund/apply`(金额与原因)
- 管理端审核:`POST /api/admin/pay/refunds/:refund_no/approve | /reject`
- 审核通过→执行退款(同管理端创建退款);拒绝→记录原因
## 数据模型建议(支付域)
- `payment_refunds``refund_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. 测试与联调:金额/并发/履约/签收边界;通知与查询兜底