Sfoglia il codice sorgente

agv并发查找预占及释放修改

yejian 3 anni fa
parent
commit
aa36c23b97

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

@@ -42,6 +42,9 @@ public interface DemoCacheKey {
     //缓存记下当前托板位置
     String DEMOLINE_CIRCULATION_TB_STORAGE = "DEMOLINE_CIRCULATION_TB_STORAGE";
 
+    // agv接驳位占用情况
+    String DEMOLINE_AGV_STATION_OCCUPY = "DEMOLINE_AGV_STATION_OCCUPY";
+
 
 
     /**

+ 1 - 1
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/edgeLibrary/service/StorgeService.java

@@ -84,7 +84,7 @@ public interface StorgeService extends SuperCacheService<Storge> {
 
     void setValidTray(Map map);
 
-    Map getPlateStorgeByNo(ZZone zZone);
+    Map getPlateStorgeByNo(ZZone zZone,List<Long> occupyAgvStations);
 
     String getPointId(Storge storge, TTask task,String zoneType);
 

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

@@ -256,7 +256,7 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
      * @return
      */
     @Override
-    public Map getPlateStorgeByNo(ZZone zZone) {
+    public Map getPlateStorgeByNo(ZZone zZone,List<Long> occupyAgvStations) {
         //返回的map
         Map returnMap = new HashMap();
 
@@ -274,7 +274,7 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
 //            Map<Long,Plate> plateMap = getPlate(zZone.getId().toString());
             //根据接驳位分组
             Map<String,List<ProductionresourcePosition>> jbwMap = jbwList.stream().collect(groupingBy(ProductionresourcePosition::getNo));
-            List<ProductionresourcePosition>tbList = new ArrayList<>();
+            List<ProductionresourcePosition> tbList = new ArrayList<>();
             for(String key:jbwMap.keySet()){
                 List<ProductionresourcePosition> list = jbwMap.get(key);
                 if(list!=null&&list.size()==1){//必须是存放了1个托板
@@ -305,37 +305,44 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
 //                    storge = baseMapper.selectById(position.getStorgeId());
 //                    resourceId = position.getResourceId()==null?"":position.getResourceId().toString();
 //                }
+                ProductionresourcePosition position = null;
+                for(ProductionresourcePosition productionresourcePosition : tbList){
+                    if(!occupyAgvStations.contains(productionresourcePosition.getResourceId())){
+                        position = tbList.get(0);
+                        break;
+                    }
+                }
 
-                ProductionresourcePosition position = tbList.get(0);
-                storge = baseMapper.selectById(position.getStorgeId());
-                resourceId = position.getResourceId()==null?"":position.getResourceId().toString();
-            }
-            }
-
-            if(storge!=null){
-                returnMap.put("storge",storge);
-                storge.setResourceNo(jbwCode);
-                returnMap.put("jbwCode",jbwCode);
-                returnMap.put("resourceId",resourceId);
+                if(null != position){
+                    storge = baseMapper.selectById(position.getStorgeId());
+                    resourceId = position.getResourceId()==null?"":position.getResourceId().toString();
+                }
             }
-            return returnMap;
         }
 
+        if(storge!=null){
+            returnMap.put("storge",storge);
+            storge.setResourceNo(jbwCode);
+            returnMap.put("jbwCode",jbwCode);
+            returnMap.put("resourceId",resourceId);
+        }
+        return returnMap;
+    }
 
-        private Map<Long,Plate> getPlate(String zoneId){
-            Map<Long,Plate>plateMap = new HashMap<>();
-            List<Plate>plateList = plateService.list();
-            List<Plate>plist = new ArrayList<>();
-            for(Plate plate:plateList){
-                if(zoneId.equals(plate.getZoneId()==null?"":plate.getZoneId().toString())){
-                    plist.add(plate);
-                }
+    private Map<Long,Plate> getPlate(String zoneId){
+        Map<Long,Plate>plateMap = new HashMap<>();
+        List<Plate>plateList = plateService.list();
+        List<Plate>plist = new ArrayList<>();
+        for(Plate plate:plateList){
+            if(zoneId.equals(plate.getZoneId()==null?"":plate.getZoneId().toString())){
+                plist.add(plate);
             }
-            if(plist!=null&&plist.size()>0){
-                plateMap = plist.stream().collect(Collectors.toMap(Plate::getId, t->t));
-            }
-            return plateMap;
         }
+        if(plist!=null&&plist.size()>0){
+            plateMap = plist.stream().collect(Collectors.toMap(Plate::getId, t->t));
+        }
+        return plateMap;
+    }
 
     /**
      *

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

@@ -825,28 +825,47 @@ public class TaskWorkNode {
         Long resourceId = taskNode.getTargetResourceId();
 
         if ("1".equals(findAgvFlag)) {//需要提前锁定下个接驳位
-            //获取接驳位。
-            Map map = storgeService.getPlateStorgeByNo(zZone);
-            targetStorge = map.get("storge") == null ? null : (Storge) map.get("storge");
-            String targetResourceId = map.get("resourceId") == null ? null : (String) map.get("resourceId");
-            //对面产线接驳位不为空TODO
-            String[] jbwArr = DictionaryKey.YJ_ZONE_JBW.get(zZone.getName()).split(",");
-            List<ProductionresourcePosition> jbwBList = productionresourcePositionService.getFreeProductionresourcePositionByNos(jbwArr);
-
-            if (targetStorge != null && CollectionUtil.isNotEmpty(jbwBList)) {
-                ProductionresourcePosition position = jbwBList.get(0);
-                agvEndStationStorge = storgeService.getById(position.getStorgeId());
-
-                returnMap.put("store", targetStorge);
-
-                //更新到targetresourceid
-//                TaskNode nextTaskNode = taskNodeService.getNextNTaskNode(taskNode,1);
-                TaskNode lastOperationTaskNode = taskNodeService.getOne(Wraps.<TaskNode>lbQ().eq(TaskNode::getTaskId, taskNode.getTaskId()).orderByDesc(TaskNode::getCompleteBatchSort).last("limit 1"));
-                taskNode.setTargetResourceId(Long.parseLong(targetResourceId));
-                lastOperationTaskNode.setTargetResourceId(position.getResourceId());
-                lastOperationTaskNode.setResourceId(taskNode.getTargetResourceId());
-                taskNodeService.updateById(taskNode);
-                taskNodeService.updateById(lastOperationTaskNode);
+            synchronized (DictionaryKey.CHECK_AGV_STATION){
+                List<Long> occupyAgvStations = (null == msgUtil.redis_get(DemoCacheKey.DEMOLINE_AGV_STATION_OCCUPY) ? new ArrayList<>(): (List<Long>) msgUtil.redis_get(DemoCacheKey.DEMOLINE_AGV_STATION_OCCUPY));
+                //获取接驳位。
+                Map map = storgeService.getPlateStorgeByNo(zZone, occupyAgvStations);
+                targetStorge = map.get("storge") == null ? null : (Storge) map.get("storge");
+                String targetResourceId = map.get("resourceId") == null ? null : (String) map.get("resourceId");
+                //对面产线接驳位不为空TODO
+                String[] jbwArr = DictionaryKey.YJ_ZONE_JBW.get(zZone.getName()).split(",");
+                List<ProductionresourcePosition> jbwBList = productionresourcePositionService.getFreeProductionresourcePositionByNos(jbwArr);
+
+                if (targetStorge != null && CollectionUtil.isNotEmpty(jbwBList)) {
+                    ProductionresourcePosition position = null;
+                    for(ProductionresourcePosition productionresourcePosition : jbwBList){
+                        if(!occupyAgvStations.contains(productionresourcePosition.getResourceId())){
+                            position = jbwBList.get(0);
+                            break;
+                        }
+                    }
+                    if(null!=position){
+                        agvEndStationStorge = storgeService.getById(position.getStorgeId());
+
+                        //更新到targetresourceid
+                        TaskNode lastAgvTaskNode = taskNodeService.getNextNTaskNode(taskNode,1);
+//                    TaskNode lastOperationTaskNode = taskNodeService.getOne(Wraps.<TaskNode>lbQ().eq(TaskNode::getTaskId, taskNode.getTaskId()).orderByDesc(TaskNode::getCompleteBatchSort).last("limit 1"));
+                        taskNode.setTargetResourceId(Long.parseLong(targetResourceId));
+                        lastAgvTaskNode.setTargetResourceId(position.getResourceId());
+                        lastAgvTaskNode.setResourceId(taskNode.getTargetResourceId());
+                        taskNodeService.updateById(taskNode);
+                        taskNodeService.updateById(lastAgvTaskNode);
+
+                        if(!occupyAgvStations.contains(Long.valueOf(targetResourceId))){
+                            occupyAgvStations.add(Long.valueOf(targetResourceId));
+                        }
+                        if(!occupyAgvStations.contains(position.getResourceId())){
+                            occupyAgvStations.add(position.getResourceId());
+                        }
+                        msgUtil.redis_set(DemoCacheKey.DEMOLINE_AGV_STATION_OCCUPY,occupyAgvStations);
+                    }
+
+                    returnMap.put("store", targetStorge);
+                }
             }
         } else {
             //目标设备

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

@@ -1600,7 +1600,24 @@ public class TaskNodeServiceImpl extends SuperServiceImpl<TaskNodeMapper, TaskNo
      * @param task
      * @param callBackJson
      */
-    public R<String> demoLineStock(TaskNode taskNode, TTask task, JSONObject callBackJson,TWorkpiece currWorkpiece) {
+    public synchronized R<String> demoLineStock(TaskNode taskNode, TTask task, JSONObject callBackJson,TWorkpiece currWorkpiece) {
+
+        // begin add by yejian on 20220504 for agv出入库预占释放防止多线程抢占
+
+        // 如果前一节点时agv搬运节点,机器人将物料帮运走后释放预占redis里面的内容
+
+        List<Long> occupyAgvStations = (null == msgUtil.redis_get(DemoCacheKey.DEMOLINE_AGV_STATION_OCCUPY) ? new ArrayList<>(): (List<Long>) msgUtil.redis_get(DemoCacheKey.DEMOLINE_AGV_STATION_OCCUPY));
+        if("03".equals(taskNode.getInterfaceType())){
+            occupyAgvStations.remove(taskNode.getTargetResourceId());
+        }
+
+        TaskNode beforTaskNode = getNextNTaskNode(taskNode, -1);
+        if(null != beforTaskNode && "03".equals(beforTaskNode.getInterfaceType())){
+            occupyAgvStations.remove(beforTaskNode.getTargetResourceId());
+        }
+        msgUtil.redis_set(DemoCacheKey.DEMOLINE_AGV_STATION_OCCUPY,occupyAgvStations);
+        // end add by yejian on 20220504 for agv出入库预占释放防止多线程抢占
+
         //没有回传参数,直接不需要出入库操作
         String stockType = callBackJson.getString(DemoLineConstant.DEMOLINE_STOCK_TYPE);
         //如果没有起始、终点,则不需要出入库处理

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

@@ -516,39 +516,60 @@ public class RobotNodeServiceImpl implements NodeOperationService {
         String xbkFlag = "";
 
         if("1".equals(findAgvFlag)){//需要提前锁定下个接驳位
+            synchronized (DictionaryKey.CHECK_AGV_STATION){
+                // begin modify by yejian on 20220513 for agv动态查找满足抽检一个工序需多次调度agv问题
+                // 先找到处理节点下一节点agv起点地址
+                List<Long> occupyAgvStations = (null == msgUtil.redis_get(DemoCacheKey.DEMOLINE_AGV_STATION_OCCUPY) ? new ArrayList<>(): (List<Long>) msgUtil.redis_get(DemoCacheKey.DEMOLINE_AGV_STATION_OCCUPY));
+
+                TaskNode lastAgvTaskNode = taskNodeService.getNextNTaskNode(taskNode,1);;
+                //获取接驳位。agvEndStationStorge
+                Map map = storgeService.getPlateStorgeByNo(zZone,occupyAgvStations);
+                targetStorge = map.get("storge") ==null?null:(Storge)map.get("storge");
+                String targetResourceId = map.get("resourceId") ==null?null:(String)map.get("resourceId");
+                // 在向下找agv终点位子
+                // 下一个节点机器人所属产线
+                TaskNode afterLastAgvTaskNode = taskNodeService.getNextNTaskNode(lastAgvTaskNode,1);
+                ZZoneProductionresource zoneProductionresource = zZoneProductionresourceMapper.selectOne(Wraps.<ZZoneProductionresource>lbQ().eq(ZZoneProductionresource::getResourceId,afterLastAgvTaskNode.getResourceId()));
+                //获取产线ID
+                zoneId = zoneProductionresource.getZoneId();
+                zZone = zoneService.getById(zoneId);
+                String[] jbwArr = DictionaryKey.YJ_ZONE_JBW.get(zZone.getName()).split(",");
+                List<ProductionresourcePosition> jbwBList = productionresourcePositionService.getFreeProductionresourcePositionByNos(jbwArr);
+                if(targetStorge!=null&&CollectionUtil.isNotEmpty(jbwBList)){
+
+                    ProductionresourcePosition position = null;
+                    for(ProductionresourcePosition productionresourcePosition : jbwBList){
+                        if(!occupyAgvStations.contains(productionresourcePosition.getResourceId())){
+                            position = jbwBList.get(0);
+                            break;
+                        }
+                    }
+                    if(null!=position){
+                        agvEndStationStorge =storgeService.getById(position.getStorgeId());
 
-            // begin modify by yejian on 20220513 for agv动态查找满足抽检一个工序需多次调度agv问题
-            // 先找到处理节点下一节点agv起点地址
-            TaskNode lastAgvTaskNode = taskNodeService.getNextNTaskNode(taskNode,1);;
-            //获取接驳位。
-            Map map = storgeService.getPlateStorgeByNo(zZone);
-            targetStorge = map.get("storge") ==null?null:(Storge)map.get("storge");
-            String targetResourceId = map.get("resourceId") ==null?null:(String)map.get("resourceId");
-            // 在向下找agv终点位子
-            // 下一个节点机器人所属产线
-            TaskNode afterLastAgvTaskNode = taskNodeService.getNextNTaskNode(lastAgvTaskNode,1);
-            ZZoneProductionresource zoneProductionresource = zZoneProductionresourceMapper.selectOne(Wraps.<ZZoneProductionresource>lbQ().eq(ZZoneProductionresource::getResourceId,afterLastAgvTaskNode.getResourceId()));
-            //获取产线ID
-            zoneId = zoneProductionresource.getZoneId();
-            zZone = zoneService.getById(zoneId);
-            String[] jbwArr = DictionaryKey.YJ_ZONE_JBW.get(zZone.getName()).split(",");
-            List<ProductionresourcePosition> jbwBList = productionresourcePositionService.getFreeProductionresourcePositionByNos(jbwArr);
-            if(targetStorge!=null&&CollectionUtil.isNotEmpty(jbwBList)){
-                ProductionresourcePosition position = jbwBList.get(0);
-                agvEndStationStorge =storgeService.getById(position.getStorgeId());
+                        //更新到targetresourceid
+//                TaskNode nextTaskNode = taskNodeService.getNextNTaskNode(taskNode,1);
+                        taskNode.setTargetResourceId(Long.parseLong(targetResourceId));
+                        lastAgvTaskNode.setTargetResourceId(position.getResourceId());
+                        lastAgvTaskNode.setResourceId(taskNode.getTargetResourceId());
+                        taskNodeService.updateById(taskNode);
+                        taskNodeService.updateById(lastAgvTaskNode);
+
+                        if(!occupyAgvStations.contains(Long.valueOf(targetResourceId))){
+                            occupyAgvStations.add(Long.valueOf(targetResourceId));
+                        }
+                        if(!occupyAgvStations.contains(position.getResourceId())){
+                            occupyAgvStations.add(position.getResourceId());
+                        }
+                        msgUtil.redis_set(DemoCacheKey.DEMOLINE_AGV_STATION_OCCUPY,occupyAgvStations);
+                    }
 
-                returnMap.put("store",targetStorge);
-                returnMap.put("targetxbk","0");
+                    returnMap.put("store",targetStorge);
+                    returnMap.put("targetxbk","0");
 
-                //更新到targetresourceid
-//                TaskNode nextTaskNode = taskNodeService.getNextNTaskNode(taskNode,1);
-                taskNode.setTargetResourceId(Long.parseLong(targetResourceId));
-                lastAgvTaskNode.setTargetResourceId(position.getResourceId());
-                lastAgvTaskNode.setResourceId(taskNode.getTargetResourceId());
-                taskNodeService.updateById(taskNode);
-                taskNodeService.updateById(lastAgvTaskNode);
-            }else{//需要放到线边库
-                xbkFlag = "1";
+                }else{//需要放到线边库
+                    xbkFlag = "1";
+                }
             }
 
             // end modify by yejian on 20220513 for agv动态查找满足抽检一个工序需多次调度agv问题
@@ -703,7 +724,6 @@ public class RobotNodeServiceImpl implements NodeOperationService {
 
     /**
      * 立库获取终点位置,取空库位的数据
-     * @param task
      * @return
      */
     private long getLikuStockInList(){

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

@@ -139,7 +139,7 @@ public class MsgUtil implements ApplicationContextAware {
             //如果是三坐标检测
             if(callBackJson.containsKey("result")&&"NG".equals(callBackJson.getString("result"))){
                 //获取下料工序
-                List<BomProcedure> bomProcedureList = bomProcedureService.list(Wraps.<BomProcedure>lbQ().eq(BomProcedure::getBomId,task.getBomId()).orderByAsc(BomProcedure::getSort));
+                List<BomProcedure> bomProcedureList = bomProcedureService.list(Wraps.<BomProcedure>lbQ().eq(BomProcedure::getBomId,task.getBomId()).eq(BomProcedure::getType,"下料").orderByAsc(BomProcedure::getSort));
                 if(CollectionUtil.isNotEmpty(bomProcedureList)){
                     //获取下料序的第一个节点
                     List<TaskNode> taskNodes = taskNodeService.list(Wraps.<TaskNode>lbQ().eq(TaskNode::getProcedureId,bomProcedureList.get(0).getId()).orderByAsc(TaskNode::getCompleteBatchSort));

+ 3 - 4
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/operationManagementCenter/PlanMapper.xml

@@ -189,11 +189,10 @@
             imcs_b_bom_procedure ibbp,
             (SELECT
                 ibbpt.procedure_id AS procedureId,
-                ibbpt.resource_id AS resourceId,
+                ibbpp.resource_id AS resourceId,
                 GROUP_CONCAT(ibbpt.tool_name) AS needCuttingTools
-                FROM imcs_b_bom_procedure_tool ibbpt
-                GROUP BY ibbpt.procedure_id,
-                ibbpt.resource_id) produceCuttingTools left join
+            FROM imcs_b_bom_procedure_tool ibbpt,imcs_b_bom_procedure_program ibbpp WHERE ibbpt.program_id = ibbpp.id
+            GROUP BY ibbpt.procedure_id,ibbpt.resource_id) produceCuttingTools left join
             (SELECT
                 icc.machine_id AS resourceId,
                 GROUP_CONCAT(icc.cutting_tool_name) AS hasCuttingTools

+ 2 - 4
imcs-admin-boot/imcs-common/src/main/java/com/github/zuihou/common/constant/DictionaryKey.java

@@ -1,8 +1,6 @@
 package com.github.zuihou.common.constant;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 
 /**
@@ -148,5 +146,5 @@ public interface DictionaryKey {
             put("safeguard", new HashMap<String,String>(){{put("url", "192.168.170.130");put("port", "102");}});
         }
     };
-
+    List<Long> CHECK_AGV_STATION = new ArrayList<>();
 }