dingdong-mall/pages/my/serv-detail.vue

465 lines
19 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>
<page-meta :page-style="'overflow:'+(ifShowPageMeta?'hidden':'visible')"></page-meta>
<view>
<!-- 顶部操作条 -->
<cu-custom :bgColor="'bg-main-color'" :isBack="true">
<block slot="backText">返回</block>
<block slot="content">服务订单详情</block>
</cu-custom>
<!-- 任务进度跟踪 -->
<view v-if="servDetail.orderStatus === 3" class="bg-white margin-lr-sm padding-lr padding-bottom margin-top-sm">
<uni-collapse v-model="value">
<uni-collapse-item :open="true">
<template v-slot:title>
<view class="cu-bar">
<view class="action bar-first-action">
<text class="cuIcon-titles text-main-color"></text> 任务进度跟踪
</view>
</view>
</template>
<view class="cu-timeline">
<view class="cu-item text-main-color" v-for="(item, index) in servDetail.taskTraceLine">
<view class="content shadow-blur" :class="index === 0 ? 'bg-main-color light' : 'bg-gray'">
<text class="margin-right">{{item.time}}</text>
<text>{{item.action}}</text>
</view>
</view>
</view>
</uni-collapse-item>
</uni-collapse>
</view>
<!-- 服务单概况 -->
<view class="bg-white margin-lr-sm margin-top-sm padding">
<view class="flex align-center">
<text class="text-xl margin-right">{{servDetail.goodsName}}</text>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 3">服务中
</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 2">待上门
</view>
<view class='cu-tag bg-grey radius light margin-right-sm' v-if="servDetail.orderStatus === 6">已取消</view>
</view>
<!-- <view class="margin-top-sm">
<view v-for="(item, index) in servDetail.mainServOrder.orderTag" class='cu-tag radius margin-right-sm'>
{{item}}</view>
</view> -->
<view class="margin-top-sm">
<text class="cuIcon-location text-main-color margin-right-xs"></text>
<text>{{servDetail.address}}</text>
</view>
<view class="margin-top-sm">
<text class="cuIcon-people text-main-color margin-right-xs"></text>
<text class="margin-right-sm">{{servDetail.workerName}}</text>
<text>{{servDetail.workerPhone}}</text>
</view>
<view class="margin-top-sm">
<text class="cuIcon-time text-main-color margin-right-xs"></text>
<text>预约时间:{{servDetail.expectTimeStart + '~' + servDetail.expectTimeEnd}}</text>
</view>
<!-- <view class="margin-top-sm">
<text class="cuIcon-time text-main-color margin-right-xs"></text>
<text>排单时间:{{servDetail.mainServOrder.boodTime}}</text>
</view> -->
<!-- <view class="margin-top-sm" v-if="servDetail.orderStatus === 3">
<text class="cuIcon-time text-main-color margin-right-xs"></text>
<text>上门时间:{{servDetail.workBeginTime}}</text>
</view> -->
<view class="margin-top-sm">
<text class="cuIcon-moneybag text-main-color margin-right-xs"></text>
<text>任务金额:</text>
<text class="text-price">{{servDetail.payMoney}}</text>
</view>
<view class="margin-top-sm" v-if="servDetail.customerRemark">
<text class="cuIcon-message text-main-color margin-right-xs"></text>
<text>备注:{{servDetail.customerRemark}}</text>
</view>
<!-- <view class="margin-top-xs text-sm text-gray"
v-for="(item, index) in servDetail.mainServOrder.gratuityRecord">
追加费用:<text class="text-price">{{item.price}}</text>[{{item.type}}]
</view> -->
</view>
<!-- 待服务列 -->
<view class="bg-white margin-lr-sm padding-lr padding-bottom margin-top-sm">
<view class="cu-bar solid-bottom">
<view class="action bar-first-action">
<text class="cuIcon-titles text-main-color"></text> 商品信息
</view>
</view>
<view class="margin-top-sm">
<simple-product-picked :product="servDetail" :pickedList="servDetail.standardList"
:columnTitleArr="servingColumnHeaders" :valFieldArr="servingValFields"></simple-product-picked>
</view>
</view>
<!-- 子单完成记录 -->
<view class="bg-white margin-lr-sm padding-lr padding-bottom margin-top-sm"
v-for="(item, index) in servDetail.orderStandardDetailList">
<view class="cu-bar solid-bottom">
<view class="action bar-first-action">
<text class="cuIcon-titles text-main-color"></text> 施工记录
</view>
<view class='cu-tag bg-purple radius light margin-right-sm'>编码:{{item.orderDetailCode}}</view>
</view>
<view class="margin-top-sm">
<view>师傅:{{item.workerName}}</view>
<view class="margin-top-sm">联系方式:{{item.workerPhone}}</view>
<view class="margin-top-sm">预约时间:{{item.expectTimeStart + '~' + item.expectTimeEnd}}</view>
<view class="margin-top-sm" v-if="servDetail.orderStatus >= 3">上门时间:{{item.workBeginTime}}</view>
<view class="margin-top-sm" v-if="servDetail.orderStatus >= 4">完成时间:{{item.workFinishTime}}</view>
<simple-product-picked :pickedList="item.orderStandardList" :columnTitleArr="servedColumnHeaders"
:valFieldArr="servedValFields"></simple-product-picked>
</view>
<view v-if="servDetail.orderStatus > 3 && item.finishImgList && item.finishImgList.length" class="bg-white">
<view class="cu-bar solid-bottom">
<view class="action bar-first-action">
<text class="cuIcon-title text-main-color"></text> 完工图片
</view>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm">
<view class="bg-img" v-for="(imgUrl, index) in item.finishImgList" :key="index">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill">
</image>
</view>
</view>
<view>
<text>备注{{item.remark}}</text>
</view>
</view>
<view v-if="item.afterServiceRecordList && item.afterServiceRecordList.length" class="bg-white">
<view class="cu-bar">
<view class="action bar-first-action">
<text class="cuIcon-title text-main-color"></text>
{{item.afterServiceRecordList[0].operType === 1 ? '退款记录' : '售后记录'}}
</view>
</view>
<view v-for="(afterServiceRecord, afterServiceRecordIndex) in item.afterServiceRecordList">
<view v-if="afterServiceRecord.createBy == 1" class="padding-tb solid-top">
<view class='cu-tag bg-main-color radius light'>客户发起</view>
<view v-if="afterServiceRecord.operType === 1">
<view class="flex justify-start align-end">
<text>退款申请:</text>
<uni-countdown :show-colon="false" :backgroundColor="'#eee'"
:day="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.createTime, 24)).day"
:hour="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.createTime, 24)).hour"
:minute="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.createTime, 24)).min"
:second="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.createTime, 24)).seconds">
</uni-countdown>
</view>
<view>
<text>退款金额:</text>
<text>{{afterServiceRecord.refund}}</text>
</view>
<view>
<text>退款原因:</text>
<text>{{afterServiceRecord.customerReason}}</text>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm">
<view class="bg-img" v-for="(imgObj, imgIndex) in afterServiceRecord.imgsList"
:key="imgIndex" v-if="imgObj.imgUploadBy === 1">
<image :src="imgObj.imgUrl" @tap="viewImage($event, [imgObj.imgUrl])"
:data-url="imgObj.imgUrl" mode="aspectFill"></image>
</view>
</view>
</view>
<view v-else-if="afterServiceRecord.operType === 2">
<view class="flex justify-start align-end">
<text>待处理售后:</text>
<uni-countdown :show-colon="false" :backgroundColor="'#eee'"
:day="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.createTime, 24)).day"
:hour="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.createTime, 24)).hour"
:minute="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.createTime, 24)).min"
:second="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.createTime, 24)).seconds">
</uni-countdown>
</view>
<view>
<text>售后原因:</text>
<text>{{afterServiceRecord.customerReason}}</text>
</view>
<view>
<text>完成操作:点击“处理完成”提交由客服回访!</text>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm">
<view class="bg-img" v-for="(imgObj, imgIndex) in afterServiceRecord.imgsList"
:key="imgIndex" v-if="imgObj.imgUploadBy === 1">
<image :src="imgObj.imgUrl" @tap="viewImage($event, [imgObj.imgUrl])"
:data-url="imgObj.imgUrl" mode="aspectFill"></image>
</view>
</view>
</view>
</view>
<view v-if="afterServiceRecord.updateBy == 2" class="padding-tb solid-top">
<view class='cu-tag bg-main-color radius light'>师傅反馈</view>
<view v-if="afterServiceRecord.operType === 1">
<view class="margin-top-xs">
<text>师傅反馈结果:</text>
<text>{{afterServiceRecord.workerFeedbackResult === 1 ? '同意' : '拒绝'}}</text>
</view>
<view v-if="afterServiceRecord.workerFeedbackResult === 1">
<text>同意退款金额:</text>
<text>{{afterServiceRecord.agreedRefund}}</text>
</view>
<view>
<text>师傅反馈:</text>
<text v-if="afterServiceRecord.workerFeedbackReasonType === 1">客户原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 2">师傅原因</text>
<text v-else>其他</text>
<text
v-if="afterServiceRecord.workerFeedbackReason">{{"" + afterServiceRecord.workerFeedbackReason}}</text>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm">
<view class="bg-img" v-for="(imgObj, imgIndex) in afterServiceRecord.imgsList"
:key="imgIndex" v-if="imgObj.imgUploadBy === 2">
<image :src="imgObj.imgUrl" @tap="viewImage($event, [imgObj.imgUrl])"
:data-url="imgObj.imgUrl" mode="aspectFill"></image>
</view>
</view>
</view>
<view v-else-if="afterServiceRecord.operType === 2">
<view class="margin-top-xs">
<text>师傅反馈结果:</text>
<text>{{afterServiceRecord.workerFeedbackResult === 1 ? '同意' : '拒绝'}}</text>
</view>
<view>
<text>师傅反馈:</text>
<text v-if="afterServiceRecord.workerFeedbackReasonType === 1">客户原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 2">师傅原因</text>
<text v-else>其他</text>
<text
v-if="afterServiceRecord.workerFeedbackReason">{{"" + afterServiceRecord.workerFeedbackReason}}</text>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm">
<view class="bg-img" v-for="(imgObj, imgIndex) in afterServiceRecord.imgsList"
:key="imgIndex" v-if="imgObj.imgUploadBy === 2">
<image :src="imgObj.imgUrl" @tap="viewImage($event, [imgObj.imgUrl])"
:data-url="imgObj.imgUrl" mode="aspectFill"></image>
</view>
</view>
</view>
<view class="flex justify-end align-end margin-tb-sm"
v-if="afterServiceRecord.updateBy && afterServiceRecord.customerFinalCheck == null">
<button class="cu-btn sm bg-yellow margin-right-sm"
@click="afterServiceFinalCheck(afterServiceRecord.id, 1)">同意</button>
<button class="cu-btn sm bg-yellow margin-right-sm"
@click="afterServiceFinalCheck(afterServiceRecord.id, 0)">不同意</button>
</view>
</view>
<view v-if="afterServiceRecord.customerFinalCheck != null" class="padding-tb solid-top">
<view class='cu-tag bg-main-color radius light'>客户最终确认</view>
<view class="margin-top-xs">{{afterServiceRecord.customerFinalCheck === 1 ? '同意' : '不同意'}}
</view>
<view class="text-red" v-if="afterServiceRecord.customerFinalCheck === 0">订单交由平台协商处理</view>
</view>
</view>
</view>
</view>
<!-- 订单编码和时间 -->
<view class="bg-white margin-top-sm padding margin-lr-sm margin-bottom-with-bar">
<view>订单编码:{{servDetail.orderMasterCode}}</view>
<view class="margin-top-xs">订单时间:{{servDetail.createTime}}</view>
</view>
<!-- 底部操作栏 -->
<view class="cu-bar tabbar margin-bottom-xl bg-white fixed-bottom-bar">
<view class="action" data-popup="orderManage" @click="togglePopup">
<view class="cuIcon-list"></view> 订单管理
</view>
<view class="action" data-modal="sendUrgentMsgModal" @click="showModal">
<view class="cuIcon-mail">
<view class="cu-tag badge" v-if="servDetail.talkMsgNum > 0">{{servDetail.talkMsgNum}}</view>
</view>
发送急报
</view>
<!-- <view class="bg-main-color submit">立即上门</view> -->
</view>
<uni-popup ref="orderManage" type="bottom" @change="changePopupState">
<view class="cu-bar tabbar bg-white">
<view class="bg-white text-center" style="width: 100%; z-index: 99;">
<view v-if="servDetail.orderStatus < 2" class="padding solid-bottom" @click="decideIfCancelOrder">
取消订单
</view>
<view v-if="servDetail.orderStatus < 4" class="padding solid-bottom" @click="applyAfterService">
发起投诉
</view>
<view v-if="servDetail.orderStatus >= 4" class="padding solid-bottom" @click="applyAfterService">
发起售后/投诉
</view>
<view v-if="servDetail.orderStatus >= 2 || servDetail.orderStatus < 5" class="padding solid-bottom"
@click="applyForRefund">
退单退款
</view>
</view>
<view class="bg-white fixed-bottom-popup"></view>
</view>
</uni-popup>
<!-- 模态框 -->
<urgent-msg :show="sendUrgentMsgModal" @hideModal="hideModal"></urgent-msg>
<confirm-modal ref="confirmModal" :content="'是否确定取消订单?'" @confirm="cancelOrder"></confirm-modal>
<apply-after-service ref="applyAfterService" :data="servDetail"
@confirmFeedback="loadData(servDetail.orderMasterId)" @cancel="blurCurOrder"></apply-after-service>
</view>
</template>
<script>
import simpleProductPicked from '@/components/goods-card/simple-product-picked.vue';
import urgentMsg from '@/pages/my/components/modal/urgent-msg.vue';
import applyAfterService from '@/pages/my/components/modal/apply-after-service.vue';
export default {
components: {
simpleProductPicked,
urgentMsg,
applyAfterService
},
data() {
return {
value: ['0'],
order: {},
servDetail: {},
finishRecord4Show: [],
servingColumnHeaders: ['购买型号', '购买量', '待服务'],
servedColumnHeaders: ['购买型号', '购买量', '已服务'],
servingValFields: ['standardName', 'standardNum', 'waitServerNum'],
servedValFields: ['standardName', 'standardNum', 'serverNum'],
process: '',
ifShowPageMeta: false,
sendUrgentMsgModal: false
}
},
onLoad(options) {
if (options && options.order) {
this.order = JSON.parse(decodeURIComponent(options.order));
}
this.loadData(this.order.orderMasterId);
},
methods: {
async loadData(orderMasterId) {
// this.servDetail = await this.$api.data('servDetail');
// this.finishList4Show = this.servDetail.finishRecord;
// for (let i = 0; i < this.finishList4Show.length; i++) {
// let finishList = this.finishList4Show[i].finishList;
// for (let j = 0; j < finishList.length; j++) {
// finishList[j].secondColumnNum = finishList[j].servedNum;
// }
// this.finishList4Show[i].finishList = finishList;
// }
let servDetailRes = await this.$request.getOrderMasterDetail({
id: orderMasterId
});
this.servDetail = servDetailRes.data;
},
changePopupState(e) {
this.ifShowPageMeta = e.show;
},
togglePopup(e) {
let targetPopup = null;
if (typeof e === 'string') {
targetPopup = e;
} else {
targetPopup = e.currentTarget.dataset.popup;
}
if (this.ifShowPageMeta) {
this.$refs[targetPopup].close();
} else {
this.$refs[targetPopup].open();
}
},
showModal(e) {
this[e.currentTarget.dataset.modal] = true;
},
hideModal(e) {
this[e.currentTarget.dataset.modal] = false;
},
decideIfCancelOrder() {
this.$refs.confirmModal.showModal();
},
viewImage(e, imgList) {
uni.previewImage({
urls: imgList,
current: e.currentTarget.dataset.url
});
},
async cancelOrder(e) {
let res = await this.$request.cancelMasterOrder({
orderMasterId: this.servDetail.orderMasterId
});
if (res && res.code === 0) {
this.togglePopup('orderManage');
this.loadData(this.servDetail.orderMasterId);
uni.showToast({
title: '取消成功',
icon: 'success',
duration: 2000
})
} else {
uni.showToast({
title: '取消失败',
icon: 'error'
})
}
},
async afterServiceFinalCheck(id, agreeStatus) {
let res = await this.$request.editAfterServiceRecord({
id: id,
customerFinalCheck: agreeStatus
});
if (res && res.code === 0) {
uni.showToast({
icon: 'success',
duration: 1000
})
this.loadData(this.servDetail.orderMasterId);
return;
}
uni.showToast({
icon: 'error',
duration: 1000
})
},
applyAfterService() {
this.showModalByRef('applyAfterService', this.servDetail, {
afterServiceType: 2,
toUpdateStatus: false
})
},
applyForRefund() {
this.showModalByRef('applyAfterService', this.servDetail, {
afterServiceType: 1,
toUpdateStatus: false
})
},
showModalByRef(refName, curOrder, params) {
this.$refs[refName].showModal(curOrder, params);
}
}
}
</script>
<style scoped>
.bar-first-action {
margin-left: unset !important;
font-size: 30rpx !important;
}
.fixed-bottom-popup {
position: fixed !important;
width: 100% !important;
bottom: 0 !important;
margin-bottom: 0 !important;
z-index: 98;
padding-bottom: constant(safe-area-inset-bottom) !important;
padding-bottom: env(safe-area-inset-bottom) !important;
}
.cu-bar.tabbar .action {
font-size: 22rpx;
position: relative;
flex: 1;
text-align: center;
padding: 0;
display: block;
height: auto;
line-height: 1;
margin: 0;
background-color: inherit;
overflow: initial;
z-index: 99;
}
</style>