Browse Source

选矿出入空托bug修复

ChenYang 1 year ago
parent
commit
e85ca9f44c

+ 16 - 5
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/AgvCallProxyService.java

@@ -30,7 +30,6 @@ import com.ruoyi.base.service.IBaseSkuService;
 import com.ruoyi.base.utils.IdSequenceUtils;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.service.ISysConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -102,7 +101,7 @@ public class AgvCallProxyService {
         //2. 获取agv的库位,并创建agv的wcs任务
         String agvTargetLocationId = String.valueOf(getAgvLocationId("bucketLocationIdList"));
         String agvTaskNo = IdWorker.getIdStr();
-        wcsTaskSubService.addWcsTask(agvTaskNo, agvSourceLocationId, agvTargetLocationId,
+        addWcsTask(agvTaskNo, agvSourceLocationId, agvTargetLocationId,
                 asnNo, palletNo, Constant.TASK_STS.TASK_CREATE.getLongValue(), "agv入库任务下发");
 
         //3.入库单创建
@@ -146,7 +145,7 @@ public class AgvCallProxyService {
         //2. 获取agv的库位,并创建agv的wcs任务
         String agvSourceLocationId = String.valueOf(getAgvLocationId("bucketLocationIdList"));
         String agvTaskNo = IdWorker.getIdStr();
-        wcsTaskSubService.addWcsOutTask(agvTaskNo, agvSourceLocationId, targetLocationId,
+        addWcsOutTask(agvTaskNo, agvSourceLocationId, targetLocationId,
                 orderNo, Constant.TASK_STS.TASK_CREATE.getLongValue(), "agv出库任务下发");
 
         //3.出库单创建
@@ -241,7 +240,7 @@ public class AgvCallProxyService {
         Assert.isTrue(ObjectUtil.isNotNull(baseSku), "baseSku is null");
         //1.生成一个wcs任务
         String locationInfoId = String.valueOf(baseLocationInfo.getId());
-        wcsTaskSubService.addWcsOutTask(taskNo, locationInfoId, bucketCacheLocationId, orderNo);
+        addWcsOutTask(taskNo, locationInfoId, bucketCacheLocationId, orderNo, 10L, "桶装料出库任务");
         //修改出库出库存的traceId
         invLotLocIdService.operateTraceIdByLocationId(bucketCacheLocationId, taskNo);
         //4.组装wcs任务请求参数并同步当前的wcs任务
@@ -250,6 +249,18 @@ public class AgvCallProxyService {
 
     }
 
+
+    private AjaxResult addWcsTask(String taskNo, String locationFrom, String locationTo
+            , String asnNo, String palletNo, Long state, String remake) {
+        return wcsTaskSubService.addWcsTask(taskNo, locationFrom, locationTo, asnNo, palletNo, StringUtils.EMPTY, state, remake);
+    }
+
+    private AjaxResult addWcsOutTask(String taskNo, String locationFrom, String locationTo,
+                                     String orderNo, Long status, String remark) {
+        return wcsTaskSubService.addWcsOutTask(taskNo, locationFrom, locationTo
+                , orderNo, StringUtils.EMPTY, StringUtils.EMPTY, status, remark);
+    }
+
     private WcsResponseVo noticeBucketIntoLocTask(String taskNo, String bucketCacheLocationId, String asnNo, String palletNo, String materialType, Double quantity) {
 
         BaseSku baseSku = iBaseSkuService.selectBaseSkuByMaterialType(materialType);
@@ -260,7 +271,7 @@ public class AgvCallProxyService {
         // 2.桶装接驳位生成库存
         invLotLocIdSubService.initInv(bucketCacheLocationId, baseSku.getSku(), palletNo, asnNo, taskNo, quantity);
         // 3.生成任务
-        wcsTaskSubService.addWcsTask(taskNo, bucketCacheLocationId
+        addWcsTask(taskNo, bucketCacheLocationId
                 , String.valueOf(baseLocationInfo.getId()), asnNo, palletNo, Constant.TASK_STS.TASK_PUBILSH.getLongValue(), "四向车入库任务");
         //4.同步当前的wcs任务
         AgvInTaskForm agvInTaskForm = assemblyAgvInTaskForm(taskNo, asnNo, materialType, quantity, palletNo, baseLocationInfo);

+ 10 - 41
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/WcsTaskSubService.java

@@ -3,7 +3,6 @@ package com.ruoyi.ams.xuankuang.service;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.google.common.collect.Lists;
 import com.ruoyi.ams.asn.domain.WmsDocAsnDetails;
 import com.ruoyi.ams.asn.domain.WmsDocAsnHeader;
@@ -66,48 +65,14 @@ public class WcsTaskSubService {
 
 
 
-    public AjaxResult addWcsTask(String locationFrom, String locationTo
-            , String asnNo, String palletNo, String wcsNo) {
-        return addWcsTask(IdWorker.getIdStr(), locationFrom, locationTo, asnNo, palletNo, wcsNo, 10L, "立体库入库任务", StringUtils.EMPTY);
-    }
 
-    /**
-     * 新增wcsTask,兼容老的四向车立体库任务
-     * @param locationFrom
-     * @param locationTo
-     * @param asnNo
-     * @param palletNo
-     * @return
-     */
-    public AjaxResult addWcsTask(String locationFrom, String locationTo
-            , String asnNo, String palletNo, String wcsNo, String taskType) {
-        return addWcsTask(IdWorker.getIdStr(), locationFrom, locationTo, asnNo, palletNo, wcsNo, 10L, "立体库入库任务", taskType);
-    }
 
 
 
     public AjaxResult addWcsTask(String taskNo, String locationFrom, String locationTo
-            , String asnNo, String palletNo, Long state, String remake) {
-        return addWcsTask(taskNo, locationFrom, locationTo, asnNo, palletNo, StringUtils.EMPTY, state, remake, StringUtils.EMPTY);
+            , String asnNo, String palletNo, String wcsNo, Long state, String remake) {
+        return addWcsTask(taskNo, locationFrom, locationTo, asnNo, palletNo, wcsNo, state, remake, StringUtils.EMPTY);
     }
-    /**
-     * 增加wcsTask,桶装入库的时候封装用
-     * @param taskNo
-     * @param locationFrom
-     * @param locationTo
-     * @param asnNo
-     * @param palletNo
-     * @param state
-     * @param remake
-     * @return
-     */
-
-    public AjaxResult addWcsTask(String taskNo, String locationFrom, String locationTo
-            , String asnNo, String palletNo, Long state, String remake, String taskType) {
-        return addWcsTask(taskNo, locationFrom, locationTo, asnNo, palletNo, StringUtils.EMPTY, state, remake, taskType);
-    }
-
-
 
     public AjaxResult addWcsTask(String taskNo, String locationFrom, String locationTo
             , String asnNo, String palletNo, String wcsNo, Long state, String remake, String taskType) {
@@ -191,8 +156,7 @@ public class WcsTaskSubService {
         return addWcsTask(taskNo, locationFrom, locationTo, orderNo, palletNo, wcsNo, state, remark, StringUtils.EMPTY);
     }
 
-
-    public AjaxResult addWcsOutTask(String taskNo, String locationFrom, String locationTo
+    /*public AjaxResult addWcsOutTask(String taskNo, String locationFrom, String locationTo
             , String orderNo, String palletNo, String remark) {
         return addWcsOutTask(taskNo, locationFrom, locationTo, orderNo, palletNo, remark, StringUtils.EMPTY);
     }
@@ -202,6 +166,11 @@ public class WcsTaskSubService {
         return addWcsOutTask(taskNo, locationFrom, locationTo, orderNo, palletNo, StringUtils.EMPTY, 10L, remark, taskType);
     }
 
+    public AjaxResult addWcsOutTask(String taskNo, String locationFrom, String locationTo
+            , String orderNo, String palletNo, String wcsNo, String remark, String taskType) {
+        return addWcsOutTask(taskNo, locationFrom, locationTo, orderNo, palletNo, wcsNo, 10L, remark, taskType);
+    }
+
     public AjaxResult addWcsOutTask(String taskNo, String locationFrom, String locationTo
             , String orderNo, Long status, String remark) {
         return addWcsOutTask(taskNo, locationFrom, locationTo, orderNo, StringUtils.EMPTY, StringUtils.EMPTY, status, remark);
@@ -210,7 +179,7 @@ public class WcsTaskSubService {
     public AjaxResult addWcsOutTask(String taskNo, String locationFrom, String locationTo
             , String orderNo) {
         return addWcsOutTask(taskNo, locationFrom, locationTo, orderNo, StringUtils.EMPTY, StringUtils.EMPTY, 10L, "立体库出库任务", StringUtils.EMPTY);
-    }
+    }*/
 
 
     /**
@@ -303,7 +272,7 @@ public class WcsTaskSubService {
                         completeTheCallbackOut(wcsTask);
                     }//空托任务反馈和移库反馈
                     else if (CollectionUtil.contains(
-                            Lists.newArrayList(Constant.TaskType.EMPTY_PALLET, Constant.TaskType.MOVE_INV), wcsTask.getExt8())) {
+                            Lists.newArrayList(Constant.TaskType.EMPTY_PALLET.getDesc(), Constant.TaskType.MOVE_INV.getDesc()), wcsTask.getExt8())) {
                         invLotLocIdService.adjLocationIsEmpty(wcsTask.getLocationFrom(), Constant.WAREHOUSE_ID, "Wcs");
                     }//agv出库完成后反馈回调取货完成
                     else if (wcsTask.getExt5() != null) {

+ 28 - 16
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/WcsToWmsApiService.java

@@ -137,11 +137,8 @@ public class WcsToWmsApiService {
 
             // 生成任务
             String taskNo = "";
-            AjaxResult ajaxResult = wcsTaskSubService.addWcsTask(Constant.LOC_STAGE_CACHE.toString()
-                    , baseLocationLotattVO.getId().toString()
-                    , ajaxResult1.getData().toString()
-                    , palletNo
-                    , wcsNo);
+            AjaxResult ajaxResult = addWcsTask(Constant.LOC_STAGE_CACHE.toString()
+                    , baseLocationLotattVO.getId().toString(), ajaxResult1.getData().toString(), palletNo, wcsNo);
             if (!ajaxResult.isSuccess()) {
                 return ajaxResult;
             }
@@ -184,11 +181,8 @@ public class WcsToWmsApiService {
 
         // 生成任务
         String taskNo = "";
-        AjaxResult ajaxResult = wcsTaskSubService.addWcsTask(Constant.LOC_STAGE_CACHE.toString()
-                , baseLocationLotattVO.getId().toString()
-                , asnNo
-                , palletNo
-                , wcsNo);
+        AjaxResult ajaxResult = addWcsTask(Constant.LOC_STAGE_CACHE.toString()
+                , baseLocationLotattVO.getId().toString(), asnNo, palletNo, wcsNo);
         if (!ajaxResult.isSuccess()) {
             return ajaxResult;
         }
@@ -248,9 +242,9 @@ public class WcsToWmsApiService {
 
             // 生成任务
             String taskNo = "";
-            AjaxResult ajaxResult = wcsTaskSubService.addWcsTask(Constant.LOC_STAGE_CACHE.toString()
+            AjaxResult ajaxResult = addWcsTask(Constant.LOC_STAGE_CACHE.toString()
                     , baseLocationInfo.getId().toString(), StringUtils.EMPTY, StringUtils.EMPTY,
-                    wcsNo, Constant.TaskType.EMPTY_PALLET.getDesc());
+                    wcsNo, "空托盘入库任务", Constant.TaskType.EMPTY_PALLET.getDesc());
             if (!ajaxResult.isSuccess()) {
                 return ajaxResult;
             }
@@ -264,7 +258,7 @@ public class WcsToWmsApiService {
             locationCoordinateVo.setFloor(Integer.valueOf(baseLocationInfo.getShiftNo()));
             locationCoordinateVo.setCol(Integer.valueOf(baseLocationInfo.getRowNo()));
             locationCoordinateVo.setRow(Integer.valueOf(baseLocationInfo.getRowIndex()));
-            return AjaxResult.success("仓位获取成功!", locationCoordinateVo);
+            return AjaxResult.success("空托入库仓位获取成功!", locationCoordinateVo);
         }
 
         if (taskType == 2) {
@@ -277,8 +271,8 @@ public class WcsToWmsApiService {
             // 生成四向车出库任务
             String taskNo = IdWorker.getIdStr();
 
-            wcsTaskSubService.addWcsOutTask(taskNo, baseLocationLotatt.getLocationNo(),
-                    Constant.LOC_SORTATION_CACHE.toString(), "", palletNo, wcsNo, Constant.TaskType.EMPTY_PALLET.getDesc());
+            addWcsOutTask(taskNo, baseLocationLotatt.getLocationNo(), Constant.LOC_SORTATION_CACHE.toString(),
+                    palletNo, wcsNo, "空托盘出库任务", Constant.TaskType.EMPTY_PALLET.getDesc());
             Assert.isTrue( ObjectUtil.isNotNull(baseLocationLotatt.getId()), "仓库中无库存");
             invLotLocIdService.operateTraceIdByLocationId(String.valueOf(baseLocationLotatt.getId()), taskNo);
             LocationCoordDTO locationCoordinateVo1 = new LocationCoordDTO();
@@ -287,11 +281,23 @@ public class WcsToWmsApiService {
             locationCoordinateVo1.setFloor(Integer.valueOf(baseLocationLotatt.getShiftNo()));
             locationCoordinateVo1.setCol(Integer.valueOf(baseLocationLotatt.getRowNo()));
             locationCoordinateVo1.setRow(Integer.valueOf(baseLocationLotatt.getRowIndex()));
-            return AjaxResult.success("仓位获取成功", locationCoordinateVo1);
+            return AjaxResult.success(" 空托出库仓位获取成功", locationCoordinateVo1);
         }
         return AjaxResult.success();
     }
 
+    private AjaxResult addWcsTask(String locationFrom, String locationTo
+            , String asnNo, String palletNo, String wcsNo, String remark, String taskType) {
+        return wcsTaskSubService.addWcsTask(IdWorker.getIdStr(), locationFrom, locationTo, asnNo,
+                palletNo, wcsNo, 10L, remark, taskType);
+    }
+
+    private AjaxResult addWcsOutTask(String taskNo, String locationFrom, String locationTo,
+                                     String palletNo, String wcsNo, String remark, String taskType) {
+        return wcsTaskSubService.addWcsOutTask(taskNo, locationFrom, locationTo
+                , StringUtils.EMPTY, palletNo, wcsNo, 10L, remark, taskType);
+    }
+
     protected BaseLocationLotattDTO allocateLocationInfo() {
         List<BaseLocationLotattDTO> baseLocationLotattList = baseLocationInfoSubService.selectAllocatingInventoryAccordingConditionsOrderBy(OUT_ZONES, Constant.PALLET_TYPE);
         Assert.isTrue(CollectionUtil.isNotEmpty(baseLocationLotattList),  "there is no stock in the warehouse");
@@ -627,6 +633,12 @@ public class WcsToWmsApiService {
         return AjaxResult.success();
     }
 
+    private AjaxResult addWcsTask(String locationFrom, String locationTo
+            , String asnNo, String palletNo, String wcsNo) {
+        return wcsTaskSubService.addWcsTask(IdWorker.getIdStr(), locationFrom, locationTo, asnNo, palletNo,
+                wcsNo, 10L, "立体库入库任务", StringUtils.EMPTY);
+    }
+
 
 
 }

+ 80 - 56
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/WmsDocOrderSubService.java

@@ -18,7 +18,6 @@ import com.ruoyi.ams.order.domain.WmsDocOrderHeader;
 import com.ruoyi.ams.order.mapper.WmsDocOrderHeaderMapper;
 import com.ruoyi.ams.order.service.IWmsDocOrderDetailsService;
 import com.ruoyi.ams.order.service.IWmsDocOrderHeaderService;
-import com.ruoyi.ams.xuankuang.domain.dto.PartitionLocationDTO;
 import com.ruoyi.ams.xuankuang.domain.form.OutTaskForm;
 import com.ruoyi.ams.xuankuang.domain.vo.WcsResponseVo;
 import com.ruoyi.base.constant.Constant;
@@ -117,6 +116,7 @@ public class WmsDocOrderSubService {
         //重新筛选库存
 //        baseLocationLotattVOS1 = filterInv(baseLocationLotattVOS, orderNo);
 
+        if(1==1) throw new RuntimeException("test");
         boolean con = true;
         //机械手应拆袋数
         int allocateQuantities = 0;
@@ -140,16 +140,14 @@ public class WmsDocOrderSubService {
             String sku = baseLocationLotatt.getSku();
             String taskNo = IdWorker.getIdStr();
             if (sku.equals("C4H9O2PSSNH4")) {
-                // 生成四向车出库任务
-                wcsTaskSubService.addWcsOutTask(taskNo, locationFrom, Constant.DRUM_CONNECTORS.toString(), orderNo, palletNo, wcsNo);
-                //修改出库出库存的traceId
-                invLotLocIdService.operateTraceIdByLocationId(locationId, taskNo);
+                // 生成桶装料出库任务
+                addWcsOutTask(taskNo, locationFrom, Constant.DRUM_CONNECTORS.toString(), orderNo, palletNo, wcsNo, "桶装料出库任务");
             } else {
                 // 生成四向车出库任务
-                wcsTaskSubService.addWcsOutTask(taskNo, locationFrom, Constant.LOC_SORTATION_CACHE.toString(), orderNo, palletNo, wcsNo);
-                //修改出库出库存的traceId
-                invLotLocIdService.operateTraceIdByLocationId(locationId, taskNo);
+                addWcsOutTask(taskNo, locationFrom, Constant.LOC_SORTATION_CACHE.toString(), orderNo, palletNo, wcsNo, "袋装料出库任务");
             }
+            //修改出库出库存的traceId
+            invLotLocIdService.operateTraceIdByLocationId(locationId, taskNo);
             //调用出库任务下发接口
             OutTaskForm outTaskForm = new OutTaskForm();
             outTaskForm.setTaskNo(taskNo);
@@ -199,6 +197,13 @@ public class WmsDocOrderSubService {
         return AjaxResult.success("", filteredLocationLotattList);
     }
 
+    private AjaxResult addWcsOutTask(String taskNo, String locationFrom, String locationTo,
+                                     String orderNo, String palletNo, String wcsNo, String remark) {
+        return wcsTaskSubService.addWcsOutTask(taskNo, locationFrom, locationTo
+                , orderNo, palletNo, wcsNo, 10L, remark);
+    }
+
+
     public Boolean getOrderRule() {
         String warehouseAttrConfig = sysConfigService.selectConfigByKey(SceneConstants.WAREHOUSE_ATTRIBUTE_SCENE_CONFIG);
         if (StringUtils.isBlank(warehouseAttrConfig)) throw new BaseException("warehouseAttrConfig is blank");
@@ -213,11 +218,12 @@ public class WmsDocOrderSubService {
 
         List<String> locationIdList = baseLocationLotattList.stream()
                 .filter(ObjectUtil::isNotNull).map(item -> NumberUtil.toStr(item.getId())).collect(Collectors.toList());
-        List<BaseLocationLotattDTO> baseLocationAllList = Lists.newArrayList(baseLocationLotattList);
+
         List<InvLotLocId> sourceInvLotLocIdList = invLotLocIdService.selectInvLotLocIdList(locationIdList);
         BigDecimal quantity = docOrderDetail.getQtyOrdered();
         //从最老的库存开始,计算库存所在的列是否符合要求
         List<Long> selectedLocationIdList = Lists.newArrayList();
+        ArrayList<BaseLocationLotattDTO> copyLocationLotattList = Lists.newArrayList(baseLocationLotattList);
         for (InvLotLocId invLotLocId : sourceInvLotLocIdList){
             BaseLocationInfo locationInfo = baseLocationLotattList.stream()
                     .filter(item -> StringUtils.equals(NumberUtil.toStr(item.getId()), invLotLocId.getLocationId())).findFirst().orElse(null);
@@ -232,60 +238,84 @@ public class WmsDocOrderSubService {
             Integer lastWayNo = CollectionUtil.getLast(wayRowNoList);
             String partitionRowKey = getPartitionRowKey(firstWayNo, lastWayNo, locationInfo.getRowNo());
             List<Long> partitionLocationIdList = partitionRowNoListMapper.get(partitionRowKey);
-            if (CollectionUtil.isEmpty(partitionLocationIdList)) continue;
-            int locationIndex = partitionLocationIdList.indexOf(locationInfo.getId());
 
-            List<Long> partitionLocationRightSubList = !StringUtils.equals(partitionRowKey, Constants.LAST) ?
-                    ListUtil.reverse(ListUtil.sub(partitionLocationIdList, locationIndex, partitionLocationIdList.size())) : Lists.newArrayList();
-            List<Long> partitionLocationLeftSubList = !StringUtils.equals(partitionRowKey, Constants.FIRST)
-                    ? ListUtil.sub(partitionLocationIdList, Constants.START_VALUE, locationIndex + 1) : Lists.newArrayList();
-            List<Long> partitionLocationSubList = CollectionUtil.isNotEmpty(partitionLocationRightSubList) ? partitionLocationRightSubList : partitionLocationLeftSubList;
-            PartitionLocationDTO partitionLocationDTO = buildPartitionLocationDTO(locationInfo.getId(), quantity, baseLocationLotattList,
-                    sourceInvLotLocIdList, partitionLocationSubList);
-            if (ObjectUtil.isNull(partitionLocationDTO)) continue;
-            BigDecimal qtyCount = partitionLocationDTO.getQtyCount();
-            List<Long> resultLocationIdList = partitionLocationDTO.getResultLocationIdList();
+            int locationIndex = partitionLocationIdList.indexOf(locationInfo.getId());
+            if(StringUtils.equals(partitionRowKey, Constants.FIRST)) {
+                List<Long> firstRightSubList = ListUtil.sub(partitionLocationIdList, locationIndex, partitionLocationIdList.size());
+                List<Long> resultLocationIdList = checkLocationIdList(locationInfo.getId(), sourceInvLotLocIdList, firstRightSubList,
+                        baseLocationLotattList, quantity);
+                if(CollectionUtil.isEmpty(resultLocationIdList)) continue;
+                BigDecimal firstRightCount = sourceInvLotLocIdList.stream()
+                        .filter(item -> CollectionUtil.contains(resultLocationIdList, Long.parseLong(item.getLocationId()))
+                                && ObjectUtil.isNotNull(item.getQty()))
+                        .map(item -> item.getQty()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                quantity = NumberUtil.sub(quantity, firstRightCount);
+                baseLocationLotattList = baseLocationLotattList.stream()
+                        .filter(item -> !CollectionUtil.contains(resultLocationIdList, item.getId())).collect(Collectors.toList());
+                selectedLocationIdList.addAll(resultLocationIdList);
+                if(CompareUtil.compare(quantity, BigDecimal.ZERO) <= 0) break;
+            }
 
             if(StringUtils.equals(partitionRowKey, Constants.MIDDLE)){
-                PartitionLocationDTO partitionLocationLeftDTO = buildPartitionLocationDTO(locationInfo.getId(), quantity, baseLocationLotattList,
-                        sourceInvLotLocIdList, partitionLocationLeftSubList);
-                if (ObjectUtil.isNull(partitionLocationLeftDTO)) continue;
-                qtyCount = CompareUtil.compare(partitionLocationLeftDTO.getQtyCount(), qtyCount) < 0
-                        ? partitionLocationLeftDTO.getQtyCount() : qtyCount;
-                resultLocationIdList = CompareUtil.compare(partitionLocationLeftDTO.getQtyCount(), qtyCount) < 0
-                        ? partitionLocationLeftDTO.getResultLocationIdList() : resultLocationIdList;
+                List<Long> middleLeftSubList = ListUtil.reverse(ListUtil.sub(partitionLocationIdList, Constants.START_VALUE, locationIndex + 1));
+                List<Long> middleLeftLocationIdList = checkLocationIdList(locationInfo.getId(), sourceInvLotLocIdList, middleLeftSubList,
+                        baseLocationLotattList, quantity);
+                List<Long> middleRightSubList = ListUtil.sub(partitionLocationIdList, locationIndex, partitionLocationIdList.size());
+                List<Long> middleRightLocationIdList = checkLocationIdList(locationInfo.getId(), sourceInvLotLocIdList, middleRightSubList,
+                        baseLocationLotattList, quantity);
+                if(CollectionUtil.isEmpty(middleLeftLocationIdList)
+                        && CollectionUtil.isEmpty(middleRightLocationIdList)) continue;
+
+                BigDecimal middleLeftCount = sourceInvLotLocIdList.stream()
+                        .filter(item -> CollectionUtil.contains(middleLeftLocationIdList, Long.parseLong(item.getLocationId()))
+                                && ObjectUtil.isNotNull(item.getQty()))
+                        .map(item -> item.getQty()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal middleRightCount = sourceInvLotLocIdList.stream()
+                        .filter(item -> CollectionUtil.contains(middleRightLocationIdList, Long.parseLong(item.getLocationId()))
+                                && ObjectUtil.isNotNull(item.getQty()))
+                        .map(item -> item.getQty()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal singleRowInvCount = CompareUtil.compare(middleLeftCount, middleRightCount) < 0
+                        && CompareUtil.compare(middleLeftCount, BigDecimal.ZERO) > 0 ? middleLeftCount : middleRightCount;
+                quantity = NumberUtil.sub(quantity, singleRowInvCount);
+
+                List<Long> finalList = CompareUtil.compare(middleLeftCount, middleRightCount) < 0
+                        && CompareUtil.compare(middleLeftCount, BigDecimal.ZERO) > 0
+                        ? middleLeftLocationIdList : middleRightLocationIdList;
+
+                baseLocationLotattList = baseLocationLotattList.stream()
+                        .filter(item -> !CollectionUtil.contains(finalList, item.getId())).collect(Collectors.toList());
+                selectedLocationIdList.addAll(finalList);
+                if(CompareUtil.compare(quantity, BigDecimal.ZERO) <= 0) break;
             }
-            List<Long> partitionLocationList = resultLocationIdList;
-            quantity = NumberUtil.sub(quantity, qtyCount);
-            selectedLocationIdList.addAll(resultLocationIdList);
-            baseLocationLotattList = baseLocationLotattList.stream()
-                    .filter(item -> !CollectionUtil.contains(partitionLocationList, item.getId())).collect(Collectors.toList());
-            if (CompareUtil.compare(quantity, BigDecimal.ZERO) <= 0) break;
-        }
 
-        return baseLocationAllList.stream().filter(item -> CollectionUtil.contains(selectedLocationIdList, item.getId())).collect(Collectors.toList());
+            if(StringUtils.equals(partitionRowKey, Constants.LAST)) {
+                List<Long> lastLeftSubList = ListUtil.reverse(ListUtil.sub(partitionLocationIdList, Constants.START_VALUE, locationIndex + 1));
+                List<Long> lastLeftLocationIdList = checkLocationIdList(locationInfo.getId(), sourceInvLotLocIdList, lastLeftSubList,
+                        baseLocationLotattList, quantity);
+                if(CollectionUtil.isEmpty(lastLeftLocationIdList)) continue;
+                BigDecimal lastLeftCount = sourceInvLotLocIdList.stream()
+                        .filter(item -> CollectionUtil.contains(lastLeftLocationIdList, Long.parseLong(item.getLocationId()))
+                                && ObjectUtil.isNotNull(item.getQty()))
+                        .map(item -> item.getQty()).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                quantity = NumberUtil.sub(quantity, lastLeftCount);
+                baseLocationLotattList = baseLocationLotattList.stream()
+                        .filter(item -> !CollectionUtil.contains(lastLeftLocationIdList, item.getId())).collect(Collectors.toList());
+                selectedLocationIdList.addAll(lastLeftLocationIdList);
+                if(CompareUtil.compare(quantity, BigDecimal.ZERO) <= 0) break;
+            }
+        }
+        log.info("current selectedLocationIdList info is {}", JSONObject.toJSONString(selectedLocationIdList));
+        return copyLocationLotattList.stream().filter(item -> CollectionUtil.contains(selectedLocationIdList, item.getId())).collect(Collectors.toList());
     }
 
-    private PartitionLocationDTO buildPartitionLocationDTO(Long locationId, BigDecimal quantity, List<BaseLocationLotattDTO> baseLocationLotattList, List<InvLotLocId> sourceInvLotLocIdList, List<Long> partitionLocationSubList){
-        List<Long> checkLocationIdList = checkLocationIdList(locationId, sourceInvLotLocIdList, partitionLocationSubList,
-                baseLocationLotattList, quantity);
-        if(CollectionUtil.isEmpty(checkLocationIdList)) return null;
-        BigDecimal qtyCount = sourceInvLotLocIdList.stream()
-                .filter(item -> CollectionUtil.contains(checkLocationIdList, Long.parseLong(item.getLocationId()))
-                        && ObjectUtil.isNotNull(item.getQty()))
-                .map(item -> item.getQty()).reduce(BigDecimal.ZERO, BigDecimal::add);
-        PartitionLocationDTO partitionLocationDTO = new PartitionLocationDTO();
-        partitionLocationDTO.setResultLocationIdList(checkLocationIdList);
-        partitionLocationDTO.setQtyCount(qtyCount);
-        return partitionLocationDTO;
-    }
 
 
     private List<Long> checkLocationIdList(Long locationId, List<InvLotLocId> sourceInvLotLocIdList, List<Long> subList,
                                            List<BaseLocationLotattDTO> baseLocationLotattList, BigDecimal quantity) {
         //要过滤掉已经推荐的库存
         List<Long> locationIdList = baseLocationLotattList.stream().map(item -> item.getId()).collect(Collectors.toList());
-        //证明这一列只有这一个
+        //证明这一列只有这一个 or 证明外侧都是空的
         List<Long> filteredList = subList.stream()
                 .filter(item -> !ObjectUtil.equal(item, locationId)
                         && CollectionUtil.contains(locationIdList, item)).collect(Collectors.toList());
@@ -298,12 +328,6 @@ public class WmsDocOrderSubService {
                         && StringUtils.equals(item.getIsEmpty(), Constants.YES)).collect(Collectors.toList());
         if(CollectionUtil.isNotEmpty(asnTaskCheckList)) return Lists.newArrayList();
 
-        //证明外侧都是空的
-        List<BaseLocationLotattDTO> locationLotattList = baseLocationLotattList.stream()
-                .filter(item -> CollectionUtil.contains(filteredList, item.getId())
-                        && CollectionUtil.contains(locationIdList, item.getId())).collect(Collectors.toList());
-        if(CollectionUtil.isEmpty(locationLotattList)) return Lists.newArrayList(locationId);
-
         //要过滤掉已经推荐的库存
         List<InvLotLocId> invLocIdList = sourceInvLotLocIdList.stream()
                 .filter(item -> CollectionUtil.contains(locationIdList, Long.parseLong(item.getLocationId())))