433 lines
9.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>