齐采药WEB端项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

615 lines
16 KiB

<template>
<!-- 售后申请退款 -->
<div>
<div class="header wrapper_1200">
<span class="home">
<nuxt-link to="/">首页 ></nuxt-link> >
</span>申请退款
</div>
<div class="refund wrapper_1200">
<table class="table">
<thead>
<tr>
<td>
<table border="0" class="tableHead">
<tr>
<td class="td checkboxs" v-if="orderData.cartInfo.length>1">
<el-checkbox v-model="isAllSelect" @change="checkboxAllChange">全选</el-checkbox>
</td>
<td class="td pictrue">商品信息</td>
<td class="td">商品价格</td>
<td class="td">已购件数</td>
<td class="td" style="text-align: center">退款件数</td>
</tr>
</table>
</td>
</tr>
</thead>
<tbody>
<tr>
<td>
<el-checkbox-group v-model="checkedlist" @change="checkboxChange">
<table border="0" class="tableHead">
<tr v-for="(item, index) in orderData.cartInfo" :key="index">
<td class="td checkboxs" v-if="orderData.cartInfo.length>1">
<el-checkbox :label="item.id">{{item.valNull}}</el-checkbox>
</td>
<td class="td pictrue">
<table border="0">
<tr>
<td class="acea-row row-center-wrapper">
<img
:src="item.productInfo.attrInfo?item.productInfo.attrInfo.image:item.productInfo.image"
/>
<div>
<div class="name">
{{ item.productInfo.store_name
}}
<template
v-if="item.productInfo.attrInfo"
>{{ item.productInfo.attrInfo.suk }}</template>
</div>
</div>
</td>
</tr>
</table>
</td>
<td
class="td"
>{{ item.productInfo.attrInfo?item.productInfo.attrInfo.price:item.productInfo.price}}</td>
<td class="td">{{ item.cart_num }}</td>
<td class="td">
<div class="cartNum acea-row row-center-wrapper">
<div
class="iconfont icon-shangpinshuliang-jian on"
v-if="item.changeRefund===1 || item.changeRefund===0"
></div>
<div
class="iconfont icon-shangpinshuliang-jian"
v-else
@click="subCart(item)"
></div>
<div class="numCon">{{item.changeRefund}}</div>
<div
class="iconfont icon-shangpinshuliang-jia on"
v-if="item.changeRefund===item.refundable"
></div>
<div
class="iconfont icon-shangpinshuliang-jia"
v-else
@click="addCart(item)"
></div>
</div>
</td>
</tr>
</table>
</el-checkbox-group>
</td>
</tr>
</tbody>
</table>
<client-only>
<el-form ref="form" :model="form" label-width="80px">
<div class="cont">
<el-form-item label="退款原因">
<el-select v-model="form.region" placeholder="请选择退款原因">
<el-option
:label="item"
:value="item"
v-for="(item, index) in refundArray"
:key="index"
></el-option>
</el-select>
</el-form-item>
<el-form-item
label="退款类型"
v-if="
orderData._status &&
orderData._status._type !== 1
"
>
<el-radio-group v-model="refund_type">
<el-radio
:label="item.value"
v-for="(item, index) in returnGoodsData"
:key="index"
>{{item.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注说明">
<el-input
type="textarea"
placeholder="填写备注信息,100字以内"
:autosize="{ minRows: 4 }"
maxlength="100"
v-model="form.desc"
></el-input>
</el-form-item>
<el-form-item label="上传凭证">
<div class="img-box-wrapper">
<el-upload
list-type="picture-card"
:action="upLoadUrl"
:headers="myHeaders"
:limit="3"
:on-remove="handleRemove"
:on-success="handleSuccess"
:on-exceed="handleExceed"
:before-upload="beforeUpload"
>
<i class="el-icon-plus"></i>
</el-upload>
</div>
<p style="color: #999;">最多上传3张图片</p>
</el-form-item>
</div>
<div class="buttonSub acea-row row-between-wrapper">
<div>共退货{{refundNum}}件商品</div>
<el-button type="primary" @click="onSubmit">申请退款</el-button>
</div>
</el-form>
</client-only>
</div>
<!-- 弹窗 -->
<client-only>
<el-dialog :modal="true" :visible.sync="isDialog" width="370px" :show-close="false">
<div class="refund-box">
<img src="~assets/images/refund.png" alt />
<p class="title">退款申请提交成功</p>
<span>我们会继续为您提供更优质的商品及服务</span>
<el-button type="primary" @click="subBtn">确认</el-button>
</div>
</el-dialog>
</client-only>
</div>
</template>
<script>
import setting from "~/setting";
export default {
auth: "guest",
data() {
return {
form: {
region: "",
desc: ""
},
upLoadUrl: setting.apiBaseURL + "/upload/image",
pics: [],
refundArray: [],
orderData: {},
myHeaders: {},
isDialog: false,
refund_type: "1",
returnGoodsData: [
{
label: "退款",
value: "1"
},
{
label: "退货退款",
value: "2"
}
],
orderId: "",
oid: 0,
isAllSelect: false,
checkedlist: [],
checkOptions: [],
refundNum: 0
};
},
async asyncData({ app, query }) {
let [data, refund, ids, numCon] = await Promise.all([
app.$axios.post(`/pc/order/refund/cart_info`, {
id: query.id,
cart_ids: query.cartIds
}),
app.$axios.get(`/order/refund/reason`),
[],
0
]);
data.data.cartInfo.forEach((item, index) => {
let num = parseInt(item.cart_num) - parseInt(item.refund_num);
item.changeRefund = num;
item.refundable = num;
item.valNull = "";
ids.push(item.id);
if (data.data.cartInfo.length === 1) {
numCon = num;
}
if (item.is_gift) {
data.data.cartInfo.splice(index, 1);
}
});
return {
orderData: data.data,
refundArray: refund.data,
orderId: query.orderId,
oid: query.id,
checkOptions: ids,
refundNum: numCon
};
},
fetch({ store }) {
store.commit("isHeader", true);
store.commit("isFooter", true);
},
head() {
return {
title: "申请退款-" + this.$store.state.titleCon
};
},
created() {
let local = this.$cookies.get("auth.strategy");
this.myHeaders = {
Authorization: this.$cookies.get(`auth._token.${local}`)
};
},
methods: {
checkboxAllChange(val) {
this.checkedlist = val ? this.checkOptions : [];
if (val) {
let num = 0;
this.orderData.cartInfo.forEach(item => {
num = num + item.changeRefund;
});
this.refundNum = num;
} else {
this.refundNum = 0;
}
},
checkboxChange(value) {
let cartInfo = this.orderData.cartInfo,
num = 0;
let checkedCount = value.length;
this.isAllSelect = checkedCount === cartInfo.length;
cartInfo.forEach(i => {
value.forEach(j => {
if (i.id == j) {
num = num + i.changeRefund;
}
});
});
this.refundNum = num;
},
inArray: function(search, array) {
for (let i in array) {
if (array[i] == search) {
return true;
}
}
return false;
},
subCart(item) {
item.changeRefund = item.changeRefund - 1;
if (item.changeRefund <= 1) {
item.changeRefund = 1;
}
if (
this.inArray(item.id, this.checkedlist) ||
this.orderData.cartInfo.length === 1
) {
this.refundNum = this.refundNum - 1;
}
},
addCart(item) {
item.changeRefund = item.changeRefund + 1;
if (item.changeRefund >= item.refundable) {
item.changeRefund = item.refundable;
}
if (
this.inArray(item.id, this.checkedlist) ||
this.orderData.cartInfo.length === 1
) {
this.refundNum = this.refundNum + 1;
}
},
handleClose() {
this.isDialog = false;
},
subBtn() {
this.isDialog = false;
return this.$router.replace({
path: "/user/orderList",
query: { types: 1 }
});
},
onSubmit() {
let that = this;
if (that.form.region === "") {
return this.$message.error("请选择退款原因");
}
let cartIds = [],
cartInfo = this.orderData.cartInfo;
if (cartInfo.length === 1) {
cartIds = [
{
cart_id: cartInfo[0].id,
cart_num: cartInfo[0].changeRefund
}
];
} else if (cartInfo.length > 1) {
console.log("uuu", cartInfo.length);
if (!that.checkedlist.length)
return this.$message.error("请选择要退款的商品");
cartInfo.forEach(i => {
that.checkedlist.forEach(j => {
if (i.id == j) {
cartIds.push({
cart_id: i.id,
cart_num: i.changeRefund
});
}
});
});
}
that.$axios
.post(`/order/refund/apply/${this.oid}`, {
text: that.form.region || "",
refund_reason_wap_explain: that.form.desc,
refund_reason_wap_img: that.pics.join(","),
uni: that.orderData.orderId,
refund_type: that.refund_type,
cart_ids: cartIds
})
.then(res => {
this.isDialog = true;
})
.catch(err => {
return this.$message.error(err);
});
},
handleExceed() {
this.$message.warning("最多上传3张图片");
},
handleSuccess(response) {
if (response.status === 200) {
this.pics.push(response.data.url);
} else if (response.status === 400) {
this.$message.error(response.msg);
}
},
beforeUpload(file) {
const isImage = file.type === "image/jpeg" || file.type === "image/png";
if (!isImage) {
this.$message.error("上传图片只能是 JPG、PNG 格式!");
}
return isImage;
},
handleRemove(file, fileList) {
this.pics = [];
fileList.forEach(item => {
this.pics.push(item.response.data.url);
});
}
}
};
</script>
<style lang="scss" scoped>
/deep/.el-checkbox__inner {
border-radius: 50%;
}
/deep/.el-checkbox__input.is-focus .el-checkbox__inner {
border-color: #dcdfe6;
}
/deep/.el-checkbox__input.is-checked .el-checkbox__inner {
border-color: #e93323;
}
.buttonSub {
margin-top: 20px;
}
.header {
height: 60px;
line-height: 60px;
color: #999999;
.home {
color: #282828;
}
}
.cartNum {
.iconfont {
width: 40px;
height: 36px;
line-height: 36px;
border: 1px solid #d3d3d3;
text-align: center;
color: #707070;
background-color: #fff;
&.on {
color: #d3d3d3;
}
}
.numCon {
width: 54px;
height: 36px;
border: 0;
border-top: 1px solid #d3d3d3;
border-bottom: 1px solid #d3d3d3;
font-size: 15px;
color: #5a5a5a;
text-align: center;
line-height: 36px;
outline: none;
}
}
.refund {
padding: 40px 20px 46px;
background: #ffffff;
.el-icon-plus {
margin-top: 20px;
}
.table {
width: 100%;
border: 1px solid #efefef;
border-collapse: collapse;
thead {
background: #efefef;
.tableHead {
width: 100%;
}
.td {
width: 183px;
height: 40px;
font-size: 14px;
text-align: left;
color: #282828;
&.checkboxs {
padding-left: 21px;
width: 115px;
}
&.pictrue {
width: auto;
text-align: left;
padding-left: 35px;
}
}
}
tbody {
.tableHead {
width: 100%;
}
.td {
width: 183px;
font-size: 14px;
text-align: left;
color: #282828;
padding: 20px 0;
&.checkboxs {
width: 115px;
padding-left: 21px;
}
&.pictrue {
width: auto;
text-align: left;
padding-left: 35px;
span {
margin-left: 10px;
font-size: 12px;
color: #b1b1b1;
}
}
}
}
img {
float: left;
width: 70px;
height: 70px;
border: 1px solid #eee;
border-radius: 5px;
+ div {
margin-left: 20px;
}
}
.name {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
margin-bottom: 13px;
overflow: hidden;
width: 345px;
}
}
.el-form {
margin-top: 20px;
.cont {
padding-right: 25px;
padding-left: 25px;
border: 1px solid #efefef;
.el-form-item {
padding-top: 25px;
padding-bottom: 25px;
~ .el-form-item {
border-top: 1px solid #efefef;
}
}
}
> .el-form-item {
margin-top: 25px;
margin-bottom: 0;
text-align: right;
}
.el-textarea {
width: 820px;
}
/deep/.el-textarea__inner {
border: none;
background: #f7f7f7;
}
/deep/.el-upload--picture-card {
width: 70px;
height: 70px;
border-style: solid;
line-height: 68px;
}
/deep/.el-upload-list--picture-card .el-upload-list__item {
width: 70px;
height: 70px;
}
}
}
.refund-box {
display: flex;
flex-direction: column;
align-items: center;
.title {
color: #e93323;
font-size: 20px;
margin-top: 20px;
}
span {
margin: 10px 0 40px;
color: #939393;
font-size: 14px;
}
button {
width: 150px;
}
}
.img-box-wrapper {
display: flex;
flex-wrap: wrap;
.img-item {
position: relative;
width: 70px;
height: 70px;
margin-right: 20px;
margin-bottom: 12px;
border: 1px solid #c0ccda;
border-radius: 6px;
img {
width: 100%;
height: 100%;
border-radius: 6px;
}
.icon {
position: absolute;
right: -10px;
top: -8px;
font-size: 20px;
cursor: pointer;
color: #e93323;
}
}
}
</style>