Browse Source

1.PDA组盘增加qty
2.PDA组盘拆分库存

k 2 years ago
parent
commit
6ac0d68fa9

+ 27 - 11
warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java

@@ -87,6 +87,7 @@ public class BusinessServiceImpl implements IBusinessService {
             return res;
         }
     }
+
     @Transactional
     @Override
     public AjaxResult agvCall(AgvCallItem agvCallItem, Long flowId) {
@@ -107,6 +108,7 @@ public class BusinessServiceImpl implements IBusinessService {
         list.add(agvCallDTO);
         return this.agvCall(flowConfigHeaderVO, list);
     }
+
     @Transactional
     @Override
     public AjaxResult agvCall(FlowConfigHeaderVO flowConfigHeaderVO, AgvCallDTO agvCallDTO) {
@@ -323,17 +325,10 @@ public class BusinessServiceImpl implements IBusinessService {
                     if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
                         continue;
                     }
-                    // 永湖仓储区一层高度为1700,其他为2300
-                    // 入库和回库的时候,入库位IN-02-01(200)和回库位RET-01-01(500)只能入到一层,其他的不能入到一层
-                    if (locationFrom.getLocationNo().equals("IN-02-01") || locationFrom.getLocationNo().equals("RET-01-01")
-                            || locationFrom.getAgvStation() == 200 || locationFrom.getAgvStation() == 500) {
-                        if (!b.getShiftNo().equals("1")) {
-                            continue;
-                        }
-                    } else {
-                        if (b.getShiftNo().equals("1")) {
-                            continue;
-                        }
+                    // 根据起始库位判断目标是否可放
+                    Boolean canPut = checkLocCanPut(locationFrom, b);
+                    if (!canPut) {
+                        continue;
                     }
                     locationInfo = b;
                     break;
@@ -424,6 +419,27 @@ public class BusinessServiceImpl implements IBusinessService {
         return locationInfo;
     }
 
+    public Boolean checkLocCanPut(BaseLocationInfo locationFrom, BaseLocationInfo locationTo) {
+        boolean con = false;
+        // 永湖仓储区一层高度为1600,其他为2300
+        // 入库和回库的时候,入库位IN-02-01(200)和回库位RET-01-01(500)只能入到一层,其他的不能入到一层
+        // 第二层有4个点限制高度1600 入库位IN-02-01(200)和回库位RET-01-01(500)可以入到这4个点
+        if (locationFrom.getLocationNo().equals("IN-02-01") || locationFrom.getLocationNo().equals("RET-01-01")
+                || locationFrom.getAgvStation() == 200 || locationFrom.getAgvStation() == 500) {
+            if (locationTo.getShiftNo().equals("1")
+                    || (locationTo.getHeightLimit() != null && locationTo.getHeightLimit().compareTo(1600.0) == 0)) {
+                con = true;
+            }
+        } else {
+            if (!locationTo.getShiftNo().equals("1")
+                    && (locationTo.getHeightLimit() == null || locationTo.getHeightLimit().compareTo(1600.0) != 0)) {
+                con = true;
+            }
+        }
+        return con;
+    }
+
+
     @Override
     public List<BaseLocationInfo> convertLocation(String locationNoOrZoneId, Long warehouseId, String orderBy) {
         List<BaseLocationInfo> locationInfoList = new ArrayList<>();

+ 14 - 1
warewms-ams/src/main/java/com/ruoyi/ams/business/IBusinessService.java

@@ -75,13 +75,24 @@ public interface IBusinessService {
     BaseLocationInfo zoneLocationAllocation(BaseLocationInfo locationFrom, List<BaseLocationInfo> locationInfoList, String locationType
             , String type, AsnSoStrategy asnSoStrategy, AgvCallItemDTO agvCallDTO, Long token);
 
+
+    /**
+     * 根据起始库位判断目标库位是否可以放置
+     *
+     * @param locationFrom
+     * @param locationTo
+     * @return
+     */
+    Boolean checkLocCanPut(BaseLocationInfo locationFrom, BaseLocationInfo locationTo);
+
+
     /***
      *  根据id转换库位列表(如果是库位id直接返回库位如果是区域id则返回相应的库位)
      * @param locationNoOrZoneId 库位id或者区域id
      * @param warehouseId 仓库id
      * @return
      */
-    List<BaseLocationInfo> convertLocation(String locationNoOrZoneId, Long warehouseId,String orderBy);
+    List<BaseLocationInfo> convertLocation(String locationNoOrZoneId, Long warehouseId, String orderBy);
 
     /**
      * 生成任务
@@ -129,6 +140,7 @@ public interface IBusinessService {
 
     /**
      * 任务拆分
+     *
      * @param wcsTask
      * @return
      */
@@ -136,6 +148,7 @@ public interface IBusinessService {
 
     /**
      * 任务可执行判断
+     *
      * @param wcsTask
      * @return
      */

+ 6 - 0
warewms-ams/src/main/java/com/ruoyi/ams/inv/service/impl/InvLotLocIdServiceImpl.java

@@ -211,6 +211,12 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         baseLocationFrom = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationFrom, warehouseId);
         baseLocationTo = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationTo, warehouseId);
 
+        // 根据起始库位判断目标库位是否可以放置
+        Boolean canPut = iBusinessService.checkLocCanPut(baseLocationFrom, baseLocationTo);
+        if (!canPut) {
+            return AjaxResult.error("所选的目标库位超高!");
+        }
+
         // 下发移库任务
         String taskNo = System.currentTimeMillis() + "";
         WcsTask wcsTask = new WcsTask();

+ 10 - 0
warewms-ams/src/main/java/com/ruoyi/ams/order/form/GroupDiskFrom.java

@@ -26,9 +26,19 @@ public class GroupDiskFrom {
      * 出库单号(理货备货才会传入)
      */
     private String orderNo;
+
+    /**
+     * 组盘数量
+     */
+    private String qty;
     /**
      * 是否满拖
      */
     private String isFull;
 
+    /**
+     * 目标托盘是否是备货托盘 固定true
+     */
+    private boolean isStockPalletNoTo = true;
+
 }

+ 104 - 16
warewms-ams/src/main/java/com/ruoyi/ams/order/service/impl/WmsDocOrderHeaderServiceImpl.java

@@ -807,22 +807,25 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
     @Transactional
     @Override
     public AjaxResult groupDisk(GroupDiskFrom groupDiskFrom) {
-        // 更新托盘
-        WmsBoxInfo boxFrom = wmsBoxInfoService.selectWmsBoxInfoByBoxNo(groupDiskFrom.getPalletNoTo());
-        boxFrom.setIsFull(groupDiskFrom.getIsFull());
-        wmsBoxInfoService.updateWmsBoxInfo(boxFrom);
-
         String palletNoFrom = groupDiskFrom.getPalletNoFrom(); // 起始托盘
         String palletNoTo = groupDiskFrom.getPalletNoTo(); // 目标托盘
         String sn = groupDiskFrom.getSn(); // 条码号
         String orderNo = ""; // 出库单号(备货才会传入)
         String sku = ""; // 物料编码
+        Double qty = Double.valueOf(groupDiskFrom.getQty()); // 数量
+        boolean isAllUpdate = false; // 是全部修改,还是拆分
+        boolean isStockPalletNoTo = groupDiskFrom.isStockPalletNoTo(); // 目标托盘是否是备货托盘,为了方便,目标托盘默认是备货托盘
+        final Double toQty;
         if (StringUtils.isNotEmpty(groupDiskFrom.getOrderNo())) {
             orderNo = groupDiskFrom.getOrderNo();
         }
-        /// 根据条码获取物料号
+        // 根据条码获取物料号
         CodeSkuRelationshipVO codeSkuRelationshipVO = codeSkuRelationshipService.checkIsProduct(sn);
         sku = codeSkuRelationshipVO.getSku();
+        if (codeSkuRelationshipVO.isProduct()) {
+            qty = 1.0; //产品默认为1
+        }
+        toQty = qty;
         // 根据起始托盘,条码号查出库存
         InvLocIdSearchFrom locIdSearchFrom = new InvLocIdSearchFrom();
         locIdSearchFrom.setSku(sku);
@@ -830,12 +833,29 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
         lotattDTO.setLotatt07(palletNoFrom);
         lotattDTO.setLotatt02(sn);
         locIdSearchFrom.setLotattDTO(lotattDTO);
-        List<InvLotLocIdLotattVO> invLotLocIdLotattVOList = invLotLocIdService.selectInvLocIdLotattList(locIdSearchFrom);
+        List<InvLotLocIdLotattVO> invLotLocIdLotattList = invLotLocIdService.selectInvLocIdLotattList(locIdSearchFrom);
         // 组盘是把出库的库存重新组到一个新的托盘上,所以起始托盘和条码理应可以查询到系统里有对应的库存。
-        if (invLotLocIdLotattVOList.size() == 0) {
+        if (invLotLocIdLotattList.size() == 0) {
             return AjaxResult.error(String.format("不存在对应库存!起始托盘:%s,条码:%s", palletNoFrom, sn));
         }
-        // 创建Lotnum和库存对应关系,可能是一对多
+        // 产品的话基本只能查出有一条库存 但是物料可能会多条 但是我们只处理一条库存
+        List<InvLotLocIdLotattVO> invLotLocIdLotattVOList = new ArrayList<>();
+        InvLotLocIdLotattVO endLotattVO = new InvLotLocIdLotattVO();
+        List<InvLotLocIdLotattVO> equalInv = invLotLocIdLotattList.stream().filter(v -> v.getQty().compareTo(toQty) == 0).collect(Collectors.toList());
+        if (equalInv.size() > 0) {
+            endLotattVO = equalInv.get(0);
+            isAllUpdate = true;
+        } else {
+            List<InvLotLocIdLotattVO> greaterInv = invLotLocIdLotattList.stream().filter(v -> v.getQty().compareTo(toQty) == 1).collect(Collectors.toList());
+            if (greaterInv.size() > 0) {
+                endLotattVO = greaterInv.get(0);
+            }
+        }
+        if (endLotattVO == null) {
+            return AjaxResult.error("组盘数量大于单条库存数量!");
+        }
+        invLotLocIdLotattVOList.add(endLotattVO);
+        // 创建Lotnum和库存对应关系
         Map<String, List<InvLotLocIdLotattVO>> lotnumAndInvLocIdMap = new HashMap<>();
         invLotLocIdLotattVOList.stream().forEach(v -> {
             if (lotnumAndInvLocIdMap.get(v) == null) {
@@ -868,18 +888,86 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
             invLotAtt.setCreateTime(DateUtils.getNowDate());
             if (invLotAttMapper.insertInvLotAtt(invLotAtt) > 0) {
                 for (InvLotLocIdLotattVO v : invLocIdList) {
-                    InvLotLocIdForm invLotLocIdUpdate = new InvLotLocIdForm();
-                    invLotLocIdUpdate.setLotnum(lotnum);
-                    invLotLocIdUpdate.setLocationId(v.getLocationId().toString());
-                    invLotLocIdUpdate.setCustomerId(v.getCustomerId());
-                    invLotLocIdUpdate.setSku(v.getSku());
-                    invLotLocIdUpdate.setLotnumTo(newLotnum);
-                    invLotLocIdService.updateInvLotLocId(invLotLocIdUpdate);
+                    // 如果是备货,备货的组盘数量不能大于分配数
+                    if (StringUtils.isNotEmpty(orderNo)) {
+                        Double qtyallocated = v.getQtyallocated();
+                        if (toQty.compareTo(qtyallocated) == 1) {
+                            return AjaxResult.error("备货组盘数量输入不合理!不可大于分配数量:" + qtyallocated);
+                        }
+                    }
+                    if (isAllUpdate) {
+                        InvLotLocIdForm invLotLocIdUpdate = new InvLotLocIdForm();
+                        invLotLocIdUpdate.setLotnum(lotnum);
+                        invLotLocIdUpdate.setLocationId(v.getLocationId().toString());
+                        invLotLocIdUpdate.setCustomerId(v.getCustomerId());
+                        invLotLocIdUpdate.setSku(v.getSku());
+                        invLotLocIdUpdate.setLotnumTo(newLotnum);
+                        invLotLocIdService.updateInvLotLocId(invLotLocIdUpdate);
+                    } else {
+                        InvLotLocId invLotLocId = invLotLocIdService.selectInvLotLocIdById(v.getLocationId().toString()
+                                , v.getCustomerId(), v.getSku(), v.getLotnum());
+                        BigDecimal qtyallocated = invLotLocId.getQtyallocated();
+                        // 判断是否是备货组盘
+                        if (StringUtils.isNotEmpty(orderNo)) {
+                            if (isStockPalletNoTo) {
+                                // 拆分库存
+                                // 修改原库存
+                                InvLotLocIdForm invLotLocIdUpdate = new InvLotLocIdForm();
+                                invLotLocIdUpdate.setLotnum(v.getLotnum());
+                                invLotLocIdUpdate.setLocationId(v.getLocationId().toString());
+                                invLotLocIdUpdate.setCustomerId(v.getCustomerId());
+                                invLotLocIdUpdate.setSku(v.getSku());
+                                invLotLocIdUpdate.setQty(invLotLocId.getQty().subtract(new BigDecimal(toQty)));
+                                invLotLocIdUpdate.setQtyallocated(qtyallocated.subtract(new BigDecimal(toQty)));
+                                invLotLocIdService.updateInvLotLocId(invLotLocIdUpdate);
+                                // 插入新库存
+                                InvLotLocId invLotLocIdInsert = invLotLocId;
+                                invLotLocIdInsert.setLotnum(newLotnum);
+                                invLotLocIdInsert.setQty(new BigDecimal(toQty));
+                                invLotLocIdInsert.setQtyEach(invLotLocIdInsert.getQty());
+                                invLotLocIdInsert.setQtyallocated(new BigDecimal(toQty));
+                                invLotLocIdInsert.setQtyallocatedEach(invLotLocIdInsert.getQtyallocated());
+                                invLotLocIdService.insertInvLotLocId(invLotLocIdInsert);
+                            }
+                        }else {
+                            // 拆分库存
+                            // 修改原库存
+                            InvLotLocIdForm invLotLocIdUpdate = new InvLotLocIdForm();
+                            invLotLocIdUpdate.setLotnum(v.getLotnum());
+                            invLotLocIdUpdate.setLocationId(v.getLocationId().toString());
+                            invLotLocIdUpdate.setCustomerId(v.getCustomerId());
+                            invLotLocIdUpdate.setSku(v.getSku());
+                            invLotLocIdUpdate.setQty(invLotLocId.getQty().subtract(new BigDecimal(toQty)));
+                            if(qtyallocated.compareTo(new BigDecimal(toQty)) == 1) {
+                                invLotLocIdUpdate.setQtyallocated(qtyallocated.subtract(new BigDecimal(toQty)));
+                            }else {
+                                invLotLocIdUpdate.setQtyallocated(BigDecimal.ZERO);
+                            }
+                            invLotLocIdService.updateInvLotLocId(invLotLocIdUpdate);
+                            // 插入新库存
+                            InvLotLocId invLotLocIdInsert = invLotLocId;
+                            invLotLocIdInsert.setLotnum(newLotnum);
+                            invLotLocIdInsert.setQty(new BigDecimal(toQty));
+                            invLotLocIdInsert.setQtyEach(invLotLocIdInsert.getQty());
+                            if(qtyallocated.compareTo(new BigDecimal(toQty)) == 1) {
+                                invLotLocIdInsert.setQtyallocated(new BigDecimal(toQty));
+                            }else {
+                                invLotLocIdInsert.setQtyallocated(qtyallocated);
+                            }
+                            invLotLocIdInsert.setQtyallocatedEach(invLotLocIdInsert.getQtyallocated());
+                            invLotLocIdService.insertInvLotLocId(invLotLocIdInsert);
+                        }
+                    }
+
                 }
 
             }
         }
 //        }
+        // 更新托盘
+        WmsBoxInfo boxFrom = wmsBoxInfoService.selectWmsBoxInfoByBoxNo(groupDiskFrom.getPalletNoTo());
+        boxFrom.setIsFull(groupDiskFrom.getIsFull());
+        wmsBoxInfoService.updateWmsBoxInfo(boxFrom);
         return AjaxResult.success("组盘成功!");
     }