Bladeren bron

1、入库,出库时判断同列是否有任务或者阻挡
2、未包含先进先出和入库获取库位时,判断同列库存是否是相同入库日期的,不同相同日期不可放

LZH 1 jaar geleden
bovenliggende
commit
e85a187b15

+ 3 - 2
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/BaseLocationInfoSubService.java

@@ -59,8 +59,9 @@ public class BaseLocationInfoSubService {
                 Arrays.asList(IN_ZONES)
                 , bindSku
                 , null);
-        if (baseLocationLotattVOS.size() > 0) {
-            return baseLocationLotattVOS.get(0);
+        BaseLocationLotattVO baseLocationLotattVO = baseLocationInfoService.checkTheSameColumnLocation(baseLocationLotattVOS);
+        if (baseLocationLotattVO != null) {
+            return baseLocationLotattVO;
         }
         return null;
     }

+ 2 - 0
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/WcsToWmsApiService.java

@@ -119,6 +119,8 @@ public class WcsToWmsApiService {
                 AjaxResult.error("没有可以推荐的目标库位!");
             }
 
+            //TODO recommendAReceiptLocation,获取库位时,判断同列库存是否是相同入库日期的,不同相同日期不可放
+
             // 生成任务
             String taskNo = "";
             AjaxResult ajaxResult = wcsTaskSubService.addWcsTask(Constant.LOC_STAGE_CACHE.toString()

+ 11 - 11
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/WmsDocAsnSubService.java

@@ -6,6 +6,7 @@ import com.ruoyi.ams.asn.service.IWmsDocAsnDetailsService;
 import com.ruoyi.ams.asn.service.IWmsDocAsnHeaderService;
 import com.ruoyi.ams.xuankuang.domain.form.AgvInTaskForm;
 import com.ruoyi.ams.xuankuang.domain.form.BillTaskForm;
+import com.ruoyi.ams.xuankuang.domain.vo.LocationCoordinateVo;
 import com.ruoyi.ams.xuankuang.domain.vo.WcsResponseVo;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseSku;
@@ -135,18 +136,17 @@ public class WmsDocAsnSubService {
             String sku = iBaseSkuService.selectBaseSkuByMaterialType("5").getSku();
             //托盘码
             String pallentNo = "1234567";
-//            AjaxResult ajaxResult = wcsToWmsApiService.theBucketIsLoadedIntoTheLibrary(sku, asnNo, pallentNo, details.getExpectedQty());
-//            Object data = ajaxResult.getData();
-//            Map map = (Map) data;
-//            String taskNo = map.get("taskNo").toString();
-//            String row = map.get("row").toString();
-//            String col = map.get("col").toString();
-//            String floor = map.get("floor").toString();
-            agvInTaskForm.setTaskNo("1234556");
+            AjaxResult ajaxResult = wcsToWmsApiService.theBucketIsLoadedIntoTheLibrary(sku, asnNo, pallentNo, details.getExpectedQty());
+            LocationCoordinateVo locationCoordinateVo =  ajaxResult.getDataParseObject(LocationCoordinateVo.class);
+            String taskNo = locationCoordinateVo.getTaskNo();
+            String row = locationCoordinateVo.getRow().toString();
+            String col = locationCoordinateVo.getCol().toString();
+            String floor = locationCoordinateVo.getFloor().toString();
+            agvInTaskForm.setTaskNo(taskNo);
             agvInTaskForm.setPalletId(pallentNo);
-            agvInTaskForm.setRow(Integer.parseInt("2"));
-            agvInTaskForm.setCol(Integer.parseInt("4"));
-            agvInTaskForm.setFloor(Integer.parseInt("1"));
+            agvInTaskForm.setRow(Integer.parseInt(row));
+            agvInTaskForm.setCol(Integer.parseInt(col));
+            agvInTaskForm.setFloor(Integer.parseInt(floor));
             //调用agv入库任务下发
             WmsToWcsApiService wmsToWcsApiService = new WmsToWcsApiService();
             WcsResponseVo wcsResponseVo = wmsToWcsApiService.wmsAgvInTask(agvInTaskForm);

+ 18 - 5
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/WmsDocOrderSubService.java

@@ -90,12 +90,18 @@ public class WmsDocOrderSubService {
         // 查询出库单头
         WmsDocOrderHeader wmsDocOrderHeader = iWmsDocOrderHeaderService.selectWmsDocOrderHeaderByOrderNo(orderNo);
 
-        // 匹配库存
+        // 匹配库存(先进先出)
         List<BaseLocationLotattVO> baseLocationLotattVOS = addConfirmAllocationAuto(orderNo);
 
         //筛选库存
         List<BaseLocationLotattVO> baseLocationLotattVOS1 = filterInv(baseLocationLotattVOS, orderNo);
 
+        // 匹配库存(撇开先进先出)
+//        baseLocationLotattVOS = addConfirmAllocationAuto(orderNo);
+
+        //重新筛选库存
+//        baseLocationLotattVOS1 = filterInv(baseLocationLotattVOS, orderNo);
+
 
         boolean con = true;
         //机械手应拆袋数
@@ -150,7 +156,6 @@ public class WmsDocOrderSubService {
                 iWmsDocOrderHeaderService.updateWmsDocOrderHeader(wmsDocOrderHeader);
                 continue;
             }
-
         }
         if (con == true) {
             // 修改 明细行状态为10
@@ -198,8 +203,6 @@ public class WmsDocOrderSubService {
         //分配
         for (WmsDocOrderDetails o : detailslist) {
             sku = o.getSku();
-            BigDecimal qtyOrderedEach = o.getQtyOrderedEach();
-            orderBy = qtyOrderedEach.toString();
         }
         List<BaseLocationLotattVO> baseLocationLotattVOS = baseLocationInfoSubService.selectAllocatingInventoryAccordingConditionsOrderBy(outZones, lotattDTO, sku, orderBy);
         if (baseLocationLotattVOS.size() == 0) {
@@ -222,6 +225,16 @@ public class WmsDocOrderSubService {
         wmsDocOrderDetails.setLineStatus(Constant.ASN_STS.STS00.getValue());
         List<WmsDocOrderDetails> list = iWmsDocOrderDetailsService.selectWmsDocOrderDetailsList(wmsDocOrderDetails);
 
+        //出库同列阻挡和任务阻挡
+        List<BaseLocationLotattVO> baseLocationLotattVOS2 = new ArrayList<>();
+        for (int i = 0; i < baseLocationLotattVOS.size(); i++) {
+            BaseLocationLotattVO baseLocationLotattVO = baseLocationLotattVOS.get(i);
+            BaseLocationLotattVO baseLocationLotattVO1 = baseLocationInfoService.checkTheSameColumnLocation1(baseLocationLotattVO,baseLocationLotattVOS2);
+            if (baseLocationLotattVO1!=null){
+                baseLocationLotattVOS2.add(baseLocationLotattVO1);
+            }
+        }
+
         List<BaseLocationLotattVO> baseLocationLotattVOS1 = new ArrayList<>();
 
         for (WmsDocOrderDetails wmsDocOrderDetails1 : list) {
@@ -229,7 +242,7 @@ public class WmsDocOrderSubService {
             //出库数量
             BigDecimal qtyAllocatedEach = wmsDocOrderDetails1.getQtyOrderedEach();
 
-            for (BaseLocationLotattVO baseLocationLotattVO1 : baseLocationLotattVOS) {
+            for (BaseLocationLotattVO baseLocationLotattVO1 : baseLocationLotattVOS2) {
                 if (qtyAllocatedEach.compareTo(BigDecimal.ZERO) == 0) {
                     return baseLocationLotattVOS1;
                 }

+ 22 - 0
warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java

@@ -88,7 +88,29 @@ public class Constant {
         }
     }
 
+    /**
+     * 搬运任务配置id
+     */
+    public enum FLOW_CONFIG_ID {
+        /***
+         * 桶装出库
+         */
+        ONE(1l),
+        /**
+         * 桶装入库
+         */
+        TWO(2l);
+
+        private Long flowId;
+
+        FLOW_CONFIG_ID(Long flowId) {
+            this.flowId = flowId;
+        }
 
+        public Long getValue() {
+            return flowId;
+        }
+    }
     //endregion
 
     /**

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

@@ -131,6 +131,32 @@ public interface BaseLocationInfoMapper {
             , @Param("lotatt") Map<String, String> lotatt,@Param("sku") String sku,@Param("orderByClause") String orderBy);
 
 
+    /**
+     * 根据库位返回同库区同列目标占用的库位list
+     * 同列是否已经存在任务
+     *
+     * @param baseLocationInfo
+     * @return
+     */
+    List<BaseLocationInfo> queryByListOccupyByLoc(BaseLocationInfo baseLocationInfo);
+
+    /**
+     * 根据库位返回同库区同列目标有货的库位list
+     * 同列前方是否有阻挡
+     *
+     * @param baseLocationInfo
+     * @return
+     */
+    List<BaseLocationInfo> queryByListInStockByLoc(BaseLocationInfo baseLocationInfo);
+
+    /**
+     * 根据库位返回同库区同列的库位list
+     *
+     *
+     * @param baseLocationInfo
+     * @return
+     */
+    List<BaseLocationLotattVO> queryByListInUserdeFine1(BaseLocationInfo baseLocationInfo);
 
     List<BaseLocationLotattVO> selectSortedLocationLotattListByLocationIdList(@Param("locationId") List<Long> locationId, @Param("warehouseId") Long warehouseId, @Param("lotatt") Map<String, String> lotatt, @Param("sku") String sku);
 

+ 21 - 0
warewms-base/src/main/java/com/ruoyi/base/service/IBaseLocationInfoService.java

@@ -1,5 +1,6 @@
 package com.ruoyi.base.service;
 
+import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.domain.dto.BaseLocationInfoSameColDTO;
 import com.ruoyi.base.domain.vo.BasLocationTreeSelectVO;
@@ -7,6 +8,7 @@ import com.ruoyi.base.domain.vo.BaseLocationLotattListVO;
 import com.ruoyi.base.domain.vo.BaseLocationLotattVO;
 import com.ruoyi.base.domain.vo.TreeSelectVO;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.redis.RedisKey;
 
 import java.util.List;
 import java.util.Map;
@@ -18,6 +20,25 @@ import java.util.Map;
  * @date 2022-02-18
  */
 public interface IBaseLocationInfoService {
+
+
+
+    /**
+     * 入库校验同列任务任务状态和阻挡
+     *
+     * @param basLocationList
+     * @return
+     */
+    BaseLocationLotattVO checkTheSameColumnLocation(List<BaseLocationLotattVO> basLocationList);
+
+    /**
+     * 出库校验同列任务任务状态和阻挡
+     *
+     * @param basLocationList
+     * @return
+     */
+    BaseLocationLotattVO checkTheSameColumnLocation1(BaseLocationLotattVO baseLocationLotattVO,List<BaseLocationLotattVO> basLocationList);
+
     /**
      * 查询库位信息
      *

+ 87 - 2
warewms-base/src/main/java/com/ruoyi/base/service/impl/BaseLocationInfoServiceImpl.java

@@ -43,6 +43,91 @@ public class BaseLocationInfoServiceImpl implements IBaseLocationInfoService {
     @Autowired
     private RedisCache redisCache;
 
+    /**
+     * 入库校验同列任务任务状态和阻挡
+     *
+     * @param basLocationList
+     * @param token
+     * @param isReleaseGoods  是否目标点位
+     * @return
+     */
+    public BaseLocationLotattVO checkTheSameColumnLocation(List<BaseLocationLotattVO> basLocationList) {
+        boolean isBlock = false; // 是否阻挡
+        BaseLocationLotattVO basLocation = null;
+        //筛选2次 第2次去除同列占用和阻挡条件 todo 先筛选一次吧
+        for (int i = 0; i < 1 && basLocation == null; i++) {
+            for (BaseLocationLotattVO location : basLocationList) {
+                //如果库位类型不为地堆则不用判断同列占用和阻挡
+                if (location.getLocationType().equals("1")) {
+                    isBlock = true;
+                }
+
+                //只有第一次判断同列任务占用和阻挡
+                if (i == 0 && isBlock) {
+                    //同列是否有任务
+                    List<BaseLocationInfo> occupyByLocs = baseLocationInfoMapper.queryByListOccupyByLoc(location);
+                    if (occupyByLocs.size() > 0) {
+                        continue;
+                    }
+                    //同列前方是否有阻挡
+                    List<BaseLocationInfo> inStockByLocs = baseLocationInfoMapper.queryByListInStockByLoc(location);
+                    if (inStockByLocs.size() > 0) {
+                        continue;
+                    }
+                }
+                basLocation = location;
+                break;
+            }
+        }
+        return basLocation;
+    }
+
+    /**
+     * @param baseLocationLotattVO 要判断的库位
+     * @param basLocationList      满足要求的库位列表
+     * @return
+     */
+    public BaseLocationLotattVO checkTheSameColumnLocation1(BaseLocationLotattVO baseLocationLotattVO, List<BaseLocationLotattVO> basLocationList) {
+
+        //查同列所有库位
+        List<BaseLocationLotattVO> baseLocationInfos = baseLocationInfoMapper.queryByListInUserdeFine1(baseLocationLotattVO);
+
+        if (baseLocationInfos.size() == 1) {
+            return baseLocationLotattVO;
+        }
+
+        //同列是否有任务
+        List<BaseLocationInfo> occupyByLocs = baseLocationInfoMapper.queryByListOccupyByLoc(baseLocationLotattVO);
+        if (occupyByLocs.size() > 0) {
+            return null;
+        }
+
+        //同列前方是否有阻挡
+        List<BaseLocationInfo> inStockByLocs = baseLocationInfoMapper.queryByListInStockByLoc(baseLocationLotattVO);
+        if (inStockByLocs.size() > 0) {
+
+            boolean isSuccess = true;
+            for (int i = 0; i < inStockByLocs.size(); i++) {
+                if (basLocationList.size() == 0) {
+                    return null;
+                }
+
+                boolean isSuit = false;
+                for (BaseLocationLotattVO vo : basLocationList) {
+
+                    if (inStockByLocs.get(i).getId().equals(vo.getId())) {
+
+                        isSuit = true;
+                    }
+                }
+
+                isSuccess = isSuit;
+                if (!isSuccess) return null;
+            }
+        }
+        return baseLocationLotattVO;
+    }
+
     /**
      * 查询库位信息
      *
@@ -191,7 +276,7 @@ public class BaseLocationInfoServiceImpl implements IBaseLocationInfoService {
     }
 
     @Override
-    public List<BaseLocationInfo> selectSortedLocatinListByZoneId(Long zoneId, Long warehouseId,String orderBy) {
+    public List<BaseLocationInfo> selectSortedLocatinListByZoneId(Long zoneId, Long warehouseId, String orderBy) {
         BaseLocationInfo query = new BaseLocationInfo();
         query.setWarehouseId(warehouseId);
         query.setZoneId(zoneId);
@@ -376,7 +461,7 @@ public class BaseLocationInfoServiceImpl implements IBaseLocationInfoService {
             try {
                 if (StringUtils.isEmpty(baseLocationInfo.getLocationNo())) {
                     if (baseLocationInfo.getLocationType().equals("1")) {
-                        baseLocationInfo.setLocationNo(baseLocationInfo.getColNo() + "-" + StringUtils.addZero(baseLocationInfo.getRowNo(), 2)+ "-" +StringUtils.addZero(baseLocationInfo.getRowIndex(),2));
+                        baseLocationInfo.setLocationNo(baseLocationInfo.getColNo() + "-" + StringUtils.addZero(baseLocationInfo.getRowNo(), 2) + "-" + StringUtils.addZero(baseLocationInfo.getRowIndex(), 2));
                     } else {
                         baseLocationInfo.setLocationNo(baseLocationInfo.getRowNo() + "-" + StringUtils.addZero(baseLocationInfo.getColNo(), 2) + "-" + StringUtils.addZero(baseLocationInfo.getColIndex().toString(), 2));
                     }

+ 41 - 2
warewms-base/src/main/resources/mapper/base/BaseLocationInfoMapper.xml

@@ -631,7 +631,7 @@
             order by ${orderByClause}
         </if>
         <if test="orderByClause == null or orderByClause == ''">
-            order by row_no + 0,row_index,shift_no + 0,shift_index,col_no + 0,col_index
+            order by  zone_id, userdefine1 + 0 , userdefine2 + 0
         </if>
     </select>
 
@@ -672,10 +672,49 @@
             order by ${orderByClause}
         </if>
         <if test="orderByClause == null or orderByClause == ''">
-            order by row_no + 0,row_index,shift_no + 0,shift_index,col_no + 0,col_index
+            order by /*att.lotatt01 ,*/ zone_id, userdefine1 + 0 , userdefine2 + 0 desc
         </if>
     </select>
 
+    <!--根据库位返回同库区同列目标占用的库位list 同列是否已经存在任务-->
+    <select id="queryByListOccupyByLoc" resultMap="BaseLocationInfoResult" parameterType="BaseLocationInfo">
+        select *
+        from base_location_info
+        where stock_status = '10'
+          and location_type = '1'
+          and zone_id = #{zoneId}
+          and userdefine1 = #{userdefine1}
+          and userdefine2 != #{userdefine2}
+
+    </select>
+
+    <!--根据库位返回同库区同列目标有货的库位list 同列前方是否有阻挡    -->
+    <select id="queryByListInStockByLoc" resultMap="BaseLocationInfoResult" parameterType="BaseLocationInfo">
+        select *
+        from base_location_info
+        where is_empty = 'N'
+          and location_type = '1'
+          and zone_id = #{zoneId}
+          and userdefine1 = #{userdefine1}
+          and userdefine2 > #{userdefine2}
+
+    </select>
+
+    <!--根据库位返回同库区同列的库位list   -->
+    <select id="queryByListInUserdeFine1" resultMap="BaseLocationInfoLotattResult" parameterType="BaseLocationInfo" >
+        select b.* ,inv.sku, inv.qty
+             , att.*
+        from base_location_info b
+                 left join inv_lot_loc_id inv on b.id = inv.location_id
+                 left join inv_lot_att att on inv.lotnum = att.lotnum
+        where is_empty = 'N'
+          and location_type = '1'
+          and zone_id = #{zoneId}
+          and userdefine1 = #{userdefine1}
+          order by userdefine2 + 0 desc
+
+    </select>
+
     <select id="selectSortedLocationLotattListByLocationIdList" parameterType="BaseLocationInfo"
             resultMap="BaseLocationInfoLotattResult">
         select b.id, b.warehouse_id, b.zone_id, b.location_no, b.location_barcode, b.row_no, b.row_index, b.col_no,