4 changed files with 599 additions and 9 deletions
@ -0,0 +1,560 @@ |
|||
<!-- 申请售后 --> |
|||
<template> |
|||
<div class="sign"> |
|||
<el-dialog |
|||
:visible="DialogOrderAfterSaleVisible" |
|||
width="60vw" |
|||
:destroy-on-close="true" |
|||
:close-on-click-modal="false" |
|||
:show-close="false" |
|||
custom-class="qddialog" |
|||
top="8vh" |
|||
v-loading="DialogOrderAfterSaleloading" |
|||
> |
|||
<div slot="title" class="title"> |
|||
<span>申请售后</span> |
|||
</div> |
|||
|
|||
<!-- 售后方式--> |
|||
<div class="refund_type_box" v-if="schedule == 1"> |
|||
<ul class="box"> |
|||
<li> |
|||
<input type="radio" name="refundType" v-model="formData.refund_type" value="1"> |
|||
<div class="left"> |
|||
<strong>退货无需退款</strong> |
|||
<span>没收到货,或与卖家写上同意无需要退货只退款</span> |
|||
</div> |
|||
</li> |
|||
<li> |
|||
<input type="radio" name="refundType" v-model="formData.refund_type" value="2"> |
|||
<div class="left"> |
|||
<strong>退货退款</strong> |
|||
<span>已收到货,需退还收到的货物</span> |
|||
</div> |
|||
</li> |
|||
<li> |
|||
<input type="radio" name="refundType" v-model="formData.refund_type" value="4"> |
|||
<div class="left"> |
|||
<strong>仅退款</strong> |
|||
<span>仅退款</span> |
|||
</div> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
|
|||
<!--商品列表--> |
|||
<div class="goods_box" v-if="schedule == 2"> |
|||
<div class="goods" v-for="(v,k) in orderGoodsList"> |
|||
<div class="left"> |
|||
<input type="checkbox" name="refundType" v-model="selectOrderGoodsIds" :value="v.order_goods_id"> |
|||
<img :src="v.sku_image" alt=""> |
|||
</div> |
|||
<div class="center"> |
|||
<span>{{v.sku_name}}</span> |
|||
</div> |
|||
<div class="checkbox"> |
|||
|
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="form_box" v-if="schedule == 3"> |
|||
<el-form ref="form" :model="formData" label-width="120px"> |
|||
<el-form-item label="售后原因"> |
|||
<el-select v-model="formData.region" placeholder="请选择售后原因"> |
|||
<el-option v-for="(v,k) in refund_data.refund_reason_type" :key="k" :label="v" :value="v"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="售后说明"> |
|||
<el-input |
|||
type="textarea" |
|||
:autosize="{ minRows: 2, maxRows: 4}" |
|||
placeholder="请输入售后说明" |
|||
v-model="formData.refund_remark"> |
|||
</el-input> |
|||
</el-form-item> |
|||
|
|||
|
|||
<div class="evaluateForm"> |
|||
<el-form-item label="上传图片" class="evaluateUpload"> |
|||
<UploadImageOss |
|||
@input="uploadSccess($event, 'images')" |
|||
:limit="5" |
|||
:value="evaluateForm.images" |
|||
> |
|||
<template v-slot:upload> |
|||
<div class="upload_BOX"> |
|||
<div class="upload"> |
|||
<img src="~assets/images/downloadIMG.png"/> |
|||
<span>上传照片</span> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
</UploadImageOss> |
|||
</el-form-item> |
|||
</div> |
|||
</el-form> |
|||
</div> |
|||
|
|||
<span slot="footer" class="dialog-footer"> |
|||
<el-button @click="setSchedule('sub')" size="mini" v-if="schedule > 1">上一步</el-button> |
|||
<el-button @click="setSchedule('add')" size="mini" v-if="schedule < 3">下一步</el-button> |
|||
|
|||
<el-button @click="closr()" size="mini">取消</el-button> |
|||
<el-button v-if="schedule == 3" type="primary" @click="submetForm()" size="mini">提交</el-button> |
|||
</span> |
|||
</el-dialog> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import UploadImageOss from "@/components/uploadImageOss.vue"; |
|||
|
|||
export default { |
|||
//import引入的组件需要注入到对象中才能使用 |
|||
|
|||
components: { |
|||
UploadImageOss, |
|||
}, |
|||
props: { |
|||
DialogOrderAfterSaleVisible: Boolean, |
|||
DialogOrderAfterSaleloading: Boolean, |
|||
dialogOrderAfterSaleData: Object, |
|||
}, |
|||
data() { |
|||
//这里存放数据 |
|||
return { |
|||
schedule:1,//进度|1:展示选择售后方式,2:展示需要售后的商品列表,3:展示表单操作 |
|||
selectOrderGoodsIds:[],//选中的需要售后的商品id |
|||
orderGoodsList:[],//订单商品列表 |
|||
|
|||
//退款信息 |
|||
refund_data:{ |
|||
refund_type: [], |
|||
}, |
|||
|
|||
explanation:'', |
|||
formData:{ |
|||
order_goods_ids:'',//需要售后的商品id|多个值英文,号拼接,如"12,15,18" |
|||
refund_type:'',//售后方式|1=仅退款,2=退款退货(在这个状态进行判断是否付款,没付款就是直接仅退货),4=仅退货不退款 |
|||
refund_reason:'',//售后原因|如:"未按约定时间发货" |
|||
refund_remark:'',//售后说明 |
|||
refund_images:[],//上传图片,数组类型[[https://www.zhiyao.com/upload/a1111.png],[https://www.zhiyao.com/upload/a2222.png]] |
|||
},//表单 |
|||
|
|||
regionArr:[], |
|||
//售后方式各项值列表 |
|||
refundTypeArr:[ |
|||
{ |
|||
name:'退款无需退货', |
|||
val:'1', |
|||
explain:'没收到货,活跃卖家协商同意无需退货只退款', |
|||
}, |
|||
{ |
|||
name:'退货退款', |
|||
val:'2', |
|||
explain:'已收到货,需退还收到的货物', |
|||
}, |
|||
{ |
|||
name:'仅退货无需退款', |
|||
val:'4', |
|||
explain:'仅退货无需退款', |
|||
} |
|||
], |
|||
orderData:{},//订单数据 |
|||
|
|||
evaluateForm: { |
|||
explainGrade: {}, |
|||
content: "", |
|||
images: "", |
|||
}, |
|||
}; |
|||
}, |
|||
//监听属性 类似于data概念 |
|||
computed: {}, |
|||
//监控data中的数据变化 |
|||
watch: { |
|||
dialogOrderAfterSaleData: { |
|||
handler(newVal) { |
|||
console.log('qq1 (watch):', newVal); |
|||
this.orderData = newVal; // 将 dialogOrderAfterSaleData 的值赋给 orderData |
|||
this.getOrderGoodsList()//获取需要售后的商品列表 |
|||
}, |
|||
immediate: true, // 立即执行一次 |
|||
deep: true // 深度监听对象变化 |
|||
} |
|||
}, |
|||
//生命周期 - 创建完成(可以访问当前this实例) |
|||
created() { |
|||
if (this.DialogOrderAfterSaleVisible) { |
|||
|
|||
} |
|||
}, |
|||
|
|||
//生命周期 - 挂载完成(可以访问DOM元素) |
|||
mounted() { |
|||
|
|||
}, |
|||
//方法集合 |
|||
methods: { |
|||
//获取需要退款的数据 |
|||
getRefundData(){ |
|||
|
|||
this.$axios |
|||
.post(`/orderrefund/refundDataBatch`, {order_goods_ids: this.selectOrderGoodsIds.join()}) |
|||
.then((res) => { |
|||
if (res.code == 0) { |
|||
this.refund_data = res.data |
|||
this.formData.order_goods_ids = this.selectOrderGoodsIds.join() |
|||
// console.log('qq22',this.refund_data.refund_reason_type) |
|||
}else{ |
|||
this.$message.error(res.message); |
|||
} |
|||
}) |
|||
.catch((err) => { |
|||
this.$message.error(err); |
|||
} |
|||
); |
|||
}, |
|||
//获取需要售后的商品列表 |
|||
getOrderGoodsList(){ |
|||
this.$axios |
|||
.post(`/order/detail`, {order_id: this.orderData.order_id}) |
|||
.then((res) => { |
|||
if (res.code == 0) { |
|||
this.orderData = res.data |
|||
this.orderGoodsList = res.data.order_goods//需要售后的商品列表 |
|||
console.log('1111',this.orderGoodsList) |
|||
}else{ |
|||
this.$message.error(res.message); |
|||
} |
|||
}) |
|||
.catch((err) => { |
|||
this.$message.error(err); |
|||
} |
|||
); |
|||
}, |
|||
|
|||
//设置步骤 |
|||
setSchedule(type){ |
|||
let _schedule |
|||
if (type == 'add') { |
|||
//下一步 |
|||
_schedule = this.schedule + 1 |
|||
if (_schedule >= 3) { |
|||
_schedule = 3 |
|||
} |
|||
} else { |
|||
//上一步 |
|||
_schedule = this.schedule - 1 |
|||
if (_schedule <= 1) { |
|||
_schedule = 1 |
|||
} |
|||
} |
|||
|
|||
switch (_schedule) { |
|||
case 2: |
|||
if (!this.formData.refund_type){ |
|||
this.$message.error('请选择售后方式'); |
|||
return |
|||
} |
|||
break; |
|||
case 3: |
|||
if (this.selectOrderGoodsIds.length <= 0){ |
|||
this.$message.error('请选择需要售后的商品'); |
|||
return |
|||
} |
|||
this.getRefundData() |
|||
break; |
|||
} |
|||
this.schedule = _schedule |
|||
}, |
|||
|
|||
//上传图片 |
|||
uploadSccess(e, key) { |
|||
this.evaluateForm.images = e; |
|||
console.log(e, key); |
|||
}, |
|||
|
|||
//提交 |
|||
submetForm(){ |
|||
console.log('ttt',this.evaluateForm) |
|||
|
|||
this.formData.refund_images = []; |
|||
if(this.evaluateForm.images.length > 0){ |
|||
this.evaluateForm.images.forEach((v,k)=>{ |
|||
this.formData.refund_images[k] = [v] |
|||
}) |
|||
} |
|||
|
|||
this.$axios |
|||
.post(`/orderrefund/refund`, this.formData) |
|||
.then((res) => { |
|||
if (res.code == 0) { |
|||
this.$message.success(res.message); |
|||
setTimeout(() => { |
|||
this.closr(); |
|||
}, 1500); |
|||
}else{ |
|||
this.$message.error(res.message); |
|||
} |
|||
console.log(res.data); |
|||
}) |
|||
.catch((err) => { |
|||
this.$message.error(err); |
|||
} |
|||
); |
|||
|
|||
}, |
|||
|
|||
//关闭弹窗 |
|||
closr(){ |
|||
this.$emit("closrDialogOrderAfterSale", true); |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
<style lang="scss" scoped> |
|||
::v-deep { |
|||
.el-dialog__header, |
|||
.el-dialog__body, |
|||
.el-dialog__footer { |
|||
padding: 0 30px; |
|||
} |
|||
.el-dialog__header { |
|||
padding-top: 33px; |
|||
} |
|||
.el-dialog__footer { |
|||
padding-bottom: 20px; |
|||
} |
|||
} |
|||
.qddialog { |
|||
padding: 33px 30px 20px; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
img { |
|||
width: 24px; |
|||
height: 24px; |
|||
margin-right: 11px; |
|||
} |
|||
|
|||
span { |
|||
font-size: 16px; |
|||
font-family: PingFangSC-Medium, PingFang SC; |
|||
font-weight: 500; |
|||
color: #222222; |
|||
line-height: 24px; |
|||
} |
|||
} |
|||
.timenum { |
|||
font-size: 30px; |
|||
font-family: DINAlternate-Bold, DINAlternate; |
|||
font-weight: bold; |
|||
color: #ff1449; |
|||
line-height: 35px; |
|||
text-align: center; |
|||
margin: 20px 0 10px; |
|||
} |
|||
.timeText { |
|||
font-size: 14px; |
|||
font-family: PingFangSC-Regular, PingFang SC; |
|||
font-weight: 400; |
|||
color: #999999; |
|||
text-align: center; |
|||
line-height: 20px; |
|||
} |
|||
.gz { |
|||
p { |
|||
margin: 20px 0 10px; |
|||
font-size: 14px; |
|||
font-family: PingFangSC-Medium, PingFang SC; |
|||
font-weight: 500; |
|||
color: #222222; |
|||
line-height: 20px; |
|||
} |
|||
.gztext { |
|||
font-size: 14px; |
|||
font-family: PingFangSC-Regular, PingFang SC; |
|||
font-weight: 400; |
|||
|
|||
line-height: 22px; |
|||
p { |
|||
color: #999999; |
|||
} |
|||
} |
|||
} |
|||
.jl { |
|||
.qdjl { |
|||
margin: 20px 0 10px; |
|||
|
|||
font-size: 14px; |
|||
font-family: PingFangSC-Medium, PingFang SC; |
|||
font-weight: 500; |
|||
color: #222222; |
|||
line-height: 20px; |
|||
} |
|||
ul { |
|||
li { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
margin-bottom: 20px; |
|||
.left { |
|||
display: flex; |
|||
align-items: center; |
|||
.img { |
|||
width: 44px; |
|||
height: 44px; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
margin-right: 10px; |
|||
// background-color: $--color-primary; |
|||
background: linear-gradient(141deg, #ffac73 0%, #fe6e0b 100%); |
|||
border-radius: 100%; |
|||
img { |
|||
width: 26px; |
|||
height: 26px; |
|||
} |
|||
} |
|||
.cnt { |
|||
height: 44px; |
|||
|
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: space-between; |
|||
.title { |
|||
font-size: 16px; |
|||
font-family: PingFangSC-Medium, PingFang SC; |
|||
font-weight: 500; |
|||
color: #222222; |
|||
line-height: 22px; |
|||
letter-spacing: 1px; |
|||
} |
|||
.time { |
|||
font-size: 12px; |
|||
font-family: PingFangSC-Regular, PingFang SC; |
|||
font-weight: 400; |
|||
color: #999999; |
|||
line-height: 17px; |
|||
} |
|||
} |
|||
} |
|||
.right { |
|||
.big { |
|||
font-size: 20px; |
|||
font-family: DINAlternate-Bold, DINAlternate; |
|||
font-weight: bold; |
|||
color: #585858; |
|||
line-height: 24px; |
|||
} |
|||
.min { |
|||
font-size: 14px; |
|||
font-family: PingFangSC-Regular, PingFang SC; |
|||
font-weight: 400; |
|||
color: #585858; |
|||
line-height: 20px; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.goods_box{ |
|||
margin-top: 15px; |
|||
.goods{ |
|||
padding: 8px; |
|||
margin-bottom: 8px; |
|||
border: 1px solid #e5e5e5; |
|||
display: flex; |
|||
align-items: center; |
|||
.left{ |
|||
|
|||
display: flex; |
|||
align-items: center; |
|||
img{ |
|||
margin-left: 10px; |
|||
width: 60px; |
|||
height: 60px; |
|||
object-position: center; |
|||
object-fit: cover; |
|||
} |
|||
} |
|||
.center{ |
|||
margin-left: 10px; |
|||
span{ |
|||
//font-size: 15px; |
|||
} |
|||
} |
|||
.checkbox{ |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
//第一步,选择售后类型 |
|||
.refund_type_box{ |
|||
margin-top: 15px; |
|||
ul{ |
|||
li{ |
|||
margin-bottom: 10px; |
|||
display: flex; |
|||
align-items: center; |
|||
.left{ |
|||
margin-left: 10px; |
|||
display: flex; |
|||
flex-direction: column; |
|||
strong{ |
|||
font-size: 16px; |
|||
} |
|||
span{ |
|||
margin-top: 4px; |
|||
font-size: 14px; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
//上传相关 |
|||
.evaluateUpload { |
|||
.el-form-item__content { |
|||
width: 100px; |
|||
border-radius: 4px; |
|||
|
|||
.finish_room { |
|||
margin: 0 auto; |
|||
text-align: center; |
|||
.finish_room2 { |
|||
div { |
|||
display: block; |
|||
width: 100%; |
|||
height: 100%; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.upload_BOX { |
|||
width: 152px !important; |
|||
height: 152px !important; |
|||
border-radius: 4px; |
|||
border: 1px solid #dddddd; |
|||
text-align: center; |
|||
|
|||
.upload { |
|||
color: #ccc; |
|||
margin-top: 50px; |
|||
img { |
|||
margin: auto; |
|||
width: 22px; |
|||
height: 20px; |
|||
} |
|||
} |
|||
} |
|||
</style> |
|||
Loading…
Reference in new issue