dingdong-master/pages/my/master-occupancy-parts.vue

742 lines
24 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<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>