dingdong-master/pages/my/new-serv.vue

1089 lines
37 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>
<!-- 表单内容 -->
<form @submit="submit" style="position: relative; z-index: 1;">
<view class="cu-form-group">
<view class="title">服务名称<text class="text-red">*</text></view>
<input name="servName" v-model="formData.servName" placeholder="请编辑上架标题(供客户搜索)"></input>
</view>
<view class="cu-form-group">
<view class="title">搜索关键词<text class="text-red">*</text></view>
<input name="servDesc" v-model="formData.servDesc" placeholder="多个关键词用#分隔"></input>
</view>
<view class="solid-top">
<view class="cu-form-group">
<view class="title">选择类目<text class="text-red">*</text></view>
<picker :mode="'multiSelector'" @change="categoryChange" @columnchange="categoryColChange"
:value="categoryMultiIndex" :range-key="'goodsCategoryName'" :range="categoryList">
<input v-if="formData.category" disabled class="line-input radius-input"
:value="formData.category && formData.category.length ? formData.category[0].goodsCategoryName + '-' + formData.category[1].goodsCategoryName + '-' + formData.category[2].goodsCategoryName : ''"
placeholder="请选择类目" />
<input v-else-if="formData.categoryConcatName" disabled class="line-input radius-input"
:value="formData.categoryConcatName" placeholder="请选择类目" />
</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" class="padding-tb-sm">
<view class="flex">
<view class="flex-sub">
<checkbox style="transform:scale(1)" class="main-color margin-right-xs"
:value="index" :checked="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 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 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 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 class="radius-input xs" @input="inputSpecs($event, index, 'goodsNum')"
:value="item.goodsNum" placeholder="库存数"></input>
</view>
</view>
</view>
</checkbox-group>
<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>
</view>
<!-- <view class="solid-top"> -->
<!-- <view class="padding-lr flex align-center">
<view class="flex-twice flex justify-start align-center">
<view style="width: 20%;">单位</view>
<my-uni-combox :candidates="productUnits" placeholder="请选择" v-model="formData.productUnit">
</my-uni-combox>
</view>
<view class="flex-sub margin-left">
优惠券+
</view>
</view> -->
<!-- <view class="padding-lr flex align-center padding-tb-xs"> -->
<!-- <view class="cu-form-group"> -->
<!-- <checkbox style="transform:scale(1)" class="main-color margin-right-xs" :value="true"
:v-model="formData.isGoldenServ" :checked="formData.isGoldenServ"></checkbox> -->
<!-- <view class="title">金牌服务<text class="margin-left-xs text-red">*</text></view> -->
<!-- <my-uni-combox :candidates="servHonorTitle" placeholder="请选择" v-model="formData.servHonorTitle"> -->
<!-- </my-uni-combox> -->
<!-- </view> -->
<!-- <view class="flex-twice flex justify-start align-center">
<view style="width: 25%;">质保期</view>
<my-uni-combox :candidates="productProtectTimes" placeholder="请选择"
v-model="formData.productProtectTime"></my-uni-combox>
</view> -->
<!-- </view> -->
<!-- </view> -->
</view>
<view class="cu-form-group solid-top justify-start">
<view class="title">商品单位<text class="text-red">*</text></view>
<my-uni-combox class="form-val-area" :candidates="goodsUnitList" placeholder="上方已填单位则以上方所填为准"
v-model="formData.goodsUnit">
</my-uni-combox>
</view>
<view class="cu-form-group justify-start">
<view class="title">质保期<text class="text-red">*</text></view>
<my-uni-combox class="form-val-area" :candidates="warrantyPeriodList" placeholder="请选择"
v-model="formData.warrantyPeriod">
</my-uni-combox>
</view>
<view class="cu-form-group justify-start">
<!-- <checkbox style="transform:scale(1)" class="main-color margin-right-xs" :value="true"
:v-model="formData.isGoldenServ" :checked="formData.isGoldenServ"></checkbox> -->
<view class="title">服务活动<text class="text-red">*</text></view>
<my-uni-combox class="form-val-area" :candidates="servActivityList" placeholder="请选择"
v-model="formData.servActivity">
</my-uni-combox>
</view>
<view class="cu-form-group justify-start">
<!-- <checkbox style="transform:scale(1)" class="main-color margin-right-xs" :value="true"
:v-model="formData.isGoldenServ" :checked="formData.isGoldenServ"></checkbox> -->
<view class="title">服务时效<text class="text-red">*</text></view>
<my-uni-combox class="form-val-area" :candidates="expectDurationList" placeholder="请选择"
v-model="formData.expectDuration">
</my-uni-combox>
</view>
<view class="solid-top">
<view class="cu-form-group">
<view class="title">上架区域<text class="text-red">*</text></view>
<picker :mode="'multiSelector'" @change="regionChange" @columnchange="regionColChange"
:value="regionMultiIndex" :range-key="'areaName'" :range="regionList">
<input disabled class="line-input radius-input" v-if="formData.region"
:value="formData.region && formData.region.length ? formData.region[0].areaName + '-' + formData.region[1].areaName : ''"
placeholder="请选择区域"></input>
<input disabled class="line-input radius-input" v-else-if="formData.areaConcatName"
:value="formData.areaConcatName" placeholder="请选择区域"></input>
</picker>
</view>
<view class="padding-lr bg-white">
<checkbox-group @change="checkDistirct" class="grid col-3">
<view v-for="(item, index) in formData.districtList" class="margin-tb-xs">
<checkbox style="transform:scale(1)" class="main-color margin-right-xs" :value="index"
:checked="item.checked"></checkbox>
<text>{{item.areaName}}</text>
</view>
</checkbox-group>
</view>
</view>
<view class="cu-bar bg-white">
<view class="action text-black">区域描述<text class="text-red">*</text></view>
</view>
<view class="padding-lr-sm padding-bottom-sm bg-white">
<textarea name="areaDesc" style="width: 100%; height: 150rpx;" class="solid radius text-left padding-sm"
v-model="formData.areaDesc" maxlength="-1" placeholder="如XX区XX街道未覆盖或XX区仅服务XX街道"></textarea>
</view>
<!-- 多城市 -->
<view v-for="(item,index) in servArea" class="bg-white">
<view class="solid-top">
<view @click="delServArea(index)">
<button class="cu-btn bg-red light">
<text class="margin-right-xs"><text class="cuIcon-close"></text></text>
<text>删除</text>
</button>
</view>
<view class="cu-form-group">
<view class="title">上架区域<text class="text-red">*</text></view>
<picker :mode="'multiSelector'" @change="multiRegionChange($event, index)"
@columnchange="multiRegionColChange($event, index)"
:value="servArea[index].regionMultiIndex" :range-key="'areaName'"
:range="servArea[index].regionList">
<input disabled class="line-input radius-input" v-if="servArea[index].region"
:value="servArea[index].region && servArea[index].region.length ? servArea[index].region[0].areaName + '-' + servArea[index].region[1].areaName : ''"
placeholder="请选择区域"></input>
</picker>
</view>
<view class="padding-lr bg-white">
<checkbox-group @change="multiAreaCheckDistirct($event, index)" class="grid col-3">
<view v-for="(item, index1) in servArea[index].districtList" class="margin-tb-xs">
<checkbox style="transform:scale(1)" class="main-color margin-right-xs" :value="index1"
:checked="item.checked"></checkbox>
<text>{{item.areaName}}</text>
</view>
</checkbox-group>
</view>
</view>
<view class="cu-bar">
<view class="action text-black">区域描述<text class="text-red">*</text></view>
</view>
<view class="padding-lr-sm padding-bottom-sm">
<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>
</view>
</view>
<view class="text-center padding-bottom bg-white">
<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 class="cu-form-group">
<view class="title">上门费</view>
<input type="digit" name="doorPrice" :value="formData.doorPrice" :v-model="formData.doorPrice"
placeholder="单位:元/次"></input>
</view> -->
<view class="cu-bar bg-white solid-top">
<view class="action text-black">
商品封面图上传<text class="text-red">*</text>【只能一张一张上传】
</view>
</view>
<view class="cu-form-group">
<view class="grid col-4 grid-square flex-sub">
<view class="bg-img" v-for="(item,index) in formData.coverImgList" :key="index"
@tap="viewImage($event, formData.coverImgList)" :data-url="item">
<image :src="item" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, formData.coverImgList)"
:data-index="index">
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImgList($event, 'coverImgList', 200, 200)"
v-if="formData.coverImgList.length === 0">
<text class='cuIcon-cameraadd'></text>
</view>
</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action text-black">
详情图上传<text class="text-red">*</text>【可多张勾选同时上传】
</view>
</view>
<view class="cu-form-group">
<view class="grid col-4 grid-square flex-sub">
<view class="bg-img" v-for="(item,index) in formData.descImgList" :key="index"
@tap="viewImage($event, formData.descImgList)" :data-url="item">
<image :src="item" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, formData.descImgList)"
:data-index="index">
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImgNoCrop($event, 'descImgList')"
v-if="formData.descImgList.length<9">
<text class='cuIcon-cameraadd'></text>
</view>
</view>
</view>
<view class="cu-bar bg-white solid-top">
<view class="action text-black">
轮播图上传<text class="text-red">*</text>【只能一张一张上传】
</view>
</view>
<view class="cu-form-group">
<view class="grid col-4 grid-square flex-sub">
<view class="bg-img" v-for="(item,index) in formData.imgList" :key="index"
@tap="viewImage($event, formData.imgList)" :data-url="item">
<image :src="item" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, formData.imgList)" :data-index="index">
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImgList($event, 'imgList')" v-if="formData.imgList.length<9">
<text class='cuIcon-cameraadd'></text>
</view>
</view>
</view>
<ksp-cropper mode="fixed" :width="cropWidth" :height="cropHeight" :maxWidth="cropWidth"
:maxHeight="cropHeight" :url="url2Crop" @cancel="oncancel" @ok="onok"></ksp-cropper>
<view class="cu-bar bg-white solid-top">
<view class="action text-black">
视频上传【一分钟内的视频最佳】
</view>
</view>
<!-- <view class="bg-white padding-lr padding-bottom-sm">
<uni-file-picker limit="1" file-mediatype="video" return-type="object" @select="selectVideo">
<button class="cu-btn bg-main-color shadow-blur">选择文件</button>
</uni-file-picker>
</view> -->
<view class="cu-form-group">
<view class="grid col-4 grid-square flex-sub" v-if="formData.videoList.length === 0">
<view class="solids" @tap="chooseVideo()">
<text class='cuIcon-cameraadd'></text>
</view>
</view>
<view class="grid grid-square flex-sub" v-else>
<view class="bg-img" v-for="(item,index) in formData.videoList" :key="index" :data-url="item">
<video :src="item" controls></video>
<view class="cu-tag bg-red" @tap.stop="delImg($event, formData.videoList)" :data-index="index">
<text class='cuIcon-close'></text>
</view>
</view>
</view>
</view>
<view class="padding-sm bg-white solid-top">
<textarea style="width: 100%;" class="solid radius text-left padding-sm" v-model="formData.detailDesc"
maxlength="-1" placeholder="请输入详情介绍"></textarea>
</view>
<view class="padding-bottom-lg padding-top bg-white text-center">
<button class="cu-btn bg-main-color shadow-blur long-btn" @click="submit">确定</button>
</view>
</form>
<!-- 账户及实名弹窗 -->
<!-- <vertify-bank-bind ref="vertifyBankBind"></vertify-bank-bind> -->
<vertify-certify ref="vertifyCertify"></vertify-certify>
</view>
</template>
<script>
import myUniCombox from '@/components/uni-combox/my-uni-combox.vue';
export default {
components: {
myUniCombox
},
data() {
return {
goodsId: null,
formData: {
servName: '',
servDesc: '',
specsList: [],
category: [],
productUnit: '',
isGoldenServ: false,
region: [],
districtList: [],
areaDesc: '',
doorPrice: '',
imgList: [],
detailDesc: '',
descImgList: [],
coverImgList: [],
videoList: []
},
servArea: [],
sysInfo: null,
url2Crop: '',
cropWidth: 0,
cropHeight: 0,
curImgListField: '',
categoryList: [],
categoryMultiIndex: [0, 0, 0],
regionList: [],
regionMultiIndex: [0, 0],
isShowAllSpecs: false,
goodsUnitList: [{
code: 1,
name: '台'
}, {
code: 2,
name: '件'
}, {
code: 3,
name: '个'
}, {
code: 4,
name: '套'
}, {
code: 5,
name: '㎡'
}, {
code: 6,
name: '只'
}, {
code: 7,
name: '张'
}, {
code: 8,
name: '条'
}, {
code: 9,
name: '顶'
}, {
code: 10,
name: '支'
}, {
code: 11,
name: '根'
}],
servActivityList: [{
code: 1,
name: '金牌服务'
}, {
code: 2,
name: '定制预售'
}, {
code: 3,
name: '特惠团购'
}, {
code: 4,
name: '分享0元购'
}],
warrantyPeriodList: [{
code: 1,
name: '15天'
}, {
code: 2,
name: '30天'
}, {
code: 3,
name: '45天'
}, {
code: 4,
name: '3个月'
}, {
code: 5,
name: '6个月'
}, {
code: 6,
name: '12个月'
}],
expectDurationList: [{
name: '12点前下单预计当天下午上门/服务'
}, {
name: '17点前下单预计次日上门/服务'
}, {
name: '现时下单,预计次日上门/服务'
}, {
name: '现时下单,预计后日上门/服务'
}],
curUserInfo: {},
bankCard: null,
certifyInfo: null
}
},
onLoad(options) {
if (options && options.goodId) {
this.goodsId = options.goodId;
}
this.loadData(this.goodsId);
},
methods: {
async loadData(goodId) {
this.sysInfo = uni.getSystemInfoSync();
this.curUserInfo = this.$request.getCurUserInfo();
if (goodId) {
this.getCurGoodsInfo(goodId);
}
this.checkBankAndCertify();
this.loadCategoryList();
this.loadRegionList();
// TODO 如果存在goodId说明是修改需要查询good信息进行回显
// this.categoryList = await this.$api.data('categoryList');
// this.regionList = await this.$api.data('regionList');
},
async getCurGoodsInfo(goodsId) {
let res1 = await this.$request.qryProductDetail({
goodsId: goodsId
});
let goods = res1.data;
// 选中规则转map
let chosenGoodsStandardMap = new Map();
goods.goodsStandardList.forEach(o => {
chosenGoodsStandardMap.set(o.deptGoodsCategoryId, o);
});
// 查询选中的第三级类目下的所有规格
let res2 = await this.$request.listByStep({
type: 1,
goodsCategoryId: goods.deptGoodsCategoryId
});
let specsList = res2.data;
let newSpecsList = [];
specsList.forEach(o => {
if (chosenGoodsStandardMap.has(o.deptGoodsCategoryId)) {
o = chosenGoodsStandardMap.get(o.deptGoodsCategoryId);
o.checked = true;
}
newSpecsList.push(o);
});
// 选中地区转map
let chosenAreaMap = new Map();
goods.goodsAreaList.forEach(o => {
chosenAreaMap.set(o.countryAreaId, o);
});
// 查询选中的第二级区域下的第三级区域
let res3 = await this.$request.areaListByStep({
parentCode: goods.parentAreaId
});
let areaList = res3.data;
let newAreaList = [];
areaList.forEach(o => {
if (chosenAreaMap.has(o.areaId)) {
o = chosenAreaMap.get(o.areaId);
o.checked = true;
}
newAreaList.push(o);
});
this.formData = {
servName: goods.goodsName,
servDesc: goods.goodsDesc,
categoryConcatName: goods.categoryConcatName,
deptGoodsCategoryId: goods.deptGoodsCategoryId,
specsList: newSpecsList,
goodsUnit: {
name: goods.goodsUnit
},
warrantyPeriod: {
name: goods.warrantyPeriod
},
servActivity: {
name: goods.servActivity
},
expectDuration: {
name: goods.expectDuration
},
areaConcatName: goods.areaConcatName,
districtList: newAreaList,
detailDesc: goods.remark,
areaDesc: goods.areaDesc,
coverImgList: [goods.goodsImgUrl],
imgList: goods.lbUrl,
descImgList: goods.detailUrl,
videoList: goods.goodsVideoUrl ? [goods.goodsVideoUrl] : [],
// status: 0,
}
},
async checkBankAndCertify() {
// 查询账户绑定信息
// let bankCardRes = await this.$request.getBindBankCardByWorkerId({
// workerId: this.curUserInfo.workerId
// });
// this.bankCard = bankCardRes.data;
// 查询实名信息
let certifyInfoRes = await this.$request.getWorkerCertify();
this.certifyInfo = certifyInfoRes.data;
// if (!this.bankCard || !this.bankCard.bankNum) {
// this.$refs.vertifyBankBind.showModal();
// return false;
if (!this.certifyInfo || !this.certifyInfo.workerCertificationId) {
this.$refs.vertifyCertify.showModal();
return false;
}
return true;
},
async loadCategoryList(idArr) {
let typeList = await this.$request.listByStep({
type: 1
});
typeList = typeList.data;
let col1Id = idArr ? idArr[0] : typeList[0].goodsCategoryId;
let subTypeList = await this.$request.listByStep({
type: 1,
goodsCategoryId: col1Id
});
subTypeList = subTypeList.data;
let col2Id = idArr ? idArr[1] : subTypeList[0].goodsCategoryId;
let subSubTypeList = await this.$request.listByStep({
type: 1,
goodsCategoryId: col2Id
});
subSubTypeList = subSubTypeList.data;
let col3Id = idArr ? idArr[2] : subSubTypeList[0].goodsCategoryId;
let thirdTypeList = await this.$request.listByStep({
type: 1,
goodsCategoryId: col3Id
});
thirdTypeList = thirdTypeList.data;
// this.categoryList.push(typeList);
this.categoryList.push(subTypeList);
this.categoryList.push(subSubTypeList);
this.categoryList.push(thirdTypeList);
},
async loadRegionList() {
let regionList = await this.$request.areaListByStep();
regionList = regionList.data;
let subRegionList = [];
if (regionList && regionList.length > 0) {
subRegionList = await this.$request.areaListByStep({
parentCode: regionList[0].areaCode
});
subRegionList = subRegionList.data;
}
this.regionList.push(regionList);
this.regionList.push(subRegionList);
},
async categoryChange(e) {
this.categoryMultiIndex = e.detail.value;
let chosenCategory = [];
for (let i = 0; i < this.categoryList.length; i++) {
chosenCategory.push(this.categoryList[i][this.categoryMultiIndex[i]]);
}
this.formData.category = chosenCategory;
this.formData.deptGoodsCategoryId = this.formData.category[this.formData.category.length - 1]
.goodsCategoryId;
// 查询最后一级品类
let res = await this.$request.listByStep({
type: 1,
goodsCategoryId: chosenCategory[chosenCategory.length - 1].goodsCategoryId
});
this.formData.specsList = res.data;
},
async categoryColChange(e) {
let colObj = e.detail;
if (colObj.column == 0) {
// 通过一级查询二级,通过二级查三级
let subTypeList = await this.$request.listByStep({
type: 1,
goodsCategoryId: this.categoryList[0][colObj.value].goodsCategoryId
});
subTypeList = subTypeList.data;
let subSubTypeList = [];
if (subTypeList && subTypeList.length) {
subSubTypeList = await this.$request.listByStep({
type: 1,
goodsCategoryId: subTypeList[0].goodsCategoryId
});
subSubTypeList = subSubTypeList.data;
}
this.categoryList.pop();
this.categoryList.pop();
this.categoryList.push(subTypeList);
this.categoryList.push(subSubTypeList);
this.categoryMultiIndex = [colObj.value, 0, 0];
} else if (colObj.column == 1) {
// 通过二级查三级
let subSubTypeList = await this.$request.listByStep({
type: 1,
goodsCategoryId: this.categoryList[1][colObj.value].goodsCategoryId
});
subSubTypeList = subSubTypeList.data;
this.categoryList.pop();
this.categoryList.push(subSubTypeList);
this.categoryMultiIndex = [this.categoryMultiIndex[0], colObj.value, 0];
}
},
async regionChange(e) {
this.regionMultiIndex = e.detail.value;
let chosenRegion = [];
for (let i = 0; i < this.regionList.length; i++) {
chosenRegion.push(this.regionList[i][this.regionMultiIndex[i]]);
}
this.formData.region = chosenRegion;
// 查询最后一级区域
let areaList = await this.$request.areaListByStep({
parentCode: chosenRegion[1].areaCode
});
this.formData.districtList = areaList.data;
},
async multiRegionChange(e, regionIndex) {
this.servArea[regionIndex].regionMultiIndex = e.detail.value;
let chosenRegion = [];
for (let i = 0; i < this.servArea[regionIndex].regionList.length; i++) {
chosenRegion.push(this.servArea[regionIndex].regionList[i][this.servArea[regionIndex]
.regionMultiIndex[i]
]);
}
this.servArea[regionIndex].region = chosenRegion;
// 查询最后一级区域
let areaList = await this.$request.areaListByStep({
parentCode: chosenRegion[1].areaCode
});
this.servArea[regionIndex].districtList = areaList.data;
},
async regionColChange(e) {
let colObj = e.detail;
if (colObj.column == 0) {
// 通过一级查二级
let subAreaList = await this.$request.areaListByStep({
parentCode: this.regionList[0][colObj.value].areaCode
});
subAreaList = subAreaList.data;
this.regionList.pop();
this.regionList.push(subAreaList);
this.regionMultiIndex = [colObj.value, 0];
}
},
async multiRegionColChange(e, regionIndex) {
let colObj = e.detail;
if (colObj.column == 0) {
// 通过一级查二级
let subAreaList = await this.$request.areaListByStep({
parentCode: this.regionList[0][colObj.value].areaCode
});
subAreaList = subAreaList.data;
this.servArea[regionIndex].regionList.pop();
this.servArea[regionIndex].regionList.push(subAreaList);
this.servArea[regionIndex].regionMultiIndex = [colObj.value, 0];
}
},
checkSpecs(e) {
let checkedIndexArr = e.detail.value;
for (let i = 0; i < this.formData.specsList.length; i++) {
if (checkedIndexArr.indexOf(String(i)) !== -1) {
this.formData.specsList[i].checked = true;
} else {
this.formData.specsList[i].checked = false;
}
}
},
inputSpecs(e, index, field) {
this.formData.specsList[index][field] = e.detail.value;
},
showAllSpecs() {
this.isShowAllSpecs = !this.isShowAllSpecs;
},
hideTips(tipName, index) {
if (typeof index === 'number' && index >= 0) {
this.$refs[tipName][index].close();
} else {
this.$refs[tipName].close();
}
},
checkDistirct(e) {
let checkedIndexArr = e.detail.value;
for (let i = 0; i < this.formData.districtList.length; i++) {
if (checkedIndexArr.indexOf(String(i)) !== -1) {
this.formData.districtList[i].checked = true;
} else {
this.formData.districtList[i].checked = false;
}
}
},
multiAreaCheckDistirct(e, index) {
let checkedIndexArr = e.detail.value;
for (let i = 0; i < this.servArea[index].districtList.length; i++) {
if (checkedIndexArr.indexOf(String(i)) !== -1) {
this.servArea[index].districtList[i].checked = true;
} else {
this.servArea[index].districtList[i].checked = false;
}
}
},
chooseImgList(e, imgListField, cropWidth, cropHeight) {
this.cropWidth = cropWidth && cropWidth > 0 ? cropWidth : this.sysInfo.windowWidth * 2;
this.cropHeight = cropHeight && cropHeight > 0 ? cropHeight : this.sysInfo.windowWidth * 2 * 1.15;
uni.chooseImage({
count: 1, //默认9
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: ['album'], //从相册选择
success: (res) => {
res.tempFilePaths.forEach((tmpUrl, index) => {
this.url2Crop = tmpUrl;
this.curImgListField = imgListField;
});
}
});
},
onok(ev) {
uni.showLoading({
title: '上传中',
mask: true
});
this.$request.uploadFile(ev.path).then((url) => {
this.formData[this.curImgListField].push(url);
uni.hideLoading();
});
// url设置为空隐藏控件
this.url2Crop = "";
},
oncancel() {
// url设置为空隐藏控件
this.url2Crop = "";
},
chooseImgNoCrop(e, imgListField) {
uni.chooseImage({
count: 9, //默认9
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: ['album'], //从相册选择
success: (res) => {
uni.showLoading({
title: '上传中',
mask: true
});
res.tempFilePaths.forEach((tmpUrl, index) => {
this.$request.uploadFile(tmpUrl).then((url) => {
this.formData[imgListField].push(url);
if (index === res.tempFilePaths.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)
}
}
})
},
chooseVideo() {
let _this = this;
uni.chooseVideo({
sourceType: ['camera', 'album'],
success: function(res) {
uni.showLoading({
title: '上传中',
mask: true
});
_this.$request.uploadFile(res.tempFilePath).then((url) => {
uni.hideLoading();
_this.formData.videoList.push(url);
});
}
});
},
// async selectVideo(e) {
// uni.showLoading({
// title: '上传中',
// mask: true
// });
// this.formData.video = await this.$request.uploadFile(e.tempFilePaths[0]);
// uni.hideLoading();
// },
validData(data) {
let errMsg = "";
if (!data.servName) {
errMsg = '服务名称不能为空';
} else if (!data.servDesc) {
errMsg = '搜索关键词不能为空';
} else if ((!data.category || !data.category.length) && (!data.categoryConcatName)) {
errMsg = '请选择类目';
} else if (!data.goodsStandardList || !data.goodsStandardList.length) {
errMsg = '至少勾选一个规格';
} else if (!this.validSpecData(data.goodsStandardList)) {
return false;
} else if (!data.goodsUnit) {
errMsg = '商品单位不能为空';
} else if (!data.warrantyPeriod) {
errMsg = '质保期不能为空';
} else if (!data.servActivity) {
errMsg = '服务活动不能为空';
} else if (!data.expectDuration) {
errMsg = '服务时效不能为空';
} else if (!data.goodsAreaList || !data.goodsAreaList.length) {
errMsg = '上架区域填写不完整';
} else if (!data.areaDesc) {
errMsg = '区域描述不能为空';
} else if (!data.coverImgList || !data.coverImgList.length) {
errMsg = '封面图不能为空';
} else if (!data.descImgList || !data.descImgList.length) {
errMsg = '详情图不能为空';
} else if (!data.imgList || !data.imgList.length) {
errMsg = '轮播图不能为空';
}
if (errMsg) {
uni.showToast({
icon: 'none',
title: errMsg,
duration: 2500
})
return false;
}
return true;
},
validSpecData(goodsStandardList) {
let errMsg = "";
for (let i = 0; i < goodsStandardList.length; i++) {
let spec = goodsStandardList[i];
if (!spec.goodsPrice) {
errMsg = '已勾选规格的价格不能为空';
} else if (!spec.goodsNum) {
errMsg = '已勾选规格的库存不能为空';
}
if (errMsg) {
uni.showToast({
icon: 'none',
title: errMsg,
duration: 2500
})
break;
}
}
if (errMsg) {
return false;
}
return true;
},
validMultiAreaList(data) {
let errMsg = null;
if (!data.goodsAreaList || !data.goodsAreaList.length || !data.areaDesc) {
errMsg = '上架区域填写不完整';
}
if (errMsg) {
uni.showToast({
icon: 'none',
title: errMsg,
duration: 2500
})
return false;
}
return true;
},
async submit() {
// 多城市上架区域校验
let multiServAreaChecked = true;
let multiServAreaList = [];
for (let x of this.servArea) {
let oneCheckedAreaList = null;
if (x && x.districtList && x.districtList.length) {
oneCheckedAreaList = x.districtList.filter((item) => {
if (item.checked) {
item.countryAreaId = item.areaId;
return item;
}
});
}
let oneServAreaObj = {
goodsAreaList: oneCheckedAreaList,
areaDesc: x.areaDesc
}
if (!this.validMultiAreaList(oneServAreaObj)) {
multiServAreaChecked = false;
break;
}
multiServAreaList.push(oneServAreaObj);
}
if (!multiServAreaChecked) {
return;
}
let goodsStandardList = this.formData.specsList.filter((item) => {
if (item.checked) {
if (!item.goodsStandardName) {
item.goodsStandardName = item.goodsCategoryName;
}
return item;
}
});
let goodsAreaList = this.formData.districtList.filter((item) => {
if (item.checked) {
item.countryAreaId = item.areaId;
return item;
}
});
let data2Valid = {
...this.formData,
goodsStandardList: goodsStandardList,
goodsAreaList: goodsAreaList
}
if (!this.validData(data2Valid)) {
return;
}
// let checkRes = await this.checkBankAndCertify();
// if (!checkRes) {
// return;
// }
// 0是轮播图1是详情图
let goodsImgsList = [];
this.formData.imgList.forEach((url) => {
goodsImgsList.push({
imgUrl: url,
imgType: 0
});
});
this.formData.descImgList.forEach((url) => {
goodsImgsList.push({
imgUrl: url,
imgType: 1
});
});
let goodsVideoUrl = this.formData.videoList.length ? this.formData.videoList[0] : '';
let params = {
goodsName: this.formData.servName,
goodsDesc: this.formData.servDesc,
goodsUnit: this.formData.goodsUnit.name,
warrantyPeriod: this.formData.warrantyPeriod.name,
servActivity: this.formData.servActivity.name,
expectDuration: this.formData.expectDuration.name,
deptGoodsCategoryId: this.formData.deptGoodsCategoryId,
goodsStandardList: goodsStandardList,
goodsAreaList: goodsAreaList,
goodsImgUrl: this.formData.coverImgList[0],
goodsImgsList: goodsImgsList,
goodsVideoUrl: goodsVideoUrl,
status: 0,
remark: this.formData.detailDesc,
areaDesc: this.formData.areaDesc
}
let res = null;
if (this.goodsId) {
res = await this.$request.editGoods({
...params,
goodsId: this.goodsId
});
} else {
res = await this.$request.addGoods(params);
}
// 如果选了多城市,添加多个服务
let index = 0;
while (index < multiServAreaList.length && res && res.code === 0) {
res = await this.$request.addGoods({
...params,
goodsAreaList: multiServAreaList[index].goodsAreaList,
areaDesc: multiServAreaList[index].areaDesc
});
index++;
}
if (res && res.code === 0) {
uni.showToast({
icon: 'success'
})
uni.reLaunch({
url: '/pages/index/index?menuCode=supplyChainPage'
})
}
},
async addServArea() {
let subRegionList = await this.$request.areaListByStep({
parentCode: this.regionList[0][0].areaCode
});
subRegionList = subRegionList.data;
this.servArea.push({
region: [],
districtList: [],
areaDesc: null,
regionList: [this.regionList[0], subRegionList],
regionMultiIndex: [0, 0]
});
},
delServArea(index) {
this.servArea.splice(index, 1);
}
},
}
</script>
<style scoped>
.cu-form-group picker::after {
display: none;
}
.cu-form-group .title {
flex-basis: 26%;
text-align: justify;
padding-right: 10rpx;
font-size: 30rpx;
position: relative;
height: 60rpx;
line-height: 60rpx;
}
.certern-height {
max-height: 520rpx;
overflow: hidden;
}
.long-btn {
width: 95%;
}
.form-val-area {
flex-basis: 75% !important;
}
.radius-input.xs {
font-size: 23rpx;
}
.radius-input.sm {
font-size: 25rpx;
}
</style>