222
schangxiang@126.com
2025-06-13 6a8393408d8cefcea02b7a598967de8dc1e565c2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
<template>
  <el-dialog v-dialogDrag ref="uploadRef" :visible.sync="currentDialogVisible" :title="positionTitle" class="position-dialog-container" width="780px">
    <el-alert :closable="false" title="提示:请认真填写下面库区各项参数,然后点击确定按钮生成库存货位布局。" type="success" class="alert-msg">
    </el-alert>
    <el-form ref="form" :model="formData" :rules="rules" label-width="140px" class="form-wrap" size="mini">
      <el-form-item required label="仓库名称" class="margin-bottom-10">
        <span>{{ formData.storageName }}</span>
      </el-form-item>
      <el-form-item required label="库区名称" prop="areaCode">
        <input-select v-model="formData.areaCode" :options="areaCodeList" :click-hidden="true" label="库区名称" input-width="200px" trigger="focus">
        </input-select>
      </el-form-item>
      <el-form-item required label="温层类型" prop="thermoclineType">
        <el-select v-model="formData.thermoclineType" placeholder="请选择活动区域">
          <el-option label="常温层" value="常温层"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item required label="编码规则" prop="positionRegular">
        <el-input v-model="formData.positionRegular" placeholder="请输入货位编码规则" class="w-200">
        </el-input> 标准编码规则:{库区}-{通道}{货架}{层}{列}
      </el-form-item>
      <el-form-item required label="货位类型" prop="positionType">
        <el-select v-model.number="formData.positionType" placeholder="请选择货位类型" class="w-200">
          <el-option v-for="(item, index) in positionTypeList" :key="index" :label="item.label" :value="item.value"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item required label="货位最大重量" prop="maxWeight">
        <el-input-number v-model.number="formData.maxWeight" controls-position="right" class="w-200"></el-input-number>
      </el-form-item>
      <el-form-item required label="货位最大拍数" prop="maxBeatNumber">
        <el-input-number v-model.number="formData.maxBeatNumber" controls-position="right" class="w-200"></el-input-number>
      </el-form-item>
      <el-form-item required label="货位最大数量" prop="maxCapacity">
        <el-input-number v-model.number="formData.maxCapacity" controls-position="right" class="w-200"></el-input-number>
      </el-form-item>
      <el-form-item required label="存货率计算" prop="inventoryRate">
        <el-radio-group v-model="formData.inventoryRate">
          <el-radio label="按数量">按数量</el-radio>
          <el-radio label="按重量">按重量</el-radio>
          <el-radio label="按拍数">按拍数</el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item required label="摆放模式" prop="shelveMode">
        <el-radio-group v-model="formData.shelveMode">
          <el-radio label="立体货架">立体货架</el-radio>
          <el-radio label="地堆">地堆</el-radio>
        </el-radio-group>
      </el-form-item>
      <template v-if="formData.shelveMode==='立体货架'">
        <el-form-item required label="拣货模式" prop="pickMode">
          <el-radio-group v-model="formData.pickMode" @change="onChangePickMode">
            <el-radio label="U型">U型</el-radio>
            <el-radio label="Z型">Z型</el-radio>
            <el-radio label="AB面奇偶型">AB面奇偶型</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item required label="库区通道数" prop="channelNum">
          <el-input-number v-model.number="formData.channelNum" controls-position="right" class="w-100"></el-input-number>
          <span class="tip">当前库区总共有多少个通道</span>
        </el-form-item>
        <el-form-item required label="货架层数" prop="rowNum">
          <el-input-number v-model.number="formData.rowNum" controls-position="right" class="w-100"></el-input-number>
          <span class="tip">每个货架有多少层</span>
        </el-form-item>
        <el-form-item required label="货架列数" prop="columnNum">
          <el-input-number v-model.number="formData.columnNum" controls-position="right" class="w-100"></el-input-number>
          <span class="tip">每个货架每层分多少列(格)</span>
        </el-form-item>
        <template v-if="formData.pickMode=='U型'">
          <el-form-item required label="A面货架编号范围" prop="shelveNumA_1">
            <el-input-number v-model.number="formData.shelveNumA_1" :disabled="true" controls-position="right" class="w-100"></el-input-number> ~
            <el-input-number v-model.number="formData.shelveNumA_2" controls-position="right" class="w-100"></el-input-number>
            <span class="tip">库区一般每个通道中存在A面、B面</span>
          </el-form-item>
          <el-form-item required label="B面货架编号范围" prop="shelveNumB_1">
            <el-input-number v-model.number="formData.shelveNumB_1" controls-position="right" class="w-100"></el-input-number> ~
            <el-input-number v-model.number="formData.shelveNumB_2" controls-position="right" class="w-100"></el-input-number>
            <span class="tip">库区开头可能只有A面,结尾只有B面</span>
          </el-form-item>
        </template>
        <template v-else-if="formData.pickMode=='Z型'">
          <el-form-item required label="货架编号范围" prop="shelveNumA_1">
            <el-input-number v-model.number="formData.shelveNumZ_1" :disabled="true" controls-position="right" class="w-100"></el-input-number> ~
            <el-input-number v-model.number="formData.shelveNumZ_2" controls-position="right" class="w-100"></el-input-number>
          </el-form-item>
        </template>
      </template>
      <template v-if="formData.shelveMode==='地堆'">
        <el-form-item required label="库区通道数" prop="channelNum_didui">
          <el-input-number v-model.number="formData.channelNum_didui" controls-position="right" class="w-100"></el-input-number>
          <span class="tip">当前地堆库区总共有多少个通道</span>
        </el-form-item>
        <el-form-item required label="地堆行数" prop="rowNum_didui">
          <el-input-number v-model.number="formData.rowNum_didui" controls-position="right" class="w-100"></el-input-number>
          <span class="tip">每个货架有多少层</span>
        </el-form-item>
        <el-form-item required label="地堆列数" prop="columnNum_didui">
          <el-input-number v-model.number="formData.columnNum_didui" controls-position="right" class="w-100"></el-input-number>
          <span class="tip">每个地堆区分多少列(格)</span>
        </el-form-item>
      </template>
    </el-form>
 
    <span slot="footer" class="dialog-footer">
      <el-button icon="el-icon-yrt-guanbi1" @click="currentDialogVisible = false">取 消</el-button>
      <el-button icon="el-icon-yrt-save" @click="resetForm">重置</el-button>
      <el-button :loading="isLoading" type="primary" icon="el-icon-yrt-save" @click="submitForm">确定</el-button>
    </span>
  </el-dialog>
</template>
 
<script>
import InputSelect from "@/components/base/InputSelect";
 
export default {
  components: {
    InputSelect
  },
  props: {
    visible: {
      type: Boolean,
      default: false
    },
    label: {
      type: String,
      default: null
    },
    options: {
      type: Object,
      default: () => {
        return {};
      }
    },
    // 表单数据
    areaData: {
      type: Object,
      default: () => {
        return {
          // 摆放模式
          shelveMode: "立体货架",
          // 拣货模式
          pickMode: "U型"
        };
      }
    },
    importData: {
      type: Function,
      default: () => {
        return () => {};
      }
    },
    // 标题
    positionTitle: {
      type: String,
      default: null
    }
  },
  data() {
    return {
      isLoading: false,
      // 库区候选项
      areaCodeList: "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z".split(",").map(item => {
        return {
          label: item,
          value: item
        };
      }),
      // 货位类型
      positionTypeList: [
        {
          label: "常规货位",
          value: 1
        },
        {
          label: "残品货位",
          value: 2
        },
        {
          label: "借入货位",
          value: 3
        },
        {
          label: "收货位",
          value: 4
        },
        {
          label: "下架理货位",
          value: 5
        },
        {
          label: "暂存货位",
          value: 6
        },
        {
          label: "虚拟货位",
          value: 7
        },
        {
          label: "次品货位",
          value: 8
        },
        {
          label: "拣货车",
          value: 9
        },
        {
          label: "灯光分拣位",
          value: 11
        },
        {
          label: "高架货位",
          value: 12
        },
        {
          label: "存储货位",
          value: 13
        },
        {
          label: "临期货位",
          value: 14
        }
      ],
      // 验证规则
      rules: {
        areaCode: [{ required: true, message: "请选择库区名称", trigger: "blur" }],
        positionType: [{ required: true, message: "请选择货位类型", trigger: "blur" }],
        maxCapacity: [
          { required: true, message: "请输入最大库位量", trigger: "blur" },
          { type: "number", min: 1, message: "最小值为1", trigger: "blur" }
        ],
        shelveMode: [{ required: true, message: "请选择摆放模式", trigger: "blur" }],
        pickMode: [{ required: true, message: "请选择拣货模式", trigger: "blur" }],
        channelNum: [
          { required: true, message: "请输入库区通道数", trigger: "blur" },
          { type: "number", min: 1, message: "最小值为1", trigger: "blur" }
        ],
        rowNum: [{ required: true, message: "请输入货架层数", trigger: "blur" }, { type: "number", min: 1, message: "最小值为1", trigger: "blur" }],
        columnNum: [
          { required: true, message: "请输入货架列数", trigger: "blur" },
          { type: "number", min: 1, message: "最小值为1", trigger: "blur" }
        ],
        shelveNumA_1: [
          { required: true, message: "请输入A面货架编号范围", trigger: "blur" },
          { type: "number", min: 1, message: "最小值为1", trigger: "blur" }
        ],
        shelveNumB_1: [
          { required: true, message: "请输入B面货架编号范围", trigger: "blur" },
          { type: "number", min: 1, message: "最小值为1", trigger: "blur" }
        ],
        channelNum_didui: [
          { required: true, message: "请输入库区通道数", trigger: "blur" },
          { type: "number", min: 1, message: "最小值为1", trigger: "blur" }
        ],
        rowNum_didui: [
          { required: true, message: "请输入地堆行数", trigger: "blur" },
          { type: "number", min: 1, message: "最小值为1", trigger: "blur" }
        ],
        columnNum_didui: [
          { required: true, message: "请输入地堆列数", trigger: "blur" },
          { type: "number", min: 1, message: "最小值为1", trigger: "blur" }
        ],
        shelveNumZ_1: [
          { required: true, message: "货架编号范围", trigger: "blur" },
          { type: "number", min: 1, message: "最小值为1", trigger: "blur" }
        ]
      },
      // 当前表单数据
      formData: {
        maxCapacity: 0,
        rowNum_didui: 0,
        columnNum_didui: 0
      }
    };
  },
  computed: {
    // 显示窗口
    currentDialogVisible: {
      get: function() {
        return this.visible;
      },
      set: function(val) {
        this.$emit("update:visible", val);
      }
    }
  },
  watch: {
    areaData: {
      handler: function() {
        this.formData = JSON.parse(JSON.stringify(this.areaData));
      },
      deep: true
    }
  },
  created() {
    this.getareaCodeList();
  },
  methods: {
    // 获得库区下拉框
    getareaCodeList() {
      const url = "/api/sys/param/getValueList";
      const params = {
        type_Id: 735
      };
      this.common.ajax(url, params, res => {
        this.common.showMsg(res);
        if (res.result) {
          this.areaCodeList = res.data.map(item => {
            return {
              value: item.value02,
              label: item.value02
            };
          });
        }
      });
    },
    // 保存数据
    submitForm() {
      if (this.formData.action === "modify" && this.formData.channelNum > this.areaData.channelNum) {
        this.$message.error("新输入通道数不能小于原通道数!");
        return;
      }
      if (this.formData.action === "modify" && this.formData.rowNum > this.areaData.rowNum) {
        this.$message.error("新输入货架层数不能小于原货架层数!");
        return;
      }
      if (this.formData.action === "modify" && this.formData.channelNum > this.areaData.channelNum) {
        this.$message.error("新输入货架列数不能小于原货架列数!");
        return;
      }
      if (this.formData.shelveMode === "地堆") {
        this.formData.channelNum = this.formData.channelNum_didui;
        this.formData.rowNum = this.formData.rowNum_didui;
        this.formData.columnNum = this.formData.columnNum_didui;
      } else {
        if (this.formData.pickMode === "U型") {
          if (this.formData.action === "modify" && this.formData.shelveNumA_2 > this.areaData.shelveNumA_2) {
            this.$message.error("新输入A面货架数不能小于原A面货架数!");
            return;
          }
          if (this.formData.action === "modify" && this.formData.shelveNumB_2 > this.areaData.shelveNumB_2) {
            this.$message.error("新输入B面货架数不能小于原B面货架数!");
            return;
          }
          if (this.formData.action === "modify" && this.formData.shelveNumA_2 > this.areaData.shelveNumA_2) {
            this.$message.error("新输入货架数不能小于原货架数!");
            return;
          }
        } else if (this.formData.pickMode === "Z型") {
          this.formData.shelveNumA_1 = this.formData.shelveNumZ_1;
          this.formData.shelveNumA_2 = this.formData.shelveNumZ_2;
 
          if (this.formData.action === "modify" && this.formData.shelveNumA_2 > this.areaData.shelveNumA_2) {
            this.$message.error("新输入货架数不能小于原货架数!");
            return;
          }
          if (this.formData.shelveNumA_1 > this.formData.shelveNumA_2) {
            this.$message.error("请输入货架编号范围,开始值不能大于结束值!");
            return;
          }
          this.formData.shelveNumB_1 = null;
          this.formData.shelveNumB_2 = null;
        } else if (this.formData.pickMode === "AB面奇偶型") {
          if (this.formData.action === "modify" && this.formData.shelveNumA_2 > this.areaData.shelveNumA_2) {
            this.$message.error("新输入货架数不能小于原货架数!");
            return;
          }
          if (this.formData.shelveNumA_1 > this.formData.shelveNumA_2) {
            this.$message.error("请输入货架编号范围,开始值不能大于结束值!");
            return;
          }
          this.formData.shelveNumB_1 = null;
          this.formData.shelveNumB_2 = null;
        }
      }
 
      this.$refs["form"].validate((valid, result) => {
        if (valid) {
          this.$emit("on-confirm", this.formData);
          this.currentDialogVisible = false;
        } else {
          Object.keys(result).forEach(key => {
            this.$message.error(result[key][0].message);
          });
          return false;
        }
      });
    },
    // 重置
    resetForm() {
      this.$refs["form"].resetFields();
    },
    // 设置AB
    onChangePickMode(val) {
      if (val === "AB面奇偶型") {
        this.formData.shelveNumA_1 = 1;
        this.formData.shelveNumA_2 = 2;
      }
    }
  }
};
</script>
 
<style lang="scss" scoped>
.position-dialog-container {
  /deep/ .el-dialog__body {
    padding-top: 0px;
  }
  /deep/ .scrollbar-wrap {
    max-height: 400px;
    overflow-x: hidden;
    padding: 0px;
  }
  .form-wrap {
    margin-top: 20px;
  }
}
</style>