376 lines
16 KiB
Vue
376 lines
16 KiB
Vue
<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" class="solid-top padding-tb">
|
||
<view v-if="afterServiceRecord.createBy == 1">
|
||
<view class='cu-tag bg-main-color radius light'>客户发起</view>
|
||
<view v-if="afterServiceRecord.operType === 1">
|
||
<view class="margin-top-sm">
|
||
<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 class="margin-top-sm">
|
||
<text>退款金额:</text>
|
||
<text>{{afterServiceRecord.refund}}</text>
|
||
</view>
|
||
<view class="margin-top-sm">
|
||
<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">
|
||
<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 class="margin-top-sm">
|
||
<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">
|
||
<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">
|
||
<view class='cu-tag bg-main-color radius light'>师傅反馈</view>
|
||
<view v-if="afterServiceRecord.operType === 1">
|
||
<view class="margin-top-sm">
|
||
<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 class="margin-top-sm">
|
||
<text>退款金额:</text>
|
||
<text>{{afterServiceRecord.agreedRefund ? afterServiceRecord.agreedRefund : afterServiceRecord.refund}}</text>
|
||
</view>
|
||
<view class="margin-top-sm">
|
||
<text>退款原因:</text>
|
||
<text>{{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">
|
||
<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.workerFeedbackReason}}</text>
|
||
</view>
|
||
<view class="margin-top-sm">
|
||
<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">
|
||
<image :src="imgObj.imgUrl" @tap="viewImage($event, [imgObj.imgUrl])" :data-url="imgObj.imgUrl" mode="aspectFill"></image>
|
||
</view>
|
||
</view>
|
||
</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 bg-white tabbar border fixed-bottom-bar">
|
||
<view class="action" data-popup="orderManage" @click="togglePopup" v-if="servDetail.orderStatus < 2">
|
||
<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 bg-white tabbar border fixed-bottom-bar">
|
||
<view class="bg-white text-center" style="width: 100%;">
|
||
<view v-for="(menu,index) in orderManageMenu" class="padding solid-bottom" :data-action="menu.action" @click="clickOrderManageMenu">
|
||
{{menu.name}}
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</uni-popup>
|
||
<!-- 模态框 -->
|
||
<urgent-msg :show="sendUrgentMsgModal" @hideModal="hideModal"></urgent-msg>
|
||
<confirm-modal ref="confirmModal" :content="'是否确定取消订单?'" @confirm="cancelOrder"></confirm-modal>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import simpleProductPicked from '@/components/goods-card/simple-product-picked.vue';
|
||
import urgentMsg from '@/pages/my/components/modal/urgent-msg.vue';
|
||
|
||
export default {
|
||
components: {
|
||
simpleProductPicked,
|
||
urgentMsg
|
||
},
|
||
data() {
|
||
return {
|
||
value: ['0'],
|
||
order: {},
|
||
servDetail: {},
|
||
finishRecord4Show: [],
|
||
servingColumnHeaders: ['购买型号', '购买量', '待服务'],
|
||
servedColumnHeaders: ['购买型号', '购买量', '已服务'],
|
||
servingValFields: ['standardName', 'standardNum', 'waitServerNum'],
|
||
servedValFields: ['standardName', 'standardNum', 'serverNum'],
|
||
process: '',
|
||
ifShowPageMeta: false,
|
||
orderManageMenu: [{
|
||
name: '取消订单',
|
||
action: 'decideIfCancelOrder'
|
||
}],
|
||
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;
|
||
},
|
||
clickOrderManageMenu(e) {
|
||
this[e.currentTarget.dataset.action](e);
|
||
},
|
||
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'
|
||
})
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
.bar-first-action {
|
||
margin-left: unset !important;
|
||
font-size: 30rpx !important;
|
||
}
|
||
</style>
|