全流程 · 全渠道退款(用户端)重做

把「申请 → 自动审批 / 运营审核 → 原路退回或银行卡打款 → 用户确认(驳回 / 取消)」整条链路,做成金额可解释、进度可信、按渠道条件化、终点有安心感的体验,替换现有「武汉原始版」简陋 7 屏。PRD + 高保真设计稿合一。
忠实 V0510 后端 RefundBusiness / LianerRefundOrder 前台接口 /front/* 数据示例:武汉店健身年卡 ¥1099

1三个病灶 · 三个目标

金额不可解释
¥1099 全屏出现 4–5 次,唯一算费逻辑藏在「?」弹层;会员天卡却写「剩余课时」,术语自相矛盾。
→ 改造
金额可解释卡常驻、默认展开:应退金额 − 违约金 = 实际到账,逐项展开,术语随卡类型切换。
危险操作当主按钮
「申请退款」「撤销退款」都是最大最红实心、无二次确认;正向操作反被淹没。
→ 改造
破坏性操作降级为灰色文字链 + 二次确认;当前最该做的正向操作做唯一主按钮。
进度与到账无感
步骤条文字挤压重叠;无到账时效、到账渠道/尾号、凭证、客服兜底,焦虑场景给不了确定性。
→ 改造
竖向时间轴忠实 refundLogs 动态渲染 + 到账预期 + 成功结果卡 + 常驻客服。

2状态机(忠实后端枚举)

铁律:状态中文一律取后端下发的 statusName,禁止按 status 数字硬编码映射。
后端实体注释把 -1 / -2 写反了——代码真实为 -1 = 运营驳回-2 = 用户取消,以代码为准。
statusstatusName用户端一句话说明进度态用户可执行操作
1待审核已提交申请,等待平台审核进行中撤销退款申请(文字链 + 二次确认)
2待打款审核已通过,等待财务确认渠道并打款进行中撤销退款申请;refundType=3 时补充 / 修改银行卡
3打款完成钱已退出(原路退已到 / 银行打款已发起)接近完成确认收款(主按钮);隐藏「撤销」
4用户确认已确认收款,流程闭环已完成(终态)查看 / 联系客服
-1运营驳回申请被驳回,醒目展示 rejectReason失败(终态)看驳回原因;联系客服;可重新申请
-2用户取消已撤销申请已取消(终态)查看;可重新申请

关键流转,用户端必须如实反馈:

权益冻结规则(务必在用户端解释清楚)
用户一旦提交退款申请,对应权益(会员卡 / 私教课)立即冻结:审核与打款期间不可约课 / 不可核销 / 不可进场,等同暂时停用该卡。
· 被运营驳回(-1)或用户撤销(-2 → 权益自动解冻、恢复正常使用
· 打款完成(3 / 4 → 权益正式退出(已退款,自然不可用)。
用户端表现:① 申请页前置提示「提交后即冻结、仅被驳回 / 撤销才恢复」;② 提交时二次确认该后果;③ 进度页(待审核 / 待打款)显示「权益冻结中 · 暂不可用」;④ 驳回 / 取消页显示「权益已恢复」。(依赖后端在 refundApply 时冻结、userCancle / 驳回时解冻。)
⚠ 实现口径(三份文档已统一为「申请即冻结」):权益的实际扣减仍发生在退款打款完成(pay())时cancelMemberRightsByOrder / cancelRightsByOrder 保持不变);在此之上新增「申请即冻结」中间态——refundApply() 阶段冻结权益、userCancle() 与运营驳回阶段解冻,打款完成则正式扣减退出。即「扣减在退款完成时、冻结是新加在申请时」。

3全渠道差异(前端两条线)

渠道 refundType 由后端按原订单 payType 自动判定,用户不可选、不可见,前端只按它切换表单与文案。

维度原路退回 refundType=1
泰荣 / 微信自动续费
团购 refundType=2/4
payType=4
银行卡线下打款 refundType=3
申请表单银行卡隐藏,不填隐藏,不填显示且必填(卡号 / 户名 / 开户行 + 下拉)
凭证上传选填选填强调上传打款凭证
渠道说明条按原支付方式原路退回,无需填卡平台撤销核销后原路退款需补充银行卡,由财务人工打款
到账时效较快到账(命中可秒退)平台侧处理预计 1–3 个工作日
时间轴节点最短含撤销核销最长(含财务打款)
进度页银行卡区不显示不显示未填→提示补充;已填→脱敏
成功结果卡到账目标原路退回至 微信 / 泰荣平台银行尾号 ××××

4金额透明(可解释卡)

所有金额后端算好下发,前端只展示不计算。卡片常驻、默认展开,不藏「?」。

公式与字段对应

展示行后端字段(申请值 / 实退值)
应退金额(剩余权益)refundTotal / actualRefundTotal
 └ 次数卡:单价 × 剩余次数rightsRes.unitPrice / remain / times
 └ 时长卡:实付 × 剩余天数 / 总天数orderPrice × 比例
− 违约金serviceFee / actualServiceFee
− 连续包月退订补差(isAuto=1 才出)autoDiffAmt
= 实际到账refundAmt / actualRefundAmt
· 术语对齐卡类型:天卡说「剩余天数」、课时卡说「剩余课时」,不混用
· 无理由窗口(isWithinNoReason && nouse)按商品类型区分:会员卡窗口为 48 小时——48 小时内显示「48 小时内无理由 · 免违约金」,超 48 小时显示「已超 48 小时 · 按剩余权益 20% 收取」;私教课窗口仍为 7 天——7 天内显示「7 天内无理由 · 免违约金」,超 7 天显示「已超 7 天 · 按剩余权益 20% 收取」。
· 运营改额后,同时展示申请值与实退值并标注差异
· 金额用色例外(已评审确认):购买页金额惯用品牌红(促单语境),退款页金额刻意走中性深色 #303133(结算对账语境,红色易被读成「扣款」),主数字中性加粗、仅减项(违约金/补差)用警告橙 #ff9900 标注。此例外与价格红规范不冲突,请勿误改回品牌红。
预计可退金额
¥1099.00
应退金额(剩余权益)¥1099.00
会员年卡 · 剩余 360/360 天¥1099.00
违约金48 小时内无理由 · 免
实际到账¥1099.00
↑ 金额可解释卡

5逐屏设计稿(高保真)

配色克制:浅灰底 + 白卡片 + 统一 12–14px 圆角,品牌红仅作进度高亮与当前态强调。

14:305G 71
年卡
健身年卡
会员卡练二健身(武汉店)
有效时长 360 天
订单金额¥1099.00
优惠−¥0.00
实付金额¥1099.00
订单编号17794…198561 复制
下单时间2026-05-22 14:29
查看我的会员卡
A · 订单详情(退款入口)
  • 「申请退款」降级为底部文字链,不诱导误触
  • 已有退款单时,入口改为「查看退款进度」直达 D 屏
  • 订单号中间省略 + 复制
14:315G 71
预计可退金额按剩余权益试算
¥1099.00
应退金额(剩余权益)¥1099.00
会员年卡 · 剩余 360/360 天¥1099.00
违约金48 小时内无理由 · 免
实际到账¥1099.00
将按原支付方式(微信 / 泰荣)原路退回,无需填写银行卡,到账较快。
提交后该会员卡将立即冻结,审核与打款期间无法约课 / 核销 / 进场;被驳回或撤销则自动恢复
* 退款原因
我不想要了门店太远买错了其他
上传凭证 (选填)
提交退款申请
B1 · 退款申请(原路退)
  • 进入即调 refundInfo 试算,金额卡置顶
  • 渠道说明条点明「无需填卡」
  • 原因 chips 横排,选「其他」才展开补充框
14:315G 71
预计可退金额
¥3120.00
应退金额(剩余权益)¥3900.00
私教课 · 剩余 8/10 课时¥3900.00
违约金(已超 7 天 · 20%)−¥780.00
实际到账¥3120.00
该订单需补充银行卡信息,由财务人工打款,预计 1–3 个工作日到账。
提交后该私教课将立即冻结,审核与打款期间无法约课 / 核销;被驳回或撤销则自动恢复
* 收款银行卡
开户行招商银行 ›
卡号6225 8801 …
持卡人请输入姓名
* 退款原因
教练离职门店太远其他
提交退款申请
B2 · 退款申请(银行卡线下退)
  • refundType=3 才出现银行卡卡片,必填
  • 卡号 4 位分段、开户行下拉 payBankId
  • 超 7 天违约金行如实展示扣减
14:325G 70
待审核
已提交申请,等待平台审核 · 权益冻结中
退款金额
¥1099.00
退款进度
用户申请退款
05-22 14:31 · 本人
平台审核中
通常 1 个工作日内完成
预计 1–3 个工作日到账
原路退回
退款金额
应退金额(剩余权益)¥1099.00
违约金免违约金
实际到账¥1099.00
退款单号17794…198561 复制
申请时间05-22 14:31
退款原因我不想要了
C · 退款进度(待审核)
  • 状态标题取 statusName,下方一句话说明
  • 时间轴按 refundLogs 渲染,进行中给到账预期
  • 「撤销」为灰文字链 + 二次确认;客服常驻
14:365G 70
¥1099.00 已退回
原路退回至 微信支付 · 预计实时到账
到账时间 2026-05-22 14:31
保存凭证
退款进度
用户申请退款
05-22 14:31 · 本人
运营审核通过
05-22 14:31 · 王经理
原路退回完成
05-22 14:31 · 微信支付
运营审核 实退以此为准
实际应退金额¥1099.00
实际违约金¥0.00
实际到账¥1099.00
到账时间以支付渠道为准,未到账可点右下角联系客服。
确认收款
D · 打款完成(成功结果卡)
  • 成功结果卡:金额 + 到账渠道/尾号 + 时间 + 凭证
  • 运营审核块只读展示实退四件套
  • 主按钮「确认收款」,隐藏「撤销」
15:025G 69
运营驳回
很抱歉,本次退款申请未通过
驳回原因
该私教课已有未签到排课,需先取消排课后再申请退款。如有疑问请联系客服处理。
权益已恢复,会员卡 / 私教课可正常使用。
退款进度
用户申请退款
05-22 14:31 · 本人
运营驳回
05-22 15:02 · 王经理
私教
私教 10 课时 私教课
练二健身(武汉店)· 剩余 8 课时
重新申请退款
联系客服
E · 运营驳回(驳回原因)
  • 醒目展示 rejectReason(现有 UI 最该补的)
  • 无破坏性按钮,给「重新申请 / 联系客服」
  • 常见驳回:未签到排课 11031

补充状态屏(覆盖完整状态机)

14:345G 70
待打款
审核已通过,请补充收款银行卡,财务将尽快打款 · 权益冻结中
退款金额
¥3120.00
退款进度
用户申请退款
05-22 14:31 · 本人
运营审核通过
05-22 14:33 · 王经理
待财务打款
补齐银行卡后由财务人工打款
预计 1–3 个工作日到账
用户确认收款
请补充收款银行卡,否则财务无法发起打款。
收款银行卡
待补充银行卡信息去补充 ›
退款金额
应退金额(剩余权益)¥3900.00
违约金(已超 7 天 · 20%)−¥780.00
实际到账¥3120.00
补充银行卡信息
F · 待打款(待补银行卡 · refundType=3)
  • 仅银行卡线下退会停在此态;主按钮引导补卡
  • 银行卡区显示「待补充」,saveRefundBank 入口
  • status≥3 后不可再改卡(APPLY_EDIT_AGAIN_ERROR
15:105G 69
用户取消
你已撤销本次退款申请
退款进度
用户申请退款
05-22 14:31 · 本人
用户取消申请
05-22 15:10 · 本人
年卡
健身年卡 会员卡
练二健身(武汉店)· 360 天
申请已撤销,权益已恢复,可正常使用。如仍需退款,可重新发起申请。
重新申请退款
G · 用户取消(status=-2 终态)
  • 中性灰头卡,无破坏性按钮
  • 明确「权益已恢复」,消除焦虑
  • 给「重新申请退款」回到 B 屏
14:335G 70
待审核
已提交申请,等待平台审核 · 权益冻结中
退款金额
¥1099.00
退款进度
用户申请退款
05-22 14:31 · 本人
平台审核中
通常 1 个工作日内完成
撤销退款申请?
撤销后本次申请将关闭。如仍需退款,需重新提交申请。
再想想
确认撤销
H · 撤销退款 · 二次确认弹窗
  • 破坏性操作必走二次确认,说明后果
  • 「确认撤销」为红色描边、非实心,弱化诱导
  • 默认焦点在「再想想」
14:325G 70
加载中…
I · 加载骨架 / 兜底
  • 首屏 loading 走骨架,不闪白
  • 接口失败 → 「加载失败 · 点击重试」
  • 无退款记录 → 品牌占位空态

6退款入口接入点(挂载到现有页面 · 复用不新建)

退款功能在 app 里已有完整路由骨架:申请页 order/apply.vue、详情页 order/refundDetail.vue、规则弹窗 order/component/refundRule.vue 均为生产可用。本次是重做这些页面的 UI不新增页面。设计稿 10 屏精确映射到下列已有文件。

① 入口流程示意

我的订单 待/已退款 tab 申请退款 · 放开注释(P0) 退款详情 查看进度 提交申请 补卡 orign=bank 「我的」页 user/index 订单中心 order/index · 4 tab 订单详情 course / card · orderDetail 订单列表卡片 待退款 8 / 已退款 9 退款申请页 apply · 屏 B1/B2 退款进度详情 refundDetail · 屏 C/D/E/F/G
红色 = 唯一需放开的注释入口(P0) 虚线 = 待打款态补卡回流 红框 = 本次重做的退款页(复用现有文件)

现有页面还原 · 入口落点(按页面源码 1:1 还原)

练二用户
1280 积分 ›
我的会员卡 (武汉店)
有效期:2026-05-22 至 2027-05-21
私教次卡
私教时长卡
我的课程
退款由此进我的订单
优惠卡券
卡券兑换
签到记录
我的专属教练
自动续费管理
退出登录
「我的」页
user/index.vue
点「我的订单」
私教订单场地卡团课积分订单
全部待支付已支付已退款待退款
订单号:1779…8561已支付
健身年卡
门店:练二健身(武汉店)
下单时间:2026-05-22 14:29
总计:¥1099.00
订单号:1780…2233待退款
健身季卡
门店:练二健身(汉口店)
退款金额:¥780.00 ›
订单中心(4 tab × 状态筛选)
order/index.vue · memberItem
点订单卡
(非退款态)
购买商品健身年卡
订单金额¥1099.00
实付金额¥1099.00
优惠金额¥0.00
门店练二(武汉店)
订单编号1779…8561
创建时间05-22 14:29
到期时间2027-05-21
申请退款放开注释
取消
*status==2 时「申请退款」按钮在代码里被注释
card/orderDetail.vue:19 · course/orderDetail.vue:38
会员卡 / 私教 订单详情
card · course / orderDetail.vue
申请退款
放开注释 (P0)
本稿 · 退款申请页
设计屏 B1 / B2 → order/apply.vue
另一条线:
· 列表「待退款 / 已退款」卡片
· 订单详情「退款详情」按钮
本稿 · 退款进度详情
设计屏 C/D/E/F/G → refundDetail.vue
= 本次重做的退款页
红色虚线框 = 代码中被注释、需放开的「申请退款」按钮(唯一要新增的入口);其余入口与跳转均已存在。

② 设计屏 ↔ 现有页面映射

设计屏现有页面文件路由现状
A 订单详情(退款入口)pages/course/orderDetail.vue(私教)
pages/card/orderDetail.vue(会员卡)
/pages/course/orderDetail
/pages/card/orderDetail
活跃;「申请退款」按钮已被注释(L38 / L19),需放开并按新稿重做
B1 / B2 退款申请pages/order/apply.vue/pages/order/apply?billcode&type&orign活跃(16KB 完整:试算/原因/银行卡/附件)
C / D / E / F / G 退款进度详情pages/order/refundDetail.vue/pages/order/refundDetail?billcode活跃(18KB);现仅画到 3 级进度,缺 -1 驳回 / -2 取消 终态,本次补齐
计算规则弹层(§4 金额卡来源)pages/order/component/refundRule.vue—(弹窗)活跃;升级为正文常驻可解释卡

③ 三类入口现状(发起 / 补卡 / 查进度)

动作入口位置(现有代码)跳转对应屏
发起退款申请订单详情底部「申请退款」按钮 —— 当前注释,需放开(P0)
course/orderDetail.vue:38 · card/orderDetail.vue:19
apply?billcode&type(type 1=会员卡 / 2=私教)A → B
补充银行卡退款详情 待打款态「补充银行卡信息」apply?billcode&orign=bankF → B2
查看进度(列表入口)订单中心卡片:payItem.vue:199 / memberItem.vue:121,在 orderStatus==8 待退款 / ==9 已退款 时透出退款金额refundDetail?billcode订单列表 → C/D/E
查看进度(详情入口)订单详情「退款详情」按钮(待退款 / 已退款态)refundDetail?billcodeA → C/D/E

④「我的」页 / 订单列表 该加在哪

「我的」页pages/user/index.vue):快捷导航宫格已有 「我的订单」→ /pages/order/index。退款不单独设入口,沿用「订单 → 退款」的标准电商路径即可(与现状一致,无需改动「我的」页)。

订单中心pages/order/index.vue):4 个一级 tab(私教 / 场地卡 / 团课 / 积分)× 二级 tab(全部 / 待支付 / 已支付 / 待退款 / 已退款 / 已关闭),退款单已在「待退款 / 已退款」筛选下可达。建议:

⑤ 状态枚举对照(别混用:订单态 ≠ 退款单态)

层级取值用途
订单态(utils/common.ts,列表用)8 待退款 / 9 已退款仅决定订单卡片是否透出退款入口 / 退款金额
退款单态(refundDetail 内部,本 PRD §2)1 待审核 / 2 待打款 / 3 打款完成 / 4 用户确认 / -1 运营驳回 / -2 用户取消退款进度详情页的真实状态,取 statusName
现有 refundDetail.vue 只画到 3 级进度条(待审核 → 审核待打款 → 打款完成),-1 驳回 / -2 取消 的终态 UI —— 这正是本次重做要补的(设计屏 E 驳回 / G 取消),并把「审核待打款」对齐为 statusName「待打款」。

⑥ 结论

复用 apply.vue + refundDetail.vue + refundRule.vue + order/index 现有页面,只重做 UI。唯一需新放开的代码是订单详情两处被注释的「申请退款」按钮;其余为视觉与状态覆盖的重做。退款 API(refund.tsrefundInfo / refundApply / getRefundDesc / userCancle / userConfirm / saveRefundBank / getRefundDicts/payment/front/*)已就绪,无需新增。

7验收清单

状态机 / 文案

渠道条件化

金额透明

进度 / 时间轴 / 操作安全

终态 / 兜底

8接口契约对照

用途接口关键入参 / 返回
退款试算(不落库)POST /front/refundInfobillcode + type;出金额可解释卡数据
提交申请POST /front/refundApplyApplyRefundOrderReq:reasonId/reasonDesc/银行卡四件套/attachs
退款详情POST /front/getRefundDesc入原订单 billcode;出 RefundOrderDescRes(含 refundLogs)
撤销申请POST /front/userCanclestatus=-2
确认收款POST /front/userConfirmstatus=4
补充银行卡POST /front/saveRefundBankstatus≥3 不可改(APPLY_EDIT_AGAIN_ERROR
退款原因字典GET /front/getRefundDictsid / name → chips

9落地交付说明(对齐 lianer-user-app 规范)

本稿为 HTML 设计稿,落地小程序时按下表对齐现行设计 token / 组件 / 图标,已通过规范符合性评审。

① 色值 token 对齐

用途稿内值落地 token(仓库真实值)
品牌强调红(进度/当前态/chips 选中/时间轴高亮)#FF3939#FF3939--base-color,与 tabBar selectedColor 一致)
主按钮渐变 / 状态头卡红橙渐变linear-gradient(90deg,#FF3939,#EA0B2A);头卡 135deg,#ff5b4a,#e0231c
成功绿(已到账/确认)#01d28e#01d28e--base-green-color
警告橙(减项/提示)#ff9900#ff9900--base-orange-color
主文字 / 金额#303133#303133--body-font-color
页面背景#f6f7fb#f6f7fb(globalStyle backgroundColor)

② 图标字符 → 字体图标(必改,禁用 emoji/字符图标)

稿内字符含义落地图标(wd-icon / iconfont)
返回箭头导航返回wd-icon name="arrow-left" / uni-icons type="left"
勾选 / 完成成功结果、时间轴已完成wd-icon name="check" / check-circle-filled
电话联系客服入口iconfont lianxikefu(仓库已有)
退回箭头原路退回提示iconfont icon-tuikuan(缺则新增,勿用字符)
加号上传凭证wd-icon name="add" / uni-icons type="plusempty"
警示 / 信息提示条wd-icon name="warning" / info-circle,配 #ff9900

③ 尺寸 · 单位 · 组件

④ 金额用色例外(已评审确认 · 记录在案)

退款页金额走中性深色 #303133,不走品牌红——退款是结算对账语境,红色在金融场景易被读成「扣款」,中性色更利用户核对「应退 − 违约金 = 到账」。仅减项(违约金/补差)用 #ff9900 标注。此为与购买页区分的有意例外,非违反「价格红」规范,后续勿误改回红色

⑤ 空态 / 加载 / 异常(对齐仓库范式)

练二 / FitMoments · 全流程全渠道退款用户端重做 · PRD + 设计稿合一 · 已通过设计规范符合性评审