Blame view

src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java 36.1 KB
mahuandong authored
1
2
3
package com.huaheng.pc.config.location.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
tongzhonghao authored
4
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
6
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
周鸿 authored
7
import com.huaheng.common.support.Convert;
周鸿 authored
8
import com.huaheng.common.utils.Wrappers;
9
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
游杰 authored
10
import com.huaheng.common.constant.QuantityConstant;
mahuandong authored
11
12
13
14
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
周鸿 authored
15
16
17
18
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.containerType.domain.ContainerType;
import com.huaheng.pc.config.containerType.service.ContainerTypeService;
19
import com.huaheng.pc.config.location.domain.Location;
20
import com.huaheng.pc.config.location.domain.LocationAge;
mahuandong authored
21
import com.huaheng.pc.config.location.domain.LocationInfo;
22
import com.huaheng.pc.config.location.mapper.LocationMapper;
mahuandong authored
23
24
import com.huaheng.pc.config.locationType.domain.LocationType;
import com.huaheng.pc.config.locationType.service.LocationTypeService;
周鸿 authored
25
import com.huaheng.pc.config.points.domain.Points;
mahuandong authored
26
27
import com.huaheng.pc.config.zone.domain.Zone;
import com.huaheng.pc.config.zone.service.ZoneService;
28
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
mahuandong authored
29
import org.springframework.stereotype.Service;
30
mahuandong authored
31
32
import javax.annotation.Resource;
import java.text.MessageFormat;
游杰 authored
33
import java.util.*;
周鸿 authored
34
import java.util.stream.Collectors;
mahuandong authored
35
36

@Service("LocationService")
37
public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> implements LocationService {
mahuandong authored
38
39
40
41
42
43
44
45
46

    @Resource
    private LocationService locationService;
    @Resource
    private LocationTypeService locationTypeService;
    @Resource
    private ZoneService zoneService;
    @Resource
    private LocationMapper locationMapper;
47
48
    @Resource
    private TaskHeaderService taskHeaderService;
周鸿 authored
49
50
51
52
    @Resource
    private ContainerService containerService;
    @Resource
    private ContainerTypeService containerTypeService;
mahuandong authored
53
huhai authored
54
55
56
57
    /**
     * //新增库位,需要建立code,并判断是否重复
     * 1. 库区和库位没有绝对关系。 先建立库区,然后在库区的位置进行建立库位类型。
     * TODO:胡海--在判断库位类型和库区是否匹配,应该用库位类型表进行判断。库位类型在库区存在即可
58
     *
huhai authored
59
60
61
     * @param location
     * @return
     */
mahuandong authored
62
    @Override
63
    public AjaxResult addsave(Location location) {
mahuandong authored
64
65

        //库区与库位类型的匹配判断
66
67
        if (!location.getZoneCode().equals(location.getLocationType())) {
            throw new ServiceException(location.getLocationType() + "的库位类型与" + location.getZoneCode() + "库区不匹配");
mahuandong authored
68
        }
69
        //TODO:胡海-- 库位编码长度应该是弹性的,即我们的库位是由4个维度组成的,正常情况下  平库(行列) 立体仓库(行列层) AGV料架库(行列层格)
huhai authored
70
        // 这里可以判断下 然后决定库位编码长度。
mahuandong authored
71
        //创建库位编码code
72
73
        String prefix = location.getLocationType();
        String code = MessageFormat.format("{0}{1}_{2}_{3}",
mahuandong authored
74
75
76
                prefix,
                String.format("%02d", location.getIRow()),
                String.format("%02d", location.getIColumn()),
77
                String.format("%02d", location.getILayer()));
mahuandong authored
78
79
80

        //判断code是否重复
        LambdaQueryWrapper<Location> lam = Wrappers.lambdaQuery();
81
82
83
        lam.eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
                .eq(Location::getCode, code);
        if (this.getOne(lam) != null) {
mahuandong authored
84
85
86
87
88
89
90
            return AjaxResult.error("该位置已有库位生成,请重新输入位置");
        }

        //插入数据库
        location.setCode(code);
        location.setWarehouseCode(ShiroUtils.getWarehouseCode());
        location.setCreatedBy(ShiroUtils.getLoginName());
91
92
        Boolean flag = this.save(location);
        if (flag == false) {
mahuandong authored
93
94
95
96
97
98
99
            return AjaxResult.error("新增库位失败,插入数据库时失败");
        }
        return AjaxResult.success("新增库位成功");
    }

    /**
     * 批量新增库位
100
     *
mahuandong authored
101
102
103
104
105
106
107
     * @param location
     * @return boolean
     */
    @Override
    public boolean insertLocation(Location location) {
        /* 判断库位类型编码是否存在*/
        LambdaQueryWrapper<LocationType> typeLambda = Wrappers.lambdaQuery();
108
109
        typeLambda.eq(LocationType::getCode, location.getLocationType())
                .select(LocationType::getCode);
mahuandong authored
110
        List<Map<String, Object>> list = locationTypeService.listMaps(typeLambda);
111
        if (list.size() < 1) {
mahuandong authored
112
113
114
115
            throw new ServiceException("库位类型编码不存在");
        }

        /* 判断库区编码是否存在*/
116
        LambdaQueryWrapper<Zone> zoneLambda = Wrappers.lambdaQuery();
mahuandong authored
117
118
119
120
        zoneLambda.eq(Zone::getCode, location.getZoneCode())
                .select(Zone::getCode);

        list = zoneService.listMaps(zoneLambda);
121
        if (list.size() < 1) {
mahuandong authored
122
123
            throw new ServiceException("库区编码不存在");
        }
huhai authored
124
        //TODO:胡海--在判断库位类型和库区是否匹配,应该用库位类型表进行判断。库位类型在库区存在即可
125
126
        if (!location.getZoneCode().equals(location.getLocationType())) {
            throw new ServiceException(location.getLocationType() + "的库位类型与" + location.getZoneCode() + "库区不匹配");
mahuandong authored
127
128
129
        }

        List<Location> locations = new ArrayList<>();
130
131
132
133
        for (int i = 1; i <= location.getIRow().intValue(); i++) {
            for (int j = 1; j <= location.getIColumn().intValue(); j++) {
                for (int k = 1; k <= location.getILayer().intValue(); k++) {
                    for (int m = 1; m <= location.getIGrid().intValue(); m++) {
mahuandong authored
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
                        //Integer roadway = (j / 2) + 1;
                        Location param = new Location();
                        param.setIRow(i);
                        param.setIColumn(j);
                        param.setILayer(k);
                        param.setIGrid(m);
                        param.setRoadway(location.getRoadway());
                        param.setZoneCode(location.getZoneCode());
                        param.setLocationType(location.getLocationType());
                        param.setStatus(location.getStatus());
                        param.setWarehouseCode(ShiroUtils.getWarehouseCode());
                        param.setCreatedBy(ShiroUtils.getLoginName());
                        param.setLastUpdatedBy(ShiroUtils.getLoginName());
                        String code = MessageFormat.format("{0}{1}_{2}_{3}",
                                location.getLocationType(),
                                String.format("%02d", i),
                                String.format("%02d", j),
                                String.format("%02d", k));
                        //查询该库位编码是否存在
                        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
154
155
                        queryWrapper.eq(Location::getCode, code)
                                .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode());
mahuandong authored
156
157
158
159
160
161
162
163
164
                        List<Location> locationList = locationService.list(queryWrapper);
                        if (locationList.size() == 0) {
                            param.setCode(code);
                            locations.add(param);
                        }
                    }
                }
            }
        }
165
        int num = 0;
mahuandong authored
166
        List<Location> locations1 = new ArrayList<>();
167
168
        if (locations.size() > 1000) {
            for (Location item : locations) {
mahuandong authored
169
170
                num++;
                locations1.add(item);
171
                if (num % 1000 == 0 || num == locations.size()) {
mahuandong authored
172
                    locationMapper.addList(locations1);
173
                    locations1 = new ArrayList<>();
mahuandong authored
174
175
                }
            }
176
        } else {
mahuandong authored
177
178
            locationMapper.addList(locations);
        }
179
180

        List<Integer> integerList = new ArrayList<>();
181
182
        for (Location location2 : locations) {
            if (integerList.size() == 0) {
183
184
                integerList.add(location2.getIRow());
            } else {
185
186
                for (int i = 0; i < integerList.size(); i++) {
                    if (integerList.get(i).intValue() == location2.getIRow().intValue()) {
187
188
                        break;
                    } else {
189
                        if (i == (integerList.size() - 1)) {
190
191
192
193
194
195
                            integerList.add(location2.getIRow());
                        }
                    }
                }
            }
        }
196
        if (integerList.size() == 4) {
197
198
199
200
201
202
203
204
205
206
207
208
209
            for (Location location3 : locations) {
                for (int i = 0; i < integerList.size(); i++) {
                    if (location3.getIRow().intValue() == integerList.get(i).intValue()) {
                        if (i == 0 || i == (integerList.size() - 1)) {
                            location3.setRowFlag(1);
                        } else {
                            location3.setRowFlag(0);
                        }
                    }
                }
            }
            locationMapper.updateList(locations);
        }
mahuandong authored
210
211
212
        return true;
    }
213
    @Override
214
    public boolean addBatchSave(String prefix, Integer firstRow, Integer lastRow, Integer firstColumn, Integer lastColumn, Integer firstLayer, Integer lastLayer,
游杰 authored
215
                                Integer firstGrid, Integer lastGrid, String roadWay, String status, String zoneCode, String locationType, String high) {
216
217
218
219
        LambdaQueryWrapper<LocationType> typeLambda = Wrappers.lambdaQuery();
        typeLambda.eq(LocationType::getCode, locationType)
                .select(LocationType::getCode);
        List<Map<String, Object>> list = locationTypeService.listMaps(typeLambda);
220
        if (list.size() < 1) {
221
222
223
224
            throw new ServiceException("库位类型编码不存在");
        }

        /* 判断库区编码是否存在*/
225
        LambdaQueryWrapper<Zone> zoneLambda = Wrappers.lambdaQuery();
226
227
228
229
        zoneLambda.eq(Zone::getCode, zoneCode)
                .select(Zone::getCode);

        list = zoneService.listMaps(zoneLambda);
230
        if (list.size() < 1) {
231
232
233
            throw new ServiceException("库区编码不存在");
        }
        //TODO:胡海--在判断库位类型和库区是否匹配,应该用库位类型表进行判断。库位类型在库区存在即可
234
       /* if(!zoneCode.equals(locationType)){
235
            throw new ServiceException(locationType+"的库位类型与"+ zoneCode +"库区不匹配");
236
        }*/
237
        LambdaQueryWrapper<Zone> zoneLambdaQueryWrapper = Wrappers.lambdaQuery();
238
        zoneLambdaQueryWrapper.eq(Zone::getWarehouseCode, ShiroUtils.getWarehouseCode());
239
240
241
242
243
244
245
246
        zoneLambdaQueryWrapper.eq(Zone::getCode, zoneCode);
        Zone zone = zoneService.getOne(zoneLambdaQueryWrapper);
        String area = zone.getArea();
        List<Location> locations = new ArrayList<>(); // 为零?
        for (int i = firstRow.intValue(); i <= lastRow.intValue(); i++) {
            for (int j = firstColumn.intValue(); j <= lastColumn.intValue(); j++) {
                for (int k = firstLayer.intValue(); k <= lastLayer.intValue(); k++) {
                    for (int m = firstGrid.intValue(); m <= lastGrid.intValue(); m++) {
247
248
249
250
251
252
253
                        //Integer roadway = (j / 2) + 1;
                        Location param = new Location();
                        param.setIRow(i);
                        param.setIColumn(j);
                        param.setILayer(k);
                        param.setIGrid(m);
                        param.setRoadway(roadWay);
254
                        param.setArea(area);
255
256
257
                        param.setZoneCode(zoneCode);
                        param.setLocationType(locationType);
                        param.setStatus(status);
游杰 authored
258
                        param.setHigh(Integer.parseInt(high));
259
260
261
                        param.setWarehouseCode(ShiroUtils.getWarehouseCode());
                        param.setCreatedBy(ShiroUtils.getLoginName());
                        param.setLastUpdatedBy(ShiroUtils.getLoginName());
唐高鑫 authored
262
                        String code = MessageFormat.format("{0}{1}-{2}-{3}",
263
                                prefix,
264
265
266
267
268
                                String.format("%02d", i),
                                String.format("%02d", j),
                                String.format("%02d", k));
                        //查询该库位编码是否存在
                        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
269
270
                        queryWrapper.eq(Location::getCode, code)
                                .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode());
271
272
273
274
275
276
277
278
279
280
                        List<Location> locationList = locationService.list(queryWrapper);
                        if (locationList.size() == 0) {
                            param.setCode(code);
                            locations.add(param);
                        }
                    }
                }
            }
        }
281
        int num = 0;
282
        List<Location> locations1 = new ArrayList<>();
283
284
        if (locations.size() > 1000) {
            for (Location item : locations) {
285
286
                num++;
                locations1.add(item);
287
                if (num % 1000 == 0 || num == locations.size()) {
288
                    locationMapper.addList(locations1);
289
                    locations1 = new ArrayList<>();
290
291
                }
            }
292
        } else {
293
294
295
296
            locationMapper.addList(locations);
        }

        List<Integer> integerList = new ArrayList<>();
297
298
        for (Location location2 : locations) {
            if (integerList.size() == 0) {
299
300
                integerList.add(location2.getIRow());
            } else {
301
302
                for (int i = 0; i < integerList.size(); i++) {
                    if (integerList.get(i).intValue() == location2.getIRow().intValue()) {
303
304
                        break;
                    } else {
305
                        if (i == (integerList.size() - 1)) {
306
307
308
309
310
311
                            integerList.add(location2.getIRow());
                        }
                    }
                }
            }
        }
312
        if (integerList.size() == 4) {
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
            for (Location location3 : locations) {
                for (int i = 0; i < integerList.size(); i++) {
                    if (location3.getIRow().intValue() == integerList.get(i).intValue()) {
                        if (i == 0 || i == (integerList.size() - 1)) {
                            location3.setRowFlag(1);
                        } else {
                            location3.setRowFlag(0);
                        }
                    }
                }
            }
            locationMapper.updateList(locations);
        }

        return true;
    }
huhai authored
330
331
    /**
     * 根据库位编码对库位表格的状态进行更新
332
     *
huhai authored
333
334
335
     * @param locationCode
     * @param status
     */
mahuandong authored
336
337
338
339
340
341
342
    @Override
    public void updateStatus(String locationCode, String status) {
        if (StringUtils.isNotEmpty(locationCode)) {
            locationMapper.updateStatus(ShiroUtils.getWarehouseCode(), locationCode, status);
        }
    }
343
344
345
346
347
348
349
    @Override
    public void updateStatus(String locationCode, String status, String warehouseCode) {
        if (StringUtils.isNotEmpty(locationCode)) {
            locationMapper.updateStatus(warehouseCode, locationCode, status);
        }
    }
mahuandong authored
350
351
    /**
     * 通过定位规则查找库位
352
     *
mahuandong authored
353
354
355
356
     * @param locatingRule
     * @return
     */
    @Override
357
    public String position(String locatingRule) {
mahuandong authored
358
359
360
361
362
        return locationMapper.position(locatingRule).getCode();
    }

    /**
     * 修改容器和库位状态
363
     */
mahuandong authored
364
365
366
    @Override
    public void updateContainerCodeAndStatus(String locationCode, String containerCode, String status) {
        if (StringUtils.isNotEmpty(locationCode) || StringUtils.isNotEmpty(containerCode)) {
367
368
369
            LambdaUpdateWrapper<Location> updateWrapper = Wrappers.lambdaUpdate();
            updateWrapper.set(Location::getContainerCode, containerCode)
                    .set(Location::getStatus, status)
游杰 authored
370
                    .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
371
372
                    .eq(Location::getCode, locationCode);
            this.update(updateWrapper);
mahuandong authored
373
374
375
376
        }
    }

    @Override
377
  	public void updateContainerCodeAndStatus(String locationCode, String containerCode,
游杰 authored
378
                                             String status, String warehouseCode) {
李泰瑜 authored
379
380
381
382
383
384
385
386
        if (StringUtils.isNotEmpty(locationCode) || StringUtils.isNotEmpty(containerCode)) {
            LambdaUpdateWrapper<Location> updateWrapper = Wrappers.lambdaUpdate();
            updateWrapper.set(Location::getContainerCode, containerCode)
                    .set(Location::getStatus, status)
                    .eq(Location::getWarehouseCode, warehouseCode)
                    .eq(Location::getCode, locationCode);
            this.update(updateWrapper);
        }
387
388
389
390
391
392
393
394
    }

    /**
     * 获取库区最大行列
     * @param type
     * @return
     */
    @Override
xumiao authored
395
    public LocationInfo getAllLocation(String warehouseCode,String type) {
mahuandong authored
396
        if (StringUtils.isNotEmpty(type)) {
xumiao authored
397
398
399
400
            if(warehouseCode==null){
                warehouseCode=ShiroUtils.getWarehouseCode();
            }
            Location location = locationMapper.getAllLocation(warehouseCode, type);
mahuandong authored
401
402
403
404
405
            LocationInfo locationInfo = new LocationInfo();
            locationInfo.setMaxRow(location.getIRow());
            locationInfo.setMaxLine(location.getIColumn());
            locationInfo.setMaxLayer(location.getILayer());
            locationInfo.setMaxGrid(location.getIGrid());
xumiao authored
406
            int minRow = locationMapper.getFirstRowOfZone(warehouseCode, type);
周峰 authored
407
            locationInfo.setMinRow(minRow);
mahuandong authored
408
409
410
411
412
413
414
415
416
417
418
419
420
421
            return locationInfo;
        }
        return null;
    }

    /**
     * 验证库位合法性
     *
     * @param code
     * @return
     */
    @Override
    public boolean checkLocation(String code) {
        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
游杰 authored
422
        queryWrapper.eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
423
                .eq(Location::getDeleted, false)
mahuandong authored
424
425
                .eq(Location::getCode, code);
        List<Location> locations = list(queryWrapper);
426
        if (locations.size() >= 1) {
mahuandong authored
427
            Location location = locations.get(0);
428
            String containerCode = location.getContainerCode();
mahuandong authored
429
430
431
432
            if (containerCode != null && containerCode.length() > 0) {
                throw new ServiceException("货架上已有容器");
            }
            String status = location.getStatus();
433
            if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(status)) {
mahuandong authored
434
435
436
437
438
439
440
441
442
443
444
                throw new ServiceException("库位状态不为空");
            }
            return true;
        } else {
            return false;
        }
    }

    @Override
    public boolean getFreeLocation(String materialCode, String batch) {
        LambdaQueryWrapper<Location> lambdaQueryWrapper = Wrappers.lambdaQuery();
游杰 authored
445
        lambdaQueryWrapper.eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
mahuandong authored
446
447
                .eq(Location::getContainerCode, "")
                .eq(Location::getDeleted, false)
游杰 authored
448
                .eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_EMPTY);
mahuandong authored
449
        List<Location> locations = locationService.list(lambdaQueryWrapper);
450
        if (locations != null && locations.size() > 0) {
mahuandong authored
451
452
453
454
455
456
457
            return true;
        }
        return false;
    }

    /**
     * 查询库位利用率
458
     *
mahuandong authored
459
460
461
462
463
464
465
466
467
     * @return
     */
    @Override
    public List<LinkedHashMap<String, Object>> getLocationProp() {
        return locationMapper.getLocationProp();
    }

    /**
     * 根据库位编码查询库位信息
468
     *
469
     * @param
mahuandong authored
470
471
472
     * @return
     */
    @Override
游杰 authored
473
    public Location getLocationByCode(String locationCode) {
mahuandong authored
474
        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
游杰 authored
475
        queryWrapper.eq(Location::getCode, locationCode);
476
        queryWrapper.eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode());
mahuandong authored
477
478
479
        return getOne(queryWrapper);
    }
mahuandong authored
480
    @Override
481
482
483
484
485
486
487
488
    public Location getLocationByCode(String locationCode, String warehouseCode) {
        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Location::getCode, locationCode);
        queryWrapper.eq(Location::getWarehouseCode, warehouseCode);
        return getOne(queryWrapper);
    }

    @Override
mahuandong authored
489
490
491
492
    public List<Location> pickLocation() {
        return locationMapper.pickLocation();
    }
493
    @Override
494
495
496
497
498
    public List<Location> selectLocationByContainerEmpty(String warehouseCode, String zoneCode, String roadWay) {
        return locationMapper.selectLocationByContainerEmpty(warehouseCode,zoneCode,roadWay);
    }

    @Override
499
500
501
502
    public List<Location> selectContainerEmpty(String warehouseCode) {
        return locationMapper.selectContainerEmpty(warehouseCode);
    }
503
504
505
506
    @Override
    public Location getInsideNear(Location location) {
        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Location::getWarehouseCode, location.getWarehouseCode());
507
        queryWrapper.eq(Location::getZoneCode, location.getZoneCode());
508
509
510
        queryWrapper.eq(Location::getRoadway, location.getRoadway());
        queryWrapper.eq(Location::getIColumn, location.getIColumn());
        queryWrapper.eq(Location::getILayer, location.getILayer());
xumiao authored
511
        queryWrapper.eq(!location.getWarehouseCode().equalsIgnoreCase("KS0001"),Location::getLocationType, location.getLocationType());
游杰 authored
512
        queryWrapper.eq(Location::getRowFlag, QuantityConstant.ROW_IN);
513
        List<Location> locationList = list(queryWrapper);
514
515
516
517
518
        for (Location location1 : locationList) {
            int diff = Math.abs(location1.getIRow().intValue() - location.getIRow().intValue());
            if (diff == 1) {
                return location1;
            }
519
520
521
522
523
        }
        return null;
    }

    @Override
524
525
526
    public Location getOutSideNear(Location location) {
        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Location::getWarehouseCode, location.getWarehouseCode());
527
        queryWrapper.eq(Location::getZoneCode, location.getZoneCode());
528
529
530
        queryWrapper.eq(Location::getRoadway, location.getRoadway());
        queryWrapper.eq(Location::getIColumn, location.getIColumn());
        queryWrapper.eq(Location::getILayer, location.getILayer());
xumiao authored
531
        queryWrapper.eq(!location.getWarehouseCode().equalsIgnoreCase("KS0001"),Location::getLocationType, location.getLocationType());
游杰 authored
532
        queryWrapper.eq(Location::getRowFlag, QuantityConstant.ROW_OUT);
533
        queryWrapper.orderByDesc(Location::getIRow);
534
        List<Location> locationList = list(queryWrapper);
535
        for (Location location1 : locationList) {
536
            int diff = Math.abs(location1.getIRow().intValue() - location.getIRow().intValue());
537
            if (diff == 1) {
538
539
540
541
542
543
544
545
                return location1;
            }
        }
        return null;
    }

    @Override
    public Location getNear(Location location) {
546
547
        int rowFlag = location.getRowFlag().intValue();
        Location locaiton2 = null;
548
        if (rowFlag == 1) {
549
550
            locaiton2 = getInsideNear(location);
        } else {
551
552
553
554
555
            locaiton2 = getOutSideNear(location);
        }
        return locaiton2;
    }
游杰 authored
556
557
    private boolean getOutSideCanMove(Location location) {
        Location locaiton2 = getInsideNear(location);
558
559
        if (!locaiton2.getStatus().equals(QuantityConstant.STATUS_LOCATION_EMPTY)) {
            return false;
游杰 authored
560
        }
561
        if (!locaiton2.getContainerCode().equals("")) {
游杰 authored
562
563
            return false;
        }
564
        return true;
游杰 authored
565
566
567
568
569
570
571
    }

    @Override
    public Location getEmptyOutSideLocation(Location location) {
        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Location::getWarehouseCode, location.getWarehouseCode());
        queryWrapper.eq(Location::getRoadway, location.getRoadway());
周鸿 authored
572
        queryWrapper.ge(Location::getHigh, location.getHigh());
573
//        queryWrapper.eq(Location::getRowFlag, QuantityConstant.ROW_OUT);
游杰 authored
574
        queryWrapper.eq(Location::getContainerCode, "");
游杰 authored
575
        queryWrapper.eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_EMPTY);
xumiao authored
576
        queryWrapper.eq(!location.getWarehouseCode().equalsIgnoreCase("KS0001"),Location::getLocationType, location.getLocationType());
周鸿 authored
577
        queryWrapper.last(" order by high asc,rowFlag desc ");
游杰 authored
578
        List<Location> locationList = list(queryWrapper);
游杰 authored
579
580
        List<Location> removeLocationList = new ArrayList<>();
        int column = location.getIColumn();
581
        Collections.sort(locationList, new Comparator<Location>() {
游杰 authored
582
583
584
585
586
587
            @Override
            public int compare(Location o1, Location o2) {
                int dvalue1 = Math.abs(o1.getIColumn() - column);
                int dvalue2 = Math.abs(o2.getIColumn() - column);
                return dvalue1 - dvalue2;
            }
588
        });
游杰 authored
589
        int removeSize = 0;
590
        for (int i = 0; i < locationList.size(); i++) {
游杰 authored
591
            Location location1 = locationList.get(i);
周鸿 authored
592
            if (taskHeaderService.getUncompleteTaskInNearXZ(location1) > 0) {
游杰 authored
593
594
595
596
597
598
599
600
                removeLocationList.add(location1);
                removeSize++;
            } else if (!getOutSideCanMove(location1)) {
                removeLocationList.add(location1);
                removeSize++;
            }
            if (i - removeSize >= 3) {
                break;
游杰 authored
601
602
            }
        }
游杰 authored
603
        locationList.removeAll(removeLocationList);
604
        if (locationList == null || locationList.size() <= 0) {
游杰 authored
605
606
607
608
609
610
611
            return null;
        }
        Location location1 = locationList.get(0);
        return location1;
    }
612
    @Override
613
614
615
616
    public Location getEmptyInsideLocation(Location location) {
        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Location::getWarehouseCode, location.getWarehouseCode());
        queryWrapper.eq(Location::getRoadway, location.getRoadway());
游杰 authored
617
        queryWrapper.eq(Location::getRowFlag, QuantityConstant.ROW_IN);
周鸿 authored
618
        queryWrapper.ge(Location::getHigh, location.getHigh());
619
        queryWrapper.eq(Location::getContainerCode, "");
游杰 authored
620
        queryWrapper.eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_EMPTY);
xumiao authored
621
        queryWrapper.eq(!location.getWarehouseCode().equalsIgnoreCase("KS0001"),Location::getLocationType, location.getLocationType());
622
        List<Location> locationList = list(queryWrapper);
623
        List<Location> removeLocaationList = new ArrayList<>();
游杰 authored
624
        int column = location.getIColumn();
625
        Collections.sort(locationList, new Comparator<Location>() {
游杰 authored
626
627
628
629
630
631
            @Override
            public int compare(Location o1, Location o2) {
                int dvalue1 = Math.abs(o1.getIColumn() - column);
                int dvalue2 = Math.abs(o2.getIColumn() - column);
                return dvalue1 - dvalue2;
            }
游杰 authored
632
633
        });
        int removeSize = 0;
634
        for (int i = 0; i < locationList.size(); i++) {
游杰 authored
635
            Location location1 = locationList.get(i);
636
637
638
639
640
641
642
643
644
645
            if(location.getWarehouseCode().equals(QuantityConstant.WAREHOUSE_KS)){
                if (taskHeaderService.getUncompleteTaskInNear(location1) > 0) {
                    removeLocaationList.add(location1);
                    removeSize++;
                }
            }else{
                if (taskHeaderService.getUncompleteTaskInNearXZ(location1) > 0) {
                    removeLocaationList.add(location1);
                    removeSize++;
                }
游杰 authored
646
647
648
649
650
651
            }
            if (i - removeSize >= 3) {
                break;
            }
        }
        locationList.removeAll(removeLocaationList);
652
        if (locationList == null || locationList.size() <= 0) {
653
654
            return null;
        }
655
        Location location1 = locationList.get(0);
656
657
658
        return location1;
    }
游杰 authored
659
660
661
662
663
664
665
666
    @Override
    public Location getEmptyLocation(Location location) {
        Location location1 = getEmptyOutSideLocation(location);
        if (location1 == null) {
            location1 = getEmptyInsideLocation(location);
        }
        return location1;
    }
周峰 authored
667
668
669
670
671
672
673
674
675
676

    @Override
    public int getFirstRowOfZone(String warehouseCode, String locationType) {
        return locationMapper.getFirstRowOfZone(warehouseCode, locationType);
    }

    @Override
    public int getLastRowOfZone(String warehouseCode, String locationType) {
        return locationMapper.getLastRowOfZone(warehouseCode, locationType);
    }
677
678
679
680
681
682

    @Override
    public List<Location> remoteList(String type) {
        LambdaQueryWrapper<Location> wrapper = Wrappers.lambdaQuery();
        if ("status".equals(type)) {
            wrapper.eq(Location::getStatus, "lock");
683
        } else if ("container".equals(type)) {
684
            wrapper.isNotNull(Location::getContainerCode)
685
                    .ne(Location::getContainerCode, "");
686
687
688
        }
        return list(wrapper);
    }
689
690
691
692
693
694
695
696
697

    @Override
    public void upstatus(String code) {
        Location user = new Location();
        user.setStatus("empty");
        //修改条件s
        UpdateWrapper<Location> userUpdateWrapper = new UpdateWrapper<>();
        userUpdateWrapper.eq("containerCode", code);
        int update = locationMapper.update(user, userUpdateWrapper);
698
//        System.out.println(update);
699
    }
700
    @Override
701
702
703
704
705
706
707
708
709
    public int locationSIsnull(){
        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode());
        queryWrapper.eq(Location::getRoadway, 2);
        queryWrapper.eq(Location::getZoneCode,"LK");
        queryWrapper.eq(Location::getContainerCode,"").or().isNull(Location::getContainerCode);
        int count=this.count();
        return count;
    }
710
    @Override
711
712
713
714
715
716
717
718
719
720
721
722
    public Location getLocationOfRule(int roadWay){
        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode());
        queryWrapper.eq(Location::getStatus,QuantityConstant.STATUS_LOCATION_EMPTY);
        queryWrapper.eq(Location::getRoadway, roadWay);
        queryWrapper.eq(Location::getZoneCode,"LK");
        queryWrapper.eq(Location::getContainerCode,"").or().isNull(Location::getContainerCode);
        queryWrapper.orderByAsc(Location::getIColumn,Location::getIRow);
        queryWrapper.last("limit 1");
        Location location=this.getOne(queryWrapper);
        return location;
    }
723
724
725
726
727

    @Override
    public Location selectFirstEntity(Location temp1){
        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(StringUtils.isNotEmpty(temp1.getWarehouseCode()),Location::getWarehouseCode, temp1.getWarehouseCode());
xumiao authored
728
        queryWrapper.eq(StringUtils.isNotEmpty(temp1.getCode()),Location::getCode,temp1.getCode());
周鸿 authored
729
        queryWrapper.eq(StringUtils.isNotNull(temp1.getIRow()),Location::getIRow,temp1.getIRow());
730
731
732
        queryWrapper.eq(StringUtils.isNotNull(temp1.getIColumn()),Location::getIColumn,temp1.getIColumn());
        queryWrapper.eq(StringUtils.isNotNull(temp1.getRoadway()),Location::getRoadway,temp1.getRoadway());
        queryWrapper.eq(StringUtils.isNotNull(temp1.getILayer()),Location::getILayer,temp1.getILayer());
周鸿 authored
733
        queryWrapper.eq(StringUtils.isNotNull(temp1.getIGrid()),Location::getIGrid,temp1.getIGrid());
734
735
736
737

        queryWrapper.last("limit 1");
        return this.getOne(queryWrapper);
    }
周鸿 authored
738
739
740
741
742
743
744
745
746
747
748
749

    @Override
    public Location selectAddress(Location location) {
        return locationMapper.selectAddress(location);
    }
    @Override
    public List<Location> selectEmptyAddress() {
        Points points=new Points();
        points.setWarehouseCode(ShiroUtils.getWarehouseCode());
        points.setIsLocked(2);
        return locationMapper.selectEmptyAddress(points);
    }
tongzhonghao authored
750
751
752
753
754
755
756
757
758

    @Override
    public List<Location> getRoadwayByLocationType(String locationType) {
        QueryWrapper<Location>  qw  = new QueryWrapper<>();
        qw.select("DISTINCT locationType,roadway").lambda().eq(Location::getLocationType,locationType);

        List<Location> list = this.list(qw);
        return list;
    }
周鸿 authored
759
    @Override
xumiao authored
760
761
    public List<String> selectlistEmpty(String warehouseCode) {
        return locationMapper.selectlistEmpty(warehouseCode);
周鸿 authored
762
763
    }
    @Override
xumiao authored
764
765
    public List<Location> selectCode(String warehouseCode) {
        return locationMapper.selectCode(warehouseCode);
周鸿 authored
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
    }
    @Override
    public Location selectByPrefix(Location location) {
        return locationMapper.selectByPrefix(location);
    }

    @Override
    public Location selectModelByOld(Location location) {
        return locationMapper.selectModelByOld(location);
    }
    @Override
    public Location selectModelByOld(Location location,List<String> codes) {
        return locationMapper.selectModelByOlds(location,codes);
    }
    @Override
tongzhonghao authored
781
    public void pickAndplace(List<Location> locationAajacentIsNull,Boolean flag,Location s1,Location s2){
周鸿 authored
782
783
784
785
786
787
788
789
790
        Boolean f=true;
        int m=0;
        while (f){
            int layer = (int) (Math.random() * 8) + 1;
            int line = (int) (Math.random() * 23) + 1;
            locationAajacentIsNull.addAll(locationMapper.getLocationAajacentIsNull(layer, line,flag));
            if(locationAajacentIsNull.size()!=2){
                m++;
                if(m==23){
tongzhonghao authored
791
                    return;
周鸿 authored
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
                }
                continue;
            }
            List<Integer> c = locationAajacentIsNull.stream().map(j -> j.getIColumn()).collect(Collectors.toList());
            if(c.get(0) - c.get(1)==1||c.get(0) - c.get(1)==-1){
                f=false;
            }else {
                locationAajacentIsNull.clear();
            }
        }
        s1.setCode(locationAajacentIsNull.get(0).getCode());
        s2.setCode(locationAajacentIsNull.get(1).getCode());
    }
    @Override
    public Location getLocationFarAway(Integer roadway, int flag,int layer) {
        return locationMapper.getLocationFarAway(roadway,flag,layer);
    }
809
810
811
812
    @Override
    public Location getLocationOfRule() {
        return locationMapper.getLocationOfRule();
    }
周鸿 authored
813
814
815
816
    @Override
    public List<Location> selectListInventory(String zoneCode) {
        return locationMapper.selectListInventory(zoneCode);
    }
817
818
819
820
821
822
823
824

    @Override
    public int updateStatusNew(String locationCode, String warehouseCode, String status, String oldStatus) {
        if (StringUtils.isNotEmpty(locationCode)) {
            return locationMapper.updateStatusNew(locationCode, warehouseCode, status, oldStatus);
        }
        return 0;
    }
825
826

    @Override
827
828
    public Map<String,LocationAge>getLkLocationAgeMap() {
        Map<String,LocationAge>ageMap=new HashMap<>();
829
830
831
832
        List<LocationAge>list=locationMapper.getLkLocationList();
        list.forEach(item->{
            String key=item.getCode();
            if (!ageMap.containsKey(key)){
833
                ageMap.put(key,item);
834
835
836
837
            }
        });
        return ageMap;
    }
周鸿 authored
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857

    public List<Location> getLocationListByContainerCode(String warehosueCode,String containerCode,String tolocationCode) {
        List<Location> list=new ArrayList<>();
        Container container=containerService.getContainerByCode(containerCode,warehosueCode);
        if(container==null){
            return list;
        }
        String containerType=container.getContainerType();
        ContainerType containerType1=containerTypeService.getContainerTypeByCode(containerType,warehosueCode);
        String locaitonTypes=containerType1.getLocationType();
        if(StringUtils.isEmpty(locaitonTypes)){
            return list;
        }
        String[] locationTypeStr = Convert.toStrArray(locaitonTypes);
        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(StringUtils.isNotEmpty(warehosueCode),Location::getWarehouseCode,warehosueCode);
        queryWrapper.in(StringUtils.isNotEmpty(locaitonTypes),Location::getLocationType,locationTypeStr);
        queryWrapper.apply("((containerCode='' and status='empty') or code='"+tolocationCode+"' )");
        return this.list(queryWrapper);
    }
mahuandong authored
858
}