|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.alibaba.fastjson.JSON; | 
|---|
|  |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
|---|
|  |  |  | import com.zy.acs.framework.common.Cools; | 
|---|
|  |  |  | import com.zy.acs.framework.exception.CoolException; | 
|---|
|  |  |  | import com.zy.acs.common.constant.RedisConstant; | 
|---|
|  |  |  | import com.zy.acs.common.utils.RedisSupport; | 
|---|
|  |  |  | import com.zy.acs.framework.common.Cools; | 
|---|
|  |  |  | import com.zy.acs.framework.exception.CoolException; | 
|---|
|  |  |  | import com.zy.acs.manager.common.utils.MapDataUtils; | 
|---|
|  |  |  | import com.zy.acs.manager.core.service.astart.domain.DynamicNode; | 
|---|
|  |  |  | import com.zy.acs.manager.core.utils.RouteGenerator; | 
|---|
|  |  |  | import com.zy.acs.manager.manager.entity.Code; | 
|---|
|  |  |  | import com.zy.acs.manager.manager.entity.Route; | 
|---|
|  |  |  | import com.zy.acs.manager.manager.enums.StatusType; | 
|---|
|  |  |  | import com.zy.acs.manager.manager.service.CodeService; | 
|---|
|  |  |  | import com.zy.acs.manager.manager.service.RouteService; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | import java.util.Optional; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * Created by vincent on 6/6/2024 | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private final RedisSupport redis = RedisSupport.defaultRedisSupport; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static final Boolean CACHE_CODE_MATRIX = Boolean.FALSE; | 
|---|
|  |  |  | List<Double> xIdxList; | 
|---|
|  |  |  | List<Double> yIdxList; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private String[][] codeMatrix; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static final Boolean CACHE_MAP_MATRIX = Boolean.FALSE; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private int[][] mapMatrix; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static final Boolean CACHE_TURN_MATRIX = Boolean.FALSE; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private int[][] turnMatrix; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static final Boolean CACHE_CDA_MATRIX = Boolean.FALSE; | 
|---|
|  |  |  | private Double[][][] cdaMatrix; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private String[][] cdaMatrix; | 
|---|
|  |  |  | public Map<String, Boolean> routeCdaMap = new HashMap<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private final CodeService codeService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | redis.setValue(RedisConstant.AGV_MAP_ASTAR_DYNAMIC_FLAG, String.valueOf(lev), JSON.toJSONString(dynamicMatrix)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public String[][] getCdaMatrix(Integer lev) { | 
|---|
|  |  |  | public Double[][][] getCdaMatrix(Integer lev) { | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  | String[][] cdaMatrix; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!CACHE_CDA_MATRIX) { | 
|---|
|  |  |  | if (null == this.cdaMatrix) { | 
|---|
|  |  |  | cdaMatrix = this.initCdaMatrix(lev); | 
|---|
|  |  |  | setCdaMatrix(lev, cdaMatrix); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | cdaMatrix = this.cdaMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // redis | 
|---|
|  |  |  | if (null == this.cdaMatrix) { | 
|---|
|  |  |  | String cdaMatrixStr = redis.getValue(RedisConstant.AGV_MAP_ASTAR_CDA_FLAG, String.valueOf(lev)); | 
|---|
|  |  |  | if (Cools.isEmpty(cdaMatrixStr)) { | 
|---|
|  |  |  | cdaMatrix = this.initCdaMatrix(lev); | 
|---|
|  |  |  | setCdaMatrix(lev, cdaMatrix); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | cdaMatrix = JSON.parseObject(cdaMatrixStr, String[][].class); | 
|---|
|  |  |  | if (!Cools.isEmpty(cdaMatrixStr)) { | 
|---|
|  |  |  | String[][] cdaStrMatrix = JSON.parseObject(cdaMatrixStr, String[][].class); | 
|---|
|  |  |  | this.cdaMatrix = MapDataUtils.preComputeCdaMatrix(cdaStrMatrix); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == cdaMatrix) { | 
|---|
|  |  |  | // init | 
|---|
|  |  |  | if (null == this.cdaMatrix) { | 
|---|
|  |  |  | String[][] initCdaMatrix = this.initCdaMatrix(lev); | 
|---|
|  |  |  | setCdaMatrix(lev, initCdaMatrix); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // valid | 
|---|
|  |  |  | if (null == this.cdaMatrix) { | 
|---|
|  |  |  | throw new CoolException("the floor " + lev + " cannot found cda matrix !!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return cdaMatrix; | 
|---|
|  |  |  | return this.cdaMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void setCdaMatrix(Integer lev, String[][] cdaMatrix) { | 
|---|
|  |  |  | if (!CACHE_CDA_MATRIX) { | 
|---|
|  |  |  | this.cdaMatrix = cdaMatrix; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | redis.setValue(RedisConstant.AGV_MAP_ASTAR_CDA_FLAG, String.valueOf(lev), JSON.toJSONString(cdaMatrix)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | public void setCdaMatrix(Integer lev, String[][] cdaStrMatrix) { | 
|---|
|  |  |  | redis.setValue(RedisConstant.AGV_MAP_ASTAR_CDA_FLAG, String.valueOf(lev), JSON.toJSONString(cdaStrMatrix)); | 
|---|
|  |  |  | this.cdaMatrix = MapDataUtils.preComputeCdaMatrix(cdaStrMatrix); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public int[][] getTurnMatrix(Integer lev) { | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  | int[][] turnMatrix; | 
|---|
|  |  |  | if (!CACHE_TURN_MATRIX) { | 
|---|
|  |  |  | if (null == this.turnMatrix) { | 
|---|
|  |  |  | turnMatrix = this.initTurnMatrix(lev); | 
|---|
|  |  |  | setTurnMatrix(lev, turnMatrix); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | turnMatrix = this.turnMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // redis | 
|---|
|  |  |  | if (null == this.turnMatrix) { | 
|---|
|  |  |  | String turnMatrixStr = redis.getValue(RedisConstant.AGV_MAP_ASTAR_TURN_FLAG, String.valueOf(lev)); | 
|---|
|  |  |  | if (Cools.isEmpty(turnMatrixStr)) { | 
|---|
|  |  |  | turnMatrix = this.initTurnMatrix(lev); | 
|---|
|  |  |  | setTurnMatrix(lev, turnMatrix); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | turnMatrix = JSON.parseObject(turnMatrixStr, int[][].class); | 
|---|
|  |  |  | if (!Cools.isEmpty(turnMatrixStr)) { | 
|---|
|  |  |  | this.turnMatrix = JSON.parseObject(turnMatrixStr, int[][].class); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == turnMatrix) { | 
|---|
|  |  |  | // init | 
|---|
|  |  |  | if (null == this.turnMatrix) { | 
|---|
|  |  |  | int[][] initTurnMatrix = this.initTurnMatrix(lev); | 
|---|
|  |  |  | setTurnMatrix(lev, initTurnMatrix); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // valid | 
|---|
|  |  |  | if (null == this.turnMatrix) { | 
|---|
|  |  |  | throw new CoolException("the floor " + lev + " cannot found turn matrix !!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return turnMatrix; | 
|---|
|  |  |  | return this.turnMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void setTurnMatrix(Integer lev, int[][] turnMatrix) { | 
|---|
|  |  |  | if (!CACHE_TURN_MATRIX) { | 
|---|
|  |  |  | this.turnMatrix = turnMatrix; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | redis.setValue(RedisConstant.AGV_MAP_ASTAR_TURN_FLAG, String.valueOf(lev), JSON.toJSONString(turnMatrix)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | redis.setValue(RedisConstant.AGV_MAP_ASTAR_TURN_FLAG, String.valueOf(lev), JSON.toJSONString(turnMatrix)); | 
|---|
|  |  |  | this.turnMatrix = turnMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public int[][] getMapMatrix(Integer lev, List<String> lockNodes) { | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  | int[][] mapMatrix; | 
|---|
|  |  |  | if (!CACHE_MAP_MATRIX) { | 
|---|
|  |  |  | if (null == this.mapMatrix) { | 
|---|
|  |  |  | mapMatrix = this.initMapMatrix(lev); | 
|---|
|  |  |  | setMapMatrix(lev, mapMatrix); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | mapMatrix = this.mapMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // redis | 
|---|
|  |  |  | if (null == this.mapMatrix) { | 
|---|
|  |  |  | String mapMatrixStr = redis.getValue(RedisConstant.AGV_MAP_ASTAR_FLAG, String.valueOf(lev)); | 
|---|
|  |  |  | if (Cools.isEmpty(mapMatrixStr)) { | 
|---|
|  |  |  | mapMatrix = this.initMapMatrix(lev); | 
|---|
|  |  |  | setMapMatrix(lev, mapMatrix); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | mapMatrix = JSON.parseObject(mapMatrixStr, int[][].class); | 
|---|
|  |  |  | if (!Cools.isEmpty(mapMatrixStr)) { | 
|---|
|  |  |  | this.mapMatrix = JSON.parseObject(mapMatrixStr, int[][].class); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == mapMatrix) { | 
|---|
|  |  |  | // init | 
|---|
|  |  |  | if (null == this.mapMatrix) { | 
|---|
|  |  |  | int[][] initMapMatrix = this.initMapMatrix(lev); | 
|---|
|  |  |  | setMapMatrix(lev, initMapMatrix); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // valid | 
|---|
|  |  |  | if (null == this.mapMatrix) { | 
|---|
|  |  |  | throw new CoolException("the floor " + lev + " cannot found map matrix !!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!Cools.isEmpty(lockNodes)) { | 
|---|
|  |  |  | mapMatrix = filterMapData(mapMatrix, lev, lockNodes); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return mapMatrix; | 
|---|
|  |  |  | return this.mapMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void setMapMatrix(Integer lev, int[][] mapMatrix) { | 
|---|
|  |  |  | if (!CACHE_MAP_MATRIX) { | 
|---|
|  |  |  | this.mapMatrix = mapMatrix; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | redis.setValue(RedisConstant.AGV_MAP_ASTAR_FLAG, String.valueOf(lev), JSON.toJSONString(mapMatrix)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | redis.setValue(RedisConstant.AGV_MAP_ASTAR_FLAG, String.valueOf(lev), JSON.toJSONString(mapMatrix)); | 
|---|
|  |  |  | this.mapMatrix = mapMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public String[][] getCodeMatrix(Integer lev) { | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  | String[][] codeMatrix; | 
|---|
|  |  |  | if (!CACHE_CODE_MATRIX) { | 
|---|
|  |  |  | if (null == this.codeMatrix) { | 
|---|
|  |  |  | codeMatrix = this.initCodeMatrix(lev); | 
|---|
|  |  |  | setCodeMatrix(lev, codeMatrix); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | codeMatrix = this.codeMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // redis | 
|---|
|  |  |  | if (null == this.codeMatrix) { | 
|---|
|  |  |  | String codeMatrixStr = redis.getValue(RedisConstant.AGV_MAP_ASTAR_CODE_FLAG, String.valueOf(lev)); | 
|---|
|  |  |  | if (Cools.isEmpty(codeMatrixStr)) { | 
|---|
|  |  |  | codeMatrix = this.initCodeMatrix(lev); | 
|---|
|  |  |  | setCodeMatrix(lev, codeMatrix); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | codeMatrix = JSON.parseObject(codeMatrixStr, String[][].class); | 
|---|
|  |  |  | if (!Cools.isEmpty(codeMatrixStr)) { | 
|---|
|  |  |  | this.codeMatrix = JSON.parseObject(codeMatrixStr, String[][].class); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == codeMatrix) { | 
|---|
|  |  |  | // init | 
|---|
|  |  |  | if (null == this.codeMatrix) { | 
|---|
|  |  |  | String[][] initCodeMatrix = this.initCodeMatrix(lev); | 
|---|
|  |  |  | setCodeMatrix(lev, initCodeMatrix); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // valid | 
|---|
|  |  |  | if (null == this.codeMatrix) { | 
|---|
|  |  |  | throw new CoolException("the floor " + lev + " cannot found code matrix !!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return codeMatrix; | 
|---|
|  |  |  | return this.codeMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void setCodeMatrix(Integer lev, String[][] codeMatrix) { | 
|---|
|  |  |  | if (!CACHE_CODE_MATRIX) { | 
|---|
|  |  |  | this.codeMatrix = codeMatrix; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | redis.setValue(RedisConstant.AGV_MAP_ASTAR_CODE_FLAG, String.valueOf(lev), JSON.toJSONString(codeMatrix)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | redis.setValue(RedisConstant.AGV_MAP_ASTAR_CODE_FLAG, String.valueOf(lev), JSON.toJSONString(codeMatrix)); | 
|---|
|  |  |  | this.codeMatrix = codeMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public String[][] initWaveMatrix(Integer lev) { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public synchronized DynamicNode[][] initDynamicMatrix(Integer lev) { | 
|---|
|  |  |  | log.info("There is initializing Dynamic Matrix......"); | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String[][] codeMatrix = getCodeMatrix(lev); | 
|---|
|  |  |  | if (null == codeMatrix || codeMatrix.length == 0) { | 
|---|
|  |  |  | return new DynamicNode[0][0]; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | DynamicNode[][] dynamicMatrix = new DynamicNode[codeMatrix.length][codeMatrix[0].length]; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (int i = 0; i < codeMatrix.length; i++) { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public synchronized String[][] initCdaMatrix(Integer lev) { | 
|---|
|  |  |  | log.info("There is initializing Cda Matrix......"); | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (Cools.isEmpty(xIdxList, yIdxList)) { | 
|---|
|  |  |  | this.initCodeMatrix(lev); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String[][] codeMatrix = getCodeMatrix(lev); | 
|---|
|  |  |  | String[][] cdaMatrix = new String[codeMatrix.length][codeMatrix[0].length]; | 
|---|
|  |  |  | 
|---|
|  |  |  | for (int i = 0; i < codeMatrix.length; i++) { | 
|---|
|  |  |  | for (int j = 0; j < codeMatrix[i].length; j++) { | 
|---|
|  |  |  | if (CodeNodeType.NONE.val.equals(codeMatrix[i][j])) { | 
|---|
|  |  |  | cdaMatrix[i][j] = CdaNodeType.DISABLE.val; | 
|---|
|  |  |  | List<Double> cdaArr = new ArrayList<>(); | 
|---|
|  |  |  | cdaArr.add(xIdxList.get(j)); | 
|---|
|  |  |  | cdaArr.add(yIdxList.get(i)); | 
|---|
|  |  |  | cdaMatrix[i][j] = JSON.toJSONString(cdaArr); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | Code currCode = codeService.selectByData(codeMatrix[i][j]); | 
|---|
|  |  |  | Code currCode = codeService.getCacheByData(codeMatrix[i][j]); | 
|---|
|  |  |  | if (null != currCode) { | 
|---|
|  |  |  | List<Double> cdaArr = new ArrayList<>(); | 
|---|
|  |  |  | cdaArr.add(currCode.getX()); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public synchronized int[][] initTurnMatrix(Integer lev) { | 
|---|
|  |  |  | log.info("There is initializing Turn Matrix......"); | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String[][] codeMatrix = getCodeMatrix(lev); | 
|---|
|  |  |  | 
|---|
|  |  |  | if (CodeNodeType.NONE.val.equals(codeMatrix[i][j])) { | 
|---|
|  |  |  | turnMatrix[i][j] = TurnNodeType.NONE.val; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | Code currCode = codeService.selectByData(codeMatrix[i][j]); | 
|---|
|  |  |  | Code currCode = codeService.getCacheByData(codeMatrix[i][j]); | 
|---|
|  |  |  | List<String> neighborCodeList = routeService.findCodeDataOfSingle(currCode.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | switch (neighborCodeList.size()) { | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public synchronized int[][] initMapMatrix(Integer lev) { | 
|---|
|  |  |  | log.info("There is initializing Map Matrix......"); | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String[][] codeMatrix = getCodeMatrix(lev); | 
|---|
|  |  |  | 
|---|
|  |  |  | return mapMatrix; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public boolean validRouteCdaKey(String routeCdaKey) { | 
|---|
|  |  |  | if (Cools.isEmpty(routeCdaKey)) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Boolean result = this.routeCdaMap.get(routeCdaKey); | 
|---|
|  |  |  | if (null == result) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return result; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public synchronized void initRouteMap(Integer lev) { | 
|---|
|  |  |  | log.info("There is initializing Route Map......"); | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  | Set<String> routeKeys = redis.getMapKeys(RedisConstant.AGV_MAP_ROUTE_HASH_FLAG); | 
|---|
|  |  |  | Set<String> routeCdaKeys = redis.getMapKeys(RedisConstant.AGV_MAP_ROUTE_CDA_HASH_FLAG); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Route> routeList = routeService.list(new LambdaQueryWrapper<Route>().eq(Route::getStatus, StatusType.ENABLE.val)); | 
|---|
|  |  |  | if (routeKeys.size() == routeList.size() && routeKeys.size() == routeCdaKeys.size()) { | 
|---|
|  |  |  | for (String routeCdaKey : routeCdaKeys) { | 
|---|
|  |  |  | this.routeCdaMap.put(routeCdaKey, Boolean.TRUE); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (Route route : routeList) { | 
|---|
|  |  |  | Code startCode = codeService.getCacheById(route.getStartCode()); | 
|---|
|  |  |  | int[] startCodeIdx = getCodeMatrixIdx(lev, startCode.getData()); | 
|---|
|  |  |  | Code endCode = codeService.getCacheById(route.getEndCode()); | 
|---|
|  |  |  | int[] codeMatrixIdx = getCodeMatrixIdx(lev, endCode.getData()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String routeKey = RouteGenerator.generateRouteKey(startCode.getData(), endCode.getData()); | 
|---|
|  |  |  | if (Cools.isEmpty(routeKey)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | redis.setMap(RedisConstant.AGV_MAP_ROUTE_HASH_FLAG, routeKey, Boolean.TRUE); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String routeCdaKey = RouteGenerator.generateRouteCdaKey(startCodeIdx, codeMatrixIdx); | 
|---|
|  |  |  | if (Cools.isEmpty(routeCdaKey)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | redis.setMap(RedisConstant.AGV_MAP_ROUTE_CDA_HASH_FLAG, routeCdaKey, Boolean.TRUE); | 
|---|
|  |  |  | this.routeCdaMap.put(routeCdaKey, Boolean.TRUE); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public synchronized String[][] initCodeMatrix(Integer lev) { | 
|---|
|  |  |  | log.info("【ASTAR】正在计算矩阵数据......"); | 
|---|
|  |  |  | log.info("There is initializing Code Matrix......"); | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  | List<Code> codeList = codeService.list(new LambdaQueryWrapper<Code>() | 
|---|
|  |  |  | .eq(Code::getStatus, 1) | 
|---|
|  |  |  | .orderByAsc(Code::getY) | 
|---|
|  |  |  | .orderByAsc(Code::getX) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | //        int xCount = codeService.selectDistinctCountFromX(); | 
|---|
|  |  |  | //        int yCount = codeService.selectDistinctCountFromY(); | 
|---|
|  |  |  | //        // [][] 第一个是排的数量 第二个是列的数量 | 
|---|
|  |  |  | //        String[][] codeMatrix = new String[yCount][xCount]; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Double> xIdxList = new ArrayList<>(); | 
|---|
|  |  |  | List<Double> yIdxList = new ArrayList<>(); | 
|---|
|  |  |  | xIdxList = new ArrayList<>(); | 
|---|
|  |  |  | yIdxList = new ArrayList<>(); | 
|---|
|  |  |  | for (Code code : codeList) { | 
|---|
|  |  |  | Double x = code.getX(); | 
|---|
|  |  |  | Double y = code.getY(); | 
|---|
|  |  |  | 
|---|
|  |  |  | // [][] 第一个是排的数量 第二个是列的数量 | 
|---|
|  |  |  | String[][] codeMatrix = new String[yIdxList.size()][xIdxList.size()]; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int idxX = -1; | 
|---|
|  |  |  | int idxY = -1; | 
|---|
|  |  |  | double lastX = -1; | 
|---|
|  |  |  | double lastY = -1; | 
|---|
|  |  |  | for (Code code : codeList) { | 
|---|
|  |  |  | Double x = code.getX(); | 
|---|
|  |  |  | Double y = code.getY(); | 
|---|
|  |  |  | //            if (y != lastY) { | 
|---|
|  |  |  | //                idxY ++; | 
|---|
|  |  |  | //                idxX = 0; | 
|---|
|  |  |  | //                lastY = y; | 
|---|
|  |  |  | //                lastX = x; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            if (x != lastX) { | 
|---|
|  |  |  | //                idxX++; | 
|---|
|  |  |  | //                lastX = x; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            codeMatrix[idxY][idxX] = code.getData(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | codeMatrix[yIdxList.indexOf(y)][xIdxList.indexOf(x)] = code.getData(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public List<String> queryCodeListFromDynamicNode(Integer lev, String nodeType) { | 
|---|
|  |  |  | List<String> nodes = new ArrayList<>(); | 
|---|
|  |  |  | if (Cools.isEmpty(nodeType)) { | 
|---|
|  |  |  | return nodes; | 
|---|
|  |  |  | public List<int[]> getCodeMatrixIdxList(Integer lev, List<String> codeDataList) { | 
|---|
|  |  |  | if (Cools.isEmpty(codeDataList)) { | 
|---|
|  |  |  | return new ArrayList<>(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  | DynamicNode[][] dynamicMatrix = getDynamicMatrix(lev); | 
|---|
|  |  |  | String[][] codeMatrix = this.getCodeMatrix(lev); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<int[]> codeMatrixIdxList = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Map<String, int[]> map = new HashMap<>(); | 
|---|
|  |  |  | Set<String> codeDataSet = new HashSet<>(codeDataList); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (int i = 0; i < codeMatrix.length; i++) { | 
|---|
|  |  |  | for (int j = 0; j < codeMatrix[i].length; j++) { | 
|---|
|  |  |  | if (nodeType.equals(dynamicMatrix[i][j].getVehicle())) { | 
|---|
|  |  |  | nodes.add(codeMatrix[i][j]); | 
|---|
|  |  |  | String codeData = codeMatrix[i][j]; | 
|---|
|  |  |  | if (codeDataSet.contains(codeData)) { | 
|---|
|  |  |  | map.put(codeData, new int[]{i, j}); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return nodes; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (String codeData : codeDataList) { | 
|---|
|  |  |  | int[] codeMatrixIdx = map.get(codeData); | 
|---|
|  |  |  | if (codeMatrixIdx != null) { | 
|---|
|  |  |  | codeMatrixIdxList.add(codeMatrixIdx); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return codeMatrixIdxList; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void modifyDynamicMatrix(Integer lev, List<String> codeList, String vehicle) { | 
|---|
|  |  |  | this.modifyDynamicMatrix(lev, codeList, vehicle, false); | 
|---|
|  |  |  | public void modifyDynamicMatrix(Integer lev, List<int[]> codeIdxList, String vehicle) { | 
|---|
|  |  |  | this.modifyDynamicMatrix(lev, codeIdxList, vehicle, false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public synchronized void modifyDynamicMatrix(Integer lev, List<String> codeList, String vehicle, boolean reset) { | 
|---|
|  |  |  | public synchronized void modifyDynamicMatrix(Integer lev, List<int[]> codeIdxList, String vehicle, boolean reset) { | 
|---|
|  |  |  | if (Cools.isEmpty(vehicle)) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); | 
|---|
|  |  |  | DynamicNode[][] dynamicMatrix = getDynamicMatrix(lev); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!reset) { | 
|---|
|  |  |  | if (Cools.isEmpty(codeList, vehicle)) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //            long time = System.currentTimeMillis() / 1000; | 
|---|
|  |  |  | int serial = 1; | 
|---|
|  |  |  | for (String code : codeList) { | 
|---|
|  |  |  | int[] node = getCodeMatrixIdx(lev, code); | 
|---|
|  |  |  | dynamicMatrix[node[0]][node[1]] = new DynamicNode(vehicle, serial); | 
|---|
|  |  |  | for (int[] codeMatrixIdx : codeIdxList) { | 
|---|
|  |  |  | dynamicMatrix[codeMatrixIdx[0]][codeMatrixIdx[1]] = new DynamicNode(vehicle, serial); | 
|---|
|  |  |  | serial++; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | if (Cools.isEmpty(vehicle)) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (int i = 0; i < dynamicMatrix.length; i++) { | 
|---|
|  |  |  | for (int j = 0; j < dynamicMatrix[i].length; j++) { | 
|---|
|  |  |  | DynamicNode dynamicNode = dynamicMatrix[i][j]; | 
|---|
|  |  |  | 
|---|
|  |  |  | setDynamicMatrix(lev, dynamicMatrix); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void clearDynamicMatrixByCodeList(Integer lev, List<String> codeList) { | 
|---|
|  |  |  | this.modifyDynamicMatrix(lev, codeList, DynamicNodeType.ACCESS.val); | 
|---|
|  |  |  | public void clearDynamicMatrixByCodeList(Integer lev, List<int[]> codeIdxList) { | 
|---|
|  |  |  | this.modifyDynamicMatrix(lev, codeIdxList, DynamicNodeType.ACCESS.val); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public int[][] filterMapData(int[][] mapMatrix, Integer lev, List<String> lockNodes) { | 
|---|