6
0
Fork 0
jiqu-library-miniprogram/src/pageA/after_sales_detail/index.vue

440 lines
15 KiB
Vue
Raw 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>
<loading-view v-if="isFirstLoading"></loading-view>
<view class="h-420rpx p-base bottom-bg">
<view class="text-lg font-extrabold text-white text-left">{{detail.state|saleText}}</view>
<view class="py-30rpx -mx-base mt-40rpx">
<block v-if="detail.state!=7">
<cu-steps mode="icon" icon="checkmark-circle-fill" active-color="#ffffff" active-text-color="#fff"
un-active-text-color="#fff" un-active-color="#A6A6A6" :list="numList" :current="current" :text-style="{
marginTop: '30rpx',
color: '#fff',
}"></cu-steps>
</block>
<block v-else>
<cu-steps mode="icon" icon="checkmark-circle-fill" active-color="#ffffff" active-text-color="#fff"
un-active-text-color="#fff" un-active-color="#A6A6A6" :list="numLists" :current="current" :text-style="{
marginTop: '30rpx',
color: '#fff',
}"></cu-steps>
</block>
</view>
</view>
<view class="-mt-120rpx px-base relative">
<view class="bg-white rounded-xs card h-170rpx pl-24rpx py-18rpx flex"
@tap="$u.route('/pageA/after_sales_logistics/index',{id:detail.id})">
<view class="flex-1 w-0">
<view class="text-lg text-black">{{detail.state|saleText}}</view>
<view class="text-lg text-hex-808080 mt-25rpx line-1">{{detail.remarks?detail.remarks:'资料已提交,请耐心等待客服审核'}}</view>
</view>
<view class="flex items-center pr-20rpx text-hex-808080">
<u-icon name="arrow-right" size="30"></u-icon>
</view>
</view>
<view class="bg-white rounded-xs mt-30rpx p-base">
<view class="text-lg text-black">{{detail.type|typeList}} </view>
<view class="mt-36rpx">
<view class="text-hex-808080">问题描述:{{detail.description}}</view>
<view class="grid grid-cols-3 gap-x-45rpx gap-y-23rpx mt-14rpx">
<u-image v-for="(item,index) in detail.images" :key="index" class="flex-none" border-radius="8rpx"
width="190" height="190" :src="item" :lazy-load="true"></u-image>
</view>
<block >
<view class="flex items-center justify-between mt-30rpx">
<view>回复:</view>
<block v-if="detail.type==1||detail.type==2">
<view v-if="detail.state==3 || detail.state==4 ||detail.state==5" class="text-hex-d43030">退款金额:{{detail.amount}}元</view>
</block>
</view>
<view class="mt-base">{{detail.remarks?detail.remarks:'资料已提交,请耐心等待客服审核'}}</view>
</block>
</view>
</view>
<view class="bg-white rounded-xs mt-30rpx p-base">
<view class="text-lg text-black">商品信息</view>
<view class="mt-16rpx flex">
<u-image class="flex-none" border-radius="15rpx" width="190" height="190" :src="detail.product.cover"
:lazy-load="true"></u-image>
<view class="ml-10rpx flex-1">
<view class="text-hex-808080 text-lg h-90rpx">{{detail.product.name}}</view>
<view class="flex justify-between mt-6rpx">
<view class="text-black text-lg flex-1"> 单价:¥{{detail.product.sell_price}} </view>
<view class="text-black text-lg flex-1"> 数量:{{detail.product.num}} </view>
</view>
</view>
</view>
</view>
<!-- <view class="bg-white rounded-xs mt-30rpx p-base"> -->
<!-- 货运单号 -->
<block v-if="(detail.type==1 ||detail.type==3)&&detail.state==3 ">
<view class="flex items-center mt-40rpx ">
<view>退货运单号:</view>
<u-input class="bg-white" border placeholder="请输入运单号" v-model="textContent" />
</view>
</block>
<!-- 打回重填 -->
<block v-if="detail.state==1">
<view class="bg-white rounded-xs mt-30rpx p-base">
<!-- <view class="bg-white rounded-xs "> -->
<view class="text-lg text-black flex items-center " @tap="typeShow = true">
<view class="w-120rpx">
<text class="imt">类型:</text>
</view>
<view class="flex-1 text-right text-hex-808080">
<text class="mr-10rpx">{{ typeText }}</text>
<u-icon name="arrow-right"></u-icon>
</view>
<!-- </view> -->
</view>
<view class="text-lg text-black mt-10rpx imt">问题描述 </view>
<view class="mt-10rpx">
<textarea class="min-h-130rpx w-full" placeholder-style="text-h999" placeholder="为了更好的解决您的问题,请尽量描述详细"
maxlength="100" auto-height v-model="content"></textarea>
<view class="py-12rpx grid grid-cols-3 gap-20rpx">
<view class="relative w-full" style="padding-top: 100%;" v-for="(img, index) in tempFilePaths"
:key="index">
<view class="img absolute left-0 top-0 w-full h-full">
<image class="img1 w-full h-full" :src="img"></image>
<view
class="absolute bg-hex-f30606 rounded-full w-48rpx h-48rpx flex items-center justify-center -top-10rpx -right-10rpx text-gray"
@tap="onDeleteImg(index)">
<u-icon size="20" color="#ffffff" name="close"></u-icon>
</view>
</view>
</view>
<view class="relative w-full" style="padding-top: 100%;" v-if="tempFilePaths.length < maxImgLength">
<view class="img absolute left-0 top-0 w-full h-full" @tap="openImage">
<u-icon name="camera"></u-icon>
<text class="text-28rpx mt-6rpx">图片</text>
</view>
</view>
<!-- 字数统计 -->
<!-- <view class="text-h999 absolute right-18rpx bottom-30rpx">{{ content.length }}/100</view> -->
</view>
</view>
</view>
</block>
</view>
<view>
<view class="py-35rpx px-base">
<view class="login-btn " v-if="detail.state==1" @tap="onSubmit"> 补充资料 </view>
<view class="login-btn " v-if="detail.state==3" @tap="onConfirm"> 确认 </view>
<view class="login-btn mt-base" v-if="detail.state==1 ||detail.state==2 ||detail.state==3" @tap="cancelShow=true">
取消申请 </view>
</view>
<!-- </view> -->
</view>
<u-select v-model="typeShow" @confirm="onChangeType" :list="typeList" :default-value="type"></u-select>
<u-action-sheet :list="list" @tap="uploadImge" v-model="show"></u-action-sheet>
<cu-modal v-model="cancelShow" @confirm="confirm" confirm-color="#378264" show-cancel-button
content="是否取消申请"></cu-modal>
</view>
</template>
<script>
import {
album,
camera
} from '@/utils/author.js'
import uploadImage from '@/utils/ossutil/uploadFile.js';
export default {
data() {
return {
isFirstLoading:true,
id:'',
show: false,
list: [{
text: '拍摄',
fontSize: 28,
color: '#383838'
},
{
text: '从相册选择',
fontSize: 28,
color: '#383838'
}
],
detail: {
product: {}
},
textContent: '', //退货运单号
tempFilePaths: [], //
imgList: [],
maxImgLength: 6,
content: '',
numList: [{
name: '提交申请',
},
{
name: '客服审核',
},
{
name: '客户确认',
},
{
name: '完成',
},
],
numLists: [{
name: '提交申请',
},
{
name: '取消申请',
},
{
name: '完成',
},
],
typeShow: false,
type: [],
content: '',
cancelShow:false
};
},
computed: {
current() {
return this.detail.state - 2
},
typeText() {
return this.typeList[this.type[0]]?.label ?? '请选择';
},
typeList(){
const price=Number(this.detail.product.total_amount)
const isprice=price>0?true:false
let arr=[
{
value: 1,
label: '退款退货',
},
{
value: 2,
label: '退款',
},
{
value: 3,
label: '换货',
},
{
value: 4,
label: '漏发',
},
]
if(this.detail.product.is_gift){
arr=[
{
value: 3,
label: '换货',
},
{
value: 4,
label: '漏发',
},
]
}else if(!this.detail.product.is_gift && !isprice){
arr=[
{
value: 1,
label: '退款退货',
},
{
value: 3,
label: '换货',
},
{
value: 4,
label: '漏发',
},
]
}
return arr
}
},
onLoad({
id
}) {
this.id=id
this.getDate(id)
},
methods: {
//获取详情
async getDate(id) {
try{
let resDate = await this.$api.get(`/v1/after-sales/${id}`)
this.detail = resDate
}catch(err){}finally{
this.isFirstLoading=false
}
},
//类型改变
onChangeType(val) {
this.type = [this.typeList.findIndex((e) => e.value == val[0].value)];
},
onDeleteImg(index) {
this.tempFilePaths.splice(index, 1);
},
//上传的图片
async uploadImge(index) {
//相机
if (index == 0) {
// #ifdef APP-PLUS
// let result = await camera()
// if (!result) return
// #endif
this.openImage('camera')
} else {
//相册
// #ifdef APP-PLUS
// let result = await album()
// if (!result) return
// #endif
this.openImage('album')
}
},
openImage(val) {
uni.chooseImage({
count: this.maxImgLength-this.tempFilePaths.length,
// sourceType: [val],
sizeType: ['compressed'],
success: async (res) => {
res.tempFilePaths.forEach(item => {
this.tempFilePaths.push(item)
})
},
fail: (err) => {
console.log(err)
}
})
},
//上传
async uploads() {
const resData = await this.$api.post('/v1/oss-sts');
// const host = `https://${resData.bucket}.${resData.region_id}.aliyuncs.com/`
const host = `https://${resData.domain}/`;
const arr = []
try {
for (let i = 0; i < this.tempFilePaths.length; i++) {
const upFile = new Promise((r) => {
uploadImage(
this.tempFilePaths[i], {
uploadImageUrl: host,
AccessKeySecret: resData.AccessKeySecret,
OSSAccessKeyId: resData.AccessKeyId,
stsToken: resData.SecurityToken,
timeout: 3600,
dir: 'app/order/',
},
(result) => {
this.imgList.push(result)
r()
},
(err) => {
console.log(err);
},
);
})
arr.push(upFile)
}
} catch (err) {
console.log(err);
this.$u.toast(err.message || err.errMsg);
}
return Promise.all(arr)
},
onUpload() {
const canCount = this.maxImgLength - this.tempFilePaths.length;
if (canCount <= 0) {
return this.$u.toast('最多上传6张');
}
this.imgList=[]
this.show = true
},
//补充资料
async onSubmit() {
if (this.typeList[this.type[0]]?.value == null || this.typeList[this.type[0]]?.value == '') return this.$u.toast('请选择类型');
if (this.content == null || this.content == '') return this.$u.toast('请填写描述');
if (!this.tempFilePaths.length) return this.$u.toast('请上传相关资料');
await this.uploads()
let obj = {
type: this.typeList[this.type[0]]?.value,
description: this.content,
images: this.imgList
}
// if (obj.type == null || obj.type == '') return this.$u.toast('请选择类型');
// if (obj.description == null || obj.description == '') return this.$u.toast('请填写描述');
// if (!obj.images.length) return this.$u.toast('请上传相关资料');
let resDate = await this.$api.put(`/v1/after-sales/${this.detail.id}`,obj)
this.$u.toast('提交成功')
this.getDate(this.id)
},
//确认收货
async onConfirm() {
let obj = {}
if ((this.detail.type == 1 || this.detail.type == 3) && !this.textContent) {
return this.$u.toast('请输入运单号,并用逗号隔开')
}
if (this.detail.type == 1 || this.detail.type == 3) {
obj.tracking_number = this.textContent
}
let resDate = await this.$api.put(`/v1/after-sales/${this.detail.id}/agree`, obj)
this.getDate(this.id)
},
//取消申请
async confirm(){
try{
await this.$api.delete(`/v1/after-sales/${this.detail.id}`, {}, {
custom: {
loading: true
},
});
this.$u.toast("取消成功")
uni.navigateBack()
uni.$emit('refresh')
}catch(err){}
},
},
};
</script>
<style lang="scss" scoped>
.card {
box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.12);
}
.bottom-bg {
width: 100%;
text-align: center;
color: #fff;
background: $u-type-primary;
clip-path: ellipse(120% 100% at 50% 0%);
}
.clipPath {
clip-path: ellipse(120% 40% at 50% 0%) !important;
}
.imt {
position: relative;
padding-left: 20rpx;
&::before {
content: '*';
color: #d43030;
position: absolute;
top: 50%;
left: 0;
transform: translateY(-50%);
}
}
.img {
width: 100%;
height: 100%;
color: #999;
border-radius: 8rpx;
background-color: #eee;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
</style>