🔄 退款/售后系统设计
本章详述即时配送小程序的退款与售后流程,包括:用户取消、客服退款、异常订单处理、退款规则、数据表结构,以及管理端退款审核功能。
退款安全
T+1到账
原路退回
退款原则:退款必须原路退回,确保资金安全;退款申请需审核,异常订单由客服介入处理;退款后需更新相关业务状态(订单、优惠券、积分等)。
一、退款流程详细时序图
1.1 用户取消订单(未接单)
sequenceDiagram
participant U as 用户
participant APP as 小程序
participant API as 后端服务
participant PAY as 微信支付
participant DB as 数据库
U->>APP: 申请取消订单
APP->>API: 提交取消申请
API->>DB: 检查订单状态
DB-->>API: 状态=待接单,可取消
API->>PAY: 申请退款(按原路退回)
PAY-->>API: 退款成功
API->>DB: 更新订单状态(已取消)
API->>DB: 退还优惠券(如已使用)
API->>DB: 退还积分(如已赠送)
API-->>APP: 退款成功
APP-->>U: 展示取消成功
1.2 骑手已接单后取消
sequenceDiagram
participant U as 用户
participant APP as 小程序
participant API as 后端服务
participant C as 骑手
participant PAY as 微信支付
participant DB as 数据库
U->>APP: 申请取消(骑手已接单)
APP->>API: 提交取消申请
API->>DB: 检查订单状态
DB-->>API: 状态=已接单
API->>C: 推送取消请求
C->>API: 同意/拒绝取消
alt 骑手同意
API->>PAY: 申请退款
PAY-->>API: 退款成功
API->>DB: 更新订单+记录原因
API-->>APP: 取消成功
else 骑手拒绝
API-->>APP: 取消被拒绝
APP-->>U: 展示骑手拒绝原因
end
1.3 客服/后台取消
sequenceDiagram
participant CS as 客服
participant ADMIN as 管理端
participant API as 后端服务
participant PAY as 微信支付
participant DB as 数据库
participant U as 用户
CS->>ADMIN: 查询异常订单
ADMIN->>API: 获取订单详情
API-->>ADMIN: 订单信息
CS->>ADMIN: 提交退款申请
ADMIN->>API: 创建退款工单
API->>DB: 记录退款原因
alt 需财务审核
API->>FIN[财务审核]: 推送审核
FIN->>API: 审核通过
end
API->>PAY: 申请退款
PAY-->>API: 退款成功
API->>DB: 更新订单+退款记录
API->>U: 通知用户退款
API-->>ADMIN: 退款完成
二、退款规则设计
2.1 退款时限规则
| 订单状态 | 用户自主取消 | 需骑手同意 | 退款比例 |
| 待支付 | - | - | 自动取消,不扣款 |
| 待接单 | ✅ 可取消 | - | 100% 退回 |
| 已接单(骑手未取件) | ❌ 需申请 | ✅ 需骑手同意 | 100% 退回 |
| 配送中 | ❌ 需申请 | ❌ 骑手可拒绝 | 需协商(扣除已产生费用) |
| 已送达 | ❌ 需申请 | - | 需客服判断 |
2.2 退款金额计算规则
| 场景 | 退款金额 | 说明 |
| 未接单取消 | 实付金额 100% | 全额退款 |
| 骑手已接单未取件 | 实付金额 100% | 全额退款,骑手无损失 |
| 配送中取消(骑手已产生费用) | 实付金额 - ¥3.00 | 补偿骑手已产生费用 |
| 商品损坏/丢失 | 实付金额 100% | 由责任方承担(骑手/商家) |
| 延误导致拒收 | 实付金额 100% | 平台承担,不扣骑手 |
2.3 退款时效
- 微信支付退款:原路退回,T+1 到账(微信侧处理)
- 钱包余额退款:实时到账
- 优惠券:退款后自动返还,限当日有效
- 积分:退款后自动返还,限30日内
三、退款状态机
stateDiagram-v2
[*] --> 待申请: 用户发起退款
待申请 --> 待审核: 提交申请
待审核 --> 审核中: 客服受理
审核中 --> 待退款: 审核通过
审核中 --> 已拒绝: 审核不通过
已拒绝 --> [*]: 通知用户
待退款 --> 退款中: 调用支付退款
退款中 --> 已退款: 退款成功
退款中 --> 退款失败: 退款失败
退款失败 --> 待退款: 重试
已退款 --> [*]: 通知用户
四、退款相关数据表
4.1 退款记录表 ot_refund
| 字段 | 类型 | 说明 |
| id | bigint | 主键 |
| refund_no | varchar(32) | 退款单号 |
| order_id | bigint | 关联订单ID |
| order_no | varchar(32) | 订单编号 |
| user_id | bigint | 用户ID |
| courier_id | bigint | 骑手ID(可空) |
| refund_type | tinyint | 退款类型(1用户取消/2投诉退款/3后台退款) |
| refund_reason | varchar(200) | 退款原因 |
| refund_amount | decimal(10,2) | 退款金额 |
| pay_amount | decimal(10,2) | 原支付金额 |
| coupon_return | tinyint | 是否返还优惠券(0否/1是) |
| points_return | int | 返还积分数量 |
| status | tinyint | 状态(0待审核/1审核中/2待退款/3已退款/4已拒绝) |
| apply_user_id | bigint | 申请人ID |
| audit_user_id | bigint | 审核人ID |
| audit_remark | varchar(200) | 审核备注 |
| pay_refund_no | varchar(64) | 微信退款单号 |
| refund_time | datetime | 退款成功时间 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
4.2 退款原因配置表 ot_refund_reason
| 字段 | 类型 | 说明 |
| id | bigint | 主键 |
| reason_name | varchar(50) | 原因名称 |
| reason_type | tinyint | 原因类型(1用户/2系统) |
| refund_ratio | decimal(3,2) | 默认退款比例(0.00-1.00) |
| need_courier_confirm | tinyint | 是否需骑手确认(0否/1是) |
| status | tinyint | 状态(0禁用/1启用) |
| sort | int | 排序 |
五、退款核心API
| 接口 | 说明 | 关键参数 |
POST /app/ot/refund/apply | 用户申请退款 | order_id, reason_id, remark |
GET /app/ot/refund/list | 用户退款记录 | page, size, status |
GET /app/ot/refund/detail | 退款详情 | refund_id |
POST /app/ot/refund/courier/confirm | 骑手确认取消 | refund_id, agree |
POST /admin/ot/refund/page | 管理端退款列表 | page, size, status, date |
POST /admin/ot/refund/audit | 审核退款 | refund_id, agree, remark |
POST /admin/ot/refund/batch-audit | 批量审核 | refund_ids, agree, remark |
六、用户端退款申请页面
新建文件:structurepages/1.12-用户-退款申请.html
6.1 页面结构
| 区块 | 内容 |
| 订单信息 | 订单号、商品信息、支付金额、下单时间 |
| 退款原因 | 退款原因选择(Chip组件)+ 补充说明 |
| 退款金额 | 系统计算的可退款金额展示 |
| 退款方式 | 原路退回(微信支付/钱包余额) |
| 提交按钮 | 提交退款申请 |
6.2 退款进度查询
| 状态 | 展示内容 |
| 待审核 | 等待客服处理,预计24小时内 |
| 审核通过 | 审核通过,退款处理中 |
| 退款成功 | 退款成功,T+1到账说明 |
| 已拒绝 | 拒绝原因,联系客服入口 |
文档同步:requirements_v2.md 退款模块 | 维护:项目团队