433 lines
9.4 KiB
Vue
433 lines
9.4 KiB
Vue
|
|
<template>
|
|||
|
|
<view class="contBox">
|
|||
|
|
<view class="oneBox box">
|
|||
|
|
<view class="item" v-for="item in goodsList" :key="item.id">
|
|||
|
|
<image :src="item.pic_url" mode="aspectFill"></image>
|
|||
|
|
<view class="right">
|
|||
|
|
<view class="txtBox flex">
|
|||
|
|
<text class="name">{{item.goods_name}}</text>
|
|||
|
|
<view class="price">
|
|||
|
|
<text class="icon">¥</text>
|
|||
|
|
<text>{{item.price}}</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="sku flex">
|
|||
|
|
<text>{{item.sku_name}}</text>
|
|||
|
|
<text>x{{item.number}}</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="twoBox box">
|
|||
|
|
<view class="item flex" style="border-bottom: 1px solid #f5f5f5;">
|
|||
|
|
<view>退款方式</view>
|
|||
|
|
<view class="text">仅退款</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="item flex" @click="showReason = true">
|
|||
|
|
<view>退款原因</view>
|
|||
|
|
<view style="display: flex;align-items: center;">
|
|||
|
|
<view class="text">{{columnsValue}}</view>
|
|||
|
|
<up-icon name="arrow-right" size="15" style="color: #98989F;" />
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="threeBox flex">
|
|||
|
|
<view>退款金额</view>
|
|||
|
|
<view class="price">¥{{refund_price}}</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="fourBox">最多可退¥{{refund_price}}(含运费¥{{order.freight_price}})。退款将返还实际支付金额</view>
|
|||
|
|
|
|||
|
|
<view class="spBox">
|
|||
|
|
<view class="sp">退款说明</view>
|
|||
|
|
<up-textarea v-model="message" count placeholder="选填,最多200字" style="font-size: 28rpx;" :height="70" :maxlength="200"></up-textarea>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="refundImg">
|
|||
|
|
<view class="tit">上传凭证</view>
|
|||
|
|
<view class="comment">
|
|||
|
|
<view class="imgBox">
|
|||
|
|
<view class="imgList" v-for="(item, i) in picList" :key="i">
|
|||
|
|
<image :src="item.url" mode="aspectFill" class="img"></image>
|
|||
|
|
<view @click="deleteImage(i)" class="close"><view class="heng"></view></view>
|
|||
|
|
</view>
|
|||
|
|
<view @click="uploadImage()" class="plus" v-if="picList.length == 3 ? false : true">
|
|||
|
|
<up-icon name="camera-fill" color="#E0E0E0" size="22" />
|
|||
|
|
<text>图片上传</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<text style="color:#98989F; font-size: 26rpx;">可上传3张图片</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="comment-btn" @click="submitBtn()">提交</view>
|
|||
|
|
|
|||
|
|
<div class="top" v-if="success">申请退款成功</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
<!-- 退款原因 -->
|
|||
|
|
<up-popup :show="showReason" :round="10" mode="bottom" close-on-click-overlay closeable @close="showReason = false">
|
|||
|
|
<view class="reasonbox">
|
|||
|
|
<view class="title">退款原因</view>
|
|||
|
|
<view class="list">
|
|||
|
|
<view class="row flex" v-for="(item, i) in reasonList" :key="i" @click="onConfirm(item, i)">
|
|||
|
|
<view class="tit">{{item}}</view>
|
|||
|
|
<up-icon v-if="i + 1 === reasonIndex" name="checkbox-mark" :color="Color" size="20" />
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
<!-- 隐私协议弹窗 -->
|
|||
|
|
<privacy-popup :show-dialog="showPrivacy" @close="showPrivacy = false" @agree="showPrivacy = false" @refuse="showPrivacy = false" />
|
|||
|
|
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import { ref, reactive, toRefs } from 'vue'
|
|||
|
|
import { get, post } from '@/api/request.js'
|
|||
|
|
import api from '/api/index'
|
|||
|
|
import { showToast, judgePrivacy } from '@/components/common.js'
|
|||
|
|
import { Style } from '@/utils/list.js'
|
|||
|
|
import privacyPopup from '@/components/privacyPopup/index.vue'
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
components: {
|
|||
|
|
privacyPopup
|
|||
|
|
},
|
|||
|
|
setup() {
|
|||
|
|
const data = reactive({
|
|||
|
|
goodsList: [],
|
|||
|
|
refund_price: '',
|
|||
|
|
itemIds: [],
|
|||
|
|
success: false,
|
|||
|
|
reasonList: [
|
|||
|
|
'多拍/错拍/不想要',
|
|||
|
|
'未按约定时间发货',
|
|||
|
|
'配送时间太长',
|
|||
|
|
'协商一致退款',
|
|||
|
|
'其他'
|
|||
|
|
],
|
|||
|
|
message: '',
|
|||
|
|
picList: [],
|
|||
|
|
order: {},
|
|||
|
|
columnsValue: '请选择',
|
|||
|
|
urls: api.url + '/api/v1/upload',
|
|||
|
|
showReason: false,
|
|||
|
|
reasonIndex: 0,
|
|||
|
|
odeId: '',
|
|||
|
|
Color: uni.getStorageSync('theme_color'),
|
|||
|
|
priceColor: Style[uni.getStorageSync('theme_index') * 1].priceColor,
|
|||
|
|
showPrivacy: false
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
const getValue = (val) => {
|
|||
|
|
data.message = val.detail
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const uploadImage = async () => {
|
|||
|
|
if(await judgePrivacy()) {
|
|||
|
|
data.showPrivacy = true
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
uni.chooseImage({
|
|||
|
|
success(res) {
|
|||
|
|
uni.showLoading({
|
|||
|
|
title: '正在上传...',
|
|||
|
|
mask: true
|
|||
|
|
})
|
|||
|
|
const tempFilePaths = res.tempFilePaths
|
|||
|
|
for (let i = 0; i < tempFilePaths.length; i++) {
|
|||
|
|
uni.uploadFile({
|
|||
|
|
url: data.urls,
|
|||
|
|
filePath: tempFilePaths[i],
|
|||
|
|
name: 'file',
|
|||
|
|
header: {
|
|||
|
|
Authorization: uni.getStorageSync('token') || '',
|
|||
|
|
accept: 'application/json',
|
|||
|
|
appid: api.appId
|
|||
|
|
},
|
|||
|
|
success(ress) {
|
|||
|
|
var img = JSON.parse(ress.data).data
|
|||
|
|
data.picList.push({
|
|||
|
|
url: img.link
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
uni.hideLoading()
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const deleteImage = (i) => {
|
|||
|
|
data.picList.splice(i, 1)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const onConfirm = (event, index) => {
|
|||
|
|
data.columnsValue = event
|
|||
|
|
data.reasonIndex = index + 1
|
|||
|
|
data.showReason = false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const submitBtn = () => {
|
|||
|
|
if (!data.reasonIndex) {
|
|||
|
|
showToast('请选择退款原因')
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
uni.showLoading({
|
|||
|
|
title: '退款中...',
|
|||
|
|
mask: true
|
|||
|
|
})
|
|||
|
|
post(`/api/v1/orderRefund/batch/refund`, {
|
|||
|
|
order_item_ids: data.itemIds,
|
|||
|
|
user_pic_urls: data.picList,
|
|||
|
|
user_refund_reason: data.reasonIndex,
|
|||
|
|
user_refund_des: data.message
|
|||
|
|
}).then((res) => {
|
|||
|
|
data.success = true
|
|||
|
|
setTimeout(() => {
|
|||
|
|
uni.redirectTo({
|
|||
|
|
url: '/pages/order/info/index?id=' + data.odeId
|
|||
|
|
})
|
|||
|
|
data.success = false
|
|||
|
|
}, 1000)
|
|||
|
|
uni.hideLoading()
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getItemsInfo(id) {
|
|||
|
|
get(`/api/v1/orderRefund/items/${id}`).then((res) => {
|
|||
|
|
data.goodsList = res.data.order_items
|
|||
|
|
data.refund_price = res.data.refund_price
|
|||
|
|
data.itemIds = res.data.order_item_ids
|
|||
|
|
data.order = res.data.order
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
...toRefs(data),
|
|||
|
|
uploadImage,
|
|||
|
|
deleteImage,
|
|||
|
|
onConfirm,
|
|||
|
|
submitBtn,
|
|||
|
|
getValue,
|
|||
|
|
getItemsInfo
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
onLoad(options) {
|
|||
|
|
this.odeId = options.id
|
|||
|
|
this.getItemsInfo(options.order_id)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.top{
|
|||
|
|
position: fixed;
|
|||
|
|
top: 40%;
|
|||
|
|
left: 50%;
|
|||
|
|
transform: translate(-50%);
|
|||
|
|
background: rgba(0, 0, 0, 0.7);
|
|||
|
|
color: #fff;
|
|||
|
|
font-size: 26rpx;
|
|||
|
|
padding: 24rpx;
|
|||
|
|
border-radius: 10rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.reasonbox{
|
|||
|
|
padding: 0 30rpx;
|
|||
|
|
min-height: 50vh;
|
|||
|
|
.title{
|
|||
|
|
font-size: 30rpx;
|
|||
|
|
color: #303030;
|
|||
|
|
font-weight: bold;
|
|||
|
|
padding: 30rpx 0;
|
|||
|
|
border-bottom: 1rpx solid #E5E5E5;
|
|||
|
|
}
|
|||
|
|
.list{
|
|||
|
|
padding-bottom: 100rpx;
|
|||
|
|
.row{
|
|||
|
|
padding: 20rpx 0;
|
|||
|
|
.tit{
|
|||
|
|
font-size: 28rpx;
|
|||
|
|
color: #707070;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.flex{
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: space-between;
|
|||
|
|
align-items: center;
|
|||
|
|
}
|
|||
|
|
.contBox{
|
|||
|
|
padding: 24rpx;
|
|||
|
|
.box{
|
|||
|
|
background: #fff;
|
|||
|
|
border-radius: 10rpx;
|
|||
|
|
padding: 0 24rpx 10rpx 24rpx;
|
|||
|
|
margin-bottom: 24rpx;
|
|||
|
|
}
|
|||
|
|
.oneBox{
|
|||
|
|
padding: 0 24rpx;
|
|||
|
|
.item{
|
|||
|
|
display: flex;
|
|||
|
|
height: 144rpx;
|
|||
|
|
padding: 24rpx 0;
|
|||
|
|
border-top: 1px solid #f5f5f5;
|
|||
|
|
&:first-child{
|
|||
|
|
border-top: none;
|
|||
|
|
}
|
|||
|
|
image {
|
|||
|
|
width: 144rpx;
|
|||
|
|
height: 100%;
|
|||
|
|
background: #cbcacb;
|
|||
|
|
border-radius: 10rpx;
|
|||
|
|
margin-right: 20rpx;
|
|||
|
|
}
|
|||
|
|
.right{
|
|||
|
|
font-size: 28rpx;
|
|||
|
|
flex: 1;
|
|||
|
|
.txtBox{
|
|||
|
|
color: #333;
|
|||
|
|
.name{
|
|||
|
|
display: -webkit-box;
|
|||
|
|
-webkit-box-orient: vertical;
|
|||
|
|
-webkit-line-clamp: 2;
|
|||
|
|
overflow: hidden;
|
|||
|
|
flex: 1;
|
|||
|
|
}
|
|||
|
|
.icon{
|
|||
|
|
font-size: 24rpx;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.sku{
|
|||
|
|
font-size: 24rpx;
|
|||
|
|
color: #999999;
|
|||
|
|
margin-top: 24rpx;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.twoBox{
|
|||
|
|
.item{
|
|||
|
|
padding: 20rpx 0;
|
|||
|
|
font-size: 28rpx;
|
|||
|
|
color: #333;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.threeBox{
|
|||
|
|
height: 86rpx;
|
|||
|
|
font-size: 28rpx;
|
|||
|
|
background: #fff;
|
|||
|
|
border-radius: 10rpx;
|
|||
|
|
padding: 0 20rpx;
|
|||
|
|
margin-bottom: 24rpx;
|
|||
|
|
color: #333;
|
|||
|
|
.price{
|
|||
|
|
color: v-bind('priceColor');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.spBox{
|
|||
|
|
padding: 20rpx;
|
|||
|
|
background: #fff;
|
|||
|
|
border-radius: 10rpx;
|
|||
|
|
margin-bottom: 24rpx;
|
|||
|
|
font-size: 28rpx;
|
|||
|
|
color: #333;
|
|||
|
|
.sp{
|
|||
|
|
margin-bottom: 20rpx;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.fourBox{
|
|||
|
|
font-size: 24rpx;
|
|||
|
|
color: #98989f;
|
|||
|
|
text-align: center;
|
|||
|
|
margin-bottom: 24rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.refundImg{
|
|||
|
|
padding: 20rpx;
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
display: flex;
|
|||
|
|
background: #fff;
|
|||
|
|
.tit{
|
|||
|
|
color:#303030;
|
|||
|
|
font-size: 28rpx;
|
|||
|
|
width: 130rpx;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.imgBox{
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
flex-wrap: wrap;
|
|||
|
|
.imgList{
|
|||
|
|
width: 160rpx;
|
|||
|
|
height: 160rpx;
|
|||
|
|
margin: 0 20rpx 20rpx 0;
|
|||
|
|
position: relative;
|
|||
|
|
.img{
|
|||
|
|
width: 100%;
|
|||
|
|
height: 100%;
|
|||
|
|
border-radius: 8rpx;
|
|||
|
|
}
|
|||
|
|
.close{
|
|||
|
|
position: absolute;
|
|||
|
|
right: -15rpx;
|
|||
|
|
top: -20rpx;
|
|||
|
|
color: #fff;
|
|||
|
|
width: 40rpx;
|
|||
|
|
height: 40rpx;
|
|||
|
|
background-color: rgba(0,0,0,0.6);
|
|||
|
|
border-radius: 50%;
|
|||
|
|
.heng{
|
|||
|
|
display: block;
|
|||
|
|
width: 24rpx;
|
|||
|
|
height: 4rpx;
|
|||
|
|
background-color: #fff;
|
|||
|
|
margin: 18rpx auto;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.plus{
|
|||
|
|
border: 1px solid #e1e1e1;
|
|||
|
|
border-radius: 8rpx;
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: center;
|
|||
|
|
flex-direction: column;
|
|||
|
|
width: 160rpx;
|
|||
|
|
height: 160rpx;
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
margin: 0 20rpx 20rpx 0;
|
|||
|
|
text{
|
|||
|
|
font-size: 24rpx;
|
|||
|
|
color: #DBDBDB;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.comment-btn{
|
|||
|
|
margin-top: 60rpx;
|
|||
|
|
width: 80%;
|
|||
|
|
background-color: v-bind('Color');
|
|||
|
|
color: #fff;
|
|||
|
|
height: 86rpx;
|
|||
|
|
line-height: 86rpx;
|
|||
|
|
font-size: 30rpx;
|
|||
|
|
text-align: center;
|
|||
|
|
border-radius: 49rpx;
|
|||
|
|
margin-left: 10%;
|
|||
|
|
}
|
|||
|
|
</style>
|