商品售后余下功能

This commit is contained in:
Mrxtyyp 2026-03-13 14:27:07 +08:00
parent d31ca6fc16
commit 22d451eead
56 changed files with 10694 additions and 1556 deletions

View File

@ -86,15 +86,11 @@ const myTeamInfo = {
}
const masterRules = [
'0规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容',
'1规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容',
'2规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容',
'3规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容',
'4规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容',
'5规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容',
'6规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容',
'7规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容',
'8规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容规则内容'
'接单属于您的订单请30分钟内接单。',
'预约接单后立即预约超时30分钟会提示超1小时你有责',
'排单按约排单30分钟未排单提示超时超1小时你有责',
'上门:按约准时上门,超时上门或被投诉未上门,你有责;',
'退单当天订单不得私自退单遇事可提前3小时与客户沟通妥善。紧急问题且沟通不畅的请联系你上级或平台客服。上门时间3小时范围内退单的产生责任由你承担。',
]
// type: 0=升降序1=功能按钮order: 0=升序1=降序;
@ -322,7 +318,12 @@ const timeRangeList = [
'18:00-18:30',
'18:30-19:00',
'19:00-19:30',
'19:30-20:00'
'19:30-20:00',
'19:00-20:00',
'20:00-21:00',
'21:00-22:00',
'22:00-23:00',
'23:00-24:00',
]
const servDetail = {

View File

@ -27,6 +27,12 @@ export default {
}
return this.countDownDiffCache;
},
addDays(dateStr, dayAmount) {
let date = new Date(dateStr);
// 使用时间戳计算,避免时区问题
const timestamp = date.getTime() + (dayAmount * 24 * 60 * 60 * 1000);
return new Date(timestamp);
},
addHours(dateStr, hourAmount) {
let date = new Date(dateStr);
date.setHours(date.getHours() + hourAmount);

File diff suppressed because it is too large Load Diff

View File

@ -15,6 +15,9 @@ export default {
}
return true;
},
validPhone: function(email) {
return contactNumRegex.test(email);
},
validIdCard: function(idCardNum) {
return idCardRegex.test(idCardNum);

View File

@ -7,7 +7,24 @@
<view class="text-black">{{product.totalName}}</view>
<view class="text-sm" v-if="ifShowComments">{{product.remark}}</view>
</view>
<view class="flex justify-between align-center">
<view class="flex align-center" v-if="product.goods">
<view class='cu-tag round bg-orange light' v-if="product.goods.installService">
<text class="text-black">{{getInstallServiceName(product.goods.installService)}}</text>
</view>
<view class='cu-tag round bg-orange light' v-if="product.goods.deliveryService">
<text class="text-black">{{getDeliveryName(product.goods.deliveryService)}}</text>
</view>
<template v-if="product.goods.storeService">
<view class='cu-tag round bg-orange light' v-if="product.goods.storeService == 1">
<text class="text-black">到店服务</text>
</view>
<view class='cu-tag round bg-orange light' v-if="product.goods.storeService == 2">
<text class="text-black">到店+配送服务</text>
</view>
<view class='cu-tag round bg-orange light' v-if="product.goods.storeService == 3">
<text class="text-black">到店+上门服务</text>
</view>
</template>
<!-- <view class="flex justify-start align-center" v-if="product.payMoney">
<text class="text-price text-red text-bold text-xl">{{product.payMoney}}</text>
</view>
@ -37,7 +54,7 @@
<text class='cuIcon-locationfill'></text>
</view>
<view class="cu-tag line-main-color sm">
服务区域
{{product.orderType === 1 ? '发货区域' : '服务区域'}}
</view>
</view>
<text v-for="(item,index) in product.goodsAreaList" v-if="ifShowServArea">
@ -62,13 +79,33 @@
},
product: {
type: Object,
default: {}
default: () => {}
}
},
data() {
return {
}
},
methods: {
getDeliveryName(deliveryService) {
if(deliveryService === 1) {
return '包邮'
} else if(deliveryService === 2) {
return '同城包送'
} else if(deliveryService === 3) {
return '邮费自付/自提'
}
},
getInstallServiceName(installService) {
if(installService === 1) {
return '包安装'
} else if(installService === 2) {
return '不包安装'
} else if(installService === 3) {
return '自费安装'
}
}
}
}
</script>

View File

@ -7,19 +7,23 @@
<input class="uni-combox__input" type="text" :placeholder="placeholder" @click="toggleSelector" disabled
placeholder-class="uni-combox__input-plac" v-model="inputVal[showField]" @input="onInput" @focus="onFocus"
@blur="onBlur" />
<uni-icons v-if="showClear && inputVal" type="clear" size="20" style="margin-right: 20rpx;" color="#999" @click="clearChosen">
</uni-icons>
<uni-icons :type="showSelector? 'top' : 'bottom'" size="14" color="#999" @click="toggleSelector">
</uni-icons>
</view>
<view class="uni-combox__selector" v-if="showSelector">
<view class="uni-popper__arrow"></view>
<scroll-view scroll-y="true" class="uni-combox__selector-scroll">
<view class="uni-combox__selector-empty" v-if="filterCandidatesLength === 0">
<text>{{emptyTips}}</text>
</view>
<scroll-view scroll-y="true" class="uni-combox__selector-scroll" :style="{maxHeight: screenMaxHeight}">
<view class="uni-combox__selector-item" v-for="(item,index) in filterCandidates" :key="index"
@click="onSelectorClick(index)">
<text>{{item[showField]}}</text>
</view>
<view class="uni-combox__selector-empty" v-if="filterCandidatesLength === 0 || alwaysShowEmpty">
<slot name="empty">
<text>{{emptyTips}}</text>
</slot>
</view>
</scroll-view>
</view>
</view>
@ -45,6 +49,14 @@
type: Boolean,
default: true
},
showClear: {
type: Boolean,
default: false
},
alwaysShowEmpty: {
type: Boolean,
default: false
},
label: {
type: String,
default: ''
@ -83,6 +95,10 @@
default: ''
},
// #endif
screenMaxHeight: {
type: String,
default: '200px'
}
},
data() {
return {
@ -149,6 +165,12 @@
this.$emit('input', this.inputVal)
this.$emit('update:modelValue', this.inputVal)
})
},
clearChosen() {
setTimeout(() => {
this.$emit('input', '')
this.$emit('update:modelValue', '')
})
}
}
}

View File

@ -5,10 +5,10 @@
<view class="cu-dialog">
<view class="padding-xl">
<view class="cuIcon-discover big-icon padding-tb text-main-color"></view>
<view>请您选择供应类型到家服务类请选-服务商商品销售类请选-品牌商</view>
<view>请您选择供应类型提供服务类型的请选--服务商提供商品类型的请选--货品商</view>
</view>
<view class="cu-bar bg-white">
<view class="action margin-0 flex-sub text-black" data-modal="isShowSteer" @click="chooseEntryType(1)">
<view class="action margin-0 flex-sub text-black" data-modal="isShowSteer" @click="chooseEntryType(1)">品商
</view>
<view class="action margin-0 flex-sub text-main-color solid-left"
data-modal="isShowSteer" @click="chooseEntryType(0)">服务商</view>
@ -37,18 +37,21 @@
this.hideModal();
let curUserInfo = this.$request.getCurUserInfo();
if (typeCode === 1) {
if (curUserInfo && curUserInfo.storeStatus == 1) {
uni.navigateTo({
url: '/pages/index/index?menuCode=supplyChainPage'
})
} else {
uni.navigateTo({
url: '/pages/my/apply-shop'
})
}
// if (curUserInfo && curUserInfo.storeStatus == 1) {
// uni.navigateTo({
// url: '/pages/index/index?menuCode=supplyChainPage'
// })
// } else {
// uni.navigateTo({
// url: '/pages/my/apply-shop'
// })
// }
uni.navigateTo({
url: '/pages/my/master-settled-info?type=2'
})
} else if (typeCode === 0) {
uni.navigateTo({
url: '/pages/my/master-settled-info'
url: '/pages/my/master-settled-info?type=1'
})
}
}

View File

@ -62,8 +62,11 @@
"permission" : {
"scope.userLocation" : {
"desc" : "因涉及上门家政服务,需获取地理位置"
},
"scope.writeClipboard" : {
"desc" : "剪贴板写入权限"
}
},
"requiredPrivateInfos" : [ "getLocation" ]
"requiredPrivateInfos" : [ "getLocation", "chooseLocation" ]
}
}

View File

@ -27,19 +27,27 @@
"root": "pages/order-manage/",
"pages": [{
"path": "order-manage"
}, {
"path": "order-manage-parts"
}, {
"path": "serv-detail"
}, {
"path": "finish-order"
}, {
"path": "cancel-order"
}, {
"path": "choose-shop"
}]
}, {
"root": "pages/my/",
"pages": [{
"path": "new-serv"
},{
"path": "new-serv-parts"
}, {
"path": "master-occupancy"
}, {
"path": "master-occupancy-parts"
}, {
"path": "withdraw"
}, {
@ -60,6 +68,10 @@
"path": "certification"
}, {
"path": "apply-shop"
},{
"path": "shop-list"
},{
"path": "edit-shop-address"
}]
}],
"globalStyle": {

View File

@ -50,7 +50,7 @@
<view class="cu-bar bg-white tabbar border shop fixed-bottom-bar">
<view class="left-grid text-center" data-modal="takeRateSet" @click="showModalByRef('setTakeRateModal')">
<view>设置扣点</view>
<view v-if="curUserInfo.leaderTeamRate">(扣点<text
<view v-if="curUserInfo.leaderTeamRate && !backIndex">(扣点<text
class="text-red">{{Number(curUserInfo.leaderTeamRate)*100}}%</text>)</view>
</view>
<!-- <view class="bg-main-color submit" @click="showModalByRef('inviteMasterModal')">邀请团队</view> -->

View File

@ -81,11 +81,23 @@
<view v-if="task.changeMoney || task.payStatus != 1" class='cu-tag margin-right-xs radius line-red margin-top-xs'>有待付款</view>
<view v-else class='cu-tag margin-right-xs radius line-red margin-top-xs'>款已付清</view>
</template>
</view>
<view class="float-clear"></view>
<view class="margin-top-sm order-name">
<view>
<text class="text-main-color text-lg margin-right-xs"><text class="cuIcon-people"></text></text>
<text>姓名{{task.customerName}}</text>
</view>
<view v-if="task.insuranceId">
<text style="padding-right: 20rpx;">保险要求</text>
<text class="text-main-color" data-modal="showInsuranceDetail" @click="showModal($event, task)"> 详情...</text>
</view>
</view>
<view class="margin-top-sm">
<text class="text-main-color text-lg margin-right-xs"><text
class="cuIcon-locationfill"></text></text>
<text>{{task.address}}</text>
<text>{{task.provinceName + task.cityName + task.countryName + task.streetName + task.address}}</text>
</view>
<view class="margin-top-sm">
<text class="text-main-color text-lg margin-right-xs"><text class="cuIcon-timefill"></text></text>
@ -96,7 +108,10 @@
<text class="text-main-color text-lg margin-right-xs"><text class="cuIcon-phone"></text></text>
<text class="margin-right-xs">{{task.customerName}}</text>
<text>{{task.customerPhone.substring(0, 3) + "****" + task.customerPhone.substring(7)}}</text>
</view>
</view>
<!-- <view class="margin-top-sm" v-if="task.customerRemark">
备注{{task.customerRemark}}
</view> -->
<view class="padding-top-sm flex justify-end">
<button class="cu-btn bg-main-color margin-right-xs shadow-blur" data-modal="showForwardModal"
@click="showModal($event, task)">转发</button>
@ -200,20 +215,24 @@
</view>
<!-- 账户及实名弹窗 -->
<vertify-bank-bind ref="vertifyBankBind" text="仍然接单" @stillAcceptOrder="stillAccept"></vertify-bank-bind>
<vertify-certify ref="vertifyCertify" text="仍然接单" @stillAcceptOrder="stillAccept"></vertify-certify>
<vertify-certify ref="vertifyCertify" text="仍然接单" @stillAcceptOrder="stillAccept"></vertify-certify>
<insurance-detail v-if="showInsuranceDetail" :show="showInsuranceDetail" :data="curTask" @close="showInsuranceDetail = false"></insurance-detail>
</view>
</template>
<script>
import loadStatusBar from '@/components/custom-bar/load-status-bar.vue';
import insuranceDetail from '@/pages/order-manage/modal/insurance-detail.vue';
export default {
components: {
loadStatusBar
loadStatusBar,
insuranceDetail
},
data() {
return {
tabCur: 0,
tabCur: 0,
orderType: 0,
scrollLeft: 0,
stickyTop: this.CustomBar,
pageNum: 1,
@ -242,7 +261,7 @@
}, {
code: 'reset',
type: 1,
title: '重置',
title: '重置/刷新',
action: 'resetConditions'
}],
originTaskConditions: [{
@ -294,10 +313,15 @@
workerStreetIds: [],
workerFirstCategoryIds: [],
workerSecondCategoryIds: [],
workerThirdCategoryIds: []
workerThirdCategoryIds: [],
showInsuranceDetail: false,
workerProvinceIds: []
}
},
onShow() {
onLoad(option) {
if(option && option.orderType) {
this.orderType = option.orderType
}
this.loadData();
},
methods: {
@ -339,29 +363,47 @@
},
async getWorkerAreaIds() {
let res = await this.$request.getWorkerArea({
workerId: this.curUserInfo.workerId
workerId: this.curUserInfo.workerId,
serviceType: this.orderType == 0 ? 1 : 2
});
let cityIds = [];
let districtIds = [];
let streetIds = [];
for(let i = 0; i < res.data.length; i++) {
if (cityIds.indexOf(res.data[i].cityId) === -1) {
cityIds.push(res.data[i].cityId)
if(this.orderType == 0 ) {
let cityIds = [];
let districtIds = [];
let streetIds = [];
for(let i = 0; i < res.data.length; i++) {
if (cityIds.indexOf(res.data[i].cityId) === -1) {
cityIds.push(res.data[i].cityId)
}
if (districtIds.indexOf(res.data[i].districtId) === -1) {
districtIds.push(res.data[i].districtId)
}
if (streetIds.indexOf(res.data[i].streetId) === -1) {
streetIds.push(res.data[i].streetId)
}
}
if (districtIds.indexOf(res.data[i].districtId) === -1) {
districtIds.push(res.data[i].districtId)
}
if (streetIds.indexOf(res.data[i].streetId) === -1) {
streetIds.push(res.data[i].streetId)
this.workerCityIds = cityIds;
this.workerDistrictIds = districtIds;
this.workerStreetIds = streetIds;
} else {
let provinceIds = [];
let cityIds = [];
for(let i = 0; i < res.data.length; i++) {
if (cityIds.indexOf(res.data[i].cityId) === -1) {
cityIds.push(res.data[i].cityId)
}
if (provinceIds.indexOf(res.data[i].provinceId) === -1) {
provinceIds.push(res.data[i].provinceId)
}
}
this.workerProvinceIds = provinceIds;
this.workerCityIds = cityIds;
}
this.workerCityIds = cityIds;
this.workerDistrictIds = districtIds;
this.workerStreetIds = streetIds;
},
async getWorkerDataCategoryIds() {
let res = await this.$request.getWorkerGoodsCategory({
workerId: this.curUserInfo.workerId
workerId: this.curUserInfo.workerId,
serviceType: this.orderType == 0 ? 1 : 2
});
let firstGoodsCategoryIds = [];
let secondGoodsCategoryIds = [];
@ -387,6 +429,7 @@
params.orderStatus = 0;
params.workerId = -1;
params.goodsName = this.inputGoodsName;
params.orderType = this.orderType;
this.taskConditions.forEach((condition) => {
if (condition.type === 2) {
params[condition.code] = condition.value;
@ -470,24 +513,24 @@
},
async loadCategoryList(idArr) {
let typeList = await this.$request.listByStep({
type: 1
type: this.orderType == 0 ? 1 : 2
});
typeList = typeList.data;
let col1Id = idArr ? idArr[0] : typeList[0].goodsCategoryId;
let subTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: col1Id
});
subTypeList = subTypeList.data;
let col2Id = idArr ? idArr[1] : subTypeList[0].goodsCategoryId;
let subSubTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: col2Id
});
subSubTypeList = subSubTypeList.data;
let col3Id = idArr ? idArr[2] : subSubTypeList[0].goodsCategoryId;
let thirdTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: col3Id
});
thirdTypeList = thirdTypeList.data;
@ -510,43 +553,69 @@
this.categoryList.push(thirdTypeList);
},
async loadRegionList() {
let regionList = await this.$request.areaListByStep({
areaIds: this.workerCityIds,
parentCode: ''
});
regionList = regionList.data;
let subRegionList = [];
let subSubRegionList = [];
if (regionList && regionList.length > 0) {
subRegionList = await this.$request.areaListByStep({
parentCode: regionList[0].areaCode,
areaIds: this.workerDistrictIds
if(this.orderType == 0) {
let regionList = await this.$request.areaListByStep({
areaIds: this.workerCityIds,
parentCode: ''
});
subRegionList = subRegionList.data;
}
if (subRegionList && subRegionList.length > 0) {
subSubRegionList = await this.$request.areaListByStep({
parentCode: subRegionList[0].areaCode,
areaIds: this.workerStreetIds
regionList = regionList.data;
let subRegionList = [];
let subSubRegionList = [];
if (regionList && regionList.length > 0) {
subRegionList = await this.$request.areaListByStep({
parentCode: regionList[0].areaCode,
areaIds: this.workerDistrictIds
});
subRegionList = subRegionList.data;
}
if (subRegionList && subRegionList.length > 0) {
subSubRegionList = await this.$request.areaListByStep({
parentCode: subRegionList[0].areaCode,
areaIds: this.workerStreetIds
});
subSubRegionList = subSubRegionList.data;
}
//
regionList.unshift({
areaName: '全部',
areaId: -1
});
subSubRegionList = subSubRegionList.data;
subRegionList.unshift({
areaName: '全部',
areaId: -1
});
subSubRegionList.unshift({
areaName: '全部',
areaId: -1
});
this.areaList.push(regionList);
this.areaList.push(subRegionList);
this.areaList.push(subSubRegionList);
} else {
let regionList = await this.$request.areaListByStep({
areaIds: this.workerProvinceIds,
parentCode: ''
});
regionList = regionList.data;
let subRegionList = [];
if (regionList && regionList.length > 0) {
subRegionList = await this.$request.areaListByStep({
parentCode: regionList[0].areaCode,
areaIds: this.workerCityIds
});
subRegionList = subRegionList.data;
}
regionList.unshift({
areaName: '全部',
areaId: -1
});
subRegionList.unshift({
areaName: '全部',
areaId: -1
});
this.areaList.push(regionList);
this.areaList.push(subRegionList);
}
//
regionList.unshift({
areaName: '全部',
areaId: -1
});
subRegionList.unshift({
areaName: '全部',
areaId: -1
});
subSubRegionList.unshift({
areaName: '全部',
areaId: -1
});
this.areaList.push(regionList);
this.areaList.push(subRegionList);
this.areaList.push(subSubRegionList);
},
searchTasks() {
this.reloadMasterOrderPage();
@ -577,47 +646,51 @@
},
async regionColChange(e) {
let colObj = e.detail;
if (colObj.column == 0) {
//
let subAreaList = await this.$request.areaListByStep({parentCode: this.areaList[0][colObj.value].areaCode, areaIds: this.workerDistrictIds});
subAreaList = subAreaList.data;
let subSubAreaList = [];
if (subAreaList.length) {
subSubAreaList = await this.$request.areaListByStep({parentCode: subAreaList[0].areaCode, areaIds: this.workerStreetIds});
subSubAreaList = subSubAreaList.data;
if(this.orderType == 0) {
if (colObj.column == 0) {
//
let subAreaList = await this.$request.areaListByStep({parentCode: this.areaList[0][colObj.value].areaCode, areaIds: this.workerDistrictIds});
subAreaList = subAreaList.data;
let subSubAreaList = [];
if (subAreaList.length) {
subSubAreaList = await this.$request.areaListByStep({parentCode: subAreaList[0].areaCode, areaIds: this.workerStreetIds});
subSubAreaList = subSubAreaList.data;
}
//
if (subAreaList.length > 0) {
subAreaList.unshift({
areaName: '全部',
areaId: -1
});
}
if (subSubAreaList.length > 0) {
subSubAreaList.unshift({
areaName: '全部',
areaId: -1
});
}
this.areaList.pop();
this.areaList.pop();
this.areaList.push(subAreaList);
this.areaList.push(subSubAreaList);
this.areaMultiIndex = [colObj.value, 0, 0];
} else if (colObj.column == 1) {
//
let subAreaList = await this.$request.areaListByStep({parentCode: this.areaList[1][colObj.value].areaCode, areaIds: this.workerStreetIds});
subAreaList = subAreaList.data;
//
if (subAreaList.length > 0) {
subAreaList.unshift({
areaName: '全部',
areaId: -1
});
}
this.areaList.pop();
this.areaList.push(subAreaList);
this.areaMultiIndex = [this.areaMultiIndex[0], colObj.value, 0];
}
//
if (subAreaList.length > 0) {
subAreaList.unshift({
areaName: '全部',
areaId: -1
});
}
if (subSubAreaList.length > 0) {
subSubAreaList.unshift({
areaName: '全部',
areaId: -1
});
}
this.areaList.pop();
this.areaList.pop();
this.areaList.push(subAreaList);
this.areaList.push(subSubAreaList);
this.areaMultiIndex = [colObj.value, 0, 0];
} else if (colObj.column == 1) {
//
let subAreaList = await this.$request.areaListByStep({parentCode: this.areaList[1][colObj.value].areaCode, areaIds: this.workerStreetIds});
subAreaList = subAreaList.data;
//
if (subAreaList.length > 0) {
subAreaList.unshift({
areaName: '全部',
areaId: -1
});
}
this.areaList.pop();
this.areaList.push(subAreaList);
this.areaMultiIndex = [this.areaMultiIndex[0], colObj.value, 0];
} else {
//
}
},
async categoryChange(e) {
@ -639,14 +712,14 @@
if (colObj.column == 0) {
//
let subTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: this.categoryList[0][colObj.value].goodsCategoryId
});
subTypeList = subTypeList.data;
let subSubTypeList = [];
if (subTypeList && subTypeList.length) {
subSubTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: subTypeList[0].goodsCategoryId
});
subSubTypeList = subSubTypeList.data;
@ -668,7 +741,7 @@
} else if (colObj.column == 1) {
//
let subSubTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: this.categoryList[1][colObj.value].goodsCategoryId
});
subSubTypeList = subSubTypeList.data;
@ -684,7 +757,8 @@
},
showDemandDetail(e, task) {
let paramObj = {
orderMasterId: task.orderMasterId
orderMasterId: task.orderMasterId,
orderType: this.orderType
}
uni.navigateTo({
url: '/pages/demand-center/demand-detail?paramObj=' + encodeURIComponent(JSON.stringify(
@ -735,9 +809,18 @@
// uni.makePhoneCall({
// phoneNumber: this.curTask.customerPhone
// })
uni.navigateTo({
url: '/pages/order-manage/order-manage'
})
// uni.navigateTo({
// url: '/pages/order-manage/order-manage'
// })
if(this.orderType == 0) {
uni.navigateTo({
url: '/pages/order-manage/order-manage?orderType=0'
})
} else {
uni.navigateTo({
url: '/pages/order-manage/order-manage-parts?orderType=1'
})
}
},
goToCertify() {
uni.navigateTo({

View File

@ -20,7 +20,7 @@
</view>
<view class="margin-top-sm">
<text class="text-main-color text-lg margin-right-xs"><text class="cuIcon-locationfill"></text></text>
<text>{{order.address}}</text>
<text>{{order.provinceName + order.cityName + order.countryName + order.streetName + order.address}}</text>
</view>
<view class="margin-top-sm">
<text class="text-main-color text-lg margin-right-xs"><text class="cuIcon-timefill"></text></text>
@ -48,7 +48,7 @@
</view>
<view class="margin-bottom-sm"><text class="text-bold">订单编码</text>{{order.orderMasterCode}}</view>
<view class="margin-bottom-sm"><text class="text-bold">订单时间</text>{{order.createTime}}</view>
<view class="margin-bottom-sm"><text class="text-bold">备注</text>{{order.remark}}</view>
<view class="margin-bottom-sm"><text class="text-bold">备注</text>{{order.customerRemark}}</view>
</view>
</view>
<view class="cu-bar tabbar border shop fixed-bottom-bar">
@ -188,9 +188,16 @@
// uni.makePhoneCall({
// phoneNumber: this.order.customerPhone
// })
uni.navigateTo({
url: '/pages/order-manage/order-manage'
})
if(this.initParam.orderType === 1) {
uni.navigateTo({
url: '/pages/order-manage/order-manage-parts?orderType=1'
})
} else {
uni.navigateTo({
url: '/pages/order-manage/order-manage?orderType=0'
})
}
},
}
}

View File

@ -6,17 +6,105 @@
<block slot="content">服务规则</block>
</cu-custom>
<!-- 规则内容 -->
<view class="padding bg-white">
<view class="padding bg-white">
<view v-if="!hasCheckedRule">
<!-- v-if="hasCheckedRule" -->
<text style="color: red;">进入接单大厅前请先阅读并了解本服务规则标准有利于以良好的服务定位进行服务工作阅读学习后请打勾并确认本规则后续可在主页右上角服务规则处查看</text>
</view>
<view style="padding: 10upx 0;">
<text style="font-weight: 500;">接单规则晚19点至早8点不计超时</text>
</view>
<checkbox-group class="block" @change="checkRule">
<view class="flex justify-start align-start margin-top-xs" v-for="(item, index) in masterRules">
<view class="flex justify-start align-start margin-top-xs" v-for="(item, index) in masterRules" :key="index">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>{{item}}</text>
</view>
</view>
<view style="padding: 10upx 0;">
<text style="font-weight: 500;">服务流程</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>对话文明有礼电话及上门会面时工服/鞋套/口罩齐备设备工具/防护/地垫齐全事前有试机流程有沟通有确认问题指出留证据完工有复查卫生全干净客户现场给意见/验收/评价到位再出门杜绝二次上门及投诉发生率</text>
</view>
<view style="padding: 10upx 0;">
<text style="font-weight: 500;">异常处理</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>客户异常不同时间段多次联系未成功短信留言客户并点无法排单上传拔打记录或短信截图均定性为客户原因约定的上门不成功的与客户重新约定重新排单</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>师傅异常因故未能上门提前与客户协商同意后点重新排单改上门时间未能谈妥的报客服处被投诉无故迟到或未上门或完全不同意师傅的上门时间你全责</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>异常通报非师傅原因的服务有问题时对客户表达到位否则可能被定义为技能差从而投诉非师傅的异常指出后留证据先报至平台避免师傅责任!</text>
</view>
<view style="padding: 10upx 0;">
<text style="font-weight: 500;">六不红线</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>①代表品牌上门时不以其它身份沟通</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>②不谈论产品价格及服务费用</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>③不发表与服务无关的言论</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>④不撬订单否则一定会被品牌方追究</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>⑤不得发生争吵争吵无论对错师傅全责</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>⑥不得使用客户家里损耗类物品</text>
</view>
<view style="padding: 10upx 0;">
<text style="font-weight: 500;">沟通原则</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>服务前及服务中存在沟通分岐问题不能说不知道不关我事你退单等缺失服务水平言语有分岐应该客气和平的处理不要反复去证明客户错了遇事只提出你的积极解决方案以解决完事为准则如超能力处理范围或客户要求确实过份可说抱歉这个问题我现在反映给公司为您处理公司或平台客服接手后须离开的与客户打个招呼否则未确认接手及未打招呼离开或丢下不管客诉你全责</text>
</view>
<view style="padding: 10upx 0;">
<text style="font-weight: 500;">客诉界定</text>
</view>
<view class="flex justify-start align-start margin-top-xs">
<checkbox style="transform:scale(0.7)" class="main-color" :checked="hasCheckedRule" value='1'>
</checkbox>
<text>客诉无小事重要不属师傅的责任那都不是事属师傅责任那就都是事有责的客诉将被追责最高按订单额10%-50%或1000元处罚或赔偿损失以实际事实为准</text>
</view>
</checkbox-group>
<view class="margin-top-xl">总结约单迅速上门准时友好客气分清责任不踩红线流程沟通验收评价完单复查前后确认</view>
<!-- 操作按钮 -->
<view class="cu-bar tabbar border shop margin-top-lg">
<!-- 操作按钮 -->
<view class="margin-top-lg" style="text-align: center;" v-if="!hasCheckedRule">
<text>我已认真阅读并知晓规则</text>
</view>
<view class="cu-bar tabbar border shop">
<button class="cu-btn bg-main-color long-btn margin-lr-sm" type="" :disabled="hasCheckedRule"
@click="acceptRules">{{hasCheckedRule ? '已同意' : '同意'}}</button>
</view>
@ -58,19 +146,22 @@
checkedTimes++;
}
}
if (checkedTimes === this.masterRules.length) {
if (checkedTimes === 17) {
uni.showToast({
icon: 'success',
mask: true
})
uni.setStorageSync('hasCheckedRule', 1)
if (this.navigate) {
uni.navigateTo({
url: '/pages/demand-center/accept-demand-center'
})
} else {
uni.navigateBack()
}
} else {
uni.showToast({
title: '请逐条阅读并在框内打勾,完成规则学习',
title: '请逐条阅读并在框内打勾,完成规则学习',
icon: 'none',
mask: true
})

View File

@ -18,59 +18,61 @@
<!-- 条件筛选栏 -->
<view class="padding bg-white solid-bottom">
<view class="flex justify-between align-center">
<input class="line-input radius-input" v-model="formData.keywords" placeholder="请输入关键字"></input>
<button class="cu-btn bg-main-color shadow-blur">搜索</button>
<input class="line-input radius-input" v-model="keywords" :placeholder="tabCur == 0 ? '可搜索服务名称/标题或城市名或区县名' : '可搜索商品名称/标题或城市名或区县名'"></input>
<button class="cu-btn bg-main-color shadow-blur" @click="reloadData">搜索</button>
</view>
</view>
</view>
<!-- tab content -->
<view>
<view class="padding bg-white margin-top-sm margin-lr-sm name-card" v-for="(good, index) in goodsList" v-if="good.status !== 2">
<view class="flex justify-start">
<view class="cu-avatar xxl-view" :style="'background-image:url(' + good.goodsImgUrl + ');'"></view>
<view class="margin-left-sm flex-column-between">
<view class="text-black text-cut" style="width: 330rpx;">{{good.goodsName}}</view>
<view>
<view v-if="good.goodsStandardList[0].discountPrice" class="flex justify-start align-center">
<text class="text-price text-red text-bold text-lg">{{good.goodsStandardList[0].discountPrice}}</text>
<text class="text-del" v-if="good.goodsPrice">¥{{good.goodsStandardList[0].goodsPrice}}</text>
</view>
<view v-else-if="good.goodsStandardList[0].goodsPrice" class="flex justify-start align-center">
<text class="text-price text-red text-bold text-lg">{{good.goodsStandardList[0].goodsPrice}}</text>
</view>
</view>
<view class="text-gray" v-if="good.remark">{{good.remark}}</view>
<view v-if="good.goodsAreaList && good.goodsAreaList.length">
<view class="cu-capsule">
<view class='cu-tag bg-main-color sm'>
<text class='cuIcon-locationfill'></text>
<view class="padding bg-white margin-top-sm margin-lr-sm name-card" v-for="(good, index) in goodsList" :key="good.id">
<template v-if="good.status !== 2">
<view class="flex justify-start">
<view class="cu-avatar xxl-view" :style="'background-image:url(' + good.goodsImgUrl + ');'"></view>
<view class="margin-left-sm flex-column-between">
<view class="text-black text-cut" style="width: 330rpx;">{{good.goodsName}}</view>
<view>
<view v-if="good.goodsStandardList[0].discountPrice" class="flex justify-start align-center">
<text class="text-price text-red text-bold text-lg">{{good.goodsStandardList[0].discountPrice}}</text>
<text class="text-del" v-if="good.goodsPrice">¥{{good.goodsStandardList[0].goodsPrice}}</text>
</view>
<view class="cu-tag line-main-color sm">
服务区域
<view v-else-if="good.goodsStandardList[0].goodsPrice" class="flex justify-start align-center">
<text class="text-price text-red text-bold text-lg">{{good.goodsStandardList[0].goodsPrice}}</text>
</view>
</view>
<text v-for="(item,index) in good.goodsAreaList">
<text class="margin-lr-xs text-sm">{{item.areaName}}<text v-if="index != good.goodsAreaList.length - 1">,</text></text>
</text>
<!-- <view class="text-gray" v-if="good.remark">{{good.remark}}</view> -->
<view v-if="good.goodsAreaList && good.goodsAreaList.length">
<view class="cu-capsule">
<view class='cu-tag bg-main-color sm'>
<text class='cuIcon-locationfill'></text>
</view>
<view class="cu-tag line-main-color sm">
服务区域
</view>
</view>
<text v-for="(item,index) in good.goodsAreaList" :key="item.goodsId">
<text class="margin-lr-xs text-sm">{{item.areaName}}<text v-if="index != good.goodsAreaList.length - 1">,</text></text>
</text>
</view>
<!-- <view class="text-gray">团购日期</view> -->
<!-- <uni-datetime-picker :value="good.groupBuyDate" type="datetimerange" rangeSeparator="至" @change="changeGroupBuyDate($event, good)"/> -->
</view>
<!-- <view class="text-gray">团购日期</view> -->
<!-- <uni-datetime-picker :value="good.groupBuyDate" type="datetimerange" rangeSeparator="至" @change="changeGroupBuyDate($event, good)"/> -->
</view>
</view>
<view class="flex justify-end oper-bar">
<view class="text-center margin-right-sm" v-if="good.isGoldenServ">
<view class="cuIcon-selectionfill text-orange"></view>
<view class="text-xs">金牌服务</view>
<view class="flex justify-end oper-bar">
<view class="text-center margin-right-sm" v-if="good.isGoldenServ">
<view class="cuIcon-selectionfill text-orange"></view>
<view class="text-xs">金牌服务</view>
</view>
</view>
</view>
<view>
<button class="cu-btn line-main-color margin-right-xs margin-top-sm" @click="addEditGood(good)">编辑</button>
<button class="cu-btn line-main-color margin-right-xs margin-top-sm" v-if="good.status === 0" @click="offGood(good)"></button>
<button class="cu-btn line-main-color margin-right-xs margin-top-sm" v-if="good.status === 1" @click="onGood(good)">上架</button>
<!-- <button class="cu-btn line-main-color margin-right-xs margin-top-sm" @click="copyGood(good)">复制</button> -->
<!-- <button class="cu-btn line-main-color margin-right-xs margin-top-sm">优惠券</button> -->
<!-- <button class="cu-btn line-red shadow-blur margin-right-xs margin-top-sm" @click="delGood(good)">删除</button> -->
</view>
<view v-if="good.goodsId">
<button class="cu-btn line-main-color margin-right-xs margin-top-sm" @click="() => addEditGood(good.goodsId)">编辑</button>
<button class="cu-btn line-main-color margin-right-xs margin-top-sm" v-if="good.status === 0" @click="() => offGood(good)">下架</button>
<button class="cu-btn line-main-color margin-right-xs margin-top-sm" v-if="good.status === 1" @click="() => onGood(good)"></button>
<!-- <button class="cu-btn line-main-color margin-right-xs margin-top-sm" @click="copyGood(good)">复制</button> -->
<!-- <button class="cu-btn line-main-color margin-right-xs margin-top-sm">优惠券</button> -->
<!-- <button class="cu-btn line-red shadow-blur margin-right-xs margin-top-sm" @click="delGood(good)">删除</button> -->
</view>
</template>
</view>
</view>
</view>
@ -78,7 +80,7 @@
<view class="margin-bottom-with-bar"></view>
<!-- 底部操作栏 -->
<view class="padding-tb-sm flex justify-around padding-tb-sm fixed-bottom-bar-with-bar bg-back">
<button class="cu-btn bg-main-color lg shadow-blur margin-left-xs" @click="addEditGood(null)">新增服务</button>
<button class="cu-btn bg-main-color lg shadow-blur margin-left-xs" @click="addEditGood(null)">新增{{tabCur === 0 ? '服务' : '货品'}}</button>
<button class="cu-btn bg-main-color lg shadow-blur" disabled type="">优惠券</button>
<button class="cu-btn bg-main-color lg shadow-blur" disabled type="">暂停售卖</button>
<!-- <button class="cu-btn bg-main-color lg shadow-blur margin-right-xs" data-modal="communityModal" @tap="showModal">社区</button> -->
@ -130,14 +132,15 @@
loadStatusBar
},
data() {
return {
return {
keywords: '',
tabCur: 0,
tabHeaders: [{
code: 0,
code: 1,
name: '服务商品'
}, {
code: 1,
name: '配件商品'
code: 2,
name: '货物商品'
}],
scrollLeft: 0,
stickyTop: this.CustomBar,
@ -180,9 +183,13 @@
params.pageNum = this.pageNum;
params.pageSize = this.pageSize;
params.workerId = this.$request.getCurUserInfo().workerId;
params.keyword = this.keywords;
this.$refs.loadStatusBar.showLoading();
try {
let res = await this.$request.qryProductPage(params);
let res = await this.$request.qryProductPage({
...params,
type: this.tabHeaders[this.tabCur].code
});
let rowsLength = res.rows.length;
if (rowsLength > 0) {
this.goodsList = this.goodsList.concat(res.rows);
@ -208,7 +215,8 @@
},
tabSelect(e) {
this.tabCur = e.currentTarget.dataset.id;
this.scrollLeft = (e.currentTarget.dataset.id - 1) * 60
this.scrollLeft = (e.currentTarget.dataset.id - 1) * 60
this.reloadData()
},
showModal(e) {
let modalName = e.currentTarget.dataset.modal;
@ -279,14 +287,23 @@
comfirmCommunity() {
},
addEditGood(servItem) {
let params = '';
if (servItem != null) {
params = '?goodId=' + servItem.goodsId
addEditGood(goodsId) {
let params = '?type='+this.tabHeaders[this.tabCur].code;
const curType = this.tabHeaders[this.tabCur].code
if (goodsId != null) {
params = '?goodId=' + goodsId + '&type='+curType
}
uni.navigateTo({
url: '/pages/my/new-serv' + params
})
console.log(params);
if(curType === 1) {
uni.navigateTo({
url: '/pages/my/new-serv' + params
})
} else {
uni.navigateTo({
url: '/pages/my/new-serv-parts' + params
})
}
}
},
}

View File

@ -19,19 +19,19 @@
</view> -->
</view>
</view>
<!-- <view class="right-tag padding-lr padding-tb-xs" @click="showMasterRule">师傅规则</view> -->
<view class="right-tag padding-lr padding-tb-xs" @click="showMasterRule">服务规则</view>
</view>
<!-- 未预约未派单上门超时 -->
<view class="cu-list grid no-border col-3 margin-top-sm" style="background-color: inherit;">
<view class="cu-item">
<view class="cu-item" @click="gotoOrderNew">
<view class="margin-bottom-xs text-xxl">{{orderStatistics.newOrderNum}}</view>
<view>新订单</view>
</view>
<view class="cu-item">
<view class="cu-item" @click="goToOrder">
<view class="margin-bottom-xs text-xxl">{{orderStatistics.planOrderNum}}</view>
<view>未排单</view>
</view>
<view class="cu-item">
<view class="cu-item" @click="goToOrder">
<view class="margin-bottom-xs text-xxl">0</view>
<view>上门超时</view>
</view>
@ -43,13 +43,13 @@
<view class="cu-bar margin-top-sm solid-bottom">
<view class="action bar-first-action">
<view class="cuIcon-title text-main-color"></view>
<text>今日待上门({{waitServOrderToday.length}})</text>
<text>今日待处理({{waitServOrderToday.length}})</text>
</view>
<view class="flex justify-end text-sm align-center"
@click="clickServModule({
pageUrl: '/pages/order-manage/order-manage'
pageUrl: waitServOrderToday[0].orderType === 1 ? '/pages/order-manage/order-manage-parts' : '/pages/order-manage/order-manage'
})">
<text>即将上门订单</text>
<text>即将处理订单</text>
<text class="cuIcon-right"></text>
</view>
</view>
@ -73,7 +73,7 @@
</swiper-item>
</swiper>
<view v-else class="screen-swiper padding text-center text-gray">
今日无待上门订单
今日无待处理订单
</view>
</view>
<!-- 每周公告 -->
@ -96,15 +96,15 @@
<view hover-class="none" class="nav-li serv-module" @click="clickServModule(item)"
:class="'bg-'+item.color" :style="[{animation: 'show ' + ((index+1)*0.2+1) + 's 1'}]"
v-for="(item,index) in servModules " :key="index">
<template v-if="item.id !== 4">
<!-- <template v-if="item.id !== 4"> -->
<view :class="index === 0 ? 'text-xxl' : 'text-xl'">{{item.title}}</view>
<!-- <view class="nav-name">{{item.name}}</view> -->
<text :class="'cuIcon-' + item.cuIcon"></text>
</template>
<button data-name="shareBtn" open-type="share" hover-class="none" v-else>
<!-- </template> -->
<!-- <button data-name="shareBtn" open-type="share" hover-class="none" v-else>
<view :class="index === 0 ? 'text-xxl' : 'text-xl'">{{item.title}}</view>
<text :class="'cuIcon-' + item.cuIcon"></text>
</button>
</button> -->
</view>
</view>
</view>
@ -135,26 +135,28 @@
checkLogin: true
}, {
id: 2,
title: '我的订单',
title: '服务订单',
name: '查看详情',
color: 'orange',
cuIcon: 'text',
pageUrl: '/pages/order-manage/order-manage',
pageUrl: '/pages/order-manage/order-manage?orderType=0',
checkLogin: true
}, {
id: 3,
title: '叮咚学院',
title: '商品订单',
name: '查看详情',
color: 'cyan',
cuIcon: 'emoji',
pageUrl: ''
pageUrl: '/pages/order-manage/order-manage-parts?orderType=1',
checkLogin: true
}, {
id: 4,
title: '邀请师傅',
title: '商品大厅',
name: '查看详情',
color: 'pink',
cuIcon: 'profile',
pageUrl: ''
pageUrl: '/pages/demand-center/accept-demand-center?orderType=1',
checkLogin: true
}, {
id: 5,
title: '区域代理',
@ -165,7 +167,7 @@
checkLogin: true
}],
curUserInfo: {},
myInfo: {},
// myInfo: {},
waitServOrderToday: [],
orderStatistics: {},
isShowSteer: false,
@ -178,14 +180,12 @@
this.loadData();
},
methods: {
test() {
},
async authLogin() {
// userInfo
// let res = await this.$request.storageExistUser();
// userInfo
let curUserInfo = this.$request.getCurUserInfo();
console.log(curUserInfo);
//
// if (!curUserInfo || !curUserInfo.openId) {
// this.$refs.vertifyLogin.showModal();
@ -218,20 +218,23 @@
this.$refs.vertifyWorkerType.showModal();
return false;
}
this.loadData();
// if(Object.keys('orderStatistics').length === 0) {
// this.loadData();
// }
return true;
},
async loadData() {
// userInfo
this.curUserInfo = this.$request.getCurUserInfo();
this.myInfo = await this.$api.data('myInfo');
// this.isShowSteer = !this.myInfo.entryType;
// this.myInfo = await this.$api.data('myInfo');
// this.isShowSteer = !this.myInfo.entryType;
const hasCheckedRule = !!uni.getStorageSync('hasCheckedRule')
let newServModules = this.servModules.concat();
if (this.myInfo.hasCheckedRule) {
newServModules[0].pageUrl = '/pages/demand-center/accept-demand-center';
if (hasCheckedRule) {
newServModules[0].pageUrl = '/pages/demand-center/accept-demand-center?orderType=0';
} else {
let paramObj = {
hasCheckedRule: this.myInfo.hasCheckedRule,
hasCheckedRule: hasCheckedRule,
navigate: true
}
newServModules[0].pageUrl = '/pages/demand-center/rule?paramObj=' + encodeURIComponent(JSON
@ -261,9 +264,10 @@
hideModal(e) {
this[e.currentTarget.dataset.modal] = false;
},
showMasterRule() {
showMasterRule() {
const hasCheckedRule = !!uni.getStorageSync('hasCheckedRule')
let paramObj = {
hasCheckedRule: this.myInfo.hasCheckedRule,
hasCheckedRule: hasCheckedRule,
navigate: false
}
uni.navigateTo({
@ -282,13 +286,51 @@
if (pageObj.checkLogin) {
let res = await this.authLogin();
if (res) {
uni.navigateTo({
url: pageObj.pageUrl
})
// uni.navigateTo({
// url: pageObj.pageUrl
// })
this.toNewPath(pageObj.pageUrl)
}
} else {
// uni.navigateTo({
// url: pageObj.pageUrl
// })
this.toNewPath(pageObj.pageUrl)
}
},
gotoOrderNew() {
// uni.navigateTo({
// url: '/pages/order-manage/order-manage?stateCur=6'
// })
this.toNewPath('/pages/order-manage/order-manage?stateCur=6')
},
goToOrder() {
// uni.navigateTo({
// url: '/pages/order-manage/order-manage'
// })
this.toNewPath('/pages/order-manage/order-manage')
},
async toNewPath(path) {
const res = await this.$request.getAndSetWorkerInfo(this.curUserInfo.workerId)
if(res.data.loginStatus == 1) {
// 退
uni.clearStorageSync('userProfile');
uni.showToast({
icon: 'none',
title: '您已被禁止登录',
duration: 3000,
success() {
setTimeout(() => {
uni.reLaunch({
url: '/pages/login/login'
})
}, 3000)
}
})
return
} else {
uni.navigateTo({
url: pageObj.pageUrl
url: path
})
}
}

View File

@ -35,7 +35,7 @@
data() {
return {
moduleBarInfos: [],
curPageCode: 'indexPage',
curPageCode: '',
forwardingPageCode: null
}
},
@ -51,6 +51,8 @@
this.loadData();
if (options && options.menuCode) {
this.changeCurPageCode(options.menuCode)
} else {
this.curPageCode = 'indexPage'
}
},
methods: {

View File

@ -18,7 +18,7 @@
</view>
</view>
</view>
<view class="paper-drawer-bar margin-bottom-with-bar">
<view class="paper-drawer-bar margin-bottom-with-bar padding-bottom-lg">
<view class="margin-lr-sm cu-list grid no-border col-4 shadow-warp">
<view class="cu-item">
<view class="cuIcon-remind margin-bottom-xs middle-icon"
@ -92,10 +92,17 @@
}, {
name: '服务明细',
icon: 'calendar'
}, {
name: '师傅入驻',
},
{
name: '服务入驻',
icon: 'profile',
pageUrl: '/pages/my/master-settled-info',
pageUrl: '/pages/my/master-settled-info?type=1',
show: true
},
{
name: '商品入驻',
icon: 'profile',
pageUrl: '/pages/my/master-settled-info?type=2',
show: true
},
{
@ -133,7 +140,8 @@
icon: 'exit',
pageUrl: '/pages/login/login',
show: true
}]
}],
isSixSecord: false
}
},
onReady() {
@ -166,6 +174,9 @@
const status = await this.checkBeforeFollow()
if(!status) {
this.$refs.focusModal.showModal();
setTimeout(() => {
this.isSixSecord = true
}, 6000)
} else {
uni.showToast({
title: '您已绑定消息通知',
@ -177,7 +188,7 @@
const wxLoginRes = await wx.login();
console.log(wxLoginRes);
const wxAuthRes = await uni.request({
url: '/wx/check',
url: '/wx/neCheck',
header: {
code: wxLoginRes.code
}
@ -191,28 +202,18 @@
return wxAuthRes[1].data.data
},
async checkIfFollow() {
const status = await this.checkBeforeFollow()
// const wxLoginRes = await wx.login();
// const wxAuthRes = await uni.request({
// url: '/wx/check',
// header: {
// code: wxLoginRes.code
// }
// })
if(!status) {
uni.showToast({
title: '请完成公众号关注',
icon: 'none'
})
return;
} else {
// uni.showToast({
// title: '',
// icon: 'success'
// })
this.$refs.focusModal.hideModal();
return;
if(!this.isSixSecord) {
const status = await this.checkBeforeFollow()
if(!status) {
uni.showToast({
title: '请先关注公众号',
icon: 'none'
})
return;
}
}
this.$refs.focusModal.hideModal();
return;
}
},
}

View File

@ -52,7 +52,7 @@
</view>
<view class="cu-form-group margin-top">
<view class="title">验证码</view>
<input class="radius-input" type="number" name="registerCode" v-model="formData.registerCode"
<input class="radius-input" type="digit" name="registerCode" v-model="formData.registerCode"
placeholder="请输入验证码"></input>
<view v-if="countDownNum === 0" class="cu-btn bg-blue round-btn margin-left-xs shadow-blur" @click="sendVertifyCode">发送验证码
</view>
@ -99,7 +99,7 @@
<script>
// import inviteMaster from '../area-proxy/modal/invite-master.vue'
// 18929577155 qq880920
// 18929577155 qq880920 13386441744
export default {
components: {
// inviteMaster
@ -111,7 +111,8 @@
countDownNum: 0,
agreeContract: false,
formData: {},
inviter: {}
inviter: {},
isSixSecord: false
}
},
onLoad(options) {
@ -132,12 +133,15 @@
this.reset();
this.operType = this.operType === 0 ? 1 : 0;
if (this.operType === 1) {
const status = await this.checkBeforeFollow()
if(!status) {
// const status = await this.checkBeforeFollow()
// if(!status) {
this.$refs.focusModal.showModal();
} else {
this.authLogin();
}
setTimeout(() => {
this.isSixSecord = true
}, 6000)
// } else {
// this.authLogin();
// }
}
},
reset() {
@ -344,20 +348,15 @@
return wxAuthRes[1].data.data
},
async checkIfFollow() {
const res = await this.checkBeforeFollow()
// const wxLoginRes = await wx.login();
// const wxAuthRes = await uni.request({
// url: '/wx/check',
// header: {
// code: wxLoginRes.code
// }
// })
if(!res) {
uni.showToast({
title: '请先关注公众号',
icon: 'error'
})
return
if(!this.isSixSecord) {
const res = await this.checkBeforeFollow()
if(!res) {
uni.showToast({
title: '请先关注公众号',
icon: 'error'
})
return
}
}
this.$refs.focusModal.isShow = false;
this.authLogin();

View File

@ -0,0 +1,420 @@
<template>
<view>
<!-- 顶部操作条 -->
<cu-custom :bgColor="'bg-main-color'" :isBack="true">
<block slot="backText">返回</block>
<block slot="content">{{mode === 1 ? '新增' : '编辑'}}店铺</block>
</cu-custom>
<!-- 地址信息form -->
<view class="bg-white margin-top-sm">
<form @submit="submit">
<view style="padding: 0 30rpx;">
<view class="padding-tb-sm flex justify-between align-center">
<text>店铺门头</text>
<text style="font-size: 20rpx;">1张门头照+3张店内照 (至少1张门头照排前)</text>
</view>
<view>
<div class="grid col-3 grid-square">
<view class="bg-img" v-for="(item,index) in imgList" :key="index"
@tap="viewImage($event, imgList)" :data-url="item">
<image :src="item" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, imgList)" :data-index="index">
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImage" v-if="imgList.length < 6">
<text class='cuIcon-cameraadd'></text>
</view>
</div>
</view>
</view>
<!-- #ifndef H5 || APP-PLUS || MP-ALIPAY -->
<view class="cu-form-group">
<view class="title">联系地址</view>
<picker :mode="'multiSelector'" @change="regionChange" @columnchange="regionColChange" :value="multiIndex" :range-key="'areaName'" :range="areaList">
<view class="picker">
{{formData.area && formData.area.length ? formData.area[0].areaName + '-' + formData.area[1].areaName + '-' + formData.area[2].areaName + '-' + formData.area[3].areaName : '请选择'}}
</view>
</picker>
</view>
<!-- #endif -->
<view class="cu-form-group">
<view class="title">详细地址</view>
<input name="address" v-model="formData.address"></input>
<view class="text-blue" @click="getLocation">定位上传</view>
</view>
<view class="cu-form-group">
<view class="title">门店名称</view>
<input name="shopName" v-model="formData.shopName"></input>
</view>
<view class="cu-form-group">
<view class="title">门店电话</view>
<input name="phone" v-model="formData.phone" placeholder="请输入门店客户接待电话"></input>
</view>
<!-- 底部操作栏 -->
<view class="cu-bar tabbar border shop fixed-bottom-bar">
<button class="cu-btn bg-main-color long-btn margin-lr-sm shadow-blur" form-type="submit">保存</button>
</view>
</form>
</view>
<!-- <view class="cu-modal" :class="isLocationShow?'show':''">
<view class="cu-dialog bg-white">
<view class="cu-bar bg-white justify-end solid-bottom">
<view class="content">提示</view>
<view class="action" @click="isLocationShow = false">
<text class="cuIcon-close text-red"></text>
</view>
</view>
<view class="padding-xl text-left bg-white">
<view>
点击确定定位会按你当前位置上传添加店铺本次定位上传时请在店铺内操作
</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-black" @tap="isLocationShow = false">关闭</view>
<view class="action margin-0 flex-sub text-main-color solid-left"
@click="getLocation">确定定位</view>
</view>
</view>
</view> -->
<!-- 前往授权设置 -->
<!-- <view class="cu-modal" :class="isShowPrivSetting?'show':''">
<view class="cu-dialog">
<view class="padding-xl text-left">
<view>需先授权定位功能才可正常使用功能</view>
</view>
<view class="cu-bar bg-white">
<navigator class="modal-bottom-oper margin-0 flex-sub text-black" open-type="exit"
target="miniProgram">拒绝授权
</navigator>
<button class="cu-btn modal-bottom-oper margin-0 flex-sub text-main-color bg-white solid-left"
open-type="openSetting" @opensetting="authLocationCallback">前往授权</button>
</view>
</view>
</view> -->
</view>
</template>
<script>
export default {
data() {
return {
areaList: [],
multiIndex: [0, 0, 0],
formData: {
},
mode: 1, // 10
imgList: [],
isLocationShow: false,
isShowPrivSetting: false
}
},
onLoad(options) {
let params = JSON.parse(decodeURIComponent(options.params));
this.mode = params ? params.mode : this.mode;
console.log(this.mode)
if (this.mode === 0) {
//
this.fillForm(params.addressInfo);
} else {
this.formData = {
area: [],
shopName: '',
address: '',
phone: '',
provinceId: '',
provinceName: '',
cityId: '',
cityName: '',
countryId: '',
countryName: '',
streetId: '',
streetName: '',
longitude: '',
latitude: ''
}
}
this.loadData();
},
methods: {
chooseImage(e) {
uni.chooseMedia({
count: 1, //9
mediaType: ['image'],
sizeType: ['original', 'compressed'], //
sourceType: ['album'], //
success: (res) => {
uni.showLoading({
title: '上传中',
mask: true
});
res.tempFiles.forEach((fileObj, index) => {
this.$request.uploadFile(fileObj.tempFilePath).then((url) => {
this.imgList.push(url);
if (index === res.tempFiles.length - 1) {
uni.hideLoading();
}
});
});
}
});
},
viewImage(e, imgList) {
uni.previewImage({
urls: imgList,
current: e.currentTarget.dataset.url
});
},
delImg(e, imgList) {
uni.showModal({
title: '',
content: '确定要删除这张图片吗?',
cancelText: '取消',
confirmText: '确定',
success: res => {
if (res.confirm) {
imgList.splice(e.currentTarget.dataset.index, 1)
}
}
})
},
async loadData() {
// this.areaList = await this.$api.data('areaList');
this.loadAreaList();
},
fillForm(addressInfo) {
this.formData = addressInfo && Object.keys(addressInfo).length > 0 ? addressInfo : this.formData;
this.imgList = addressInfo.imageUrl ? addressInfo.imageUrl.split(',') : []
},
// async authLocationCallback(res) {
// if (res.detail.authSetting['scope.userLocation']) {
// this.isShowPrivSetting = false;
// this.getLocation();
// }
// },
async getLocation() {
// let res = await wx.getSetting();
// console.log(res);
// if (res && !res.authSetting['scope.userLocation']) {
// wx.authorize({
// scope: 'scope.userLocation',
// success: () => {
// this.getLocation()
// },
// fail: () => {
// this.isShowPrivSetting = true;
// }
// });
// return;
// }
// const res = await this.$request.GetCurrentLocation()
wx.chooseLocation({
success: async (res1) => {
const res = await this.$request.TransformLocation(res1)
console.log(res);
this.formData.area = [res.provinceArea, res.cityArea, res.countryArea, res.streetArea]
this.formData.provinceId = res.provinceArea.areaId;
this.formData.provinceName = res.provinceArea.areaName;
this.formData.cityId = res.cityArea.areaId;
this.formData.cityName = res.cityArea.areaName;
this.formData.countryId = res.countryArea.areaId;
this.formData.countryName = res.countryArea.areaName;
this.formData.streetId = res.streetArea.areaId;
this.formData.streetName = res.streetArea.areaName;
this.formData.latitude = res.latitude;
this.formData.longitude = res.longitude;
this.isLocationShow = false
},
fail: (err) => {
console.error('选择位置失败', err);
// uni.showModal({
// title: '',
// content: '',
// cancelText: '',
// confirmText: '',
// success: res => {
// if (res.confirm) {
// this.getLocation();
// }
// }
// })
}
});
},
async loadAreaList(idArr) {
let areaList = await this.$request.areaListByStep();
areaList = areaList.data;
let col1Code = idArr ? idArr[0] : areaList[0].areaCode;
let subAreaList = await this.$request.areaListByStep({ parentCode: col1Code });
subAreaList = subAreaList.data;
let col2Code = idArr ? idArr[1] : subAreaList[0].areaCode;
let subSubAreaList = await this.$request.areaListByStep({ parentCode: col2Code });
subSubAreaList = subSubAreaList.data;
let col3Code = idArr ? idArr[2] : subSubAreaList[0].areaCode;
let subSub2AreaList = await this.$request.areaListByStep({ parentCode: col3Code });
subSub2AreaList = subSub2AreaList.data;
this.areaList.push(areaList);
this.areaList.push(subAreaList);
this.areaList.push(subSubAreaList);
this.areaList.push(subSub2AreaList);
},
regionChange(e) {
this.multiIndex = e.detail.value;
let chosenArea = [];
for(let i = 0; i < this.areaList.length; i++) {
chosenArea.push(this.areaList[i][this.multiIndex[i]]);
}
this.formData.area = chosenArea;
this.formData.provinceId = chosenArea[0].areaId;
this.formData.provinceName = chosenArea[0].areaName;
this.formData.cityId = chosenArea[1].areaId;
this.formData.cityName = chosenArea[1].areaName;
this.formData.countryId = chosenArea[2].areaId;
this.formData.countryName = chosenArea[2].areaName;
this.formData.streetId = chosenArea[3].areaId;
this.formData.streetName = chosenArea[3].areaName;
},
async regionColChange(e) {
let colObj = e.detail;
if (colObj.column == 0) {
let subSubAreaList = [], subSub2AreaList = [];
//
let subAreaList = await this.$request.areaListByStep({parentCode: this.areaList[0][colObj.value].areaCode});
subAreaList = subAreaList.data;
if (subAreaList && subAreaList.length) {
subSubAreaList = await this.$request.areaListByStep({parentCode: subAreaList[0].areaCode});
subSubAreaList = subSubAreaList.data;
if(subSubAreaList && subSubAreaList.length) {
subSub2AreaList = await this.$request.areaListByStep({parentCode: subSubAreaList[0].areaCode});
subSub2AreaList = subSub2AreaList.data;
}
}
this.areaList[1] = subAreaList
this.areaList[2] = subSubAreaList
this.areaList[3] = subSub2AreaList
this.multiIndex = [colObj.value, 0, 0, 0];
} else if (colObj.column == 1) {
let subSub2AreaList = []
//
let subSubAreaList = await this.$request.areaListByStep({parentCode: this.areaList[1][colObj.value].areaCode});
subSubAreaList = subSubAreaList.data;
if (subSubAreaList && subSubAreaList.length) {
subSub2AreaList = await this.$request.areaListByStep({parentCode: subSubAreaList[0].areaCode});
subSub2AreaList = subSub2AreaList.data;
}
this.areaList[2] = subSubAreaList
this.areaList[3] = subSub2AreaList
this.multiIndex = [this.multiIndex[0], colObj.value, 0, 0];
} else if (colObj.column == 2) {
//
let subSubAreaList = await this.$request.areaListByStep({parentCode: this.areaList[2][colObj.value].areaCode});
subSubAreaList = subSubAreaList.data;
this.areaList[3] = subSubAreaList;
this.multiIndex = [this.multiIndex[0], this.multiIndex[1], colObj.value, 0];
}
},
validateForm(addressInfo) {
console.log(addressInfo);
if(this.imgList.length === 0) {
uni.showToast({
title: '请至少上传一张门头图',
icon: 'none',
mask: true
})
return false
}
if(!addressInfo.latitude || !addressInfo.longitude) {
uni.showToast({
title: '请先点击定位上传',
icon: 'none',
mask: true
})
return false
}
if(!addressInfo.area || addressInfo.area.length === 0) {
uni.showToast({
title: '请选择联系地址',
icon: 'none',
mask: true
})
return false
}
if (!addressInfo.address) {
uni.showToast({
title: '请填写详细地址',
icon: 'none',
mask: true
})
return false
}
if (!addressInfo.shopName) {
uni.showToast({
title: '请输入门店名称',
icon: 'none',
mask: true
})
return false
}
if (!this.$validate.validContactNum(addressInfo.phone)) {
uni.showToast({
title: '联系号码格式错误',
icon: 'none',
mask: true
})
return false
}
return true;
},
async submit(e) {
const confirmFormData = {...this.formData}
console.log(confirmFormData);
let formValid = this.validateForm(confirmFormData);
if (formValid) {
let isSuccess = false;
if (this.mode === 1) {
let res = await this.$request.addShopAddressList({
...this.formData,
imageUrl: this.imgList.toString(),
workerId: this.$request.getCurUserInfo().workerId
});
if (res.code === 0) {
isSuccess = true;
}
} else if (this.mode === 0) {
let res = await this.$request.editShopAddressList({
...this.formData,
imageUrl: this.imgList.toString(),
workerId: this.$request.getCurUserInfo().workerId,
});
if (res.code === 0) {
isSuccess = true;
}
}
if (isSuccess) {
uni.showToast({
title: '保存成功',
icon: 'success',
mask: true
})
uni.navigateBack()
} else {
uni.showToast({
title: '保存失败',
icon: 'error',
mask: true
})
}
}
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,741 @@
<template>
<view>
<!-- 顶部操作条 -->
<cu-custom :bgColor="'bg-main-color'" :isBack="true">
<block slot="backText">返回</block>
<block slot="content">师傅入驻信息填写</block>
</cu-custom>
<!-- 步骤条 -->
<view class="bg-white padding">
<view class="cu-steps">
<view class="cu-item" :class="index>curStep?'':'text-main-color'" v-for="(stepName, index) in stepList" :key="stepName">
<text class='cuIcon-radioboxfill'></text> {{stepName}}
</view>
</view>
</view>
<!-- 服务区域 -->
<view v-if="curStep === 0">
<view class="margin-bottom-with-bar">
<view class="bg-white margin-top-sm" v-for="(item, index) in servArea" :key="index">
<view class="cu-bar padding-lr solid-bottom">
<view class="text-lg">
<text class="cuIcon-titles"></text>
<text>发货区域{{index + 1}}(将按服务范围派单)</text>
</view>
<view @click="delServArea(index)">
<text class="text-main-color">删除</text>
</view>
</view>
<view class="padding">
<view class="flex">
<my-uni-combox class="flex-sub margin-right-xs" :candidates="provinceList"
:showField="'areaName'" placeholder="选择省份" v-model="servArea[index].provinceObj"
@input="chooseRegion($event, 0, index)"></my-uni-combox>
<!-- <my-uni-combox class="flex-sub margin-right-xs" :candidates="servArea[index].cityList"
:showField="'areaName'" placeholder="选择城市" v-model="servArea[index].cityObj"
@input="chooseRegion($event, 1, index)" @tap="reloadTargetArea(1, index)"></my-uni-combox> -->
<!-- <my-uni-combox class="flex-sub" :candidates="servArea[index].districtList"
:showField="'areaName'" placeholder="选择地区" v-model="servArea[index].districtObj"
@input="chooseRegion($event, 2, index)" @tap="reloadTargetArea(2, index)"></my-uni-combox> -->
</view>
<checkbox-group @change="checkCity($event, index)" class="grid col-2 margin-top-xs">
<view v-for="(item0, index0) in servArea[index].cityList" :key="item0.areaCode" class="margin-tb-xs">
<checkbox style="transform:scale(1)" class="main-color margin-right-xs"
:value="item0.areaCode"
:checked="servArea[index].cityIds.indexOf(item0.areaId) !== -1 ? true : false">
</checkbox>
<text>{{item0.areaName}}</text>
</view>
</checkbox-group>
<!-- <checkbox-group @change="checkStreet($event, index)" class="grid col-2 margin-top-xs">
<view v-for="(item0, index0) in servArea[index].streetList" class="margin-tb-xs">
<checkbox style="transform:scale(1)" class="main-color margin-right-xs"
:value="item0.areaCode"
:checked="servArea[index].streetIds.indexOf(String(item0.areaCode)) !== -1 ? true : false">
</checkbox>
<text>{{item0.areaName}}</text>
</view>
</checkbox-group> -->
</view>
</view>
<view class="text-center margin-top">
<button class="cu-btn bg-main-color light" @click="addServArea">
<text class="margin-right-xs"><text class="cuIcon-add"></text></text>
<text>继续添加发货区域</text>
</button>
</view>
</view>
<view class="bottom-site-bar"></view>
<!-- 下一步 -->
<view class="cu-bar tabbar border shop fixed-bottom-bar bg-back">
<button class="margin-lr cu-btn bg-main-color shadow-blur long-btn" @click="nextStep">下一步</button>
</view>
</view>
<!-- 服务技能 -->
<view v-if="curStep === 1">
<view class="margin-bottom-with-bar">
<view class="bg-white margin-top-sm" v-for="(item, index) in servSkill" :key="index">
<view class="cu-bar padding-lr solid-bottom">
<view class="text-lg">
<text class="cuIcon-titles"></text>
<text>货品类别{{index + 1}}(将按服务技能派单)</text>
</view>
<view @click="delServSkill(index)">
<text class="text-main-color">删除</text>
</view>
</view>
<view class="padding">
<view class="flex">
<my-uni-combox class="flex-sub margin-right-xs" :candidates="typeList"
:showField="'goodsCategoryName'" placeholder="请选择" v-model="servSkill[index].typeObj"
@input="chooseType($event, 0, index)"></my-uni-combox>
<my-uni-combox class="flex-sub" :candidates="servSkill[index].subTypeList"
:showField="'goodsCategoryName'" placeholder="请选择" v-model="servSkill[index].subTypeObj"
@input="chooseType($event, 1, index)" @tap="reloadTargetCategory(1, index)"></my-uni-combox>
</view>
<checkbox-group @change="checkGoodType($event, index)" class="grid col-3 margin-top-xs">
<view v-for="(item0, index0) in servSkill[index].subSubTypeList" :key="item0.goodsCategoryId" class="margin-tb-xs">
<checkbox style="transform:scale(1)" class="main-color margin-right-xs"
:value="item0.goodsCategoryId"
:checked="servSkill[index].subSubTypeIds.indexOf(String(item0.goodsCategoryId)) !== -1 ? true : false">
</checkbox>
<text>{{item0.goodsCategoryName}}</text>
</view>
</checkbox-group>
<!-- <view>
<input type="text" class="radius-input" placeholder="输入其他服务,用“,”隔开。"
v-model="servSkill[index].otherServSkill">
</view> -->
</view>
</view>
<view class="text-center margin-top">
<button class="cu-btn bg-main-color light" @click="addServSkill">
<text class="margin-right-xs"><text class="cuIcon-add"></text></text>
<text>继续添加货品类别</text>
</button>
</view>
</view>
<view class="bottom-site-bar"></view>
<!-- 下一步 -->
<view class="cu-bar tabbar border shop fixed-bottom-bar bg-back">
<button class="margin-lr-sm cu-btn bg-white shadow-blur long-btn" @click="preStep">上一步</button>
<!-- <button class="bg-main-color long-btn margin-lr" @click="nextStep">下一步</button> -->
<button class="margin-lr-sm cu-btn bg-main-color shadow-blur long-btn" @click="submit">提交</button>
</view>
</view>
<view v-if="false" class="margin-top-sm">
<view class="margin-bottom-with-bar">
<view class="bg-white margin-top-sm" v-for="(item, index) in specialSkill" :key="index">
<view class="cu-bar padding-lr solid-bottom">
<view class="text-lg">
<text class="cuIcon-titles"></text>
<text>特殊技能{{index + 1}}(特殊工种如空调安装等请上传)</text>
</view>
<view @click="delSpecialSkill(index)">
<text class="text-main-color">删除</text>
</view>
</view>
<view class="padding">
<view>
<text>特殊技能</text>
<view>
<view class="flex align-center margin-bottom-xs">
<my-uni-combox class="flex-sub margin-right-xs" :candidates="specialTypeList"
:showField="'goodsCategoryName'" placeholder="请选择"
v-model="specialSkill[index].specialTypeObj" @input="chooseSpecialSkill($event, 0, index)">
</my-uni-combox>
<my-uni-combox class="flex-sub margin-right-xs"
:candidates="specialSkill[index].specialSubTypeList" :showField="'goodsCategoryName'"
placeholder="请选择" v-model="specialSkill[index].specialSubTypeObj"
@input="chooseSpecialSkill($event, 1, index)"></my-uni-combox>
<my-uni-combox class="flex-sub" :candidates="specialSkill[index].specialSubSubTypeList"
:showField="'goodsCategoryName'" placeholder="请选择"
v-model="specialSkill[index].specialSubSubTypeObj"
@input="chooseSpecialSkill($event, 2, index)"></my-uni-combox>
</view>
<my-uni-combox :candidates="specialSkill[index].specialSkillList"
:showField="'specialSkillName'" placeholder="请选择"
v-model="specialSkill[index].specialSkillObj"
@input="chooseSpecialSkill($event, 3, index)"></my-uni-combox>
</view>
</view>
<view class="flex justify-start align-center margin-top-sm">
<view>技能证书</view>
<view class="grid col-1 upload-pic-grid grid-square flex-sub">
<view class="bg-img" v-for="(url, index0) in specialSkill[index].skillCert" :key="index0"
@tap="viewImage($event, specialSkill[index].skillCert)" :data-url="url">
<image :src="url" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, specialSkill[index].skillCert)" :data-index="index0">
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImage($event, specialSkill[index].skillCert)" v-if="specialSkill[index].skillCert.length < 1">
<text class='cuIcon-cameraadd'></text>
</view>
</view>
</view>
<view class="flex justify-start align-center margin-top-sm">
<view>保险证明</view>
<view class="grid col-1 upload-pic-grid grid-square flex-sub">
<view class="bg-img" v-for="(url, index0) in specialSkill[index].insurCert" :key="index0"
@tap="viewImage($event, specialSkill[index].insurCert)" :data-url="url">
<image :src="url" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, specialSkill[index].insurCert)" :data-index="index0">
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImage($event, specialSkill[index].insurCert)" v-if="specialSkill[index].insurCert.length < 1">
<text class='cuIcon-cameraadd'></text>
</view>
</view>
</view>
<view class="flex justify-start align-center">
<view>保险日期</view>
<uni-datetime-picker style="width: 75%;"
:value="[specialSkill[index].insurStartDate, specialSkill[index].insurEndDate]"
type="datetimerange" rangeSeparator="~" @change="changeInsurDate($event, index)" />
</view>
</view>
</view>
<view class="text-center margin-top">
<button class="cu-btn bg-main-color light" @click="addSpecialSkill">
<text class="margin-right-xs"><text class="cuIcon-add"></text></text>
<text>继续添加特殊技能</text>
</button>
</view>
</view>
<view class="bottom-site-bar"></view>
<!-- 下一步 -->
<view class="cu-bar tabbar border shop fixed-bottom-bar bg-back">
<button class="bg-white long-btn margin-lr" @click="preStep">上一步</button>
<button class="bg-main-color long-btn margin-lr" @click="submit">提交</button>
</view>
</view>
</view>
</template>
<script>
import myUniCombox from '@/components/uni-combox/my-uni-combox.vue';
export default {
components: {
myUniCombox
},
onLoad() {
this.loadData();
},
data() {
return {
curUserInfo: {},
curStep: 0,
// stepList: ['', '', ''],
stepList: ['服务范围', '商品类目'],
provinceList: [],
servArea: [{
cityList: [],
districtList: [],
streetList: [],
provinceObj: {},
cityObj: {},
districtObj: {},
streetIds: [],
cityIds: []
}],
typeList: [],
servSkill: [{
subTypeList: [],
subSubTypeList: [],
typeObj: {},
subTypeObj: {},
subSubTypeIds: [],
otherServSkill: null
}],
specialTypeList: [],
specialSkill: [{
specialSubTypeList: [],
specialSubSubTypeList: [],
specialTypeObj: {},
specialSubTypeObj: {},
specialSubSubTypeObj: {},
specialSkillList: [],
specialSkillObj: {},
skillCert: [],
insurCert: [],
insurStartDate: '',
insurEndDate: ''
}],
}
},
methods: {
async loadData() {
this.curUserInfo = this.$request.getCurUserInfo();
await this.loadProvinceList();
await this.loadTypeList();
await this.loadExistData();
// this.loadSpecialSkill();
},
async loadExistData() {
this.loadServAreas();
this.loadServSkills();
},
async loadServAreas() {
let res = await this.$request.getWorkerAreaEdit({
workerId: this.curUserInfo.workerId,
type: 2
});
let servArea = [];
for(let i = 0; i < res.data.length; i++) {
let item = res.data[i];
let cityListRes = await this.$request.areaListByStep({
parentCode: item.provinceArea.areaCode
});
servArea.push({
cityList: cityListRes.data,
cityIds: item.cityIds,
districtList: [],
streetList: [],
provinceObj: item.provinceArea,
cityObj: item.cityArea,
districtObj: {},
streetIds: []
})
}
if (servArea.length > 0) {
this.servArea = servArea;
}
},
async loadServSkills() {
let res = await this.$request.getWorkerGoodsCategoryEdit({
workerId: this.curUserInfo.workerId,
type: 2
});
let servSkill = [];
if(res.data) {
for(let i = 0; i < res.data.length; i++) {
let item = res.data[i];
let subSubTypeRes = await this.$request.listByStep({
goodsCategoryId: item.twoGoodsCategory.goodsCategoryId,
type: 2
});
servSkill.push({
subTypeList: [],
subSubTypeList: subSubTypeRes.data,
typeObj: item.oneGoodsCategory,
subTypeObj: item.twoGoodsCategory,
subSubTypeIds: item.categoryIds
})
}
}
if (servSkill.length > 0) {
this.servSkill = servSkill;
}
},
/* 服务区域 start */
async loadProvinceList() {
let res = await this.$request.areaListByStep();
this.provinceList = res.data;
},
async chooseRegion(e, type, index) {
let res = await this.$request.areaListByStep({
parentCode: e.areaCode
});
if (res.code == 0) {
switch (type) {
case 0: {
this.servArea[index].cityList = res.data;
this.servArea[index].districtList = [];
this.servArea[index].streetList = [];
this.servArea[index].cityObj = {};
this.servArea[index].districtObj = {};
this.servArea[index].streetIds = [];
this.servArea[index].cityIds = [];
}
break;
case 1: {
this.servArea[index].districtList = res.data;
this.servArea[index].streetList = [];
this.servArea[index].districtObj = {};
this.servArea[index].streetIds = [];
this.servArea[index].cityIds = [];
}
break;
case 2: {
this.servArea[index].streetList = res.data;
this.servArea[index].streetIds = [];
this.servArea[index].cityIds = [];
}
break;
default:
break;
}
}
},
checkStreet(e, index) {
let checkedIndexArr = e.detail.value;
this.servArea[index].streetIds = checkedIndexArr;
},
checkCity(e, index) {
let checkedIndexArr = e.detail.value;
this.servArea[index].cityIds = checkedIndexArr;
},
addServArea() {
this.servArea.push({
cityList: [],
districtList: [],
streetList: [],
provinceObj: {},
cityObj: {},
districtObj: {},
streetIds: [],
cityIds: [],
});
},
delServArea(index) {
this.servArea.splice(index, 1);
},
async reloadTargetArea(colIndex, areaIndex) {
switch(colIndex) {
case 1: {
if (this.servArea[areaIndex].provinceObj
&& (!this.servArea[areaIndex].cityList
|| this.servArea[areaIndex].cityList.length === 0)) {
let res = await this.$request.areaListByStep({
parentCode: this.servArea[areaIndex].provinceObj.areaCode,
});
this.servArea[areaIndex].cityList = res.data;
}
} break;
case 2: {
if (this.servArea[areaIndex].cityObj
&& (!this.servArea[areaIndex].districtList
|| this.servArea[areaIndex].districtList.length === 0)) {
let res = await this.$request.areaListByStep({
parentCode: this.servArea[areaIndex].cityObj.areaCode,
});
this.servArea[areaIndex].districtList = res.data;
}
} break;
default: break;
}
},
/* 服务区域 end */
/* 服务技能 start */
async loadTypeList() {
let res = await this.$request.listByStep({
type: 2
});
res = res.data;
let typeList = await this.$request.listByStep({
type: 2,
goodsCategoryId: res[0].goodsCategoryId
});
this.typeList = typeList.data;
},
async chooseType(e, type, index) {
let res = await this.$request.listByStep({
goodsCategoryId: e.goodsCategoryId,
type: 2
});
if (res.code == 0) {
switch (type) {
case 0: {
this.servSkill[index].subTypeList = res.data;
this.servSkill[index].subSubTypeList = [];
this.servSkill[index].subTypeObj = {};
this.servSkill[index].subSubTypeIds = [];
}
break;
case 1: {
this.servSkill[index].subSubTypeList = res.data;
this.servSkill[index].subSubTypeIds = [];
}
break;
default:
break;
}
}
},
checkGoodType(e, index) {
let checkedIndexArr = e.detail.value;
this.servSkill[index].subSubTypeIds = checkedIndexArr;
},
addServSkill() {
this.servSkill.push({
subTypeList: [],
subSubTypeList: [],
typeObj: {},
subTypeObj: {},
subSubTypeIds: [],
otherServSkill: null
});
},
delServSkill(index) {
this.servSkill.splice(index, 1);
},
async reloadTargetCategory(colIndex, servSkillIndex) {
switch(colIndex) {
case 1: {
if (this.servSkill[servSkillIndex].typeObj
&& (!this.servSkill[servSkillIndex].subTypeList
|| this.servSkill[servSkillIndex].subTypeList.length === 0)) {
let res = await this.$request.listByStep({
goodsCategoryId: this.servSkill[servSkillIndex].typeObj.goodsCategoryId,
type: 2
});
this.servSkill[servSkillIndex].subTypeList = res.data;
}
} break;
default: break;
}
},
/* 服务技能 end */
/* 特殊技能 start */
async loadSpecialSkill() {
let res = await this.$request.listByStep({
type: 2
});
res = res.data;
let typeList = await this.$request.listByStep({
type: 2,
goodsCategoryId: res[0].goodsCategoryId
});
this.specialTypeList = typeList.data;
},
async chooseSpecialSkill(e, type, index) {
let funName = "listByStep";
if (type === 2) {
funName = "qrySpecialSkillList";
}
let res = await this.$request[funName]({
goodsCategoryId: e.goodsCategoryId,
type: 2
});
if (res.code == 0) {
switch (type) {
case 0: {
this.specialSkill[index].specialSubTypeList = res.data;
this.specialSkill[index].specialSubSubTypeList = [];
this.specialSkill[index].specialSubTypeObj = {};
this.specialSkill[index].specialSubSubTypeObj = {};
}
break;
case 1: {
this.specialSkill[index].specialSubSubTypeList = res.data;
this.specialSkill[index].specialSubSubTypeObj = {};
}
case 2: {
this.specialSkill[index].specialSkillList = res.data;
this.specialSkill[index].specialSkillObj = {};
}
break;
default:
break;
}
}
},
addSpecialSkill() {
this.specialSkill.push({
specialSubTypeList: [],
specialSubSubTypeList: [],
specialTypeObj: {},
specialSubTypeObj: {},
specialSubSubTypeObj: {},
skillCert: [],
insurCert: [],
insurStartDate: '',
insurEndDate: ''
});
},
delSpecialSkill(index) {
this.specialSkill.splice(index, 1);
},
changeInsurDate(e, index) {
this.specialSkill[index].insurStartDate = e[0];
this.specialSkill[index].insurEndDate = e[1];
},
async chooseImage(e, imgList) {
uni.chooseMedia({
count: 1, //9
mediaType: ['image'],
sizeType: ['original', 'compressed'], //
sourceType: ['album'], //
success: (res) => {
//
res.tempFiles.forEach((fileObj) => {
this.$request.uploadFile(fileObj.tempFilePath).then((url) => {
//
imgList.push(url);
});
})
}
});
},
viewImage(e, imgList) {
uni.previewImage({
urls: imgList,
current: e.currentTarget.dataset.url
});
},
delImg(e, imgList) {
uni.showModal({
title: '',
content: '确定要删除这张图片吗?',
cancelText: '取消',
confirmText: '确定',
success: res => {
if (res.confirm) {
imgList.splice(e.currentTarget.dataset.index, 1)
}
}
})
},
/* 特殊技能 end */
nextStep() {
let workerAreas = [];
//
this.servArea.forEach((item) => {
item.cityIds.forEach((cityId) => {
workerAreas.push({
provinceId: item.provinceObj.areaId,
cityId: cityId,
districtId: '',
streetId: ''
})
});
// item.streetIds.forEach((streetId) => {
// workerAreas.push({
// provinceId: item.provinceObj.areaId,
// cityId: item.cityObj.areaId,
// districtId: item.districtObj.areaId,
// streetId: streetId
// })
// });
});
let params = {
workerGoodsAreas: workerAreas
}
if (this.curStep === 0 && !this.validData(params)) {
return;
}
this.curStep = this.curStep === this.stepList.length - 1 ? this.curStep : ++this.curStep;
},
preStep() {
this.curStep = this.curStep === 0 ? 0 : --this.curStep;
},
validData(data) {
let errMsg = null;
if (!data.workerGoodsAreas || !data.workerGoodsAreas.length) {
errMsg = '请至少添加一个服务区域(需要勾选到城市)';
}
if (this.curStep > 0) {
if (!data.goodsCategoryIds || !data.goodsCategoryIds.length) {
errMsg = '请至少添加一个服务技能(需要勾选到三级类目)';
}
}
if (errMsg) {
uni.showToast({
icon: 'none',
title: errMsg,
duration: 3000
})
return false;
}
return true;
},
async submit() {
let workerId = this.curUserInfo.workerId;
let workerAreas = [];
let goodsCategories = [];
// let specialSkills = [];
//
this.servArea.forEach((item) => {
// item.streetIds.forEach((streetId) => {
// workerAreas.push({
// workerId: workerId,
// provinceId: item.provinceObj.areaId,
// cityId: item.cityObj.areaId,
// districtId: item.districtObj.areaId,
// streetId: streetId
// })
// });
item.cityIds.forEach((cityId) => {
workerAreas.push({
workerId: workerId,
provinceId: item.provinceObj.areaId,
cityId: cityId,
districtId: '',
streetId: ''
})
});
});
//
this.servSkill.forEach((item) => {
item.subSubTypeIds.forEach((goodsCategoryId) => {
// goodsCategories.push({
// workerId: workerId,
// goodsCategoryId: goodsCategoryId
// });
goodsCategories.push(goodsCategoryId)
});
});
//
// this.specialSkill.forEach((item) => {
// specialSkills.push({
// workerId: workerId,
// specialSkillId: item.specialSkillObj.specialSkillId,
// credential: item.skillCert[0],
// insurance: item.insurCert[0],
// insuranceStart: item.insurStartDate,
// insuranceEnd: item.insurEndDate
// });
// });
let params = {
workerId: workerId,
workerGoodsAreas: workerAreas,
goodsCategoryIds: goodsCategories,
// specialSkills: specialSkills
}
if (!this.validData(params)) {
return;
}
let res = await this.$request.workerSettled(params);
if (res && res.code === 0) {
uni.showToast({
icon: 'success',
title: '提交成功',
duration: 2000
})
//
let newUserInfo = await this.$request.getCurUserNoCache();
this.$request.updateCache('userProfile', newUserInfo);
uni.navigateBack({
delta: -1
})
}
}
},
}
</script>
<style scoped>
/deep/ .uni-combox__selector {
z-index: 99 !important;
}
.grid.col-1.grid-square.upload-pic-grid>view {
padding-bottom: 35%;
height: 0;
margin-right: 20rpx;
}
.grid.col-1.upload-pic-grid>view {
width: 35%;
}
/deep/ .uni-date__x-input {
height: 36px;
}
</style>

View File

@ -270,7 +270,8 @@
},
async loadServAreas() {
let res = await this.$request.getWorkerAreaEdit({
workerId: this.curUserInfo.workerId
workerId: this.curUserInfo.workerId,
type: 1
});
let servArea = [];
for(let i = 0; i < res.data.length; i++) {
@ -294,7 +295,8 @@
},
async loadServSkills() {
let res = await this.$request.getWorkerGoodsCategoryEdit({
workerId: this.curUserInfo.workerId
workerId: this.curUserInfo.workerId,
type: 1
});
let servSkill = [];
for(let i = 0; i < res.data.length; i++) {
@ -592,12 +594,13 @@
this.curStep = this.curStep === 0 ? 0 : --this.curStep;
},
validData(data) {
console.log(data);
let errMsg = null;
if (!data.workerAreas || !data.workerAreas.length) {
errMsg = '请至少添加一个服务区域(需要勾选到服务街道)';
}
if (this.curStep > 0) {
if (!data.goodsCategories || !data.goodsCategories.length) {
if (!(data.serviceCategoryIds && data.serviceCategoryIds.length)) {
errMsg = '请至少添加一个服务技能(需要勾选到三级类目)';
}
}
@ -631,10 +634,11 @@
//
this.servSkill.forEach((item) => {
item.subSubTypeIds.forEach((goodsCategoryId) => {
goodsCategories.push({
workerId: workerId,
goodsCategoryId: goodsCategoryId
});
// goodsCategories.push({
// workerId: workerId,
// goodsCategoryId: goodsCategoryId
// });
goodsCategories.push(goodsCategoryId)
});
});
//
@ -652,7 +656,7 @@
let params = {
workerId: workerId,
workerAreas: workerAreas,
goodsCategories: goodsCategories,
serviceCategoryIds: goodsCategories,
// specialSkills: specialSkills
}

View File

@ -8,14 +8,14 @@
<view v-if="(servSkills && servSkills.length) || (servAreas && servAreas.length) " class="margin bg-white">
<view class="padding">
<view class="text-black text-bold">服务区域</view>
<view v-for="(item,index) in servAreas">
<view v-for="(item,index) in servAreas" :key="index">
<text>{{strReplace(item.mergerName, "-", ",")}}</text>
<!-- <text v-if="index !== servAreas.length - 1"></text> -->
</view>
</view>
<view class="padding">
<view class="text-black text-bold">服务技能</view>
<view v-for="(item,index) in servSkills">
<view v-for="(item,index) in servSkills" :key="index">
<text>{{item.mergeName}}</text>
<!-- <text v-if="index !== servSkills.length - 1"></text> -->
</view>
@ -60,12 +60,15 @@
curUserInfo: {},
servAreas: [],
servSkills: [],
servSpecialSkills: []
servSpecialSkills: [],
serviceType: null
}
},
// onLoad() {
// this.loadData();
// },
onLoad(options) {
if(options.type) {
this.serviceType = options.type
}
},
onShow() {
this.loadData();
},
@ -74,23 +77,26 @@
this.curUserInfo = await this.$request.getCurUserNoCache();
this.loadServAreas();
this.loadServSkills();
this.loadSpecialSkills();
// this.loadSpecialSkills();
},
async loadServAreas() {
let res = await this.$request.getWorkerArea({
workerId: this.curUserInfo.workerId
workerId: this.curUserInfo.workerId,
serviceType: this.serviceType
});
this.servAreas = res.data;
},
async loadServSkills() {
let res = await this.$request.getWorkerGoodsCategory({
workerId: this.curUserInfo.workerId
workerId: this.curUserInfo.workerId,
serviceType: this.serviceType
});
this.servSkills = res.data;
},
async loadSpecialSkills() {
let res = await this.$request.getWorkerSpecialSkill({
workerId: this.curUserInfo.workerId
workerId: this.curUserInfo.workerId,
serviceType: this.serviceType
});
this.servSpecialSkills = res.data;
},
@ -100,10 +106,16 @@
current: e.currentTarget.dataset.url
});
},
navigate2ApplySettled() {
uni.navigateTo({
url: '/pages/my/master-occupancy'
})
navigate2ApplySettled() {
if(this.serviceType == 1) {
uni.navigateTo({
url: '/pages/my/master-occupancy'
})
} else {
uni.navigateTo({
url: '/pages/my/master-occupancy-parts'
})
}
},
strReplace(wholeStr, newStr, oldStr) {
if (wholeStr && wholeStr.length > 0) {

1301
pages/my/new-serv-parts.vue Normal file

File diff suppressed because it is too large Load Diff

View File

@ -28,54 +28,62 @@
:value="formData.categoryConcatName" placeholder="请选择类目" :class="goodsId ? 'bg-gray' : ''"/>
</picker>
</view>
<view v-if="formData.specsList && formData.specsList.length > 0">
<checkbox-group class="padding-lr bg-white" @change="checkSpecs"
:class="isShowAllSpecs ? '' : 'certern-height'">
<view v-for="(item, index) in formData.specsList" :key="index" class="padding-tb-sm">
<view class="flex">
<view class="flex-sub">
<checkbox style="transform:scale(1)" class="margin-right-xs"
:value="index" :checked="item.checked" :class="goodsId && item.checked ? 'grey' : 'main-color'" :disabled="goodsId && item.checked"></checkbox>
<text>{{item.goodsCategoryName}}</text>
</view>`
<view class="flex-sub">
<input class="sm radius-input"
@input="inputSpecs($event, index, 'goodsStandardName')"
:value="item.goodsStandardName" maxlength="20"
placeholder="自编辑购买标题(限20字符)"></input>
</view>
</view>
<view class="flex margin-top-xs">
<view class="margin-right-xs">
<view class='text-red' style="position: absolute; z-index: 0;">*</view>
<zb-tooltip
:content="'平' + parseInt(item.deptRate * 100) + '%+¥' + $calcUtil.curNumPlaces(item.deptMoney, 3) + '销' + parseInt((Number(item.oneRate) + Number(item.twoRate) + Number(item.threeRate) + Number(item.retainRate)) * 100) + '%+¥' + $calcUtil.curNumPlaces(item.retainMoney, 3)"
placement="right" ref="goodsPriceTip">
<input type="number" class="radius-input xs" @input="inputSpecs($event, index, 'goodsPrice')"
:value="item.goodsPrice" placeholder="价格"
@blur="hideTips('goodsPriceTip', index)"></input>
</zb-tooltip>
</view>
<view class="margin-right-xs" style="flex-basis: 21%;">
<input type="number" class="radius-input xs" @input="inputSpecs($event, index, 'extMoney')"
:value="item.extMoney" placeholder="追加提成额"></input>
</view>
<view class="margin-right-xs" style="flex-basis: 14%;">
<input type="number" class="radius-input xs" @input="inputSpecs($event, index, 'groupPrice')"
:value="item.groupPrice" placeholder="团购价"></input>
</view>
<view class="margin-right-xs" style="flex-basis: 11%;">
<input class="radius-input xs" @input="inputSpecs($event, index, 'goodsUnit')"
:value="item.goodsUnit" placeholder="单位"></input>
</view>
<view style="flex-basis: 14%;">
<view class='text-red' style="position: absolute; absolute; z-index: 0;">*</view>
<input type="number" class="radius-input xs" @input="inputSpecs($event, index, 'goodsNum')"
:value="item.goodsNum" placeholder="库存数"></input>
</view>
</view>
</view>
</checkbox-group>
<view v-if="formData.specsList && formData.specsList.length > 0">
<view :class="isShowAllSpecs ? '' : 'certern-height'">
<checkbox-group class="padding-lr bg-white" @change="checkSpecs">
<view v-for="(item, index) in formData.specsList" :key="index" class="padding-tb-sm">
<view class="flex">
<view class="flex-sub">
<checkbox style="transform:scale(1)" class="margin-right-xs"
:value="index" :checked="item.checked" :class="goodsId && item.checked ? 'grey' : 'main-color'" :disabled="goodsId && item.checked"></checkbox>
<text>{{item.goodsCategoryName}}</text>
</view>
<view class="flex-sub">
<input class="sm radius-input"
@input="inputSpecs($event, index, 'goodsStandardName')"
:value="item.goodsStandardName" maxlength="20"
placeholder="自编辑购买标题(限20字符)"></input>
</view>
</view>
<view class="flex margin-top-xs">
<view class="margin-right-xs" style="flex-basis: 30%;">
<view class='text-red' style="position: absolute; z-index: 0;">*</view>
<zb-tooltip
:content="'平' + parseInt(item.deptRate * 100) + '%+¥' + $calcUtil.curNumPlaces(item.deptMoney, 3) + '销' + parseInt((Number(item.oneRate) + Number(item.twoRate) + Number(item.threeRate) + Number(item.retainRate)) * 100) + '%+¥' + $calcUtil.curNumPlaces(item.retainMoney, 3)"
placement="top" ref="goodsPriceTip">
<input type="number" class="radius-input xs" @input="inputSpecs($event, index, 'goodsPrice')"
:value="item.goodsPrice" placeholder="价格"
@blur="hideTips('goodsPriceTip', index)"></input>
</zb-tooltip>
</view>
<view class="margin-right-xs" style="flex-basis: 21%;">
<input type="number" class="radius-input xs" @input="inputSpecs($event, index, 'extMoney')"
:value="item.extMoney" placeholder="追加提成额"></input>
</view>
<view class="margin-right-xs" style="flex-basis: 14%;">
<input type="number" class="radius-input xs" @input="inputSpecs($event, index, 'groupPrice')"
:value="item.groupPrice" placeholder="团购价"></input>
</view>
<view class="margin-right-xs" style="flex-basis: 11%;">
<input class="radius-input xs" @input="inputSpecs($event, index, 'goodsUnit')"
:value="item.goodsUnit" placeholder="单位"></input>
</view>
<view class="margin-right-xs" style="flex-basis: 14%;">
<view class='text-red' style="position: absolute; absolute; z-index: 0;">*</view>
<input type="number" class="radius-input xs" @input="inputSpecs($event, index, 'goodsNum')"
:value="item.goodsNum" placeholder="库存数"></input>
</view>
<view style="flex-basis: 10%;">
<view style="border: 1px solid #0081ff;text-align: center;" class="radius-input" @click="chooseImgList($event, 'specsList:'+index, 500, 500)">
<image v-if="item.imageUrl" :src="item.imageUrl" style="width: 40rpx;height: 40rpx;" alt="" mode="aspectFit" ></image>
<image v-else src="/static/add-img.png" style="width: 40rpx;height: 40rpx;" alt="" mode="aspectFit" ></image>
</view>
</view>
</view>
</view>
</checkbox-group>
</view>
<view class="text-bold text-gray text-lg text-center bg-white padding-tb-sm"
@click="showAllSpecs()"><text :class="'cuIcon-' + (isShowAllSpecs ? 'fold' : 'unfold')"></text>
</view>
@ -134,6 +142,24 @@
<my-uni-combox class="form-val-area" :candidates="expectDurationList" placeholder="请选择"
v-model="formData.expectDuration">
</my-uni-combox>
</view>
<view class="cu-form-group justify-start">
<view class="title">到店服务</view>
<my-uni-combox class="form-val-area" :showClear="true" :candidates="storeServiceList" placeholder="必须到店服务才选此项"
v-model="formData.storeService">
</my-uni-combox>
</view>
<view class="cu-form-group justify-start" v-if="formData.storeService">
<view class="title">服务店铺<text class="text-red">*</text></view>
<my-uni-combox class="form-val-area" :candidates="myShopList" placeholder="请选择" :alwaysShowEmpty="true"
v-model="formData.shopId">
<template v-slot:empty>
<view>
<span>无匹配项</span>
<span class="text-blue" @click="goToShopList">点击增加</span>
</view>
</template>
</my-uni-combox>
</view>
<view class="solid-top">
<view class="cu-form-group">
@ -197,7 +223,8 @@
<view class="cu-bar">
<view class="action text-black">区域描述<text class="text-red">*</text></view>
</view>
<view class="padding-lr-sm padding-bottom-sm">
<view class="padding-lr-sm padding-bottom-sm">
<!-- :adjust-position="false" -->
<textarea name="areaDesc" style="width: 100%; height: 150rpx;"
class="solid radius text-left padding-sm" v-model="servArea[index].areaDesc" maxlength="-1"
placeholder="如XX区XX街道未覆盖或XX区仅服务XX街道"></textarea>
@ -326,7 +353,8 @@
},
data() {
return {
goodsId: null,
goodsId: null,
type: 1,
formData: {
servName: '',
servDesc: '',
@ -342,7 +370,10 @@
detailDesc: '',
descImgList: [],
coverImgList: [],
videoList: []
videoList: [],
shopId: '',
shopName: '',
storeService: ''
},
servArea: [],
sysInfo: null,
@ -404,22 +435,40 @@
}],
warrantyPeriodList: [{
code: 1,
name: '15天'
name: '即时验收'
}, {
code: 2,
name: '30天'
name: '验收后离店'
}, {
code: 3,
name: '45天'
name: '完工24小时'
}, {
code: 4,
name: '3个月'
name: '3'
}, {
code: 5,
name: '6个月'
name: '7天'
}, {
code: 6,
name: '15天'
}, {
code: 7,
name: '30天'
}, {
code: 8,
name: '45天'
}, {
code: 9,
name: '3个月'
}, {
code: 10,
name: '6个月'
}, {
code: 11,
name: '12个月'
}, {
code: 12,
name: '24个月'
}],
expectDurationList: [{
name: '12点前下单预计当天下午上门/服务'
@ -429,17 +478,40 @@
name: '现时下单,预计次日上门/服务'
}, {
name: '现时下单,预计后日上门/服务'
}],
}, {
name: '到店服务,按预约服务',
}, {
name: '到店服务,到达即服务'
}],
storeServiceList: [
{
code: 1,
name: '到店服务'
}, {
code: 2,
name: '到店+配送(服务)'
}, {
code: 3,
name: '到店+上门(服务)'
}
],
curUserInfo: {},
bankCard: null,
certifyInfo: null
certifyInfo: null,
myShopList: []
}
},
onLoad(options) {
if (options && options.goodId) {
this.goodsId = options.goodId;
}
if(options && options.type) {
this.type = options.type
}
this.loadData(this.goodsId);
},
onShow() {
this.loadShopList();
},
methods: {
async loadData(goodId) {
@ -450,10 +522,19 @@
}
this.checkBankAndCertify();
this.loadCategoryList();
this.loadRegionList();
this.loadRegionList();
// TODO goodIdgood
// this.categoryList = await this.$api.data('categoryList');
// this.regionList = await this.$api.data('regionList');
},
async loadShopList() {
let res = await this.$request.getMasterShopAddressList(this.$request.getCurUserInfo().workerId);
this.myShopList = res.data.map(item => {return {name: item.shopName, code: item.shopId}});
},
goToShopList() {
uni.navigateTo({
url: '/pages/my/shop-list'
})
},
async getCurGoodsInfo(goodsId) {
let res1 = await this.$request.qryProductDetail({
@ -468,7 +549,7 @@
});
//
let res2 = await this.$request.listByStep({
type: 1,
type: this.type,
goodsCategoryId: goods.deptGoodsCategoryId
});
let specsList = res2.data;
@ -501,7 +582,12 @@
}
newAreaList.push(o);
});
console.log(newAreaList)
console.log(newAreaList)
let stopService = null
if(goods.storeService) {
stopService = this.storeServiceList.find(i => i.code == goods.storeService)
}
this.formData = {
servName: goods.goodsName,
@ -529,7 +615,9 @@
imgList: goods.lbUrl,
descImgList: goods.detailUrl,
videoList: goods.goodsVideoUrl ? [goods.goodsVideoUrl] : [],
// status: 0,
// status: 0,
shopId: goods.shopId ? {code: goods.shopId, name: goods.shopName} : null,
storeService: goods.storeService ? stopService : null
}
},
async checkBankAndCertify() {
@ -552,24 +640,24 @@
},
async loadCategoryList(idArr) {
let typeList = await this.$request.listByStep({
type: 1
type: this.type
});
typeList = typeList.data;
let col1Id = idArr ? idArr[0] : typeList[0].goodsCategoryId;
let subTypeList = await this.$request.listByStep({
type: 1,
type: this.type,
goodsCategoryId: col1Id
});
subTypeList = subTypeList.data;
let col2Id = idArr ? idArr[1] : subTypeList[0].goodsCategoryId;
let subSubTypeList = await this.$request.listByStep({
type: 1,
type: this.type,
goodsCategoryId: col2Id
});
subSubTypeList = subSubTypeList.data;
let col3Id = idArr ? idArr[2] : subSubTypeList[0].goodsCategoryId;
let thirdTypeList = await this.$request.listByStep({
type: 1,
type: this.type,
goodsCategoryId: col3Id
});
thirdTypeList = thirdTypeList.data;
@ -603,7 +691,7 @@
//
let res = await this.$request.listByStep({
type: 1,
type: this.type,
goodsCategoryId: chosenCategory[chosenCategory.length - 1].goodsCategoryId
});
this.formData.specsList = res.data;
@ -613,14 +701,14 @@
if (colObj.column == 0) {
//
let subTypeList = await this.$request.listByStep({
type: 1,
type: this.type,
goodsCategoryId: this.categoryList[0][colObj.value].goodsCategoryId
});
subTypeList = subTypeList.data;
let subSubTypeList = [];
if (subTypeList && subTypeList.length) {
subSubTypeList = await this.$request.listByStep({
type: 1,
type: this.type,
goodsCategoryId: subTypeList[0].goodsCategoryId
});
subSubTypeList = subSubTypeList.data;
@ -633,7 +721,7 @@
} else if (colObj.column == 1) {
//
let subSubTypeList = await this.$request.listByStep({
type: 1,
type: this.type,
goodsCategoryId: this.categoryList[1][colObj.value].goodsCategoryId
});
subSubTypeList = subSubTypeList.data;
@ -763,7 +851,15 @@
mask: true
});
this.$request.uploadFile(ev.path).then((url) => {
this.formData[this.curImgListField].push(url);
if(this.curImgListField.indexOf('specsList') > -1) {
//
const specsListIndex = this.curImgListField.split(':')[1]
const temp = this.formData.specsList[specsListIndex]
temp.imageUrl = url
this.$set(this.formData.specsList, specsListIndex, temp)
} else {
this.formData[this.curImgListField].push(url);
}
uni.hideLoading();
});
// url
@ -858,6 +954,8 @@
errMsg = '服务活动不能为空';
} else if (!data.expectDuration) {
errMsg = '服务时效不能为空';
} else if(data.storeService && !data.shopId) {
errMsg = '到店店铺不能为空';
} else if (!data.goodsAreaList || !data.goodsAreaList.length) {
errMsg = '上架区域填写不完整';
} else if (!data.areaDesc) {
@ -1004,8 +1102,15 @@
goodsVideoUrl: goodsVideoUrl,
status: 0,
remark: this.formData.detailDesc,
areaDesc: this.formData.areaDesc
}
areaDesc: this.formData.areaDesc,
type: this.type,
shopId: this.formData.shopId ? this.formData.shopId.code : '',
shopName: this.formData.shopId ? this.formData.shopId.name : '',
storeService: this.formData.storeService ? this.formData.storeService.code : ''
}
// console.log(params);
// return
let res = null;
if (this.goodsId) {
@ -1073,7 +1178,8 @@
.certern-height {
max-height: 520rpx;
overflow: hidden;
overflow: hidden;
position: relative;
}
.long-btn {

View File

@ -28,6 +28,11 @@
<view class="title">电子邮箱</view>
<input name="email" :value="curUserInfo.email"></input>
</view>
<view class="cu-form-group" @click="showShopList">
<view class="title">店铺管理</view>
<view class="text-lg"><text class="cuIcon-right"></text></view>
</view>
</view>
<view class="margin-top-sm bg-white">
<view class="cu-form-group" @click="showAccountSecurity">
@ -68,6 +73,11 @@
url: '/pages/my/account-security'
})
},
showShopList() {
uni.navigateTo({
url: '/pages/my/shop-list'
})
},
async submit() {
let res = await this.$request.updateWorker({
workerId: this.curUserInfo.workerId,

130
pages/my/shop-list.vue Normal file
View File

@ -0,0 +1,130 @@
<template>
<view>
<!-- 顶部操作条 -->
<cu-custom :bgColor="'bg-main-color'" :isBack="true">
<block slot="backText">返回</block>
<block slot="content">店铺管理</block>
</cu-custom>
<!-- 店铺管理列表 -->
<view class="margin-bottom-with-bar">
<view class="padding margin-lr-sm margin-top-sm bg-white flex justify-between align-center" v-for="(item, index) in myAddressList" :key="index">
<view class="flex flex-sub align-center">
<image class="bg-img-container" :src="item.imageUrl.split(',')[0]" mode="aspectFill"></image>
<view class="flex-sub">
<view class="flex justify-start align-center">
<view class="text-gray margin-right-xs">{{item.provinceName}}</view>
<view class="text-gray margin-right-xs">{{item.cityName}}</view>
<view class="text-gray margin-right-xs">{{item.countryName}}</view>
<view class="text-gray margin-right-xs">{{item.streetName || ''}}</view>
</view>
<view class="text-lg margin-tb-sm">{{item.address}}</view>
<view class="text-gray">
<text class="margin-right">门店名称</text>
<text>{{item.shopName}}</text>
</view>
<view class="text-gray">
<text class="margin-right">门店电话</text>
<text>{{item.phone}}</text>
</view>
</view>
</view>
<view class="oper-column text-xl flex justify-end flex-direction">
<view class="cuIcon-edit padding-lr-xs padding-tb-xs" @click="addEditAddress(item)"></view>
<view class="cuIcon-close padding-lr-xs padding-tb-xs" @click="confirm2DelAddress(item)"></view>
</view>
</view>
</view>
<!-- 底部新增地址按钮 -->
<view class="cu-bar tabbar border shop fixed-bottom-bar bg-back">
<button class="cu-btn bg-main-color long-btn margin-lr-sm shadow-blur" @click="addEditAddress(null)">新增店铺</button>
</view>
<!-- 模态框 -->
<confirm-modal ref="confirmModal" :content="'是否确定删除?'" @confirm="delAddress"></confirm-modal>
</view>
</template>
<script>
export default {
data() {
return {
myAddressList: [],
modalName: '',
delAddressInfo: {},
}
},
onLoad(options) {
},
onShow() {
this.loadData();
},
methods: {
async loadData() {
let res = await this.$request.getMasterShopAddressList(this.$request.getCurUserInfo().workerId);
this.myAddressList = res.data;
},
addEditAddress(addressInfo) {
let url = null;
let params = null;
if (addressInfo) {
//
addressInfo.area = [
{
areaId: addressInfo.cityId,
areaName: addressInfo.cityName
},{
areaId: addressInfo.provinceId,
areaName: addressInfo.provinceName
},{
areaId: addressInfo.countryId,
areaName: addressInfo.countryName
},{
areaId: addressInfo.streetId || 0,
areaName: addressInfo.streetName
}]
params = {
addressInfo: addressInfo,
mode: 0
}
} else {
//
params = {
mode: 1
}
}
uni.navigateTo({
url: '/pages/my/edit-shop-address?params=' + encodeURIComponent(JSON.stringify(params))
})
},
confirm2DelAddress(addressInfo) {
this.delAddressInfo = addressInfo;
this.$refs.confirmModal.showModal();
},
async delAddress() {
let res = await this.$request.delShopAddressList(this.delAddressInfo.shopId);
if (res.code === 0) {
this.loadData();
uni.showToast({
title: '删除成功',
icon: 'success',
mask: true
})
} else {
uni.showToast({
title: '删除失败',
icon: 'error',
mask: true
})
}
}
}
}
</script>
<style scoped>
.bg-img-container{
width: 140rpx;
height: 140rpx;
margin-right: 14rpx;
}
</style>

View File

@ -5,7 +5,7 @@
<block slot="backText">返回</block>
<block slot="content">申请退单</block>
</cu-custom>
<view class="padding flex justify-start margin-top-sm bg-white">
<!-- <view class="padding flex justify-start margin-top-sm bg-white">
<view class="cu-avatar xxl-view" :style="'background-image:url(' + good.picUrl + ');'"></view>
<view class="flex flex-column-between margin-left-sm">
<view class="text-black text-lg">{{good.servTitle}}</view>
@ -14,20 +14,21 @@
{{item}}</view>
</view>
</view>
</view>
</view> -->
<view class="margin-top-sm padding flex justify-between bg-white">
<view>申请原因</view>
<picker @change="reasonChange" :range="cancelReasonList" :range-key="'reasonName'">
<view class="picker">
{{formData.reasonObj.reasonId ? formData.reasonObj.reasonName : '请选择' }}
{{formData.returnReason ? formData.returnReason : '请选择' }}
<text class="text-gray text-lg margin-left-xs"><text class="cuIcon-right"></text></text>
</view>
</picker>
</view>
<view class="margin-top-sm padding bg-white">
<view class="margin-bottom-sm">具体原因</view>
<textarea style="width: 100%;" class="solid radius text-left padding-sm" v-model="formData.detailDesc" maxlength="-1"
placeholder="本次原因请如实填写。无故退单,无理由退单引起客诉的你有责,订单大多数由推荐/分销人员带单产生注意不要产生私自成交撬单等行为造成订单销售人员的佣金损失不利于长远合作。被带单销售人员发现恶意违规破坏合作的将追责3000元单。"></textarea>
<view class="margin-bottom-sm">具体原因<text class="text-gray margin-left-xs">(请填写退单退货的原因)</text></view>
<textarea style="width: 100%;" class="solid radius text-left padding-sm" v-model="formData.returnReasonDetail" maxlength="-1"
placeholder-style="color: #d2d1d1;"
placeholder="无故退单无理由退单引起客诉你将有责本次原因请如实填写。订单大多数由推荐分销人员带单产生注意不要产生私自成交、撬单等行为造成订单销售人员的佣金损失不利于长远合作。被带单销售人员发现恶意违规破坏合作的将追责3000元/单。"></textarea>
</view>
<view class="margin-top-sm padding bg-white">
<view class="margin-bottom-sm">上传凭证选填</view>
@ -45,7 +46,7 @@
</view>
</view>
<view class="cu-bar tabbar fixed-bottom-bar bg-back">
<button class="bg-main-color cu-btn lg shadow-warp long-btn margin-lr" @click="nextStep">提交退单</button>
<button class="bg-main-color cu-btn lg shadow-warp long-btn margin-lr" @click="submitCancelOrder">提交退单</button>
</view>
</view>
</template>
@ -54,48 +55,50 @@
export default {
data() {
return {
good: {},
// good: {},
formData: {
imgList: [],
reasonObj: {}
returnReason: '',
returnReasonDetail: ''
},
cancelReasonList: [{
reasonId: 1,
reasonName: '客户的时间我无法配合'
}, {
reasonId: 2,
reasonName: '客户多次爽约'
}, {
reasonId: 3,
reasonName: '客户不能确定时间'
}, {
reasonId: 4,
reasonName: '客户多天未能联系上'
}, {
reasonId: 5,
reasonName: '客户说无此服务'
}, {
reasonId: 6,
reasonName: '客户要求已超出服务范围'
}, {
reasonId: 7,
reasonName: '环境问题无法施工'
}, {
reasonId: 8,
reasonName: '技能原因无法完成'
}, {
reasonId: 9,
reasonName: '分岐未能谈妥'
}, {
reasonId: 10,
reasonName: '不愿支付费用'
}]
cancelReasonList: [],
orderId: null,
orderType: null,
detailPlaceholder: '',
isDetailOrder: null,
isSelfAcceptOrder: false
}
},
onLoad(options) {
if (options && options.params) {
this.good = JSON.parse(decodeURIComponent(options.params)).orderInfo;
// if (options && options.params) {
// this.good = JSON.parse(decodeURIComponent(options.params)).orderInfo;
// }
if (options && options.orderId) {
this.orderId = options.orderId
}
if(options && options.orderType) {
let reasonList
if(options.orderType === '1') {
reasonList = ['商家原因,没时间备货!', '商家原因,缺货了!', '商家原因,发货时间迟了!', '商家原因,物流原因,长时间滞留路途!', '客户原因,无法接受质量!', '客户原因,商品无法满足期望!']
} else {
reasonList = ['师傅原因,时间排不上!', '师傅原因,技术不能解决问题!', '师傅原因,迟到了无法服务!', '客户原因,约好时间没遵守!', '客户原因,要求无法达成,无法沟通。']
}
this.cancelReasonList = reasonList.map((i , index)=> {
return {
reasonId: index + 1,
reasonName: i
}
})
this.orderType = options.orderType
}
if(options && options.isDetailOrder) {
this.isDetailOrder = options.isDetailOrder
}
if(options && options.isSelfAcceptOrder) {
this.isSelfAcceptOrder = options.isSelfAcceptOrder
}
},
methods: {
chooseImgList(e) {
@ -105,15 +108,18 @@
sizeType: ['original', 'compressed'], //
sourceType: ['album'], //
success: (res) => {
let tempFilePaths = [];
res.tempFiles.forEach((fileObj) => {
tempFilePaths.push(fileObj.tempFilePath)
})
if (this.formData.imgList.length != 0) {
this.formData.imgList = this.formData.imgList.concat(tempFilePaths)
} else {
this.formData.imgList = tempFilePaths
}
uni.showLoading({
title: '上传中',
mask: true
});
res.tempFiles.forEach((fileObj, index) => {
this.$request.uploadFile(fileObj.tempFilePath).then((url) => {
this.formData.imgList.push(url);
if (index === res.tempFiles.length - 1) {
uni.hideLoading();
}
});
});
}
});
},
@ -137,7 +143,71 @@
})
},
reasonChange(e) {
this.formData.reasonObj = this.cancelReasonList[e.detail.value]
this.formData.returnReason = this.cancelReasonList[e.detail.value].reasonName
},
submitCancelOrder() {
if(!this.formData.returnReason) {
uni.showToast({
title: '请选择申请原因',
icon: 'none'
})
return
}
if(!this.formData.returnReasonDetail) {
uni.showToast({
title: '请填写具体原因',
icon: 'none'
})
return
}
// if(this.isDetailOrder == 1 && this.isSelfAcceptOrder) {
// uni.showModal({
// title: '',
// content: this.orderType == 1 ? '/退' : '/退',
// success: (res) => {
// if(res.confirm) {
// this.cancelSend()
// }
// },
// })
// } else {
this.cancelSend()
// }
},
async cancelSend() {
const params = {
id: this.orderId,
returnImages: this.formData.imgList.length ? this.formData.imgList.toString() : '',
returnReason: this.formData.returnReason,
returnReasonDetail: this.formData.returnReasonDetail
}
let funcName = 'rejectMasterOrderWhenAccepted'
if(this.isDetailOrder == 1) {
funcName = 'rejectDetailOrder'
}
let res = await this.$request[funcName](params);
if (res && res.code === 0) {
uni.showToast({
icon: 'none',
title: '退单成功',
duration: 1000
})
await this.$request.addOrderOperate({
orderId: this.orderId,
orderType: '01',
content: '师傅退单'
})
uni.navigateBack({
delta: -1
})
} else {
uni.showToast({
icon: 'none',
title: res.msg,
duration: 2000
})
}
}
},
}

View File

@ -0,0 +1,163 @@
<template>
<view>
<!-- 顶部操作条 -->
<cu-custom :bgColor="'bg-main-color'" :isBack="true" :isBackHome="true" :homePageUrl="'/pages/index/index'">
<block slot="content">选择门店</block>
</cu-custom>
<!-- 产品列表 -->
<view class="padding-lr padding-top bg-white solid-top">
<view class="solid-bottom margin-bottom-sm padding-bottom-sm"
v-for="(item, index) in productList" :key="item.id">
<view class="flex-sub flex margin-top-sm">
<view style="height: 150rpx;line-height: 150rpx;margin-right: 10px;">
<radio class="main-color" :checked="chooseShopInfo && chooseShopInfo.shopId === item.shopId" @click="chooseShopInfo = item" />
</view>
<!-- <checkbox style="transform:scale(0.8);" class="main-color" :checked="chooseShopId === item.shopId" @click.stop="chooseShopId = item.shopId"></checkbox> -->
<view style="width: 150rpx;height: 150rpx;margin-right:10px;display: flex;flex-direction: row;justify-content: center;">
<image style="width: 100%;height: 100%;" :src="item.imageUrl" mode="aspectFill"></image>
</view>
<view class="flex-sub">
<view class="text-bold" style="text-overflow: ellipsis;overflow: hidden;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 1;">{{item.shopName}}</view>
<view>
<view style="text-overflow: ellipsis;overflow: hidden;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 1;">{{item.provinceName + item.cityName + item.countryName + item.streetName + item.address}}</view>
<view class="margin-lr-sm" style="display: inline-block;" v-if="item.distance">
<view class="cu-tag bg-red" style="padding: 0 2px;height: auto;">距离客户</view>
<text class="text-gray" style="vertical-align: middle;">{{item.distance}}</text>
</view>
</view>
<view v-if="index == 0">
<text style="font-size: 24rpx;color: #0081ff;">您购买的商品的店铺所属服务点距离近可优先选择</text>
</view>
</view>
</view>
</view>
</view>
<!-- 底部新增地址按钮 -->
<view class="cu-bar tabbar border shop fixed-bottom-bar bg-back">
<button class="cu-btn bg-main-color long-btn margin-lr-sm shadow-blur" @click="selectShop">确定</button>
</view>
<!-- <view class="margin-bottom-lg">
<view v-if="hasMoreData" class="text-center bg-main-color padding-tb text-lg" @click="loadProductData">
<text class="margin-right-xs">查看更多</text>
<text class="text-bold cuIcon-unfold"></text>
</view>
<view class="cu-load" :class="loadMoreStatus"></view>
</view> -->
</view>
</template>
<script>
export default {
data() {
return {
productList: [],
loadMoreStatus: '',
hasMoreData: false,
pageNum: this.$globalData.initPageNum,
pageSize: this.$globalData.initPageSize,
inputGoodsName: null,
goodsId: null,
shopId: null,
chooseShopInfo: null,
addressFull: null,
}
},
async onLoad(options) {
this.goodsId = options.goodsId;
this.shopId = options.shopId;
this.addressFullObj = JSON.parse(options.addressFullObj)
this.loadData();
},
methods: {
async loadData() {
this.pageNum = this.$globalData.initPageNum;
this.pageSize = this.$globalData.initPageSize;
this.loadProductData();
},
loadCategoryList(type = 1) {},
async loadProductData(params = {}) {
params.pageNum = this.pageNum;
params.pageSize = this.pageSize;
// if(this.addressLatitude && this.addressLongitude) {
// params.latitude = this.addressLatitude
// params.longitude = this.addressLongitude
// }
params.provinceName = this.addressFullObj.provinceName,
params.cityName = this.addressFullObj.cityName,
params.countryName = this.addressFullObj.countryName,
params.streetName = this.addressFullObj.streetName,
params.address = this.addressFullObj.address
params.goodsId = this.goodsId
// params.goodsId = 2089
this.loadMoreStatus = 'loading bg-main-color padding-tb text-lg';
this.hasMoreData = false;
try {
await this.loadShopPage(params);
this.loadMoreStatus = this.hasMoreData ? '' : 'over bg-grey padding-tb text-lg';
} catch (e) {
this.loadMoreStatus = 'erro bg-red padding-tb text-lg'
}
},
reloadShopPage() {
this.pageNum = this.$globalData.initPageNum;
this.pageSize = this.$globalData.initPageSize;
this.pageNumOfOtherCityPage = this.$globalData.initPageNum;
this.productList = [];
this.loadProductData();
},
async loadShopPage(params) {
let res = await this.$request.getShopsByGoodsId(params);
// let rowsLength = res[1].data.rows.length;
// if (rowsLength === this.pageSize) {
// this.hasMoreData = true;
// }
// if (this.pageNum === this.$globalData.initPageNum) {
// this.productList = res[1].data.rows;
// } else {
// this.productList = this.productList.concat(res[1].data.rows);
// }
// this.pageNum++;
this.productList = res.data.serviceShops
this.chooseShopInfo = res.data.serviceShops.find(i => i.shopId == this.shopId)
console.log(this.productList);
},
searchGoods() {
this.reloadShopPage();
},
selectShop() {
uni.$emit('chooseShop', this.chooseShopInfo);
uni.navigateBack({
delta: -1
})
}
},
}
</script>
<style scoped>
.search-nav-item-text {
width: 100rpx;
}
.nav .cu-item {
height: 90rpx;
display: inline-block;
line-height: 90rpx;
margin: 0;
padding: 0 10rpx;
width: 180rpx;
background-color: transparent;
}
.cu-load {
display: block;
line-height: unset;
text-align: center;
}
</style>

View File

@ -0,0 +1,261 @@
<template>
<view v-if="afterServiceRecord">
<view v-if="afterServiceRecord.createBy == 1" class="padding-tb solid-top">
<view class='cu-tag bg-main-color radius light'>售后发起中</view>
<view class="text-gray text-sm margin-bottom-xs">您需快速操作反馈24小时内不操作将自动同意</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 v-if="afterServiceRecord.refund">{{afterServiceRecord.refund}}</text>
<text v-else-if="order.payMoney">{{order.payMoney}}</text>
</view>
<view>
<text>退款原因</text>
<text v-if="afterServiceRecord.customerReasonType === 1">上门/服务不守时</text>
<text v-else-if="afterServiceRecord.customerReasonType === 2">态度不友好无法继续</text>
<text v-else-if="afterServiceRecord.customerReasonType === 3">服务效果差未达到合格</text>
<text v-else-if="afterServiceRecord.customerReasonType === 4">技能水平问题未妥善完成</text>
<text v-else-if="afterServiceRecord.customerReasonType === 5">要求加费用费用不合理</text>
<text v-else-if="afterServiceRecord.customerReasonType === 6">订单拖太久了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 7">超了些服务内容师傅不接受</text>
<text v-else-if="afterServiceRecord.customerReasonType === 8">客户/我时间不方便了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 9">客户/我已让别的师傅服务了</text>
</view>
<view>
<text>具体原因</text>
<text v-if="afterServiceRecord.customerReason">{{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>
<text class="text-red" v-if="order.workerId == order.masterWorkerId && !order.isOnlyServ && order.payMoney < afterServiceRecord.refund && afterServiceRecord.customerFinalCheck == null">警报退单金额大于该师傅接单金额但客户发起的退款金额有效您需介入处理如让接单师傅系统上操作同意退款系统最大按该单派单额退回客户其余需人工处理如属于师傅责任引起的退单建议重做重做后让客户撤消退单</text>
</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 v-if="afterServiceRecord.customerReasonType === 1">上门/服务不守时</text>
<text v-else-if="afterServiceRecord.customerReasonType === 2">态度不友好无法继续</text>
<text v-else-if="afterServiceRecord.customerReasonType === 3">服务效果差未达到合格</text>
<text v-else-if="afterServiceRecord.customerReasonType === 4">技能水平问题未妥善完成</text>
<text v-else-if="afterServiceRecord.customerReasonType === 5">要求加费用费用不合理</text>
<text v-else-if="afterServiceRecord.customerReasonType === 6">订单拖太久了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 7">超了些服务内容师傅不接受</text>
<text v-else-if="afterServiceRecord.customerReasonType === 8">客户/我时间不方便了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 9">客户/我已让别的师傅服务了</text>
</view>
<view>
<text>具体原因</text>
<text v-if="afterServiceRecord.customerReason">{{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 class="flex justify-end align-end margin-tb-sm" v-if="!afterServiceRecord.updateBy && afterServiceRecord.workerFeedbackResult === null && showActionBtn">
<button class="cu-btn sm bg-yellow margin-right-sm" @tap="$emit('redoGoHome')">上门重做</button>
<button class="cu-btn sm bg-yellow margin-right-sm" @tap="$emit('callModal', 'rejectAfterSale')">拒绝处理</button>
<button class="cu-btn sm bg-yellow margin-right-sm" @tap="$emit('callModal', 'agreeAfterSale')">操作处理</button>
</view>
</view>
<view v-if="afterServiceRecord.updateBy == 2" class="padding-tb solid-top">
<view class='cu-tag bg-main-color radius light'>师傅反馈</view>
<view>
<view class="margin-top-xs">
<text>师傅反馈结果</text>
<text v-if="afterServiceRecord.workerFeedbackResult === 0">拒绝</text>
<text v-else-if="afterServiceRecord.workerFeedbackResult === 1">同意</text>
<text v-else-if="afterServiceRecord.workerFeedbackResult === 2 || afterServiceRecord.workerFeedbackResult === 3">上门重做/补做</text>
</view>
<view v-if="afterServiceRecord.workerFeedbackResult === 1">
<text>同意退款金额</text>
<text>{{afterServiceRecord.agreedRefund ? afterServiceRecord.agreedRefund : afterServiceRecord.refund}}</text>
</view>
<view style="padding-left: 196upx;" v-if="afterServiceRecord.workerFeedbackResult === 2 || afterServiceRecord.workerFeedbackResult === 3">
<view>客户同意则本次退款金额为0元</view>
<view>客户同意的需马上处理并重新提交</view>
<view class="text-right" v-if="afterServiceRecord.customerAgreeRedo === 1">
<view class='cu-tag bg-main-color radius light'>客户同意方案</view>
</view>
</view>
<template v-if="afterServiceRecord.workerFeedbackResult == 0 || afterServiceRecord.workerFeedbackResult == 1">
<view>
<text>师傅反馈</text>
<text v-if="afterServiceRecord.workerFeedbackReasonType === 1">客户原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 2">师傅原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 3">其他</text>
<text v-if="afterServiceRecord.workerFeedbackReason">
<text v-if="afterServiceRecord.workerFeedbackReasonType"></text>
{{afterServiceRecord.workerFeedbackReason}}
</text>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.workerFeedbackImages">
<view class="bg-img" v-for="(imgUrl, imgIndex) in afterServiceRecord.workerFeedbackImages.split(',')" :key="imgIndex">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
</view>
</template>
<template v-else-if="afterServiceRecord.workerFeedbackResult === 3">
<view class="margin-top-xs">
<text>师傅重做/补做提交</text>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.redoCompleteImages">
<view class="bg-img" v-for="(imgUrl, imgIndex) in afterServiceRecord.redoCompleteImages.split(',')" :key="imgIndex">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
</view>
<view class="margin-bottom-xs">
<text>{{afterServiceRecord.redoCompleteRemark}}</text>
</view>
</template>
</view>
<view style="border-top: 1px solid gainsboro;padding-top: 10upx;" v-if="afterServiceRecord.customerFinalCheck == null && afterServiceRecord.redoCompleteTime && (afterServiceRecord.workerFeedbackResult === 0 || afterServiceRecord.workerFeedbackResult === 1 || afterServiceRecord.workerFeedbackResult === 3)">
<text class="text-gray" style="font-size: 20upx;">待客户验收或审核36小时未操作将自动取消本次售后</text>
<view class="flex align-center margin-top-sm">
<text>工单时限</text>
<uni-countdown :show-colon="false" :backgroundColor="'#eee'"
:day="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).day"
:hour="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).hour"
:minute="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).min"
:second="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).seconds">
</uni-countdown>
</view>
</view>
<view class="flex justify-end align-end margin-tb-sm" v-if="afterServiceRecord.workerFeedbackResult === 2 && showActionBtn">
<button class="cu-btn sm bg-yellow margin-right-sm" @tap="$emit('callModal', 'showReFinishSubmit')">重做/补做提交</button>
</view>
</view>
<view v-if="afterServiceRecord.customerFinalCheck != null" class="padding-tb solid-top">
<template v-if="order.afterPlatformServiceStatus === 0 || order.afterPlatformServiceStatus == 1">
<view class='cu-tag bg-main-color radius light'>客户最终确认</view>
<view class="margin-top-xs">
{{afterServiceRecord.customerFinalCheck === 1 ? '同意' : '不同意'}}
<text v-if="afterServiceRecord.isAutoProcessed == 1 && afterServiceRecord.customerFinalCheck === 1">超时系统自动同意</text>
</view>
<view v-if="afterServiceRecord.customerFinalCheck === 0">
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.customerDisagreeImages">
<view class="bg-img" v-for="imgUrl in afterServiceRecord.customerDisagreeImages.split(',')" :key="imgUrl">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
</view>
<view class="margin-bottom-xs" v-if="afterServiceRecord.customerDisagreeReason">
<text>不同意理由{{afterServiceRecord.customerDisagreeReason}}</text>
</view>
<view class="text-red" v-if="afterServiceRecord.customerFinalCheck === 0">订单交由平台协商处理</view>
<view v-if="afterServiceRecord.customerFinalCheck === 0">系统提示您如能协商尽可能与客户协商一致能重新协商则按双方认可方案重新发起可让客户撤单最佳</view>
</view>
<view v-else-if="afterServiceRecord.customerFinalCheck === 1">
<template v-if="afterServiceRecord.workerFeedbackResult !== 0">
<view v-if="(afterServiceRecord.agreedRefund > 0 || afterServiceRecord.originalRefund > 0) && order.refundPayStatus == 1">
<view>
<text>本单退款系统已发起按客户支付的帐户原路退回</text>
<text class="text-red">{{afterServiceRecord.originalRefund || afterServiceRecord.agreedRefund}}</text>
<text>银行按工作日退款节假日顺延到帐遇客户问询请其耐心等待到账时会在客户端客户最终确认处有到账时间</text>
</view>
<view>退款支付到账{{afterServiceRecord.refundApplyTime}}</view>
</view>
<view v-else-if="order.refundPayStatus == 0">
<text v-if="afterServiceRecord.workerFeedbackResult === 3">本次售后已重新补做并验收完成退款额为0</text>
<text v-else>本单已退款<text class="text-red">{{afterServiceRecord.originalRefund || afterServiceRecord.agreedRefund}}</text>因未实际支付实退为0元未退部分继续完成订单及正常支付</text>
</view>
</template>
<view v-else>
<text>本次售后已操作完毕售后申请已结束</text>
</view>
</view>
</template>
<template v-else-if="order.afterPlatformServiceStatus === 2 || order.afterPlatformServiceStatus === 3">
<view class='cu-tag bg-main-color radius light'>客户最终确认</view>
<view class="margin-top-xs">
{{order.afterPlatformServiceStatus === 2 ? '同意' : '取消售后'}}
平台操作
</view>
<view v-if="afterServiceRecord.platformHandleReason">
<text>平台意见{{afterServiceRecord.platformHandleReason}}</text>
</view>
<view v-if="order.afterPlatformServiceStatus === 3">
<text>本次售后已操作完毕售后申请已结束!</text>
</view>
<template v-else>
<view v-if="(afterServiceRecord.platformRefund || afterServiceRecord.agreedRefund) && order.refundPayStatus == 1">
<view>
<text>本单退款系统已发起按客户支付的帐户原路退回</text>
<text class="text-red">{{afterServiceRecord.platformRefund || afterServiceRecord.agreedRefund}}</text>
<text>银行按工作日退款节假日顺延到帐遇客户问询请其耐心等待到账时会在客户端客户最终确认处有到账时间</text>
</view>
<view>退款支付到账{{afterServiceRecord.refundApplyTime}}</view>
</view>
<view v-else-if="order.refundPayStatus == 0">
<text>本单已退款<text class="text-red">{{afterServiceRecord.platformRefund || afterServiceRecord.agreedRefund || 0}}</text>因未实际支付实退为0元未退部分继续完成订单及正常支付</text>
</view>
</template>
</template>
</view>
</view>
</template>
<script>
export default {
emits: ['redoGoHome', 'callModal'],
props: {
afterServiceRecord: {
type: Object,
default: () => {}
},
order: {
type: Object,
default: () => {}
},
showActionBtn: {
type: Boolean,
default: true
}
},
data() {
return {
}
},
methods: {
viewImage(e, imgList) {
uni.previewImage({
urls: imgList,
current: e.currentTarget.dataset.url
});
},
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,394 @@
<template>
<view v-if="afterServiceRecord">
<view v-if="afterServiceRecord.createBy == 1" class="padding-tb solid-top">
<view class='cu-tag bg-main-color radius light'>售后发起中</view>
<view class="text-gray text-sm margin-bottom-xs">您需快速操作反馈24小时内不操作将自动同意</view>
<view v-if="afterServiceRecord.operType === 1">
<view class="flex justify-start align-end">
<text>{{afterServiceRecord.operType === 1 ? '退款申请:' : '待处理售后:'}}</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 v-if="afterServiceRecord.refund">{{afterServiceRecord.refund}}</text>
<text v-else-if="order.payMoney">{{order.payMoney}}</text>
</view>
<view>
<text>售后类型</text>
<text v-if="afterServiceRecord.afterServiceType === 1">未收到货我要退单退款</text>
<text v-else-if="afterServiceRecord.afterServiceType === 2">未收到货发货在途我要退款</text>
<text v-else-if="afterServiceRecord.afterServiceType === 3">已收到货我要退款退货</text>
</view>
<view>
<text>申请原因</text>
<text v-if="afterServiceRecord.customerReasonType === 1">不想要了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 2">买错型号尺寸了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 3">材质与商品描述不符</text>
<text v-else-if="afterServiceRecord.customerReasonType === 4">大小尺寸与商品描述不符</text>
<text v-else-if="afterServiceRecord.customerReasonType === 5">颜色款式型号与描述不符</text>
<text v-else-if="afterServiceRecord.customerReasonType === 6">出现质量问题</text>
<text v-else-if="afterServiceRecord.customerReasonType === 7">收到商品少件少配件</text>
<text v-else-if="afterServiceRecord.customerReasonType === 8">商家发错货</text>
<text v-else-if="afterServiceRecord.customerReasonType === 9">商品破损或污渍</text>
<text v-else-if="afterServiceRecord.customerReasonType === 10">未按承诺时间发货</text>
<text v-else-if="afterServiceRecord.customerReasonType === 11">未见快递/物流有信息</text>
<text v-else-if="afterServiceRecord.customerReasonType === 12">其它原因</text>
</view>
<view>
<text>具体原因</text>
<text v-if="afterServiceRecord.customerReason">{{afterServiceRecord.customerReason}}</text>
</view>
<view v-if="afterServiceRecord.operType === 2">
<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>
<text class="text-red" v-if="order.workerId == order.masterWorkerId && !order.isOnlyServ && order.payMoney < afterServiceRecord.refund && afterServiceRecord.customerFinalCheck == null">警报退单金额大于该师傅接单金额但客户发起的退款金额有效您需介入处理如让接单师傅系统上操作同意退款系统最大按该单派单额退回客户其余需人工处理如属于师傅责任引起的退单建议重做重做后让客户撤消退单</text>
</view>
</view>
<!-- <view class="flex justify-end align-end margin-tb-sm" v-if="!afterServiceRecord.updateBy || afterServiceRecord.updateBy == 1">
<button class="cu-btn sm bg-yellow margin-right-sm" @tap="showModalByRef('sure2Revisit', order, null)">重发/补发</button>
<button class="cu-btn sm bg-yellow margin-right-sm" data-modal="rejectAfterSale" @tap="showModal($event, order)">拒绝处理</button>
<button class="cu-btn sm bg-yellow margin-right-sm" data-modal="agreeAfterSale" @tap="showModal($event, order)">操作处理</button>
</view> -->
<!-- {{!afterServiceRecord.updateBy}}
{{afterServiceRecord.workerFeedbackResult === null}}
{{showActionBtn}} -->
<view class="flex justify-end align-end margin-tb-sm" v-if="(!afterServiceRecord.updateBy || afterServiceRecord.updateBy == 1) && afterServiceRecord.workerFeedbackResult === null && showActionBtn">
<button class="cu-btn sm bg-yellow margin-right-sm" @tap="$emit('redoGoHome')">重发/补发</button>
<button class="cu-btn sm bg-yellow margin-right-sm" @tap="$emit('callModal', 'rejectAfterSale')">拒绝处理</button>
<button class="cu-btn sm bg-yellow margin-right-sm" @tap="$emit('callModal', 'agreeAfterSale')">操作处理</button>
</view>
</view>
<view v-if="afterServiceRecord.updateBy != 1" class="padding-tb solid-top">
<view class='cu-tag bg-main-color radius light'>商家反馈</view>
<view>
<view class="margin-top-xs">
<text>商家反馈结果</text>
<text v-if="afterServiceRecord.workerFeedbackResult === 0">拒绝</text>
<text v-else-if="afterServiceRecord.workerFeedbackResult === 1">同意</text>
<text v-else-if="afterServiceRecord.workerFeedbackResult === 2 || afterServiceRecord.workerFeedbackResult === 3">{{order.orderType == 1 ? '重发/补发商品' : '上门重做/补做'}}</text>
</view>
<template v-if="afterServiceRecord.workerFeedbackResult === 1">
<view>
<text>同意退款金额</text>
<text>{{afterServiceRecord.agreedRefund ? afterServiceRecord.agreedRefund : afterServiceRecord.refund}}</text>
</view>
<view v-if="afterServiceRecord.workerReceiveStatus">
<text>收货状态</text>
<text v-if="afterServiceRecord.workerReceiveStatus == 1">未发货</text>
<text v-else-if="afterServiceRecord.workerReceiveStatus == 2">已发货在途</text>
<text v-else-if="afterServiceRecord.workerReceiveStatus == 3">已收货</text>
<text v-else-if="afterServiceRecord.workerReceiveStatus == 4">售后保障期</text>
</view>
<view v-if="afterServiceRecord.workerAgreeType">
<text>同意选项</text>
<text v-if="afterServiceRecord.workerAgreeType == 1">同意即时退单退款</text>
<text v-else-if="afterServiceRecord.workerAgreeType == 2">同意货物拦截后退单退款</text>
<text v-else-if="afterServiceRecord.workerAgreeType == 3">同意快递返回货物后退单退款</text>
<text v-else-if="afterServiceRecord.workerAgreeType == 4">同意您退回货物后退单退款</text>
</view>
</template>
<view v-if="afterServiceRecord.workerFeedbackResult === 2 || afterServiceRecord.workerFeedbackResult === 3" style="padding-left: 196upx;">
<view v-if="afterServiceRecord.workerResendPlan">
<text v-if="afterServiceRecord.workerResendPlan == 1">重发/补发您无需退货</text>
<text v-if="afterServiceRecord.workerResendPlan == 2">重发/补发前您需先退货</text>
<text v-if="afterServiceRecord.workerResendPlan == 3">请您退回商品给你换货</text>
<text v-if="afterServiceRecord.workerResendPlan == 4">请退回商品为您售后换货</text>
</view>
<view>客户同意则本次退款金额为0元</view>
<view>客户同意的需马上处理并重新提交</view>
</view>
<view v-if="afterServiceRecord.workerFeedbackResult !== 2 && afterServiceRecord.workerFeedbackResult !== 3">
<text>商家反馈</text>
<text v-if="afterServiceRecord.workerFeedbackReasonType === 1">客户原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 2">商家原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 3">其他</text>
<text v-if="afterServiceRecord.workerFeedbackReason">
<text v-if="afterServiceRecord.workerFeedbackReasonType"></text>
{{afterServiceRecord.workerFeedbackReason}}
</text>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.workerFeedbackImages">
<view class="bg-img" v-for="(imgUrl, imgIndex) in afterServiceRecord.workerFeedbackImages.split(',')" :key="imgIndex">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
</view>
<view class="text-right" v-if="afterServiceRecord.customerAgreeRedo === 1">
<!-- 同意售后并且同意类型需要退货重发补发以及重发方案为需要退货 -->
<view class='cu-tag bg-main-color radius light' v-if="(afterServiceRecord.workerFeedbackResult === 1 && (afterServiceRecord.workerAgreeType == 2 || afterServiceRecord.workerAgreeType == 3 || afterServiceRecord.workerAgreeType == 4)) || ((afterServiceRecord.workerFeedbackResult === 2 || afterServiceRecord.workerFeedbackResult === 3) && (afterServiceRecord.workerResendPlan === 2 || afterServiceRecord.workerResendPlan === 3 || afterServiceRecord.workerResendPlan === 4))">客户反馈未收货货在途</view>
<view class='cu-tag bg-main-color radius light' v-else>客户同意方案</view>
</view>
<template v-if="afterServiceRecord.returnType">
<view class="margin-top-xs">
<text>客户已退货</text>
</view>
<view class="flex justify-between align-center">
<text>发货方式{{afterServiceRecord.returnType == 1 ? '发快递/物流': (afterServiceRecord.returnType == 2 ? '送货上门' : '客户自提')}}</text>
<text v-if="afterServiceRecord.returnType == 1" @click="copyData(afterServiceRecord.returnTrackingNumber)">{{afterServiceRecord.returnTrackingNumber}}<text class="cuIcon-copy"></text><text class="text-main-color margin-left-sm" @click.stop="getDeliveryFlow(afterServiceRecord.returnTrackingNumber)">查询</text></text>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.returnImages">
<view class="bg-img" v-for="(imgUrl, imgIndex) in afterServiceRecord.returnImages.split(',')" :key="imgIndex">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
</view>
<view class="margin-bottom-xs" v-if="afterServiceRecord.returnRemark">
<text>发货备注{{afterServiceRecord.returnRemark}}</text>
</view>
</template>
<template v-if="afterServiceRecord.workerFeedbackResult === 3 && afterServiceRecord.workerResendType">
<view class="margin-top-xs">
<text>商家重发/补发提交</text>
</view>
<view class="flex justify-between align-center">
<text>发货方式{{afterServiceRecord.workerResendType == 1 ? '发快递/物流': (afterServiceRecord.workerResendType == 2 ? '送货上门' : '客户自提')}}</text>
<text v-if="afterServiceRecord.workerResendType == 1" @click="copyData(afterServiceRecord.workerResendTrackingNumber)">{{afterServiceRecord.workerResendTrackingNumber}}<text class="cuIcon-copy"></text></text>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.workerResendImages">
<view class="bg-img" v-for="(imgUrl, imgIndex) in afterServiceRecord.workerResendImages.split(',')" :key="imgIndex">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
</view>
<view class="margin-bottom-xs" v-if="afterServiceRecord.workerResendRemark">
<text>发货备注{{afterServiceRecord.workerResendRemark}}</text>
</view>
</template>
</view>
</view>
<view style="border-top: 1px solid gainsboro;padding-top: 10upx;" v-if="afterServiceRecord.customerFinalCheck == null && afterServiceRecord.workerResendType">
<view v-if="afterServiceRecord.workerResendType == 1">
<text class="text-gray" style="font-size: 20upx;">待客户验收或审核4天内未操作将自动完成本次售后</text>
<view class="flex align-center margin-top-sm">
<text>操作时限</text>
<uni-countdown :show-colon="false" :backgroundColor="'#eee'"
:day="$dateUtil.countDownDiff($dateUtil.addDays(afterServiceRecord.workerResendTime, 4)).day"
:hour="$dateUtil.countDownDiff($dateUtil.addDays(afterServiceRecord.workerResendTime, 4)).hour"
:minute="$dateUtil.countDownDiff($dateUtil.addDays(afterServiceRecord.workerResendTime, 4)).min"
:second="$dateUtil.countDownDiff($dateUtil.addDays(afterServiceRecord.workerResendTime, 4)).seconds">
</uni-countdown>
</view>
</view>
<view v-else>
<text class="text-gray" style="font-size: 20upx;">待客户验收或审核24小时未操作将自动同意本售后</text>
<view class="flex align-center margin-top-sm">
<text>操作时限</text>
<uni-countdown :show-colon="false" :backgroundColor="'#eee'"
:day="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.workerResendTime, 24)).day"
:hour="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.workerResendTime, 24)).hour"
:minute="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.workerResendTime, 24)).min"
:second="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.workerResendTime, 24)).seconds">
</uni-countdown>
</view>
</view>
</view>
<view style="border-top: 1px solid gainsboro;padding-top: 10upx;" v-if="afterServiceRecord.customerFinalCheck == null && (afterServiceRecord.workerFeedbackResult === 0 || afterServiceRecord.workerFeedbackResult === 1 || afterServiceRecord.workerFeedbackResult === 3 || (afterServiceRecord.workerFeedbackResult === 2 && (afterServiceRecord.workerResendPlan === 2 || afterServiceRecord.workerResendPlan === 3)))">
<template v-if="afterServiceRecord.workerFeedbackResult === 1 && afterServiceRecord.customerOperationTime">
<text class="text-gray" style="font-size: 20upx;">您需跟踪客户退货或物流返货收到后第一时间操作结单键退款</text>
<view class="flex align-center margin-top-sm">
<text>工单时限</text>
<uni-countdown :show-colon="false" :backgroundColor="'#eee'"
:day="$dateUtil.countDownDiff($dateUtil.addDays(afterServiceRecord.customerOperationTime, 6)).day"
:hour="$dateUtil.countDownDiff($dateUtil.addDays(afterServiceRecord.customerOperationTime, 6)).hour"
:minute="$dateUtil.countDownDiff($dateUtil.addDays(afterServiceRecord.customerOperationTime, 6)).min"
:second="$dateUtil.countDownDiff($dateUtil.addDays(afterServiceRecord.customerOperationTime, 6)).seconds">
</uni-countdown>
</view>
</template>
<template v-if="afterServiceRecord.workerFeedbackResult === 2 && afterServiceRecord.workerResendPlanTime">
<text class="text-gray" style="font-size: 20upx;">待客户验收或审核36小时未操作将自动取消本次售后</text>
<view class="flex align-center margin-top-sm">
<text>工单时限</text>
<uni-countdown :show-colon="false" :backgroundColor="'#eee'"
:day="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.workerResendPlanTime, 36)).day"
:hour="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.workerResendPlanTime, 36)).hour"
:minute="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.workerResendPlanTime, 36)).min"
:second="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.workerResendPlanTime, 36)).seconds">
</uni-countdown>
</view>
</template>
<template v-else-if="afterServiceRecord.redoCompleteTime">
<text class="text-gray" style="font-size: 20upx;">待客户验收或审核36小时未操作将自动取消本次售后</text>
<view class="flex align-center margin-top-sm">
<text>工单时限</text>
<uni-countdown :show-colon="false" :backgroundColor="'#eee'"
:day="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).day"
:hour="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).hour"
:minute="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).min"
:second="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).seconds">
</uni-countdown>
</view>
</template>
</view>
<!-- <view class="flex justify-end align-end margin-tb-sm" v-if="afterServiceRecord.workerFeedbackResult === 2">
<button class="cu-btn sm bg-yellow margin-right-sm" data-modal="showDeliverGoods" @tap="showModal($event, order)">立即重发/补发</button>
</view> -->
<template v-if="afterServiceRecord.customerFinalCheck === null">
<view class="flex justify-end align-end margin-tb-sm" v-if="afterServiceRecord.workerFeedbackResult === 2 && showActionBtn">
<button class="cu-btn sm bg-yellow margin-right-sm" @tap="$emit('callModal', 'showDeliverGoods')">立即重发/补发</button>
</view>
<view class="flex justify-end align-end margin-tb-sm" v-if="afterServiceRecord.workerFeedbackResult === 1 && (afterServiceRecord.workerAgreeType == 2 || afterServiceRecord.workerAgreeType == 3 || afterServiceRecord.workerAgreeType == 4) && afterServiceRecord.workerReceiveStatus != 3 && showActionBtn">
<button class="cu-btn sm bg-yellow margin-right-sm" @tap="workerReceived">货已收到结单</button>
</view>
</template>
<view v-if="afterServiceRecord.customerFinalCheck != null" class="padding-tb solid-top">
<template v-if="order.afterPlatformServiceStatus === 0 || order.afterPlatformServiceStatus == 1">
<view class='cu-tag bg-main-color radius light'>{{afterServiceRecord.workerReceiveConfirm === 1 ? '商家确认' : '客户最终确认'}}</view>
<view class="margin-top-xs" v-if="afterServiceRecord.workerReceiveConfirm === 1">
<view>已收货结单</view>
<view>本单已退货并结束售后</view>
</view>
<template v-else>
<view class="margin-top-xs" v-if="afterServiceRecord.customerFinalCheck === 2">
取消
<text v-if="afterServiceRecord.isAutoProcessed == 1">超时系统自动取消</text>
</view>
<view class="margin-top-xs" v-else>
{{afterServiceRecord.customerFinalCheck === 1 ? '同意' : '不同意'}}
<text v-if="afterServiceRecord.isAutoProcessed == 1 && afterServiceRecord.customerFinalCheck === 1">超时系统自动同意</text>
</view>
</template>
<view v-if="afterServiceRecord.customerFinalCheck === 0">
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.customerDisagreeImages">
<view class="bg-img" v-for="imgUrl in afterServiceRecord.customerDisagreeImages.split(',')" :key="imgUrl">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
</view>
<view class="margin-bottom-xs" v-if="afterServiceRecord.customerDisagreeReason">
<text>不同意理由{{afterServiceRecord.customerDisagreeReason}}</text>
</view>
<view class="text-red" v-if="afterServiceRecord.customerFinalCheck === 0">订单交由平台协商处理</view>
<view v-if="afterServiceRecord.customerFinalCheck === 0">
系统提示您如能协商尽可能与客户协商一致能重新协商则按双方认可方案重新发起可让客户撤单最佳售后内已重新发货的则客户无法操作撤单
</view>
</view>
<view v-else-if="afterServiceRecord.customerFinalCheck === 1">
<template v-if="afterServiceRecord.workerFeedbackResult !== 0">
<view v-if="(afterServiceRecord.agreedRefund > 0 || afterServiceRecord.originalRefund > 0) && order.refundPayStatus == 1">
<view>
<text>本单退款系统已发起按客户支付的帐户原路退回</text>
<text class="text-red">{{afterServiceRecord.originalRefund || afterServiceRecord.agreedRefund}}</text>
<text>银行按工作日退款节假日顺延到帐遇客户问询请其耐心等待到账时会在客户端客户最终确认处有到账时间</text>
</view>
<view>退款支付到账{{afterServiceRecord.refundApplyTime}}</view>
</view>
<view v-else-if="order.refundPayStatus == 0">
<text v-if="afterServiceRecord.workerFeedbackResult === 3">{{order.orderType == 1 ? '本次售后已重发/补发并验收完成退款为0' : '本次售后已重新补做并验收完成退款额为0'}}</text>
<text v-else>本单已退款<text class="text-red">{{afterServiceRecord.originalRefund || afterServiceRecord.agreedRefund || 0}}</text>因未实际支付实退为0元未退部分继续完成订单及正常支付</text>
</view>
</template>
<view v-else>
<text>本次售后已操作完毕售后申请已结束</text>
</view>
</view>
</template>
<template v-else-if="order.afterPlatformServiceStatus === 2 || order.afterPlatformServiceStatus === 3">
<view class='cu-tag bg-main-color radius light'>客户最终确认</view>
<view class="margin-top-xs">
{{order.afterPlatformServiceStatus === 2 ? '同意' : '取消售后'}}
平台操作
</view>
<view v-if="afterServiceRecord.platformHandleReason">
<text>平台意见{{afterServiceRecord.platformHandleReason}}</text>
</view>
<view v-if="order.afterPlatformServiceStatus === 3">
<text>本次售后已操作完毕售后申请已结束!</text>
</view>
<template v-else>
<view v-if="(afterServiceRecord.platformRefund || afterServiceRecord.agreedRefund) && order.refundPayStatus == 1">
<view>
<text>本单退款系统已发起按客户支付的帐户原路退回</text>
<text class="text-red">{{afterServiceRecord.platformRefund || afterServiceRecord.agreedRefund}}</text>
<text>银行按工作日退款节假日顺延到帐遇客户问询请其耐心等待到账时会在客户端客户最终确认处有到账时间</text>
</view>
<view>退款支付到账{{afterServiceRecord.refundApplyTime}}</view>
</view>
<view v-else-if="order.refundPayStatus == 0">
<text>本单已退款<text class="text-red">{{afterServiceRecord.platformRefund || afterServiceRecord.agreedRefund || 0}}</text>因未实际支付实退为0元未退部分继续完成订单及正常支付</text>
</view>
</template>
</template>
</view>
</view>
</template>
<script>
export default {
props: {
afterServiceRecord: {
type: Object,
default: () => {}
},
order: {
type: Object,
default: () => {}
},
showActionBtn: {
type: Boolean,
default: true
}
},
data() {
},
methods: {
viewImage(e, imgList) {
uni.previewImage({
urls: imgList,
current: e.currentTarget.dataset.url
});
},
copyData(data) {
uni.setClipboardData({
data: data,
success() {
uni.showToast({
title: '复制成功'
})
}
});
},
getDeliveryFlow(returnTrackingNumber) {
console.log(returnTrackingNumber);
this.$emit('getDeliveryFlow', returnTrackingNumber)
},
workerReceived() {
uni.showModal({
confirmText: '确认',
cancelText: '取消',
content: "确认后结束售后单,退款按支付原路退回,退款额最大按本单商品金额为限,存在退额不足且未满足客户诉求的将由您与您的派单公司按订单总额另行与客户对接后再结单!",
success: async (res) => {
if(res.confirm) {
await this.$request.workerConfirmReceive({
id: this.afterServiceRecord.id
})
this.$emit('refreshOrderList')
}
}
})
}
}
}
</script>
<style>
</style>

View File

@ -12,7 +12,8 @@
<view class='cu-tag padding basis-lg'>{{item.goodsName}}</view>
<view class="flex justify-end basis-df text-center align-center">
<view class="basis-df">{{item.goodsNum}}</view>
<view class="basis-df">
<view class="basis-df" v-if="orderMode === 'transferOrder'">{{item.goodsNum}}</view>
<view class="basis-df" v-else>
<uni-number-box :min="0" :max="item.goodsNum" v-model="item.toAssignNum" @change="changePiecesNum($event, item)">
</uni-number-box>
</view>
@ -24,7 +25,7 @@
</view>
<view class="padding-bottom-sm flex justify-between align-center">
<text class="margin-right-sm" style="width: 150rpx;">派单价格</text>
<input type="digit" class="line-input radius-input" v-model="dispatchTotalPrice" placeholder="请输入派出总额"></input>
<input type="digit" class="line-input radius-input" v-model="dispatchTotalPrice" :placeholder="orderMode === 'transferOrder'?'请输入派出总额(转出后在监控单查看)' : '请输入派出总额'"></input>
</view>
</view>
<view class="solid-top padding-top-sm flex justify-between align-center">
@ -35,6 +36,18 @@
</view>
<!-- 可指派成员 -->
<scroll-view class="certern-height-with-scroll" :scroll-y="true" :scroll-with-animation="true">
<view v-if="orderMode === 'transferOrder'">
<view class="bg-white padding">
<view class="flex justify-between align-center">
<view class="flex justify-start align-center">
<view class="text-lg margin-left-sm">转入大厅</view>
</view>
<view>
<button class="cu-btn bg-main-color shadow-blur" @click="assignTransfer">转大厅</button>
</view>
</view>
</view>
</view>
<view v-if="searchedMembers && searchedMembers.length > 0">
<view class="bg-white padding" v-for="(member, index) in searchedMembers">
<view class="flex justify-between align-center">
@ -115,6 +128,10 @@
orderNow: {
type: Boolean,
default: false
},
orderMode: {
type: String,
default: ''
}
},
data() {
@ -171,7 +188,36 @@
});
this.searchedMembers = res.rows;
},
assignTransfer(member) {
let goodsToAssign = [];
this.pickedList.forEach((item) => {
goodsToAssign.push({
goodsStandardId: item.goodsStandardId,
num: item.goodsNum
})
});
if (this.dispatchTotalPrice) {
let params = {
goodsList: goodsToAssign,
workerId: member ? member.workerId : null,
totalPay: this.dispatchTotalPrice,
orderMasterId: this.curOrder.orderMasterId,
isAll: 1,
workerName: member ? member.workerName : null
}
this.$emit('assignWork', params);
} else {
uni.showToast({
title: '请填写派单价格',
icon: 'none'
})
}
},
assignWork(member) {
if(this.orderMode === 'transferOrder') {
this.assignTransfer(member)
return
}
let goodsToAssign = [];
// goods10
let isAll = 1;

View File

@ -6,8 +6,15 @@
<view class="padding-xl">
<view class="cuIcon-roundcheck big-icon padding-tb text-main-color"></view>
<view class="text-bold text-lg margin-bottom-sm">接单成功</view>
<view v-if="data.payType == 0">请在30分钟内联系客户预约好上门时间并在订单中操作排单时间超时6倍将受平台处罚管理该订单款项在任务流程结束后由银联自动结算至您帐户! </view>
<view v-else-if="data.payType == 1">该单需上门收款请在30分钟内联系客户并告知客户属上门收款单金额以客户端弹出的金额为准或上门后师傅端弹出的二维码内金额支付预约好上门时间并在订单中操作排单时间超时6倍将受平台处罚管理该订单款项在任务流程结束后由银联自动结算至您帐户! </view>
<template v-if="data.orderType == 1">
<view v-if="data.payType == 0">接单成功请在30分钟内发货或排发货时间超时3倍未排可能被平台处罚该订单款项在流程结束后将由银联自动结算至你帐户</view>
<view v-else-if="data.payType == 1">接单成功货到付款单交货时按单内二维码收款或客户在其帐户端支付接单后请在请在30分钟内发货或排发货时间超时3倍未排可能被平台处罚该订单款项在流程结束后将由银联自动结算至你帐户</view>
</template>
<template v-else>
<view v-if="data.payType == 0">请在30分钟内联系客户预约好上门时间并在订单中操作排单时间超时6倍将受平台处罚管理该订单款项在任务流程结束后由银联自动结算至您帐户! </view>
<view v-else-if="data.payType == 1">该单需上门收款请在30分钟内联系客户并告知客户属上门收款单金额以客户端弹出的金额为准或上门后师傅端弹出的二维码内金额支付预约好上门时间并在订单中操作排单时间超时6倍将受平台处罚管理该订单款项在任务流程结束后由银联自动结算至您帐户! </view>
</template>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-main-color" data-modal="showAcceptOrderNoticeModal"

View File

@ -0,0 +1,240 @@
<template>
<view class="cu-modal" :class="show?'show':''">
<view class="cu-dialog bg-white">
<view class="cu-bar">
<view class="content">同意售后</view>
<view class="action" data-modal="agreeAfterSale" @click="hideModal">
<text class="cuIcon-close text-red"></text>
</view>
</view>
<view class="padding text-left">
<view class="text-lg">
<text>退款金额</text>
<text class="text-price text-red">{{data.afterServiceRecordList[0].refund ? data.afterServiceRecordList[0].refund : data.payMoney}}</text>
</view>
<view v-if="!data.isOnlyServ && data.afterServiceRecordList[0].refund && data.payMoney < data.afterServiceRecordList[0].refund" class="padding-top text-red">
警报该单关联其它订单客户申请的退款金额有效有疑问可先沟通派单公司详情处电话如确认同意最大退款额以本单接单额原路退回其余需退的或你仍有收益则由派单公司处理如更改退单额需先协商一致余额部分完单后计入你账户
</view>
<view class="flex justify-start align-center margin-top-sm">
<view class="title">收货状态</view>
<my-uni-combox class="form-val-area inline-input" :candidates="workerReceiveStatusArr" placeholder="请选择" :showField="'name'"
v-model="workerReceiveStatus">
</my-uni-combox>
</view>
<view class="flex justify-start align-center margin-top-sm">
<view class="title">同意选项</view>
<my-uni-combox class="form-val-area inline-input" :candidates="workerAgreeTypeArr" placeholder="请选择" :showField="'name'"
v-model="workerAgreeType">
</my-uni-combox>
</view>
<view class="text-lg padding-top flex justify-start align-center">
<text>更改退款金额</text>
<input type="digit" class="radius-input inline-input" style="flex-basis:25%" v-model="agreedRefund"></input>
<text class="margin-left-xs"></text>
</view>
<view class="padding-top">
<view class="flex justify-start">
<view>原因选择</view>
<radio-group @change="changeReasonRadio">
<label class="radio margin-right-sm">
<radio style="transform:scale(0.7)" class="main-color" :value="1" :checked="data.reasonType === 1"/>
<text>客户原因</text>
</label>
<label class="radio">
<radio style="transform:scale(0.7)" class="main-color" :value="2" :checked="data.reasonType === 2"/>
<text>师傅原因</text>
</label>
<label class="radio">
<radio style="transform:scale(0.7)" class="main-color" :value="3" :checked="data.reasonType === 3"/>
<text>其他</text>
</label>
</radio-group>
</view>
<view class="margin-top">
<textarea style="width: 100%; height: 200rpx;" fixed="true" class="solid radius text-left padding-sm"
v-model="remark" maxlength="-1"
placeholder="请输入同意原因或更改金额原因(更改退单金额需与客户协商一致,或请订单详情处“派单公司”介入,否则可能被拒绝或引起客诉升级)"></textarea>
</view>
</view>
</view>
<view class="cu-bar solid-top">
<view class="action margin-0 flex-sub text-black" data-modal="agreeAfterSale" @click="hideModal">取消</view>
<view class="action margin-0 flex-sub text-main-color solid-left" data-modal="agreeAfterSale"
@click="showNotice">确认</view>
</view>
</view>
<confirm-modal ref="notice" :content="'本单款项银联确认已发起支付,款项已到达或即将到达您所绑定帐户,需退款的同意后您线下与客户操作退款,系统无法提供原路返回退款!'" :confirmMsg="'同意'" @confirm="noticeConfirm" @cancel="noticeCancel"></confirm-modal>
</view>
</template>
<script>
import myUniCombox from '@/components/uni-combox/my-uni-combox.vue';
export default {
name: 'agreeAfterSale',
components: {
myUniCombox
},
props: {
show: {
type: Boolean,
default: false
},
data: {
type: Object,
default: () => {}
}
},
data() {
return {
agreedRefund: null,
reasonType: null,
remark: null,
workerReceiveStatus: null,
workerAgreeType: null,
workerReceiveStatusArr: [
{
code: 1,
name: '未发货'
},
{
code: 2,
name: '已发货在途'
},
{
code: 3,
name: '已收货'
},
{
code: 4,
name: '售后保障期'
},
],
workerAgreeTypeArr: [
{
code: 1,
name: '同意即时退单退款'
},
{
code: 2,
name: '同意货物拦截后退单退款'
},
{
code: 3,
name: '同意快递返回货物后退单退款'
},
{
code: 4,
name: '同意您退回货物后退单退款'
}
]
}
},
methods: {
hideModal(e) {
this.resetData();
this.$emit('close', e);
},
resetData() {
// this.data = null;
this.agreedRefund = null;
this.reasonType = null;
this.remark = null;
this.workerReceiveStatus = null;
this.workerAgreeType = null;
},
changeReasonRadio(e) {
this.reasonType = e.detail.value;
},
showNotice(e) {
if (this.data.drawCashStatus != null && this.data.drawCashStatus >= 1) {
this.$refs.notice.showModal();
} else {
this.submit(e);
}
},
noticeConfirm() {
this.submit({
currentTarget: {
dataset: {
modal: 'agreeAfterSale'
}
}
});
},
noticeCancel() {
this.hideModal({
currentTarget: {
dataset: {
modal: 'agreeAfterSale'
}
}
});
},
async submit(e) {
if(!this.workerReceiveStatus) {
uni.showToast({
title: '请选择收货状态',
icon: 'none',
duration: 1500
})
return
}
if(!this.workerAgreeType) {
uni.showToast({
title: '请选择同意选项',
icon: 'none',
duration: 1500
})
return
}
let agreedRefund = this.agreedRefund;
if (!agreedRefund && this.data.afterServiceRecordList[0].refund != null) {
agreedRefund = this.data.afterServiceRecordList[0].refund;
} else if (!agreedRefund) {
agreedRefund = this.data.payMoney;
}
console.log({
id: this.data.afterServiceRecordList[0].id,
workerFeedbackReasonType: this.reasonType,
agreedRefund: agreedRefund,
workerFeedbackReason: this.remark,
workerFeedbackResult: 1,
updateBy: 2,
workerReceiveStatus: this.workerReceiveStatus.code,
workerAgreeType: this.workerAgreeType.code
});
let res = await this.$request.editAfterServiceGoodsRecord({
id: this.data.afterServiceRecordList[0].id,
workerFeedbackReasonType: this.reasonType,
agreedRefund: agreedRefund,
workerFeedbackReason: this.remark,
workerFeedbackResult: 1,
updateBy: 2,
workerReceiveStatus: this.workerReceiveStatus.code,
workerAgreeType: this.workerAgreeType.code
});
if (res && res.code === 0) {
uni.showToast({
icon: 'success',
title: '提交成功',
duration: 1000
})
this.hideModal(e);
this.$emit('confirmFeedback');
return;
}
uni.showToast({
icon: 'error',
duration: 1000,
title: '提交失败',
})
}
},
}
</script>
<style scoped>
.inline-input {
flex-basis: 74%;
}
</style>

View File

@ -0,0 +1,129 @@
<template>
<view class="cu-modal" :class="show?'show':''">
<view class="cu-dialog bg-white">
<view class="cu-bar">
<view class="content">分配服务金额</view>
<view class="action" data-modal="agreeAfterSale" @click="hideModal">
<text class="cuIcon-close text-red"></text>
</view>
</view>
<view class="padding text-left">
<view class="padding-top">
<view class="flex justify-start flex-direction">
<view>本单商品已设置包安装/包施工类服务</view>
<view>请预置分配安装或服务费/工时费</view>
</view>
<view class="margin-top solid radius text-left padding-sm">
<input type="digit" style="width: 100%;" placeholder="请输入本单服务费,工时费可撤回或修改" v-model="serviceMoney">
</view>
</view>
</view>
<view class="cu-bar solid-top">
<view class="action margin-0 flex-sub text-black" data-modal="agreeAfterSale" @click="hideModal">关闭/返回查看商品</view>
<view class="action margin-0 flex-sub text-main-color solid-left" data-modal="agreeAfterSale"
@click="noticeConfirm">继续接单</view>
</view>
</view>
<confirm-modal ref="notice" :content="'本单款项银联确认已发起支付,款项已到达或即将到达您所绑定帐户,需退款的同意后您线下与客户操作退款,系统无法提供原路返回退款!'" :confirmMsg="'同意'" @confirm="noticeConfirm" @cancel="noticeCancel"></confirm-modal>
</view>
</template>
<script>
export default {
name: 'agreeAfterSale',
props: {
show: {
type: Boolean,
default: false
},
data: {
type: Object,
default: {}
}
},
data() {
return {
agreedRefund: null,
reasonType: null,
remark: null,
serviceMoney: null
}
},
methods: {
hideModal(e) {
this.resetData();
this.$emit('close', e);
},
resetData() {
this.serviceMoney = null;
},
showNotice(e) {
if (this.data.drawCashStatus != null && this.data.drawCashStatus >= 1) {
this.$refs.notice.showModal();
} else {
this.submit(e);
}
},
noticeConfirm() {
this.submit({
currentTarget: {
dataset: {
modal: 'agreeAfterSale'
}
}
});
},
noticeCancel() {
this.hideModal({
currentTarget: {
dataset: {
modal: 'agreeAfterSale'
}
}
});
},
async submit(e) {
if (!this.serviceMoney) {
uni.showToast({
title: '请输入本单服务费',
icon: 'none'
});
return;
}
if(parseFloat(this.serviceMoney) > this.data.serverMoney) {
uni.showToast({
title: '本单服务费不能大于订单服务金额',
icon: 'none'
});
return;
}
let res = await this.$request.allocateServiceMoney({
id: this.data.orderMasterId,
serverGoodsMoney: this.serviceMoney
});
if (res && res.code === 0) {
uni.showToast({
icon: 'success',
title: '提交成功',
duration: 1000
})
this.hideModal(e);
this.$emit('confirmFeedback');
return;
}
uni.showToast({
icon: 'error',
duration: 1000,
title: '提交失败',
})
}
},
}
</script>
<style scoped>
.inline-input {
flex-basis: 25%;
}
</style>

View File

@ -1,62 +1,80 @@
<template>
<view class="cu-modal" :class="show?'show':''">
<view class="cu-dialog">
<view class="cu-bar bg-white justify-end solid-bottom">
<view class="content">申请订单加价/预付款</view>
<view class="action" data-modal="applyExtraChargeModal" @click="hideModal">
<text class="cuIcon-close text-red"></text>
<view>
<view class="cu-modal" :class="show?'show':''">
<view class="cu-dialog" style="margin-top: 180rpx;vertical-align: initial;">
<view class="cu-bar bg-white justify-end solid-bottom">
<view class="content">申请订单加价/预付款</view>
<view class="action" data-modal="applyExtraChargeModal" @click="hideModal">
<text class="cuIcon-close text-red"></text>
</view>
</view>
</view>
<view class="bg-white padding text-left">
<view class="text-lg padding-top flex justify-start align-center">
<text class="title-input">加价金额</text>
<input type="digit" class="radius-input inline-input" placeholder="请输入金额(订单完成或取消后原路退回此款)" v-model="moneyAmount"></input>
</view>
<view class="text-lg padding-top flex justify-start align-center">
<text class="title-input">加价原因</text>
<picker style="width: 75%;" @change="bindPickerChange" :value="chooseIndex" :range="array">
<view class="radius-input inline-input custom-input">{{array[chooseIndex]}}</view>
</picker>
</view>
<view class="text-lg padding-top flex justify-start align-center">
<text class="title-input">{{chooseIndex < 6 ? '配件费' : '施工费'}}</text>
<input type="digit" class="radius-input inline-input" placeholder="请输入该费用实际金额" v-model="extraAmount"></input>
</view>
<view>
<view class="padding-tb-sm">凭证上传</view>
<view class="grid col-3 grid-square">
<view class="bg-img" v-for="(item,index) in imgList" :key="index"
@tap="viewImage($event, imgList)" :data-url="item">
<image :src="item" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, imgList)" :data-index="index">
<text class='cuIcon-close'></text>
<view class="bg-white padding text-left">
<view class="text-lg padding-top flex justify-start align-center">
<text class="title-input">加价金额</text>
<input type="digit" class="radius-input inline-input" placeholder="请输入加价总金额" v-model="moneyAmount"></input>
</view>
<view class="text-lg padding-top flex justify-start align-center">
<text class="title-input">加价原因</text>
<picker style="width: 75%;" @change="bindPickerChange" :value="chooseIndex" :range="array">
<view class="flex justify-between align-center radius-input inline-input custom-input">
<view>{{array[chooseIndex]}}</view>
<text class="cuIcon-right"></text>
</view>
</picker>
</view>
<view class="text-lg padding-top flex justify-start align-center" v-if="array[chooseIndex].indexOf('含') > -1">
<text class="title-input">{{array[chooseIndex].split('含')[1]}}</text>
<input type="digit" class="radius-input inline-input" placeholder="请输入该费用实际金额" v-model="extraAmount"></input>
</view>
<view>
<view class="padding-tb-sm">凭证上传</view>
<view class="grid col-3 grid-square">
<view class="bg-img" v-for="(item,index) in imgList" :key="index"
@tap="viewImage($event, imgList)" :data-url="item">
<image :src="item" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, imgList)" :data-index="index">
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImage" v-if="imgList.length < 6">
<text class='cuIcon-cameraadd'></text>
</view>
</view>
<view class="solids" @tap="chooseImage" v-if="imgList.length < 1">
<text class='cuIcon-cameraadd'></text>
</view>
<view>
<view class="padding-tb-sm">申请原因</view>
<view class="solid">
<textarea style="width: 100%; height: 150rpx;" fixed="true" class="radius text-left padding-sm"
v-model="remark" maxlength="-1" :placeholder="`请输入理由或备注`"></textarea>
</view>
</view>
</view>
<view>
<view class="padding-tb-sm">申请原因</view>
<view class="solid">
<textarea style="width: 100%; height: 200rpx;" fixed="true" class="radius text-left padding-sm"
v-model="remark" maxlength="-1"></textarea>
<view style="padding-top: 10px;">
<view style="font-size: 24rpx;color: #666;white-space: pre-wrap;">
加价提示\n1加价所有费用需经系统支付加价报价以双方约定输入总价含配件类物料类的全额到你帐户银行手续费自付\n2申请加价时客户端仅看到加价总额总额内的配件类物料类金额与凭证均看不到网点与商家可见
</view>
</view>
<view class="cu-btn line-main-color margin-top-sm long-btn" v-if="hasReacord" @click="clearCurAddedPrice">
清空加价</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-black" data-modal="applyChargeModal"
@click="hideModal">{{ hasReacord ? '退出/待二次上门' : '取消'}}</view>
<view class="action margin-0 flex-sub text-main-color solid-left" data-modal="applyChargeModal" v-if="!hasReacord"
@click="submit">确认</view>
<view class="action margin-0 flex-sub text-main-color solid-left" data-modal="applyChargeModal" v-else
@click="makePayQrcode">请客户支付</view>
</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-black" data-modal="applyChargeModal"
@click="hideModal">取消</view>
<view class="action margin-0 flex-sub text-main-color solid-left" data-modal="applyChargeModal"
@click="submit">确认</view>
</view>
</view>
<pay-qrcode ref="payQrcode" :show="showPayQrcodeModal" :data="data" @finishQrPay="finishQrPay"></pay-qrcode>
</view>
</template>
<script>
import payQrcode from '@/pages/order-manage/modal/pay-qrcode.vue';
export default {
components: {payQrcode},
name: 'applyCharge',
props: {
show: {
@ -70,16 +88,40 @@
},
data() {
return {
array: ['加单加价','加急费','拆机/拆换费','搬运费','清理费','远程费','施工费','垫付金','奖励金','质保金','客户押金','工具押金','物品押金'],
// array: ['','','/','','','','','','','','','',''],
array: ['加单加价', '加急费', '加时费', '奖励金', '拆机/换机费', '搬运费', '打孔费', '额外服务费', '检查检测费', '清理费', '运输吊装费', '加价含物料费', '加价含垫付金', '加价含配件费', '加价含好评费', '加价含远程费', '加价含高空费', '加价含质保金', '加价含客户押金', '加价含工具押金', '加价含物品押金'],
chooseIndex: 0,
imgList: [],
moneyAmount: '',
reason: '1',
extraAmount: '',
remark: ''
remark: '',
hasReacord: false,
showPayQrcodeModal: false
}
},
methods: {
async initPriceData() {
const cur_reacord = await this.resetPriceChangedInfo()
if(cur_reacord) {
this.hasReacord = true
this.init(cur_reacord);
} else {
this.hasReacord = false
}
},
init(priceObj) {
console.log(priceObj);
if (!priceObj || priceObj.payStatus == 1) {
return;
}
this.moneyAmount = priceObj.changeMoney + (priceObj.attachmentMoney || 0)
this.extraAmount = priceObj.attachmentMoney;
this.remark = priceObj.remark;
this.chooseIndex = priceObj.reason ? this.array.findIndex(i => i == priceObj.reason) : 0;
this.imgList = priceObj.urls ? priceObj.urls.split(',') : []
this.priceObj = priceObj;
},
bindPickerChange(e) {
this.chooseIndex = parseInt(e.detail.value)
},
@ -93,15 +135,18 @@
sizeType: ['original', 'compressed'], //
sourceType: ['album'], //
success: (res) => {
let tempFilePaths = [];
res.tempFiles.forEach((fileObj) => {
tempFilePaths.push(fileObj.tempFilePath)
})
if (this.imgList.length != 0) {
this.imgList = this.imgList.concat(tempFilePaths)
} else {
this.imgList = tempFilePaths
}
uni.showLoading({
title: '上传中',
mask: true
});
res.tempFiles.forEach((fileObj, index) => {
this.$request.uploadFile(fileObj.tempFilePath).then((url) => {
this.imgList.push(url);
if (index === res.tempFiles.length - 1) {
uni.hideLoading();
}
});
});
}
});
},
@ -136,8 +181,19 @@
this.moneyAmount = ''
this.extraAmount = ''
this.remark = ''
this.hasReacord = false
},
async submit(e) {
const res = await this.resetPriceChangedInfo()
if (res && res.type != 1) {
uni.showToast({
icon: 'none',
title: '你有加价未付款,请客户支付后再加或在原加价上增加金额!',
duration: 2500
})
return;
}
if (!this.moneyAmount) {
uni.showToast({
title: '请输入本次加价总金额',
@ -145,14 +201,14 @@
});
return;
}
if (!this.extraAmount) {
if (this.array[this.chooseIndex].indexOf('含') > -1 && !this.extraAmount) {
uni.showToast({
title: '请输入该费用实际金额',
icon: 'none'
});
return;
}
if(this.chooseIndex === 6 && this.imgList.length === 0) {
if(this.array[this.chooseIndex].indexOf('含') > -1 && this.imgList.length === 0) {
uni.showToast({
title: '请上传凭证,至少一张',
icon: 'none'
@ -161,114 +217,110 @@
}
const num_moneyAmount = parseInt(this.moneyAmount)
const num_extraAmount = parseInt(this.extraAmount)
if(num_extraAmount > num_moneyAmount) {
if(this.array[this.chooseIndex].indexOf('含') > -1 && num_extraAmount > num_moneyAmount) {
uni.showToast({
title: '费用实际金额不能大于本次加价总金额',
icon: 'none'
});
return;
}
if(this.chooseIndex < 6 && num_moneyAmount == num_extraAmount) {
//
if(this.array[this.chooseIndex].indexOf('含') === -1) {
console.log('调用详情接口',{
orderDetailId: this.data.orderDetailId,
attachMoney: this.moneyAmount,
type: '01'
});
//
let res = await this.$request.addOrderAttach({
let res = await this.$request.changeOrderPrice({
orderDetailId: this.data.orderDetailId,
attachMoney: this.moneyAmount,
type: '01'
changeMoney: this.moneyAmount,
type: 1,
remark: this.remark,
urls: this.imgList.toString(),
reason: this.array[this.chooseIndex]
});
if (res.code === 0) {
uni.showToast({
title: '操作成功',
icon: 'success'
});
this.hideModal(e);
this.resetData()
// this.$emit('callAgain')
this.initPriceData()
}
} else if(this.chooseIndex >= 6 && num_moneyAmount == num_extraAmount) {
//
const res = await this.resetPriceChangedInfo()
if (res && res.type != 1) {
uni.showToast({
icon: 'none',
title: '你有加价未付款,请客户支付后再加或在原加价上增加金额!',
duration: 3500
})
return;
}
} else {
//
let type1_price, type2_price;
type2_price = num_extraAmount
type1_price = num_moneyAmount - num_extraAmount
console.log('调用列表接口',{
orderDetailId: this.data.orderDetailId,
changeMoney: num_moneyAmount,
changeMoney: type1_price,
type: 1,
remark: this.remark
remark: this.remark,
urls: this.imgList.toString()
});
let res1 = await this.$request.changeOrderPrice({
let res2 = await this.$request.changeOrderPrice({
orderDetailId: this.data.orderDetailId,
changeMoney: newPrice,
type: this.payAction,
remark: this.remark
changeMoney: type1_price,
type: 1,
remark: this.remark,
urls: this.imgList.toString(),
reason: this.array[this.chooseIndex]
});
if (res1 && res1.code === 0) {
uni.showToast({
icon: 'success',
title: '操作成功'
})
this.hideModal(e);
this.resetData()
}
} else if(num_moneyAmount > num_extraAmount) {
const res = await this.resetPriceChangedInfo()
if (res && res.type != 1) {
uni.showToast({
icon: 'none',
title: '你有加价未付款,请客户支付后再加或在原加价上增加金额!',
duration: 3500
})
return;
}
let type1_price, type2_price;
if(this.chooseIndex < 6) {
type1_price = num_extraAmount
type2_price = num_moneyAmount - num_extraAmount
} else {
type2_price = num_extraAmount
type1_price = num_moneyAmount - num_extraAmount
}
if (res2.code != 0) return
const newData = await this.resetPriceChangedInfo()
console.log('调用详情接口',{
orderDetailId: this.data.orderDetailId,
attachMoney: type1_price,
attachMoney: type2_price,
type: '01'
});
let res1 = await this.$request.addOrderAttach({
orderDetailId: this.data.orderDetailId,
attachMoney: type1_price,
type: '01'
attachMoney: type2_price,
type: '01',
financialChangeRecordId: newData.id,
remark: this.remark,
});
if (res1.code != 0) return
console.log('调用列表接口',{
orderDetailId: this.data.orderDetailId,
changeMoney: type2_price,
type: 1,
remark: this.remark
});
let res2 = await this.$request.changeOrderPrice({
orderDetailId: this.data.orderDetailId,
changeMoney: type2_price,
type: this.payAction,
remark: this.remark
});
if (res2.code != 0) return
uni.showToast({
icon: 'success',
title: '操作成功'
})
this.hideModal(e);
this.resetData()
// this.$emit('callAgain')
this.initPriceData()
}
},
async makePayQrcode(e) {
let res = await this.$request.priceAddedQrPay(this.data);
if (res && res.code === 0) {
this.showPayQrcodeModal = true;
this.$refs.payQrcode.showQrcode(res.data.expend.qrcode_url);
}
},
finishQrPay(e) {
this.showPayQrcodeModal = false;
// this.$emit('callAgain')
this.initPriceData()
},
async clearCurAddedPrice() {
await this.$request.deleteAttachPrice({
orderDetailId: this.data.orderDetailId
})
let res = await this.$request.changeOrderPrice({
orderDetailId: this.data.orderDetailId,
changeMoney: 0,
type: 1,
remark: '客户清空加价',
urls: '',
reason: ''
});
if (res && res.code === 0) {
uni.showToast({
icon: 'success',
title: '操作成功'
})
// this.$emit('callAgain')
this.initPriceData()
}
}
}

View File

@ -0,0 +1,207 @@
<template>
<!-- popup -->
<view>
<uni-popup ref="deliveryOrderPopup" type="bottom" @change="changePopup">
<view class="text-bold text-gray text-lg text-center left-top-sm-bar" data-popup="deliveryOrderPopup" @click="closePopup"><text
class="cuIcon-close"></text></view>
<view class="bg-white padding" style="padding-top: 74rpx; min-height: 1000rpx;">
<view class="text-xxl text-center">发货类型</view>
<radio-group class="flex padding-tb-sm flex-direction" style="gap: 10rpx">
<label @click="form.deliveryType = 1">
<radio class="main-color" :value="1" :checked="form.deliveryType === 1" /><text class="margin-left-sm">发快递/物流</text>
</label>
<view style="padding-left: 70rpx;">
<input type="text" v-model="form.trackingNumber" class="custom-input radius-input" placeholder="请输入快递/物流单号">
</view>
<label @click="form.deliveryType = 2">
<radio class="main-color" :value="2" :checked="form.deliveryType === 2"/><text class="margin-left-sm">送货上门</text>
</label>
<label @click="form.deliveryType = 3">
<radio class="main-color" :value="3" :checked="form.deliveryType === 3"/><text class="margin-left-sm">客户自提</text>
</label>
</radio-group>
<view class="text-lg text-left">出货拍照存档非必填:</view>
<view>
<div class="grid col-3 grid-square">
<view class="bg-img" v-for="(item,index) in imgList" :key="index"
@tap="viewImage($event, imgList)" :data-url="item">
<image :src="item" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, imgList)" :data-index="index">
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImage" v-if="imgList.length < 6">
<text class='cuIcon-cameraadd'></text>
</view>
</div>
</view>
<view style="margin-bottom: 10rpx;">
<textarea style="width: 100%;box-sizing: border-box;" class="custom-input radius-input" placeholder="发货备注(非必填)" cols="30" rows="10" v-model="form.deliveryRemark"></textarea>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-black" @tap="closePopup">取消</view>
<view class="action margin-0 flex-sub text-main-color solid-left" @click="Submit">确认发货</view>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
export default {
emits: ['confirmFeedback', 'close'],
props: {
show: {
type: Boolean,
default: false
},
data: {
type: Object,
default: () => {}
},
isQuicklyDelivery: {
type: String,
default: '0'
}
},
watch: {
show: {
handler(newVal) {
if(newVal) {
this.$nextTick(() => {
this.$refs.deliveryOrderPopup.open()
})
}
},
immediate: true
}
},
data() {
return {
form: {
deliveryType: 1,
deliveryRemark: '',
deliveryImages: '',
trackingNumber: ''
},
imgList: [],
clicked: false
}
},
methods: {
chooseImage(e) {
uni.chooseMedia({
count: 1, //9
mediaType: ['image'],
sizeType: ['original', 'compressed'], //
sourceType: ['album'], //
success: (res) => {
uni.showLoading({
title: '上传中',
mask: true
});
res.tempFiles.forEach((fileObj, index) => {
this.$request.uploadFile(fileObj.tempFilePath).then((url) => {
this.imgList.push(url);
if (index === res.tempFiles.length - 1) {
uni.hideLoading();
}
});
});
}
});
},
viewImage(e, imgList) {
uni.previewImage({
urls: imgList,
current: e.currentTarget.dataset.url
});
},
delImg(e, imgList) {
uni.showModal({
title: '',
content: '确定要删除这张图片吗?',
cancelText: '取消',
confirmText: '确定',
success: res => {
if (res.confirm) {
imgList.splice(e.currentTarget.dataset.index, 1)
}
}
})
},
changePopup(e) {
console.log(e);
if(!e.show) {
this.closePopup()
}
},
closePopup() {
this.$emit('close')
},
changeRadio(e) {
this.form.deliveryType = e.target.value
},
async Submit() {
if(this.clicked) return;
this.clicked = true;
if(this.form.deliveryType == 1 && !this.form.trackingNumber) {
uni.showToast({
title: '请填写物流/快递单号',
icon: 'none'
})
this.clicked = false;
return
}
const isAfterService = this.data.afterServiceRecordList && this.data.afterServiceRecordList.length !== 0
let res;
if(isAfterService && this.isQuicklyDelivery === '0') {
const updateGoodsParams = {
id: this.data.afterServiceRecordList[0].id,
workerFeedbackResult: 3, // /
workerResendType: this.form.deliveryType, // 1-/
workerResendTrackingNumber: this.form.trackingNumber, //
workerResendRemark: this.form.deliveryRemark,
workerResendImages: this.imgList.length ? this.imgList.toString() : ''
}
res = await this.$request.editAfterServiceGoodsRecord(updateGoodsParams);
} else {
//
let reqFunName = "updateOrder", id, isQuicklyDelivery;
if (this.data.orderDetailId == null) {
id = this.data.orderMasterId;
} else {
reqFunName = "updateDetailOrder";
id = this.data.orderDetailId;
isQuicklyDelivery = 1
}
const updateOrderParams = {
...this.form,
id: id,
deliveryImages: this.imgList.length ? this.imgList.toString() : ''
}
if(isQuicklyDelivery) {
updateOrderParams.isQuicklyDelivery = isQuicklyDelivery;
updateOrderParams.orderStatus = 3
}
res = await this.$request[reqFunName](updateOrderParams);
}
this.clicked = false;
if (res.code === 0) {
this.$emit('confirmFeedback')
} else {
uni.showToast({
title: '操作失败',
icon: 'none',
duration: 2000
})
}
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,70 @@
<template>
<view>
<!-- 模态框 -->
<view class="cu-modal" :class="show?'show':''">
<view class="cu-dialog">
<view class="padding-xl" style="background-color: #ffffff;">
<view class="text-bold text-lg margin-bottom-sm">物流信息</view>
<view class="cu-timeline" style="max-height: 600upx;overflow-y: auto;">
<view class="cu-item text-main-color" v-for="(item, index) in flowArr" :key="index">
<view class="content shadow-blur" style="text-align: left;padding: 15upx 20upx;">
<view><text style="color: black;">{{item.description}}</text></view>
<text style="color: #999999;font-size: 24upx;">{{item.time}}</text>
</view>
</view>
</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-black solid-left" data-modal="deliveryFlowDetail"
@tap="hideModal">关闭</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'deliveryFlowDetail',
emits: ['confirmFeedback'],
props: {
show: {
type: Boolean,
default: false
},
trackingNumber: {
type: String
}
},
watch: {
show: {
handler(newVal) {
if(newVal) {
this.$nextTick(() => {
this.getFLows()
})
}
},
immediate: true
}
},
data() {
return {
flowArr: []
}
},
methods: {
async getFLows() {
const res = await this.$request.getDeliveryFlow(this.trackingNumber)
this.flowArr = res.data.traces ? res.data.traces.reverse() : [];
},
hideModal(e) {
this.$emit('close', e);
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,271 @@
<template>
<!-- popup -->
<view>
<uni-popup ref="deliveryOrderPopup" type="bottom" @change="changePopup">
<view class="text-bold text-gray text-lg text-center left-top-sm-bar" style="position: absolute;top: 15px;right: 20px;" data-popup="deliveryOrderPopup" @click="closePopup"><text
class="cuIcon-close"></text></view>
<view class="bg-white padding" style="padding-top: 30rpx;width: 100%;">
<view class="text-center">
<text class="text-black" style="font-size: 34upx;">包安装/包服务商品安装确认</text>
</view>
<view>
<view class="solid-bottom padding-bottom-sm">
<view v-if="columnTitleArr.length" class="flex justify-between margin-tb-sm">
<view class="basis-df">{{columnTitleArr[0]}}</view>
<view class="flex justify-end text-center basis-df">
<view v-for="(title, index) in columnTitleArr" v-if="index >= 1" class="basis-df">{{title}}</view>
</view>
</view>
<view class="flex justify-between margin-tb-xs align-center" v-for="(item,index) in pickedList" :key="index">
<view class='cu-tag padding basis-lg'>{{item.goodsName}}</view>
<view class="flex justify-end basis-df text-center align-center">
<view class="basis-df">{{item.goodsNum}}</view>
<view class="basis-df">{{item.goodsNum}}
</view>
</view>
</view>
</view>
<view class="padding-top-sm padding-bottom-xs flex justify-between align-center">
<text class="margin-right-sm">本单可派服务金额<text class="text-red text-lg">{{curOrder.serverMoney}}</text></text>
</view>
<view class="padding-bottom-sm flex justify-between align-center">
<text class="margin-right-sm" style="width: 150rpx;">服务金额</text>
<input type="digit" class="line-input radius-input" v-model="dispatchTotalPrice" placeholder="请输入服务总金额 (你对服务单跟进负责)"></input>
</view>
</view>
<view class="padding-tb" v-if="serviceShop">
<view class="text-black text-bold flex justify-between">
<text>安装/服务/施工门店</text>
<text @click="goChooseShop">更多></text>
</view>
<view class="flex-sub flex margin-top-sm" @click="openShopLocation(serviceShop)">
<view style="width: 150rpx;height: 150rpx;margin-right:10px;">
<image style="width: 100%;height: 100%;" :src="serviceShop.imageUrl" mode="aspectFill"></image>
</view>
<view class="flex-sub">
<view class="text-bold" style="text-overflow: ellipsis;overflow: hidden;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 1;">
客户已选: {{serviceShop.shopName}}
</view>
<view class="padding-tb-xs" style="position: relative;">
<!-- <view class='cu-tag round bg-orange light'>
<text class="text-black" v-if="pickedProductList[0].product[0].storeService == 1">到店服务</text>
<text class="text-black" v-if="pickedProductList[0].product[0].storeService == 2">到店+配送服务</text>
<text class="text-black" v-if="pickedProductList[0].product[0].storeService == 3">到店+上门服务</text>
</view> -->
<view class="margin-lr-sm" style="display: inline-block;" v-if="serviceShop.distance">
<view class="cu-tag bg-red" style="padding: 0 2px;height: auto;">距离客户</view>
<text class="text-gray" style="vertical-align: middle;">{{serviceShop.distance}}</text>
</view>
<image src="/static/navigation.png" style="width: 50rpx;height: 50rpx;display: inline-block;position: absolute;top: 5px;right: -10px;"></image>
</view>
<view style="text-overflow: ellipsis;overflow: hidden;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 1;">{{serviceShop.provinceName + serviceShop.cityName + serviceShop.countryName + serviceShop.streetName + serviceShop.address}}</view>
<view class="flex justify-between align-center margin-bottom-xs padding-top">
<view>
<text class="text-bold text-lg margin-lr-xs">店长{{serviceShop.phone}}</text>
</view>
<button class="cu-btn line-main-color" @click.stop="makePhoneCall(serviceShop.phone)">拨打</button>
</view>
</view>
</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-black" @tap="closePopup">取消</view>
<view class="action margin-0 flex-sub text-main-color solid-left" @click="assignWork">提交</view>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
export default {
emits: ['confirmFeedback', 'close'],
props: {
show: {
type: Boolean,
default: false
},
data: {
type: Object,
default: () => {}
},
product: {
type: Object,
default: {}
},
orderType: {
type: Number,
default: 0
}
},
watch: {
show: {
handler(newVal) {
if(newVal) {
this.$nextTick(() => {
this.$refs.deliveryOrderPopup.open()
this.loadData(this.data)
})
}
},
immediate: true
}
},
data() {
return {
dispatchTotalPrice: null,
showDispatchPriceModal: false,
columnTitleArr: ['购买机型', '待派单', '派单量'],
curOrder: {},
pickedList: [],
workerName: null,
curUserInfo: null,
serviceShop: null,
serviceCancelled: null
}
},
onReady() {
uni.$on('chooseShop', this.chooseShop)
},
onUnload() {
uni.$off('chooseShop');
},
methods: {
changePopup(e) {
console.log(e);
if(!e.show) {
this.closePopup()
}
},
closePopup() {
this.$emit('close')
},
dateChange(e) {
this.date = e.detail.value;
this.changeExpectTime();
},
openShopLocation(item) {
// const gcj02Coord = wgs84ToGcj02(item.shop.longitude, item.shop.latitude)
// const gcj02Coord = wgs84ToGcj02(102.80154676649306, 24.969456922743056)
// const gcj02Coord = [102.82868680950929, 24.864792838337802]
const gcj02Coord = [item.longitude, item.latitude]
wx.openLocation({
latitude: gcj02Coord[1],
longitude: gcj02Coord[0],
scale: 18,
name: item.shopName,
address: `${item.provinceName}${item.cityName}${item.countryName}${item.streetName}${item.address}`
})
},
showModal(e) {
this[e.currentTarget.dataset.modal] = true;
},
hideModal(e) {
this[e.currentTarget.dataset.modal] = false;
},
changePiecesNum(curNum, curItem) {
curItem.toAssignNum = curNum;
},
resetData() {
this.dispatchTotalPrice = null;
this.pickedList = [];
this.curOrder = {};
this.curUserInfo = null;
},
loadData(order) {
this.resetData();
this.curUserInfo = this.$request.getCurUserInfo();
this.getCanAssignList(order);
// init defalut shop
this.initShop()
},
async getCanAssignList(order) {
//
let getOrderRes = await this.$request.getOrderMasterDetail({
id: order.orderMasterId,
});
let res = await this.$request.getCanAssignList({
orderMasterId: order.orderMasterId,
generateServiceOrder: getOrderRes.data.serviceCancelled
});
this.serviceCancelled = getOrderRes.data.serviceCancelled;
let pickedList = res.data;
this.curOrder = getOrderRes.data;
this.pickedList = pickedList;
},
async initShop() {
const {provinceName, cityName, countryName, streetName, address, serviceShopId} = this.data
let res = await this.$request.getShopDetailWithDistance({
shopId: serviceShopId,
provinceName,
cityName,
countryName,
streetName,
address
});
this.serviceShop = res.data;
},
chooseShop(shopInfo) {
this.serviceShop = shopInfo;
},
goChooseShop() {
const {provinceName, cityName, countryName, streetName, address, goodsId, goods, serviceShopId} = this.data
const addressFullObj = {
provinceName,
cityName,
countryName,
streetName,
address
}
const gotGoodsId = goods ? goods.goodsId : goodsId
uni.navigateTo({
url: '/pages/order-manage/choose-shop?goodsId='+gotGoodsId+'&addressFullObj='+JSON.stringify(addressFullObj)+'&shopId='+serviceShopId
})
},
async assignWork() {
if (this.dispatchTotalPrice) {
let res = await this.$request.allocateServiceMoney({
id: this.data.orderMasterId,
serverGoodsMoney: this.dispatchTotalPrice,
serviceShopId: this.serviceShop.shopId
});
if (res && res.code === 0) {
setTimeout(() => {
uni.showToast({
icon: 'success',
title: this.serviceCancelled == 1 ? '已安装确认' : '现已安装确认,请操作接单',
duration: 2000
})
}, 1500)
this.$emit('confirmFeedback');
return;
}
} else {
uni.showToast({
title: '请输入服务总金额',
icon: 'none'
})
}
},
makePhoneCall(customerPhone) {
uni.makePhoneCall({
phoneNumber: customerPhone
})
},
}
}
</script>
<style scoped>
.relative-view {
position: relative;
}
.input-arrow {
position: absolute;
right: 10rpx;
top: 25%;
}
</style>

View File

@ -0,0 +1,323 @@
<template>
<!-- popup -->
<view>
<uni-popup ref="deliveryOrderPopup" type="bottom" @change="changePopup">
<view class="text-bold text-gray text-lg text-center left-top-sm-bar" data-popup="deliveryOrderPopup" @click="closePopup"><text
class="cuIcon-close"></text></view>
<view class="bg-white padding" style="padding-top: 74rpx; min-height: 1000rpx;">
<view>
<view class="solid-bottom padding-bottom-sm">
<view v-if="columnTitleArr.length" class="flex justify-between margin-tb-sm">
<view class="basis-df">{{columnTitleArr[0]}}</view>
<view class="flex justify-end text-center basis-df">
<view v-for="(title, index) in columnTitleArr" v-if="index >= 1" class="basis-df">{{title}}</view>
</view>
</view>
<view class="flex justify-between margin-tb-xs align-center" v-for="(item,index) in pickedList" :key="index">
<view class='cu-tag padding basis-lg'>{{item.goodsName}}</view>
<view class="flex justify-end basis-df text-center align-center">
<view class="basis-df">{{item.goodsNum}}</view>
<view class="basis-df">
<uni-number-box :min="0" :max="item.goodsNum" v-model="item.toAssignNum" @change="changePiecesNum($event, item)">
</uni-number-box>
</view>
</view>
</view>
</view>
<view class="padding-top-sm padding-bottom-xs flex justify-between align-center">
<text class="margin-right-sm">本单可派任务金额<text class="text-red text-lg">{{curOrder.serverMoney}}</text></text>
</view>
<view class="padding-bottom-sm flex justify-between align-center">
<text class="margin-right-sm" style="width: 150rpx;">派单价格</text>
<input type="digit" class="line-input radius-input" v-model="dispatchTotalPrice" placeholder="请输入派出总额"></input>
</view>
</view>
<view class="solid-bottom padding padding-bottom-sm">
<view class="flex justify-between align-center margin-bottom-xs padding-top">
<view>
<text class="text-xxl text-main-color"><text class="cuIcon-phone"></text></text>
<text class="text-bold text-lg margin-lr-xs">{{data.customerPhone.substring(0, 3) + "****" + data.customerPhone.substring(7)}}</text>
</view>
<button class="cu-btn line-main-color" @click="makePhoneCall(data.customerPhone)">拨打</button>
</view>
<view class="text-sm">
{{orderType === 1 ? '分次发货,请输入发货日期与时间,然后在”发货预约“栏按时发货。' : '拨打电话,按与客户约定的时间填入,完成排单,未完成排单将导致排单超时!'}}
</view>
</view>
<view class="padding">
<view class="margin-bottom-xs">
<view class="margin-bottom-xs">选择日期</view>
<picker class="relative-view" mode="date" :value="date" :start="curDate" @change="dateChange">
<input class="radius-input" v-model="date" disabled>
<view class="text-lg input-arrow"><text class="cuIcon-triangledownfill"></text></view>
</input>
</picker>
</view>
<view>
<view class="margin-bottom-xs">选择时间</view>
<view class="flex justify-start align-center">
<picker class="relative-view" :class="disableTime ? 'readonlyPicker' : ''" mode="selector" :value="timeIndex" :range="timeList"
@change="timeChange" @click="showTime">
<input class="custom-input radius-input" v-model="time" disabled>
<view class="text-lg input-arrow"><text class="cuIcon-triangledownfill"></text></view>
</input>
</picker>
<text class="margin-lr-xs"></text>
<picker class="relative-view" :class="!disableTime ? 'readonlyPicker' : ''" mode="selector" :value="timeRangeIndex" :range="timeRangeList"
@change="timeRangeChange" @click="showDuration">
<input class="custom-input radius-input" v-model="timeRange" disabled>
<view class="text-lg input-arrow"><text class="cuIcon-triangledownfill"></text></view>
</input>
</picker>
</view>
</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-black" @tap="closePopup">取消</view>
<view class="action margin-0 flex-sub text-main-color solid-left" @click="assignWork">提交</view>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
export default {
emits: ['confirmFeedback', 'close'],
props: {
show: {
type: Boolean,
default: false
},
data: {
type: Object,
default: () => {}
},
product: {
type: Object,
default: {}
},
orderType: {
type: Number,
default: 0
}
},
watch: {
show: {
handler(newVal) {
if(newVal) {
this.$nextTick(() => {
this.$refs.deliveryOrderPopup.open()
this.loadData(this.data)
})
}
},
immediate: true
}
},
data() {
return {
dispatchTotalPrice: null,
showDispatchPriceModal: false,
columnTitleArr: ['购买机型', '待派单', '派单量'],
curOrder: {},
pickedList: [],
workerName: null,
curUserInfo: null,
date: null,
time: null,
timeList: [],
timeIndex: 0,
timeRangeList: [],
timeRange: null,
timeRangeIndex: 0,
expectTimeStart: null,
expectTimeEnd: null,
disableTime: false
}
},
onReady() {
this.timeRangeList = this.$globalData.timeRangeList;
this.timeList = this.$globalData.timeList;
},
methods: {
changePopup(e) {
console.log(e);
if(!e.show) {
this.closePopup()
}
},
closePopup() {
this.$emit('close')
},
dateChange(e) {
this.date = e.detail.value;
this.changeExpectTime();
},
showTime() {
this.disableTime = false;
},
showDuration() {
this.disableTime = true;
},
timeChange(e) {
this.timeIndex = e.detail.value;
this.time = this.timeList[this.timeIndex];
this.timeRange = null;
this.changeExpectTime();
},
timeRangeChange(e) {
this.timeRangeIndex = e.detail.value;
this.timeRange = this.timeRangeList[this.timeRangeIndex];
this.time = null;
this.changeExpectTime();
},
changeExpectTime() {
let time = this.time != null ? this.time : this.timeRange;
if (time != null) {
let timeRangeSplit = this.$globalData.timeRangeSplit;
let timeArr = time.split(timeRangeSplit);
this.expectTimeStart = this.date + ' ' + timeArr[0] + ':00';
this.expectTimeEnd = this.date + ' ' + timeArr[1] + ':00';
}
},
showModal(e) {
this[e.currentTarget.dataset.modal] = true;
},
hideModal(e) {
this[e.currentTarget.dataset.modal] = false;
},
changePiecesNum(curNum, curItem) {
curItem.toAssignNum = curNum;
},
resetData() {
this.dispatchTotalPrice = null;
this.pickedList = [];
this.curOrder = {};
this.curUserInfo = null;
this.date = null;
this.time = null;
this.timeRange = null;
this.timeRangeIndex = 0;
this.expectTimeStart = null,
this.expectTimeEnd = null;
},
loadData(order) {
this.resetData();
this.curUserInfo = this.$request.getCurUserInfo();
this.getCanAssignList(order);
},
async getCanAssignList(order) {
//
let getOrderRes = await this.$request.getOrderMasterDetail({
id: order.orderMasterId
});
let res = await this.$request.getCanAssignList({
orderMasterId: order.orderMasterId
});
let pickedList = res.data;
this.curOrder = getOrderRes.data;
this.pickedList = pickedList;
},
assignWork() {
let goodsToAssign = [];
// goods10
let isAll = 1;
this.pickedList.forEach((item) => {
if (item.toAssignNum && item.goodsNum !== item.toAssignNum) {
isAll = 0;
}
if (item.toAssignNum) {
goodsToAssign.push({
goodsStandardId: item.goodsStandardId,
num: item.toAssignNum
})
}
});
if (goodsToAssign.length > 0) {
if (this.dispatchTotalPrice) {
if (!(this.time || this.timeRange)) {
uni.showToast({
title: '请选择预约时间',
icon: 'none'
})
return;
}
this.UpdateTime()
let params = {
goodsList: goodsToAssign,
workerId: this.curUserInfo.workerId,
totalPay: this.dispatchTotalPrice,
orderMasterId: this.curOrder.orderMasterId,
isAll: isAll,
workerName: this.curUserInfo.realName
}
this.$emit('assignWork', params);
} else {
uni.showToast({
title: '请填写派单价格',
icon: 'none'
})
}
} else {
uni.showToast({
title: '请至少选择一种规格',
icon: 'none'
})
}
},
makePhoneCall(customerPhone) {
uni.makePhoneCall({
phoneNumber: customerPhone
})
},
async UpdateTime() {
const datetimeArr = [this.expectTimeStart, this.expectTimeEnd];
let reqFunName = "updateOrder", id;
if (this.data.orderDetailId == null) {
id = this.data.orderMasterId;
} else {
reqFunName = "updateDetailOrder";
id = this.data.orderDetailId;
}
//
let params = datetimeArr && datetimeArr.length > 1 ? {
id: id,
expectTimeStart: datetimeArr[0],
expectTimeEnd: datetimeArr[1],
useTimeNotRange: datetimeArr[1] == null ? true : false
} : {
id: id,
revTime: datetime
}
let res = await this.$request[reqFunName](params);
if (res.code === 0) {
this.$emit('confirmFeedback')
} else {
uni.showToast({
title: '操作失败',
icon: 'none',
duration: 2000
})
}
}
}
}
</script>
<style scoped>
.relative-view {
position: relative;
}
.input-arrow {
position: absolute;
right: 10rpx;
top: 25%;
}
</style>

View File

@ -14,8 +14,8 @@
</view>
<button class="cu-btn line-main-color" @click="makePhoneCall(data.customerPhone)">拨打</button>
</view>
<view class="text-sm">
拨打电话按与客户约定的时间填入完成排单未完成排单将导致排单超时
<view class="text-sm">
{{ orderType === 1 ? '修改或重排发货时间,需与客户协商一致并同意,否则引起客诉你负全责。' : '拨打电话,按与客户约定的时间填入,完成排单,未完成排单将导致排单超时!'}}
</view>
</view>
<view class="padding">
@ -57,7 +57,7 @@
</label>
<label class="radio">
<radio style="transform:scale(0.7)" class="main-color" value="master" />
<text>师傅原因</text>
<text>{{orderType === 1 ? '商家原因' : '师傅原因'}}</text>
</label>
</radio-group>
</view>
@ -68,7 +68,7 @@
</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-black" data-modal="showEditTimeArrangeModal" @click="cannotArrangeTime">无法排单</view>
<view class="action margin-0 flex-sub text-black" data-modal="showEditTimeArrangeModal" @click="cannotArrangeTime">{{orderType === 1 ? '取消' : '无法排单'}}</view>
<view class="action margin-0 flex-sub text-main-color solid-left" data-modal="showEditTimeArrangeModal"
@click="arrangeTime">确认</view>
</view>
@ -96,6 +96,10 @@
ifRollback2WS: {
type: Boolean,
default: false
},
orderType: {
type: Number,
default: 0
}
},
data() {
@ -165,7 +169,11 @@
},
cannotArrangeTime(e) {
this.resetData();
this.$emit('showArrangeFailTime', e)
if(this.orderType === 1) {
this.hideModal(e)
} else {
this.$emit('showArrangeFailTime', e)
}
},
async arrangeTime(e) {
if (!(this.time || this.timeRange)) {

View File

@ -0,0 +1,153 @@
<template>
<!-- popup -->
<view>
<uni-popup ref="deliveryOrderPopup" type="bottom" @change="changePopup">
<view class="text-bold text-gray text-lg text-center left-top-sm-bar" data-popup="deliveryOrderPopup" @click="closePopup"><text
class="cuIcon-close"></text></view>
<view class="bg-white padding" style="padding-top: 74rpx; min-height: 1000rpx;">
<view class="text-xxl text-center">交货记录</view>
<view class="text-lg text-left">上传交货照片非必填:</view>
<view>
<div class="grid col-3 grid-square">
<view class="bg-img" v-for="(item,index) in imgList" :key="index"
@tap="viewImage($event, imgList)" :data-url="item">
<image :src="item" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, imgList)" :data-index="index">
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImage" v-if="imgList.length < 6">
<text class='cuIcon-cameraadd'></text>
</view>
</div>
</view>
<view class="text-lg text-left">备注:</view>
<view style="margin-bottom: 10rpx;">
<textarea style="width: 100%;box-sizing: border-box;" class="custom-input radius-input" placeholder="温馨提示:服务过程中有分歧存在客诉隐患或未能及时处理彻底的,请急报说明情况,将由平台客服一起协调沟通,否则造成你有责任的客诉将不利于服务评价。" cols="30" rows="10" v-model="form.handoverRemark"></textarea>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-black" @tap="closePopup">取消</view>
<view class="action margin-0 flex-sub text-main-color solid-left" @click="Submit">提交</view>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
export default {
emits: ['confirmFeedback', 'close'],
props: {
show: {
type: Boolean,
default: false
},
data: {
type: Object,
default: () => {}
}
},
watch: {
show: {
handler(newVal) {
if(newVal) {
this.$nextTick(() => {
this.$refs.deliveryOrderPopup.open()
})
}
},
immediate: true
}
},
data() {
return {
form: {
handoverRemark: '',
handoverImages: '',
},
imgList: [],
}
},
methods: {
chooseImage(e) {
uni.chooseMedia({
count: 1, //9
mediaType: ['image'],
sizeType: ['original', 'compressed'], //
sourceType: ['album'], //
success: (res) => {
uni.showLoading({
title: '上传中',
mask: true
});
res.tempFiles.forEach((fileObj, index) => {
this.$request.uploadFile(fileObj.tempFilePath).then((url) => {
this.imgList.push(url);
if (index === res.tempFiles.length - 1) {
uni.hideLoading();
}
});
});
}
});
},
viewImage(e, imgList) {
uni.previewImage({
urls: imgList,
current: e.currentTarget.dataset.url
});
},
delImg(e, imgList) {
uni.showModal({
title: '',
content: '确定要删除这张图片吗?',
cancelText: '取消',
confirmText: '确定',
success: res => {
if (res.confirm) {
imgList.splice(e.currentTarget.dataset.index, 1)
}
}
})
},
changePopup(e) {
console.log(e);
if(!e.show) {
this.closePopup()
}
},
closePopup() {
this.$emit('close')
},
async Submit() {
//
let reqFunName = "updateOrder", id;
if (this.data.orderDetailId == null) {
id = this.data.orderMasterId;
} else {
reqFunName = "updateDetailOrder";
id = this.data.orderDetailId;
}
const updateOrderParams = {
...this.form,
id: id,
handoverImages: this.imgList.length ? this.imgList.toString() : ''
}
let res = await this.$request[reqFunName](updateOrderParams);
if (res.code === 0) {
this.$emit('confirmFeedback')
} else {
uni.showToast({
title: '操作失败',
icon: 'none',
duration: 2000
})
}
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,70 @@
<template>
<view>
<!-- 模态框 -->
<view class="cu-modal" :class="show?'show':''">
<view class="cu-dialog">
<view class="padding-xl" style="text-align: left;">
<view class="text-bold text-lg margin-bottom-sm">本订单属指定保险全程保障的订单</view>
<view>1本订单已打通保险系统根据接单人员信息自动生效保险保单(立即生效)</view>
<view>2确保上门人员与系统接单人员为同一人,便能成功将上门人员纳入保险系统承保</view>
<view>3接单后需派单下级人员 (或改派换人)下级需进系统接单其保险方能生效! </view>
<view style="font-size: 15px;padding-top: 20rpx;">雇佣保险{{data.insuranceManager.insuranceName}}<text class="text-main-color" style="margin-left: 20rpx;" @click="goInfo(data.insuranceManager.insuranceUrl)">详情条款</text></view>
<view style="padding-top: 20rpx;">
<checkbox style="transform:scale(0.6)" class="main-color" :checked="true" disabled>
</checkbox>
<text class="margin-left-xs">
<text class="text-red">如未按规则办理心存侥幸导致上门人员脱保将负全责!</text>
</text>
</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-main-color" data-modal="showAcceptOrderNoticeModal"
@click="hideModal">同意/确认</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'acceptOrderNotice',
emits: ['close'],
props: {
show: {
type: Boolean,
default: false
},
data: {
type: Object,
default: () => {}
}
},
data() {
return {
}
},
methods: {
hideModal() {
this.$emit('close');
},
goInfo(url) {
uni.setClipboardData({
data: url,
success: () => {
uni.showToast({
icon: 'none',
title: '链接已复制,请在浏览器打开'
});
},
fail(e) {
console.log(e);
}
});
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,201 @@
<template>
<view>
<!-- 模态框 -->
<view class="cu-modal" :class="show?'show':''">
<view class="cu-dialog">
<view class="padding-xl" style="text-align: left;" v-if="data.orderDetailId">
<view class="text-bold text-lg margin-bottom-sm">本订单属全程保险保障订单</view>
<view class="text-red" style="padding-bottom: 10rpx;">本单所有同行人员 (师傅/徒弟/随行)未在系统有账号的接单人员均需填写保险承保信息!
</view>
<view class="oneStaff solid-top" v-for="item in showList" :key="item.phone">
<view class="oneLine">
<view>
<text>同行人员姓名:</text>
<view style="margin-top: 10rpx">
{{item.name}}
</view>
</view>
<view>
<text>同行人员联系号码:</text>
<view style="margin-top: 10rpx">
{{item.phone}}
</view>
</view>
</view>
<view style="padding-top: 10rpx;">
<text>身份证号码:</text>
<view style="margin-top: 10rpx">
{{item.idCardNum}}
</view>
</view>
<view class="tag">保险已生效</view>
</view>
<view class="oneStaff solid-top">
<view class="oneLine">
<view>
<text>同行人员姓名:</text>
<view style="margin-top: 10rpx">
<input class="radius-input inline-input" type="text" placeholder="输入真实姓名"
v-model="oneData.name">
</view>
</view>
<view>
<text>同行人员联系号码:</text>
<view style="margin-top: 10rpx">
<input class="radius-input inline-input" type="text" placeholder="必须本人号码"
v-model="oneData.phone">
</view>
</view>
</view>
<view style="padding-top: 10rpx;">
<text>身份证号码:</text>
<view style="margin-top: 10rpx">
<input class="radius-input inline-input" type="text" placeholder="请输入身份证号码并反复确认无误"
v-model="oneData.idCardNum">
</view>
</view>
</view>
<view style="text-align: center;padding: 10rpx 0;">
<text class="text-main-color" @click="submitAdd">添加同行人员+</text>
</view>
<view style="padding-top: 20rpx;">
<checkbox style="transform:scale(0.6)" class="main-color" :checked="true" disabled>
</checkbox>
<text class="margin-left-xs">
<text class="text-red">未录入者/与订单无关者一律不得上门根据法律法规以上资料必须实真有效且无误方能被保险承保</text>
</text>
</view>
</view>
<view class="padding-xl" style="text-align: left;" v-else>
<view class="text-bold text-lg margin-bottom-sm">本订单属全程保险保障订单</view>
<view>本订单指定全程保险但凡有随行人员均需录入增员信息以纳入保险承保排单后请在待上门进行中状态点保险增员按键操作订单指派下级人员的下级接单人员亦可同样操作</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-main-color"
data-modal="showAcceptOrderNoticeModal" @click="hideModal">退出页面</view>
<!-- <view v-else class="action margin-0 flex-sub text-main-color"
data-modal="showAcceptOrderNoticeModal" @click="hideModal">我已知晓</view> -->
</view>
</view>
</view>
</view>
</template>
<script>
import validRule from '@/common/js/validate.js'
export default {
name: 'acceptOrderNotice',
emits: ['close'],
props: {
show: {
type: Boolean,
default: false
},
data: {
type: Object,
default: () => {}
}
},
data() {
return {
oneData: {
name: "",
phone: "",
idCardNum: ""
},
showList: []
}
},
methods: {
hideModal() {
this.$emit('close');
},
async initData() {
let res = await this.$request.insuranceUserList({
orderDetailId: this.data.orderDetailId
})
this.showList = res.rows
},
async submitAdd() {
if (!this.oneData.name) {
uni.showToast({
title: '请输入姓名',
icon: 'none',
duration: 2000
})
return
}
if (!validRule.validPhone(this.oneData.phone)) {
uni.showToast({
title: '请输入手机号码',
icon: 'none',
duration: 2000
})
return
}
if (!validRule.validIdCard(this.oneData.idCardNum)) {
uni.showToast({
title: '请输入正确的身份证号码',
icon: 'none',
duration: 2000
})
return
}
uni.showToast({
title: '保险生成中,可能需要几秒或最多三分钟,请等待!', //
icon: 'none', // 'none'
duration: 10 * 60 * 1000,
});
// 510121198705063377
const res = await this.$request.insuranceUserAdd({
...this.oneData,
orderDetailId: this.data.orderDetailId
})
if (res.code === 0) {
uni.showToast({
title: '增员完毕,保险已生效',
icon: 'none',
duration: 2000
})
this.initData()
this.oneData = {
name: "",
phone: "",
idCardNum: ""
}
}
}
}
}
</script>
<style scoped>
.oneStaff {
padding: 20rpx 0;
position: relative;
}
.oneStaff .tag {
position: absolute;
right: 0;
bottom: 20rpx;
color: #0081ff;
}
.oneLine {
display: flex;
flex-direction: row;
gap: 10px;
}
.oneLine>view {
flex: 1;
}
.oneLine text {
padding-bottom: 10rpx;
}
</style>

View File

@ -0,0 +1,114 @@
<template>
<view>
<!-- 模态框 -->
<view class="cu-modal" :class="show?'show':''">
<view class="cu-dialog">
<view class="padding-xl" style="text-align: left;">
<view class="text-bold text-lg margin-bottom-sm">绑定本帐号保险人员信息</view>
<view class="text-red" style="padding-bottom: 10rpx;">请绑定本帐号操作者身份信息用于含保险订单的保单投保 (自动实时投保)!
</view>
<view class="oneStaff solid-top">
<view>
<text>您的姓名:</text>
<view style="margin-top: 10rpx">
<input class="radius-input inline-input" type="text" placeholder="输入真实姓名"
v-model="oneData.certName">
</view>
</view>
<view style="padding-top: 10rpx;">
<text>身份证号码:</text>
<view style="margin-top: 10rpx">
<input class="radius-input inline-input" type="text" placeholder="请输入身份证号码并反复确认无误"
v-model="oneData.certNo">
</view>
</view>
</view>
<view style="padding-top: 20rpx;">
<checkbox style="transform:scale(0.6)" class="main-color" :checked="true" disabled>
</checkbox>
<text class="margin-left-xs">
<text class="text-red">各自在自己账号上绑定即可在参与上门服务或客户作业服务过程中操作订单时会自动对接保险系统!</text>
</text>
</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-main-color"
data-modal="showAcceptOrderNoticeModal" @click="submitAdd">确认资料</view>
<!-- <view v-else class="action margin-0 flex-sub text-main-color"
data-modal="showAcceptOrderNoticeModal" @click="hideModal">我已知晓</view> -->
</view>
</view>
</view>
</view>
</template>
<script>
import validRule from '@/common/js/validate.js'
export default {
name: 'acceptOrderNotice',
emits: ['close', 'success'],
props: {
show: {
type: Boolean,
default: false
},
data: {
type: Object,
default: () => {}
}
},
data() {
return {
oneData: {
certName: "",
certNo: ""
}
}
},
methods: {
hideModal() {
this.$emit('close');
},
async submitAdd() {
if (!this.oneData.certName) {
uni.showToast({
title: '请输入姓名',
icon: 'none',
duration: 2000
})
return
}
if (!validRule.validIdCard(this.oneData.certNo)) {
uni.showToast({
title: '请输入正确的身份证号码',
icon: 'none',
duration: 2000
})
return
}
this.$emit('success', this.oneData)
}
}
}
</script>
<style scoped>
.oneStaff {
padding: 20rpx 0;
}
.oneLine {
display: flex;
flex-direction: row;
gap: 10px;
}
.oneLine>view {
flex: 1;
}
.oneLine text {
padding-bottom: 10rpx;
}
</style>

View File

@ -21,13 +21,15 @@
<view>上门有加单请客户支付</view>
<view class="flex justify-start margin-top-sm align-center">
<text>加单总额</text>
<input class="radius-input inline-input" type="digit" v-model="newPriceForA1"></input>
<text class="margin-left-xs"></text>
<view class="cu-btn line-main-color sm margin-left"
v-if="priceObj && priceObj.type == 1" @click="changeOrderPrice(newPriceForA1)">修改报价
</view>
<view class="cu-btn line-main-color sm margin-left" v-else
@click="changeOrderPrice(newPriceForA1)">确认报价</view>
<input class="radius-input inline-input" type="digit" :disabled="hadSetPriceChange" v-model="newPriceForA1"></input>
<text class="margin-left-xs"></text>
<template v-if="!hadSetPriceChange">
<view class="cu-btn line-main-color sm margin-left"
v-if="priceObj && priceObj.type == 1" @click="changeOrderPrice(newPriceForA1)">修改报价
</view>
<view class="cu-btn line-main-color sm margin-left" v-else
@click="changeOrderPrice(newPriceForA1)">确认报价</view>
</template>
</view>
</view>
</view>
@ -37,13 +39,15 @@
<view>上门报价类给现场客户的报价</view>
<view class="flex justify-start margin-top-sm align-center">
<text>报价总额</text>
<input class="radius-input inline-input" type="digit" v-model="newPriceForA2"></input>
<text class="margin-left-xs"></text>
<view class="cu-btn line-main-color sm margin-left"
v-if="priceObj && priceObj.type == 2" @click="changeOrderPrice(newPriceForA2)">修改报价
</view>
<view class="cu-btn line-main-color sm margin-left" v-else
@click="changeOrderPrice(newPriceForA2)">确认报价</view>
<input class="radius-input inline-input" type="digit" :disabled="hadSetPriceChange" v-model="newPriceForA2"></input>
<text class="margin-left-xs"></text>
<template v-if="!hadSetPriceChange">
<view class="cu-btn line-main-color sm margin-left"
v-if="priceObj && priceObj.type == 2" @click="changeOrderPrice(newPriceForA2)">修改报价
</view>
<view class="cu-btn line-main-color sm margin-left" v-else
@click="changeOrderPrice(newPriceForA2)">确认报价</view>
</template>
</view>
</view>
</view>
@ -107,7 +111,8 @@
newPriceForA1: null,
newPrice: null,
showPayQrcodeModal: false,
remark: ""
remark: "",
hadSetPriceChange: false
}
},
methods: {
@ -121,10 +126,13 @@
this.payAction = priceObj.type;
let money = priceObj.changeMoney;
if (this.payAction === 1) {
this.newPriceForA1 = money;
this.newPriceForA1 = money + (this.priceObj.attachmentMoney || 0);
} else if (this.payAction === 2) {
this.newPriceForA2 = money;
}
}
this.hadSetPriceChange = true
} else {
this.hadSetPriceChange = false
}
},
resetData() {
@ -146,7 +154,8 @@
this.init(res.data);
}
},
changePayAction(payAction) {
changePayAction(payAction) {
if(this.hadSetPriceChange) return
this.payAction = payAction;
},
async changeOrderPrice(newPrice) {
@ -202,8 +211,13 @@
goFinishOrder() {
this.$emit('finishOrder', this.data);
},
clearCurAddedPrice() {
this.changeOrderPrice(0);
async clearCurAddedPrice() {
if(this.priceObj.attachmentMoney) {
await this.$request.deleteAttachPrice({
orderDetailId: this.data.orderDetailId
})
}
this.changeOrderPrice(0)
}
}
}

View File

@ -21,12 +21,14 @@
<view>上门有加单请客户支付</view>
<view class="flex justify-start margin-top-sm align-center">
<text>加单总额</text>
<input class="radius-input inline-input" type="digit" v-model="newPriceForA1"></input>
<text class="margin-left-xs"></text>
<view class="cu-btn line-main-color sm margin-left" v-if="priceObj && priceObj.type == 1"
@click="changeOrderPrice(newPriceForA1)">修改报价</view>
<view class="cu-btn line-main-color sm margin-left" v-else
@click="changeOrderPrice(newPriceForA1)">确认报价</view>
<input class="radius-input inline-input" type="digit" :disabled="hadSetPriceChange" v-model="newPriceForA1"></input>
<text class="margin-left-xs"></text>
<template v-if="!hadSetPriceChange">
<view class="cu-btn line-main-color sm margin-left" v-if="priceObj && priceObj.type == 1"
@click="changeOrderPrice(newPriceForA1)">修改报价</view>
<view class="cu-btn line-main-color sm margin-left" v-else
@click="changeOrderPrice(newPriceForA1)">确认报价</view>
</template>
</view>
</view>
</view>
@ -36,12 +38,14 @@
<view>上门报价类给下单方报价</view>
<view class="flex justify-start margin-top-sm align-center">
<text>报价总额</text>
<input class="radius-input inline-input" type="digit" v-model="newPriceForA2"></input>
<text class="margin-left-xs"></text>
<view class="cu-btn line-main-color sm margin-left" v-if="priceObj && priceObj.type == 2"
@click="changeOrderPrice(newPriceForA2)">修改报价</view>
<view class="cu-btn line-main-color sm margin-left" v-else
@click="changeOrderPrice(newPriceForA2)">确认报价</view>
<input class="radius-input inline-input" type="digit" :disabled="hadSetPriceChange" v-model="newPriceForA2"></input>
<text class="margin-left-xs"></text>
<template v-if="!hadSetPriceChange">
<view class="cu-btn line-main-color sm margin-left" v-if="priceObj && priceObj.type == 2"
@click="changeOrderPrice(newPriceForA2)">修改报价</view>
<view class="cu-btn line-main-color sm margin-left" v-else
@click="changeOrderPrice(newPriceForA2)">确认报价</view>
</template>
</view>
</view>
</view>
@ -104,7 +108,8 @@
newPriceForA1: null,
newPrice: null,
showPayQrcodeModal: false,
remark: ""
remark: "",
hadSetPriceChange: false
}
},
methods: {
@ -118,11 +123,15 @@
this.payAction = priceObj.type;
let money = priceObj.changeMoney;
if (this.payAction === 1) {
this.newPriceForA1 = money;
this.newPriceForA1 = money + (this.priceObj.attachmentMoney || 0);
} else if (this.payAction === 2) {
this.newPriceForA2 = money;
}
this.hadSetPriceChange = true
} else {
this.hadSetPriceChange = false
}
console.log(this.hadSetPriceChange);
},
resetData() {
this.payAction = 0;
@ -144,6 +153,7 @@
}
},
changePayAction(payAction) {
if(this.hadSetPriceChange) return
this.payAction = payAction;
},
async directlyFinish(e) {
@ -174,7 +184,8 @@
changeMoney: newPrice,
type: this.payAction,
remark: this.remark
});
});
if (res && res.code === 0) {
uni.showToast({
icon: 'success',
@ -199,8 +210,13 @@
goFinishOrder() {
this.$emit('finishOrder', this.data);
},
clearCurAddedPrice() {
this.changeOrderPrice(0);
async clearCurAddedPrice() {
if(this.priceObj.attachmentMoney) {
await this.$request.deleteAttachPrice({
orderDetailId: this.data.orderDetailId
})
}
this.changeOrderPrice(0)
}
}
}

View File

@ -0,0 +1,154 @@
<template>
<!-- popup -->
<view>
<uni-popup ref="reFinishPopup" type="bottom" @change="changePopup">
<view class="text-bold text-gray text-lg text-center left-top-sm-bar" data-popup="reFinishPopup" @click="closePopup"><text
class="cuIcon-close"></text></view>
<view class="bg-white padding" style="padding-top: 74rpx; min-height: 1000rpx;">
<view class="text-xxl text-center">上门重做补做提交</view>
<view class="text-lg text-left">本次售后必须确认已与客户协商一致并已处理到位严禁出现再次客诉现提交给客户验收并结单</view>
<view>
<div class="grid col-3 grid-square">
<view class="bg-img" v-for="(item,index) in imgList" :key="index"
@tap="viewImage($event, imgList)" :data-url="item">
<image :src="item" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, imgList)" :data-index="index">
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImage" v-if="imgList.length < 6">
<text class='cuIcon-cameraadd'></text>
</view>
</div>
</view>
<view style="margin-bottom: 10rpx;">
<textarea style="width: 100%;box-sizing: border-box;" class="custom-input radius-input" placeholder="请输入理由或备注" cols="30" rows="10" v-model="form.redoCompleteRemark"></textarea>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-black" @tap="closePopup">取消</view>
<view class="action margin-0 flex-sub text-main-color solid-left" @click="Submit">确认</view>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
export default {
emits: ['confirmFeedback', 'close'],
props: {
show: {
type: Boolean,
default: false
},
curOrder: {
type: Object,
default: () => {}
}
},
watch: {
show: {
handler(newVal) {
if(newVal) {
this.$nextTick(() => {
this.$refs.reFinishPopup.open()
})
}
},
immediate: true
}
},
data() {
return {
form: {
redoCompleteRemark: '',
redoCompleteImages: '',
},
imgList: [],
}
},
methods: {
chooseImage(e) {
uni.chooseMedia({
count: 1, //9
mediaType: ['image'],
sizeType: ['original', 'compressed'], //
sourceType: ['album'], //
success: (res) => {
uni.showLoading({
title: '上传中',
mask: true
});
res.tempFiles.forEach((fileObj, index) => {
this.$request.uploadFile(fileObj.tempFilePath).then((url) => {
this.imgList.push(url);
if (index === res.tempFiles.length - 1) {
uni.hideLoading();
}
});
});
}
});
},
viewImage(e, imgList) {
uni.previewImage({
urls: imgList,
current: e.currentTarget.dataset.url
});
},
delImg(e, imgList) {
uni.showModal({
title: '',
content: '确定要删除这张图片吗?',
cancelText: '取消',
confirmText: '确定',
success: res => {
if (res.confirm) {
imgList.splice(e.currentTarget.dataset.index, 1)
}
}
})
},
changePopup(e) {
console.log(e);
if(!e.show) {
this.closePopup()
}
},
closePopup() {
this.$emit('close')
},
changeRadio(e) {
this.form.deliveryType = e.target.value
},
async Submit() {
const updateOrderParams = {
id: this.curOrder.afterServiceRecordList[0].id,
workerFeedbackResult: 3,
redoCompleteRemark: this.form.redoCompleteRemark,
redoCompleteImages: this.imgList.length ? this.imgList.toString() : ''
}
let res = await this.$request.editAfterServiceRecord(updateOrderParams)
if (res.code === 0) {
uni.showToast({
icon: 'success',
title: '提交成功',
duration: 1000
})
this.$emit('confirmFeedback')
} else {
uni.showToast({
title: '操作失败',
icon: 'none',
duration: 2000
})
}
}
}
}
</script>
<style>
</style>

View File

@ -10,7 +10,7 @@
<view class="padding text-left">
<view>
<view class="flex justify-start">
<view>原因选择</view>
<view><text class="text-red">*</text>原因选择</view>
<radio-group @change="changeReasonRadio">
<label class="radio margin-right-sm">
<radio style="transform:scale(0.7)" class="main-color" value="1" :checked="data.reasonType === 1"/>
@ -29,7 +29,7 @@
<view class="margin-top">
<textarea style="width: 100%; height: 200rpx;" class="solid radius text-left padding-sm"
v-model="remark" maxlength="-1"
placeholder="请输入具体原因或直接同意,更改到帐金额需与客户协商一致,否则可能被拒绝或引起客诉升级"></textarea>
placeholder="拒绝原因:发生纠纷,建议了解清楚客户诉求,积极协商和平处理(让客户撤单更佳)。否则升级重大客诉可能被平台处罚!确实属客户问题且无法协商请输入具体情况!"></textarea>
</view>
</view>
<!-- 上传图片 -->
@ -42,7 +42,7 @@
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImgList(e, imgList)" v-if="imgList.length < 3">
<view class="solids" @click.stop="chooseImgList(e, imgList)" v-if="imgList.length < 3">
<text class='cuIcon-cameraadd'></text>
</view>
</view>
@ -67,7 +67,7 @@
},
data: {
type: Object,
default: {}
default: () => {}
}
},
data() {
@ -132,19 +132,20 @@
})
},
async submit(e) {
let imgObjList = [];
this.imgList.forEach(url => {
imgObjList.push({
imgUrl: url,
imgUploadBy: 2
if(!this.remark) {
uni.showToast({
icon: 'none',
duration: 3000,
title: '请输入拒绝原因'
})
})
return
}
let res = await this.$request.editAfterServiceRecord({
id: this.data.afterServiceRecordList[0].id,
workerFeedbackReasonType: this.reasonType,
workerFeedbackReason: this.remark,
workerFeedbackResult: 0,
imgsList: imgObjList,
workerFeedbackImages: this.imgList.length ? this.imgList.toString() : '',
updateBy: 2
});
if (res && res.code === 0) {

View File

@ -34,7 +34,7 @@
default: false
},
arr: {
type: Object,
type: Array,
default: () => []
}
},

View File

@ -14,8 +14,8 @@
</view>
<button class="cu-btn line-main-color" @click="makePhoneCall(data)">拨打</button>
</view>
<view class="text-sm">
拨打电话按与客户约定的时间填入完成排单未完成排单将导致排单超时
<view class="text-sm">
{{orderType === 0 ? '拨打电话,按与客户约定的时间填入,完成排单,未完成排单将导致排单超时!' : '需排货的,请输入发货日期与发货时间,发货期将同步通知客户,系统会提醒您发货!'}}
</view>
</view>
<view class="padding">
@ -48,9 +48,10 @@
</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action margin-0 flex-sub text-black" @click="cannotArrangeTime">无法排单</view>
<view class="action margin-0 flex-sub text-black" @click="cannotArrangeTime" v-if="orderType === 0">无法排单</view>
<view class="action margin-0 flex-sub text-black" data-modal="showTimeArrangeModal" @click="eightClockDelivery" v-if="orderType === 1">今日20点前发货</view>
<view class="action margin-0 flex-sub text-black solid-left" data-modal="showTimeArrangeModal"
@click="hideModal">按原时间上门</view>
@click="hideModal" v-if="orderType === 0">按原时间上门</view>
<view class="action margin-0 flex-sub text-main-color solid-left" data-modal="showTimeArrangeModal"
@click="arrangeTime">确认</view>
</view>
@ -74,6 +75,10 @@
curDate: {
type: String,
default: ''
},
orderType: {
type: Number,
default: 0
}
},
data() {
@ -156,6 +161,14 @@
this.$emit('editServTime', this.data.orderMasterId, [this.expectTimeStart, this.expectTimeEnd], false, this.data);
this.hideModal(e);
},
eightClockDelivery(e) {
let nowDate = new Date();
const today = nowDate.getFullYear() + '-' + (nowDate.getMonth() + 1) + '-' + nowDate.getDate()
const expectStart = today + ' 19:00:00';
const expectEnd = today + ' 20:00:00';
this.$emit('editServTime', this.data.orderMasterId, [expectStart, expectEnd], false, this.data);
this.hideModal(e);
},
makePhoneCall(order) {
if (order.orderDetailId == null) {
this.$request.callCustomer({

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
<!-- 顶部操作条 -->
<cu-custom :bgColor="'bg-main-color'" :isBack="true">
<block slot="backText">返回</block>
<block slot="content">接收的任务</block>
<block slot="content">服务订单</block>
</cu-custom>
<view class="sticky-bar" :style="[{top: stickyTop + 'px'}]">
<!-- 条件筛选栏 -->
@ -97,8 +97,11 @@
<view class="flex justify-between">
<view class="text-lg text-bold text-cut">{{order.goodsName}}</view>
<!-- 不同状态订单使用不同角标 -->
<view v-if="([2, 5].indexOf(stateCur) >= 0 || tabCur === 4) && order.orderDetailId == null" class="right-tag padding-lr-sm padding-tb-xs bg-orange"></view>
<view v-else-if="order.orderStatus === 0" class="right-tag padding-lr-sm padding-tb-xs bg-cyan"></view>
<template v-if="order.orderStatus === 0" >
<view v-if="order.orderDetailId == null" class="right-tag padding-lr-sm padding-tb-xs bg-cyan"></view>
<view v-else class="right-tag padding-lr-sm padding-tb-xs bg-cyan"></view>
</template>
<view v-else-if="([2, 5].indexOf(stateCur) >= 0 || tabCur === 4) && order.isMonitoredOrder" class="right-tag padding-lr-sm padding-tb-xs bg-orange"></view>
<view v-else-if="order.orderStatus === 1" class="right-tag padding-lr-sm padding-tb-xs bg-main-color"></view>
<view v-else-if="order.orderStatus === 2" class="right-tag padding-lr-sm padding-tb-xs bg-yellow"></view>
<view v-else-if="order.orderStatus === 3" class="right-tag padding-lr-sm padding-tb-xs bg-purple"></view>
@ -120,17 +123,25 @@
<view v-if="order.changeMoney || order.payStatus != 1" class='cu-tag margin-right-xs radius line-red margin-top-xs'>有待付款</view>
<view v-else class='cu-tag margin-right-xs radius line-red margin-top-xs'>款已付清</view>
</template>
<template v-if="order.insuranceId">
<view class='cu-tag margin-right-xs radius line-main-color margin-top-xs' v-if="order.orderStatus === 0">保险预备中</view>
<view class='cu-tag margin-right-xs radius line-main-color margin-top-xs' v-else-if="[1,2,3,4].includes(order.orderStatus)">保险已生效</view>
<view class='cu-tag margin-right-xs radius line-main-color margin-top-xs' v-else>保险已完结</view>
</template>
</view>
<view>
<view v-if="order.timeout == 1" class="float-left">
<view v-if="order.orderStatus === 0" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未接单</view>
<view v-else-if="order.orderStatus === 1 && order.isCall === '1'" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未预约</view>
<view v-else-if="order.orderStatus === 1 && order.isCall === '01'" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未预约</view>
<view v-else-if="order.orderStatus === 1 && order.isCall === '02'" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未排单</view>
<view v-else-if="order.orderStatus === 1 && order.orderDetailId != null" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未预约</view>
<view v-else-if="order.orderStatus === 2" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未上门</view>
<view v-else-if="order.orderStatus === 3" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未完单</view>
</view>
<view class="float-left" v-if="order.afterTimeout == 1 && (order.orderDetailId != null || tabCur === 4)">
<view class='cu-tag margin-right-xs radius line-red margin-top-xs'>售后超时</view>
</view>
<!-- <view class="float-left" v-else-if="order.orderTimeoutRecords" v-for="(timeoutRecord, recordIndex) in order.orderTimeoutRecords">
<view v-if="timeoutRecord.orderStatus === 0" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未接单</view>
<view v-else-if="timeoutRecord.orderStatus === 1" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未预约</view>
@ -139,21 +150,31 @@
</view> -->
</view>
<view class="float-left" v-for="(afterServiceRecord, afterServiceRecordIndex) in order.afterServiceRecordList" :key="afterServiceRecord.id">
<view v-if="afterServiceRecord.createBy && !afterServiceRecord.updateBy" class='cu-tag margin-right-xs radius line-red margin-top-xs'>售后发起中</view>
<template v-if="afterServiceRecord.customerFinalCheck === null && afterServiceRecord.customerReasonType">
<view v-if="afterServiceRecord.workerFeedbackResult === null" class='cu-tag margin-right-xs radius line-red margin-top-xs'>售后发起中</view>
<view v-else class='cu-tag margin-right-xs radius line-red margin-top-xs'>售后反馈中</view>
</template>
<view v-if="afterServiceRecord.workerFeedbackResult == 1 && afterServiceRecord.customerFinalCheck == null" class='cu-tag margin-right-xs radius line-main-color margin-top-xs'>售后已同意</view>
<view v-if="afterServiceRecord.workerFeedbackResult == 0 && afterServiceRecord.customerFinalCheck == null" class='cu-tag margin-right-xs radius line-red margin-top-xs'>售后已拒绝</view>
<view v-if="afterServiceRecord.customerFinalCheck == 0" class='cu-tag margin-right-xs radius line-red margin-top-xs'>售后纠纷中</view>
<view v-if="afterServiceRecord.customerFinalCheck == 1" class='cu-tag margin-right-xs radius line-main-color margin-top-xs'>售后已完成</view>
<view v-if="order.afterPlatformServiceStatus == 1" class='cu-tag margin-right-xs radius line-red margin-top-xs'>售后纠纷中</view>
<view v-if="afterServiceRecord.customerFinalCheck == 1 || afterServiceRecord.customerFinalCheck == 2" class='cu-tag margin-right-xs radius line-main-color margin-top-xs'>售后已完成</view>
</view>
<view class="float-clear"></view>
<view class="margin-top-sm">
<text class="text-main-color text-lg margin-right-xs"><text class="cuIcon-people"></text></text>
<text>姓名{{order.customerName}}</text>
<view class="margin-top-sm order-name">
<view>
<text class="text-main-color text-lg margin-right-xs"><text class="cuIcon-people"></text></text>
<text>姓名{{order.customerName}}</text>
</view>
<view v-if="order.insuranceId">
<text style="padding-right: 20rpx;">保险要求</text>
<text class="text-main-color" data-modal="showInsuranceDetail" @click="showModal($event, order)"> 详情...</text>
</view>
</view>
<view class="margin-top-sm">
<text class="text-main-color text-lg margin-right-xs"><text class="cuIcon-location"></text></text>
<text class="margin-right-xs">{{order.address}}</text>
<text class="text-lg" @tap="copyData(order.address)"><text class="cuIcon-copy"></text></text>
<text class="margin-right-xs">{{order.provinceName + order.cityName + order.countryName + order.streetName + order.address}}</text>
<text class="text-lg" @tap="copyData(order.provinceName + order.cityName + order.countryName + order.streetName + order.address)"><text class="cuIcon-copy"></text></text>
</view>
<view class="margin-top-sm">
<text class="text-main-color text-lg margin-right-xs"><text class="cuIcon-time"></text></text>
@ -189,11 +210,12 @@
<view class="margin-top-sm flex justify-start align-center" v-if="order.orderDetailId != null && tabCur === 3 && order.drawCashStatus === 0 && $dateUtil.addHours(order.workFinishTime, 1).getTime() > new Date().getTime()">
<text class="text-main-color text-lg margin-right-xs"><text class="cuIcon-time"></text></text>
<text>距完单分帐</text>
<uni-countdown :show-colon="false" :backgroundColor="'#e35b33'" :color="'#faf3f0'"
:day="$dateUtil.countDownDiff($dateUtil.addHours(order.workFinishTime, 1)).day"
:hour="$dateUtil.countDownDiff($dateUtil.addHours(order.workFinishTime, 1)).hour"
:minute="$dateUtil.countDownDiff($dateUtil.addHours(order.workFinishTime, 1)).min"
:second="$dateUtil.countDownDiff($dateUtil.addHours(order.workFinishTime, 1)).seconds">
<uni-countdown v-if="order.shareAccountCountdownEndTime" :show-colon="false" :backgroundColor="'#e35b33'" :color="'#faf3f0'"
:day="$dateUtil.countDownDiff(order.shareAccountCountdownEndTime).day"
:hour="$dateUtil.countDownDiff(order.shareAccountCountdownEndTime).hour"
:minute="$dateUtil.countDownDiff(order.shareAccountCountdownEndTime).min"
:second="$dateUtil.countDownDiff(order.shareAccountCountdownEndTime).seconds"
@timeup="reloadMasterOrderPage()">
</uni-countdown>
</view>
<view class="margin-top-sm text-red" @click="normalShowModalByRef('ledgerAccountRemark')"
@ -228,28 +250,33 @@
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm">改价</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm">转发</button> -->
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @click="showServOrderDetail(order)">查看</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showAcceptOrderNoticeModal" @click="acceptOrder($event, order, order.orderMasterId, order.orderMasterCode, 1, 'updateMasterOrder')" v-if="order.orderDetailId == null">确认接单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showAcceptOrderNoticeModal" @click="acceptOrder($event, order, order.orderDetailId, order.orderDetailCode, 1, 'updateDetailOrder')" v-else>确认接单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.orderDetailId == null" @click="rejectMasterOrder(order)">拒绝接单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-else @click="rejectDetailOrder(order)">拒绝接单</button>
<template v-if="!(order.goodsOrderMasterId && stateCur === 0)">
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showAcceptOrderNoticeModal" @click="acceptOrder($event, order, order.orderMasterId, order.orderMasterCode, 1, 'updateMasterOrder')" v-if="order.orderDetailId == null">确认接单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showAcceptOrderNoticeModal" @click="acceptOrder($event, order, order.orderDetailId, order.orderDetailCode, 1, 'updateDetailOrder')" v-else>确认接单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.orderDetailId == null" @click="rejectMasterOrder(order)">拒绝接单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-else @click="rejectDetailOrder(order)">拒绝接单</button>
</template>
</view>
<view v-if="order.orderStatus === 1 && tabCur === 0">
<view v-if="order.orderStatus === 1 && (tabCur === 0 || order.workerId == curUserInfo.workerId)">
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @click="showServOrderDetail(order)">查看</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-popup="dispatchOrderPopup" @click="getCanAssignList(order)" @tap="togglePopup($event, order)" v-show="order.orderDetailId == null">派单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @click="assignWork2MySelf(order)" v-show="order.orderDetailId == null">自己承接</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showTimeArrangeModal" @tap="showModal($event, order)">预约时间</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.orderDetailId != null" @click="rejectDetailOrder(order)">退单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showDispathToSelf" @tap="showModal($event, order)" v-show="order.orderDetailId == null">分次服务</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showTimeArrangeModal" @tap="showModal($event, order, true)">预约时间</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.orderDetailId != null" @click="rejectMasterOrderWhenAccepted(order)">{{order.masterWorkerId === order.workerId ? '退回重派' : '退单'}}</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.orderDetailId == null" @click="rejectMasterOrderWhenAccepted(order)">退单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.insuranceId" data-modal="showInsuranceRetinue" @click="insuranceRetinueAdd($event, order)">保险增员</button>
</view>
<view v-else-if="order.orderStatus === 1">
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @click="showServOrderDetail(order)">查看</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.orderDetailId != null && order.insuranceId" data-modal="showInsuranceRetinue" @click="insuranceRetinueAdd($event, order)">保险增员</button>
</view>
<view v-if="order.orderStatus === 2">
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @click="showServOrderDetail(order)">查看</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @click="makePhoneCall(order.customerPhone)">联系客户</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showEditTimeArrangeModal" @tap="showModal($event, order)" v-show="order.orderDetailId != null">修改时间</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showOnDoorNoticeModal" @tap="showModal($event, order)" v-show="order.orderDetailId != null">立即上门</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.orderDetailId != null" @click="rejectDetailOrder(order)">退单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showOnDoorNoticeModal" @tap="showModal($event, order)" v-show="order.orderDetailId != null">{{order.goods.storeService ? '立即服务' : '立即上门'}}</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.orderDetailId != null" @click="rejectMasterOrderWhenAccepted(order)">{{order.masterWorkerId === order.workerId ? '退回重派' : '退单'}}</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.orderDetailId != null && order.insuranceId" data-modal="showInsuranceRetinue" @click="insuranceRetinueAdd($event, order)">保险增员</button>
</view>
<view v-if="order.orderStatus === 3">
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @click="showServOrderDetail(order)">查看</button>
@ -263,22 +290,25 @@
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showEditTimeArrangeModal" @tap="showModal($event, order)" v-show="order.orderDetailId != null">重新排期</button>
<!-- <button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @tap="finishOrder(order)" v-if="order.payStatus === 1" v-show="order.orderDetailId != null">发起完单</button> -->
<!-- <button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showPayQrcodeModal" v-if="order.payStatus === 0" @tap="makePayQrcode($event, order)" v-show="order.orderDetailId != null">生成收款码</button> -->
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.orderDetailId != null" @click="rejectDetailOrder(order)">退单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.orderDetailId != null" @click="rejectMasterOrderWhenAccepted(order)">{{order.masterWorkerId === order.workerId ? '退回重派' : '退单'}}</button>
</view>
<view v-if="order.orderStatus === 4 || order.orderStatus === 5">
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @click="showServOrderDetail(order)">查看</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @click = "changePrice($event, order)" data-ref="newServPriceOffline" data-modal="showNewServPriceOfflineModal" v-show="order.orderDetailId != null && order.clockInLocation && order.payType === 1 && order.consultMode === '01'">报价/完单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @click = "changePrice($event, order)" data-ref="newServPriceOnline" data-modal="showNewServPriceOnlineModal" v-show="order.orderDetailId != null && order.clockInLocation && order.payType === 0 && order.consultMode === '01'">报价/完单</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" v-if="order.drawCashStatus !== 1" @click="serveringReturn(order)">提交退回</button>
</view>
<!-- <view v-if="order.orderStatus === 'afterSaleService'">
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" @tap="makePhoneCall(order.customerPhone)">联系客户</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm" data-modal="showEditTimeArrangeModal" @tap="showModal($event, order)">修改时间</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm">立即上门</button>
<button class="cu-btn bg-main-color margin-right-xs shadow-blur margin-top-sm">立即服务</button>
</view> -->
<view v-if="order.afterServiceRecordList && order.afterServiceRecordList.length && order.orderDetailId != null" class="bg-white margin-top-sm">
<view v-if="order.showAfterServiceRecord == 1 && order.afterServiceRecordList && order.afterServiceRecordList.length" class="bg-white margin-top-sm">
<view v-for="(afterServiceRecord, afterServiceRecordIndex) in order.afterServiceRecordList" :key="afterServiceRecord.id">
<view v-if="afterServiceRecord.createBy == 1" class="padding-tb solid-top">
<afterServiceRecord :after-service-record="afterServiceRecord" :order="order" @redoGoHome="showModalByRef('sure2Revisit', order, null)" @callModal="(modelName) => showModal({currentTarget: {dataset: {modal: modelName}}}, order)"></afterServiceRecord>
<!-- <view v-if="afterServiceRecord.createBy == 1" class="padding-tb solid-top">
<view class='cu-tag bg-main-color radius light'>售后发起中</view>
<view class="text-gray text-sm margin-bottom-xs">您需快速操作反馈24小时内不操作将自动同意</view>
<view v-if="afterServiceRecord.operType === 1">
<view class="flex justify-start align-end">
<text>退款申请</text>
@ -351,7 +381,7 @@
</view>
</view>
</view>
<view class="flex justify-end align-end margin-tb-sm" v-if="!afterServiceRecord.updateBy">
<view class="flex justify-end align-end margin-tb-sm" v-if="!afterServiceRecord.updateBy && afterServiceRecord.workerFeedbackResult === null">
<button class="cu-btn sm bg-yellow margin-right-sm" @tap="showModalByRef('sure2Revisit', order, null)">上门重做</button>
<button class="cu-btn sm bg-yellow margin-right-sm" data-modal="rejectAfterSale" @tap="showModal($event, order)">拒绝处理</button>
<button class="cu-btn sm bg-yellow margin-right-sm" data-modal="agreeAfterSale" @tap="showModal($event, order)">操作处理</button>
@ -359,82 +389,113 @@
</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>
<view class="margin-top-xs">
<text>师傅反馈结果</text>
<text v-if="afterServiceRecord.workerFeedbackResult === 0">拒绝</text>
<text v-else-if="afterServiceRecord.workerFeedbackResult === 1">同意</text>
<text v-else-if="afterServiceRecord.workerFeedbackResult === 2">上门重做/补做</text>
<text v-else-if="afterServiceRecord.workerFeedbackResult === 2 || afterServiceRecord.workerFeedbackResult === 3">上门重做/补做</text>
</view>
<view v-if="afterServiceRecord.workerFeedbackResult === 1">
<text>同意退款金额</text>
<text v-if="afterServiceRecord.agreedRefund">{{afterServiceRecord.agreedRefund}}</text>
<text v-else-if="afterServiceRecord.refund">{{afterServiceRecord.refund}}</text>
<text v-else-if="order.payMoney">{{order.payMoney}}</text>
<text>{{afterServiceRecord.agreedRefund ? afterServiceRecord.agreedRefund : afterServiceRecord.refund}}</text>
</view>
<view v-if="afterServiceRecord.workerFeedbackResult !== 2">
<text>师傅反馈</text>
<text v-if="afterServiceRecord.workerFeedbackReasonType === 1">客户原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 2">师傅原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 3">其他</text>
<text v-if="afterServiceRecord.workerFeedbackReason">
<text v-if="afterServiceRecord.workerFeedbackReasonType"></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" v-if="imgObj.imgUploadBy === 2">
<image :src="imgObj.imgUrl" @tap="viewImage($event, [imgObj.imgUrl])" :data-url="imgObj.imgUrl" mode="aspectFill"></image>
<view style="padding-left: 196upx;" v-if="afterServiceRecord.workerFeedbackResult === 2 || afterServiceRecord.workerFeedbackResult === 3">
<view>客户同意则本次退款金额为0元</view>
<view>客户同意的需马上处理并重新提交</view>
<view class="text-right" v-if="afterServiceRecord.customerAgreeRedo === 1">
<view class='cu-tag bg-main-color radius light'>客户同意方案</view>
</view>
</view>
<template v-if="afterServiceRecord.workerFeedbackResult == 0 || afterServiceRecord.workerFeedbackResult == 1">
<view>
<text>师傅反馈</text>
<text v-if="afterServiceRecord.workerFeedbackReasonType === 1">客户原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 2">师傅原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 3">其他</text>
<text v-if="afterServiceRecord.workerFeedbackReason">
<text v-if="afterServiceRecord.workerFeedbackReasonType"></text>
{{afterServiceRecord.workerFeedbackReason}}
</text>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.workerFeedbackImages">
<view class="bg-img" v-for="(imgUrl, imgIndex) in afterServiceRecord.workerFeedbackImages.split(',')" :key="imgIndex">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
</view>
</template>
<template v-else-if="afterServiceRecord.workerFeedbackResult === 3">
<view class="margin-top-xs">
<text>师傅重做/补做提交</text>
</view>
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.redoCompleteImages">
<view class="bg-img" v-for="(imgUrl, imgIndex) in afterServiceRecord.redoCompleteImages.split(',')" :key="imgIndex">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
</view>
<view class="margin-bottom-xs">
<text>{{afterServiceRecord.redoCompleteRemark}}</text>
</view>
</template>
</view>
<view style="border-top: 1px solid gainsboro;padding-top: 10upx;" v-if="afterServiceRecord.customerFinalCheck == null && (afterServiceRecord.workerFeedbackResult === 0 || afterServiceRecord.workerFeedbackResult === 1 || afterServiceRecord.workerFeedbackResult === 3)">
<text class="text-gray" style="font-size: 20upx;">待客户验收或审核36小时未操作将自动取消本次售后</text>
<view class="flex align-center margin-top-sm">
<text>工单时限</text>
<uni-countdown :show-colon="false" :backgroundColor="'#eee'"
:day="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).day"
:hour="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).hour"
:minute="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).min"
:second="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.redoCompleteTime, 36)).seconds">
</uni-countdown>
</view>
</view>
<view v-else-if="afterServiceRecord.operType === 2">
<view class="margin-top-xs">
<text>师傅反馈结果</text>
<text v-if="afterServiceRecord.workerFeedbackResult === 0">拒绝</text>
<text v-else-if="afterServiceRecord.workerFeedbackResult === 1">同意</text>
<text v-else-if="afterServiceRecord.workerFeedbackResult === 2">上门重做/补做</text>
</view>
<view v-if="afterServiceRecord.workerFeedbackResult !== 2">
<text>师傅反馈</text>
<text v-if="afterServiceRecord.workerFeedbackReasonType === 1">客户原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 2">师傅原因</text>
<text v-else-if="afterServiceRecord.workerFeedbackReasonType === 3">其他</text>
<text v-if="afterServiceRecord.workerFeedbackReason">
<text v-if="afterServiceRecord.workerFeedbackReasonType"></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" v-if="imgObj.imgUploadBy === 2">
<image :src="imgObj.imgUrl" @tap="viewImage($event, [imgObj.imgUrl])" :data-url="imgObj.imgUrl" mode="aspectFill"></image>
</view>
</view>
<view class="flex justify-end align-end margin-tb-sm" v-if="afterServiceRecord.workerFeedbackResult === 2">
<button class="cu-btn sm bg-yellow margin-right-sm" data-modal="showReFinishSubmit" @tap="showModal($event, order)">重做/补做提交</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 v-else-if="afterServiceRecord.customerFinalCheck === 1">
<view v-if="afterServiceRecord.originalRefund > 0">
<view>
<text>本单退款系统已发起按客户支付的帐户原路退回</text>
<text class="text-red">{{afterServiceRecord.originalRefund}}</text>
<text>银行按工作日退款节假日顺延到帐遇客户问询请其耐心等待到账时会在客户端客户最终确认处有到账时间</text>
<view v-if="afterServiceRecord.customerFinalCheck === 0">
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.customerDisagreeImages">
<view class="bg-img" v-for="imgUrl in afterServiceRecord.customerDisagreeImages.split(',')" :key="imgUrl">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
<view>退款支付到账{{afterServiceRecord.refundApplyTime}}</view>
</view>
<view v-else-if="afterServiceRecord.originalRefund == 0 && order.payStatus == 0">
<text>本单未支付实际退回0.00</text>
<view class="margin-bottom-xs" v-if="afterServiceRecord.customerDisagreeReason">
<text>不同意理由{{afterServiceRecord.customerDisagreeReason}}</text>
</view>
<view class="text-red" v-if="afterServiceRecord.customerFinalCheck === 0">订单交由平台协商处理</view>
</view>
<view v-else-if="afterServiceRecord.customerFinalCheck === 1">
<template v-if="afterServiceRecord.workerFeedbackResult !== 0">
<view v-if="(afterServiceRecord.agreedRefund > 0 || afterServiceRecord.originalRefund > 0) && order.payStatus == 1">
<view>
<text>本单退款系统已发起按客户支付的帐户原路退回</text>
<text class="text-red">{{afterServiceRecord.agreedRefund || afterServiceRecord.originalRefund}}</text>
<text>银行按工作日退款节假日顺延到帐遇客户问询请其耐心等待到账时会在客户端客户最终确认处有到账时间</text>
</view>
<view>退款支付到账{{afterServiceRecord.refundApplyTime}}</view>
</view>
<view v-else-if="order.payStatus == 0">
<text>本单已退款{{afterServiceRecord.agreedRefund}}因未实际支付实退为0元未退部分继续完成订单及正常支付</text>
</view>
</template>
<view v-else>
<text>本次售后已操作完毕售后申请已结束</text>
</view>
</view>
</view>
</view> -->
</view>
</view>
<view class="margin-top-sm solid-top padding-top-sm" v-if="Boolean(order.customerRemark)">
<view class="margin-top-sm solid-top padding-top-sm" @click="updateOrderWorkerRemark(order, index)">
<text class="text-main-color text-lg margin-right-xs"><text class="cuIcon-comment"></text></text>
<text>备注{{order.customerRemark}}</text>
<text>{{order.workerRemark || '可输入本单备注语'}}</text>
<!-- <text class="cuIcon-edit margin-left-sm" @click="updateOrderWorkerRemark(order, index)"></text> -->
</view>
</view>
<load-status-bar v-show="[5,6].indexOf(tabCur) >= 0 || (stateCur != null && stateList[stateCur].code === 105)" ref="loadStatusBar" @loadMore="loadMasterOrderPage"></load-status-bar>
@ -452,6 +513,13 @@
<pic-modal ref="showPicModal" :imgList="picModalImgList"></pic-modal>
<on-door-immediately v-if="showOnDoorNoticeModal" :show="showOnDoorNoticeModal" :data="curOrder" @close="showOnDoorNoticeModal = false" @confirmFeedback="reloadMasterOrderPage"></on-door-immediately>
<accept-order-notice v-if="showAcceptOrderNoticeModal" :show="showAcceptOrderNoticeModal" :data="curOrder" @close="showAcceptOrderNoticeModal = false" @confirmFeedback="setCurTab(0)"></accept-order-notice>
<insurance-detail v-if="showInsuranceDetail" :show="showInsuranceDetail" :data="curOrder" @close="showInsuranceDetail = false"></insurance-detail>
<insurance-retinue v-if="showInsuranceRetinue" :show="showInsuranceRetinue" :data="curOrder" @close="showInsuranceRetinue = false" ref="insuranceRetinueRef"></insurance-retinue>
<insurance-vertify v-if="showInsuranceVertify" :show="showInsuranceVertify" :data="curOrder" @close="showInsuranceVertify = false" ref="insuranceVertifyRef" @success="certVertifySuccess"></insurance-vertify>
<allocateServiceMoney v-if="showAllocateServiceMoney" :show="showAllocateServiceMoney" :data="curOrder" @close="showAllocateServiceMoney = false" @confirmFeedback="showAllocateServiceMoney = false;reloadMasterOrderPage()"></allocateServiceMoney>
<dispatch-order-to-self v-if="showDispathToSelf" :show="showDispathToSelf" :data="curOrder" @close="showDispathToSelf = false" @assignWork="assignWork" @confirmFeedback="showDispathToSelf = false;reloadMasterOrderPage()"></dispatch-order-to-self>
<reFinishSubmit v-if="showReFinishSubmit" :show="showReFinishSubmit" :curOrder="curOrder" @close="showReFinishSubmit = false" @confirmFeedback="showReFinishSubmit = false;reloadMasterOrderPage()"></reFinishSubmit>
<confirm-modal ref="ledgerAccountRemark" :showCancel="false" :showConfirm="true">
<block slot="contentView">
<view class="text-left">
@ -475,7 +543,11 @@
</uni-popup>
<!-- 账户及实名弹窗 -->
<vertify-bank-bind ref="vertifyBankBind"></vertify-bank-bind>
<vertify-certify ref="vertifyCertify"></vertify-certify>
<vertify-certify ref="vertifyCertify"></vertify-certify>
<uni-popup ref="editOrderRemarkPopup" type="center">
<uni-popup-dialog title="修改本单备忘语" mode="input" :value="curOrder.workerRemark" v-if="showEditWorkerRemark" @close="showEditWorkerRemark = false" @confirm="updateOrderWorkerRemarkOpreation"></uni-popup-dialog>
</uni-popup>
</view>
</template>
@ -495,6 +567,13 @@
import rejectAfterSale from '@/pages/order-manage/modal/reject-after-sale.vue';
import onDoorImmediately from '@/pages/order-manage/modal/on-door-immediately.vue';
import acceptOrderNotice from '@/pages/order-manage/modal/accept-order-notice.vue';
import insuranceDetail from '@/pages/order-manage/modal/insurance-detail.vue';
import insuranceRetinue from '@/pages/order-manage/modal/insurance-retinue.vue';
import insuranceVertify from '@/pages/order-manage/modal/insurance-vertify.vue';
import allocateServiceMoney from '@/pages/order-manage/modal/allocate-service-money.vue';
import dispatchOrderToSelf from '@/pages/order-manage/modal/dispatch-order-to-self.vue';
import reFinishSubmit from '@/pages/order-manage/modal/re-finish-submit.vue'
import afterServiceRecord from './components/afterServiceRecord.vue';
export default {
components: {
@ -512,7 +591,14 @@
agreeAfterSale,
rejectAfterSale,
onDoorImmediately,
acceptOrderNotice
acceptOrderNotice,
insuranceDetail,
insuranceRetinue,
insuranceVertify,
allocateServiceMoney,
dispatchOrderToSelf,
reFinishSubmit,
afterServiceRecord
},
data() {
return {
@ -586,6 +672,7 @@
scrollLeft: 0,
stickyTop: this.CustomBar,
tabCur: 0,
orderType: 0,
stateCur: null,
showTimeArrangeModal: false,
showArrangeFailTimeModal: false,
@ -595,6 +682,9 @@
showEditTimeArrangeModal: false,
showOnDoorNoticeModal: false,
showAcceptOrderNoticeModal: false,
showInsuranceDetail: false,
showInsuranceRetinue: false,
showInsuranceVertify: false,
sendUrgentMsgModal: false,
agreeAfterSale: false,
rejectAfterSale: false,
@ -603,20 +693,34 @@
curDate: '',
curUserInfo: {},
orderStatistics: {},
hasAuthLocation: true
hasAuthLocation: true,
storageArgs: null,
showAllocateServiceMoney: false,
showDispathToSelf: false,
showEditWorkerRemark: false,
showReFinishSubmit: false
}
},
onLoad(option) {
if (option && option.tabCur) {
this.stateCur = null;
this.tabCur = option.tabCur;
} else if(option && option.stateCur) {
this.tabCur = null;
this.stateCur = option.stateCur;
} else if(option && option.orderType) {
this.orderType = option.orderType;
}
this.loadData();
this.bindEvent();
},
onShow() {
if(this.orderList.length){
const isDetailPage = uni.getStorageSync('isDetailPage');
console.log(isDetailPage);
if(this.orderList.length && !isDetailPage){
this.reloadMasterOrderPage();
}
uni.setStorageSync('isDetailPage', '')
},
onUnload() {
this.offBindEvent();
@ -626,7 +730,25 @@
//
this.curUserInfo = this.$request.getCurUserInfo();
// let myTeamInfo = await this.$api.data('myTeamInfo');
// this.myTeamMembers = myTeamInfo.members;
// this.myTeamMembers = myTeamInfo.members;
// const res = await this.$request.getWorkerInfo(this.curUserInfo.workerId)
// if(res.data.loginStatus == 1) {
// // 退
// uni.clearStorageSync('userProfile');
// uni.showToast({
// icon: 'none',
// title: '',
// duration: 3000,
// success() {
// setTimeout(() => {
// uni.reLaunch({
// url: '/pages/login/login'
// })
// }, 3000)
// }
// })
// return
// }
this.myOrders = await this.$api.data('myOrders');
// this.orderList = this.myOrders.orderList;
// this.areaList = await this.$api.data('areaList');
@ -639,16 +761,30 @@
// });
// }
//
this.loadMasterOrderPage({
orderStatus: this.subStateList[0].code
});
//
this.loadCategoryList();
this.loadRegionList();
//
this.loadTeamMembers();
//
this.loadOrderStatistics();
// this.loadMasterOrderPage({
// orderStatus: this.subStateList[0].code
// });
// //
// this.loadCategoryList();
// this.loadRegionList();
// //
// this.loadTeamMembers();
// //
// this.loadOrderStatistics();
Promise.allSettled([
//
this.loadMasterOrderPage({
orderStatus: this.subStateList[0].code
}),
//
this.loadOrderStatistics()
]).then(() => {
//
this.loadCategoryList();
this.loadRegionList();
//
this.loadTeamMembers();
})
},
reloadMasterOrderPage(params = {}) {
// this.pageParams = [];
@ -715,7 +851,7 @@
params.isMonitoredOrder = true;
} else if (this.stateList[this.stateCur].code === 103) {
//
params.isMonitoredOrder = true;
// params.isMonitoredOrder = true;
params.orderByColumn = "createTime";
params.isAsc = "desc";
} else if (this.stateList[this.stateCur].code === 0) {
@ -749,6 +885,7 @@
params.isAsc = "asc";
}
}
params.orderType = this.orderType;
try {
let res = null;
let tmpStateCur = this.stateCur;
@ -824,24 +961,24 @@
},
async loadCategoryList(idArr) {
let typeList = await this.$request.listByStep({
type: 1
type: this.orderType == 0 ? 1 : 2
});
typeList = typeList.data;
let col1Id = idArr ? idArr[0] : typeList[0].goodsCategoryId;
let subTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: col1Id
});
subTypeList = subTypeList.data;
let col2Id = idArr ? idArr[1] : subTypeList[0].goodsCategoryId;
let subSubTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: col2Id
});
subSubTypeList = subSubTypeList.data;
let col3Id = idArr ? idArr[2] : subSubTypeList[0].goodsCategoryId;
let thirdTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: col3Id
});
thirdTypeList = thirdTypeList.data;
@ -878,7 +1015,9 @@
this.myTeamMembers = res.rows;
},
async loadOrderStatistics() {
let res = await this.$request.orderStatistics();
let res = await this.$request.orderStatistics({
orderType: this.orderType
});
this.orderStatistics = res.data;
},
bindEvent() {
@ -925,14 +1064,14 @@
if (colObj.column == 0) {
//
let subTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: this.categoryList[0][colObj.value].goodsCategoryId
});
subTypeList = subTypeList.data;
let subSubTypeList = [];
if (subTypeList && subTypeList.length) {
subSubTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: subTypeList[0].goodsCategoryId
});
subSubTypeList = subSubTypeList.data;
@ -945,7 +1084,7 @@
} else if (colObj.column == 1) {
//
let subSubTypeList = await this.$request.listByStep({
type: 1,
type: this.orderType == 0 ? 1 : 2,
goodsCategoryId: this.categoryList[1][colObj.value].goodsCategoryId
});
subSubTypeList = subSubTypeList.data;
@ -988,7 +1127,13 @@
let date = new Date();
this.curDate = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() + " 00:00:00";
},
showModal(e, orderInfo) {
async showModal(e, orderInfo, isCheckOrderInsurance) {
if(isCheckOrderInsurance) {
let resCheck = await this.$request.checkOrderInsurance({
orderCode: orderInfo.orderMasterCode
});
if(resCheck.code !== 0) return;
}
this.getCurDateAndTime();
if (orderInfo) {
this.curOrder = orderInfo;
@ -1139,13 +1284,24 @@
this.$refs.payQrcode.showQrcode(res.data.expend.qrcode_url);
}
},
async insuranceRetinueAdd(e, orderInfo) {
this.showModal(e, orderInfo);
if(orderInfo.orderDetailId) {
this.$nextTick(() => {
this.$refs.insuranceRetinueRef.initData()
})
}
},
showServOrderDetail(order) {
uni.setStorageSync('isDetailPage', true);
uni.navigateTo({
url: '/pages/order-manage/serv-detail?order=' + encodeURIComponent(JSON.stringify(order))
})
},
async finishOrder(order) {
let checkRes = await this.checkBankAndCertify();
console.log(checkRes);
if (!checkRes) {
return;
}
@ -1166,11 +1322,13 @@
this.$refs.vertifyCertify.showModal();
return false;
} else if (this.certifyInfo.status != 1) {
uni.showToast({
icon: 'none',
title: '实名认证审核通过后才可进行操作',
duration: 2500
})
setTimeout(() => {
uni.showToast({
icon: 'none',
title: '实名认证审核通过后才可进行操作',
duration: 2500
})
}, 500);
return false;
} else if (!this.bankCard || !this.bankCard.bankNum) {
this.$refs.vertifyBankBind.showModal();
@ -1178,7 +1336,86 @@
}
return true;
},
async acceptOrder(e, order, id, code, status, funName) {
certVertifySuccess(data) {
const cacheArgs = Array.from(this.storageArgs)
const sendArgs = cacheArgs.length > 6 ? cacheArgs.slice(0,-1) : cacheArgs
this.acceptOrder(...sendArgs, data)
this.showInsuranceVertify = false
},
varifyDetailOrderUser() {
const remark = this.curUserInfo.remark ? JSON.parse(this.curUserInfo.remark) : {certNo: '',certName: ''}
if(remark.certNo && remark.certName) {
return {
check: true,
...remark
}
} else {
//
return {
check: false,
...remark
}
}
},
async acceptOrder(e, order, id, code, status, funName, certData = {}) {
// ,
if(order.orderType === 1 && order.hasServiceOrder === 0) {
this.curOrder = order;
this.showAllocateServiceMoney = true;
return
}
if(order.orderDetailId && order.insuranceId) {
//
const detailUserStatus = this.varifyDetailOrderUser()
if(detailUserStatus.check) {
const validUser = certData.certNo && certData.certName ? certData : detailUserStatus
const res = await this.$request.insuranceUserAdd({
idCardNum: validUser.certNo,
phone: this.curUserInfo.phone,
name: validUser.certName,
orderDetailId: order.orderDetailId
})
if (res.code === 0) {
//
} else {
uni.showToast({
icon: 'none',
title: '保险未响应,请再次点接单',
})
//
// this.storageArgs = arguments;
// this.showInsuranceVertify = true
return
}
} else {
//
this.storageArgs = arguments;
this.showInsuranceVertify = true
return
}
}
if(order.insuranceId) {
//
const varifyData = await this.$request.certNoTwoElementVerification({
workerId: this.curUserInfo.workerId,
...certData
})
if(varifyData && varifyData.code === 0 && varifyData.data === '身份证二要素校验失败!') {
//
uni.showToast({
icon: 'none',
title: '身份信息校验失败,请重新输入',
duration: 2500
})
this.storageArgs = arguments;
this.showInsuranceVertify = true
return
}
}
this.storageArgs = null;
let res = await this.$request[funName]({
id: id,
orderStatus: status,
@ -1287,6 +1524,10 @@
}
},
async assignWork2MySelf(orderInfo) {
let resCheck = await this.$request.checkOrderInsurance({
orderCode: orderInfo.orderMasterCode
});
if(resCheck.code !== 0) return;
let res = await this.$request.getCanAssignList({
orderMasterId: orderInfo.orderMasterId
});
@ -1313,9 +1554,8 @@
return await this.assignWork(params);
},
async rejectMasterOrder(order) {
let res = await this.$request.updateOrder({
id: order.orderMasterId,
workerId: -1
let res = await this.$request.rejectMasterOrderWhenAccepted({
id: order.orderMasterId
});
if (res && res.code === 0) {
this.reloadMasterOrderPage();
@ -1354,27 +1594,63 @@
})
}
},
async rejectMasterOrderWhenAccepted(order) {
let res = await this.$request.rejectMasterOrderWhenAccepted({
id: order.orderMasterId
});
if (res && res.code === 0) {
this.reloadMasterOrderPage();
uni.showToast({
icon: 'none',
title: '退单成功',
duration: 1000
})
this.addOrderOperate({
orderId: order.orderMasterId,
orderType: '01',
content: '师傅退单'
rejectMasterOrderWhenAccepted(order) {
if(order.orderDetailId == null && this.tabCur === 0) {
// 退退退退
if(order.goods.storeService) {
uni.showModal({
title: '提示',
content: `1.你的订单属到店服务,整单退单请把所有派出子单退回后,让客户点“取消订单”键。\n2.如派出子单已完成结算支付则客户无法“取消订单”,且已完成订单的金额与分销金额无法系统退回。非客户责任的建议你线下退全款并完成订单(等于你承担无法退回的分销费用)!`,
success: (res) => {
}
})
return;
}
}
if(order.masterWorkerId === order.workerId) {
uni.showModal({
title: '提示',
content: order.orderType == 1 ? '确认后订单回到你拣货/发货栏,你可重新派单或操作彻底退单' : '确认后订单回到你未约/未排栏,你可重新派单或操作彻底退单',
success: async (res) => {
if(res.confirm) {
let res
if(order.orderDetailId) {
res = await this.$request.rejectDetailOrder({
id: order.orderDetailId
});
} else {
res = await this.$request.rejectMasterOrderWhenAccepted({
id: order.orderMasterId
});
}
if (res && res.code === 0) {
this.reloadMasterOrderPage();
uni.showToast({
icon: 'none',
title: '退单成功',
duration: 1000
})
// this.addOrderOperate({
// orderId: order.orderMasterId,
// orderType: '01',
// content: '退'
// })
} else {
uni.showToast({
icon: 'none',
title: res.msg,
duration: 2000
})
}
}
}
})
} else {
uni.showToast({
icon: 'none',
title: res.msg,
duration: 2000
const orderId = order.orderDetailId ? order.orderDetailId : order.orderMasterId
const isDetailOrder = order.orderDetailId ? 1 : 0
uni.navigateTo({
url: '/pages/order-manage/cancel-order?orderId='+orderId+'&orderType=0&isDetailOrder='+isDetailOrder
})
}
},
@ -1506,6 +1782,67 @@
this.tabCur = curTab;
this.stateCur = null;
this.reloadMasterOrderPage();
},
async serveringReturn(order) {
const res = await this.$request.returnOrder({
id: order.orderDetailId
})
if (res && res.code === 0) {
uni.showToast({
icon: 'success',
title: '操作成功',
duration: 1000
})
this.addOrderOperate({
orderId: order.orderDetailId,
orderType: '02',
content: '提交退回'
})
} else {
uni.showToast({
icon: 'none',
title: '操作失败',
duration: 1000
})
}
},
updateOrderWorkerRemark(order, index) {
this.curOrder = order;
this.curOrder.currentIndex = index;
this.showEditWorkerRemark = true;
this.$refs.editOrderRemarkPopup.open()
},
async updateOrderWorkerRemarkOpreation(input) {
let reqFunName = "saveMasterWorkerRemark", id;
if (this.curOrder.orderDetailId) {
reqFunName = "updateDetailOrder";
id = this.curOrder.orderDetailId;
} else {
id = this.curOrder.orderMasterId;
}
//
let params = {
id: id,
workerRemark: input
}
let res = await this.$request[reqFunName](params);
if (res.code === 0) {
uni.showToast({
icon: 'success',
title: '操作成功',
duration: 1000
})
const currentOrder = this.orderList[this.curOrder.currentIndex]
currentOrder.workerRemark = input
this.set(this.orderList, this.curOrder.currentIndex, currentOrder)
} else {
uni.showToast({
icon: 'none',
title: '操作失败',
duration: 1000
})
}
}
}
}
@ -1541,5 +1878,10 @@
right: 25rpx;
top: 25rpx;
z-index: 99;
}
.order-name {
display: flex;
justify-content: space-between;
align-items: center;
}
</style>

View File

@ -4,7 +4,7 @@
<!-- 顶部操作条 -->
<cu-custom :bgColor="'bg-main-color'" :isBack="true">
<block slot="backText">返回</block>
<block slot="content">服务订单详情</block>
<block slot="content">{{order.orderType === 0 ? '服务订单详情' : '商品订单详情'}}</block>
</cu-custom>
<!-- 任务进度跟踪 -->
<view class="bg-white margin-lr-sm padding-lr padding-bottom margin-top-sm">
@ -37,9 +37,10 @@
<text class="text-xl margin-right">{{servDetail.goodsName}}</text>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 5">已完成</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 4">确认中</view>
<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-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 1">未约/未排</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 3">{{order.orderType === 0 ? '服务中' : '发货中'}}</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 2">{{order.orderType === 0 ? '待上门' : '待发货'}}</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 1">{{order.orderType === 0 ? '未约/未排' : '拣货/发货'}}</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'>
@ -47,45 +48,60 @@
</view> -->
<view class="margin-top-sm">
<text class="cuIcon-location text-main-color margin-right-xs"></text>
<text><text class="labels">服务地址</text>{{servDetail.address}}</text>
<text><text class="labels">服务地址</text>{{servDetail.provinceName + servDetail.cityName + servDetail.countryName + servDetail.streetName + 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"><text class="labels">客户</text>{{servDetail.customerName}}</text>
<text>{{servDetail.customerPhone.substring(0, 3) + "****" + servDetail.customerPhone.substring(7)}}</text>
<button class="cu-btn line-main-color sm" @click="makeCustomerPhoneCall(servDetail)">拨打</button>
<text v-if="servDetail.customerPhone">{{servDetail.customerPhone.substring(0, 3) + "****" + servDetail.customerPhone.substring(7)}}</text>
<button class="cu-btn line-main-color sm" v-if="servDetail.orderStatus !== 1" @click="makeCustomerPhoneCall(servDetail)">拨打</button>
</view>
<view class="margin-top-sm" v-if="servDetail.orderDetailId">
<view class="margin-top-sm" v-if="servDetail.goodsOrderMasterId">
<text class="cuIcon-friendfamous text-main-color margin-right-xs"></text>
<text class="margin-right-sm"><text class="labels">派单公司</text>{{servDetail.masterCompanyName}}</text>
<text class="margin-right-xs">{{servDetail.masterCompanyPhone}}</text>
<button class="cu-btn line-main-color sm" @click="makePhoneCall(servDetail.masterCompanyPhone)">拨打</button>
</view>
<view class="margin-top-sm" v-else-if="servDetail.orderDetailId">
<text class="cuIcon-friendfamous text-main-color margin-right-xs"></text>
<text class="margin-right-sm"><text class="labels">派单公司</text>{{servDetail.masterCompanyName}}</text>
<text class="margin-right-xs">{{servDetail.masterWorkerPhone}}</text>
<button class="cu-btn line-main-color sm" @click="makePhoneCall(servDetail.masterWorkerPhone)">拨打</button>
</view>
<view class="margin-top-sm">
<text class="cuIcon-time text-main-color margin-right-xs"></text>
<text v-if="servDetail.expectTimeEndFront"><text class="labels">预约时间</text>{{servDetail.expectTimeStartFront + '~' + servDetail.expectTimeEndFront}}</text>
<text v-else><text class="labels">预约时间</text>{{servDetail.expectTimeStartFront}}</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.orderDetailId != null && servDetail.orderStatus >= 3">
<text class="cuIcon-time text-main-color margin-right-xs"></text>
<text><text class="labels">上门时间</text>{{servDetail.workBeginTime}}</text>
</view>
<!-- <view class="margin-top-sm" v-else-if="servDetail.masterCompanyName && servDetail.masterWorkerPhone">
<text class="cuIcon-friendfamous text-main-color margin-right-xs"></text>
<text class="margin-right-sm"><text class="labels">派单公司</text>{{servDetail.masterCompanyName}}</text>
<text class="margin-right-xs">{{servDetail.masterWorkerPhone}}</text>
<button class="cu-btn line-main-color sm" @click="makePhoneCall(servDetail.masterWorkerPhone)">拨打</button>
</view> -->
<template v-if="order.orderType === 0">
<view class="margin-top-sm">
<text class="cuIcon-time text-main-color margin-right-xs"></text>
<text v-if="servDetail.expectTimeEndFront"><text class="labels">预约时间</text>{{servDetail.expectTimeStartFront + '~' + servDetail.expectTimeEndFront}}</text>
<text v-else><text class="labels">预约时间</text>{{servDetail.expectTimeStartFront}}</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.orderDetailId != null && servDetail.orderStatus >= 3">
<text class="cuIcon-time text-main-color margin-right-xs"></text>
<text><text class="labels">上门时间</text>{{servDetail.workBeginTime}}</text>
</view>
</template>
<!-- <view class="margin-top-sm" v-if="servDetail.orderDetailId == null && servDetail.orderMode == '02'">
<text class="cuIcon-moneybag text-main-color margin-right-xs"></text>
<text>订单金额</text>
<text class="text-price">{{servDetail.totalMoney}}</text>
</view> -->
<view class="margin-top-sm" v-if="servDetail.customerRemark">
<!-- <view class="margin-top-sm" v-if="servDetail.customerRemark">
<text class="cuIcon-message text-main-color margin-right-xs"></text>
<text><text class="labels">备注</text>{{servDetail.customerRemark}}</text>
</view>
</view> -->
<view class="margin-top-sm">
<text class="cuIcon-moneybag text-main-color margin-right-xs"></text>
<text class="labels">服务金额</text>
<text class="labels">{{order.orderType === 0 ? '服务金额' : '货品金额'}}</text>
<text class="text-price" v-if="servDetail.orderDetailId != null">
{{servDetail.payAddMoney}}
<text v-if="servDetail.payType === 1 && servDetail.financialChangeRecords && servDetail.financialChangeRecords.length > 0">订单加价单独到账</text>
@ -93,7 +109,7 @@
</text>
<text class="text-price" v-else>{{servDetail.serverMoney}}</text>
</view>
<view class="text-sm text-gray margin-left-lg"
<!-- <view class="text-sm text-gray margin-left-lg"
v-if="servDetail.orderDetailId != null && servDetail.timeout == 1">
<text>加减费用<text class="text-price margin-top-xs">-3</text>
[
@ -107,8 +123,25 @@
<view class="text-sm text-gray margin-left-lg" v-if="servDetail.orderDetailId != null && servDetail.financialChangeRecords != null"
v-for="(item, index) in servDetail.financialChangeRecords" :key="index">
<text v-if="item.payStatus === 1">加减费用:<text class="text-price margin-top-xs">+{{item.changeMoney}}</text>[订单加价]</text>
</view>
</view>
</view> -->
</view>
<!-- 下单备注 暂时注释, 客户说的不显示 -->
<view v-if="servDetail.customerRemark || servDetail.orderImages" class="bg-white margin-lr-sm padding margin-top-sm">
<view v-if="servDetail.orderImages">
<view class="grid col-3 grid-square flex-sub">
<view class="bg-img" v-for="imgUrl in servDetail.orderImages.split(',')" :key="imgUrl">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill">
</image>
</view>
</view>
</view>
<view>订单备注: {{servDetail.customerRemark}}</view>
</view>
<!-- 待服务列 -->
<view class="bg-white margin-lr-sm padding-lr padding-bottom margin-top-sm">
<view class="cu-bar solid-bottom">
@ -120,10 +153,114 @@
<product-picked :product="servDetail" :pickedList="servDetail.standardList" :columnTitleArr="servingColumnHeaders" :valFieldArr="servingValFields"></product-picked>
</view>
</view>
<!-- 下单备注 -->
<view v-if="servDetail.remark" class="bg-white margin-lr-sm padding margin-top-sm">
<view>订单备注: {{servDetail.remark}}</view>
<view class="bg-white margin-lr-sm padding-lr margin-top-sm padding" v-if="servDetail.serviceShop">
<template v-if="servDetail.goodsOrderMasterId && servDetail.masterWorkerName && servDetail.masterWorkerPhone && (servDetail.originalWorkerId == curUserInfo.workerId)">
<view class="cu-bar solid-bottom">
<view class="action bar-first-action">
<text class="cuIcon-titles text-main-color"></text> 服务记录
</view>
<view>
<view class="cu-btn sm bg-main-color margin-right-sm shadow-blur" v-if="[0,1,2,3].indexOf(servDetail.orderStatus) >= 0" @click="cancelMasterOrder(servDetail)">撤单</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 5">已完成</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 4">待确认</view>
<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-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 1">未约/未排</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 0">待接单</view>
</view>
</view>
<view class="float-clear"></view>
<view class="margin-top-sm">师傅{{servDetail.masterWorkerName}}</view>
<view class="margin-top-sm margin-bottom-lg">
<text class="margin-right-xs">联系方式{{servDetail.masterWorkerPhone}}</text>
<button class="cu-btn line-main-color sm" @click="makePhoneCall(servDetail.masterWorkerPhone)">拨打</button>
</view>
</template>
<view class="text-black text-bold flex justify-between">
<text>安装/服务/施工门店</text>
<!-- <text @click="goChooseShop">更多></text> -->
</view>
<view class="flex-sub flex margin-top-sm" @click="openShopLocation(servDetail.serviceShop)">
<view style="width: 150rpx;height: 150rpx;margin-right:10px;">
<image style="width: 100%;height: 100%;" :src="servDetail.serviceShop.imageUrl" mode="aspectFill"></image>
</view>
<view class="flex-sub">
<view class="text-bold" style="text-overflow: ellipsis;overflow: hidden;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 1;">
客户已选: {{servDetail.serviceShop.shopName}}
</view>
<view class="padding-tb-xs" style="position: relative;">
<view class="margin-lr-sm" style="display: inline-block;" v-if="servDetail.serviceShop.distance">
<view class="cu-tag bg-red" style="padding: 0 2px;height: auto;">距离客户</view>
<text class="text-gray" style="vertical-align: middle;">{{servDetail.serviceShop.distance}}</text>
</view>
<image src="/static/navigation.png" style="width: 50rpx;height: 50rpx;display: inline-block;position: absolute;top: 5px;right: -10px;"></image>
</view>
<view style="text-overflow: ellipsis;overflow: hidden;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 1;">{{servDetail.serviceShop.provinceName + servDetail.serviceShop.cityName + servDetail.serviceShop.countryName + servDetail.serviceShop.streetName + servDetail.serviceShop.address}}</view>
<view class="flex justify-between align-center margin-bottom-xs padding-top">
<view>
<text class="text-bold text-lg margin-lr-xs">店长{{servDetail.serviceShop.phone}}</text>
</view>
<button class="cu-btn line-main-color" @click.stop="makePhoneCall(servDetail.serviceShop.phone)">拨打</button>
</view>
</view>
</view>
</view>
<view class="bg-white margin-lr-sm padding-lr margin-top-sm padding" v-else-if="servDetail.shop">
<template v-if="servDetail.goodsOrderMasterId && (servDetail.originalWorkerId == curUserInfo.workerId)">
<view class="cu-bar solid-bottom">
<view class="action bar-first-action">
<text class="cuIcon-titles text-main-color"></text> 服务记录
</view>
<view>
<view class="cu-btn sm bg-main-color margin-right-sm shadow-blur" v-if="[0,1,2,3].indexOf(servDetail.orderStatus) >= 0" @click="cancelMasterOrder(servDetail)">撤单</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 5">已完成</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 4">待确认</view>
<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-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 1">未约/未排</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="servDetail.orderStatus === 0">待接单</view>
</view>
</view>
<view class="float-clear"></view>
<view class="margin-top-sm">师傅{{servDetail.masterWorkerName}}</view>
<view class="margin-top-sm margin-bottom-lg">
<text class="margin-right-xs">联系方式{{servDetail.masterWorkerPhone}}</text>
<button class="cu-btn line-main-color sm" @click="makePhoneCall(servDetail.masterWorkerPhone)">拨打</button>
</view>
</template>
<view class="text-black text-bold flex justify-between">
<text>安装/服务/施工门店</text>
<!-- <text @click="goChooseShop">更多></text> -->
</view>
<view class="flex-sub flex margin-top-sm" @click="openShopLocation(servDetail.shop)">
<view style="width: 150rpx;height: 150rpx;margin-right:10px;">
<image style="width: 100%;height: 100%;" :src="servDetail.shop.imageUrl" mode="aspectFill"></image>
</view>
<view class="flex-sub">
<view class="text-bold" style="text-overflow: ellipsis;overflow: hidden;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 1;">
客户已选: {{servDetail.shop.shopName}}
</view>
<view class="padding-tb-xs" style="position: relative;">
<view class="margin-lr-sm" style="display: inline-block;" v-if="servDetail.shop.distance">
<view class="cu-tag bg-red" style="padding: 0 2px;height: auto;">距离您</view>
<text class="text-gray" style="vertical-align: middle;">{{servDetail.shop.distance}}</text>
</view>
<image src="/static/navigation.png" style="width: 50rpx;height: 50rpx;display: inline-block;position: absolute;top: 5px;right: -10px;"></image>
</view>
<view>{{servDetail.shop.provinceName + servDetail.shop.cityName + servDetail.shop.countryName + servDetail.shop.streetName + servDetail.shop.address}}</view>
<view class="flex justify-between align-center margin-bottom-xs padding-top">
<view>
<text class="text-bold text-lg margin-lr-xs">店长{{servDetail.shop.phone}}</text>
</view>
<button class="cu-btn line-main-color" @click.stop="makePhoneCall(servDetail.shop.phone)">拨打</button>
</view>
</view>
</view>
</view>
<!-- 加价记录 子单详情展示 -->
<view v-if="servDetail.orderDetailId != null && servDetail.financialChangeRecords && servDetail.financialChangeRecords.length > 0" class="bg-white margin-lr-sm padding-lr padding-bottom margin-top-sm">
<view class="cu-bar solid-bottom">
@ -131,14 +268,26 @@
<text class="cuIcon-titles text-main-color"></text> 加价记录
</view>
</view>
<view class="padding-tb-sm" v-for="(changeRecord, changeRecordIndex) in servDetail.financialChangeRecords" :key="changeRecordIndex">
<view class="padding-tb-sm" v-for="addRecord in servDetail.financialChangeRecords" :key="addRecord.id">
<view>
<text>加价金额</text>
<text>{{changeRecord.changeMoney}}</text>
<text>{{addRecord.changeMoney + (addRecord.attachmentMoney || 0)}}</text>
</view>
<view v-if="addRecord.reason && addRecord.reason.indexOf('含') > -1">
<text>{{addRecord.reason.split('含')[1]}}</text>
<text>{{addRecord.changeMoney}}</text>
</view>
<view>
<text>加价备注</text>
<text v-if="changeRecord.remark">{{changeRecord.remark}}</text>
<text v-if="addRecord.remark">{{addRecord.remark}}</text>
</view>
<view v-if="addRecord.urls">
<view class="grid col-3 grid-square flex-sub margin-top-sm">
<view class="bg-img" v-for="imgUrl in addRecord.urls.split(',')" :key="imgUrl">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill">
</image>
</view>
</view>
</view>
</view>
</view>
@ -165,7 +314,20 @@
</view>
</view>
<view v-for="(afterServiceRecord, afterServiceRecordIndex) in servDetail.afterServiceRecordList" :key="afterServiceRecordIndex">
<view v-if="afterServiceRecord.createBy == 1" class="padding-tb-sm solid-top">
<afterServiceRecord
v-if="order.orderType === 0"
:after-service-record="afterServiceRecord"
:order="order"
:showActionBtn="false"
></afterServiceRecord>
<afterServiceRecordGoods
v-else
:after-service-record="afterServiceRecord"
:order="order"
:showActionBtn="false"
@getDeliveryFlow="(trackingNumber) => {showDeliveryFlow = true; showDeliveryFlowTrackingNumber = trackingNumber;}"
></afterServiceRecordGoods>
<!-- <view v-if="afterServiceRecord.createBy == 1" class="padding-tb-sm solid-top">
<view class='cu-tag bg-main-color radius light'>售后发起中</view>
<view v-if="afterServiceRecord.operType === 1">
<view class="text-gray text-sm margin-bottom-xs">退单退款已提交至商家其最大时限24小时内需完成操作</view>
@ -182,17 +344,39 @@
<text>退款金额</text>
<text>{{afterServiceRecord.refund}}</text>
</view>
<view v-if="order.orderType === 1">
<text>售后类型</text>
<text v-if="afterServiceRecord.afterServiceType === 1">未收到货我要退单退款</text>
<text v-else-if="afterServiceRecord.afterServiceType === 2">未收到货发货在途我要退款</text>
<text v-else-if="afterServiceRecord.afterServiceType === 3">已收到货我要退款退货</text>
</view>
<view>
<text>退款原因</text>
<text v-if="afterServiceRecord.customerReasonType === 1">上门/服务不守时</text>
<text v-else-if="afterServiceRecord.customerReasonType === 2">态度不友好无法继续</text>
<text v-else-if="afterServiceRecord.customerReasonType === 3">服务效果差未达到合格</text>
<text v-else-if="afterServiceRecord.customerReasonType === 4">技能水平问题未妥善完成</text>
<text v-else-if="afterServiceRecord.customerReasonType === 5">要求加费用费用不合理</text>
<text v-else-if="afterServiceRecord.customerReasonType === 6">订单拖太久了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 7">超了些服务内容师傅不接受</text>
<text v-else-if="afterServiceRecord.customerReasonType === 8">客户/我时间不方便了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 9">客户/我已让别的师傅服务了</text>
<template v-if="order.orderType === 1">
<text v-if="afterServiceRecord.customerReasonType === 1">不想要了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 2">买错型号尺寸了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 3">材质与商品描述不符</text>
<text v-else-if="afterServiceRecord.customerReasonType === 4">大小尺寸与商品描述不符</text>
<text v-else-if="afterServiceRecord.customerReasonType === 5">颜色款式型号与描述不符</text>
<text v-else-if="afterServiceRecord.customerReasonType === 6">出现质量问题</text>
<text v-else-if="afterServiceRecord.customerReasonType === 7">收到商品少件少配件</text>
<text v-else-if="afterServiceRecord.customerReasonType === 8">商家发错货</text>
<text v-else-if="afterServiceRecord.customerReasonType === 9">商品破损或污渍</text>
<text v-else-if="afterServiceRecord.customerReasonType === 10">未按承诺时间发货</text>
<text v-else-if="afterServiceRecord.customerReasonType === 11">未见快递/物流有信息</text>
<text v-else-if="afterServiceRecord.customerReasonType === 12">其它原因</text>
</template>
<template v-else>
<text v-if="afterServiceRecord.customerReasonType === 1">上门/服务不守时</text>
<text v-else-if="afterServiceRecord.customerReasonType === 2">态度不友好无法继续</text>
<text v-else-if="afterServiceRecord.customerReasonType === 3">服务效果差未达到合格</text>
<text v-else-if="afterServiceRecord.customerReasonType === 4">技能水平问题未妥善完成</text>
<text v-else-if="afterServiceRecord.customerReasonType === 5">要求加费用费用不合理</text>
<text v-else-if="afterServiceRecord.customerReasonType === 6">订单拖太久了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 7">超了些服务内容师傅不接受</text>
<text v-else-if="afterServiceRecord.customerReasonType === 8">客户/我时间不方便了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 9">客户/我已让别的师傅服务了</text>
</template>
</view>
<view>
<text>具体原因</text>
@ -220,17 +404,39 @@
:second="$dateUtil.countDownDiff($dateUtil.addHours(afterServiceRecord.createTime, 24)).seconds">
</uni-countdown>
</view>
<view v-if="order.orderType === 1">
<text>售后类型</text>
<text v-if="afterServiceRecord.afterServiceType === 1">未收到货我要退单退款</text>
<text v-else-if="afterServiceRecord.afterServiceType === 2">未收到货发货在途我要退款</text>
<text v-else-if="afterServiceRecord.afterServiceType === 3">已收到货我要退款退货</text>
</view>
<view>
<text>售后原因</text>
<text v-if="afterServiceRecord.customerReasonType === 1">上门/服务不守时</text>
<text v-else-if="afterServiceRecord.customerReasonType === 2">态度不友好无法继续</text>
<text v-else-if="afterServiceRecord.customerReasonType === 3">服务效果差未达到合格</text>
<text v-else-if="afterServiceRecord.customerReasonType === 4">技能水平问题未妥善完成</text>
<text v-else-if="afterServiceRecord.customerReasonType === 5">要求加费用费用不合理</text>
<text v-else-if="afterServiceRecord.customerReasonType === 6">订单拖太久了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 7">超了些服务内容师傅不接受</text>
<text v-else-if="afterServiceRecord.customerReasonType === 8">客户/我时间不方便了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 9">客户/我已让别的师傅服务了</text>
<text>退款原因</text>
<template v-if="order.orderType === 1">
<text v-if="afterServiceRecord.customerReasonType === 1">不想要了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 2">买错型号尺寸了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 3">材质与商品描述不符</text>
<text v-else-if="afterServiceRecord.customerReasonType === 4">大小尺寸与商品描述不符</text>
<text v-else-if="afterServiceRecord.customerReasonType === 5">颜色款式型号与描述不符</text>
<text v-else-if="afterServiceRecord.customerReasonType === 6">出现质量问题</text>
<text v-else-if="afterServiceRecord.customerReasonType === 7">收到商品少件少配件</text>
<text v-else-if="afterServiceRecord.customerReasonType === 8">商家发错货</text>
<text v-else-if="afterServiceRecord.customerReasonType === 9">商品破损或污渍</text>
<text v-else-if="afterServiceRecord.customerReasonType === 10">未按承诺时间发货</text>
<text v-else-if="afterServiceRecord.customerReasonType === 11">未见快递/物流有信息</text>
<text v-else-if="afterServiceRecord.customerReasonType === 12">其它原因</text>
</template>
<template v-else>
<text v-if="afterServiceRecord.customerReasonType === 1">上门/服务不守时</text>
<text v-else-if="afterServiceRecord.customerReasonType === 2">态度不友好无法继续</text>
<text v-else-if="afterServiceRecord.customerReasonType === 3">服务效果差未达到合格</text>
<text v-else-if="afterServiceRecord.customerReasonType === 4">技能水平问题未妥善完成</text>
<text v-else-if="afterServiceRecord.customerReasonType === 5">要求加费用费用不合理</text>
<text v-else-if="afterServiceRecord.customerReasonType === 6">订单拖太久了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 7">超了些服务内容师傅不接受</text>
<text v-else-if="afterServiceRecord.customerReasonType === 8">客户/我时间不方便了</text>
<text v-else-if="afterServiceRecord.customerReasonType === 9">客户/我已让别的师傅服务了</text>
</template>
</view>
<view>
<text>具体原因</text>
@ -302,36 +508,51 @@
<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 v-else-if="afterServiceRecord.customerFinalCheck === 1">
<view v-if="afterServiceRecord.originalRefund > 0">
<view>
<text>本单退款系统已发起按客户支付的帐户原路退回</text>
<text class="text-red">{{afterServiceRecord.originalRefund}}</text>
<text>银行按工作日退款节假日顺延到帐遇客户问询请其耐心等待到账时会在客户端客户最终确认处有到账时间</text>
<view v-if="afterServiceRecord.customerFinalCheck === 0">
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.customerDisagreeImages">
<view class="bg-img" v-for="imgUrl in afterServiceRecord.customerDisagreeImages.split(',')" :key="imgUrl">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
<view>退款支付到账{{afterServiceRecord.refundApplyTime}}</view>
</view>
<view v-else-if="afterServiceRecord.originalRefund == 0 && servDetail.payStatus == 0">
<text>本单未支付实际退回0.00</text>
<view class="margin-bottom-xs" v-if="afterServiceRecord.customerDisagreeReason">
<text>不同意理由{{afterServiceRecord.customerDisagreeReason}}</text>
</view>
<view class="text-red" v-if="afterServiceRecord.customerFinalCheck === 0">订单交由平台协商处理</view>
</view>
<view v-else-if="afterServiceRecord.customerFinalCheck === 1">
<template v-if="afterServiceRecord.workerFeedbackResult !== 0">
<view v-if="(afterServiceRecord.agreedRefund > 0 || afterServiceRecord.originalRefund > 0) && order.payStatus == 1">
<view>
<text>本单退款系统已发起按客户支付的帐户原路退回</text>
<text class="text-red">{{afterServiceRecord.agreedRefund || afterServiceRecord.originalRefund}}</text>
<text>银行按工作日退款节假日顺延到帐遇客户问询请其耐心等待到账时会在客户端客户最终确认处有到账时间</text>
</view>
<view>退款支付到账{{afterServiceRecord.refundApplyTime}}</view>
</view>
<view v-else-if="order.payStatus == 0">
<text>本单已退款{{afterServiceRecord.agreedRefund}}因未实际支付实退为0元未退部分继续完成订单及正常支付</text>
</view>
</template>
<view v-else>
<text>本次售后已操作完毕售后申请已结束</text>
</view>
</view>
</view>
</view> -->
</view>
</view>
<!-- 完成记录 主单详情展示 -->
<view v-if="servDetail.orderDetailId == null" class="bg-white margin-lr-sm padding-lr padding-bottom margin-top-sm" v-for="(item, index) in servDetail.orderStandardDetailList" :key="index">
<view v-if="servDetail.orderDetailId == null && (servDetail.originalWorkerId != curUserInfo.workerId)" class="bg-white margin-lr-sm padding-lr padding-bottom margin-top-sm" v-for="(item, index) in servDetail.orderStandardDetailList" :key="index">
<view class="cu-bar solid-bottom">
<view class="action bar-first-action">
<text class="cuIcon-titles text-main-color"></text> 服务记录
<text class="cuIcon-titles text-main-color"></text> {{order.orderType === 0 ? '服务记录' : '发货记录'}}
</view>
<view>
<view class="cu-btn sm bg-main-color margin-right-sm shadow-blur" v-if="[0,1,2,3].indexOf(item.orderStatus) >= 0" @click="rejectDetailOrder(item)">撤单</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="item.orderStatus === 5">已完成</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="item.orderStatus === 4">待确认</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="item.orderStatus === 3">服务中</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="item.orderStatus === 2">待上门</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="item.orderStatus === 1">未约/未排</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="item.orderStatus === 3">{{servDetail.orderType === 0 ? '服务中' : '发货中'}}</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="item.orderStatus === 2">{{servDetail.orderType === 0 ? '待上门' : '待发货'}}</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="item.orderStatus === 1">{{servDetail.orderType === 0 ? '未约/未排' : '拣货/发货'}}</view>
<view class='cu-tag bg-purple radius light margin-right-sm' v-if="item.orderStatus === 0">待接单</view>
</view>
<!-- <view class='cu-tag bg-purple radius light margin-right-sm' v-if="item.orderStatus > 3">{{item.workFinishTime}}</view> -->
@ -342,14 +563,24 @@
<view v-if="afterServiceRecord.workerFeedbackResult == 1 && afterServiceRecord.customerFinalCheck == null" class='cu-tag margin-right-xs radius line-main-color margin-top-xs'>售后已同意</view>
<view v-if="afterServiceRecord.workerFeedbackResult == 0 && afterServiceRecord.customerFinalCheck == null" class='cu-tag margin-right-xs radius line-red margin-top-xs'>售后已拒绝</view>
<view v-if="afterServiceRecord.customerFinalCheck == 0" class='cu-tag margin-right-xs radius line-red margin-top-xs'>售后纠纷中</view>
<view v-if="afterServiceRecord.customerFinalCheck == 1" class='cu-tag margin-right-xs radius line-main-color margin-top-xs'>售后已完成</view>
</view>
<view v-if="item.timeout == 1" class="float-left">
<view v-if="item.orderStatus === 0" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未接单</view>
<view v-else-if="item.orderStatus === 1" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未预约</view>
<view v-else-if="item.orderStatus === 2" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未上门</view>
<view v-else-if="item.orderStatus === 3" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未完单</view>
<view v-if="afterServiceRecord.customerFinalCheck == 1 || afterServiceRecord.customerFinalCheck == 2" class='cu-tag margin-right-xs radius line-main-color margin-top-xs'>售后已完成</view>
</view>
<template v-if="item.timeout == 1">
<view class="float-left" v-if="order.orderType === 0">
<view v-if="item.orderStatus === 0" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未接单</view>
<view v-else-if="order.orderStatus === 1 && order.isCall === '01'" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未预约</view>
<view v-else-if="order.orderStatus === 1 && order.isCall === '02'" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未排单</view>
<view v-else-if="order.orderStatus === 1 && order.orderDetailId != null" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未预约</view>
<view v-else-if="item.orderStatus === 2" class='cu-tag margin-right-xs radius line-red margin-top-xs'>{{order.orderType === 0 ? '超时未上门' : '超时未发货'}}</view>
<view v-else-if="item.orderStatus === 3 && order.orderType === 0" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未完单</view>
</view>
<view v-else class="float-left">
<view v-if="order.orderStatus === 0" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未接单</view>
<view v-else-if="order.orderStatus === 1" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未发货</view>
<view v-else-if="order.orderStatus === 2" class='cu-tag margin-right-xs radius line-red margin-top-xs'>超时未发货</view>
</view>
</template>
<view v-if="item.afterTimeout == 1" class='cu-tag margin-right-xs radius line-red margin-top-xs'>售后超时</view>
</view>
<view class="float-clear"></view>
<view class="margin-top-sm">师傅{{item.workerName}}</view>
@ -361,9 +592,9 @@
服务金额
<text class="text-price">{{item.payMoney}}</text>
</view>
<view class="margin-top-sm" v-if="item.expectTimeEndFront">预约时间{{item.expectTimeStartFront + '~' + item.expectTimeEndFront}}</view>
<view class="margin-top-sm" v-if="item.expectTimeEndFront">预约时间{{item.expectTimeStartFront}}</view>
<view class="margin-top-sm" v-else>预约时间{{item.expectTimeStartFront}}</view>
<view class="margin-top-sm" v-if="item.orderStatus >= 3">上门时间{{item.workBeginTime}}</view>
<view class="margin-top-sm" v-if="item.orderStatus >= 3">{{order.orderType === 1 ? '发货时间' : '上门时间'}}{{item.workBeginTime}}</view>
<view class="margin-top-sm" v-if="item.orderStatus >= 4">完成时间{{item.workFinishTime}}</view>
<view class="margin-top-sm">
<product-picked :pickedList="item.orderStandardList" :columnTitleArr="servedColumnHeaders" :valFieldArr="servedValFields"></product-picked>
@ -377,12 +608,24 @@
<view class="padding-tb-sm" v-for="(changeRecord, changeRecordIndex) in item.financialChangeRecord" :key="changeRecordIndex">
<view>
<text>加价金额</text>
<text>{{changeRecord.changeMoney + (changeRecord.attachmentMoney || 0)}}</text>
</view>
<view v-if="changeRecord.reason && changeRecord.reason.indexOf('含') > -1">
<text>{{changeRecord.reason.split('含')[1]}}</text>
<text>{{changeRecord.changeMoney}}</text>
</view>
<view>
<text>加价备注</text>
<text v-if="changeRecord.remark">{{changeRecord.remark}}</text>
</view>
<view v-if="changeRecord.urls">
<view class="grid col-3 grid-square flex-sub margin-top-sm">
<view class="bg-img" v-for="imgUrl in changeRecord.urls.split(',')" :key="imgUrl">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill">
</image>
</view>
</view>
</view>
</view>
</view>
<view v-if="servDetail.orderStatus > 3 && item.finishImgList && item.finishImgList.length" class="bg-white">
@ -409,7 +652,15 @@
</view>
</view>
<view v-for="(afterServiceRecord, afterServiceRecordIndex) in item.afterServiceRecordList" :key="afterServiceRecordIndex">
<view v-if="afterServiceRecord.createBy == 1" class="padding-tb-sm solid-top">
<afterServiceRecord v-if="order.orderType === 0" :after-service-record="afterServiceRecord" :order="item" :showActionBtn="false"></afterServiceRecord>
<afterServiceRecordGoods
v-else
:after-service-record="afterServiceRecord"
:order="item"
:showActionBtn="false"
@getDeliveryFlow="(trackingNumber) => {showDeliveryFlow = true; showDeliveryFlowTrackingNumber = trackingNumber;}"
></afterServiceRecordGoods>
<!-- <view v-if="afterServiceRecord.createBy == 1" class="padding-tb-sm solid-top">
<view class='cu-tag bg-main-color radius light'>售后发起中</view>
<view v-if="afterServiceRecord.operType === 1">
<view class="text-gray text-sm margin-bottom-xs">退单退款已提交至商家其最大时限24小时内需完成操作</view>
@ -544,30 +795,84 @@
</view>
<view v-if="afterServiceRecord.customerFinalCheck != null" class="padding-tb-sm 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 v-else-if="afterServiceRecord.customerFinalCheck === 1">
<view v-if="afterServiceRecord.originalRefund > 0">
<view>
<text>本单退款系统已发起按客户支付的帐户原路退回</text>
<text class="text-red">{{afterServiceRecord.originalRefund}}</text>
<text>银行按工作日退款节假日顺延到帐遇客户问询请其耐心等待到账时会在客户端客户最终确认处有到账时间</text>
<view class="margin-top-xs">{{afterServiceRecord.customerFinalCheck === 1 ? '同意' : '不同意'}}</view>
<view v-if="afterServiceRecord.customerFinalCheck === 0">
<view class="grid col-3 grid-square flex-sub margin-top-sm" v-if="afterServiceRecord.customerDisagreeImages">
<view class="bg-img" v-for="imgUrl in afterServiceRecord.customerDisagreeImages.split(',')" :key="imgUrl">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill"></image>
</view>
<view>退款支付到账{{afterServiceRecord.refundApplyTime}}</view>
</view>
<view v-else-if="afterServiceRecord.originalRefund == 0 && servDetail.payStatus == 0">
<text>本单未支付实际退回0.00</text>
<view class="margin-bottom-xs" v-if="afterServiceRecord.customerDisagreeReason">
<text>不同意理由{{afterServiceRecord.customerDisagreeReason}}</text>
</view>
<view class="text-red" v-if="afterServiceRecord.customerFinalCheck === 0">订单交由平台协商处理</view>
</view>
<view v-if="afterServiceRecord.customerFinalCheck === 1">
<template v-if="afterServiceRecord.workerFeedbackResult !== 0">
<view v-if="(afterServiceRecord.agreedRefund > 0 || afterServiceRecord.originalRefund > 0) && order.payStatus == 1">
<view>
<text>本单退款系统已发起按客户支付的帐户原路退回</text>
<text class="text-red">{{afterServiceRecord.agreedRefund || afterServiceRecord.originalRefund}}</text>
<text>银行按工作日退款节假日顺延到帐遇客户问询请其耐心等待到账时会在客户端客户最终确认处有到账时间</text>
</view>
<view>退款支付到账{{afterServiceRecord.refundApplyTime}}</view>
</view>
<view v-else-if="order.payStatus == 0">
<text>本单已退款{{afterServiceRecord.agreedRefund}}因未实际支付实退为0元未退部分继续完成订单及正常支付</text>
</view>
</template>
<view v-else>
<text>本次售后已操作完毕售后申请已结束</text>
</view>
</view>
</view>
</view> -->
</view>
</view>
</view>
<!-- 发货信息 -->
<view class="bg-white margin-top-sm padding margin-lr-sm" v-if="servDetail.deliveryType">
<view v-if="servDetail.deliveryType">
发货方式
<text v-if="servDetail.deliveryType == 1">发快递/物流</text>
<text v-if="servDetail.deliveryType == 2">送货上门</text>
<text v-if="servDetail.deliveryType == 3">客户自提</text>
</view>
<view class="margin-top-xs" v-if="servDetail.deliveryImages">
<view class="grid col-3 grid-square flex-sub">
<view class="bg-img" v-for="imgUrl in servDetail.deliveryImages.split(',')" :key="imgUrl">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill">
</image>
</view>
</view>
</view>
<view class="margin-top-xs" v-if="servDetail.deliveryRemark"><text>发货备注{{servDetail.deliveryRemark}}</text></view>
<view class="margin-top-xs" v-if="servDetail.trackingNumber">
<text>快递单号{{servDetail.trackingNumber}}</text>
<text class="text-main-color margin-left-sm" @click="getDeliveryFlow(servDetail.trackingNumber)">查询</text>
</view>
</view>
<!-- 交货记录 -->
<view class="bg-white margin-top-sm padding margin-lr-sm" v-if="servDetail.handoverRemark || servDetail.handoverImages">
<view>交货记录</view>
<view class="margin-top-xs" v-if="servDetail.handoverImages">
<view class="grid col-3 grid-square flex-sub">
<view class="bg-img" v-for="imgUrl in servDetail.handoverImages.split(',')" :key="imgUrl">
<image :src="imgUrl" @tap="viewImage($event, [imgUrl])" :data-url="imgUrl" mode="aspectFill">
</image>
</view>
</view>
</view>
<view class="margin-top-xs" v-if="servDetail.deliveryRemark"><text>交货备注{{servDetail.handoverRemark}}</text></view>
</view>
<!-- 订单编码和时间 -->
<view class="bg-white margin-top-sm padding margin-lr-sm">
<view v-if="servDetail.orderDetailCode != null">订单编码{{servDetail.orderDetailCode}}</view>
<view v-else>订单编码{{servDetail.orderMasterCode}}</view>
<view class="margin-top-xs" v-if="servDetail.originalOrderMasterCode">原订单编码{{servDetail.originalOrderMasterCode}}</view>
<view class="margin-top-xs">订单时间{{servDetail.createTime}}</view>
</view>
<view class="occupancy-bottom-bar"></view>
@ -576,7 +881,7 @@
<view class="action" data-popup="orderManage" @click="togglePopup">
<view class="cuIcon-list"></view> 订单管理
</view>
<view v-if="servDetail.orderDetailId != null && servDetail.orderStatus === 2" class="bg-main-color submit" @click="workBegin">立即上门</view>
<view v-if="servDetail.orderDetailId != null && servDetail.orderStatus === 2" class="bg-main-color submit" @click="workBegin">{{order.orderType === 0 ? (servDetail.goods.storeService ? '立即服务' : '立即上门') : '立即发货'}}</view>
</view>
<!-- <view class="cu-bar bg-white tabbar border fixed-bottom-bar" v-if="servDetail.orderDetailId != null && servDetail.orderStatus === 2">
<view class="action" data-popup="orderManage" @click="togglePopup">
@ -605,27 +910,43 @@
</uni-popup>
<!-- 模态框 -->
<urgent-msg :show="sendUrgentMsgModal" @hideModal="hideModal"></urgent-msg>
<apply-extra-charge v-if="applyExtraChargeModal" :show="applyExtraChargeModal" :data="servDetail" @close="applyExtraChargeClose"></apply-extra-charge>
<apply-charge v-if="applyChargeModal" :show="applyChargeModal" :data="servDetail" @close="applyChargeClose"></apply-charge>
<!-- <apply-extra-charge v-if="applyExtraChargeModal" :show="applyExtraChargeModal" :data="servDetail" @close="applyExtraChargeClose"></apply-extra-charge> -->
<apply-charge v-if="applyChargeModal" ref="applyChargeModal" :show="applyChargeModal" :data="servDetail" @close="applyChargeClose" @callAgain="callApplyChargeAgain"></apply-charge>
<task-process-detail :show="taskProcessDetail" :arr="taskListArr" @close="taskDetailClose"></task-process-detail>
<task-process-detail :show="taskProcessDetail" :arr="taskListArr" @close="taskDetailClose"></task-process-detail>
<deliveryFlowDetail :show="showDeliveryFlow" :trackingNumber="showDeliveryFlowTrackingNumber" @close="showDeliveryFlow = false"></deliveryFlowDetail>
<deliverGoods v-if="showDeliverGoods" :show="showDeliverGoods" :data="servDetail" @close="showDeliverGoods = false" @confirmFeedback="showDeliverGoods = false;loadData()"></deliverGoods>
<on-door-immediately v-if="showOnDoorNoticeModal" :show="showOnDoorNoticeModal" :data="servDetail" @close="showOnDoorNoticeModal = false" @confirmFeedback="showOnDoorNoticeModal = false;loadData()"></on-door-immediately>
</view>
</template>
<script>
import productPicked from '@/components/goods-card/product-picked.vue';
import urgentMsg from '@/pages/order-manage/modal/urgent-msg.vue';
import applyExtraCharge from '@/pages/order-manage/modal/apply-extra-charge.vue';
// import applyExtraCharge from '@/pages/order-manage/modal/apply-extra-charge.vue';
import applyCharge from '@/pages/order-manage/modal/apply-charge.vue';
import taskProcessDetail from '@/pages/order-manage/modal/task_process_detail.vue'
import deliveryFlowDetail from '@/pages/order-manage/modal/delivery_flow_detail.vue';
import deliverGoods from '@/pages/order-manage/modal/deliver-goods.vue';
import onDoorImmediately from '@/pages/order-manage/modal/on-door-immediately.vue';
import afterServiceRecord from './components/afterServiceRecord.vue';
import afterServiceRecordGoods from './components/afterServiceRecordGoods.vue';
export default {
components: {
productPicked,
urgentMsg,
applyExtraCharge,
// applyExtraCharge,
taskProcessDetail,
applyCharge
applyCharge,
deliveryFlowDetail,
deliverGoods,
onDoorImmediately,
afterServiceRecord,
afterServiceRecordGoods
},
data() {
return {
@ -643,11 +964,11 @@
// name: '',
// action: 'applyFittings'
// },
{
name: '申请附加费',
action: 'applyExtraCharge',
modal: 'applyExtraChargeModal'
},
// {
// name: '',
// action: 'applyExtraCharge',
// modal: 'applyExtraChargeModal'
// },
{
name: '申请费用',
action: 'applyCharge',
@ -671,20 +992,44 @@
applyExtraChargeModal: false,
taskProcessDetail: false,
taskListArr: [],
applyChargeModal: false
applyChargeModal: false,
showDeliveryFlow: false,
showDeliverGoods: false,
showOnDoorNoticeModal: false,
curUserInfo: null,
showDeliveryFlowTrackingNumber: ''
}
},
onLoad(options) {
this.bindEvent();
if (options && options.order) {
this.order = JSON.parse(decodeURIComponent(options.order));
}
}
console.log(this.order);
if(this.order.orderType === 1) {
this.servingColumnHeaders = ['购买型号', '购买量', '待发货']
this.servedColumnHeaders = ['购买型号', '购买量', '已发货']
}
this.curUserInfo = this.$request.getCurUserInfo();
this.loadData();
},
onUnload() {
this.offBindEvent();
},
methods: {
openShopLocation(item) {
// const gcj02Coord = wgs84ToGcj02(item.shop.longitude, item.shop.latitude)
// const gcj02Coord = wgs84ToGcj02(102.80154676649306, 24.969456922743056)
// const gcj02Coord = [102.82868680950929, 24.864792838337802]
const gcj02Coord = [item.longitude, item.latitude]
wx.openLocation({
latitude: gcj02Coord[1],
longitude: gcj02Coord[0],
scale: 18,
name: item.shopName,
address: `${item.provinceName}${item.cityName}${item.countryName}${item.streetName}${item.address}`
})
},
//
showTaskDetailMdl() {
this.taskProcessDetail = true
@ -714,6 +1059,7 @@
let servDetailRes = await this.$request[funName]({
id: orderId
});
servDetailRes.data.orderType = this.order.orderType;
this.servDetail = servDetailRes.data;
this.getProcessData()
},
@ -741,15 +1087,25 @@
applyFittings() {
console.log("申请配件")
},
applyExtraCharge() {
console.log("申请charge")
this.applyExtraChargeModal = true;
},
applyExtraChargeClose() {
this.applyExtraChargeModal = false;
},
// applyExtraCharge() {
// console.log("charge")
// this.applyExtraChargeModal = true;
// },
// applyExtraChargeClose() {
// this.applyExtraChargeModal = false;
// },
applyCharge() {
this.applyChargeModal = true;
console.log('resetPriceChangedInfo');
this.$nextTick(() => {
this.$refs.applyChargeModal.initPriceData()
})
},
async callApplyChargeAgain() {
await this.loadData();
this.$nextTick(() => {
this.$refs.applyChargeModal.initPriceData()
})
},
applyChargeClose() {
this.applyChargeModal = false;
@ -764,20 +1120,25 @@
})
},
async workBegin() {
let curDate = new Date();
let formatCurDate = curDate.getFullYear() + '-' + (curDate.getMonth() + 1) + '-' + curDate.getDate()
+ ' ' + curDate.getHours() + ':' + curDate.getMinutes() + ':' + curDate.getSeconds();
let params = {
id: this.servDetail.orderDetailId,
orderStatus: 3,
workBeginTime: formatCurDate
}
let res = await this.$request.updateDetailOrder(params);
if (res && res.code === 0) {
this.loadData(this.servDetail.orderDetailId);
uni.showToast({
icon: 'success'
})
if(this.order.orderType === 1) {
this.showDeliverGoods = true
} else {
this.showOnDoorNoticeModal = true
// let curDate = new Date();
// let formatCurDate = curDate.getFullYear() + '-' + (curDate.getMonth() + 1) + '-' + curDate.getDate()
// + ' ' + curDate.getHours() + ':' + curDate.getMinutes() + ':' + curDate.getSeconds();
// let params = {
// id: this.servDetail.orderDetailId,
// orderStatus: 3,
// workBeginTime: formatCurDate
// }
// let res = await this.$request.updateDetailOrder(params);
// if (res && res.code === 0) {
// this.loadData(this.servDetail.orderDetailId);
// uni.showToast({
// icon: 'success'
// })
// }
}
},
showModal(e) {
@ -814,6 +1175,11 @@
phoneNumber: phoneNum
})
},
copyData(data) {
uni.setClipboardData({
data: data
});
},
async rejectDetailOrder(order) {
let res = await this.$request.rejectDetailOrder({
id: order.orderDetailId
@ -831,7 +1197,33 @@
title: '操作失败'
})
}
},
},
async cancelMasterOrder(order) {
let res = await this.$request.rejectMasterOrderWhenAccepted({
id: order.orderMasterId
});
if (res && res.code === 0) {
uni.showToast({
icon: 'none',
title: '撤单成功,请回商品订单管理处理或重派。',
duration: 2000
})
setTimeout(() => {
uni.navigateBack()
}, 3000)
} else {
uni.showToast({
icon: 'none',
title: res.msg,
duration: 2000
})
}
},
//
getDeliveryFlow(TrackingNumber) {
this.showDeliveryFlow = true;
this.showDeliveryFlowTrackingNumber = TrackingNumber;
}
}
}
</script>

BIN
static/add-img.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

View File

@ -266,7 +266,7 @@
this.clearPropagation = true
},
open(direction) {
open(direction) {
// fix by mehaotian
if (this.showPopup) {
clearTimeout(this.timer)

View File

@ -236,7 +236,7 @@
position: absolute;
border-radius: 4px;
font-size: 12px;
padding: 10px;
padding: 5px 3px;
min-width: 10px;
word-wrap: break-word;
display: inline-block;