<script> import Selector from "@/components/Selector/index.vue"; import Inputor from "@/components/Inputor/index.vue"; import Template from "@/views/cms/template/index.vue"; import {DICT_TYPE, getDictDatas} from "@/utils/dict"; export default { name: "PriceStep", components: {Template, Inputor, Selector}, props:{ index: Number, type: String, priceName: String, fieldPrefix: String, unitList:{ type: Array, default: [] }, currencyList:{ type: Array, default: [] }, showAdd: Boolean, readonly: Boolean, stepTips: String, value:{ type: Object, default: () => { return { } } } }, created() { if(!this.value.packagingList){ this.addPackage() } // 格式化包装 if(this.value.packagingList?.length){ this.value.packagingList.forEach(item => { if(item.packagingTypes && typeof item.packagingTypes == 'string'){ item.packagingTypes = item.packagingTypes.split(',') } }) } this.initSpecialPrice() }, data(){ return { } }, computed:{ packagingList(){ const dicts = JSON.parse(JSON.stringify(getDictDatas(DICT_TYPE.ECW_PACKAGING_TYPE))) return dicts.map(dict => { dict.enable = true this.value.packagingList.forEach(item => { if(item.packagingTypes?.length && item.packagingTypes.indexOf(dict.value) > -1){ dict.enable = false } }) return dict }) } }, methods:{ getDictDatas, // 初始化特需加价 initSpecialPrice(){ if(!this.value.specialList){ this.$set(this.value, 'specialList', []) } this.getDictDatas(this.DICT_TYPE.ECW_SPECIAL_REQ_FOR_LINE_PRODUCTS).forEach(item => { if(!this.value.specialList.find(special => special.specialDictType == item.value)){ this.value.specialList.push({ [`${this.fieldPrefix}Price`]: undefined, // 新建默认给0,否则默认是null [`${this.fieldPrefix}PriceUnit`]: this.value[`${this.fieldPrefix}PriceUnit`], [`${this.fieldPrefix}VolumeUnit`]: this.value[`${this.fieldPrefix}VolumeUnit`], "specialDictType": item.value }) } }) }, // 添加包装类型运费 addPackage(){ if(!this.value.packagingList){ this.$set(this.value, 'packagingList', []) } this.value.packagingList.push({ packagingPrice: undefined, packagingPriceUnit : this.value[`${this.fieldPrefix}PriceUnit`], packagingVolumeUnit : this.value[`${this.fieldPrefix}VolumeUnit`], }) }, // 删除包装类型运费 deletePackage(index){ this.value.packagingList.splice(index, 1) }, // 校验 validate(){ const index = this.index const errors = [] // 区间设置检查 if(typeof this.value.startNum != "number"){ errors.push(this.$t("请设置{priceName}第{index}阶段的起始值", { index: index + 1, priceName: this.priceName })) } if(!this.value.endNum){ errors.push(this.$t("请设置{priceName}第{index}阶段的结束值", { index: index + 1, priceName: this.priceName })) } // 价格检查 if(!this.validatePrice(this.value[`${this.fieldPrefix}Price`])){ errors.push(this.$t("请设置第{index}阶段的{priceName}", { index: index+1, priceName: this.priceName })) } // 包装价格检查 if(this.value.packagingList?.length){ this.value.packagingList.forEach((item, i) => { if(item.packagingTypes?.length && !this.validatePrice(item.packagingPrice)){ errors.push(this.$t("请设置第{index}阶段的包装类型{i}的{priceName}", { index: index+1, i: i+1, priceName: this.priceName })) } }) } if(errors.length){ this.$notify.error({ title: this.$t("表单错误"), message: errors.join(';\n') }); } return !errors.length }, // 校验价格是否为空,可以是0 validatePrice(value){ if(value === undefined || value === null || value === ''){ return false } return true }, } } </script> <template> <div> <div class="bold text-lg">{{$t('{type}{priceName}价格设置', {type, priceName})}}</div> <div style="font-size:14px; margin:10px 0"> {{$t('第{index}阶梯定价方案', {index: index+1})}}: <template v-if="showAdd"> <el-link type="primary" @click.native="$emit('add', fieldPrefix)">{{$t('添加区间')}}</el-link> <el-divider direction="vertical"></el-divider> <el-link type="danger" @click.native="$emit( 'delete', index)">{{$t('删除')}}</el-link> </template> </div> <el-form-item :label="$t('第{index}阶梯', {index: index+1})"> <el-input-number v-model="value.startNum" :controls="false" class="w-100"></el-input-number> - <el-input-number v-model="value.endNum" :controls="false" class="w-100"></el-input-number> / <!--需求为以默认价格单位为准,不能修改阶梯单位 https://zentao.test.jdshangmen.com/bug-view-5982.html--> <selector disabled v-model="value.weightUnit" :options="unitList" :label-field="$l(null, 'title')" @input="$emit('changeUnit', { value: $event, field: 'weightUnit', type: fieldPrefix })" value-field="id" class="w-100" /> <div class="tips" v-if="stepTips">{{stepTips}}</div> </el-form-item> <el-form-item :label="$t('默认') + priceName"> <el-input-number v-model="value[`${fieldPrefix}Price`]" :placeholder="$t('整数或者两位小数')" :precision="2" :controls="false" class="w-100 mr-10"/> <selector :disabled="index>0" v-model="value[`${fieldPrefix}PriceUnit`]" :options="currencyList" :label-field="$l(null, 'title')" @input="$emit('changeUnit', { value: $event, field: `${fieldPrefix}PriceUnit` })" value-field="id" class="w-100" /> / <selector :disabled="index>0" v-model="value[`${fieldPrefix}VolumeUnit`]" :options="unitList" :label-field="$l(null, 'title')" @input="$emit('changeUnit', { value: $event, field: `${fieldPrefix}VolumeUnit` })" value-field="id" class="w-100" /> </el-form-item> <!--特性加价--> <template v-for="(special, specialIndex) in value.specialList"> <el-form-item :label="getDictDataLabel(DICT_TYPE.ECW_SPECIAL_REQ_FOR_LINE_PRODUCTS, special.specialDictType) + priceName + $t('加价')" :key="specialIndex + 'transport'" > <el-input-number v-model.number="special[`${fieldPrefix}Price`]" :controls="false" :min="0" :placeholder="$t('整数或者两位小数')" class="w-100 mr-10" /> <selector disabled v-model="special[`${fieldPrefix}PriceUnit`]" :options="currencyList" :label-field="$l(null, 'title')" value-field="id" defaultable2 class="w-100 mr-10" /> <span class="mr-10">/</span> <selector disabled v-model="special[`${fieldPrefix}VolumeUnit`]" :options="unitList" :label-field="$l(null, 'title')" value-field="id" defaultable2 class="w-100" /> </el-form-item> </template> <!--包装类型价格--> <template v-for="(item, i) in value.packagingList"> <el-form-item :label="$t('包装类型加价') + (i+1)" :key="i"> <template #label> <div class="el-form-item__label" style="width: 150px;">{{$t('包装类型{name}加价', {name: priceName}) + (i+1)}}</div> <div v-if="!item.packagingTypes || !item.packagingTypes.length" class="tips">{{$t('未选择包装类型将被忽略')}}</div> </template> <el-select v-model="item.packagingTypes" multiple placeholder="请选择" style="width: 100%; max-width: 450px; margin-bottom: 5px; display: block"> <el-option v-for="item in packagingList" :key="item.value" :label="$l(item, 'label')" :value="item.value" :disabled="!item.enable" > </el-option> </el-select> <el-input-number v-model="item.packagingPrice" :controls="false" :min="0" :placeholder="$t('整数或者两位小数')" class="w-100 mr-10" /> <selector disabled v-model="item.packagingPriceUnit" :options="currencyList" :label-field="$l(null, 'title')" value-field="id" defaultable2 class="w-100 mr-10" /> <span class="mr-10">/</span> <selector disabled v-model="item.packagingVolumeUnit" :options="unitList" :label-field="$l(null, 'title')" value-field="id" defaultable2 class="w-100" /> <template v-if="i == value.packagingList.length -1 && !readonly"> <el-link type="primary" @click.native="addPackage" class="ml-5">{{$t('添加')}}</el-link> <el-divider direction="vertical"></el-divider> <el-link type="danger" @click.native="deletePackage(i)">{{$t('删除')}}</el-link> </template> </el-form-item> </template> </div> </template> <style scoped lang="scss"> .bold { font-weight: bold; } .text-lg{ font-size: 1.3rem; } .tips{ font-size: 1rem; color: red; } </style>