소스 검색

缓存位机器人双缓存位利用修改

yejian 2 년 전
부모
커밋
1a76fcb8fc

+ 1 - 1
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/DemoLine/DemoLineConstant.java

@@ -289,6 +289,6 @@ public interface DemoLineConstant {
 
     String GATHER_DYN_FILED_SMU = "";
 
-
+    String JQR_HCW_PART_PRIOTY_EXEC_FLAG = "JQR_HCW_PART_PRIOTY_EXEC_FLAG";
 
 }

+ 3 - 2
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/externalApi/service/impl/AgvHikOrderDetailInfoServiceImpl.java

@@ -72,9 +72,9 @@ public class AgvHikOrderDetailInfoServiceImpl extends SuperCacheServiceImpl<AgvH
     @Async
     public void asyncCallbackTask(String data,String agvCallbackUrl){
         // sleep10秒
-        log.info("异步模拟agv回到参数data=",data);
+        log.info("异步模拟agv回到参数data={}",data);
         try {
-            Thread.sleep(60000);
+            Thread.sleep(10000);
             // 组装数据模拟agv任务完成返回
             JSONObject jsonObject = JSONObject.parseObject(data);
             String taskCode = jsonObject.getString("taskCode");
@@ -87,6 +87,7 @@ public class AgvHikOrderDetailInfoServiceImpl extends SuperCacheServiceImpl<AgvH
 //                jsonObject.put("code","999999");
 //                jsonObject.put("msg","false");
 //            }else{
+                jsonObject.remove("positionCodePath");
                 jsonObject.put("method","end");
                 jsonObject.put("code","0");
                 jsonObject.put("msg","success");

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

@@ -884,7 +884,7 @@ public class TaskWorkNode {
 
                 Storge startStore = workpieceService.getWorkPieceStock(taskNode.getCompleteBatchNo(), false);
 
-                ProductionresourcePosition po = logical(robotList,dataMap);
+                ProductionresourcePosition po = logical(robotList,dataMap,count);
 
                 //机器人手抓没被锁定,并且有空闲未知
                 if (po != null) {
@@ -927,6 +927,9 @@ public class TaskWorkNode {
 
                         dataMap.put("method", "MoveRobotPosition");
                         dataMap.put("result", true);
+
+                        // 机器人移动到redis记录实时位子
+                        msgUtil.redis_set(taskNode.getResourceId()+"postion",startStore.getPointId());
                     }else{
                         dataMap.put("result", false);
                     }
@@ -970,14 +973,26 @@ public class TaskWorkNode {
                 String targetHcwXbk =(String)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_HCW_XBK_FLAG + taskNode.getId());
                 logger.info("节点{}线边库逻辑缓存位处理{}",taskNode.getId(),targetHcwXbk);
 
-                // 放在机器人缓存暂存线边库逻辑,无需再次移动取放
+                // 放在机器人缓存暂存线边库逻辑,无需再次移动取放
                 if("1".equals(targetHcwXbk)){
+
+                    // begin modify by yejian on 20220927 for 如果缓存位上工件的目标地址和当前机床的取料位子是同一个,取料完成后机器人缓存位上的工件优先放到机床加工
+                    String jqrHcwPartPriotyExec = (null == msgUtil.redis_get(DemoLineConstant.JQR_HCW_PART_PRIOTY_EXEC_FLAG + taskNode.getId())) ? "" : (String)msgUtil.redis_get(DemoLineConstant.JQR_HCW_PART_PRIOTY_EXEC_FLAG + taskNode.getId());
+                    logger.info("节点{}是否存在当前缓存位上工件先放到目标设备标志{}",taskNode.getId(),jqrHcwPartPriotyExec);
+                    if("1".equals(jqrHcwPartPriotyExec)){
+                        robotList = productionresourcePositionMapper.selectList(Wraps.<ProductionresourcePosition>lbQ().eq(ProductionresourcePosition::getResourceId,taskNode.getResourceId().toString()).eq(ProductionresourcePosition::getPointId,DemoLineConstant.DEMOLINE_RJQR_ZS).eq(ProductionresourcePosition::getStatus,"0"));
+                    }else{
+                        robotList = productionresourcePositionService.getFreeProductionresourcePositionByIds(new String[]{taskNode.getResourceId().toString()});
+                    }
+                    logger.info("节点{}缓存位逻辑获取机器人信息{}",taskNode.getId(),robotList.toString());
+                    // end modify by yejian on 20220927 for 如果缓存位上工件的目标地址和当前机床的取料位子是同一个,取料完成后机器人缓存位上的工件优先放到机床加工
+
                     //判断机器人是否为空
-                    robotList = productionresourcePositionService.getFreeProductionresourcePositionByIds(new String[]{taskNode.getResourceId().toString()});
+//                    robotList = productionresourcePositionService.getFreeProductionresourcePositionByIds(new String[]{taskNode.getResourceId().toString()});
                     Map<String, List<ProductionresourcePosition>> jqrMap = robotList.stream().collect(groupingBy(ProductionresourcePosition::getPointId));
                     Storge startStore = workpieceService.getWorkPieceStock(taskNode.getCompleteBatchNo(), false);
 
-                    ProductionresourcePosition po = logical(robotList,dataMap);
+                    ProductionresourcePosition po = logical(robotList,dataMap,count);
 
                     //机器人手抓没被锁定,并且有空闲未知
                     if (po != null) {
@@ -1013,6 +1028,9 @@ public class TaskWorkNode {
 
                             dataMap.put("method", "MoveRobotPosition");
                             dataMap.put("result", true);
+
+                            // 机器人移动到redis记录实时位子
+                            msgUtil.redis_set(taskNode.getResourceId()+"postion",targetStorge.getPointId());
                         }else{
                             dataMap.put("result", false);
                         }
@@ -1072,7 +1090,7 @@ public class TaskWorkNode {
                     dataMap.put("method", "GetServoStacker");
                 }
 
-                ProductionresourcePosition po = logical(robotList,dataMap);
+                ProductionresourcePosition po = logical(robotList,dataMap,count);
                 if (po != null) {
                     // 线边库轮询判断后续节点目标地址是否时接驳位
                     String findAgvFlag = "0";
@@ -1295,7 +1313,7 @@ public class TaskWorkNode {
      * @param robotList
      * @return
      */
-    public ProductionresourcePosition logical(List<ProductionresourcePosition> robotList, Map<String, Object> dataMap) {
+    public ProductionresourcePosition logical(List<ProductionresourcePosition> robotList, Map<String, Object> dataMap,int count) {
         ZZone zone = dataMap.get("zone") == null ? null : (ZZone) dataMap.get("zone");
         ZZone bomzZone = dataMap.get("bomzZone") == null ? null : (ZZone) dataMap.get("bomzZone");
         //自动模式下,如果下个节点是上下料站,不让走下去
@@ -1304,14 +1322,14 @@ public class TaskWorkNode {
         }
 
         //设备不存在
-        if (!checkRobot(robotList, zone.getName())) {
-            return null;
-        }
-        //资源临界判断
-        int current_running_num = storgeService.getstorgeByZone(zone.getId().toString());
-        if (current_running_num == DictionaryKey.RESOURCE_MAX_NUM) {
+        if (!checkRobot(robotList, zone.getName(), count)) {
             return null;
         }
+//        //资源临界判断
+//        int current_running_num = storgeService.getstorgeByZone(zone.getId().toString());
+//        if (current_running_num == DictionaryKey.RESOURCE_MAX_NUM) {
+//            return null;
+//        }
 
         return robotList.get(0);
     }
@@ -1331,7 +1349,7 @@ public class TaskWorkNode {
         }
 
         //设备不存在
-        if (!checkRobot(robotList, zone.getName())) {
+        if (!checkRobot(robotList, zone.getName(),99)) {
             return null;
         }
         //资源临界判断
@@ -1352,12 +1370,18 @@ public class TaskWorkNode {
      *
      * @return
      */
-    public boolean checkRobot(List<ProductionresourcePosition> robotList, String zoneName) {
+    public boolean checkRobot(List<ProductionresourcePosition> robotList, String zoneName,int count) {
         if (BizConstant.ROBOT_TYPE_NOCACHE.equals(zoneService.getRobotTypebyZone(zoneName))) {
             return CollectionUtil.isNotEmpty(robotList) && robotList.size() == 1;
-        } else if (BizConstant.ROBOT_TYPE_CACHE.equals(zoneService.getRobotTypebyZone(zoneName))) {//手抓必须空闲。
-            Map<String, List<ProductionresourcePosition>> jqrMap = robotList.stream().collect(groupingBy(ProductionresourcePosition::getPointId));
-            return CollectionUtil.isNotEmpty(robotList) && robotList.size() > 1 && jqrMap.containsKey(DemoLineConstant.DEMOLINE_RJQR_ZS);
+        } else if (BizConstant.ROBOT_TYPE_CACHE.equals(zoneService.getRobotTypebyZone(zoneName))) {
+            if(3 == count){
+                //手抓必须空闲。
+                Map<String, List<ProductionresourcePosition>> jqrMap = robotList.stream().collect(groupingBy(ProductionresourcePosition::getPointId));
+                return CollectionUtil.isNotEmpty(robotList) && jqrMap.containsKey(DemoLineConstant.DEMOLINE_RJQR_ZS);
+            }else{
+                Map<String, List<ProductionresourcePosition>> jqrMap = robotList.stream().collect(groupingBy(ProductionresourcePosition::getPointId));
+                return CollectionUtil.isNotEmpty(robotList) && robotList.size() > 1 && jqrMap.containsKey(DemoLineConstant.DEMOLINE_RJQR_ZS);
+            }
         }
         return true;
     }

+ 55 - 5
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/productionResourceCenter/service/impl/RobotNodeServiceImpl.java

@@ -4,6 +4,7 @@ package com.github.zuihou.business.productionResourceCenter.service.impl;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.github.zuihou.authority.entity.auth.RoleOrg;
 import com.github.zuihou.authority.entity.core.Org;
 import com.github.zuihou.base.R;
 import com.github.zuihou.business.DemoLine.DemoCacheKey;
@@ -443,6 +444,10 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                                 dataMap.put("data", locationMap);
                                 dataMap.put("method", "MoveRobotPosition");
                                 dataMap.put("result", true);
+
+                                // 机器人移动到redis记录实时位子
+                                msgUtil.redis_set(taskNode.getResourceId()+"postion",startStore.getPointId());
+
                             }else{
                                 dataMap.put("result", false);
                             }
@@ -582,18 +587,60 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                 String targetHcwXbk =(String)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_HCW_XBK_FLAG + taskNode.getId());
                 log.info("节点{}放逻辑判断{}",taskNode.getId(),targetHcwXbk);
                 if("1".equals(targetHcwXbk)){
+                    // 释放锁定机器人资源
+                    List<Storge> storgeList = storgeService.list(Wraps.<Storge>lbQ().eq(Storge::getCampId, taskNode.getId()));
+                    storgeService.unlockStorgeList(storgeList);
                     log.info("节点{}执行暂存缓存为线边库逻辑",taskNode.getId());
                     dataMap.put(YunjianConstant.YUNJIAN_XBKFLAG, targetHcwXbk);
                     dataMap.put(YunjianConstant.YUNJIAN_HCW_XBKFLAG, targetHcwXbk);
+                    dataMap.put("result", true);
                 }else{
                     dataMap.put(YunjianConstant.YUNJIAN_ROBORT_CACHE_FLAG, "1");
                     if(count==0) {
-                        Map locationMap = new HashMap();
-                        locationMap.put("location",targetStorge.getPointId());
-                        dataMap.put("data", locationMap);
 
+                        // begin add by yejian on 20220921 for 机器人缓存位上面有料时先判断当前机器人移动所在位子是否和机器人缓存台上面的暂存物料的目标地址一致,
+                        // 如果一致,先将缓存台物料放到目标地址,实现逻辑通过redis加机器人所在位子和跳过机器人是否可用逻辑,直接让缓存位上面的任务先执行beta
+                        // 查询机器人缓存位上面是否存在物料并且目标地址是否当前机器所在位子
+                        List<ProductionresourcePosition> jrqHcwWorkpieceInfos = productionresourcePositionService.getFullProductionresourcePositionByIds(deviceArr);
+                        List<Long> jrqHcwStorgeIds = jrqHcwWorkpieceInfos.stream().mapToLong(ProductionresourcePosition::getStorgeId).boxed().collect(Collectors.toList());
+                        List<Storge> jrqHcwStorges = storgeMapper.selectList(Wraps.<Storge>lbQ().in(Storge::getId,jrqHcwStorgeIds));
+                        log.info("节点{}当前缓存位数工件信息{}",taskNode.getId(),jrqHcwStorges.toString());
+                        boolean hasJqrhcwPartFlag = false;
+                        String jrqHcwPartPoint =  msgUtil.redis_get(deviceArr[0] + "postion") == null ? "": String.valueOf(msgUtil.redis_get(deviceArr[0] + "postion"));
+                        log.info("节点{}当前机器人所在位子{}",taskNode.getId(),jrqHcwPartPoint);
+                        for(Storge jqrHcwStorge : jrqHcwStorges){
+                            long jqrHcwStorgeTaskNodeId = jqrHcwStorge.getCampId();
+                            TaskNode jqrHcwStorgeTaskNode = taskNodeService.getById(jqrHcwStorgeTaskNodeId);
+                            ProductionresourcePosition jqrHcwStorgeTaskNodeResource = productionresourcePositionMapper.selectOne(Wraps.<ProductionresourcePosition>lbQ().eq(ProductionresourcePosition::getResourceId,jqrHcwStorgeTaskNode.getTargetResourceId()));
+                            log.info("jqrHcwStorgeTaskNode.getCompleteBatchNo()={}",jqrHcwStorgeTaskNode.getCompleteBatchNo());
+                            log.info("taskNode.getCompleteBatchNo()={}",taskNode.getCompleteBatchNo());
+                            if(!jqrHcwStorgeTaskNode.getCompleteBatchNo().equals(taskNode.getCompleteBatchNo())){
+                                // 查询缓存位工件目标地址是否是机器人当前位子
+                                log.info("jqrHcwStorgeTaskNodeResource.getPointId()={}",jqrHcwStorgeTaskNodeResource.getPointId());
+                                log.info("jrqHcwPartPoint={}",jrqHcwPartPoint);
+                                if(jqrHcwStorgeTaskNodeResource.getPointId().equals(jrqHcwPartPoint)){
+                                    hasJqrhcwPartFlag = true;
+                                    msgUtil.redis_set(DemoLineConstant.JQR_HCW_PART_PRIOTY_EXEC_FLAG + jqrHcwStorgeTaskNodeId,"1");
+                                    break;
+                                }
+                            }
+                        }
+                        log.info("节点{}是否存在当前缓存位上工件先放到目标设备标志{}",taskNode.getId(),hasJqrhcwPartFlag);
+                        if(hasJqrhcwPartFlag){
+                            dataMap.put("result", false);
+                        }else{
+                            Map locationMap = new HashMap();
+                            locationMap.put("location",targetStorge.getPointId());
+                            dataMap.put("data", locationMap);
+
+                            dataMap.put("method", "MoveRobotPosition");
+                            dataMap.put("result", true);
 
-                        dataMap.put("method", "MoveRobotPosition");
+                            // 机器人移动到redis记录实时位子
+                            msgUtil.redis_set(taskNode.getResourceId()+"postion",targetStorge.getPointId());
+                        }
+                        //end add by yejian on 20220921 for 机器人缓存位上面有料时先判断当前机器人移动所在位子是否和机器人缓存台上面的暂存物料的目标地址一致,
+                        // 如果一致,先将缓存台物料放到目标地址
                     }else if(count == 1){//从缓存位拿出来
                         dataMap.put("method", "GetFlexibleWire");
                         Storge hcwStorge = (Storge)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_HCW + taskNode.getId());
@@ -607,6 +654,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                         dataMap.put("toStorge", handStorge);
                         //出入库类型
                         dataMap.put(DemoLineConstant.DEMOLINE_STOCK_TYPE,DemoLineConstant.DEMOLINE_STOCK_TYPE_ALL_CRK);
+                        dataMap.put("result", true);
                     }else if(count == 2){
                         dataMap.put("method", "SendFlexibleWire");
                         //出入库类型
@@ -626,6 +674,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                             //把计数去掉,从线边库开始重新计数
                             dataMap.remove(taskNode.getId().toString()+"count");
                         }
+                        dataMap.put("result", true);
                     }
                 }
                 // end add by yejian on 20220819 for 将机器人上的缓存位利用历来:如果缓存位数量n-1 >= 1,则可以将工件不放到线边库,直接放在缓存位上暂存后轮训线边库逻辑
@@ -657,8 +706,9 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                     //把计数去掉,从线边库开始重新计数
                     dataMap.remove(taskNode.getId().toString()+"count");
                 }
+                dataMap.put("result", true);
             }
-            dataMap.put("result", true);
+
         }
         dataMap.put("instructionUrl", instructionUrl);
         return dataMap;

+ 3 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/util/MsgUtil.java

@@ -303,6 +303,9 @@ public class MsgUtil implements ApplicationContextAware {
                         dynamicRabbitMq.sendMsg(taskNode.getResourceId().toString(),jsonObject.toString());
                         return;
                     }else{
+                        // 删除缓存位优先执行的节点标志
+                        redis_del(DemoLineConstant.JQR_HCW_PART_PRIOTY_EXEC_FLAG + taskNode.getId());
+
                         jsonObject.put("taskNodeId",nextTaskNode.getId().toString());
                         jsonObject.put("bizType", BizConstant.MQ_TASK_NODE_TYPE_COMMON);
                         dynamicRabbitMq.sendMsg(nextTaskNode.getResourceId().toString(),jsonObject.toString());