退款审核功能:待交接取消不再自动退款,改为客服审核后原路退回

- 租客在待交接状态取消订单不再自动退款,改为 refund_status=pending_review
- 新增退款审核页面 /admin/orders/refund-review,客服可逐个审核
- 新增 POST /refund/approve 通过退款、POST /refund/reject 驳回退款
- 新增 GET /orders/refund-pending 查询待审核退款订单列表
- 优化状态标签表述:已取消→租客已取消、已关闭→客服已关闭、异常→客服介入
- 新增 refund_status: pending_review 及其前端标签「待客服审核退款」
- AdminOrderDetailView 退款状态改用统一 refundStatusLabel
This commit is contained in:
yml2213
2026-06-28 21:14:55 +08:00
parent c6c6a92645
commit c92cd03b8c
16 changed files with 492 additions and 35 deletions
+22 -9
View File
@@ -40,29 +40,29 @@ const orderStatusMap: Record<OrderStatus, string> = {
pending_checkout_accept: '待租客确认修正',
checkout_disputing: '结账争议中',
completed: '已完成',
cancelled: '已取消',
closed: '已关闭',
cancelled: '租客已取消',
closed: '客服已关闭',
disputing: '申诉中',
abnormal: '异常',
abnormal: '客服介入',
}
const handoffStatusMap: Record<HandoffStatus, string> = {
pending_owner: '待号主交接',
pending_renter_confirm: '待租客确认',
received: '已确认收号',
received: '租客已收号',
pending_owner_return_confirm: '待号主确认结账',
pending_owner_checkout: '待号主确认结账',
pending_renter_checkout: '待租客确认修正',
checkout_disputed: '结账争议中',
returned: '已归还',
cancelled: '已取消',
cancelled: '租客已取消',
owner_timeout: '号主交接超时',
renter_confirm_timeout: '租客确认超时',
return_overdue: '归还逾期',
owner_return_confirm_timeout: '号主确认结账超时',
owner_checkout_confirm_timeout: '号主确认结账超时',
admin_closed: '客服关闭',
admin_abnormal: '客服标记异常',
admin_closed: '客服关闭',
admin_abnormal: '客服介入',
arbitrated: '已仲裁',
}
@@ -72,12 +72,21 @@ const settlementStatusMap: Record<SettlementStatus, string> = {
frozen: '冻结中',
settled: '已结算',
refunded: '已退款',
cancelled: '已取消',
closed: '已关闭',
cancelled: '结算已取消',
closed: '结算已关闭',
disputed: '争议中',
arbitrated: '已仲裁',
}
const refundStatusMap: Record<string, string> = {
none: '未退款',
pending_review: '待客服审核退款',
pending: '待退款',
refunding: '退款中',
refunded: '已退款',
failed: '退款失败',
}
const realnameStatusMap: Partial<Record<RealnameStatusValue, string>> = {
unverified: '未认证',
pending: '认证中',
@@ -148,6 +157,10 @@ export function settlementStatusLabel(status: string) {
return readLabel(settlementStatusMap, status)
}
export function refundStatusLabel(status: string) {
return readLabel(refundStatusMap, status)
}
export function realnameStatusLabel(status: string) {
return readLabel(realnameStatusMap, status)
}