<template> <div class="app-container"> <el-form ref="form" :model="form" :rules="rules" label-width="150px"> <products-selector v-model="form.productIdList" show-all @setall="isAllProduct=$event" class="mb-20" /> <routers-selector v-model="selectedRoutes" /> <el-card style="margin-bottom: 10px"> <div slot="header" style="font-size:20px;"> {{$t('价格设置')}} <span> <!-- <el-checkbox label="" @change="form.needPay=$event ? 1 : 0">{{$t('预付')}}</el-checkbox> --> <el-checkbox label="" @change="form.stepPrice=$event ? 1 : 0">{{$t('阶梯价格')}}</el-checkbox> </span> </div> <el-form-item :label="$t('预付')" prop="needPay" > <el-radio-group v-model="form.needPay"> <el-radio :label="1">{{ $t('预付') }}</el-radio> <el-radio :label="0">{{ $t('均可') }}</el-radio> </el-radio-group> </el-form-item> <el-form-item :label="$t('单价模式')" prop="priceType"> <dict-selector :type="DICT_TYPE.ECW_PRICE_TYPE" v-model="form.priceType" form-type="radio" /> </el-form-item> <!--阶梯订单--> <template v-if="form.stepPrice==1" > <div v-for="(item, index) in form.priceStepList" :key="index"> <div style="font-size:14px; margin:10px 0"> {{$t('第{index}阶梯定价方案', {index: index+1})}}: <template v-if="index == form.priceStepList.length - 1"> <el-link type="primary" @click.native="form.priceStepList.push({})">{{$t('添加区间')}}</el-link> <el-divider direction="vertical"></el-divider> <el-link type="danger" @click.native="form.priceStepList.splice(index, 1)">{{$t('删除')}}</el-link> </template> </div> <el-form-item :label="$t(`第{index}阶梯`, {index: index+1})"> <el-input v-model="item.startNum" type="number" placeholder="" class="w100"></el-input> - <el-input v-model="item.endNum" type="number" placeholder="" class="w100"></el-input> / <selector :disabled="index > 0" @input="syncAllUnit" v-model="form.weightUnit" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> </el-form-item> <el-form-item :label="$t('默认运费')" v-if="form.priceType != 1"> <inputor default2="0" v-model.number="item.transportPrice" type="number" :placeholder="$t('整数或者两位小数')" class="w100 mr10" /> <selector :disabled="index > 0" @input="syncAllUnit" v-model="item.transportPriceUnit" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> / <selector :disabled="index > 0" @input="syncAllUnit" v-model="item.transportVolumeUnit" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> </el-form-item> <el-form-item :label="$t('默认清关费')" v-if="form.priceType != 1"> <inputor default2="0" v-model.number="item.clearancePrice" type="number" :placeholder="$t('整数或者两位小数')" class="w100 mr10" /> <selector :disabled="index > 0" @input="syncAllUnit" v-model="item.clearancePriceUnit" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> / <selector :disabled="index > 0" @input="syncAllUnit" v-model="item.clearanceVolumeUnit" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> </el-form-item> <el-form-item :label="$t('默认全包价')" v-if="form.priceType == 1"> <inputor default2="0" v-model.number="item.allPrice" type="number" :placeholder="$t('整数或者两位小数')" class="w100 mr10" /> <selector :disabled="index > 0" @input="syncAllUnit" v-model="item.allPriceUnit" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> / <selector :disabled="index > 0" @input="syncAllUnit" v-model="item.allVolumeUnit" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> </el-form-item> </div> </template> <template v-else> <el-form-item :label="$t('最小起计量')" :prop="`minWeight`" > <inputor default2="0" v-model.number="form.minWeight" type="number" class="w-100" :rules="{validator: priceValidator, trigger: 'blur', message: '数量错误'}"/> / <selector v-model="form.minWeightUnit" :options="unitList" :label-field="$l(null, 'title')" value-field="id" defaultable2 class="w-100" disabled /> </el-form-item> <el-form-item :label="$t('默认全包价')" v-if="form.priceType == 1"> <inputor default2="0" v-model.number="form.allPrice" type="number" :placeholder="$t('整数或者两位小数')" class="w100 mr10" /> <selector v-model="form.allPriceUnit" @input="syncAllUnit" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> / <selector v-model="form.allVolumeUnit" @input="syncAllUnit" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> </el-form-item> <template v-else> <el-form-item :label="$t('默认运费')" prop="transportPrice"> <selector v-model="form.transportPriceUnit" @input="syncAllUnit" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 class="w-100" /> <inputor default2="0" v-model.number="form.transportPrice" type="number" :placeholder="$t('整数或者两位小数')" class="w-100 ml-10 mr-10" /> / <selector v-model="form.transportVolumeUnit" @input="syncAllUnit" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w-100" /> </el-form-item> <el-form-item :label="$t('默认清关费')" prop="clearancePrice"> <selector v-model="form.clearancePriceUnit" @input="syncAllUnit" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 class="w-100" /> <inputor default2="0" v-model.number="form.clearancePrice" type="number" :placeholder="$t('整数或者两位小数')" class="w-100 ml-10 mr-10" /> / <selector v-model="form.clearanceVolumeUnit" @input="syncAllUnit" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w-100" /> </el-form-item> </template> </template> <!--特需--> <template v-if="form.priceType==1"> <el-form-item v-for="(special, specialIndex) in form.specialList" :label="getDictDataLabel(DICT_TYPE.ECW_SPECIAL_REQ_FOR_LINE_PRODUCTS, special.specialDictType) + $t('全包价')" :key="specialIndex + 'transport'"> <selector disabled v-model="special.allPriceUnit" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 class="w-100" /> <inputor default2="0" v-model.number="special.allPrice" type="number" :placeholder="$t('整数或者两位小数')" class="w-100 ml-10 mr-10" /> / <selector disabled v-model="special.allVolumeUnit" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w-100" /> </el-form-item> </template> <template v-else v-for="(special, specialIndex) in form.specialList"> <el-form-item :label="getDictDataLabel(DICT_TYPE.ECW_SPECIAL_REQ_FOR_LINE_PRODUCTS, special.specialDictType) + $t('运费')" :key="specialIndex + 'transport'"> <selector disabled v-model="special.transportPriceUnit" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 class="w-100" /> <inputor default2="0" v-model.number="special.transportPrice" type="number" :placeholder="$t('整数或者两位小数')" class="w-100 ml-10 mr-10" /> / <selector disabled v-model="special.transportVolumeUnit" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w-100" /> </el-form-item> <el-form-item :label="getDictDataLabel(DICT_TYPE.ECW_SPECIAL_REQ_FOR_LINE_PRODUCTS, special.specialDictType) + $t('清关费')" :key="specialIndex + 'clearance'"> <selector disabled v-model="special.clearancePriceUnit" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 class="w-100" /> <inputor default2="0" v-model.number="special.clearancePrice" type="number" :placeholder="$t('整数或者两位小数')" class="w-100 ml-10 mr-10" /> / <selector disabled v-model="special.clearanceVolumeUnit" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w-100" /> </el-form-item> </template> <!-- <el-form-item :label="$t('是否预付')" prop="advanceStatus"> <dict-selector form-type="radio" :type="DICT_TYPE.ADVANCE_STATUS" v-model="form.advanceStatus" /> </el-form-item> --> <el-form-item :label="$t('价格有效期')"> <el-date-picker v-model="form.validateStartDate" value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker> - <el-date-picker v-model="form.validateEndDate" value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker> </el-form-item> </el-card> <el-card> <div slot="header" style="font-size:20px;"> {{$t('基础信息')}} </div> <el-form-item :label="$t('是否预约入仓')" prop="needBook"> <el-radio v-model.number="form.needBook" :label="1">{{$t('是')}}</el-radio> <el-radio v-model.number="form.needBook" :label="0">{{$t('否')}}</el-radio> </el-form-item> <el-form-item :label="$t('每日入仓上限')" prop="dayLimit" v-if="form.needBook == 1"> <el-input v-model.number="form.dayLimit" type="number" class="w-100" />{{$t('立方米')}} </el-form-item> <el-form-item :label="$t('货柜位置')" prop="containerLocation"> <dict-selector :type="DICT_TYPE.ECW_CONTAINER_LOCATION" v-model="form.containerLocation" /> </el-form-item> <el-form-item :label="$t('订单方数上限')" prop="square"> <el-input v-model.number="form.square" type="number" style="width:200px" /> </el-form-item> </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 { createProductPrice, updateProductPrice, batchUpdateProductPrice, deleteProductPrice, getProductPrice, getProductPriceList, getProductPricePage, exportProductPriceExcel } from "@/api/ecw/productPrice"; import { getProductType, getProductTypeList } from '@/api/ecw/productType' import { getCurrencyList } from '@/api/ecw/currency'; import { getUnitList } from '@/api/ecw/unit'; import ProductsSelector from '@/components/ProductsSelector' import { arrryToKeyedObjectBy } from '@/utils/index' import Selector from '@/components/Selector' import Inputor from '@/components/Inputor' import { parseTime } from '@/utils/ruoyi' export default { components: { RoutersSelector, ProductsSelector, Selector, Inputor }, data() { return { checkList: [], selectedRoutes: [], // 勾选的路线渠道 form: { specialList: [], priceStepList: [], stepPrice: 0, // advanceStatus: 0, // needBook: 0, // dayLimit: 10000 }, isAllProduct: false, // 是否全部商品 specialProducts: [], // priceStepList: [{},{}], // 阶梯价格 // specialList:[], // 特殊需求,默认四个 rules: {}, product: null, /* productType: null, */ currencyList: [], unitList: [], productTypeList: [], productDisabled: true, lineList: [], //路线数组 loading: false } }, computed: { }, 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) /* getProductType(this.product.typeId).then(res => { this.productType = res.data }) */ }, /* 批量操作没有回显需求 form(val) { if (!val) return // 特殊需求回显 if (val.specialList) { let keyed = arrryToKeyedObjectBy(val.specialList, 'specialDictType') this.specialList.map((item, index) => { if (keyed[item.specialDictType]) { for (let field in item) { if (keyed[item.specialDictType][field]) { item[field] = keyed[item.specialDictType][field] } } } }) } }, */ /* 'form.transportVolumeUnit'(val){ this.specialProducts.forEach(item => { item.transportVolumeUnit = val }) }, 'form.clearanceVolumeUnit'(val){ this.specialProducts.forEach(item => { item.clearanceVolumeUnit = val }) }, 'form.allVolumeUnit'(val){ this.specialProducts.forEach(item => { item.allVolumeUnit = val }) }, */ 'form.stepPrice'(stepPrice){ if(stepPrice == 1 && !this.form.priceStepList.length){ this.form.priceStepList = [{}, {}] } }, selectedRoutes(routers) { let transportIds = [] routers.forEach(item => { item.shippingChannelId = item.channelId transportIds.push(+item.transportId) }) // 如果只选择了空运(3),则默认体积单位改成千克 transportIds = new Set(transportIds) console.log(transportIds) window.transportIds = transportIds if(transportIds.size == 1 && transportIds.has(3)){ this.setDefaultVolumeUnit(6) }else this.setDefaultVolumeUnit(7) }, 'form.needBook'(val){ if(val) this.$set(this.form, 'dayLimit', 10000) else delete this.form.dayLimit } }, async created() { getCurrencyList().then(res => this.currencyList = res.data) getUnitList().then(res => this.unitList = res.data) this.getDictDatas(this.DICT_TYPE.ECW_SPECIAL_REQ_FOR_LINE_PRODUCTS).forEach(item => { this.form.specialList.push({ "clearancePrice": null, "clearancePriceUnit": null, "clearanceVolumeUnit": null, "specialDictType": item.value, "transportPrice": null, "transportPriceUnit": null, "transportVolumeUnit": null, }) }) }, methods: { // 同步全部单位 syncAllUnit(){ let obj = this.form.stepPrice == 1 ? this.form.priceStepList[0] : this.form let fields = {} // 全包价 if(this.form.priceType == 1){ fields = { allPriceUnit: obj['allPriceUnit'], allVolumeUnit: obj['allVolumeUnit'] } }else{ fields = { transportPriceUnit: obj.transportPriceUnit, transportVolumeUnit: obj.transportVolumeUnit, clearancePriceUnit: obj.clearancePriceUnit, clearanceVolumeUnit: obj.clearanceVolumeUnit, } } // 全包价还需要同步阶梯的重量单位 if(this.form.stepPrice == 1){ fields['weightUnit'] = obj.weightUnit } this.syncSpecialUnit(fields) }, // 同步特需的货币单位和体积单位 syncSpecialUnit(obj){ console.log('syncSpecialUnit', obj) if(!obj) return // 同步特需单位 this.form.specialList.forEach(item => { Object.assign(item, obj) }) // 如果是阶梯价则需要同步其他阶梯 if(this.form.stepPrice == 1){ this.form.priceStepList.forEach((item, index) => { this.$set(this.form.priceStepList, index, Object.assign(item, obj)) }) } // 不是阶梯价需要 同步最小起计量 if(obj['transportVolumeUnit'] || obj['allVolumeUnit']){ this.$set(this.form, 'minWeightUnit', obj['transportVolumeUnit'] || obj['allVolumeUnit']) } }, setDefaultVolumeUnit(unit){ this.$set(this.form, 'transportVolumeUnit', unit) this.$set(this.form, 'clearanceVolumeUnit', unit) this.$set(this.form, 'allVolumeUnit', unit) }, submitForm() { this.$refs["form"].validate(valid => { if (!valid) { return; } // 只有新增的时候做判断 if (!this.$route.query.ids && (!this.selectedRoutes || !this.selectedRoutes.length)) { this.$message.error(this.$t('请选择线路')); return; } if(!this.isAllProduct && (!this.form.productIdList || !this.form.productIdList.length)){ return this.$message.error('请选择商品') } let data = Object.assign({}, this.form, { // lineChannelList: this.selectedRoutes, // specialList: this.specialProducts, isAllProduct: this.isAllProduct ? 1:0 }) /* if(this.form.stepPrice == 1){ data.priceStepList = this.form.priceStepList } */ // 没有设置阶梯价格则不提交priceStepList if(data.stepPrice != 1){ delete data.priceStepList } data.lineChannelList = this.selectedRoutes if(data.lineChannelList.length < 1){ return this.$message.error(this.$t('请选择需要修改的路线')) } this.loading = true batchUpdateProductPrice(data).then(response => { this.$modal.msgSuccess(this.$t("修改成功")); this.$router.replace('/lineProject/product-price?' + (new URLSearchParams(this.$route.query)).toString()) }) .finally(res => this.loading = false) }); }, } } </script> <style scoped> .w100{ width: 100px; } .mr10{ margin-right: 10px; } </style>