glhcp/uniapp/bundle/pages/apply_refund/apply_refund.vue

261 lines
6.1 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="apply-refund">
<view class="goods bg-white m-t-20">
<view class="flex">
<u-image width="160rpx" height="160rpx" border-radius="6rpx" lazy-load :src="goods.image" />
<view class="goods-info">
<view class="line-2">{{goods.goods_name}}</view>
<view class="xs muted m-t-10">{{goods.spec_value}}</view>
</view>
</view>
</view>
<view class="opt-box m-t-20 bg-white">
<view v-show="!hiddenOpt">
<view class="opt-item flex row-between border-line" @tap="onlyRefund">
<view>
<view class="lg">仅退款</view>
<view class="muted xs m-t-10">未收到货与卖家协商同意无需退货只需退款</view>
</view>
<u-icon class="m-l-10" name="arrow-right" size="28" />
</view>
<view class="opt-item flex row-between" @tap="allRefunds">
<view>
<view class="lg">退货退款</view>
<view class="muted xs m-t-10">已收到货需退还收到的实物</view>
</view>
<u-icon class="m-l-10" name="arrow-right" size="28" />
</view>
</view>
<view v-show="hiddenOpt">
<view class="refund-info flex row-between m-t-20">
<view class="lable">数量</view>
<view>{{goods.goods_num}}</view>
</view>
<view class="refund-info flex row-between">
<view class="lable">退款金额</view>
<price-format :color="colorConfig.primary" :price="goods.goods_price" />
</view>
<view class="refund-info flex row-between" @tap="showPop=true">
<view class="lable">退款原因</view>
<view class="flex">
<text :class="{muted: !reasonString}">{{reasonString ? reasonString : '请选择' }}</text>
<u-icon class="m-l-10" name="arrow-right" size="28" />
</view>
</view>
<view class="refund-info flex col-top">
<view class="label">备注说明</view>
<view class="flex-1" style="background-color: #F8F8F8;">
<u-input v-model="remark" type="textarea" placeholder="请描述申请售后的具体原因100字以内" :border="false"
:height="160" />
</view>
</view>
<view class="upload bg-white">
<view class="title flex row-between">
<view>上传凭证</view>
<view class="muted">选填最多可上传1张</view>
</view>
<u-upload ref="uUpload" :show-progress="false" :header="{token: $store.getters.token}"
:max-count="1" width="160" height="160" :action="action" upload-text="上传图片"
@on-success="onSuccess" @on-remove="onRemove" />
</view>
</view>
</view>
<button v-show="hiddenOpt" class="btn br60" type="primary" size="lg" @tap="onSubmit">申请退款</button>
<u-select v-model="showPop" mode="single-column" value-name="index" label-name="name" :list="reason"
@confirm="confirmSelect"></u-select>
</view>
</template>
<script>
import {
refundOptType
} from "@/utils/type";
import {
baseURL
} from '@/config/app';
import {
getGoodsInfo,
applyAfterSale,
applyAgain
} from "@/api/user";
import {
uploadFile,
trottle
} from '@/utils/tools.js';
export default {
data() {
return {
action: baseURL + '/api/file/formimage',
hiddenOpt: false,
optTyle: refundOptType.ONLY_REFUND,
goods: {},
reason: [],
showPop: false,
reasonString: '',
fileList: [],
remark: ""
};
},
onLoad(options) {
const {
order_id,
item_id,
after_sale_id
} = this.$Route.query
this.orderId = order_id;
this.itemId = item_id;
this.afterSaleId = after_sale_id;
this.getGoodsInfoFun();
this.onSubmit = trottle(this.onSubmit, 1000, this)
},
methods: {
confirmSelect(e) {
this.reasonString = e[0].label
},
onlyRefund() {
this.optTyle = refundOptType.ONLY_REFUND
this.hiddenOpt = true
},
allRefunds() {
this.optTyle = refundOptType.REFUNDS;
this.hiddenOpt = true;
},
onSuccess(e) {
this.fileList.push(e.data.base_uri)
},
onRemove(index) {
this.fileList.splice(index, 1)
console.log(index)
},
async onSubmit() {
const {
reason,
reasonString,
optTyle,
remark,
fileList
} = this;
if (!reasonString) {
return this.$toast({
title: '请选择退款原因'
});
}
const params = {
reason: reasonString,
refund_type: optTyle,
remark: remark,
img: fileList.length ? fileList[0] : ''
};
if (this.afterSaleId) {
params.id = this.afterSaleId
} else {
params.item_id = this.itemId
params.order_id = this.orderId
}
const {
data,
code,
msg
} = this.afterSaleId ? await applyAgain(params) : await applyAfterSale(params)
if (code == 1) {
this.$toast({
title: msg
});
uni.$emit("refreshsale")
setTimeout(() => {
this.$Router.replace({
path: '/bundle/pages/after_sales_detail/after_sales_detail',
query: {
id: data.after_sale_id
}
})
}, 1000)
}
},
getGoodsInfoFun() {
let {
orderId,
itemId
} = this;
getGoodsInfo({
order_id: orderId,
item_id: itemId
}).then(res => {
if (res.code == 1) {
this.goods = res.data.goods;
this.reason = res.data.reason.map((item, index) => ({
name: item,
index
}));
}
});
}
}
};
</script>
<style lang="scss">
.apply-refund {
padding-bottom: 50rpx;
.goods {
padding: 20rpx 24rpx;
.goods-info {
margin-left: 24rpx;
flex: 1;
}
}
}
.opt-box {
.opt-item {
padding: 20rpx 20rpx 30rpx;
}
}
.apply-refund {
.refund-info {
padding: 24rpx 20rpx;
border-bottom: $-solid-border;
.label {
width: 140rpx;
margin-top: 19rpx;
}
textarea {
flex: 1;
height: 172rpx;
border-radius: 10rpx;
padding: 20rpx;
box-sizing: border-box;
}
}
.upload {
padding: 0 20rpx 30rpx;
.title {
padding: 24rpx 0;
}
}
.btn {
margin: 30rpx 26rpx
}
}
</style>