Files
MER-2.2_2601/mer_uniapp/pages/goods/refund_details/index.vue

912 lines
23 KiB
Vue
Raw Normal View History

<template>
<view :data-theme="theme">
<view class='order-details'>
<view class="gradient-bg absolute"></view>
<!-- 给header上与data上加on为退款订单-->
<view class='header bg-color on'>
<view class='picTxt acea-row row-middle'>
<view class='data on mb-60'>
<view class="acea-row row-middle mb20">
<view class='state line-heightOne'>{{refundInfo.refundStatus | refundStatusFilter}}</view>
<view v-show="refundInfo.refundStatus===3"><text
class="font-color refundPrice">{{refundInfo.refundPrice || 0 }}</text></view>
</view>
<view class="line2" v-if="refundInfo.refundStatus===1">{{refundInfo.refundReason}}</view>
<view v-else>{{refundInfo.refundStatus | orderRefundTipsStatusFilter}}</view>
</view>
</view>
</view>
<!-- 商品详情 -->
<view class="margin-100">
<view class="borderPad relative">
<view class="borRadius14 wrapper relative">
<view class="borderPad">
<orderGoods :isShowBtn="false" :refundInfo="refundInfo" :cartInfo="[refundInfo]" :jump="true" :orderData="refundInfo">
</orderGoods>
</view>
<view class="borderPad">
<view class="return_info">
<view class='item acea-row row-between line-heightOne'>
<view>退款件数</view>
<view class='conter'>{{refundInfo.applyRefundNum || 0 }}</view>
</view>
<view class='item acea-row row-between line-heightOne'>
<view>退款金额</view>
<view class='conter'>{{refundInfo.refundPrice || 0 }}</view>
</view>
<view class='item acea-row row-between line-heightOne'>
<view>退款方式</view>
<view class='conter'>原支付返回</view>
</view>
<view class='item acea-row row-between line-heightOne'>
<view>退款原因</view>
<view v-if="refundInfo.promoterType==='user'" class='conter'>{{refundInfo.refundReasonWap}}</view>
<view v-else class='conter'>商家直接退款</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 商家店铺地址 -->
<view v-if="refundInfo.returnGoodsType ===2 && merAddress && refundInfo.refundStatus>0" class="borderPad">
<view class="borRadius14 wrapper return_info_pad">
<view class='item acea-row row-between mb30'>
<view>商家退回地址</view>
<view class='conter acea-row row-middle row-right'>
<!-- #ifndef H5 -->
<text class='copy line-heightOne' @tap="handleCopy(merAddress.name+','+merAddress.phone+','+merAddress.addressDetail)">复制</text>
<!-- #endif -->
<!-- #ifdef H5 -->
<text class='copy copy-data line-heightOne'
:data-clipboard-text="merAddress.name+','+merAddress.phone+','+merAddress.addressDetail">复制</text>
<!-- #endif -->
</view>
</view>
<view class="text-2828 f-s-26 mb20">
<text class="text-2828">{{merAddress.name}}</text>
<text>{{merAddress.phone}}</text>
</view>
<view class="text-666 f-s-26 addressDetail">{{merAddress.addressDetail}}</view>
</view>
</view>
<!-- 商家退回地址 -->
<view v-if="refundInfo.returnGoodsType ===1 && refundInfo.refundStatus>0 &&refundInfo.receiver&&refundInfo.receiverPhone&&refundInfo.receiverAddressDetail" class="borderPad">
<view class="borRadius14 wrapper return_info_pad">
<view class='item acea-row row-between mb30'>
<view>商家退回地址</view>
<view class='conter acea-row row-middle row-right'>
<!-- #ifndef H5 -->
<text class='copy line-heightOne' @tap="handleCopy(refundInfo.receiver+','+refundInfo.receiverPhone+','+refundInfo.receiverAddressDetail)">复制</text>
<!-- #endif -->
<!-- #ifdef H5 -->
<text class='copy copy-data line-heightOne'
:data-clipboard-text="refundInfo.receiver+','+refundInfo.receiverPhone+','+refundInfo.receiverAddressDetail">复制</text>
<!-- #endif -->
</view>
</view>
<view class="text-2828 f-s-26 mb20">
<text class="text-2828">{{refundInfo.receiver}}</text>
<text>{{refundInfo.receiverPhone}}</text>
</view>
<view class="text-666 f-s-26 addressDetail">{{refundInfo.receiverAddressDetail}}</view>
</view>
</view>
<!-- 退款订单详情 "-->
<view class="borderPad">
<view class='wrapper borRadius14 return_info_pad'>
<view class='item acea-row row-between '>
<view>订单单号</view>
<view class='conter acea-row row-middle row-right'><text
class="text-overflow">{{refundInfo.orderNo}}</text>
<!-- #ifndef H5 -->
<text class='copy line-heightOne' @tap='handleCopy(refundInfo.orderNo)'>复制</text>
<!-- #endif -->
<!-- #ifdef H5 -->
<text class='copy copy-data line-heightOne'
:data-clipboard-text="refundInfo.orderNo">复制</text>
<!-- #endif -->
</view>
</view>
<view class='item acea-row row-between'>
<view>售后单号</view>
<view class='conter acea-row row-middle row-right'><text
class="text-overflow">{{refundInfo.refundOrderNo}}</text>
<!-- #ifndef H5 -->
<text class='copy line-heightOne' @tap='handleCopy(refundInfo.refundOrderNo)'>复制</text>
<!-- #endif -->
<!-- #ifdef H5 -->
<text class='copy copy-data line-heightOne'
:data-clipboard-text="refundInfo.refundOrderNo">复制</text>
<!-- #endif -->
</view>
</view>
<view class='item acea-row row-between'>
<view>申请时间</view>
<view class='conter'>{{(refundInfo.createTime || 0)}}</view>
</view>
<view class='item acea-row row-between'>
<view>售后类型</view>
<view class='conter'>{{refundInfo.afterSalesType===1?'仅退款':'退货退款'}}</view>
</view>
<view class='item acea-row row-between'>
<view>退回方式</view>
<view class='conter'>
{{refundInfo.returnGoodsType===1?'快递退回':refundInfo.returnGoodsType===2?'到店退货':'不退货'}}</view>
</view>
<view class='item acea-row row-between' v-if="refundInfo.refundReasonWapExplain">
<view>备注说明</view>
<view class='conter-refund text-left'>{{refundInfo.refundReasonWapExplain}}</view>
</view>
<view class='item acea-row row-between' v-if="refundInfo.refundReasonWapImg">
<view>售后凭证</view>
<view class='conter-refund text-left'>
<image class="wapImg" :src="item" v-for="(item, index) in refundInfo.refundReasonWapImg.split(',')"
:key='index'></image>
</view>
</view>
</view>
</view>
<!-- 用户到店退回信息 -->
<view v-if="refundInfo.returnGoodsType ===2 && refundInfo.refundStatus>0 && refundInfo.telephone" class="borderPad">
<view class="borRadius14 wrapper return_info_pad">
<view class='item acea-row row-between'>
<view>联系电话</view>
<view class='conter'>{{refundInfo.telephone}}</view>
</view>
</view>
</view>
<!-- 用户发货信息 -->
<view v-if="refundInfo.returnGoodsType ===1 && refundInfo.refundStatus>0 && refundInfo.expressName && refundInfo.trackingNumber" class="borderPad">
<view class="borRadius14 wrapper return_info_pad">
<view class='item acea-row row-between mb30'>
<view>物流公司</view>
<view class='conter'>{{refundInfo.expressName}}</view>
</view>
<view class='item acea-row row-between mb30'>
<view>物流单号</view>
<view class='conter acea-row row-middle row-right'>
<text class="text-overflow">{{refundInfo.trackingNumber}}</text>
<!-- #ifndef H5 -->
<text class='copy line-heightOne' @tap='handleCopy(refundInfo.trackingNumber)'>复制</text>
<!-- #endif -->
<!-- #ifdef H5 -->
<text class='copy copy-data line-heightOne'
:data-clipboard-text="refundInfo.trackingNumber">复制</text>
<!-- #endif -->
</view>
</view>
<view class='item acea-row row-between'>
<view>联系电话</view>
<view class='conter'>{{refundInfo.telephone}}</view>
</view>
</view>
</view>
<!-- 操作按钮 "-->
<view v-if="refundInfo.refundStatus === 0 || refundInfo.refundStatus === 4 || refundInfo.refundStatus === 5">
<view class='wrapper btn-box acea-row fixed footer' style="justify-content: flex-end;">
<view></view>
<view
v-if="refundInfo.refundStatus === 0 || refundInfo.refundStatus === 4 || refundInfo.refundStatus === 5"
class="btn btn-999" @click="handleRevokeRefund(refundInfo.refundOrderNo)">撤销售后</view>
<view v-if="refundInfo.refundStatus === 4 && refundInfo.afterSalesType === 2" style="color: #fff;"
class="btn bg-color" @click="handleReturningRefund(refundInfo)">退回商品</view>
</view>
</view>
</view>
</view>
</template>
<script>
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import { orderRefundInfoApi } from '@/api/order.js';
import {onRevokeRefund} from '@/libs/order';
import orderGoods from "@/components/orderGoods";
import { getMerAddressApi } from '@/api/merchant.js'
import ClipboardJS from "@/plugin/clipboard/clipboard.js";
import {
toLogin
} from '@/libs/login.js';
import {
mapGetters
} from "vuex";
// #ifdef MP
import uQRCode from '@/js_sdk/Sansnn-uQRCode/uqrcode.js'
// #endif
import {
setThemeColor
} from '@/utils/setTheme.js'
const app = getApp();
export default {
components: {
orderGoods
},
data() {
return {
merAddress: null, //店铺地址
refundOrderNo: '',
refundInfo: {}, //退款单详情
theme: app.globalData.theme,
chatConfig: {
consumer_hotline: '',
telephone_service_switch: 'false'
}, //客服配置
};
},
computed: mapGetters(['isLogin', 'chatUrl', 'userInfo']),
onLoad: function(options) {
let bgColor = setThemeColor();
uni.setNavigationBarColor({
frontColor: '#ffffff',
backgroundColor:bgColor,
});
options.type == undefined || options.type == null ? this.type = 'normal' : this.type = options.type;
if (!options.refundOrderNo) return this.$util.Tips({
title: '缺少参数'
}, {
tab: 3,
url: 1
});
this.$set(this, 'refundOrderNo', options.refundOrderNo);
this.bgColor = setThemeColor();
this.$set(this, 'chatConfig', this.$Cache.getItem('chatConfig'));
},
onShow() {
if (this.isLogin) {
this.orderRefundInfo();
} else {
toLogin();
}
},
onHide: function() {
this.isClose = true;
},
// 滚动监听
onPageScroll(e) {
// 传入scrollTop值并触发所有easy-loadimage组件下的滚动监听事件
uni.$emit('scroll');
},
onReady: function() {
// #ifdef H5
this.$nextTick(function() {
const clipboard = new ClipboardJS(".copy-data");
clipboard.on("success", () => {
this.$util.Tips({
title: '复制成功'
});
});
});
// #endif
},
methods: {
//店铺地址
getMerAddress() {
getMerAddressApi(this.refundInfo.merId).then(res => {
this.$set(this, 'merAddress', res.data);
}).catch(err => {
return this.$util.Tips({
title: err
});
})
},
//撤销售后
handleRevokeRefund(refundOrderNo) {
onRevokeRefund(refundOrderNo).then(() => {
this.orderRefundInfo()
});
},
//退回商品
handleReturningRefund(item) {
this.$Cache.set('productInfo', item)
uni.navigateTo({
url: `/pages/goods/returns_and_refunds/index?refundOrderNo=${item.refundOrderNo}&returnGoodsType=${item.returnGoodsType}`
})
},
serviceClick() {
if (this.chatConfig.telephone_service_switch === 'true') {
uni.makePhoneCall({
phoneNumber: this.chatConfig.consumer_hotline //仅为示例
});
} else {
// #ifdef APP-PLUS
uni.navigateTo({
url: '/pages/users/web_page/index?webUel=' + this.chatUrl + '&title=客服'
})
// #endif
// #ifndef APP-PLUS
location.href = this.chatUrl;
// #endif
}
},
/**
* 拨打电话
*/
makePhone: function(e) {
uni.makePhoneCall({
phoneNumber: e
})
},
/**
* 获取退款订单详细信息
*
*/
orderRefundInfo() {
let that = this;
uni.showLoading({
title: "正在加载中"
});
orderRefundInfoApi(that.refundOrderNo).then(res => {
uni.hideLoading();
let data = res.data;
that.$set(that, 'refundInfo', data);
//returnGoodsType 退货类型0-不退货 1-快递退回2-到店退货
if(that.refundInfo.returnGoodsType ===2)that.getMerAddress();
}).catch(err => {
that.$util.Tips({
title: err
}, {
tab: 4,
url: '/pages/user/index'
});
});
},
/**
*
* 剪切订单号
*/
// #ifndef H5
handleCopy: function(orderNo) {
let that = this;
uni.setClipboardData({
data: orderNo
});
},
// #endif
/**
* 打电话
*/
goTel: function() {
uni.makePhoneCall({
phoneNumber: this.refundInfo.deliveryId
})
}
}
}
</script>
<style scoped lang="scss">
.gradient-bg{
top: 152rpx;
}
.addressDetail {
line-height: 36rpx;
}
.btn-box {
display: flex;
padding-top: 20rpx;
line-height: 60rpx;
.btn-line {
@include main_color(theme);
@include coupons_border_color(theme);
}
.btn-bg {
color: #fff;
}
.btn-999 {
border: 1px solid #DDDDDD;
color: #666666;
}
.btn {
width: 176rpx;
height: 60rpx;
line-height: 56rpx;
margin-left: 18rpx;
text-align: center;
border-radius: 30rpx;
font-size: 28rpx;
}
}
.margin-100 {
margin: -116rpx auto 0 auto;
}
.return_info_pad {
padding: 30rpx 24rpx;
}
.return_info {
background-color: #fff;
padding: 32rpx 0;
}
.refundPrice {
font-size: 35rpx;
font-weight: bold;
}
.qs-btn {
width: auto;
height: 60rpx;
text-align: center;
line-height: 60rpx;
border-radius: 50rpx;
color: #fff;
font-size: 27rpx;
padding: 0 3%;
color: #aaa;
border: 1px solid #ddd;
margin-right: 20rpx;
}
.text-overflow {
width: 392rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.shuoming {
width: 32rpx;
height: 32rpx;
}
.mp-header {
width: 100%;
@include main_bg_color(theme);
}
.goodCall {
@include main_color(theme);
text-align: center;
width: 100%;
height: 86rpx;
padding: 0 30rpx;
border-bottom: 1rpx solid #eee;
font-size: 30rpx;
line-height: 86rpx;
background: #fff;
.icon-ic_customerservice {
font-size: 36rpx;
margin-right: 15rpx;
}
/* #ifdef MP */
button {
display: flex;
align-items: center;
justify-content: center;
height: 86rpx;
font-size: 30rpx;
@include main_color(theme);
}
/* #endif */
}
.align-center {
align-items: center;
}
.order-details {
.header {
height: 266rpx;
padding: 0 24rpx;
}
}
.order-details .header .pictrue {
width: 110rpx;
height: 110rpx;
}
.order-details .header .pictrue image {
width: 100%;
height: 100%;
}
.order-details .header .data {
color: rgba(255, 255, 255, 0.8);
font-size: 24rpx;
margin-left: 27rpx;
}
.order-details .header .data.on {
margin-left: 0;
padding-top: 30rpx;
}
.order-details .header .data .state {
font-size: 30rpx;
font-weight: bold;
color: #fff;
}
.order-details .header .data .time {
margin-left: 20rpx;
}
.picTxt {
padding-left: 10rpx;
}
.order-details .nav {
background-color: #fff;
font-size: 26rpx;
color: #282828;
padding: 27rpx 0;
width: 100%;
border-radius: 14rpx;
margin: -100rpx auto 0 auto;
}
.order-details .nav .navCon {
padding: 0 40rpx;
}
.order-details .nav .on {
@include main_color(theme);
}
.font_color {
@include main_color(theme);
}
.order-details .nav .progress {
padding: 0 65rpx;
margin-top: 10rpx;
}
.order-details .nav .progress .line {
width: 100rpx;
height: 2rpx;
background-color: #939390;
}
.order-details .nav .progress .iconfont {
font-size: 25rpx;
color: #939390;
margin-top: -2rpx;
}
.order-details .address {
font-size: 26rpx;
color: #868686;
background-color: #fff;
padding: 30rpx 0;
.phone {
margin-left: 20rpx;
}
}
.order-details .address .name {
font-size: 30rpx;
color: #333;
margin-bottom: 15rpx;
}
.order-details .line {
width: 100%;
height: 3rpx;
}
.order-details .line image {
width: 100%;
height: 100%;
display: block;
}
.order-details .wrapper {
background-color: #fff;
margin-top: 20rpx;
}
.order-details .wrapper .item {
font-size: 28rpx;
color: #282828;
}
.order-details .wrapper .item~.item {
margin-top: 34rpx;
}
.order-details .wrapper .item .conter {
color: #282828;
text-align: right;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.mark_show {
color: #868686;
width: 470rpx;
text-align: right;
}
.order-details .wrapper .item .conter .copy {
font-size: 20rpx;
color: #666;
border-radius: 20rpx;
background-color: #f5f5f5;
padding: 8rpx 18rpx;
margin-left: 10rpx;
}
.order-details .wrapper .actualPay {
border-top: 1rpx solid #eee;
margin-top: 30rpx;
padding-top: 30rpx;
}
.order-details .wrapper .actualPay .money {
font-weight: bold;
font-size: 30rpx;
@include price_color(theme);
}
.footer {
width: 100%;
position: fixed;
bottom: 0;
left: 0;
background-color: #fff;
padding: 20rpx 24rpx;
// padding-bottom: 20rpx;
padding-bottom: calc(20rpx+ constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
padding-bottom: calc(20rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
}
.order-details .writeOff {
background-color: #fff;
margin-top: 20rpx;
padding-bottom: 50rpx;
}
.order-details .writeOff .title {
font-size: 30rpx;
color: #282828;
height: 87rpx;
border-bottom: 1px solid #f0f0f0;
padding: 0 24rpx;
line-height: 87rpx;
}
.order-details .writeOff .grayBg {
background-color: #f2f5f7;
width: 590rpx;
height: 384rpx;
border-radius: 20rpx 20rpx 0 0;
margin: 50rpx auto 0 auto;
padding-top: 55rpx;
}
.order-details .writeOff .grayBg .pictrue {
width: 290rpx;
height: 290rpx;
margin: 0 auto;
}
.order-details .writeOff .grayBg .pictrue image {
width: 100%;
height: 100%;
display: block;
}
.order-details .writeOff .gear {
width: 590rpx;
height: 30rpx;
margin: 0 auto;
}
.order-details .writeOff .gear image {
width: 100%;
height: 100%;
display: block;
}
.order-details .writeOff .num {
background-color: #f0c34c;
width: 590rpx;
height: 84rpx;
color: #282828;
font-size: 48rpx;
margin: 0 auto;
border-radius: 0 0 20rpx 20rpx;
text-align: center;
padding-top: 4rpx;
}
.order-details .writeOff .rules {
margin: 46rpx 30rpx 0 30rpx;
border-top: 1px solid #f0f0f0;
padding-top: 10rpx;
}
.order-details .writeOff .rules .item {
margin-top: 20rpx;
}
.order-details .writeOff .rules .item .rulesTitle {
font-size: 28rpx;
color: #282828;
}
.order-details .writeOff .rules .item .rulesTitle .iconfont {
font-size: 30rpx;
color: #333;
margin-right: 8rpx;
margin-top: 5rpx;
}
.order-details .writeOff .rules .item .info {
font-size: 28rpx;
color: #999;
margin-top: 7rpx;
}
.order-details .writeOff .rules .item .info .time {
margin-left: 20rpx;
}
.order-details .map {
font-size: 30rpx;
color: #282828;
margin-top: 20rpx;
background-color: #fff;
padding: 0 24rpx;
.title {
line-height: 86rpx;
border-bottom: 1px solid #f0f0f0;
}
}
.order-details .map .place {
font-size: 26rpx;
width: 176rpx;
height: 50rpx;
border-radius: 25rpx;
line-height: 50rpx;
text-align: center;
}
.order-details .map .place .iconfont {
font-size: 27rpx;
height: 27rpx;
line-height: 27rpx;
margin: 2rpx 3rpx 0 0;
}
.order-details .address .name .iconfont {
font-size: 34rpx;
margin-left: 10rpx;
}
.refund {
padding: 0 !important;
margin-top: 15rpx;
background-color: #fff;
.title {
display: flex;
align-items: center;
font-size: 30rpx;
color: #333;
height: 86rpx;
border-bottom: 1px solid #f5f5f5;
font-weight: 400;
padding: 0 24rpx;
image {
width: 32rpx;
height: 32rpx;
margin-right: 10rpx;
}
}
.con {
font-size: 26rpx;
color: #666666;
padding: 30rpx 24rpx;
}
}
.pictrue {
width: 130rpx;
height: 130rpx;
border-radius: 14rpx;
overflow: hidden;
image {
width: 100%;
height: 100%;
}
}
.text {
width: 490rpx;
// position: relative;
.name {
font-size: 28rpx;
color: #282828;
}
.attr {
font-size: 16rpx;
color: #868686;
margin-top: 7rpx
}
}
.wrapper-head {
background-color: #fff;
margin-top: 12rpx;
padding: 30rpx 24rpx;
}
.wrapper-info {
background-color: #fff;
margin: -100rpx auto 0 auto;
padding: 15px 12px;
.name {
width: 414rpx;
color: #333;
}
.num {
color: #999;
}
.attr {
color: #999;
font-size: 20rpx;
margin: 7rpx 0 16rpx 0;
}
.price {
font-size: 26rpx;
color: #E93323;
}
}
.borRadius-top {
border-radius: 14rpx 14rpx 0px 0px;
}
.borRadius-bottom {
border-radius: 0px 0px 14rpx 14rpx;
}
.conter-refund {
width: 76%;
text-align: right;
color: #868686;
.wapImg {
width: 106rpx;
height: 106rpx;
border-radius: 16rpx;
margin-right: 10rpx;
}
}
</style>