文件

555 行
15 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>提现详情</title>
<link rel="stylesheet" type="text/css" href="__PUBLIC__/css/menu.css?v=1.0.5"/>
<link rel="stylesheet" type="text/css" href="__PUBLIC__/css/minimal-admin.css?v=1.0.0"/>
<link rel="stylesheet" type="text/css" href="__PUBLIC__/vue/element-ui.css?v=2.13.2">
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/vue/js/vue2.5.16.js"></script>
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/vue/element-ui.js?v=2.13.2"></script>
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/jquery/js/jquery-3.2.1.min.js"></script>
</head>
<body>
<div id="WithdrawDetail" v-cloak>
<div class="page-header">
<div class="header-content">
<div class="header-left">
<h1 class="page-title">
<i class="el-icon-wallet"></i>
提现详情
</h1>
<p class="page-subtitle">骑手提现申请详细信息</p>
</div>
<div class="header-right" v-if="withdrawData">
<el-tag :type="getStatusType(withdrawData.status)" size="large" class="status-tag">
<i :class="getStatusIcon(withdrawData.status)"></i>
{{ getStatusText(withdrawData.status) }}
</el-tag>
</div>
</div>
</div>
<div class="page-content" v-loading="loading">
<div v-if="withdrawData" class="detail-container">
<!-- 金额信息卡片 -->
<el-card class="amount-card" shadow="hover">
<div class="amount-header">
<h3><i class="el-icon-money"></i> 金额信息</h3>
</div>
<div class="amount-grid">
<div class="amount-item primary">
<div class="amount-label">提现金额</div>
<div class="amount-value">¥{{ formatMoney(withdrawData.amount) }}</div>
</div>
<div class="amount-item">
<div class="amount-label">手续费</div>
<div class="amount-value fee">¥{{ formatMoney(withdrawData.fee) }}</div>
</div>
<div class="amount-item success">
<div class="amount-label">实际到账</div>
<div class="amount-value">¥{{ formatMoney(withdrawData.actual_amount) }}</div>
</div>
</div>
</el-card>
<!-- 基本信息卡片 -->
<el-card class="info-card" shadow="hover">
<div class="card-header">
<h3><i class="el-icon-document"></i> 基本信息</h3>
</div>
<el-descriptions :column="2" border size="medium">
<el-descriptions-item label="提现单号">
<el-tag type="info" size="small">{{ withdrawData.withdraw_no }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="提现ID">
<span class="id-text">#{{ withdrawData.id }}</span>
</el-descriptions-item>
<el-descriptions-item label="骑手姓名">
<span class="rider-name">{{ withdrawData.rider_name || '未知' }}</span>
</el-descriptions-item>
<el-descriptions-item label="手机号">
<span class="phone-text">{{ withdrawData.rider_phone || '未知' }}</span>
</el-descriptions-item>
</el-descriptions>
</el-card>
<!-- 账户信息卡片 -->
<el-card class="account-card" shadow="hover">
<div class="card-header">
<h3>
<i :class="getWithdrawTypeIcon(withdrawData.withdraw_type)"></i>
{{ getWithdrawTypeName(withdrawData.withdraw_type) }}账户信息
</h3>
</div>
<div class="account-info">
<div class="account-row">
<div class="account-label">账户姓名</div>
<div class="account-value">{{ withdrawData.account_name }}</div>
</div>
<div class="account-row">
<div class="account-label">账户号码</div>
<div class="account-value account-number">{{ withdrawData.account_number }}</div>
</div>
<div class="account-row" v-if="withdrawData.withdraw_type == 1 && withdrawData.bank_name">
<div class="account-label">开户银行</div>
<div class="account-value">{{ withdrawData.bank_name }}</div>
</div>
</div>
</el-card>
<!-- 时间轴 -->
<el-card class="timeline-card" shadow="hover">
<div class="card-header">
<h3><i class="el-icon-time"></i> 处理进度</h3>
</div>
<el-timeline class="custom-timeline">
<el-timeline-item
timestamp="申请时间"
placement="top"
type="primary"
icon="el-icon-plus">
<div class="timeline-content">
<h4>提交申请</h4>
<p>{{ withdrawData.add_time || '未知' }}</p>
</div>
</el-timeline-item>
<el-timeline-item
v-if="withdrawData.process_time"
timestamp="处理时间"
placement="top"
type="warning"
icon="el-icon-loading">
<div class="timeline-content">
<h4>开始处理</h4>
<p>{{ withdrawData.process_time }}</p>
</div>
</el-timeline-item>
<el-timeline-item
v-if="withdrawData.complete_time"
timestamp="完成时间"
placement="top"
:type="withdrawData.status == 1 ? 'success' : 'danger'"
:icon="withdrawData.status == 1 ? 'el-icon-check' : 'el-icon-close'">
<div class="timeline-content">
<h4>{{ withdrawData.status == 1 ? '提现成功' : '提现失败' }}</h4>
<p>{{ withdrawData.complete_time }}</p>
<div v-if="withdrawData.status == 2 && withdrawData.reject_reason" class="reject-reason">
<el-alert
:title="withdrawData.reject_reason"
type="error"
:closable="false"
show-icon>
</el-alert>
</div>
</div>
</el-timeline-item>
</el-timeline>
</el-card>
</div>
<!-- 空状态 -->
<div v-else-if="!loading" class="empty-state">
<el-empty description="未找到提现记录"></el-empty>
</div>
</div>
</div>
<style>
[v-cloak] {
display: none;
}
/* 页面整体样式 */
body {
background: #f5f7fa;
margin: 0;
padding: 0;
}
#WithdrawDetail {
min-height: 100vh;
background: #f5f7fa;
}
/* 页面头部 */
.page-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 30px 0;
margin-bottom: 30px;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
}
.header-content {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.page-title {
margin: 0;
font-size: 28px;
font-weight: 600;
display: flex;
align-items: center;
gap: 12px;
}
.page-title i {
font-size: 32px;
}
.page-subtitle {
margin: 8px 0 0 0;
opacity: 0.9;
font-size: 14px;
}
.status-tag {
font-size: 16px !important;
border-radius: 25px !important;
font-weight: 600;
}
.status-tag i {
margin-right: 8px;
}
/* 页面内容 */
.page-content {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px 40px;
}
.detail-container {
display: grid;
gap: 24px;
}
/* 卡片通用样式 */
.el-card {
border-radius: 12px !important;
border: none !important;
box-shadow: 0 2px 12px rgba(0,0,0,0.08) !important;
transition: all 0.3s ease;
}
.el-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0,0,0,0.15) !important;
}
.card-header {
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 2px solid #f0f2f5;
}
.card-header h3 {
margin: 0;
font-size: 18px;
font-weight: 600;
color: #2c3e50;
display: flex;
align-items: center;
gap: 10px;
}
.card-header i {
color: #409eff;
font-size: 20px;
}
/* 金额信息卡片 */
.amount-card {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
.amount-card .card-header {
border-bottom-color: rgba(255,255,255,0.2);
}
.amount-card .card-header h3,
.amount-card .card-header i {
color: white;
}
.amount-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
}
.amount-item {
text-align: center;
padding: 20px;
background: rgba(255,255,255,0.1);
border-radius: 10px;
backdrop-filter: blur(10px);
transition: all 0.3s ease;
}
.amount-item:hover {
background: rgba(255,255,255,0.2);
transform: translateY(-2px);
}
.amount-label {
font-size: 14px;
opacity: 0.9;
margin-bottom: 8px;
}
.amount-value {
font-size: 24px;
font-weight: 700;
margin: 0;
}
.amount-item.primary .amount-value {
color: #fff;
}
.amount-item.success .amount-value {
color: #67c23a;
}
.amount-value.fee {
color: #f56c6c;
}
/* 基本信息卡片 */
.info-card .el-descriptions {
margin-top: 0;
}
.id-text {
font-family: 'Courier New', monospace;
background: #f0f2f5;
padding: 4px 8px;
border-radius: 4px;
font-weight: 600;
}
.rider-name {
font-weight: 600;
color: #2c3e50;
}
.phone-text {
font-family: 'Courier New', monospace;
color: #606266;
}
/* 账户信息卡片 */
.account-info {
background: #f8f9fa;
border-radius: 8px;
padding: 20px;
}
.account-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 0;
border-bottom: 1px solid #e4e7ed;
}
.account-row:last-child {
border-bottom: none;
}
.account-label {
font-weight: 600;
color: #606266;
min-width: 100px;
}
.account-value {
color: #2c3e50;
font-weight: 500;
text-align: right;
}
.account-number {
font-family: 'Courier New', monospace;
background: #fff;
padding: 6px 12px;
border-radius: 6px;
border: 1px solid #dcdfe6;
}
/* 时间轴卡片 */
.custom-timeline {
padding: 20px 0;
}
.timeline-content h4 {
margin: 0 0 8px 0;
font-size: 16px;
font-weight: 600;
color: #2c3e50;
}
.timeline-content p {
margin: 0;
color: #606266;
font-size: 14px;
}
.reject-reason {
margin-top: 12px;
}
/* 空状态 */
.empty-state {
text-align: center;
padding: 60px 20px;
}
/* 响应式设计 */
@media (max-width: 768px) {
.header-content {
flex-direction: column;
gap: 20px;
text-align: center;
}
.page-title {
font-size: 24px;
}
.amount-grid {
grid-template-columns: 1fr;
}
.account-row {
flex-direction: column;
align-items: flex-start;
gap: 8px;
}
.account-value {
text-align: left;
}
}
/* Element UI 组件样式覆盖 */
.el-descriptions__label {
font-weight: 600 !important;
color: #606266 !important;
}
.el-timeline-item__timestamp {
font-weight: 600 !important;
color: #909399 !important;
}
.el-alert {
border-radius: 8px !important;
}
</style>
<script>
new Vue({
el: '#WithdrawDetail',
data() {
return {
loading: false,
withdrawData: null
}
},
mounted() {
this.loadDetail();
},
methods: {
// 加载详情
loadDetail() {
this.loading = true;
const urlParams = new URLSearchParams(window.location.search);
const id = urlParams.get('id');
$.get('/index.php/Retail/RiderWithdraw/getWithdrawDetail', {id: id}, (res) => {
this.loading = false;
if (res.code === 0) {
this.withdrawData = res.data;
} else {
this.$message.error(res.msg || '加载数据失败');
}
}).fail(() => {
this.loading = false;
this.$message.error('网络请求失败,请稍后重试');
});
},
// 格式化金额显示
formatMoney(amount) {
if (!amount && amount !== 0) return '0.00';
return parseFloat(amount).toFixed(2);
},
// 获取状态类型
getStatusType(status) {
const typeMap = {
0: 'warning', // 申请中
1: 'success', // 已完成
2: 'danger' // 已拒绝
};
return typeMap[status] || 'info';
},
// 获取状态文本
getStatusText(status) {
const textMap = {
0: '申请中',
1: '已完成',
2: '已拒绝'
};
return textMap[status] || '未知状态';
},
// 获取状态图标
getStatusIcon(status) {
const iconMap = {
0: 'el-icon-loading',
1: 'el-icon-success',
2: 'el-icon-error'
};
return iconMap[status] || 'el-icon-question';
},
// 获取提现方式名称
getWithdrawTypeName(type) {
const typeMap = {
1: '银行卡',
2: '支付宝',
3: '微信'
};
return typeMap[type] || '未知';
},
// 获取提现方式图标
getWithdrawTypeIcon(type) {
const iconMap = {
1: 'el-icon-bank-card',
2: 'el-icon-wallet',
3: 'el-icon-chat-dot-round'
};
return iconMap[type] || 'el-icon-question';
}
}
});
</script>
</body>
</html>