瀏覽代碼

【MQ】agv调度优化

lxb 2 年之前
父節點
當前提交
41ae43adbd

+ 32 - 29
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/mq/TaskWorkNode.java

@@ -1297,7 +1297,7 @@ public class TaskWorkNode {
                 returnMap.put("targetxbk","0");
 
             }else{//需要放到线边库
-                /*//起点空盘
+               /* //起点空盘
                 Map startJbwPlateMap =  new HashMap();
                 startJbwPlateMap.put("haveGoods","1");
                 startJbwPlateMap.put("findAgvStation","1");
@@ -1309,8 +1309,7 @@ public class TaskWorkNode {
                     int count = stockInfoMapper.selectCount(new LbqWrapper<StockInfo>().eq(StockInfo::getStorgeId, item.getStorgeId()));
                     return count == 1 ? true : false;
                 }).collect(Collectors.toList());
-                ProductionresourcePosition startPosition = tempAgvStartList !=null && tempAgvStartList.size()>0 ? tempAgvStartList.get(0) :  null;
-*/
+                ProductionresourcePosition startPosition = tempAgvStartList !=null && tempAgvStartList.size()>0 ? tempAgvStartList.get(0) :  null;*/
 
                 //起点位置
                 ProductionresourcePosition startPosition = this.getPosition(zZone.getNo(),goalZone);
@@ -1463,6 +1462,10 @@ public class TaskWorkNode {
 
     /**
      * 获取起点位置
+     * 逻辑:
+     * 优先判断零件要去的产线接驳位是否有空位
+     * 如果没有空位,看是否有空闲的板子,有则调度,无则直接返回null
+     * 如果有空位,依据零件目前所在产线调度距离最近的板子,优先调度产线存在多个空板子的产线
      * @param zone 保障中心/框体线/仓体线(当前零件所在产线)
      * @param goalZone 下一个节点的所属产线编码(零件要去的产线)
      */
@@ -1475,35 +1478,35 @@ public class TaskWorkNode {
 
         //优先判断零件要去的产线接驳位是否有空位
         String[] jbws = DictionaryKey.YJ_ZONE_JBW.get(goalZone).split(",");
-
         Map startJbwMap = new HashMap();
-        startJbwMap.put("haveGoods", "1");
-        startJbwMap.put("xbkFlag", "1");
-        startJbwMap.put("findAgvStation", "1");
-        startJbwMap.put("codes", StringUtil.changeIdsArrToSubQueryStr(jbws));
-
-        //查询可用的板子
-        List<ProductionresourcePosition> agvStarts = productionresourcePositionMapper.getPPList(startJbwMap);
-        int agvStartCount=CollectionUtil.isNotEmpty(agvStarts) ? agvStarts.size() : 0; //可用的板子个数
-
-        //查询被占用的接驳位
-        Map occupyJbwMap = new HashMap();
-        startJbwMap.put("occupyFlag", "1");
-        startJbwMap.put("codes", StringUtil.changeIdsArrToSubQueryStr(jbws));
-        List<ProductionresourcePosition> occupyList = productionresourcePositionMapper.getPPList(occupyJbwMap);
-        int occupyCount=CollectionUtil.isNotEmpty(occupyList) ? occupyList.size() : 0; //占用的接驳位个数
-
-        int jbwCount = jbws.length;
-
-        if(jbwCount == (occupyCount + agvStartCount)){
-            //无空闲位置
-            if(jbwCount > occupyCount){
-                //存在可用板子
-                position = agvStarts.get(0);
-                return position;
+        startJbwMap.put("codes",StringUtil.changeIdsArrToSubQueryStr(jbws));
+        startJbwMap.put("freeFlag","1");
+        startJbwMap.put("findAgvStation","1");
+        //查找无板子,无占用,无锁定的 空接驳位
+        List<ProductionresourcePosition> freeList = productionresourcePositionMapper.getPPList(startJbwMap);
+
+        if (CollectionUtil.isEmpty(freeList)){
+            //无空位,说明当前产线的接驳位已被全部使用,查找是否有空闲的板子,调度过去,空出一个位置
+            Map startJbwPlateMap = new HashMap();
+            startJbwPlateMap.put("haveGoods", "1");
+            startJbwPlateMap.put("xbkFlag", "1");
+            startJbwPlateMap.put("findAgvStation", "1");
+            startJbwPlateMap.put("codes", StringUtil.changeIdsArrToSubQueryStr(jbws));
+
+            //查询可用的板子
+            List<ProductionresourcePosition> agvStartList = productionresourcePositionMapper.getPPList(startJbwPlateMap);
+            List<ProductionresourcePosition> tempAgvStartList = agvStartList.stream().filter(item -> {
+                int count = stockInfoMapper.selectCount(new LbqWrapper<StockInfo>().eq(StockInfo::getStorgeId, item.getStorgeId()));
+                return count == 1 ? true : false;
+            }).collect(Collectors.toList());
+
+            if(CollectionUtil.isNotEmpty(tempAgvStartList)){
+                //随机取一个空闲的板子
+                return tempAgvStartList.get(0);
             }
-        }
 
+            return null; //无空位,无空闲的板子
+        }
 
         int i = 1;
         for (String zoneT : zoneList) {