Răsfoiți Sursa

agv动态查找逻辑修改,接驳位常量造成动态查找问题修改

yejian 3 ani în urmă
părinte
comite
63db56b41a

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

@@ -268,7 +268,9 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
         String jbw = DictionaryKey.YJ_ZONE_JBW.get(zZone.getName());
         map.put("codes",StringUtil.changeIdsArrToSubQueryStr(jbw));
         map.put("haveGoods","1");
+        map.put("findAgvStation","1");
         List<ProductionresourcePosition>jbwList = productionresourcePositionMapper.getPPList(map);
+        log.info("查找起点接驳位{}",jbwList);
         if(jbwList!=null&&jbwList.size()>0){
 //            //查出当前工件属于产线的托板
 //            Map<Long,Plate> plateMap = getPlate(zZone.getId().toString());
@@ -288,6 +290,7 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
                 }
             }
             //拼凑出托板列表,一起查询提高效率,避免循环查询
+            log.info("查找起点可用接驳位{}",tbList);
             if(tbList!=null&&tbList.size()>0){
 //                //托板的编号和”托板生产资源“一致
 //                List<String>tbIdList = tbList.stream().map(t->t.getUniqueCode().toString()).collect(Collectors.toList());
@@ -310,7 +313,7 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
                     position = productionresourcePosition;
                     break;
                 }
-
+                log.info("确定起点可用接驳位{}",position);
                 if(null != position){
                     storge = baseMapper.selectById(position.getStorgeId());
                     resourceId = position.getResourceId()==null?"":position.getResourceId().toString();

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

@@ -51,6 +51,7 @@ import com.github.zuihou.tenant.service.ModuleInstructionService;
 import com.github.zuihou.tenant.service.ModuleService;
 import com.google.common.collect.Maps;
 import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
+import lombok.extern.slf4j.Slf4j;
 import net.sf.jsqlparser.statement.select.KSQLWindow;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -71,7 +72,6 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
 import static java.util.stream.Collectors.groupingBy;
-
 @Component
 public class TaskWorkNode {
     @Autowired
@@ -276,20 +276,40 @@ public class TaskWorkNode {
                 if (null == conMap) {
                     throw new RuntimeException("执行超时或执行设备状态异常");
                 }
+                logger.info("最终检查结果conMap=" + conMap);
                 msgUtil.redis_set_map(CacheKey.TASK_CURRENT_NODE_CONDITION + "_" + taskNode.getId(), conMap);
-
                 if ("03".equals(taskNode.getInterfaceType())) {
-                    TaskNode beforTaskNode = taskNodeService.getNextNTaskNode(taskNode, -1);
-                    // agv搬运
-                    Map agvData = new HashMap();
-                    agvData.put("start", conMap.get("start"));
-                    agvData.put("goal", conMap.get("goal"));
-                    agvData.put("taskId", tTask.getId().toString());
-                    agvData.put("taskNodeId", taskNode.getId().toString());
-                    String jsonParam = getRequestParam(conMap);
-                    //缓存执行当前节点传参
-                    msgUtil.redis_set(CacheKey.TASK_CURRENT_NODE_PARAMS + "_" + taskNode.getId(), jsonParam);
-                    agvHikOrderInfoService.addHikTask(agvData);
+                    // 执行线边库操作
+                    if("1".equals(conMap.get("targetxbk"))){
+                        //组装接口参数
+                        HttpHeaders headers = new HttpHeaders();
+                        headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));
+                        String jsonParam = getRequestParam(conMap);
+                        //缓存执行当前节点传参
+                        msgUtil.redis_set(CacheKey.TASK_CURRENT_NODE_PARAMS + "_" + taskNode.getId(), jsonParam);
+                        HttpEntity<String> formEntity = new HttpEntity<String>(jsonParam, headers);
+
+                        //动态调用接口和新增指令执行时间
+                        log.setZoneId(zZone.getId()).setMethod(conMap.get("method").toString()).setExecuteTime(new Date());
+                        String instructionUrl = DictionaryKey.INSTRUCTION_URL + "/api/" + conMap.get("method").toString();
+                        System.out.println("instructionUrl=" + instructionUrl);
+                        System.out.println("jsonParam=" + jsonParam);
+                        returnData = restTemplate.postForObject(instructionUrl, formEntity, String.class);
+
+                        logger.info("returnData=", returnData);
+                    }else{
+                        TaskNode beforTaskNode = taskNodeService.getNextNTaskNode(taskNode, -1);
+                        // agv搬运
+                        Map agvData = new HashMap();
+                        agvData.put("start", conMap.get("start"));
+                        agvData.put("goal", conMap.get("goal"));
+                        agvData.put("taskId", tTask.getId().toString());
+                        agvData.put("taskNodeId", taskNode.getId().toString());
+                        String jsonParam = getRequestParam(conMap);
+                        //缓存执行当前节点传参
+                        msgUtil.redis_set(CacheKey.TASK_CURRENT_NODE_PARAMS + "_" + taskNode.getId(), jsonParam);
+                        agvHikOrderInfoService.addHikTask(agvData);
+                    }
                 } else {
                     //组装接口参数
                     HttpHeaders headers = new HttpHeaders();
@@ -669,19 +689,18 @@ public class TaskWorkNode {
 //                //目标地址和类型
 //                targetStorge = workpieceService.getWorkPieceTargetStock(taskNode.getId());
 
-//                TaskNode nextTaskNode = taskNodeService.getNextNTaskNode(taskNode, 1);
-                Map returnMap = getTargetStorge(taskNode, taskNode.getFindAgvFlag(), zone);
-
-                targetStorge = returnMap.get("store") == null ? null : (Storge) returnMap.get("store");
-                Storge agvEndStationStorge = returnMap.get("agvEndStationStorge") == null ? null : (Storge) returnMap.get("agvEndStationStorge");
+                TaskNode nextTaskNode = taskNodeService.getNextNTaskNode(taskNode, 1);
 
 //                jqrStorge = storgeService.getById(robotList.get(0).getStorgeId());
 
                 Storge startStore = workpieceService.getWorkPieceStock(taskNode.getCompleteBatchNo(), false);
 
-                ProductionresourcePosition po = logical(robotList, targetStorge,dataMap);
+                ProductionresourcePosition po = logical(robotList,dataMap);
                 //机器人手抓没被锁定,并且有空闲未知
                 if (po != null) {
+                    Map returnMap = getTargetStorge(nextTaskNode, taskNode.getFindAgvFlag(), zone);
+                    targetStorge = returnMap.get("store") == null ? null : (Storge) returnMap.get("store");
+
                     jqrStorge = storgeService.getById(jqrMap.get(DemoLineConstant.DEMOLINE_RJQR_ZS).get(0).getStorgeId());
                     jqrStorge.setCompleteBatchNo(task.getCompleteBatchNo());
                     storgeService.lockStorge(jqrStorge, taskNode.getId());
@@ -873,6 +892,33 @@ public class TaskWorkNode {
         return returnMap;
     }
 
+    /**
+     * 设备动态逻辑判断处理
+     *
+     * @param robotList
+     * @return
+     */
+    public ProductionresourcePosition logical(List<ProductionresourcePosition> robotList, Map<String, Object> dataMap) {
+        ZZone zone = dataMap.get("zone") == null ? null : (ZZone) dataMap.get("zone");
+        ZZone bomzZone = dataMap.get("bomzZone") == null ? null : (ZZone) dataMap.get("bomzZone");
+        //自动模式下,如果下个节点是上下料站,不让走下去
+        if(bomzZone!=null&&"1".equals(bomzZone.getRunMode())){//自动模式,
+            return null;
+        }
+
+        //设备不存在
+        if (checkRobot(robotList, zone.getName())) {
+            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);
+    }
+
     /**
      * 设备动态逻辑判断处理
      *

+ 2 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/productionResourceCenter/service/ProductionresourcePositionService.java

@@ -70,6 +70,8 @@ public interface ProductionresourcePositionService extends SuperService<Producti
      */
     List<ProductionresourcePosition>getFreeProductionresourcePositionByNos(String [] noArr);
 
+    List<ProductionresourcePosition> getFreeProductionresourceAgvPositionByNos(String [] noArr);
+
     List<ProductionresourcePosition>getFreeProductionresourcePositionByIds(String [] idArr);
 
     /**

+ 10 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/productionResourceCenter/service/impl/ProductionresourcePositionServiceImpl.java

@@ -294,6 +294,16 @@ public class ProductionresourcePositionServiceImpl extends SuperServiceImpl<Prod
         return list;
     }
 
+    @Override
+    public List<ProductionresourcePosition> getFreeProductionresourceAgvPositionByNos(String [] noArr){
+        Map map = new HashMap();
+        map.put("codes",StringUtil.changeIdsArrToSubQueryStr(noArr));
+        map.put("freeFlag","1");
+        map.put("findAgvStation","1");
+        List<ProductionresourcePosition>list = baseMapper.getPPList(map);
+        return list;
+    }
+
     @Override
     public List<ProductionresourcePosition> getFreeProductionresourcePositionByIds(String[] idArr) {
         Map sxlzmap = new HashMap();

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

@@ -286,17 +286,17 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                         startStore = storgeMapper.selectById(flikustockInfos.get(0).getStorgeId());
                     }
 
-                    //目标库位,可能是
-                    Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
-                    //目标地址和类型
-                    Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
-                    String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
-
-
-                    ProductionresourcePosition po = logical(robotList,targetStorge,flikustockInfos,taskNode);
-                    //机器人手抓没被锁定,并且有空闲未知
-
+                    // begin modify by yejian on 20220510 for 条件检验先检查机器人,在检查目标库位
+                    ProductionresourcePosition po = logical(robotList,flikustockInfos,taskNode);
+                    log.info("节点{}检查机器人资源条件返回{}",taskNode.getId(),po);
                     if (po!=null) {
+                        // 机器人可用,判断目标地址
+                        //目标库位,可能是
+                        Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
+                        log.info("节点{}检查目标库位是否满足返回{}",taskNode.getId(),returnMap);
+                        //目标地址和类型
+                        Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
+                        String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
                         jqrStorge = storgeService.getById(jqrMap.get(DemoLineConstant.DEMOLINE_RJQR_ZS).get(0).getStorgeId());
                         jqrStorge.setCompleteBatchNo(task.getCompleteBatchNo());
                         storgeService.lockStorge(jqrStorge, nextTaskNode.getId());
@@ -327,8 +327,10 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                         locationMap.put("location",startStore.getPointId());
                         dataMap.put("data", locationMap);
                         dataMap.put("method", "MoveRobotPosition");
+                        dataMap.put("result", true);
                     }
                     dataMap.put("result", po!=null);
+
                 } else if (count == 1) {
                     jqrStorge = (Storge) msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + YunjianConstant.YUNJIAN_JXS + taskNode.getId());
                     dataMap.put("method", "GetFlexibleWire");
@@ -361,22 +363,21 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                 }
             }else if (BizConstant.ROBOT_TYPE_NOCACHE.equals(zoneService.getRobotTypebyZone(zoneName))) {
                 TaskNode nextTaskNode = taskNodeService.getNextNTaskNode(taskNode, 1);
-                Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
 
                 //获取当前位置
                 if(CollectionUtil.isNotEmpty(flikustockInfos)){//
                     startStore = storgeMapper.selectById(flikustockInfos.get(0).getStorgeId());
                 }
-
-                //目标地址和类型
-                Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
-                String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
-                Storge agvEndStationStorge = returnMap.get("agvEndStationStorge")==null?null:(Storge)returnMap.get("agvEndStationStorge");
-
                 dataMap.put("method", "GetServoStacker");
-                ProductionresourcePosition po = logical(robotList,targetStorge,flikustockInfos,taskNode);
-
-                if (po!=null) {//机器人只有一只手
+                // begin modify by yejian on 20220510 for 条件检验先检查机器人,在检查目标库位
+                ProductionresourcePosition po = logical(robotList,flikustockInfos,taskNode);
+                log.info("节点{}检查机器人资源条件返回{}",taskNode.getId(),po);
+                if (po!=null) {
+                    Map returnMap = getTargetStorge(nextTaskNode,taskNode.getFindAgvFlag(),bomProcedure.getType());
+                    log.info("节点{}检查目标库位是否满足返回{}",taskNode.getId(),returnMap);
+                    //目标地址和类型
+                    Storge targetStorge = returnMap.get("store")==null?null:(Storge)returnMap.get("store");
+                    String targetxbk = returnMap.get("targetxbk")==null?null:(String)returnMap.get("targetxbk");
                     jqrStorge = storgeService.getById(robotList.get(0).getStorgeId());
 
                     dataMap.put("fromStorge", startStore);
@@ -413,8 +414,9 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                     //目标是线边库
                     msgUtil.redis_set(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_XBK_FLAG + nextTaskNode.getId(), targetxbk, 1, TimeUnit.DAYS);
                     dataMap.put("result", true);
+                }else{
+                    dataMap.put("result", po!=null);
                 }
-                dataMap.put("result", po!=null);
             }
         }else if ("放".equals(functionName)) {
             Storge targetStorge = msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_STORE + taskNode.getId())==null?null:(Storge)msgUtil.redis_get(DemoCacheKey.YUNJIAN_CAMP + "_" + DemoLineConstant.YUNJIAN_TARGET_STORE + taskNode.getId());
@@ -520,6 +522,8 @@ public class RobotNodeServiceImpl implements NodeOperationService {
             TaskNode lastAgvTaskNode = taskNodeService.getNextNTaskNode(taskNode,1);;
             //获取接驳位。agvEndStationStorge
             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终点位子
@@ -530,7 +534,8 @@ public class RobotNodeServiceImpl implements NodeOperationService {
             zoneId = zoneProductionresource.getZoneId();
             zZone = zoneService.getById(zoneId);
             String[] jbwArr = DictionaryKey.YJ_ZONE_JBW.get(zZone.getName()).split(",");
-            List<ProductionresourcePosition> jbwBList = productionresourcePositionService.getFreeProductionresourcePositionByNos(jbwArr);
+            List<ProductionresourcePosition> jbwBList = productionresourcePositionService.getFreeProductionresourceAgvPositionByNos(jbwArr);
+            log.info("节点{},查询终点接驳位接驳位数量{}",taskNode.getId(),jbwBList);
             if(targetStorge!=null&&CollectionUtil.isNotEmpty(jbwBList)){
 
                 ProductionresourcePosition position = null;
@@ -538,9 +543,9 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                     position = productionresourcePosition;
                     break;
                 }
+                log.info("节点{},查询到起点接驳位{}",taskNode.getId(),position);
                 if(null!=position){
                     agvEndStationStorge =storgeService.getById(position.getStorgeId());
-
                     //更新到targetresourceid
 //                TaskNode nextTaskNode = taskNodeService.getNextNTaskNode(taskNode,1);
                     taskNode.setTargetResourceId(Long.parseLong(targetResourceId));
@@ -548,6 +553,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                     lastAgvTaskNode.setResourceId(taskNode.getTargetResourceId());
                     taskNodeService.updateById(taskNode);
                     taskNodeService.updateById(lastAgvTaskNode);
+                    log.info("节点{},更新相应节点接驳位信息完成",taskNode.getId());
                 }
 
                 returnMap.put("store",targetStorge);
@@ -603,6 +609,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                 //目标设备
                 if(resourceId!=null){
                     targetList = productionresourcePositionService.getFreeProductionresourcePositionByIds(new String[] {resourceId.toString()});
+                    log.info("节点{},查找目标设备可用信息{}",taskNode.getId(),targetList);
                     if(CollectionUtil.isNotEmpty(targetList)){
                         targetStorge = storgeService.getById(targetList.get(0).getStorgeId());
                         returnMap.put("store",targetStorge);
@@ -625,6 +632,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
             //获取机器人操作线边库
             xbkArr = DictionaryKey.YJ_ZONE_XBK.get(zoneName).split(",");
             xbkList = productionresourcePositionService.getFreeProductionresourcePositionByNos(xbkArr);
+            log.info("查找线边库库位{}",xbkList);
             if(CollectionUtil.isNotEmpty(xbkList)){
                 ProductionresourcePosition position = xbkList.get(0);
                 targetStorge = storgeService.getById(position.getStorgeId());
@@ -642,7 +650,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
      * @param robotList
      * @return
      */
-    public ProductionresourcePosition logical(List<ProductionresourcePosition> robotList,Storge targetStorge,List<StockInfo>flikustockInfos,TaskNode taskNode){
+    public ProductionresourcePosition logical(List<ProductionresourcePosition> robotList,List<StockInfo>flikustockInfos,TaskNode taskNode){
         if(taskNode.getCompleteBatchSort()==1){
             if(CollectionUtil.isEmpty(flikustockInfos)){
                 return null;
@@ -661,10 +669,10 @@ public class RobotNodeServiceImpl implements NodeOperationService {
             return null;
         }
 
-        if(targetStorge==null){
-//            map.put("msg", DictionaryKey.NodeException.NO_RESOURCE);
-            return null;
-        }
+//        if(targetStorge==null){
+////            map.put("msg", DictionaryKey.NodeException.NO_RESOURCE);
+//            return null;
+//        }
 
         return robotList.get(0);
     }

+ 4 - 0
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/productionResourceCenter/ProductionresourcePositionMapper.xml

@@ -80,6 +80,10 @@
         <if test="pointId != null and pointId != ''">
             and p.point_id = #{pointId}
         </if>
+        <if test="findAgvStation != null and findAgvStation != ''">
+            and r.id not in (select ittn.target_resource_id from imcs_t_task_node ittn where ittn.exe_status != 3 AND ittn.target_resource_id IS NOT null)
+            and r.name like '%接驳%'
+        </if>
     </select>
     <select id="getStorgeIdByResource" resultType="com.github.zuihou.business.productionResourceCenter.entity.ProductionresourcePosition">
         select * from imcs_p_productionresource_position where 1=1

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

@@ -16,7 +16,7 @@ public interface DictionaryKey {
     //线边库最大库位数
     final Integer RESOURCE_MAX_NUM = 20;
     //指定接口URL地址
-    final String INSTRUCTION_URL = "http://106.15.38.8:8100/";
+    final String INSTRUCTION_URL = "http://106.15.38.8:8090/";
     //PLC
     String INTERFACETYPE_PLC = "01";
     //生产加工接口
@@ -134,7 +134,7 @@ public interface DictionaryKey {
 
     Map<String, String> YJ_ZONE_JBW = new HashMap<String, String>(){
         {
-            put("智能生产保障系统", "BZ_361,BZ_361,BZ_361");
+            put("智能生产保障系统", "BZ_361,BZ_362,BZ_363");
             put("框体类加工单元", "KT_121,KT_122");
             put("舱体类加工单元", "CT_121,CT_122");
         }