Sfoglia il codice sorgente

分配逻辑修改

andy 3 anni fa
parent
commit
04f4a676d8

+ 3 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/LineCallController.java

@@ -60,6 +60,9 @@ public class LineCallController {
             if (flowConfigHeaderVO.getFlowType().equals("ASN") && StringUtils.isEmpty(lform.getLocationFrom())) {
                 return AjaxResult.error("入库任务必须选择起始库位");
             }
+            if (flowConfigHeaderVO.getFlowType().equals("SO") && (lform.getQty() == null || lform.getQty().longValue() == 0)) {
+                return AjaxResult.error("出库任务必须选择数量");
+            }
             AgvCallDTO agvCallDTO;
             if (map.containsKey(lform.getLocationFrom() + "-" + lform.getLocationTo())) {
                 agvCallDTO = map.get(lform.getLocationFrom() + "-" + lform.getLocationTo());

+ 2 - 1
ruoyi-admin/src/test/java/com/ruoyi/admin/test/base/WarehouseTest.java

@@ -2,6 +2,7 @@ package com.ruoyi.admin.test.base;
 
 import com.alibaba.fastjson.JSON;
 import com.ruoyi.RuoYiApplication;
+import com.ruoyi.ams.business.domain.FilterLockInvLocationDTO;
 import com.ruoyi.ams.config.domain.AsnSoStrategy;
 import com.ruoyi.ams.config.domain.FlowConfigHeader;
 import com.ruoyi.ams.config.domain.dto.InWarehouseDTO;
@@ -168,7 +169,7 @@ public class WarehouseTest {
         outWarehouseDTOs.add(sku2);
         AsnSoStrategy asnSoStrategy = asnSoStrategyMapper.selectAsnSoStrategy();
         Long token = 100L;
-        List<BaseLocationInfo> locationInfoList = locationAllocationStrategy.filterLockInv(locationIdList, outWarehouseDTOs, asnSoStrategy, token);
+        List<FilterLockInvLocationDTO> locationInfoList = locationAllocationStrategy.filterLockInv(locationIdList, outWarehouseDTOs, asnSoStrategy, token);
         System.out.println(JSON.toJSONString(locationInfoList));
     }
 }

+ 1 - 1
ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java

@@ -48,7 +48,7 @@ public class RedisCache {
         List<String> lockList = redisTemplate.opsForList().range(RedisKey.LOCK_LIST + token, 0, -1);
         if (lockList != null && lockList.size() > 0) {
             for (String s : lockList) {
-                s = s.replaceAll("\"","");
+                s = s.replaceAll("\"", "");
                 redisTemplate.delete(s);
             }
             redisTemplate.delete(RedisKey.LOCK_LIST + token);

+ 1 - 2
ruoyi-ui/src/views/ams/flowConfig/index.vue

@@ -492,8 +492,7 @@ export default {
       weightEnd: null,
       flowTypeDict: [
         {label : '入库', value : 'ASN'},
-        {label : '出库', value : 'SO'},
-        {label : '移库', value : 'MV'}
+        {label : '出库', value : 'SO'}
       ],
       flowDict: [],
       attShowFlag: true,

+ 9 - 3
ruoyi-ui/src/views/ams/lineCall/index.vue

@@ -463,7 +463,7 @@
             if (this.flowConfigDetailsList.length > 0) {
               for (let i = 0; i < this.flowConfigDetailsList.length; i++) {
                 if (this.flowConfigDetailsList[i].lotattFlag === 'Required') {
-                  if(this.flowConfigDetailsList[i].lotattValue === '' || this.flowConfigDetailsList[i].lotattValue === null) {
+                  if(this.flowConfigDetailsList[i].defaultValue === '' || this.flowConfigDetailsList[i].defaultValue === null) {
                     this.$modal.msgError(this.flowConfigDetailsList[i].lotattName+"必须输入");
                     return
                   }
@@ -588,7 +588,7 @@
             if (this.flowConfigDetailsList.length > 0) {
               for (let i = 0; i < this.flowConfigDetailsList.length; i++) {
                 if (this.flowConfigDetailsList[i].lotattFlag === 'Required') {
-                  if(this.flowConfigDetailsList[i].lotattValue === '' || this.flowConfigDetailsList[i].lotattValue === null) {
+                  if(this.flowConfigDetailsList[i].defaultValue === '' || this.flowConfigDetailsList[i].defaultValue === null) {
                     this.$modal.msgError(this.flowConfigDetailsList[i].lotattName+"必须输入");
                     return
                   }
@@ -599,7 +599,7 @@
               for (let i = 0; i < this.flowConfigDetailsList.length; i++) {
                 let obj = new Object();
                 obj.lotattId = this.flowConfigDetailsList[i].lotattId
-                obj.lotattValue = this.flowConfigDetailsList[i].lotattValue
+                obj.lotattValue = this.flowConfigDetailsList[i].defaultValue
                 lineCallDetailsFormList.push(obj)
               }
               this.form.lineCallDetailsFormList = lineCallDetailsFormList
@@ -613,6 +613,12 @@
             this.form.supplier = undefined
             this.form.locationFrom = undefined
             this.form.locationTo = undefined
+            /*if (this.flowConfigDetailsList.length > 0) {
+              for (let i = 0; i < this.flowConfigDetailsList.length; i++) {
+                console.log(this.flowConfigDetailsList[i])
+                this.flowConfigDetailsList[i].defaultValue = ''
+              }
+            }*/
           }
         });
       },

+ 100 - 108
warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ruoyi.ams.business;
 
+import com.ruoyi.ams.business.domain.FilterLockInvLocationDTO;
 import com.ruoyi.ams.common.Constant;
 import com.ruoyi.ams.config.domain.AsnSoStrategy;
 import com.ruoyi.ams.config.domain.dto.*;
@@ -59,138 +60,129 @@ public class BusinessServiceImpl implements IBusinessService {
     public AjaxResult agvCall(FlowConfigHeaderVO flowConfigHeaderVO, List<AgvCallDTO> agvCallDTOList) {
         //唯一操作标识,用于redis标记。报错时根据该id进行删除
         Long token = SnowflakeIdWorker.generateId();
-        //查询全局配置策略
-        AsnSoStrategy asnSoStrategy = asnSoStrategyMapper.selectAsnSoStrategy();
+        try {
+            //查询全局配置策略
+            AsnSoStrategy asnSoStrategy = asnSoStrategyMapper.selectAsnSoStrategy();
 
-        for (AgvCallDTO agvCallDTO : agvCallDTOList) {
-            //如果是入库把起始库位相同的数据整合到一起生成库存记录
-            BaseLocationInfo locationFrom = null;
-            BaseLocationInfo locationTo = null;
-            List<WcsTask> wcsTaskList = new ArrayList<>();
-            String paramLocationFrom = agvCallDTO.getLocationFrom();
-            String paramLocationTo = agvCallDTO.getLocationTo();
-            List<String> zoneIdList = new ArrayList<>();
-            if (StringUtils.isEmpty(paramLocationFrom)) {
-                paramLocationFrom = flowConfigHeaderVO.getLocationFrom();
-            }
-            if (StringUtils.isEmpty(paramLocationTo)) {
-                paramLocationTo = flowConfigHeaderVO.getLocationTo();
-            }
-            if (!StringUtils.isEmpty(flowConfigHeaderVO.getLocationFrom())) {
-                zoneIdList = Arrays.stream(flowConfigHeaderVO.getLocationFrom().split(",")).collect(Collectors.toList());
-            }
+            for (AgvCallDTO agvCallDTO : agvCallDTOList) {
+                //如果是入库把起始库位相同的数据整合到一起生成库存记录
+                BaseLocationInfo locationFrom = null;
+                BaseLocationInfo locationTo = null;
+                List<WcsTask> wcsTaskList = new ArrayList<>();
+                String paramLocationFrom = agvCallDTO.getLocationFrom();
+                String paramLocationTo = agvCallDTO.getLocationTo();
+                List<String> zoneIdList = new ArrayList<>();
+                if (StringUtils.isEmpty(paramLocationFrom)) {
+                    paramLocationFrom = flowConfigHeaderVO.getLocationFrom();
+                }
+                if (StringUtils.isEmpty(paramLocationTo)) {
+                    paramLocationTo = flowConfigHeaderVO.getLocationTo();
+                }
+                if (!StringUtils.isEmpty(flowConfigHeaderVO.getLocationFrom())) {
+                    zoneIdList = Arrays.stream(flowConfigHeaderVO.getLocationFrom().split(",")).collect(Collectors.toList());
+                }
 
-            List<BaseLocationInfo> locationFromList = this.convertLocation(paramLocationFrom, agvCallDTO.getWarehouseId());
-            List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId());
+                List<BaseLocationInfo> locationFromList = this.convertLocation(paramLocationFrom, agvCallDTO.getWarehouseId());
+                List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId());
 
-            if (flowConfigHeaderVO.getFlowType().equals("ASN")) {
-                AgvCallItemDTO agvCall = agvCallDTO.getAgvCallItemDTOList().get(0);
-                locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "ASN", asnSoStrategy, agvCall, token);
-                locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "ASN", asnSoStrategy, agvCall, token);
-                //2.初始化库存
-                for (AgvCallItemDTO call : agvCallDTO.getAgvCallItemDTOList()) {
-                    invLotLocIdService.initInv(locationFrom.getId().toString(), call.getSku(), Constant.CUSTOMER_ID, call.getQty(), call.getLotattDTO());
-                }
-                wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, token));
-            } else if (flowConfigHeaderVO.getFlowType().equals("SO")) {
-                for (AgvCallItemDTO agvCall : agvCallDTO.getAgvCallItemDTOList()) {
-                    //判断总库存是否足够
-                    Double totalQty = agvCall.getQty();
-                    int trySize = 100;
-                    Double qty = invLotLocIdService.queryInvBySku(agvCall.getSku(), agvCall.getLotattDTO(), zoneIdList);
-                    if (qty == null || qty < agvCall.getQty()) {
-                        throw new ServiceException("所需库存不够");
+                if (flowConfigHeaderVO.getFlowType().equals("ASN")) {
+                    AgvCallItemDTO agvCall = agvCallDTO.getAgvCallItemDTOList().get(0);
+                    locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "ASN", asnSoStrategy, agvCall, token);
+                    locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "ASN", asnSoStrategy, agvCall, token);
+                    //2.初始化库存
+                    for (AgvCallItemDTO call : agvCallDTO.getAgvCallItemDTOList()) {
+                        invLotLocIdService.initInv(locationFrom.getId().toString(), call.getSku(), Constant.CUSTOMER_ID, call.getQty(), call.getLotattDTO());
                     }
-                    //TODO 改成新分配方法
-                    while (trySize > 0) {
-                        BaseLocationInfo soLocationFrom;
-                        if (locationFromList != null && locationFromList.size() > 0) {
-                            List<Long> locationList = new ArrayList<>();
-                            for (BaseLocationInfo b : locationFromList) {
-                                locationList.add(b.getId());
-                            }
-                            List<BaseLocationLotattVO> locationLotattVOList = baseLocationInfoMapper.selectSortedLocationLotattListByLocationIdList(locationList, 1L, agvCall.getLotattDTO().getAttr(), agvCall.getSku());
-                            OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
-                            outWarehouseDTO.setSku(agvCall.getSku());
-                            outWarehouseDTO.setQty(agvCall.getQty());
-                            outWarehouseDTO.setWeight(agvCall.getWeight());
-                            outWarehouseDTO.setSupplier(agvCall.getSupplier());
-                            outWarehouseDTO.setLotattDTO(agvCall.getLotattDTO());
-                            outWarehouseDTO.setWarehouseId(agvCallDTO.getWarehouseId());
-                            soLocationFrom = locationAllocationStrategy.filterLockInv(locationLotattVOList, outWarehouseDTO, asnSoStrategy, token);
-                        } else {
-                            OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
-                            outWarehouseDTO.setSku(agvCall.getSku());
-                            outWarehouseDTO.setQty(agvCall.getQty());
-                            outWarehouseDTO.setWeight(agvCall.getWeight());
-                            outWarehouseDTO.setSupplier(agvCall.getSupplier());
-                            outWarehouseDTO.setLotattDTO(agvCall.getLotattDTO());
-                            outWarehouseDTO.setWarehouseId(agvCall.getWarehouseId());
-                            soLocationFrom = outInvAllocation(outWarehouseDTO, token);
-                        }
-                        if (soLocationFrom == null) {
-                            throw new ServiceException("没有可分配的库存", token);
-                        }
-                        locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "SO", asnSoStrategy, agvCall, token);
-                        wcsTaskList.addAll(this.genTask(soLocationFrom, locationTo, flowConfigHeaderVO, token));
-                        Double current = invLotLocIdMapper.queryInvBySkuLocationId(agvCall.getSku(), soLocationFrom.getId(), agvCall.getLotattDTO());
-                        if (current != null) {
-                            totalQty -= current;
-                            if (totalQty <= 0) {
-                                break;
-                            }
-                        }
-                        trySize--;
+                    wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, token));
+                } else if (flowConfigHeaderVO.getFlowType().equals("SO")) {
+                    List<Long> locationList = new ArrayList<>();
+                    for (BaseLocationInfo b : locationFromList) {
+                        locationList.add(b.getId());
                     }
-                }
-            } else if (flowConfigHeaderVO.getFlowType().equals("MV")) {
-                for (AgvCallItemDTO agvCall : agvCallDTO.getAgvCallItemDTOList()) {
-                    Double totalQty = agvCall.getQty();
-                    int trySize = 100;
-                    if (agvCall.getQty() != null) {
-                        Double qty = invLotLocIdService.queryInvBySku(agvCall.getSku(), agvCall.getLotattDTO(), zoneIdList);
-                        if (qty == null || qty < agvCall.getQty()) {
-                            throw new ServiceException("所需库存不够");
+                    List<OutWarehouseDTO> warehouseDTOS = new ArrayList<>();
+                    for (AgvCallItemDTO agvCall : agvCallDTO.getAgvCallItemDTOList()) {
+                        if (agvCall.getQty() != null) {
+                            Double qty = invLotLocIdService.queryInvBySku(agvCall.getSku(), agvCall.getLotattDTO(), zoneIdList);
+                            if (qty == null || qty < agvCall.getQty()) {
+                                throw new ServiceException(String.format("%s所需库存不够", agvCall.getSku()), token);
+                            }
                         }
-                    }
 
-                    while (trySize > 0) {
                         OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
                         outWarehouseDTO.setSku(agvCall.getSku());
                         outWarehouseDTO.setQty(agvCall.getQty());
                         outWarehouseDTO.setWeight(agvCall.getWeight());
                         outWarehouseDTO.setSupplier(agvCall.getSupplier());
                         outWarehouseDTO.setLotattDTO(agvCall.getLotattDTO());
-                        outWarehouseDTO.setWarehouseId(agvCall.getWarehouseId());
-                        BaseLocationInfo mvLocationFrom = outInvAllocation(outWarehouseDTO, token);
-                        //locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "MV", asnSoStrategy, agvCall, token);
-                        locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "MV", asnSoStrategy, agvCall, token);
-                        if (mvLocationFrom == null) {
-                            break;
-                        }
-                        if (locationTo == null) {
-                            break;
-                        }
-                        wcsTaskList.addAll(this.genTask(mvLocationFrom, locationTo, flowConfigHeaderVO, token));
+                        outWarehouseDTO.setWarehouseId(agvCallDTO.getWarehouseId());
+                        outWarehouseDTO.setAgvCallItemDTO(agvCall);
+                        warehouseDTOS.add(outWarehouseDTO);
+                    }
+                    List<FilterLockInvLocationDTO> locationFromResultList = locationAllocationStrategy.filterLockInv(locationList, warehouseDTOS, asnSoStrategy, token);
+                    for (FilterLockInvLocationDTO b : locationFromResultList) {
+                        InWarehouseDTO inWarehouseDTO = new InWarehouseDTO();
+                        inWarehouseDTO.setWarehouseId(b.getOutWarehouseDTO().getAgvCallItemDTO().getWarehouseId());
+                        inWarehouseDTO.setSku(b.getOutWarehouseDTO().getAgvCallItemDTO().getSku());
+                        inWarehouseDTO.setLocationTo(b.getOutWarehouseDTO().getAgvCallItemDTO().getLocationTo());
+                        inWarehouseDTO.setLocationFrom(b.getOutWarehouseDTO().getAgvCallItemDTO().getLocationFrom());
+                        inWarehouseDTO.setQty(b.getOutWarehouseDTO().getAgvCallItemDTO().getQty());
+                        inWarehouseDTO.setSupplier(b.getOutWarehouseDTO().getAgvCallItemDTO().getSupplier());
+                        inWarehouseDTO.setWeight(b.getOutWarehouseDTO().getAgvCallItemDTO().getWeight());
+                        inWarehouseDTO.setLotattDTO(b.getOutWarehouseDTO().getAgvCallItemDTO().getLotattDTO());
+                        locationTo = locationAllocationStrategy.filterLockLocation(locationToList, token);
+                        wcsTaskList.addAll(this.genTask(b.getLocationInfo(), locationTo, flowConfigHeaderVO, token));
+                    }
+                } else if (flowConfigHeaderVO.getFlowType().equals("MV")) {
+                    for (AgvCallItemDTO agvCall : agvCallDTO.getAgvCallItemDTOList()) {
+                        Double totalQty = agvCall.getQty();
+                        int trySize = 100;
                         if (agvCall.getQty() != null) {
-                            Double current = invLotLocIdMapper.queryInvBySkuLocationId(agvCall.getSku(), mvLocationFrom.getId(), agvCall.getLotattDTO());
-                            if (current != null) {
-                                totalQty -= current;
-                                if (totalQty <= 0) {
-                                    break;
+                            Double qty = invLotLocIdService.queryInvBySku(agvCall.getSku(), agvCall.getLotattDTO(), zoneIdList);
+                            if (qty == null || qty < agvCall.getQty()) {
+                                throw new ServiceException("所需库存不够", token);
+                            }
+                        }
+
+                        while (trySize > 0) {
+                            OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
+                            outWarehouseDTO.setSku(agvCall.getSku());
+                            outWarehouseDTO.setQty(agvCall.getQty());
+                            outWarehouseDTO.setWeight(agvCall.getWeight());
+                            outWarehouseDTO.setSupplier(agvCall.getSupplier());
+                            outWarehouseDTO.setLotattDTO(agvCall.getLotattDTO());
+                            outWarehouseDTO.setWarehouseId(agvCall.getWarehouseId());
+                            BaseLocationInfo mvLocationFrom = outInvAllocation(outWarehouseDTO, token);
+                            //locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "MV", asnSoStrategy, agvCall, token);
+                            locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "MV", asnSoStrategy, agvCall, token);
+                            if (mvLocationFrom == null) {
+                                break;
+                            }
+                            if (locationTo == null) {
+                                break;
+                            }
+                            wcsTaskList.addAll(this.genTask(mvLocationFrom, locationTo, flowConfigHeaderVO, token));
+                            if (agvCall.getQty() != null) {
+                                Double current = invLotLocIdMapper.queryInvBySkuLocationId(agvCall.getSku(), mvLocationFrom.getId(), agvCall.getLotattDTO());
+                                if (current != null) {
+                                    totalQty -= current;
+                                    if (totalQty <= 0) {
+                                        break;
+                                    }
                                 }
                             }
+                            trySize--;
                         }
-                        trySize--;
                     }
                 }
-            }
 
 //        for (WcsTask wcsTask : wcsTaskList) {
 //            this.addTask(wcsTask);
 //        }
+            }
+            return AjaxResult.success("任务下发成功");
+        } catch (Exception e) {
+            throw new ServiceException(e.getMessage(), token);
         }
-        return AjaxResult.success("任务下发成功");
     }
 
     @Transactional

+ 17 - 0
warewms-ams/src/main/java/com/ruoyi/ams/business/domain/FilterLockInvLocationDTO.java

@@ -0,0 +1,17 @@
+package com.ruoyi.ams.business.domain;
+
+import com.ruoyi.ams.config.domain.dto.OutWarehouseDTO;
+import com.ruoyi.base.domain.BaseLocationInfo;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: andy.qu
+ * Date: 2022/9/30
+ * Description:
+ */
+@Data
+public class FilterLockInvLocationDTO {
+    private BaseLocationInfo locationInfo;
+    private OutWarehouseDTO outWarehouseDTO;
+}

+ 9 - 0
warewms-ams/src/main/java/com/ruoyi/ams/config/domain/dto/OutWarehouseDTO.java

@@ -19,6 +19,7 @@ public class OutWarehouseDTO {
     private String locationTo;
     private LotattDTO lotattDTO;
     private Long warehouseId;
+    private AgvCallItemDTO agvCallItemDTO;
 
     private Map<String, String> attMap;
 
@@ -142,4 +143,12 @@ public class OutWarehouseDTO {
     public void setWarehouseId(Long warehouseId) {
         this.warehouseId = warehouseId;
     }
+
+    public AgvCallItemDTO getAgvCallItemDTO() {
+        return agvCallItemDTO;
+    }
+
+    public void setAgvCallItemDTO(AgvCallItemDTO agvCallItemDTO) {
+        this.agvCallItemDTO = agvCallItemDTO;
+    }
 }

+ 28 - 20
warewms-ams/src/main/java/com/ruoyi/ams/config/service/LocationAllocationStrategy.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ams.config.service;
 
 import com.alibaba.fastjson.JSON;
+import com.ruoyi.ams.business.domain.FilterLockInvLocationDTO;
 import com.ruoyi.ams.business.domain.LocationSortComparator;
 import com.ruoyi.ams.business.domain.LocationSortDTO;
 import com.ruoyi.ams.config.domain.AsnSoStrategy;
@@ -356,11 +357,10 @@ public class LocationAllocationStrategy {
      * @param token            唯一token用来解锁加锁
      * @return
      */
-    @Transactional
-    public List<BaseLocationInfo> filterLockInv(List<Long> locationIdList, List<OutWarehouseDTO> outWarehouseDTOs, AsnSoStrategy asnSoStrategy, Long token) {
+    public List<FilterLockInvLocationDTO> filterLockInv(List<Long> locationIdList, List<OutWarehouseDTO> outWarehouseDTOs, AsnSoStrategy asnSoStrategy, Long token) {
         //取出范围内所有的库存
         List<BaseLocationLotattListVO> locationLotattVOList = baseLocationInfoService.selectSortedLocatinListByZoneId(locationIdList, 1L, null, null);
-        List<BaseLocationInfo> result = new ArrayList<>(); //返回的结果
+        List<FilterLockInvLocationDTO> result = new ArrayList<>(); //返回的结果
         Map<String, List<BaseLocationLotattListVO>> lockInv = new HashMap<>(); //已锁定的库存列表(key:列名,value:库位库存)
         //将同一列的库位排序好====================================================>
         LinkedHashMap<String, Boolean> taskingFlag = new LinkedHashMap<>(); //任务中的列
@@ -477,11 +477,16 @@ public class LocationAllocationStrategy {
                 continue;
             }
             //过滤出每列可以用的库位并进行分配
-            BaseLocationInfo currentLocation;
+            FilterLockInvLocationDTO currentLocation;
             boolean isEnd = false;
             //地堆
             List<String> colNosFloor = getColNoBySku(skuTagMapFloor, ow.getSku());
             for (String s : colNosFloor) {
+                //先查询已锁定的库存中查询是否有可以扣减的库存,如果已经扣除了那么久不用继续分配
+                qty = checkOutedInvQty(ow, lockInv);
+                if (qty >= ow.getQty()) {
+                    break;
+                }
                 if (isEnd) {
                     break;
                 }
@@ -490,9 +495,12 @@ public class LocationAllocationStrategy {
                     if (v.getIsEmpty().equals("N") && v.getStockStatus().equals("00")) {
                         if (redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + v.getId(), v.getId().toString(), token)) {
                             //判断是否有阻挡
-                            currentLocation = new BaseLocationInfo();
-                            BeanUtils.copyProperties(v, currentLocation);
-                            if (checkCanOut(currentLocation)) {
+                            BaseLocationInfo newLocation = new BaseLocationInfo();
+                            BeanUtils.copyProperties(v, newLocation);
+                            if (checkCanOut(newLocation)) {
+                                currentLocation = new FilterLockInvLocationDTO();
+                                currentLocation.setLocationInfo(newLocation);
+                                currentLocation.setOutWarehouseDTO(ow);
                                 result.add(currentLocation);
                                 lockInv = addLockInv(lockInv, v.getColNo(), v);
                                 Double currentQty = checkOutedInvQty(ow, lockInv);
@@ -519,8 +527,10 @@ public class LocationAllocationStrategy {
                     if (v.getIsEmpty().equals("N") && v.getStockStatus().equals("00")) {
                         if (redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + v.getId(), v.getId().toString(), token)) {
                             //判断是否有阻挡
-                            currentLocation = new BaseLocationInfo();
-                            BeanUtils.copyProperties(v, currentLocation);
+                            BaseLocationInfo newLocation = new BaseLocationInfo();
+                            currentLocation = new FilterLockInvLocationDTO();
+                            currentLocation.setLocationInfo(newLocation);
+                            currentLocation.setOutWarehouseDTO(ow);
                             result.add(currentLocation);
                             lockInv = addLockInv(lockInv, v.getColNo(), v);
                             Double currentQty = checkOutedInvQty(ow, lockInv);
@@ -606,29 +616,27 @@ public class LocationAllocationStrategy {
      * @return
      */
     private boolean checkCanOut(BaseLocationInfo b) {
+        boolean isCan = true;
         if (b.getLocationType().equals("1")) {
-            return true;
+            isCan = true;
         }
         //查询同列的排序库位
-        List<BaseLocationInfo> locationInfoList = baseLocationInfoMapper.selectLocationByColNo(b.getColNo());
+        List<BaseLocationInfo> locationInfoList = baseLocationInfoMapper.selectBeforeLocationByColNo(b.getColNo(), b.getColIndex());
         for (BaseLocationInfo bef : locationInfoList) {
-            if (bef.getId().equals(b.getId())) {
-                return true;
-            }
             if (bef.getStockStatus().equals("00") && bef.getIsEmpty().equals("Y") && redisCache.checkIsLock(bef.getId().toString()) == false) {
-                return true;
+                isCan = true;
             } else if (bef.getStockStatus().equals("00") && bef.getIsEmpty().equals("N")) {
                 //判断是否在任务中
                 int count = baseLocationInfoMapper.selectLocationIsTasking(bef.getLocationType(), bef.getId());
-                if (count > 0 && redisCache.checkIsLock(bef.getId().toString())) {
-                    return true;
+                if (count > 0 || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + bef.getId())) {
+                    isCan = true;
                 } else {
-                    return false;
+                    isCan = false;
                 }
             } else {
-                return false;
+                isCan = false;
             }
         }
-        return true;
+        return isCan;
     }
 }

+ 2 - 1
warewms-ams/src/main/resources/mapper/ams/InvLotLocIdMapper.xml

@@ -289,12 +289,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectInvLocIdLotattByLocationId" resultMap="InvLotLocIdLotattResult">
         select
             inv.location_id,sk.sku,sk.desc1 sku_name,b.location_no,inv.qty,inv.qtyallocated
-            ,att.lotnum, att.customer_id, lotatt01, lotatt02, lotatt03, lotatt04, lotatt05, lotatt06, lotatt07, lotatt08, lotatt09, lotatt10, lotatt11, lotatt12, lotatt13, lotatt14, lotatt15, lotatt16, lotatt17, lotatt18
+            ,att.lotnum, att.customer_id, lotatt01, lotatt02, lotatt03, lotatt04,qua.dict_label lotatt05, lotatt06, lotatt07, lotatt08, lotatt09, lotatt10, lotatt11, lotatt12, lotatt13, lotatt14, lotatt15, lotatt16, lotatt17, lotatt18
         from inv_lot_loc_id inv
         left join inv_lot_att att on inv.lotnum = att.lotnum
         left join base_location_info b on inv.location_id = b.id
         left join base_sku sk on inv.sku = sk.sku
         left join base_sku_type skt on sk.sku_type = skt.item_code
+        left join (select dict_value,dict_label from sys_dict_data where dict_type = 'ams_inv_quality') qua on att.lotatt05 = qua.dict_value
         where inv.location_id = #{locationId}
     </select>
 

+ 2 - 0
warewms-base/src/main/java/com/ruoyi/base/mapper/BaseLocationInfoMapper.java

@@ -167,4 +167,6 @@ public interface BaseLocationInfoMapper {
     List<BaseLocationInfo> selectLocationByColNos(@Param("colNos") List<String> colNos);
 
     int selectLocationIsTasking(@Param("locationType") String locationType, @Param("locationId") Long locationId);
+
+    List<BaseLocationInfo> selectBeforeLocationByColNo(@Param("colNo") String colNo,@Param("colIndex") Long colIndex);
 }

+ 4 - 1
warewms-base/src/main/resources/mapper/base/BaseLocationInfoMapper.xml

@@ -387,7 +387,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where 1 = 1 and state in (9,0,1)
         <if test="locationType = 'from'"> and location_from = #{locationId}</if>
         <if test="locationType = 'to'"> and location_to = #{locationId}</if>
-        order by lpad(row_no, 11, '0'),row_index,lpad(shift_no, 11, '0'),shift_index,lpad(col_no, 11, '0'),col_index desc
     </select>
 
     <select id="selectSortedLocationLotattListByZoneIdList" parameterType="BaseLocationInfo" resultMap="BaseLocationInfoLotattResult">
@@ -456,4 +455,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </if>
         order by lpad(row_no, 11, '0'),row_index,lpad(shift_no, 11, '0'),shift_index,lpad(col_no, 11, '0'),col_index desc
     </select>
+
+    <select id="selectBeforeLocationByColNo" resultMap="BaseLocationInfoResult">
+        select * from base_location_info where col_no = #{colNo} and col_index > #{colIndex} order by lpad(row_no, 11, '0'),row_index,lpad(shift_no, 11, '0'),shift_index,lpad(col_no, 11, '0'),col_index desc
+    </select>
 </mapper>