Selaa lähdekoodia

联调提高agv调度效率问题修改

yejian 3 vuotta sitten
vanhempi
commit
ba68ec80a5

+ 43 - 8
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/edgeLibrary/service/impl/StorgeServiceImpl.java

@@ -27,8 +27,10 @@ import com.github.zuihou.business.productionResourceCenter.dao.Productionresourc
 import com.github.zuihou.business.productionResourceCenter.entity.ProductionresourcePosition;
 import com.github.zuihou.business.productionResourceCenter.entity.ZZone;
 import com.github.zuihou.business.productionResourceCenter.service.ProductionresourcePositionService;
+import com.github.zuihou.business.util.MsgUtil;
 import com.github.zuihou.common.constant.BizConstant;
 import com.github.zuihou.common.constant.DictionaryKey;
+import com.github.zuihou.common.constant.ParameterKey;
 import com.github.zuihou.common.util.StringUtil;
 import com.github.zuihou.database.mybatis.auth.DataScope;
 import com.github.zuihou.database.mybatis.conditions.Wraps;
@@ -84,6 +86,9 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
     @Autowired
     private PlateService plateService;
 
+    @Autowired
+    private MsgUtil msgUtil;
+
     @Override
     protected String getRegion() {
         return TENANT;
@@ -330,6 +335,20 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
                     storge = baseMapper.selectById(position.getStorgeId());
                     resourceId = position.getResourceId()==null?"":position.getResourceId().toString();
                 }
+            }else{
+                // 有托板,但是托板上有东西,所以需判断可调度的空托板
+                Map storgeParams = new HashMap();
+                storgeParams.put("codes",StringUtil.changeIdsArrToSubQueryStr(jbw));
+                storgeParams.put("freeFlag","1");
+                storgeParams.put("findAgvStation","1");
+                List<ProductionresourcePosition> productionresourcePositions = productionresourcePositionMapper.getPPList(storgeParams);
+                log.info("起点接驳位不可用,查找无托盘的起点接驳位{}",productionresourcePositions.toString());
+                if(productionresourcePositions.size() > 0){
+                    ProductionresourcePosition productionresourcePosition = productionresourcePositions.get(0);
+                    tempAgvTaskEndPoint = productionresourcePosition.getCode();
+                    tempAgvTaskEndPointStorge = baseMapper.selectById(productionresourcePosition.getStorgeId());
+                }
+                log.info("查到起点无托板接驳位{}",tempAgvTaskEndPoint);
             }
         }else{
             Map storgeParams = new HashMap();
@@ -337,12 +356,13 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
             storgeParams.put("freeFlag","1");
             storgeParams.put("findAgvStation","1");
             List<ProductionresourcePosition> productionresourcePositions = productionresourcePositionMapper.getPPList(storgeParams);
-
+            log.info("起点接驳位不可用,查找无托盘的起点接驳位{}",productionresourcePositions.toString());
             if(productionresourcePositions.size() > 0){
                 ProductionresourcePosition productionresourcePosition = productionresourcePositions.get(0);
                 tempAgvTaskEndPoint = productionresourcePosition.getCode();
                 tempAgvTaskEndPointStorge = baseMapper.selectById(productionresourcePosition.getStorgeId());
             }
+            log.info("查到起点无托板接驳位{}",tempAgvTaskEndPoint);
         }
 
         if(storge!=null){
@@ -365,6 +385,8 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
                 usableJbwPlateMap.put("haveGoods","1");
                 usableJbwPlateMap.put("findAgvStation","1");
                 List<ProductionresourcePosition> tempAgvStartList = productionresourcePositionMapper.getPPList(usableJbwPlateMap);
+                log.info("起点接驳位不可用,查找线内空托盘接驳位{}",tempAgvStartList.toString());
+                String zoneType = (null == msgUtil.redis_get(ParameterKey.PARAMETERS)? "": ((Map<String,String>)msgUtil.redis_get(ParameterKey.PARAMETERS)).get(ParameterKey.ZONE_TYPE).toString());
 
                 if(tempAgvStartList.size() > 0){
                     Map<String,List<ProductionresourcePosition>> tempAgvStartMap = tempAgvStartList.stream().collect(groupingBy(ProductionresourcePosition::getNo));
@@ -372,18 +394,31 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
                         List<ProductionresourcePosition> list = tempAgvStartMap.get(key);
                         // 无托板
                         if(list!=null && list.size()==1 && StringUtils.isBlank(tempAgvTaskStartPoint)){
-                            // 必须是存放了1个托板
-                            tempAgvTaskStartPoint = list.get(0).getCode();
-                            tempAgvTaskStartPointStorge = baseMapper.selectById(list.get(0).getStorgeId());
-                            returnMap.put("tempAgvTaskStartPoint",tempAgvTaskStartPoint);
-                            returnMap.put("tempAgvTaskEndPoint",tempAgvTaskEndPoint);
-                            returnMap.put("tempAgvTaskStartPointStorge",tempAgvTaskStartPointStorge);
-                            returnMap.put("tempAgvTaskEndPointStorge",tempAgvTaskEndPointStorge);
+                            if(zoneType.equals(ParameterKey.ZONE_SFX)){
+                                if(list.get(0).getCode().equals(DictionaryKey.SFX_JBW_RELATION.get(tempAgvTaskEndPoint))){
+                                    // 必须是存放了1个托板
+                                    tempAgvTaskStartPoint = list.get(0).getCode();
+                                    tempAgvTaskStartPointStorge = baseMapper.selectById(list.get(0).getStorgeId());
+                                    returnMap.put("tempAgvTaskStartPoint",tempAgvTaskStartPoint);
+                                    returnMap.put("tempAgvTaskEndPoint",tempAgvTaskEndPoint);
+                                    returnMap.put("tempAgvTaskStartPointStorge",tempAgvTaskStartPointStorge);
+                                    returnMap.put("tempAgvTaskEndPointStorge",tempAgvTaskEndPointStorge);
+                                }
+                            }else{
+                                // 必须是存放了1个托板
+                                tempAgvTaskStartPoint = list.get(0).getCode();
+                                tempAgvTaskStartPointStorge = baseMapper.selectById(list.get(0).getStorgeId());
+                                returnMap.put("tempAgvTaskStartPoint",tempAgvTaskStartPoint);
+                                returnMap.put("tempAgvTaskEndPoint",tempAgvTaskEndPoint);
+                                returnMap.put("tempAgvTaskStartPointStorge",tempAgvTaskStartPointStorge);
+                                returnMap.put("tempAgvTaskEndPointStorge",tempAgvTaskEndPointStorge);
+                            }
                         }
                     }
                 }
 
             }
+            log.info("起点接驳位不可用,查找线内空托盘适配接驳位{}",tempAgvTaskStartPoint);
             // end add by yejian on 20220802 for 判断如果接驳位起始不可用时判断是否有可用的空托盘,如果有,先让agv搬运到需放料所在位子
         }
         return returnMap;

+ 8 - 7
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/operationManagementCenter/service/impl/TaskNodeServiceImpl.java

@@ -1311,25 +1311,28 @@ public class TaskNodeServiceImpl extends SuperServiceImpl<TaskNodeMapper, TaskNo
     @Override
     public R taskNodeCallback(TaskNodeCallBackDTO bean) {
         log.info("指令回调参数======================" + JSONObject.toJSONString(bean));
+
         BaseContextHandler.setTenant("0000");
         String taskId = bean.getTaskId() == null ? "" : bean.getTaskId().toString();
+        String taskNodeId = bean.getTaskNodeId() == null ? "" : bean.getTaskNodeId().toString();
         TTask task = taskService.getById(taskId);
         if(null == task){
             return R.fail("任务不存在");
         }
-        String uid = bean.getUid() == null ? "" : bean.getUid().toString();
 
         //验证是否重复回调
-        String cacheUid = msgUtil.redis_get(uid) == null ? "" : msgUtil.redis_get(uid).toString();
+        String cacheUid = msgUtil.redis_get(taskNodeId) == null ? "" : msgUtil.redis_get(taskNodeId).toString();
         if (StringUtil.isNotEmpty(cacheUid)) {//排除掉重复回调
             log.info("回调重复了======================" + cacheUid);
-            return null;
+            return R.fail("节点{}已有回调",bean.getTaskNodeId());
         }
 
+        //把当前id存放入缓存
+        msgUtil.redis_set(String.valueOf(bean.getTaskNodeId()), String.valueOf(bean.getTaskNodeId()), 1, TimeUnit.HOURS);
+
         //取出参数
         String code = bean.getCode();
         String msg = bean.getMsg()!=null? bean.getMsg() : "指令操作失败";
-        String taskNodeId = bean.getTaskNodeId() == null ? "" : bean.getTaskNodeId().toString();
 
         // begin add by yejian on 20220503 for yj on 如果排产中先等待排产完成后继续执行
         while(null != msgUtil.redis_get(YunjianConstant.YUNJIAN_SHEDULE_FLAG)){
@@ -1366,8 +1369,6 @@ public class TaskNodeServiceImpl extends SuperServiceImpl<TaskNodeMapper, TaskNo
         }
 
         String bizCallBackData = jsonParam;
-        //把当前id存放入缓存
-        msgUtil.redis_set(uid, uid, 1, TimeUnit.HOURS);
 
         List<TaskNode> taskNodeList = baseMapper.selectList(Wraps.<TaskNode>lbQ().eq(TaskNode::getCompleteBatchNo, task.getCompleteBatchNo()).orderByAsc(TaskNode::getCompleteBatchSort));
 
@@ -1388,7 +1389,7 @@ public class TaskNodeServiceImpl extends SuperServiceImpl<TaskNodeMapper, TaskNo
             lg.setStatus("0").setExeResult("0").setManual("1").setFeedback(msg);
             autoNodeLogMapper.updateAllById(lg);
         }
-
+        msgUtil.redis_del(taskNodeId);
         return R.success();
     }
 

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

@@ -378,10 +378,10 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                         // 机器人可用,判断目标地址
 
                         // 判断同一资源是否有优先级更高的任务需要执行,如果有重新进入队列
-                        List<TaskNode> highLevelTaskNode = taskNodeService.list(Wraps.<TaskNode>lbQ().lt(TaskNode::getExpectStartTime,taskNode.getExpectStartTime()).eq(TaskNode::getExeStatus,"2").ne(TaskNode::getId,taskNode.getId()));
-                        if(highLevelTaskNode.size() > 0){
-                            dataMap.put("result", false);
-                        }else{
+//                        List<TaskNode> highLevelTaskNode = taskNodeService.list(Wraps.<TaskNode>lbQ().lt(TaskNode::getExpectStartTime,taskNode.getExpectStartTime()).eq(TaskNode::getExeStatus,"2").ne(TaskNode::getId,taskNode.getId()));
+//                        if(highLevelTaskNode.size() > 0){
+//                            dataMap.put("result", false);
+//                        }else{
                             //目标库位,可能是
                             Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
 
@@ -433,7 +433,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                             }else{
                                 dataMap.put("result", false);
                             }
-                        }
+//                        }
 
                     }else{
                         dataMap.put("result", false);
@@ -487,10 +487,12 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                 log.info("节点{}检查机器人资源条件返回{}",taskNode.getId(),po);
                 if (po!=null) {
 
-                    List<TaskNode> highLevelTaskNode = taskNodeService.list(Wraps.<TaskNode>lbQ().lt(TaskNode::getExpectStartTime,taskNode.getExpectStartTime()).eq(TaskNode::getExeStatus,"2").ne(TaskNode::getId,taskNode.getId()));
-                    if(highLevelTaskNode.size() > 0){
-                        dataMap.put("result", false);
-                    }else{
+                    // TODO 任务优先级需要调整,存在bug
+//                    List<TaskNode> highLevelTaskNode = taskNodeService.list(Wraps.<TaskNode>lbQ().lt(TaskNode::getExpectStartTime,taskNode.getExpectStartTime()).eq(TaskNode::getExeStatus,"2").ne(TaskNode::getId,taskNode.getId()).eq(TaskNode::getProcedureId,taskNode.getProcedureId()));
+//                    if(highLevelTaskNode.size() > 0){
+//
+//                        dataMap.put("result", false);
+//                    }else{
                         Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
 
                         //目标地址和类型
@@ -552,7 +554,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                                 dataMap.put("result", false);
                             }
                         }
-                    }
+//                    }
                 }else{
                     dataMap.put("result", false);
                 }
@@ -724,6 +726,8 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                 String tempAgvTaskEndPoint = map.get("tempAgvTaskEndPoint") == null?null:(String)map.get("tempAgvTaskEndPoint");
                 Storge tempAgvTaskStartPointStorge = map.get("tempAgvTaskStartPointStorge") == null?null:(Storge)map.get("tempAgvTaskStartPointStorge");
                 Storge tempAgvTaskEndPointStorge = map.get("tempAgvTaskEndPointStorge") == null?null:(Storge)map.get("tempAgvTaskEndPointStorge");
+                log.info("节点接驳位不可用,动态调度接驳位起点{}、终点{}",taskNode.getId(),tempAgvTaskStartPoint,tempAgvTaskEndPoint);
+
                 if(StringUtils.isNotBlank(tempAgvTaskStartPoint) && StringUtils.isNotBlank(tempAgvTaskEndPoint)){
                     // 锁定起点终点接驳位
                     Map agvData = new HashMap();
@@ -736,8 +740,8 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                     JSONObject agvParam = new JSONObject();
                     agvParam.putAll(agvData);
                     String zoneType = (null == msgUtil.redis_get(ParameterKey.PARAMETERS)? "": ((Map<String,String>)msgUtil.redis_get(ParameterKey.PARAMETERS)).get(ParameterKey.ZONE_TYPE).toString());
-                    storgeService.lockStorge(tempAgvTaskStartPointStorge, Long.valueOf(taskNode.getId()));
-                    storgeService.lockStorge(tempAgvTaskEndPointStorge, Long.valueOf(taskNode.getId()));
+                    storgeService.lockStorge(tempAgvTaskStartPointStorge, null);
+                    storgeService.lockStorge(tempAgvTaskEndPointStorge, null);
                     if(zoneType.equals(ParameterKey.ZONE_SFX)){
                         agvData.put("transferType","agv");
                         R addAgvTask = externalApiService.processTransferJob(agvData);