From 5ce35462885d01b158df729d1ffb4068c31591d2 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期一, 04 十一月 2024 15:44:00 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java |   98 ++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 84 insertions(+), 14 deletions(-)

diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java
index a7fdc00..d52e290 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java
@@ -1,24 +1,25 @@
 package com.zy.acs.manager.core.service;
 
+import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.framework.common.Cools;
 import com.zy.acs.common.utils.Utils;
 import com.zy.acs.manager.common.utils.MapDataUtils;
 import com.zy.acs.manager.core.constant.MapDataConstant;
+import com.zy.acs.manager.core.domain.Lane;
 import com.zy.acs.manager.core.service.astart.*;
+import com.zy.acs.manager.core.service.astart.domain.DynamicNode;
 import com.zy.acs.manager.manager.entity.Jam;
 import com.zy.acs.manager.manager.entity.Route;
 import com.zy.acs.manager.manager.service.AgvModelService;
 import com.zy.acs.manager.manager.service.AgvService;
 import com.zy.acs.manager.manager.service.CodeService;
 import com.zy.acs.manager.manager.service.RouteService;
+import com.zy.acs.manager.system.service.ConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.PriorityQueue;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -27,6 +28,10 @@
 @Slf4j
 @Service
 public class RetreatNavigateService {
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
+    public static final int WEIGHT_CALC_COEFFICIENT = 1000;
 
     @Autowired
     private CodeService codeService;
@@ -40,6 +45,10 @@
     private AgvService agvService;
     @Autowired
     private AgvModelService agvModelService;
+    @Autowired
+    private LaneService laneService;
+    @Autowired
+    private ConfigService configService;
 
     /**
      * avoidPathList ===>>  [ minor vehicle ] [wave] [ curr vehicle ] [ code2 ] [ code3 ] ......
@@ -50,6 +59,7 @@
             return null;
         }
         Integer lev = null;
+        Integer maxAgvCountInLane = configService.getVal("maxAgvCountInLane", Integer.class);
 
         String breakPoint = avoidPathList.stream().findFirst().orElse(null);
         List<String> blackList = Utils.singletonList(sponsor);
@@ -58,8 +68,8 @@
                 , MapDataConstant.IDLE_DISTANCE_COE);
         List<String> avoidPathListWave = mapService.getWaveScopeByCodeList(lev, avoidPathList, avoidDistance);
 
+        DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(lev);
         String[][] waveMatrix = mapDataDispatcher.getWaveMatrix(lev);
-
 
 
         RetreatNavigateNode finialNode = null;
@@ -77,23 +87,51 @@
             List<RetreatNavigateNode> enableNodes = new ArrayList<>();
 
             ArrayList<RetreatNavigateNode> neighborNodes = this.getNeighborNodes(currentNode, existNodes);
-            for (RetreatNavigateNode node : neighborNodes) {
+            label: for (RetreatNavigateNode node : neighborNodes) {
                 if (node.getCodeData().equals(breakPoint)) { continue; }
 
                 int weight = 0;
 
+                // wave
                 String waveNode = waveMatrix[node.getX()][node.getY()];
                 assert !waveNode.equals(WaveNodeType.DISABLE.val);
                 if (!waveNode.equals(WaveNodeType.ENABLE.val)) {
                     List<String> waveNodeList = MapDataUtils.parseWaveNode(waveNode);
                     List<String> otherWaveList = MapDataUtils.hasOtherWave(waveNodeList, agvNo);
-                    if (!Cools.isEmpty(otherWaveList)) {
-
-                        if (!Cools.isEmpty(blackList) && 0 < Cools.getIntersection(otherWaveList, blackList).size()) {
-                            continue;
+                    for (String otherWave : otherWaveList) {
+                        if (!Cools.isEmpty(blackList) && blackList.contains(otherWave)) {
+                            continue label;
                         }
+                        if (1 < mapDataDispatcher.queryCodeListFromDynamicNode(lev, otherWave).size()) {
+                            continue label;
+                        } else {
+                            weight += WEIGHT_CALC_COEFFICIENT;
+                        }
+                    }
+                }
 
-                        weight += otherWaveList.size();
+                // lane
+                Lane lane = laneService.search(node.getCodeData());
+                if (null != lane) {
+                    Set<String> lanVehicleSet = new HashSet<>();
+
+                    List<String> laneCodes = lane.getCodes();
+                    for (String laneCodeData : laneCodes) {
+                        int[] laneCodeMatrixIdx = mapDataDispatcher.getCodeMatrixIdx(null, laneCodeData);
+                        // scan dynamicMatrix or WaveMatrix
+                        DynamicNode laneDynamicNode = dynamicMatrix[laneCodeMatrixIdx[0]][laneCodeMatrixIdx[1]];
+                        String laneVehicle = laneDynamicNode.getVehicle();
+                        assert !laneVehicle.equals(DynamicNodeType.BLOCK.val);
+                        if (!laneVehicle.equals(DynamicNodeType.ACCESS.val)) {
+                            if (!laneVehicle.equals(agvNo)) {
+                                lanVehicleSet.add(laneVehicle);
+//                                redis.setObject(RedisConstant.AGV_TO_STANDBY_FLAG, laneVehicle, true, 30);
+                            }
+                        }
+                    }
+
+                    if (lanVehicleSet.size() + 1 > maxAgvCountInLane) {
+                        continue;
                     }
                 }
 
@@ -144,18 +182,50 @@
                             .stream().map(NavigateNode::getCodeData).distinct().collect(Collectors.toList());
                 }
 
-                for (RetreatNavigateNode node : neighborNodes) {
+                label: for (RetreatNavigateNode node : neighborNodes) {
 
                     int weight = 0;
 
+                    // wave
                     String waveNode = waveMatrix[node.getX()][node.getY()];
                     assert !waveNode.equals(WaveNodeType.DISABLE.val);
                     if (!waveNode.equals(WaveNodeType.ENABLE.val)) {
                         List<String> waveNodeList = MapDataUtils.parseWaveNode(waveNode);
                         List<String> otherWaveList = MapDataUtils.hasOtherWave(waveNodeList, agvNo);
-                        if (!Cools.isEmpty(otherWaveList)) {
+                        for (String otherWave : otherWaveList) {
+                            if (!Cools.isEmpty(blackList) && blackList.contains(otherWave)) {
+                                continue;
+                            }
+                            if (1 < mapDataDispatcher.queryCodeListFromDynamicNode(lev, otherWave).size()) {
+                                continue label;
+                            } else {
+                                weight += WEIGHT_CALC_COEFFICIENT;
+                            }
+                        }
+                    }
 
-                            weight += otherWaveList.size();
+                    // lane
+                    Lane lane = laneService.search(node.getCodeData());
+                    if (null != lane) {
+                        Set<String> lanVehicleSet = new HashSet<>();
+
+                        List<String> laneCodes = lane.getCodes();
+                        for (String laneCodeData : laneCodes) {
+                            int[] laneCodeMatrixIdx = mapDataDispatcher.getCodeMatrixIdx(null, laneCodeData);
+                            // scan dynamicMatrix or WaveMatrix
+                            DynamicNode laneDynamicNode = dynamicMatrix[laneCodeMatrixIdx[0]][laneCodeMatrixIdx[1]];
+                            String laneVehicle = laneDynamicNode.getVehicle();
+                            assert !laneVehicle.equals(DynamicNodeType.BLOCK.val);
+                            if (!laneVehicle.equals(DynamicNodeType.ACCESS.val)) {
+                                if (!laneVehicle.equals(agvNo)) {
+                                    lanVehicleSet.add(laneVehicle);
+//                                redis.setObject(RedisConstant.AGV_TO_STANDBY_FLAG, laneVehicle, true, 30);
+                                }
+                            }
+                        }
+
+                        if (lanVehicleSet.size() + 1 > maxAgvCountInLane) {
+                            continue;
                         }
                     }
 

--
Gitblit v1.9.1