chuangte_bike_newxcx/pages/depositRefund/detail.vue

317 lines
8.0 KiB
Vue
Raw Normal View History

2026-01-28 18:00:39 +08:00
<template>
<view class="page">
<u-navbar title="押金退还详情" :border-bottom="false" :background="bgc" back-icon-color="#262B37" title-color='#262B37'
title-size='36' height='36' id="navbar">
</u-navbar>
<view class="topbj"></view>
<scroll-view class="content" scroll-y>
<!-- 状态卡片 -->
<view class="status-card">
<view class="status-icon" :class="statusClass">
<u-icon :name="statusIcon" size="60" color="#fff"></u-icon>
</view>
<view class="status-text">{{statusText}}</view>
<view class="status-desc" v-if="detailInfo.status == 1">您的申请正在审核中请耐心等待</view>
<view class="status-desc" v-if="detailInfo.status == 2">审核通过退款处理中</view>
<view class="status-desc" v-if="detailInfo.status == 3">退款已成功到账</view>
<view class="status-desc" v-if="detailInfo.status == 4">申请已被驳回</view>
</view>
<!-- 申请信息 -->
<view class="info-card">
<view class="card-title">申请信息</view>
<view class="info-list">
<view class="info-item">
<text class="label">申请单号</text>
<text class="value">{{detailInfo.no || '--'}}</text>
</view>
<view class="info-item">
<text class="label">申请金额</text>
<text class="value price">{{detailInfo.amount ? parseFloat(detailInfo.amount).toFixed(2) : '0.00'}}</text>
</view>
<view class="info-item">
<text class="label">运营区</text>
<text class="value">{{detailInfo.areaName || '--'}}</text>
</view>
<view class="info-item">
<text class="label">申请时间</text>
<text class="value">{{detailInfo.createTime || '--'}}</text>
</view>
</view>
</view>
<!-- 审核信息 -->
<view class="info-card" v-if="detailInfo.status >= 2">
<view class="card-title">审核信息</view>
<view class="info-list">
<view class="info-item" v-if="detailInfo.verifyTime">
<text class="label">审核时间</text>
<text class="value">{{detailInfo.verifyTime}}</text>
</view>
<view class="info-item" v-if="detailInfo.operatorName">
<text class="label">审核人</text>
<text class="value">{{detailInfo.operatorName}}</text>
</view>
<view class="info-item" v-if="detailInfo.remark">
<text class="label">审核备注</text>
<text class="value">{{detailInfo.remark}}</text>
</view>
</view>
</view>
<!-- 退款信息 -->
<view class="info-card" v-if="detailInfo.status == 3">
<view class="card-title">退款信息</view>
<view class="info-list">
<view class="info-item" v-if="detailInfo.refundTime">
<text class="label">退款时间</text>
<text class="value">{{detailInfo.refundTime}}</text>
</view>
<view class="info-item">
<text class="label">退款金额</text>
<text class="value price">{{detailInfo.amount ? parseFloat(detailInfo.amount).toFixed(2) : '0.00'}}</text>
</view>
<view class="info-item" v-if="detailInfo.no">
<text class="label">退款单号</text>
<text class="value">{{detailInfo.no}}</text>
</view>
</view>
</view>
<!-- 驳回原因 -->
<view class="info-card" v-if="detailInfo.status == 4 && detailInfo.rejectReason">
<view class="card-title">驳回原因</view>
<view class="reject-reason">
{{detailInfo.rejectReason}}
</view>
</view>
<!-- 其他信息 -->
<view class="info-card" v-if="detailInfo.remark">
<view class="card-title">备注信息</view>
<view class="remark-content">
{{detailInfo.remark}}
</view>
</view>
<view class="footer-spacer"></view>
</scroll-view>
</view>
</template>
<script>
export default {
data() {
return {
bgc: {
backgroundColor: "#C4E1FF",
},
id: '',
detailInfo: {},
isMerchant: false
}
},
onLoad(options) {
if(options.id){
this.id = options.id
// 判断是否为商户端访问
this.isMerchant = options.isMerchant === 'true' || options.isMerchant === true
this.getDetail()
}
},
computed: {
// 状态样式类
statusClass(){
const status = this.detailInfo.status
const classMap = {
1: 'status-pending',
2: 'status-processing',
3: 'status-success',
4: 'status-rejected'
}
return classMap[status] || 'status-pending'
},
// 状态图标
statusIcon(){
const status = this.detailInfo.status
const iconMap = {
1: 'clock',
2: 'hourglass',
3: 'checkmark-circle',
4: 'close-circle'
}
return iconMap[status] || 'info-circle'
},
// 状态文本
statusText(){
const status = this.detailInfo.status
const statusMap = {
1: '待审核',
2: '待退款',
3: '退款成功',
4: '已驳回'
}
return statusMap[status] || '--'
}
},
methods: {
// 获取详情
getDetail(){
uni.showLoading({
title: '加载中...',
mask: true
})
// 判断是否为商户端通过URL参数或接口路径判断
const isMerchant = this.isMerchant || false
const apiUrl = isMerchant ? `/bst/depositRefund/${this.id}` : `/app/depositRefund/detail?id=${this.id}`
this.$u.get(apiUrl).then((res) => {
uni.hideLoading()
if (res.code == 200) {
// 商户端接口返回的数据结构可能不同,需要适配
this.detailInfo = isMerchant ? (res.data || res) : (res.data || {})
}else if(res.code == 401){
uni.showModal({
title: '提示',
content: '您当前未登录,是否前去登录?',
showCancel: true,
success: function (res) {
if (res.confirm) {
uni.reLaunch({
url:'/pages/login/login'
})
}
}
})
}else{
uni.showToast({
title: res.msg || '获取详情失败',
icon: 'none'
})
}
}).catch(err => {
uni.hideLoading()
uni.showToast({
title: '网络错误',
icon: 'none'
})
})
},
}
}
</script>
<style lang="scss">
page {
background: #F7F7F7;
}
.topbj{
width: 100%;
height: 22rpx;
background-color: #C4E1FF;
}
.content{
height: calc(100vh - 88rpx);
padding: 20rpx;
box-sizing: border-box;
}
.status-card{
background: #FFFFFF;
border-radius: 20rpx;
padding: 60rpx 40rpx;
margin-bottom: 20rpx;
text-align: center;
.status-icon{
width: 120rpx;
height: 120rpx;
border-radius: 50%;
margin: 0 auto 30rpx;
display: flex;
align-items: center;
justify-content: center;
&.status-pending{
background: linear-gradient(135deg, #FFA726 0%, #FF8A65 100%);
}
&.status-processing{
background: linear-gradient(135deg, #42A5F5 0%, #1E88E5 100%);
}
&.status-success{
background: linear-gradient(135deg, #66BB6A 0%, #43A047 100%);
}
&.status-rejected{
background: linear-gradient(135deg, #EF5350 0%, #E53935 100%);
}
}
.status-text{
font-size: 40rpx;
font-weight: 600;
color: #3D3D3D;
margin-bottom: 20rpx;
}
.status-desc{
font-size: 28rpx;
color: #808080;
}
}
.info-card{
background: #FFFFFF;
border-radius: 20rpx;
padding: 30rpx;
margin-bottom: 20rpx;
.card-title{
font-size: 32rpx;
font-weight: 600;
color: #3D3D3D;
margin-bottom: 30rpx;
padding-left: 20rpx;
border-left: 6rpx solid #4297F3;
}
.info-list{
.info-item{
display: flex;
justify-content: space-between;
align-items: center;
padding: 24rpx 0;
border-bottom: 1rpx solid #F0F0F0;
&:last-child{
border-bottom: none;
}
.label{
font-size: 28rpx;
color: #808080;
}
.value{
font-size: 28rpx;
color: #3D3D3D;
&.price{
font-weight: 600;
color: #4297F3;
font-size: 32rpx;
}
}
}
}
.reject-reason{
font-size: 28rpx;
color: #3D3D3D;
line-height: 1.6;
padding: 20rpx;
background: #FFF5F5;
border-radius: 10rpx;
border-left: 4rpx solid #EF5350;
}
.remark-content{
font-size: 28rpx;
color: #3D3D3D;
line-height: 1.6;
padding: 20rpx;
background: #F8F9FA;
border-radius: 10rpx;
}
}
.footer-spacer{
height: 40rpx;
}
</style>