batchEditAir.vue 16.7 KB
Newer Older
lanbaoming's avatar
lanbaoming committed
1 2 3
<template>
  <div class="app-container">
    <el-form ref="form" :model="form" :rules="rules" label-width="150px">
4 5 6 7 8 9 10 11 12 13
      <products-selector
        ref="productSelector"
        v-model="form.productIdList"
        show-all
        @setall="isAllProduct = $event"
        :default-ids="form.productIdList"
        enable-filtered
        @setFiltered="isAllFilteredProduct = $event"
        class="mb-20"
      />
lanbaoming's avatar
lanbaoming committed
14 15 16 17

      <routers-selector v-model="selectedRoutes" type="air" />

      <el-card style="margin-bottom: 10px">
18 19
        <div slot="header" style="font-size: 20px">
          {{ $t("价格设置") }}
lanbaoming's avatar
lanbaoming committed
20 21 22
        </div>
        <el-row :gutter="20">
          <el-col :span="12">
23
            <el-form-item :label="$t('预付')" prop="needPay">
lanbaoming's avatar
lanbaoming committed
24
              <el-radio-group v-model="form.needPay">
25 26
                <el-radio :label="1">{{ $t("预付") }}</el-radio>
                <el-radio :label="0">{{ $t("均可") }}</el-radio>
lanbaoming's avatar
lanbaoming committed
27 28 29
              </el-radio-group>
            </el-form-item>
            <el-form-item :label="$t('单价模式')" prop="priceType">
30 31 32 33 34 35
              <dict-selector
                :type="DICT_TYPE.ECW_PRICE_TYPE"
                v-model="form.priceType"
                form-type="radio"
                formatter="number"
              />
lanbaoming's avatar
lanbaoming committed
36
            </el-form-item>
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
            <el-form-item :label="$t('最小起计量')" :prop="`minWeight`">
              <el-input-number
                v-model="form.minWeight"
                :controls="false"
                class="w-100"
              />
              /
              <selector
                v-model="form.minWeightUnit"
                :options="unitList"
                :label-field="$l(null, 'title')"
                value-field="id"
                defaultable2
                class="w-100"
                disabled
              />
lanbaoming's avatar
lanbaoming committed
53 54 55
            </el-form-item>
          </el-col>
          <el-col :span="12">
56 57 58 59 60
            <quick-set
              :unit-list="unitList"
              :currency-list="currencyList"
              :value="form"
            ></quick-set>
lanbaoming's avatar
lanbaoming committed
61 62 63 64
          </el-col>
        </el-row>

        <!--全包价-->
65
        <template v-if="form.priceType == 1">
lanbaoming's avatar
lanbaoming committed
66 67 68 69 70 71 72 73
          <div v-for="(item, index) in form.fullPriceStepList" :key="index">
            <price-step
              ref="stepPrice"
              :index="index"
              :currency-list="currencyList"
              :unit-list="unitList"
              field-prefix="all"
              :price-name="$t('全包价')"
74
              :show-add="index === form.fullPriceStepList.length - 1"
lanbaoming's avatar
lanbaoming committed
75 76 77
              :value="item"
              @add="handleAddPrice('fullPriceStepList', $event)"
              @delete="handleDeletePrice('fullPriceStepList', $event)"
78 79 80
              @changeUnit="
                handleUnitChange(form.fullPriceStepList, index, ...$event)
              "
lanbaoming's avatar
lanbaoming committed
81 82 83 84 85
            ></price-step>
          </div>
        </template>
        <el-row v-else :gutter="20" class="mt-20">
          <el-col :span="12">
86 87 88 89
            <div
              v-for="(item, index) in form.freightPriceStepList"
              :key="index"
            >
lanbaoming's avatar
lanbaoming committed
90 91 92 93 94 95 96
              <price-step
                ref="stepPrice"
                :index="index"
                :currency-list="currencyList"
                :unit-list="unitList"
                field-prefix="transport"
                :price-name="$t('运费')"
97
                :show-add="index === form.freightPriceStepList.length - 1"
lanbaoming's avatar
lanbaoming committed
98 99 100
                :value="item"
                @add="handleAddPrice('freightPriceStepList', $event)"
                @delete="handleDeletePrice('freightPriceStepList', $event)"
101 102 103
                @changeUnit="
                  handleUnitChange(form.freightPriceStepList, index, ...$event)
                "
lanbaoming's avatar
lanbaoming committed
104 105 106 107
              ></price-step>
            </div>
          </el-col>
          <el-col :span="12">
108 109 110 111
            <div
              v-for="(item, index) in form.clearancePriceStepList"
              :key="index"
            >
lanbaoming's avatar
lanbaoming committed
112 113 114 115 116 117 118
              <price-step
                ref="stepPrice"
                :index="index"
                :currency-list="currencyList"
                :unit-list="unitList"
                field-prefix="clearance"
                :price-name="$t('清关费')"
119
                :show-add="index === form.clearancePriceStepList.length - 1"
lanbaoming's avatar
lanbaoming committed
120 121 122
                :value="item"
                @add="handleAddPrice('clearancePriceStepList', $event)"
                @delete="handleDeletePrice('clearancePriceStepList', $event)"
123 124 125 126 127 128 129
                @changeUnit="
                  handleUnitChange(
                    form.clearancePriceStepList,
                    index,
                    ...$event
                  )
                "
lanbaoming's avatar
lanbaoming committed
130 131 132 133 134 135
              ></price-step>
            </div>
          </el-col>
        </el-row>

        <el-form-item :label="$t('价格有效期')">
136 137 138 139
          <el-date-picker
            v-model="form.validateStartDate"
            value-format="yyyy-MM-dd HH:mm:ss"
          ></el-date-picker>
lanbaoming's avatar
lanbaoming committed
140
          -
141 142 143 144
          <el-date-picker
            v-model="form.validateEndDate"
            value-format="yyyy-MM-dd HH:mm:ss"
          ></el-date-picker>
lanbaoming's avatar
lanbaoming committed
145 146 147 148
        </el-form-item>
      </el-card>

      <el-card>
149 150
        <div slot="header" style="font-size: 20px">
          {{ $t("基础信息") }}
lanbaoming's avatar
lanbaoming committed
151 152 153
        </div>

        <el-form-item :label="$t('是否预约入仓')" prop="needBook">
154 155 156 157 158 159
          <el-radio v-model.number="form.needBook" :label="1">{{
            $t("是")
          }}</el-radio>
          <el-radio v-model.number="form.needBook" :label="0">{{
            $t("否")
          }}</el-radio>
lanbaoming's avatar
lanbaoming committed
160 161 162
        </el-form-item>

        <el-form-item :label="$t('是否单询')" prop="inquiry">
163 164 165 166 167 168
          <dict-selector
            :type="DICT_TYPE.NEED_ORDER_INQUIRY"
            v-model="form.needOrderInquiry"
            form-type="radio"
            formatter="number"
          ></dict-selector>
lanbaoming's avatar
lanbaoming committed
169 170 171
        </el-form-item>

        <el-form-item :label="$t('线路重量上限') + `(kg)`" prop="square">
172 173 174 175 176 177
          <el-input-number
            v-model="form.weightLimit"
            type="number"
            style="width: 200px"
            :controls="false"
          />
lanbaoming's avatar
lanbaoming committed
178 179 180 181 182
        </el-form-item>
      </el-card>
    </el-form>

    <div style="margin: 20px 0">
183 184 185 186 187 188
      <el-button @click="submitForm" type="primary" :loading="loading">{{
        $t("确认提交")
      }}</el-button>
      <el-button type="default" @click="$router.back()">{{
        $t("返回上一页")
      }}</el-button>
lanbaoming's avatar
lanbaoming committed
189 190 191 192
    </div>
  </div>
</template>
<script>
193 194 195 196 197 198 199 200 201 202 203 204 205
import RoutersSelector from "@/components/RoutersSelector";
import {
  batchUpdateProductPrice,
  batchUpdateProductPriceAir,
  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 { getProduct } from "@/api/ecw/product";
lanbaoming's avatar
lanbaoming committed
206 207
import QuickSet from "@/views/ecw/productPrice/components/QuickSet.vue";
import PriceStep from "@/views/ecw/productPrice/components/PriceStep.vue";
208
import { getProductTypeList } from "@/api/ecw/productType";
lanbaoming's avatar
lanbaoming committed
209 210

// 定义默认的价格单位和体积单位
211 212 213
const DEFAULT_PRICE_UNIT = 1;
const DEFAULT_VOLUME_UNIT = 6;
const DEFAULT_WEIGHT_UNIT = 6;
lanbaoming's avatar
lanbaoming committed
214 215

export default {
216 217 218 219 220 221 222 223
  components: {
    PriceStep,
    QuickSet,
    RoutersSelector,
    ProductsSelector,
    Selector,
    Inputor,
  },
lanbaoming's avatar
lanbaoming committed
224 225 226 227 228 229
  data() {
    return {
      checkList: [],
      selectedRoutes: [], // 勾选的路线渠道
      form: {
        stepPrice: 0,
230
        priceType: null,
lanbaoming's avatar
lanbaoming committed
231 232 233 234
      },
      isAllProduct: false, // 是否全部商品
      isAllFilteredProduct: false, // 是否勾選全部搜索結果
      specialProducts: [],
zhengyi's avatar
zhengyi committed
235
      rules: {},
lanbaoming's avatar
lanbaoming committed
236 237 238 239 240 241 242
      product: null,
      currencyList: [],
      unitList: [],
      productTypeList: [],
      productDisabled: true,
      lineList: [], //路线数组
      loading: false,
243
    };
lanbaoming's avatar
lanbaoming committed
244 245 246 247 248
  },
  computed: {
    // 判断是否空值
    isEmpty() {
      return (content) => {
249 250
        return !content && content !== 0 && content !== "0";
      };
lanbaoming's avatar
lanbaoming committed
251 252 253
    },
  },
  watch: {
254 255
    checkList() {
      //选择路线
lanbaoming's avatar
lanbaoming committed
256
      if (this.checkList.length > 0) {
257 258 259
        this.form.lineChannelList = this.checkList.map((item) => {
          return { lineId: item, shippingChannelId: 0 };
        });
lanbaoming's avatar
lanbaoming committed
260
      } else {
261
        this.form.lineChannelList = [];
lanbaoming's avatar
lanbaoming committed
262 263 264
      }
    },
    product() {
265
      this.$set(this.form, "productType", this.product.typeId);
lanbaoming's avatar
lanbaoming committed
266 267
    },
    // 价格类型切换,需要初始化对应的字段
268 269 270
    "form.priceType"(priceType) {
      if (priceType == 1 && !this.form.fullPriceStepList?.length) {
        this.handleAddPrice("fullPriceStepList", "all");
lanbaoming's avatar
lanbaoming committed
271
      }
272 273 274
      if (priceType == 0) {
        if (!this.form.freightPriceStepList?.length) {
          this.handleAddPrice("freightPriceStepList", "transport");
lanbaoming's avatar
lanbaoming committed
275
        }
276 277
        if (!this.form.clearancePriceStepList?.length) {
          this.handleAddPrice("clearancePriceStepList", "clearance");
lanbaoming's avatar
lanbaoming committed
278 279 280
        }
      }
    },
281 282 283
    "form.needBook"(val) {
      if (val) this.$set(this.form, "dayLimit", 10000);
      else delete this.form.dayLimit;
lanbaoming's avatar
lanbaoming committed
284 285 286
    },
  },
  async created() {
287 288
    this.currencyList = (await getCurrencyList())?.data || [];
    this.unitList = (await getUnitList())?.data || [];
lanbaoming's avatar
lanbaoming committed
289

290
    this.$set(this.form, "stepPrice", 1);
lanbaoming's avatar
lanbaoming committed
291 292

    // 如果是复制,则获取数据并填充,先复制,然后填充特需,避免数据的特需不全导致部分不显示
293 294
    if (this.$route.query.templateId) {
      await this.getTemplateDetail(this.$route.query.templateId);
lanbaoming's avatar
lanbaoming committed
295 296 297 298
    }
  },
  methods: {
    // 获取模板数据(复制的源路线价格信息)
299 300
    async getTemplateDetail(id) {
      const res = await getProductPrice(id);
lanbaoming's avatar
lanbaoming committed
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
      // 要复制过来的字段
      const {
        allPrice,
        allPriceUnit,
        allVolumeUnit,
        transportPrice,
        transportPriceUnit,
        transportVolumeUnit,
        clearancePrice,
        clearancePriceUnit,
        clearanceVolumeUnit,
        priceType,
        stepPrice,
        specialList,
        priceStepList,
        minWeight,
        minWeightUnit,
        needOrderInquiry,
        needBook,
        needPay,
        freightPriceStepList,
        clearancePriceStepList,
323 324
        fullPriceStepList,
      } = res.data;
lanbaoming's avatar
lanbaoming committed
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346

      const data = {
        allPrice,
        allPriceUnit,
        allVolumeUnit,
        transportPrice,
        transportPriceUnit,
        transportVolumeUnit,
        clearancePrice,
        clearancePriceUnit,
        clearanceVolumeUnit,
        priceType,
        stepPrice,
        specialList,
        priceStepList,
        minWeight,
        minWeightUnit,
        needOrderInquiry,
        needBook,
        needPay,
        freightPriceStepList,
        clearancePriceStepList,
347 348 349
        fullPriceStepList,
      };
      this.$set(this, "form", Object.assign({}, this.form, data));
lanbaoming's avatar
lanbaoming committed
350 351 352 353 354 355 356 357

      // 产品选择器默认选择的商品
      /* 23-11-07要求不复制商品和线路 https://zentao.test.jdshangmen.com/bug-view-5145.html
      getProduct(res.data.productId).then(res => {
        this.$refs.productSelector.choose(res.data)
      })*/
    },

358 359 360
    handleAddPrice(field, fieldPrefix) {
      if (!this.form[field]) {
        this.$set(this.form, field, []);
lanbaoming's avatar
lanbaoming committed
361
      }
362 363 364 365 366 367 368 369
      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;
lanbaoming's avatar
lanbaoming committed
370 371 372 373
      }
      console.log("添加价格的默认单位", {
        priceUnit,
        volumeUnit,
374 375
        weightUnit,
      });
lanbaoming's avatar
lanbaoming committed
376 377 378 379
      this.form[field].push({
        [`${fieldPrefix}PriceUnit`]: priceUnit,
        [`${fieldPrefix}VolumeUnit`]: volumeUnit,
        weightUnit: weightUnit,
380 381
        specialList: [],
      });
lanbaoming's avatar
lanbaoming committed
382
    },
383 384
    handleDeletePrice(field, index) {
      this.form[field].splice(index, 1);
lanbaoming's avatar
lanbaoming committed
385
    },
386 387 388 389
    handleUnitChange(stepPriceList, index, data) {
      console.log("handleUnitChange", ...arguments);
      if (index > 0) return;
      const isVolumeUnit = data.field.indexOf("VolumeUnit") > -1;
lanbaoming's avatar
lanbaoming committed
390
      // 如果是重量单位,且不是清关费想换的,则需要同步最小起计量单位
391 392
      if (isVolumeUnit && data.type != "clearance") {
        this.form.minWeightUnit = data.value;
lanbaoming's avatar
lanbaoming committed
393
      }
394 395
      stepPriceList.forEach((item) => {
        item[data.field] = data.value;
lanbaoming's avatar
lanbaoming committed
396
        // 如果是设置体积单位,则还需要同步到阶梯重量单位
397 398
        if (isVolumeUnit) {
          item["weightUnit"] = data.value;
lanbaoming's avatar
lanbaoming committed
399
        }
400 401 402 403
        if (item.packagingList?.length) {
          item.packagingList.forEach((p) => {
            if (data.field.indexOf("PriceUnit") > -1) {
              p["packagingPriceUnit"] = data.value;
lanbaoming's avatar
lanbaoming committed
404
            }
405 406
            if (data.field.indexOf("VolumeUnit") > -1) {
              p["packagingVolumeUnit"] = data.value;
lanbaoming's avatar
lanbaoming committed
407
            }
408
          });
lanbaoming's avatar
lanbaoming committed
409
        }
410 411 412 413
        if (item.specialList?.length) {
          item.specialList.forEach((p) => {
            p[data.field] = data.value;
          });
lanbaoming's avatar
lanbaoming committed
414
        }
415
      });
lanbaoming's avatar
lanbaoming committed
416 417 418
    },

    // 获得用语提交的阶梯价副本
419 420 421
    getPriceList(stepList, prefix) {
      if (!stepList?.length) return [];
      let stepPriceList = JSON.parse(JSON.stringify(stepList));
lanbaoming's avatar
lanbaoming committed
422
      stepPriceList.forEach((item, index) => {
423 424 425 426 427 428 429 430 431
        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;
        });
      });
lanbaoming's avatar
lanbaoming committed
432
      // 240121应老王要求,未设置价格的不提交
433 434 435
      return stepPriceList.filter((item) => {
        return !!item[`${prefix}Price`];
      });
lanbaoming's avatar
lanbaoming committed
436 437 438 439 440 441 442 443
    },

    submitForm() {
      this.$refs["form"].validate(async (valid) => {
        if (!valid) {
          return;
        }

444 445 446 447 448 449 450 451
        //lanbm 2024-04-12 添加单价模式校验
        if (this.form.priceType == 0 || this.form.priceType == 1) {
        } else {
          this.$message.error(this.$t("请选择单价模式"));
          return;
        }
        //end lanbm 2024-04-12 添加单价模式校验

lanbaoming's avatar
lanbaoming committed
452
        // 只有新增的时候做判断
453 454 455 456 457
        if (
          !this.$route.query.ids &&
          (!this.selectedRoutes || !this.selectedRoutes.length)
        ) {
          this.$message.error(this.$t("请选择线路"));
lanbaoming's avatar
lanbaoming committed
458 459 460 461
          return;
        }

        let data = Object.assign({}, this.form, {
462 463
          isAllProduct: this.isAllProduct ? 1 : 0,
        });
lanbaoming's avatar
lanbaoming committed
464 465

        // 如果是勾選了全部篩選商品,則獲取商品ID
466 467 468
        if (this.isAllFilteredProduct) {
          data.productIdList =
            await this.$refs.productSelector.getFilteredIds();
lanbaoming's avatar
lanbaoming committed
469
        }
470 471 472 473 474
        if (
          !data.isAllProduct &&
          (!data.productIdList || !data.productIdList.length)
        ) {
          return this.$message.error("请选择商品");
lanbaoming's avatar
lanbaoming committed
475 476
        }

477
        data.lineChannelList = this.selectedRoutes;
lanbaoming's avatar
lanbaoming committed
478 479 480 481 482 483 484 485 486 487 488

        /* let isValid = true
        for (let stepPrice of this.$refs.stepPrice){
          if(!stepPrice.validate()){
            isValid = false
            break
          }
        }
        if(!isValid)return */

        // 全包价
489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505
        if (this.form.priceType == 1) {
          data.fullPriceStepList = this.getPriceList(
            this.form.fullPriceStepList,
            "all"
          );
          delete data.clearancePriceStepList;
          delete data.freightPriceStepList;
        } else {
          data.clearancePriceStepList = this.getPriceList(
            this.form.clearancePriceStepList,
            "clearance"
          );
          data.freightPriceStepList = this.getPriceList(
            this.form.freightPriceStepList,
            "transport"
          );
          delete data.fullPriceStepList;
lanbaoming's avatar
lanbaoming committed
506 507
        }

508 509
        if (data.lineChannelList.length < 1) {
          return this.$message.error(this.$t("请选择需要修改的路线"));
lanbaoming's avatar
lanbaoming committed
510
        }
511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528
        await this.$confirm(
          this.$t("已选择{route}条路线,{product}个商品;确认提交修改?", {
            route: data.lineChannelList.length,
            product: this.isAllProduct
              ? this.$refs.productSelector.allTotal
              : data.productIdList.length,
          })
        );
        this.loading = true;
        batchUpdateProductPriceAir(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));
lanbaoming's avatar
lanbaoming committed
529
      });
530 531 532
    },
  },
};
lanbaoming's avatar
lanbaoming committed
533 534
</script>
<style scoped>
535
.w100 {
lanbaoming's avatar
lanbaoming committed
536 537
  width: 100px;
}
538
.mr10 {
lanbaoming's avatar
lanbaoming committed
539 540 541
  margin-right: 10px;
}
</style>