| | |
| | | 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.core.domain.SortCodeDto; |
| | | 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.service.CodeService; |
| | | import com.zy.acs.manager.manager.service.RouteService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.event.EventListener; |
| | | import org.springframework.boot.context.event.ApplicationReadyEvent; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.PostConstruct; |
| | | import java.util.*; |
| | | import java.util.concurrent.ConcurrentLinkedQueue; |
| | | import java.util.stream.Collectors; |
| | | import java.util.stream.IntStream; |
| | | |
| | | /** |
| | | * Created by vincent on 6/6/2024 |
| | | */ |
| | | @Slf4j |
| | | @Service |
| | | public class MapDataDispatcher { |
| | | |
| | | public static final Integer MAP_DEFAULT_LEV = 1; |
| | |
| | | |
| | | private int[][] turnMatrix; |
| | | |
| | | private String[][] cdaMatrix; |
| | | private Double[][][] cdaMatrix; |
| | | |
| | | public Map<String, Boolean> routeCdaMap = new HashMap<>(); |
| | | |
| | | private final CodeService codeService; |
| | | @Autowired |
| | | private CodeService codeService; |
| | | |
| | | private final RouteService routeService; |
| | | @Autowired |
| | | private RouteService routeService; |
| | | |
| | | public MapDataDispatcher(CodeService codeService, RouteService routeService) { |
| | | this.codeService = codeService; |
| | | this.routeService = routeService; |
| | | @PostConstruct |
| | | public void init() { |
| | | String[][] codeMatrix = this.getCodeMatrix(null); |
| | | this.initRouteMap(null); |
| | | if (codeMatrix.length > 0) { |
| | | this.getMapMatrix(null, null); |
| | | this.getTurnMatrix(null); |
| | | this.getCdaMatrix(null); |
| | | this.getDynamicMatrix(null); |
| | | } |
| | | } |
| | | |
| | | public String[][] getWaveMatrix(Integer lev) { |
| | |
| | | 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); |
| | | // redis |
| | | if (null == this.cdaMatrix) { |
| | | String cdaMatrixStr = redis.getValue(RedisConstant.AGV_MAP_ASTAR_CDA_FLAG, String.valueOf(lev)); |
| | | if (!Cools.isEmpty(cdaMatrixStr)) { |
| | | this.cdaMatrix = JSON.parseObject(cdaMatrixStr, String[][].class); |
| | | String[][] cdaStrMatrix = JSON.parseObject(cdaMatrixStr, String[][].class); |
| | | this.cdaMatrix = MapDataUtils.preComputeCdaMatrix(cdaStrMatrix); |
| | | } |
| | | } |
| | | // init |
| | |
| | | return this.cdaMatrix; |
| | | } |
| | | |
| | | public void setCdaMatrix(Integer lev, String[][] cdaMatrix) { |
| | | redis.setValue(RedisConstant.AGV_MAP_ASTAR_CDA_FLAG, String.valueOf(lev), JSON.toJSONString(cdaMatrix)); |
| | | this.cdaMatrix = 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); |
| | | |
| | | 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++) { |
| | |
| | | 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()); |
| | |
| | | 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()) { |
| | |
| | | return; |
| | | } |
| | | for (Route route : routeList) { |
| | | Code startCode = codeService.getById(route.getStartCode()); |
| | | Code startCode = codeService.getCacheById(route.getStartCode()); |
| | | int[] startCodeIdx = getCodeMatrixIdx(lev, startCode.getData()); |
| | | Code endCode = codeService.getById(route.getEndCode()); |
| | | Code endCode = codeService.getCacheById(route.getEndCode()); |
| | | int[] codeMatrixIdx = getCodeMatrixIdx(lev, endCode.getData()); |
| | | |
| | | String routeKey = RouteGenerator.generateRouteKey(startCode.getData(), endCode.getData()); |
| | |
| | | } |
| | | } |
| | | return codeMatrixIdxList; |
| | | } |
| | | |
| | | public List<String> queryCodeListFromDynamicNode(Integer lev, String nodeType) { |
| | | if (Cools.isEmpty(nodeType)) { |
| | | return new ArrayList<>(); |
| | | } |
| | | lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV); |
| | | |
| | | DynamicNode[][] dynamicMatrix = getDynamicMatrix(lev); |
| | | String[][] codeMatrix = this.getCodeMatrix(lev); |
| | | |
| | | ConcurrentLinkedQueue<SortCodeDto> codeList = new ConcurrentLinkedQueue<>(); |
| | | |
| | | IntStream.range(0, codeMatrix.length).parallel().forEach(i -> { |
| | | for (int j = 0; j < codeMatrix[i].length; j++) { |
| | | DynamicNode dynamicNode = dynamicMatrix[i][j]; |
| | | if (nodeType.equals(dynamicNode.getVehicle())) { |
| | | codeList.add(new SortCodeDto(codeMatrix[i][j], dynamicNode.getSerial())); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | return codeList.stream() |
| | | .sorted(Comparator.comparingInt(SortCodeDto::getSerial)) |
| | | .map(SortCodeDto::getCode) |
| | | .collect(Collectors.toList()); |
| | | |
| | | // List<SortCodeDto> codeList = new ArrayList<>(); |
| | | |
| | | // for (int i = 0; i < codeMatrix.length; i++) { |
| | | // for (int j = 0; j < codeMatrix[i].length; j++) { |
| | | // DynamicNode dynamicNode = dynamicMatrix[i][j]; |
| | | // if (nodeType.equals(dynamicNode.getVehicle())) { |
| | | // codeList.add(new SortCodeDto(codeMatrix[i][j], dynamicNode.getSerial())); |
| | | // } |
| | | // } |
| | | // } |
| | | // codeList.sort(Comparator.comparingInt(SortCodeDto::getSerial)); |
| | | // return codeList.stream().map(SortCodeDto::getCode).collect(Collectors.toList()); |
| | | } |
| | | |
| | | public void modifyDynamicMatrix(Integer lev, List<int[]> codeIdxList, String vehicle) { |