设备名称变更

This commit is contained in:
tiger_zhou 2023-07-18 13:25:47 +08:00
parent d154d09855
commit da6e506688
2 changed files with 147 additions and 84 deletions

View File

@ -1,5 +1,6 @@
package club.joylink.xiannccda.ats.cache;
import club.joylink.xiannccda.ats.message.line3.DeviceNameChanger;
import club.joylink.xiannccda.dto.protos.DeviceInfoProto;
import club.joylink.xiannccda.dto.protos.LayoutGraphicsProto;
import club.joylink.xiannccda.dto.protos.LayoutGraphicsProto.KilometerSystem;
@ -18,15 +19,21 @@ import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
/** 发布时缓存在内存中的线路数据 */
/**
* 发布时缓存在内存中的线路数据
*/
@Slf4j
public class LineGraphicDataRepository {
/** 线路数据信息 */
/**
* 线路数据信息
*/
private static final Map<Integer, Map<String, Map<String, Builder>>> lineGraphMap =
new ConcurrentHashMap<>();
/** 线路各坐标系转换关系 */
/**
* 线路各坐标系转换关系
*/
private static final Map<Integer, Map<String, CoordinateConvertor>> lineCoordinateMain =
new HashMap<>();
@ -40,6 +47,7 @@ public class LineGraphicDataRepository {
if (publishGi.getLineId() != null) {
LayoutGraphicsProto.RtssGraphicStorage storage =
LayoutGraphicsProto.RtssGraphicStorage.parseFrom(publishGi.getProto());
DeviceNameChanger.init(storage);
Map<String, Map<String, Builder>> lineDataMap = new HashMap<>();
// 构建区段
sectionInitLineGraph(publishGi.getLineId(), lineDataMap, storage);
@ -83,7 +91,9 @@ public class LineGraphicDataRepository {
return List.of();
}
/** 删除线路绘图数据 */
/**
* 删除线路绘图数据
*/
public static void removeLineGraph(Integer id) {
lineGraphMap.remove(id);
}
@ -314,7 +324,9 @@ public class LineGraphicDataRepository {
return convertorMap.get(convertorKey).convertorKilometer(kilometer, CoordinateEnum.MAIN_LINE);
}
/** 坐标系枚举 */
/**
* 坐标系枚举
*/
@Getter
private enum CoordinateEnum {
MAIN_LINE("MAIN_LINE", List.of("YDK", "ZDK", "XDK", "SDK")),
@ -359,7 +371,9 @@ public class LineGraphicDataRepository {
}
}
/** 坐标转换对象 */
/**
* 坐标转换对象
*/
@Getter
private static class CoordinateConvertor {

View File

@ -1,14 +1,28 @@
package club.joylink.xiannccda.ats.message.line3;
import club.joylink.xiannccda.ats.message.line3.device.DeviceType;
import club.joylink.xiannccda.dto.protos.LayoutGraphicsProto;
import club.joylink.xiannccda.dto.protos.LayoutGraphicsProto.RtssGraphicStorage;
import club.joylink.xiannccda.dto.protos.LayoutGraphicsProto.Section;
import club.joylink.xiannccda.dto.protos.LayoutGraphicsProto.Signal;
import club.joylink.xiannccda.dto.protos.LayoutGraphicsProto.Turnout;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.protobuf.GeneratedMessageV3;
import com.google.protobuf.Message;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
public abstract class DeviceNameChanger {
// abstract List<String> findAllDeviceName(JSONArray dataArray);
abstract void collectNames(LayoutGraphicsProto.RtssGraphicStorage graphicStorage);
abstract String changeDeviceName(String nccDeviceName);
abstract String changeDeviceName(String nccDeviceName, List<String> graphicNames);
static Map<DeviceType, DeviceNameChanger> NCC_DEVICE_TYPE_NAME_MAPPER = Maps.newHashMap();
@ -19,17 +33,36 @@ public abstract class DeviceNameChanger {
// NCC_DEVICE_TYPE_NAME_MAPPER.put(DeviceType.DEVICE_TYPE_PLATFORM, "stationStandList");
}
private final static Map<DeviceType, List<String>> DEVICE_NAMES = Maps.newHashMap();
public static void init(LayoutGraphicsProto.RtssGraphicStorage gs) {
for (DeviceNameChanger value : NCC_DEVICE_TYPE_NAME_MAPPER.values()) {
value.collectNames(gs);
}
}
public static String nameMatch(DeviceType dt, String name) {
DeviceNameChanger nameChanger = NCC_DEVICE_TYPE_NAME_MAPPER.get(dt);
if (Objects.nonNull(nameChanger)) {
List<String> deviceNames = DEVICE_NAMES.get(dt);
nameChanger.changeDeviceName(name, deviceNames);
}
return name;
}
public static class SwitchDevice extends DeviceNameChanger {
/* @Override
public List<String> findAllDeviceName(JSONArray dataArray) {
List<String> mapDeviceNames = dataArray.stream().filter(d -> d instanceof JSONObject).map(d -> (JSONObject) d).map(d -> d.getString("name")).toList();
return mapDeviceNames;
}*/
@Override
void collectNames(RtssGraphicStorage graphicStorage) {
List<String> names = graphicStorage.getTurnoutsList().stream().map(Turnout::getCode).toList();
DEVICE_NAMES.put(DeviceType.DEVICE_TYPE_SWITCH, names);
}
@Override
public String changeDeviceName(String nccDeviceName) {
public String changeDeviceName(String nccDeviceName, List<String> graphicNames) {
if (nccDeviceName.length() < 3) {
return nccDeviceName;
}
@ -43,89 +76,105 @@ public abstract class DeviceNameChanger {
public static class TrackDevice extends DeviceNameChanger {
/* @Override
List<String> findAllDeviceName(JSONArray dataArray) {
Map<String, JSONObject> jsonMap = dataArray.stream().filter(d -> d instanceof JSONObject).map(d -> (JSONObject) d).collect(Collectors.toMap((d) -> d.getString("code"), Function.identity()));
List<String> newNames = Lists.newArrayList();
for (JSONObject value : jsonMap.values()) {
// JSONArray hasLogic = value.getJSONArray("logicSectionList");
String physicsTrackCode = value.getString("parentCode");
String name = value.getString("name");
if (StringUtils.isEmpty(physicsTrackCode)) {
newNames.add(name);
} else {
JSONObject physicsTrack = jsonMap.get(physicsTrackCode);
String pn = physicsTrack.getString("name");
newNames.add(pn + name);
}
}
return newNames;
}*/
@Override
String changeDeviceName(String nccDeviceName) {
void collectNames(RtssGraphicStorage graphicStorage) {
List<String> names = graphicStorage.getSectionList().stream().map(Section::getCode).toList();
DEVICE_NAMES.put(DeviceType.DEVICE_TYPE_TRACK, names);
}
@Override
String changeDeviceName(String nccDeviceName, List<String> graphicNames) {
if (nccDeviceName.length() < 4) {
return nccDeviceName;
}
if (nccDeviceName.startsWith("T") && nccDeviceName.contains("_")) {
return nccDeviceName.substring(1);
} else if (nccDeviceName.matches("^[A-Za-z]{2}.*?")) {
String head = nccDeviceName.substring(2, 4);
String tail = nccDeviceName.substring(5);
String tailEnd = "";
if (tail.matches(".*?[A-Z]$")) {
tail = nccDeviceName.substring(4, nccDeviceName.length() - 1);
tailEnd = nccDeviceName.substring(nccDeviceName.length() - 1);
}
return "G" + tail + head + tailEnd;
} else if (nccDeviceName.matches(".*?[A-Z]$")) {
String head = nccDeviceName.substring(1, 3);
String tail = nccDeviceName.substring(4);
String tailEnd = "";
if (tail.matches(".*?[A-Z]$")) {
tail = nccDeviceName.substring(4, nccDeviceName.length() - 1);
tailEnd = nccDeviceName.substring(nccDeviceName.length() - 1);
}
return "G" + tail + head + tailEnd;
Pattern regex = Pattern.compile("^([A-Za-z]{1,2})(.*?)$");
Matcher matcher = regex.matcher(nccDeviceName);
String newName = "";
String code = "";
if (matcher.find()) {
code = matcher.group(2);
if (StringUtils.contains(code, "_")) {
newName = code;
} else {
return "S" + nccDeviceName;
String head = code.substring(0, 2);
String end = code.substring(3);
String tail = "";
if (code.matches(".*?[A-Z]$")) {
tail = end.substring(end.length() - 1);
}
newName = end + head + tail;
}
}
final String finalName = newName;
final String finalCode = code;
String finder = graphicNames.stream().filter(d -> StringUtils.equals(d, finalName) || StringUtils.endsWithIgnoreCase(d, finalCode)).findFirst().orElse(null);
if (Objects.nonNull(finder)) {
return finder;
}
return nccDeviceName;
}
}
public static class SignalDevice extends DeviceNameChanger {
/* @Override
List<String> findAllDeviceName(JSONArray dataArray) {
List<String> mapDeviceNames = dataArray.stream().filter(d -> d instanceof JSONObject).map(d -> (JSONObject) d).map(d -> d.getString("name")).toList();
return mapDeviceNames;
}*/
@Override
void collectNames(RtssGraphicStorage graphicStorage) {
List<String> names = graphicStorage.getSignalsList().stream().map(Signal::getCode).toList();
DEVICE_NAMES.put(DeviceType.DEVICE_TYPE_SIGNAL, names);
}
@Override
String changeDeviceName(String nccDeviceName) {
String changeDeviceName(String nccDeviceName, List<String> graphicNames) {
if (nccDeviceName.length() <= 3) {
return nccDeviceName;
}
String started = nccDeviceName.substring(0, 1);
String head = nccDeviceName.substring(1, 3);
String tail = nccDeviceName.substring(4);
return started + tail + head;
Pattern regex = Pattern.compile("^([A-Za-z]{1,2})(.*?)$");
Matcher matcher = regex.matcher(nccDeviceName);
String newName = "";
String code = "";
if (matcher.find()) {
code = matcher.group(2);
if (StringUtils.contains(code, "_")) {
newName = code;
} else {
String head = code.substring(0, 2);
String end = code.substring(3);
String tail = "";
if (code.matches(".*?[A-Z]$")) {
tail = end.substring(end.length() - 1);
}
newName = end + head + tail;
}
}
final String finalName = newName.replaceAll("_", "-");
final String finalCode = code.replaceAll("_", "-");
String finder = graphicNames.stream().filter(d -> StringUtils.equals(d, finalName) || StringUtils.endsWithIgnoreCase(d, finalCode)).findFirst().orElse(null);
if (Objects.nonNull(finder)) {
return finder;
}
return nccDeviceName;
}
}
/* public static class PlatformDevice extends Device {
@Override
List<String> findAllDeviceName(JSONArray dataArray) {
return null;
public static void main(String[] args) {
String nccDeviceName = "TP_2DG";
Pattern regex = Pattern.compile("^([A-Za-z]{1,2})(.*?)$");
Matcher matcher = regex.matcher(nccDeviceName);
String newName = "";
String code = "";
if (matcher.find()) {
code = matcher.group(2);
String head = code.substring(0, 2);
String end = code.substring(3);
String tail = "";
if (code.matches(".*?[A-Z]$")) {
tail = end.substring(end.length() - 1);
}
newName = end + head + tail;
System.out.println(newName);
}
@Override
String changeDeviceName(String nccDeviceName) {
return null;
}
}*/
}