SeaPrice.vue 8.13 KB
Newer Older
lanbaoming's avatar
lanbaoming committed
1
<script>
2 3 4 5
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"
lanbaoming's avatar
lanbaoming committed
6 7
export default {
  name: "SeaPrice",
8 9
  components: { Inputor, Selector },
  props: {
lanbaoming's avatar
lanbaoming committed
10 11 12 13 14 15
    // 字段前缀
    fieldPrefix: String,
    // 价格名称
    priceName: String,
    // 包装类型字段
    packagingField: String,
16
    unitList: {
lanbaoming's avatar
lanbaoming committed
17
      type: Array,
18
      default: []
lanbaoming's avatar
lanbaoming committed
19
    },
20
    currencyList: {
lanbaoming's avatar
lanbaoming committed
21
      type: Array,
22
      default: []
lanbaoming's avatar
lanbaoming committed
23 24
    },
    readonly: Boolean,
25
    value: {
lanbaoming's avatar
lanbaoming committed
26 27
      type: Object,
      default: () => {
28 29 30
        return {}
      }
    }
lanbaoming's avatar
lanbaoming committed
31
  },
32 33
  computed: {
    packagingList() {
34
      const dicts = JSON.parse(JSON.stringify(getDictDatas(DICT_TYPE.ECW_PACKAGING_TYPE)))
35
      return dicts.map((dict) => {
36
        dict.enable = true
37
        this.value[this.packagingField]?.forEach((item) => {
38 39
          if (item.packagingTypes?.length && item.packagingTypes.indexOf(dict.value) > -1) {
            dict.enable = false
lanbaoming's avatar
lanbaoming committed
40
          }
41 42 43 44
        })
        return dict
      })
    }
lanbaoming's avatar
lanbaoming committed
45 46
  },
  created() {
47 48
    this.initSpecialPrice()
    this.initPackingPrice()
lanbaoming's avatar
lanbaoming committed
49
  },
50
  data() {
51
    return {}
lanbaoming's avatar
lanbaoming committed
52
  },
53
  methods: {
lanbaoming's avatar
lanbaoming committed
54 55
    getDictDatas,
    // 包装类型初始化
56
    initPackingPrice() {
lanbaoming's avatar
lanbaoming committed
57
      // 已有包装类型则处理字段,没有则初始化一个
58 59 60
      if (this.value[this.packagingField]?.length) {
        this.value[this.packagingField].forEach((item) => {
          if (!item.packagingTypes) {
61
            this.$set(item, "packagingTypes", [])
62
          } else if (typeof item.packagingTypes == "string") {
63
            item.packagingTypes = item.packagingTypes.split(",")
lanbaoming's avatar
lanbaoming committed
64
          }
65 66
        })
        return
lanbaoming's avatar
lanbaoming committed
67
      }
68
      this.addPackage()
lanbaoming's avatar
lanbaoming committed
69 70
    },
    // 初始化特需加价
71 72
    initSpecialPrice() {
      if (!this.value.specialList) {
73
        this.$set(this.value, "specialList", [])
lanbaoming's avatar
lanbaoming committed
74
      }
75 76
      this.getDictDatas(this.DICT_TYPE.ECW_SPECIAL_REQ_FOR_LINE_PRODUCTS).forEach((item) => {
        if (!this.value.specialList.find((special) => special.specialDictType == item.value)) {
lanbaoming's avatar
lanbaoming committed
77 78 79 80 81 82 83 84 85 86
          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`],
87 88
            specialDictType: item.value
          })
lanbaoming's avatar
lanbaoming committed
89
        }
90
      })
lanbaoming's avatar
lanbaoming committed
91 92
    },
    // 添加包装类型运费
93 94
    addPackage() {
      if (!this.value[this.packagingField]) {
95
        this.$set(this.value, this.packagingField, [])
lanbaoming's avatar
lanbaoming committed
96 97 98
      }
      this.value[this.packagingField]?.push({
        packagingPrice: undefined,
99
        packagingPriceUnit: this.value[`${this.fieldPrefix}PriceUnit`],
100 101
        packagingVolumeUnit: this.value[`${this.fieldPrefix}VolumeUnit`]
      })
lanbaoming's avatar
lanbaoming committed
102 103
    },
    // 删除包装类型运费
104
    deletePackage(index) {
105
      this.value[this.packagingField]?.splice(index, 1)
lanbaoming's avatar
lanbaoming committed
106 107
    },
    // 校验
108
    validate() {
109
      let valid = true
lanbaoming's avatar
lanbaoming committed
110
      // 价格检查
111
      if (!this.validatePrice(this.value[`${this.fieldPrefix}Price`])) {
112 113
        valid = false
        this.$message.error(this.$t("请设置{name}", { name: this.priceName }))
lanbaoming's avatar
lanbaoming committed
114 115 116
      }

      // 检查包装费
117
      if (this.value[this.packagingField]?.length) {
lanbaoming's avatar
lanbaoming committed
118
        this.value[this.packagingField]?.forEach((item, index) => {
119
          if (!item.packagingTypes?.length) return
120
          if (!this.validatePrice(item.packagingPrice)) {
121
            valid = false
122 123 124
            this.$message.error(
              this.$t("请设置{name}的包装费{index}", {
                name: this.priceName,
125
                index: index + 1
126
              })
127
            )
lanbaoming's avatar
lanbaoming committed
128
          }
129
        })
lanbaoming's avatar
lanbaoming committed
130 131
      }

132
      return valid
lanbaoming's avatar
lanbaoming committed
133 134
    },
    // 校验价格是否为空,可以是0
135 136
    validatePrice(value) {
      if (value === undefined || value === null || value === "") {
137
        return false
lanbaoming's avatar
lanbaoming committed
138
      }
139 140 141 142
      return true
    }
  }
}
lanbaoming's avatar
lanbaoming committed
143 144 145 146
</script>

<template>
  <div>
147 148 149 150
    <div class="page-title">
      {{ $t("{name}价格设置", { name: this.priceName }) }}
    </div>
    <el-form-item :label="$t('默认{name}', { name: this.priceName })">
151
      <el-input-number v-model="value[`${fieldPrefix}Price`]" :placeholder="$t('整数或者两位小数')" :controls="false" :disabled="readonly" class="w-100 mr-10" />
lanbaoming's avatar
lanbaoming committed
152 153 154 155 156
      <selector
        :disabled="readonly"
        v-model="value[`${fieldPrefix}PriceUnit`]"
        :options="currencyList"
        :label-field="$l(null, 'title')"
157 158 159
        @input="
          $emit('changeUnit', {
            value: $event,
160
            field: `${fieldPrefix}PriceUnit`
161 162
          })
        "
lanbaoming's avatar
lanbaoming committed
163
        value-field="id"
164 165
        class="w-100"
      />
lanbaoming's avatar
lanbaoming committed
166 167 168 169 170 171
      /
      <selector
        :disabled="readonly"
        v-model="value[`${fieldPrefix}VolumeUnit`]"
        :options="unitList"
        :label-field="$l(null, 'title')"
172 173
        @input="
          $emit('changeUnit', {
lanbaoming's avatar
lanbaoming committed
174
            value: $event,
175
            field: `${fieldPrefix}VolumeUnit`
176 177
          })
        "
lanbaoming's avatar
lanbaoming committed
178
        value-field="id"
179 180
        class="w-100"
      />
lanbaoming's avatar
lanbaoming committed
181 182 183 184 185
    </el-form-item>

    <!--特性加价-->
    <template v-for="(special, specialIndex) in value.specialList">
      <div :key="specialIndex + 'transport'">
186 187 188
        <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" />
lanbaoming's avatar
lanbaoming committed
189
          <span class="mr-10">/</span>
190
          <selector disabled v-model="special[`${fieldPrefix}VolumeUnit`]" :options="unitList" :label-field="$l(null, 'title')" value-field="id" class="w-100" />
lanbaoming's avatar
lanbaoming committed
191 192 193 194 195 196
        </el-form-item>
      </div>
    </template>

    <!--包装类型价格-->
    <template v-for="(item, i) in value[packagingField]">
197
      <el-form-item :label="$t('包装类型') + priceName + (i + 1)" :key="i">
lanbaoming's avatar
lanbaoming committed
198
        <template #label>
199 200 201
          <div class="el-form-item__label" style="width: 150px">
            {{ $t("包装类型{name}加价", { name: priceName }) + (i + 1) }}
          </div>
202
          <div v-if="!item.packagingTypes || !item.packagingTypes.length" class="tips">
203 204
            {{ $t("未选择包装类型将被忽略") }}
          </div>
lanbaoming's avatar
lanbaoming committed
205
        </template>
206 207
        <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>
lanbaoming's avatar
lanbaoming committed
208
        </el-select>
209 210
        <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" />
lanbaoming's avatar
lanbaoming committed
211
        <span class="mr-10">/</span>
212
        <selector disabled v-model="item.packagingVolumeUnit" :options="unitList" :label-field="$l(null, 'title')" value-field="id" defaultable2 class="w-100" />
213
        <template v-if="i == value[packagingField].length - 1 && !readonly">
214
          <el-link type="primary" @click.native="addPackage" class="ml-5">{{ $t("添加") }}</el-link>
lanbaoming's avatar
lanbaoming committed
215
          <el-divider direction="vertical"></el-divider>
216
          <el-link type="danger" @click.native="deletePackage(i)">{{ $t("删除") }}</el-link>
lanbaoming's avatar
lanbaoming committed
217 218 219 220 221 222 223 224 225 226
        </template>
      </el-form-item>
    </template>
  </div>
</template>

<style scoped lang="scss">
.bold {
  font-weight: bold;
}
227
.text-lg {
lanbaoming's avatar
lanbaoming committed
228 229
  font-size: 1.3rem;
}
230 231 232
.tips {
  font-size: 1rem;
  color: red;
lanbaoming's avatar
lanbaoming committed
233 234
}
</style>