<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: "SeaPrice", components: { Inputor, Selector }, props: { // 字段前缀 fieldPrefix: String, // 价格名称 priceName: String, // 包装类型字段 packagingField: String, unitList: { type: Array, default: [] }, currencyList: { type: Array, default: [] }, readonly: Boolean, value: { type: Object, default: () => { return {} } } }, computed: { packagingList() { const dicts = JSON.parse(JSON.stringify(getDictDatas(DICT_TYPE.ECW_PACKAGING_TYPE))) return dicts.map((dict) => { dict.enable = true this.value[this.packagingField]?.forEach((item) => { if (item.packagingTypes?.length && item.packagingTypes.indexOf(dict.value) > -1) { dict.enable = false } }) return dict }) } }, created() { this.initSpecialPrice() this.initPackingPrice() }, data() { return {} }, methods: { getDictDatas, // 包装类型初始化 initPackingPrice() { // 已有包装类型则处理字段,没有则初始化一个 if (this.value[this.packagingField]?.length) { this.value[this.packagingField].forEach((item) => { if (!item.packagingTypes) { this.$set(item, "packagingTypes", []) } else if (typeof item.packagingTypes == "string") { item.packagingTypes = item.packagingTypes.split(",") } }) return } this.addPackage() }, // 初始化特需加价 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({ allPrice: undefined, // 新建默认给0,否则默认是null allPriceUnit: this.value[`allPriceUnit`], allVolumeUnit: this.value[`allVolumeUnit`], transportPrice: undefined, // 新建默认给0,否则默认是null transportPriceUnit: this.value[`transportPriceUnit`], transportVolumeUnit: this.value[`transportVolumeUnit`], clearancePrice: undefined, clearancePriceUnit: this.value[`clearancePriceUnit`], clearanceVolumeUnit: this.value[`clearanceVolumeUnit`], specialDictType: item.value }) } }) }, // 添加包装类型运费 addPackage() { if (!this.value[this.packagingField]) { this.$set(this.value, this.packagingField, []) } this.value[this.packagingField]?.push({ packagingPrice: undefined, packagingPriceUnit: this.value[`${this.fieldPrefix}PriceUnit`], packagingVolumeUnit: this.value[`${this.fieldPrefix}VolumeUnit`] }) }, // 删除包装类型运费 deletePackage(index) { this.value[this.packagingField]?.splice(index, 1) }, // 校验 validate() { let valid = true // 价格检查 if (!this.validatePrice(this.value[`${this.fieldPrefix}Price`])) { valid = false this.$message.error(this.$t("请设置{name}", { name: this.priceName })) } // 检查包装费 if (this.value[this.packagingField]?.length) { this.value[this.packagingField]?.forEach((item, index) => { if (!item.packagingTypes?.length) return if (!this.validatePrice(item.packagingPrice)) { valid = false this.$message.error( this.$t("请设置{name}的包装费{index}", { name: this.priceName, index: index + 1 }) ) } }) } return valid }, // 校验价格是否为空,可以是0 validatePrice(value) { if (value === undefined || value === null || value === "") { return false } return true } } } </script> <template> <div> <div class="page-title"> {{ $t("{name}价格设置", { name: this.priceName }) }} </div> <el-form-item :label="$t('默认{name}', { name: this.priceName })"> <el-input-number v-model="value[`${fieldPrefix}Price`]" :placeholder="$t('整数或者两位小数')" :controls="false" :disabled="readonly" class="w-100 mr-10" /> <selector :disabled="readonly" 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="readonly" 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"> <div :key="specialIndex + 'transport'"> <el-form-item :label="getDictDataLabel(DICT_TYPE.ECW_SPECIAL_REQ_FOR_LINE_PRODUCTS, special.specialDictType) + priceName + $t('加价')"> <el-input-number v-model.number="special[`${fieldPrefix}Price`]" :controls="false" :disabled="readonly" :placeholder="$t('整数或者两位小数')" class="w-100 mr-10" /> <selector disabled v-model="special[`${fieldPrefix}PriceUnit`]" :options="currencyList" :label-field="$l(null, 'title')" value-field="id" 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" class="w-100" /> </el-form-item> </div> </template> <!--包装类型价格--> <template v-for="(item, i) in value[packagingField]"> <el-form-item :label="$t('包装类型') + priceName + (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" :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[packagingField].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>