Files
ai_dianshang/miniprogram/pages/refund/refund-detail/index.js
2025-11-17 13:32:54 +08:00

330 lines
8.5 KiB
JavaScript

// pages/refund/refund-detail/index.js
import Toast from 'tdesign-miniprogram/toast/index';
import { config } from '../../../config/index';
Page({
data: {
refundDetail: null,
loading: true,
error: null
},
onLoad(options) {
console.log('[退款详情] 页面加载', options);
this.refundId = options.id;
if (!this.refundId) {
this.setData({
error: '退款记录ID不能为空',
loading: false
});
return;
}
this.loadRefundDetail();
},
onShow() {
// 页面显示时刷新数据
if (this.refundId) {
this.loadRefundDetail();
}
},
onPullDownRefresh() {
this.loadRefundDetail();
},
// 加载退款详情
loadRefundDetail() {
this.setData({
loading: true,
error: null
});
let token = wx.getStorageSync('token');
if (!token) {
// 自动设置测试token
const testToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozNywiZXhwIjoxNzYxNjE5NjAyLCJpYXQiOjE3NjE1MzMyMDJ9.xyZLQbwhYyUDiF9_UOCX39nVwYOHvvd6d4TqwFnT_yg';
wx.setStorageSync('token', testToken);
token = testToken;
console.log('[退款详情] 自动设置测试token');
}
console.log('[退款详情] 请求退款详情', { refundId: this.refundId });
wx.request({
url: `${config.apiBase}/refunds/${this.refundId}`,
method: 'GET',
header: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
success: (res) => {
console.log('[退款详情] API响应', res);
if (res.statusCode === 200 && res.data.code === 200) {
const refundDetail = this.processRefundDetail(res.data.data);
this.setData({
refundDetail: refundDetail,
loading: false
});
wx.stopPullDownRefresh();
} else {
console.error('[退款详情] API错误', res.data);
this.setData({
error: res.data.message || '获取退款详情失败',
loading: false
});
}
},
fail: (error) => {
console.error('[退款详情] 网络错误', error);
this.setData({
error: '网络错误',
loading: false
});
}
});
},
// 处理退款详情数据
processRefundDetail(data) {
// 状态映射 - 后端返回的是数字状态
const statusMap = {
1: {
text: '待审核',
desc: '您的退款申请已提交,请耐心等待审核',
icon: '⏳'
},
2: {
text: '审核通过',
desc: '退款申请已通过,正在处理退款',
icon: '✓'
},
3: {
text: '审核拒绝',
desc: '退款申请被拒绝,如有疑问请联系客服',
icon: '✗'
},
4: {
text: '退款中',
desc: '退款正在处理中,请耐心等待',
icon: '⏳'
},
5: {
text: '退款成功',
desc: '退款已完成,请查看您的账户余额',
icon: '✓'
},
6: {
text: '退款失败',
desc: '退款处理失败,如有疑问请联系客服',
icon: '✗'
}
};
const statusInfo = statusMap[data.status] || {
text: '未知状态',
desc: '',
icon: '?'
};
// 格式化金额 - 添加安全检查,将分转换为元
const refundAmount = ((data.refund_amount || 0) / 100).toFixed(2);
// 订单金额从关联的订单对象中获取,将分转换为元
const orderAmount = ((data.order && data.order.total_amount ? data.order.total_amount : 0) / 100).toFixed(2);
// 格式化时间
const createdAt = this.formatTime(data.created_at);
const processedAt = data.processed_at ? this.formatTime(data.processed_at) : null;
const completedAt = data.completed_at ? this.formatTime(data.completed_at) : null;
// 退款方式
const refundMethodMap = {
'wechat': '微信支付',
'alipay': '支付宝',
'bank': '银行卡',
'balance': '账户余额'
};
// 订单状态
const orderStatusMap = {
1: '待付款',
2: '待发货',
3: '待发货',
4: '已发货',
5: '待收货',
6: '已完成',
7: '已取消',
8: '退货中',
9: '已退款'
};
// 处理退款日志
const logs = (data.logs || []).map(log => ({
id: log.id,
action: log.action,
remark: log.remark,
createdAt: this.formatTime(log.created_at)
})).reverse(); // 倒序显示,最新的在前面
// 生成操作按钮
const actions = this.generateActions(data.status);
return {
id: data.id,
orderNo: data.order_no,
refundAmount: refundAmount,
orderAmount: orderAmount,
reason: data.reason,
adminRemark: data.admin_remark,
status: data.status,
statusText: statusInfo.text,
statusDesc: statusInfo.desc,
statusIcon: statusInfo.icon,
createdAt: createdAt,
processedAt: processedAt,
completedAt: completedAt,
refundMethod: refundMethodMap[data.refund_method] || '未知方式',
orderStatusText: orderStatusMap[data.order_status] || '未知状态',
logs: logs,
actions: actions
};
},
// 生成操作按钮
generateActions(status) {
const actions = [];
switch (status) {
case 'pending':
actions.push({ type: 'cancel', text: '取消申请' });
break;
case 'rejected':
actions.push({ type: 'reapply', text: '重新申请' });
break;
}
return actions;
},
// 格式化时间
formatTime(timeStr) {
if (!timeStr) return '';
const date = new Date(timeStr);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hour = String(date.getHours()).padStart(2, '0');
const minute = String(date.getMinutes()).padStart(2, '0');
const second = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
},
// 订单点击
onOrderTap() {
const { refundDetail } = this.data;
if (refundDetail && refundDetail.orderNo) {
wx.navigateTo({
url: `/pages/order/order-detail/index?orderNo=${refundDetail.orderNo}`
});
}
},
// 操作按钮点击
onActionTap(e) {
const action = e.currentTarget.dataset.action;
console.log('[退款详情] 操作按钮点击', action);
switch (action) {
case 'cancel':
this.cancelRefund();
break;
case 'reapply':
this.reapplyRefund();
break;
}
},
// 取消退款申请
cancelRefund() {
wx.showModal({
title: '取消申请',
content: '确定要取消这个退款申请吗?',
success: (res) => {
if (res.confirm) {
this.performCancelRefund();
}
}
});
},
// 执行取消退款
performCancelRefund() {
const token = wx.getStorageSync('token');
wx.showLoading({ title: '处理中...' });
wx.request({
url: `${config.apiBase}/refunds/${this.refundId}/cancel`,
method: 'PUT',
header: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
success: (res) => {
wx.hideLoading();
if (res.statusCode === 200 && res.data.code === 200) {
Toast({
context: this,
selector: '#t-toast',
message: '取消成功',
theme: 'success',
});
// 刷新详情
setTimeout(() => {
this.loadRefundDetail();
}, 1000);
} else {
Toast({
context: this,
selector: '#t-toast',
message: res.data.message || '取消失败',
theme: 'error',
});
}
},
fail: (error) => {
wx.hideLoading();
console.error('[退款详情] 取消退款失败', error);
Toast({
context: this,
selector: '#t-toast',
message: '网络错误',
theme: 'error',
});
}
});
},
// 重新申请退款
reapplyRefund() {
const { refundDetail } = this.data;
if (refundDetail) {
wx.navigateTo({
url: `/pages/refund/refund-apply/index?reapply=1&orderNo=${refundDetail.orderNo}&refundId=${this.refundId}`
});
}
},
// 重试
onRetry() {
this.loadRefundDetail();
}
});