<template> <div class="app-container"> <el-form ref="form" :model="form" :rules="rules" label-width="150px"> <products-selector ref="productSelector" v-model="form.productIdList" show-all @setall="isAllProduct=$event" enable-filtered @setFiltered="isAllFilteredProduct=$event" :default-ids="form.productIdList" class="mb-20"/> <routers-selector v-model="selectedRoutes" :type="type" /> <el-card style="margin-bottom: 10px"> <div slot="header" style="font-size:20px;"> {{$t('价格设置')}} </div> <el-form-item :label="$t('单价模式')" prop="priceType"> <dict-selector :type="DICT_TYPE.ECW_PRICE_TYPE" v-model="form.priceType" form-type="radio" formatter="number" /> </el-form-item> <!--全包价--> <template v-if="form.priceType === 1" > <div v-for="(item, index) in form.fullPriceStepList" :key="index" class="mb-20"> <price-step ref="stepPrice" :index="index" :currency-list="currencyList" :unit-list="unitList" field-prefix="all" :price-name="$t('全包价')" :show-add="index === form.fullPriceStepList.length -1" :value="item" :step-tips="!isStepPriceValid(item) ? $t('区间设置不完整,将被忽略') : null" @add="handleAddPrice('fullPriceStepList', $event)" @delete="handleDeletePrice('fullPriceStepList', $event)" @changeUnit="handleUnitChange(form.fullPriceStepList, index, ...$event)" ></price-step> </div> </template> <el-row v-else :gutter="20" class="mt-20"> <el-col :span="12"> <div v-for="(item, index) in form.freightPriceStepList" :key="index" class="mb-20"> <price-step ref="stepPrice" :index="index" :currency-list="currencyList" :unit-list="unitList" field-prefix="transport" :price-name="$t('运费')" :show-add="index === form.freightPriceStepList.length -1" :value="item" :step-tips="!isStepPriceValid(item) ? $t('区间设置不完整,将被忽略') : null" @add="handleAddPrice('freightPriceStepList', $event)" @delete="handleDeletePrice('freightPriceStepList', $event)" @changeUnit="handleUnitChange(form.freightPriceStepList, index, ...$event)" ></price-step> </div> </el-col> <el-col :span="12"> <div v-for="(item, index) in form.clearancePriceStepList" :key="index" class="mb-20"> <price-step ref="stepPrice" :index="index" :currency-list="currencyList" :unit-list="unitList" field-prefix="clearance" :price-name="$t('清关费')" :show-add="index === form.clearancePriceStepList.length -1" :value="item" :step-tips="!isStepPriceValid(item) ? $t('区间设置不完整,将被忽略') : null" @add="handleAddPrice('clearancePriceStepList', $event)" @delete="handleDeletePrice('clearancePriceStepList', $event)" @changeUnit="handleUnitChange(form.clearancePriceStepList, index, ...$event)" ></price-step> </div> </el-col> </el-row> </el-card> </el-form> <div style="margin: 20px 0"> <el-button @click="submitForm" type="primary" :loading="loading">{{$t('确认提交')}}</el-button> <el-button type="default" @click="$router.back()">{{$t('返回上一页')}}</el-button> </div> </div> </template> <script> import RoutersSelector from '@/components/RoutersSelector' import {batchAddPrice, batchAddPriceAir, batchUpdateProductPrice, getProductPrice} from "@/api/ecw/productPrice"; import { getCurrencyList } from '@/api/ecw/currency'; import { getUnitList } from '@/api/ecw/unit'; import ProductsSelector from '@/components/ProductsSelector' import Selector from '@/components/Selector' import Inputor from '@/components/Inputor' import Decimal from 'decimal.js' import PriceStep from "@/views/ecw/productPrice/components/PriceStep.vue"; import {getProductTypeList} from "@/api/ecw/productType"; // 定义默认的价格单位和体积单位 const DEFAULT_PRICE_UNIT = 1 const DEFAULT_VOLUME_UNIT = 6 const DEFAULT_WEIGHT_UNIT = 6 export default { components: {PriceStep, RoutersSelector, ProductsSelector, Selector, Inputor }, data() { return { checkList: [], selectedRoutes: [], // 勾选的路线渠道 form: { priceType: undefined, specialList: [], // 空运固定阶梯价 stepPrice: 1, fullPriceStepList:[], freightPriceStepList:[], clearancePriceStepList:[] }, isAllProduct: false, // 是否全部商品 isAllFilteredProduct: false, // 是否全部篩選商品 specialProducts: [], rules: {}, product: null, currencyList: [], unitList: [], productTypeList: [], productDisabled: true, lineList: [], //路线数组 loading: false, // 批量加价/减价 quickForm:{} } }, computed: { // 类型,默认海运sea,air表示空运 type(){ return this.$route.path.split(/[-_]/).pop() }, // 判断阶梯价是否有效 isStepPriceValid(){ return stepPrice => { return (stepPrice.startNum || stepPrice.startNum === 0) && stepPrice.endNum } }, }, watch: { checkList() { //选择路线 if (this.checkList.length > 0) { this.form.lineChannelList = this.checkList.map(item => { return { lineId: item, shippingChannelId: 0 } }) } else { this.form.lineChannelList = [] } }, product() { this.$set(this.form, 'productType', this.product.typeId) }, "form.priceType"(priceType){ if(priceType && !this.form.fullPriceStepList?.length){ this.handleAddPrice("fullPriceStepList", "all") } if(!priceType){ if(!this.form.freightPriceStepList?.length){ this.handleAddPrice("freightPriceStepList", "transport") } if(!this.form.clearancePriceStepList?.length){ this.handleAddPrice("clearancePriceStepList", "clearance") } } } }, async created() { this.currencyList = (await getCurrencyList())?.data || [] this.unitList = (await getUnitList())?.data || [] this.productTypeList = (await getProductTypeList())?.data || [] }, methods: { handleAddPrice(field, fieldPrefix){ if(!this.form[field]){ this.$set(this.form, field, []) } let priceUnit = DEFAULT_PRICE_UNIT let volumeUnit = DEFAULT_VOLUME_UNIT let weightUnit = DEFAULT_WEIGHT_UNIT if(this.form[field].length){ const first = this.form[field][0] priceUnit = first[`${fieldPrefix}PriceUnit`] volumeUnit = first[`${fieldPrefix}VolumeUnit`] weightUnit = first.weightUnit } console.log("添加价格的默认单位", { priceUnit, volumeUnit, weightUnit }) this.form[field].push({ [`${fieldPrefix}PriceUnit`]: priceUnit, [`${fieldPrefix}VolumeUnit`]: volumeUnit, weightUnit: weightUnit, specialList:[] }) }, handleDeletePrice(field, index){ this.form[field].splice(index, 1) }, handleUnitChange(stepPriceList, index, data){ console.log('handleUnitChange', ...arguments) if(index > 0) return const isVolumeUnit = data.field.indexOf("VolumeUnit") > -1 // 如果是重量单位,且不是清关费想换的,则需要同步最小起计量单位 if(isVolumeUnit && data.type != 'clearance'){ this.form.minWeightUnit = data.value } stepPriceList.forEach(item => { item[data.field] = data.value // 如果是设置体积单位,则还需要同步到阶梯重量单位 if(isVolumeUnit){ item['weightUnit'] = data.value } if(item.packagingList?.length){ item.packagingList.forEach(p => { if(data.field.indexOf("PriceUnit") > -1){ p['packagingPriceUnit'] = data.value } if(data.field.indexOf("VolumeUnit") > -1){ p['packagingVolumeUnit'] = data.value } }) } if(item.specialList?.length){ item.specialList.forEach(p => { p[data.field] = data.value }) } }) }, // 获得用语提交的阶梯价副本 getPriceList(stepList){ if(!stepList?.length) return [] let stepPriceList = JSON.parse(JSON.stringify(stepList)) stepPriceList.forEach((item, index) => { item.rankNum = index + 1 item.packagingList = item.packagingList.filter(p => !!p.packagingTypes?.length) item.packagingList = item.packagingList.map( p => { p.packagingTypes = p.packagingTypes.join(",") return p }) }) // 过滤掉空的阶梯 return stepPriceList.filter(this.isStepPriceValid) }, submitForm() { this.$refs["form"].validate(async (valid) => { if (!valid) { return; } // 只有新增的时候做判断 if (!this.$route.query.ids && (!this.selectedRoutes || !this.selectedRoutes.length)) { this.$message.error(this.$t('请选择线路')); return; } let data = Object.assign({}, this.form, { // lineChannelList: this.selectedRoutes, // specialList: this.specialProducts, isAllProduct: this.isAllProduct ? 1:0 }) if(!data.isAllProduct && (!data.productIdList || !data.productIdList.length)){ return this.$message.error(this.$t('请选择商品') + "!") } data.lineChannelList = this.selectedRoutes if(data.lineChannelList.length < 1){ return this.$message.error(this.$t('请选择需要修改的路线')) } data.fullPriceStepList= this.getPriceList(data.fullPriceStepList) data.freightPriceStepList= this.getPriceList(data.freightPriceStepList) data.clearancePriceStepList= this.getPriceList(data.clearancePriceStepList) // 检查被忽略的阶梯价 let msgArr = []; if(data.priceType){ const ignoreAll = this.form.fullPriceStepList.length - data.fullPriceStepList.length if(ignoreAll){ msgArr.push(this.$t("{n}个全包阶梯价", {n: ignoreAll})) } if(!data.fullPriceStepList?.length){ return this.$message.error(this.$t('请设置全包价')) } }else{ const ignoreFreight = this.form.freightPriceStepList.length - data.freightPriceStepList.length const ignoreClearance = this.form.clearancePriceStepList.length - data.clearancePriceStepList.length if(ignoreFreight){ msgArr.push(this.$t("{n}个运费阶梯价", {n: ignoreFreight})) } if(ignoreClearance){ msgArr.push(this.$t("{n}个清关费阶梯价", {n: ignoreClearance})) } if(!data.freightPriceStepList?.length && !data.clearancePriceStepList?.length){ return this.$message.error(this.$t('请设置运费或清关费')) } } let msg = this.$t('已选择{route}条路线,{product}个商品', { route: data.lineChannelList.length, product: this.isAllProduct ? this.$refs.productSelector.allTotal : data.productIdList.length }) if(msgArr.length){ msg += ";" + msgArr.join(",") + "被忽略" } await this.$confirm(msg + this.$t(';确认提交修改?', )) this.loading = true batchAddPriceAir(data).then(async(response) => { await this.$alert(this.$t("操作成功")); this.$store.dispatch("tagsView/delCurrentView") }) .finally(res => { this.loading = false }) }); } } } </script> <style scoped> .w100{ width: 100px; } .mr10{ margin-right: 10px; } .tips{ color: red; } </style>