【指示灯、操作按钮】初始化

Signed-off-by: weizhihong <weizhihong@joylink.club>
This commit is contained in:
weizhihong 2022-04-20 15:31:45 +08:00
parent 81c9ceb2aa
commit 4a3e4d985a
15 changed files with 476 additions and 143 deletions

View File

@ -5,11 +5,33 @@ package club.joylink.rtss.constants;
*/ */
public enum ButtonTypeEnum { public enum ButtonTypeEnum {
// 总辅助 // 总辅助
MAIN, MAIN_ASSIST,
// 接辅助 // 接辅助
RECEIVE, RECEIVE_ASSIST,
// 发辅助 // 发辅助
DELIVER, DELIVER_ASSIST,
// 改方 // 改方
CHANGE_DIRECTION CHANGE_DIRECTION,
NO;
/**
* 获取枚举信息
*
* @param type 类型
* @return 枚举
*/
public static ButtonTypeEnum getType(String type) {
switch (type) {
case "main_assist":
return ButtonTypeEnum.MAIN_ASSIST;
case "deliver_assist":
return ButtonTypeEnum.DELIVER_ASSIST;
case "receive_assist":
return ButtonTypeEnum.RECEIVE_ASSIST;
case "change_direction":
return ButtonTypeEnum.CHANGE_DIRECTION;
default:
return ButtonTypeEnum.NO;
}
}
} }

View File

@ -11,5 +11,22 @@ public enum IndicatorTypeEnum {
// 区间 // 区间
SECTION, SECTION,
// 辅助 // 辅助
ASSIST ASSIST,
// 无类型
NO;
public static IndicatorTypeEnum getType(String type) {
switch (type) {
case "receive":
return IndicatorTypeEnum.RECEIVE;
case "deliver":
return IndicatorTypeEnum.DELIVER;
case "section":
return IndicatorTypeEnum.SECTION;
case "assist":
return IndicatorTypeEnum.ASSIST;
default:
return IndicatorTypeEnum.NO;
}
}
} }

View File

@ -43,4 +43,9 @@ public class ButtonStand {
* 上一个站台 * 上一个站台
*/ */
private String preStandCode; private String preStandCode;
/**
* 类型
*/
private String type;
} }

View File

@ -62,6 +62,11 @@ public class IndicatorSection {
*/ */
private String routeCode; private String routeCode;
/**
* 灯类型
*/
private String type;
public void generateSectionList() { public void generateSectionList() {
if (StringUtils.isEmpty(sectionsCode)) { if (StringUtils.isEmpty(sectionsCode)) {
sectionList = new ArrayList<>(0); sectionList = new ArrayList<>(0);

View File

@ -15,6 +15,8 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.List;
@Service @Service
public class AssistButtonIndicatorService implements IAssistButtonIndicatorService { public class AssistButtonIndicatorService implements IAssistButtonIndicatorService {
@ -73,6 +75,14 @@ public class AssistButtonIndicatorService implements IAssistButtonIndicatorServi
assistIndicatorDAO.deleteByPrimaryKey(id); assistIndicatorDAO.deleteByPrimaryKey(id);
} }
@Override
public List<IndicatorSection> queryAllIndicatorSectionByMapId(Long mapId) {
IndicatorSectionExample indicatorSectionExample = new IndicatorSectionExample();
IndicatorSectionExample.Criteria criteria = indicatorSectionExample.createCriteria();
criteria.andMapIdEqualTo(mapId);
return assistIndicatorDAO.selectByExample(indicatorSectionExample);
}
@Override @Override
public PageVO<ButtonStand> buttonStandList(Long mapId, String standCode, String buttonCode, PageQueryVO queryVO) { public PageVO<ButtonStand> buttonStandList(Long mapId, String standCode, String buttonCode, PageQueryVO queryVO) {
PageHelper.startPage(queryVO.getPageNum(), queryVO.getPageSize()); PageHelper.startPage(queryVO.getPageNum(), queryVO.getPageSize());
@ -112,4 +122,12 @@ public class AssistButtonIndicatorService implements IAssistButtonIndicatorServi
public void deleteButtonStand(Long id) { public void deleteButtonStand(Long id) {
assistButtonDAO.deleteByPrimaryKey(id); assistButtonDAO.deleteByPrimaryKey(id);
} }
@Override
public List<ButtonStand> queryAllButtonStandByMapId(Long mapId) {
ButtonStandExample buttonStandExample = new ButtonStandExample();
ButtonStandExample.Criteria criteria = buttonStandExample.createCriteria();
criteria.andMapIdEqualTo(mapId);
return assistButtonDAO.selectByExample(buttonStandExample);
}
} }

View File

@ -5,6 +5,8 @@ import club.joylink.rtss.entity.IndicatorSection;
import club.joylink.rtss.vo.client.PageQueryVO; import club.joylink.rtss.vo.client.PageQueryVO;
import club.joylink.rtss.vo.client.PageVO; import club.joylink.rtss.vo.client.PageVO;
import java.util.List;
public interface IAssistButtonIndicatorService { public interface IAssistButtonIndicatorService {
/** /**
@ -45,6 +47,13 @@ public interface IAssistButtonIndicatorService {
*/ */
void deleteIndicatorSection(Long id); void deleteIndicatorSection(Long id);
/**
* 查找该地图下的指示灯区间站台进路关系信息列表
*
* @param mapId 地图Id
* @return 关系列表
*/
List<IndicatorSection> queryAllIndicatorSectionByMapId(Long mapId);
/** /**
* 查找该地图下的按钮站台关系信息列表 * 查找该地图下的按钮站台关系信息列表
@ -79,4 +88,12 @@ public interface IAssistButtonIndicatorService {
* @param id 关系ID * @param id 关系ID
*/ */
void deleteButtonStand(Long id); void deleteButtonStand(Long id);
/**
* 查找该地图下所有的按钮关联信息
*
* @param mapId 地图信息
* @return 关联关系
*/
List<ButtonStand> queryAllButtonStandByMapId(Long mapId);
} }

View File

@ -2,6 +2,7 @@ package club.joylink.rtss.services.draftData;
import club.joylink.rtss.dao.*; import club.joylink.rtss.dao.*;
import club.joylink.rtss.entity.*; import club.joylink.rtss.entity.*;
import club.joylink.rtss.services.IAssistButtonIndicatorService;
import club.joylink.rtss.util.JsonUtils; import club.joylink.rtss.util.JsonUtils;
import club.joylink.rtss.vo.map.MapLogicDataNewVO; import club.joylink.rtss.vo.map.MapLogicDataNewVO;
import club.joylink.rtss.vo.map.MapVO; import club.joylink.rtss.vo.map.MapVO;
@ -53,6 +54,9 @@ public class DraftMapServiceImpl implements DraftMapService {
@Autowired @Autowired
private DraftMapSignalApproachSectionService draftMapSignalApproachSectionService; private DraftMapSignalApproachSectionService draftMapSignalApproachSectionService;
@Autowired
private IAssistButtonIndicatorService assistButtonIndicatorService;
@Override @Override
public MapVO getDraftMapData(Long mapId) { public MapVO getDraftMapData(Long mapId) {
DraftMapWithBLOBs draftMap = this.draftMapDAO.selectByPrimaryKey(mapId); DraftMapWithBLOBs draftMap = this.draftMapDAO.selectByPrimaryKey(mapId);
@ -75,6 +79,11 @@ public class DraftMapServiceImpl implements DraftMapService {
// logicDataNew.setAutoReentryList(); 待补 // logicDataNew.setAutoReentryList(); 待补
// logicDataNew.setRoutingList(); 待补 // logicDataNew.setRoutingList(); 待补
logicDataNew.setSignalApproachSectionList(draftMapSignalApproachSectionService.queryAll(mapId)); logicDataNew.setSignalApproachSectionList(draftMapSignalApproachSectionService.queryAll(mapId));
// 获取指示灯按钮等关联关系
logicDataNew.setIndicatorSectionVOList(assistButtonIndicatorService.queryAllIndicatorSectionByMapId(mapId));
logicDataNew.setButtonStandVOList(assistButtonIndicatorService.queryAllButtonStandByMapId(mapId));
map.setLogicDataNew(logicDataNew); map.setLogicDataNew(logicDataNew);
return map; return map;
} }

View File

@ -16,6 +16,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -66,11 +67,7 @@ public class AssistService {
public void refreshSectionLightStatus(Simulation simulation, IndicatorSection indicatorSectionVO) { public void refreshSectionLightStatus(Simulation simulation, IndicatorSection indicatorSectionVO) {
Indicator indicator = simulation.getRepository().getByCode(indicatorSectionVO.getIndicatorCode(), Indicator.class); Indicator indicator = simulation.getRepository().getByCode(indicatorSectionVO.getIndicatorCode(), Indicator.class);
// 是否被占用,TRUE 占用FALSE 未占用 // 是否被占用,TRUE 占用FALSE 未占用
boolean isOccupied = indicatorSectionVO.getSectionList() boolean isOccupied = indicator.getSectionList().stream().filter(Section::isCtOccupied).findAny().isEmpty();
.stream()
.filter(code -> simulation.getRepository().getByCode(code, Section.class).isCtOccupied())
.findAny()
.isEmpty();
if (isOccupied) { if (isOccupied) {
// 修改区间灯为红色 // 修改区间灯为红色
indicator.setAspect(IndicatorStatusEnum.R); indicator.setAspect(IndicatorStatusEnum.R);
@ -97,12 +94,12 @@ public class AssistService {
deliverIndicator.setAspect(IndicatorStatusEnum.G); deliverIndicator.setAspect(IndicatorStatusEnum.G);
} else { } else {
// 接车进路 // 接车进路
Route receiveRoute = simulation.getRepository().getSettingRouteMap().get(receiveIndicator.getRoute().getCode()); Route receiveRoute = receiveIndicator.getRoute();
// 发车进路 // 发车进路
Route deliverRoute = simulation.getRepository().getSettingRouteMap().get(receiveIndicator.getRoute().getCode()); Route deliverRoute = deliverIndicator.getRoute();
// 两个进路都锁闭存在问题 // 两个进路都锁闭存在问题
if (receiveRoute.isLock() && deliverRoute.isLock()) { if (receiveRoute.isLock() && deliverRoute.isLock()) {
throw new SimulationException(SimulationExceptionType.System_Fault, "操作异常:进路存在问题"); throw new SimulationException(SimulationExceptionType.System_Fault, "操作异常:进路锁闭");
} else if (receiveRoute.isLock() && !deliverRoute.isLock()) { // 亮接灭发 } else if (receiveRoute.isLock() && !deliverRoute.isLock()) { // 亮接灭发
receiveIndicator.setAspect(IndicatorStatusEnum.Y); receiveIndicator.setAspect(IndicatorStatusEnum.Y);
deliverIndicator.setAspect(IndicatorStatusEnum.No); deliverIndicator.setAspect(IndicatorStatusEnum.No);
@ -120,10 +117,11 @@ public class AssistService {
* 改方按钮按下校验 * 改方按钮按下校验
*/ */
public ButtonValidInterface turnDirectionPressDownValid = (simulation, button) -> { public ButtonValidInterface turnDirectionPressDownValid = (simulation, button) -> {
List<Station> stationList = simulation.getRepository().getStationList();
// 当前站位置 // 当前站位置
int index = simulation.getRepository().getStationList().indexOf(button.getStation()); int index = stationList.indexOf(button.getStation());
// 检查是否是首站 // 检查是否是首站
if (index == 0 || index == simulation.getRepository().getSectionList().size() - 1) { if (index == 0 || index == stationList.size() - 1) {
throw new SimulationException(SimulationExceptionType.Operation_Cannot_handed, "操作异常:首站不可改方"); throw new SimulationException(SimulationExceptionType.Operation_Cannot_handed, "操作异常:首站不可改方");
} }
// 获取区间指示灯 // 获取区间指示灯

View File

@ -1,5 +1,9 @@
package club.joylink.rtss.simulation.cbtc.build; package club.joylink.rtss.simulation.cbtc.build;
import club.joylink.rtss.constants.ButtonTypeEnum;
import club.joylink.rtss.constants.IndicatorTypeEnum;
import club.joylink.rtss.entity.ButtonStand;
import club.joylink.rtss.entity.IndicatorSection;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum; import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.services.draftData.RoutingGenerator; import club.joylink.rtss.services.draftData.RoutingGenerator;
import club.joylink.rtss.simulation.cbtc.data.CalculateService; import club.joylink.rtss.simulation.cbtc.data.CalculateService;
@ -35,22 +39,22 @@ public class InterlockBuilder2 {
Map<String, MapElement> elementMap = mapDataBuildResult.getDeviceMap(); Map<String, MapElement> elementMap = mapDataBuildResult.getDeviceMap();
List<String> errMsgList = mapDataBuildResult.getErrMsgList(); List<String> errMsgList = mapDataBuildResult.getErrMsgList();
// ------------侧防start------------- // ------------侧防start-------------
Map<String, RouteFls> flsMap = checkAndBuildRouteFls(logicData.getFlankProtectionList(), elementMap); Map<String, RouteFls> flsMap = InterlockBuilder2.checkAndBuildRouteFls(logicData.getFlankProtectionList(), elementMap);
// ------------侧防end------------- // ------------侧防end-------------
// ------------延续保护start------------- // ------------延续保护start-------------
long overlapStart = System.currentTimeMillis(); long overlapStart = System.currentTimeMillis();
buildOverlap(logicData, elementMap, errMsgList, flsMap); InterlockBuilder2.buildOverlap(logicData, elementMap, errMsgList, flsMap);
log.debug("构建延续保护耗时:" + (System.currentTimeMillis() - overlapStart)); InterlockBuilder2.log.debug("构建延续保护耗时:" + (System.currentTimeMillis() - overlapStart));
// ------------延续保护end------------- // ------------延续保护end-------------
//超限区段 //超限区段
buildOverrun(logicData.getOverrunList(), elementMap, errMsgList); InterlockBuilder2.buildOverrun(logicData.getOverrunList(), elementMap, errMsgList);
// 接近区段 // 接近区段
buildApproachSections(logicData, elementMap, errMsgList); InterlockBuilder2.buildApproachSections(logicData, elementMap, errMsgList);
// ------------进路start------------- // ------------进路start-------------
long routeStart = System.currentTimeMillis(); long routeStart = System.currentTimeMillis();
buildRoute(logicData, elementMap, errMsgList, flsMap); InterlockBuilder2.buildRoute(logicData, elementMap, errMsgList, flsMap);
log.debug("构建进路耗时:" + (System.currentTimeMillis() - routeStart)); InterlockBuilder2.log.debug("构建进路耗时:" + (System.currentTimeMillis() - routeStart));
// ------------进路end------------- // ------------进路end-------------
// ------------自动信号start------------- // ------------自动信号start-------------
@ -224,30 +228,35 @@ public class InterlockBuilder2 {
} }
// ------------自动折返进路end------------- // ------------自动折返进路end-------------
checkBetweenRouteSameDirectionSignal(elementMap, errMsgList); InterlockBuilder2.checkBetweenRouteSameDirectionSignal(elementMap, errMsgList);
// ------------交路start------------- // ------------交路start-------------
List<Routing> routingList = checkAndBuildRouting(logicData.getRoutingList(), elementMap, errMsgList); List<Routing> routingList = InterlockBuilder2.checkAndBuildRouting(logicData.getRoutingList(), elementMap, errMsgList);
mapDataBuildResult.setRoutingList(routingList); mapDataBuildResult.setRoutingList(routingList);
// ------------交路end------------- // ------------交路end-------------
// ------------站间运行等级start------------- // ------------站间运行等级start-------------
List<StationRunLevel> stationRunLevelList = checkAndBuildStationRunLevel(logicData.getRunLevelList(), elementMap, errMsgList); List<StationRunLevel> stationRunLevelList = InterlockBuilder2.checkAndBuildStationRunLevel(logicData.getRunLevelList(), elementMap, errMsgList);
mapDataBuildResult.setRunLevelList(stationRunLevelList); mapDataBuildResult.setRunLevelList(stationRunLevelList);
// ------------站间运行等级end------------- // ------------站间运行等级end-------------
// ------------目的地码start------------- // ------------目的地码start-------------
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
checkAndBuildDestinationCodeDefinition(elementMap, logicData.getDestinationCodeDefinitionList(), mapDataBuildResult.getDestinationMap(), errMsgList); InterlockBuilder2.checkAndBuildDestinationCodeDefinition(elementMap, logicData.getDestinationCodeDefinitionList(), mapDataBuildResult.getDestinationMap(), errMsgList);
log.info("目的地码构建耗时:" + (System.currentTimeMillis() - start)); InterlockBuilder2.log.info("目的地码构建耗时:" + (System.currentTimeMillis() - start));
// ------------目的地码end------------- // ------------目的地码end-------------
// 根据站间运行等级数据构建路径单元 // 根据站间运行等级数据构建路径单元
if (!errMsgList.isEmpty()) { if (!errMsgList.isEmpty()) {
return; return;
} }
buildRoutePathFromStationRunLevel(stationRunLevelList, mapDataBuildResult, errMsgList); InterlockBuilder2.buildRoutePathFromStationRunLevel(stationRunLevelList, mapDataBuildResult, errMsgList);
// buildParkTimes(logicData, elementMap, mapDataBuildResult.getParkTimeMap(), errMsgList); // buildParkTimes(logicData, elementMap, mapDataBuildResult.getParkTimeMap(), errMsgList);
// 处理指示灯逻辑信息
InterlockBuilder2.buildAssistIndicatorLogic(elementMap, errMsgList, logicData.getIndicatorSectionVOList());
// 处理按钮逻辑信息
InterlockBuilder2.buildAssistButtonLogic(elementMap, errMsgList, logicData.getButtonStandVOList());
} }
private static void buildParkTimes(MapLogicDataNewVO logicData, Map<String, MapElement> elementMap, Map<String, StationParkTime> parkTimeMap, private static void buildParkTimes(MapLogicDataNewVO logicData, Map<String, MapElement> elementMap, Map<String, StationParkTime> parkTimeMap,
@ -317,7 +326,7 @@ public class InterlockBuilder2 {
} }
MapSectionPathVO sectionPathVO = new MapSectionPathVO(route.getStart().isRight(), mapRouteVO.getRouteSectionList(), mapRouteVO.getRouteSwitchList()); MapSectionPathVO sectionPathVO = new MapSectionPathVO(route.getStart().isRight(), mapRouteVO.getRouteSectionList(), mapRouteVO.getRouteSwitchList());
List<String> errorList = new ArrayList<>(); List<String> errorList = new ArrayList<>();
SectionPath sectionPath = checkAndBuildSectionPath(sectionPathVO, elementMap, errorList); SectionPath sectionPath = InterlockBuilder2.checkAndBuildSectionPath(sectionPathVO, elementMap, errorList);
for (String msg : errorList) { for (String msg : errorList) {
errMsgList.add(String.format("进路[%s(%s)]内区段路径数据异常:%s", errMsgList.add(String.format("进路[%s(%s)]内区段路径数据异常:%s",
route.getName(), route.getCode(), msg)); route.getName(), route.getCode(), msg));
@ -446,7 +455,7 @@ public class InterlockBuilder2 {
signal.getName(), signal.getCode())); signal.getName(), signal.getCode()));
} else { } else {
for (MapSectionPathVO sectionPathVO : sectionPathVOList) { for (MapSectionPathVO sectionPathVO : sectionPathVOList) {
SectionPath sectionPath = checkAndBuildSectionPath(sectionPathVO, elementMap, errMsgList); SectionPath sectionPath = InterlockBuilder2.checkAndBuildSectionPath(sectionPathVO, elementMap, errMsgList);
sectionPathList.add(sectionPath); sectionPathList.add(sectionPath);
} }
signal.setApproachPathList(sectionPathList); signal.setApproachPathList(sectionPathList);
@ -492,7 +501,7 @@ public class InterlockBuilder2 {
if (!CollectionUtils.isEmpty(pathVOList)) { if (!CollectionUtils.isEmpty(pathVOList)) {
for (MapSectionPathVO sectionPathVO : pathVOList) { for (MapSectionPathVO sectionPathVO : pathVOList) {
List<String> errorList = new ArrayList<>(); List<String> errorList = new ArrayList<>();
SectionPath sectionPath = checkAndBuildSectionPath(sectionPathVO, elementMap, errorList); SectionPath sectionPath = InterlockBuilder2.checkAndBuildSectionPath(sectionPathVO, elementMap, errorList);
for (String errmsg : errorList) { for (String errmsg : errorList) {
errMsgList.add(String.format("延续保护[%s(%s)]区段数据异常:%s", errMsgList.add(String.format("延续保护[%s(%s)]区段数据异常:%s",
routeOverlap.getName(), routeOverlap.getCode(), errmsg)); routeOverlap.getName(), routeOverlap.getCode(), errmsg));
@ -517,7 +526,7 @@ public class InterlockBuilder2 {
if (!CollectionUtils.isEmpty(triggerPathVOList)) { if (!CollectionUtils.isEmpty(triggerPathVOList)) {
for (MapSectionPathVO sectionPathVO : triggerPathVOList) { for (MapSectionPathVO sectionPathVO : triggerPathVOList) {
List<String> errorList = new ArrayList<>(); List<String> errorList = new ArrayList<>();
SectionPath sectionPath = checkAndBuildSectionPath(sectionPathVO, elementMap, errorList); SectionPath sectionPath = InterlockBuilder2.checkAndBuildSectionPath(sectionPathVO, elementMap, errorList);
for (String errmsg : errorList) { for (String errmsg : errorList) {
errMsgList.add(String.format("延续保护[%s(%s)]触发区段数据异常:%s", errMsgList.add(String.format("延续保护[%s(%s)]触发区段数据异常:%s",
routeOverlap.getName(), routeOverlap.getCode(), errmsg)); routeOverlap.getName(), routeOverlap.getCode(), errmsg));
@ -569,13 +578,13 @@ public class InterlockBuilder2 {
Map<String, RouteFls> map = new HashMap<>(); Map<String, RouteFls> map = new HashMap<>();
for (MapRouteFlankProtectionNewVO fpVO : flankProtectionList) { for (MapRouteFlankProtectionNewVO fpVO : flankProtectionList) {
RouteFls routeFls = new RouteFls(fpVO.getCode(), new SwitchElement((Switch) elementMap.get(fpVO.getSource().getSwitchCode()), fpVO.getSource().isNormal())); RouteFls routeFls = new RouteFls(fpVO.getCode(), new SwitchElement((Switch) elementMap.get(fpVO.getSource().getSwitchCode()), fpVO.getSource().isNormal()));
List<RouteFls.FlsElement> level1List = checkAndBuildFlsElementList(fpVO.getLevel1List(), elementMap); List<RouteFls.FlsElement> level1List = InterlockBuilder2.checkAndBuildFlsElementList(fpVO.getLevel1List(), elementMap);
routeFls.setLevel1List(level1List); routeFls.setLevel1List(level1List);
List<RouteFls.FlsElement> level2List = checkAndBuildFlsElementList(fpVO.getLevel2List(), elementMap); List<RouteFls.FlsElement> level2List = InterlockBuilder2.checkAndBuildFlsElementList(fpVO.getLevel2List(), elementMap);
routeFls.setLevel2List(level2List); routeFls.setLevel2List(level2List);
map.put(routeFls.getCode(), routeFls); map.put(routeFls.getCode(), routeFls);
} }
log.debug("构建侧防耗时:" + (System.currentTimeMillis() - start)); InterlockBuilder2.log.debug("构建侧防耗时:" + (System.currentTimeMillis() - start));
return map; return map;
} }
@ -682,13 +691,13 @@ public class InterlockBuilder2 {
rightFrontTurnBack = stationBFrontTurnBack; rightFrontTurnBack = stationBFrontTurnBack;
} }
//从左边车站右行站台站台轨开始构建运行路径--- 不标准的目的地码定义数据会导致运行路径构建错误 //从左边车站右行站台站台轨开始构建运行路径--- 不标准的目的地码定义数据会导致运行路径构建错误
Section startSection4RoutePath = selectSection4DestinationCode(leftStation, leftFrontTurnBack, necessarySectionSet, true); //查询路径的起始区段 Section startSection4RoutePath = InterlockBuilder2.selectSection4DestinationCode(leftStation, leftFrontTurnBack, necessarySectionSet, true); //查询路径的起始区段
Section endSection4RoutePath = selectSection4DestinationCode(rightStation, rightFrontTurnBack, necessarySectionSet, false); //查询路径的终点区段 Section endSection4RoutePath = InterlockBuilder2.selectSection4DestinationCode(rightStation, rightFrontTurnBack, necessarySectionSet, false); //查询路径的终点区段
routes = new ArrayList<>(); routes = new ArrayList<>();
//选择并添加进路 //选择并添加进路
selectAndAddRoutes(startSection4RoutePath, endSection4RoutePath, true, stationList, standTrackAdjoinMap, routes, necessaryRoutes, necessarySectionSet); InterlockBuilder2.selectAndAddRoutes(startSection4RoutePath, endSection4RoutePath, true, stationList, standTrackAdjoinMap, routes, necessaryRoutes, necessarySectionSet);
//选择并添加反向的进路 //选择并添加反向的进路
selectAndAddRoutes(endSection4RoutePath, startSection4RoutePath, false, stationList, standTrackAdjoinMap, routes, necessaryRoutes, necessarySectionSet); InterlockBuilder2.selectAndAddRoutes(endSection4RoutePath, startSection4RoutePath, false, stationList, standTrackAdjoinMap, routes, necessaryRoutes, necessarySectionSet);
runPath = routes.stream().flatMap(route -> route.getSectionList().stream()).distinct().collect(Collectors.toList()); runPath = routes.stream().flatMap(route -> route.getSectionList().stream()).distinct().collect(Collectors.toList());
break; break;
} }
@ -705,7 +714,7 @@ public class InterlockBuilder2 {
} }
if (startSection != null) { if (startSection != null) {
routes = new ArrayList<>(); routes = new ArrayList<>();
selectAndAddRoutes(startSection, section, true, stationList, standTrackAdjoinMap, routes, necessaryRoutes, necessarySectionSet); InterlockBuilder2.selectAndAddRoutes(startSection, section, true, stationList, standTrackAdjoinMap, routes, necessaryRoutes, necessarySectionSet);
runPath = routes.stream().flatMap(route -> route.getSectionList().stream()).distinct().collect(Collectors.toList()); runPath = routes.stream().flatMap(route -> route.getSectionList().stream()).distinct().collect(Collectors.toList());
} }
} }
@ -940,7 +949,7 @@ public class InterlockBuilder2 {
SimulationBuilder.SimulationDeviceBuildResult buildResult, SimulationBuilder.SimulationDeviceBuildResult buildResult,
List<String> errMsgList) { List<String> errMsgList) {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
log.debug("构建进路路径开始:" + start); InterlockBuilder2.log.debug("构建进路路径开始:" + start);
if (CollectionUtils.isEmpty(stationRunLevelList)) { if (CollectionUtils.isEmpty(stationRunLevelList)) {
return; return;
} }
@ -974,7 +983,7 @@ public class InterlockBuilder2 {
} }
} }
System.out.println("用时" + (System.currentTimeMillis() - l)); System.out.println("用时" + (System.currentTimeMillis() - l));
log.debug("构建进路路径耗时:" + (System.currentTimeMillis() - start)); InterlockBuilder2.log.debug("构建进路路径耗时:" + (System.currentTimeMillis() - start));
} }
// /** // /**
@ -1038,7 +1047,7 @@ public class InterlockBuilder2 {
} }
List<Section> midSectionList = new ArrayList<>(); // 若可到达记录途经进路的最后一个区段 List<Section> midSectionList = new ArrayList<>(); // 若可到达记录途经进路的最后一个区段
List<String> warningList = new ArrayList<>(); // 警告消息 List<String> warningList = new ArrayList<>(); // 警告消息
boolean reachable = isReachable(startSection, endSection, right, 0, null, midSectionList, warningList); boolean reachable = InterlockBuilder2.isReachable(startSection, endSection, right, 0, null, midSectionList, warningList);
if (!reachable) { if (!reachable) {
errMsgList.add(String.format("从区段[%s(%s)]始到区段[%s(%s)]终," + errMsgList.add(String.format("从区段[%s(%s)]始到区段[%s(%s)]终," +
"以进路方式查询无法到达,检测运行图数据或进路/自动信号数据是否有误。辅助信息:【%s】", "以进路方式查询无法到达,检测运行图数据或进路/自动信号数据是否有误。辅助信息:【%s】",
@ -1180,7 +1189,7 @@ public class InterlockBuilder2 {
if (Objects.nonNull(autoSignal)) { // 自动信号单一路径 if (Objects.nonNull(autoSignal)) { // 自动信号单一路径
List<Section> sectionList = autoSignal.getSectionList(); List<Section> sectionList = autoSignal.getSectionList();
if (CollectionUtils.isEmpty(sectionList)) { // 尽头防护信号机 if (CollectionUtils.isEmpty(sectionList)) { // 尽头防护信号机
log.info(String.format("从区段[%s(%s)]始到区段[%s(%s)]终,查询路径找到尽头防护信号[%s(%s)]也没找到", InterlockBuilder2.log.info(String.format("从区段[%s(%s)]始到区段[%s(%s)]终,查询路径找到尽头防护信号[%s(%s)]也没找到",
startSection.getName(), startSection.getCode(), startSection.getName(), startSection.getCode(),
endSection.getName(), endSection.getCode(), endSection.getName(), endSection.getCode(),
startSignal.getName(), startSignal.getCode())); startSignal.getName(), startSignal.getCode()));
@ -1211,7 +1220,7 @@ public class InterlockBuilder2 {
if (!current.isSwitchTrack() && ((startSignal.isRight() && Objects.isNull(current.getRightSection())) if (!current.isSwitchTrack() && ((startSignal.isRight() && Objects.isNull(current.getRightSection()))
|| ||
(!startSignal.isRight() && Objects.isNull(current.getLeftSection())))) { (!startSignal.isRight() && Objects.isNull(current.getLeftSection())))) {
log.info(String.format("从区段[%s(%s)]始到区段[%s(%s)]终,查询路径找到尽头区段[%s(%s)]也没找到", InterlockBuilder2.log.info(String.format("从区段[%s(%s)]始到区段[%s(%s)]终,查询路径找到尽头区段[%s(%s)]也没找到",
startSection.getName(), startSection.getCode(), startSection.getName(), startSection.getCode(),
endSection.getName(), endSection.getCode(), endSection.getName(), endSection.getCode(),
current.getName(), current.getCode())); current.getName(), current.getCode()));
@ -1248,7 +1257,7 @@ public class InterlockBuilder2 {
} }
} }
for (Section section : endSectionSet) { // 未找到递归查询 for (Section section : endSectionSet) { // 未找到递归查询
boolean reachable = isReachable(startSection, endSection, right, boolean reachable = InterlockBuilder2.isReachable(startSection, endSection, right,
++count, section, midSectionList, warningList); ++count, section, midSectionList, warningList);
if (reachable) { if (reachable) {
midSectionList.add(section); midSectionList.add(section);
@ -1393,7 +1402,7 @@ public class InterlockBuilder2 {
private static void checkBetweenRouteSameDirectionSignal(Map<String, MapElement> elementMap, List<String> errMsgList) { private static void checkBetweenRouteSameDirectionSignal(Map<String, MapElement> elementMap, List<String> errMsgList) {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
log.debug("构建自动折返进路开始"); InterlockBuilder2.log.debug("构建自动折返进路开始");
if (!CollectionUtils.isEmpty(errMsgList)) { // 数据中本身存在错误不检查 if (!CollectionUtils.isEmpty(errMsgList)) { // 数据中本身存在错误不检查
return; return;
} }
@ -1413,19 +1422,81 @@ public class InterlockBuilder2 {
} }
// 对应方向信号机存在 // 对应方向信号机存在
if (!CollectionUtils.isEmpty(signal.getRouteList())) { if (!CollectionUtils.isEmpty(signal.getRouteList())) {
log.debug(String.format("进路[%s(%s)]内区段[%s(%s)]存在同向信号机[%s(%s)]" + InterlockBuilder2.log.debug(String.format("进路[%s(%s)]内区段[%s(%s)]存在同向信号机[%s(%s)]" +
"此信号机不能是进路始端信号机,请检查进路是否始端/终端信号机选择错误,或者此信号机是自动信号而非进路始端信号机", "此信号机不能是进路始端信号机,请检查进路是否始端/终端信号机选择错误,或者此信号机是自动信号而非进路始端信号机",
route.getName(), route.getCode(), route.getName(), route.getCode(),
section.getName(), section.getCode(), section.getName(), section.getCode(),
signal.getName(), signal.getCode())); signal.getName(), signal.getCode()));
} else if (Objects.isNull(signal.getAutoSignal())) { } else if (Objects.isNull(signal.getAutoSignal())) {
log.debug(String.format("进路[%s(%s)]内区段[%s(%s)]存在同向信号机[%s(%s)],此信号机却不是自动信号", InterlockBuilder2.log.debug(String.format("进路[%s(%s)]内区段[%s(%s)]存在同向信号机[%s(%s)],此信号机却不是自动信号",
route.getName(), route.getCode(), route.getName(), route.getCode(),
section.getName(), section.getCode(), section.getName(), section.getCode(),
signal.getName(), signal.getCode())); signal.getName(), signal.getCode()));
} }
} }
} }
log.debug("构建自动折返进路耗时:" + (System.currentTimeMillis() - start)); InterlockBuilder2.log.debug("构建自动折返进路耗时:" + (System.currentTimeMillis() - start));
}
/**
* 构建指示灯的逻辑信息
*
* @param elementMap 设备信息
* @param errMsgList 错误信息
* @param indicatorSectionVOList 逻辑关联关系
*/
private static void buildAssistIndicatorLogic(Map<String, MapElement> elementMap, List<String> errMsgList, List<IndicatorSection> indicatorSectionVOList) {
if (!CollectionUtils.isEmpty(indicatorSectionVOList)) {
indicatorSectionVOList.stream().forEach(indicatorSection -> {
// 获取指示灯
Indicator indicator = (Indicator) elementMap.get(indicatorSection.getIndicatorCode());
// 有关联的区间信息
if (!CollectionUtils.isEmpty(indicatorSection.getSectionList())) {
List<Section> sectionList = indicatorSection.getSectionList()
.stream()
.map(sectionCode -> (Section) elementMap.get(sectionCode))
.collect(Collectors.toList());
indicator.setSectionList(sectionList);
}
// 获取站台信息
if (!StringUtils.isEmpty(indicatorSection.getStandCode())) {
Stand stand = (Stand) elementMap.get(indicatorSection.getStandCode());
indicator.setStand(stand);
}
// 获取进路信息
if (!StringUtils.isEmpty(indicatorSection.getRouteCode())) {
Route route = (Route) elementMap.get(indicatorSection.getRouteCode());
indicator.setRoute(route);
}
// 指示灯类型
indicator.setType(IndicatorTypeEnum.getType(indicatorSection.getType()));
indicator.reset();
});
}
}
/**
* 构建按钮的逻辑信息
*
* @param elementMap 设备信息
* @param errMsgList 错误信息
* @param buttonStandVOList 逻辑关联关系
*/
private static void buildAssistButtonLogic(Map<String, MapElement> elementMap, List<String> errMsgList, List<ButtonStand> buttonStandVOList) {
if (!CollectionUtils.isEmpty(buttonStandVOList)) {
buttonStandVOList.stream().forEach(buttonStand -> {
// 获取指示灯
Button button = (Button) elementMap.get(buttonStand.getButtonCode());
// 获取站台信息
if (!StringUtils.isEmpty(buttonStand.getStandCode())) {
Stand stand = (Stand) elementMap.get(buttonStand.getStandCode());
button.setStand(stand);
}
// 指示灯类型
button.setType(ButtonTypeEnum.getType(buttonStand.getType()));
button.reset();
});
}
} }
} }

View File

@ -1,6 +1,7 @@
package club.joylink.rtss.simulation.cbtc.build; package club.joylink.rtss.simulation.cbtc.build;
import club.joylink.rtss.constants.BusinessConsts; import club.joylink.rtss.constants.BusinessConsts;
import club.joylink.rtss.constants.DirectionLabelEnum;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum; import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.simulation.cbtc.constant.SignalModel; import club.joylink.rtss.simulation.cbtc.constant.SignalModel;
import club.joylink.rtss.simulation.cbtc.data.map.*; import club.joylink.rtss.simulation.cbtc.data.map.*;
@ -45,10 +46,10 @@ public class MapDeviceBuilder {
elementMap.put(zc.getCode(), zc); elementMap.put(zc.getCode(), zc);
}); });
// 车站 // 车站
buildStation(graphData, elementMap, deviceMap, errMsgList); MapDeviceBuilder.buildStation(graphData, elementMap, deviceMap, errMsgList);
// 区段 // 区段
List<MapSectionNewVO> sectionList = graphData.getSectionList(); List<MapSectionNewVO> sectionList = graphData.getSectionList();
buildSections(elementMap, deviceMap, errMsgList, sectionList); MapDeviceBuilder.buildSections(elementMap, deviceMap, errMsgList, sectionList);
// 道岔 // 道岔
List<MapSwitchVO> switchList = graphData.getSwitchList(); List<MapSwitchVO> switchList = graphData.getSwitchList();
switchList.forEach(switchVO -> { switchList.forEach(switchVO -> {
@ -105,7 +106,7 @@ public class MapDeviceBuilder {
Section section = (Section) elementMap.get(sectionVO.getCode()); Section section = (Section) elementMap.get(sectionVO.getCode());
if (Objects.equals(BusinessConsts.Section.SectionType.Type02, sectionVO.getType()) || if (Objects.equals(BusinessConsts.Section.SectionType.Type02, sectionVO.getType()) ||
Objects.equals(BusinessConsts.Section.SectionType.Type03, sectionVO.getType()) || Objects.equals(BusinessConsts.Section.SectionType.Type03, sectionVO.getType()) ||
isCross(sectionVO.getType())) { // 逻辑区段/道岔区段/岔心 MapDeviceBuilder.isCross(sectionVO.getType())) { // 逻辑区段/道岔区段/岔心
Section parent = (Section) elementMap.get(sectionVO.getParentCode()); Section parent = (Section) elementMap.get(sectionVO.getParentCode());
if (Objects.isNull(parent)) { if (Objects.isNull(parent)) {
errMsgList.add(String.format("逻辑区段/道岔区段/岔心[%s(%s)]没用关联(道岔)计轴区段或关联的(道岔)计轴区段不存在", errMsgList.add(String.format("逻辑区段/道岔区段/岔心[%s(%s)]没用关联(道岔)计轴区段或关联的(道岔)计轴区段不存在",
@ -366,7 +367,7 @@ public class MapDeviceBuilder {
}); });
} }
// 站台 // 站台
List<MapStationStandNewVO> standList = buildStand(graphData, elementMap, errMsgList); List<MapStationStandNewVO> standList = MapDeviceBuilder.buildStand(graphData, elementMap, errMsgList);
// 站台轨关系数据校验 // 站台轨关系数据校验
List<Section> standTrackList = elementMap.values().stream() List<Section> standTrackList = elementMap.values().stream()
.filter(mapElement -> Objects.equals(mapElement.getDeviceType(), MapElement.DeviceType.SECTION) && .filter(mapElement -> Objects.equals(mapElement.getDeviceType(), MapElement.DeviceType.SECTION) &&
@ -390,9 +391,9 @@ public class MapDeviceBuilder {
}); });
} }
// PSD 站台屏蔽门 // PSD 站台屏蔽门
buildPsd(graphData, elementMap, deviceMap, errMsgList); MapDeviceBuilder.buildPsd(graphData, elementMap, deviceMap, errMsgList);
// ESP 紧急停车按钮 // ESP 紧急停车按钮
buildEsp(graphData, elementMap, errMsgList); MapDeviceBuilder.buildEsp(graphData, elementMap, errMsgList);
// 站台逻辑关系数据检查 // 站台逻辑关系数据检查
standList.forEach(standVO -> { standList.forEach(standVO -> {
Stand stand = (Stand) elementMap.get(standVO.getCode()); Stand stand = (Stand) elementMap.get(standVO.getCode());
@ -407,9 +408,9 @@ public class MapDeviceBuilder {
} }
}); });
// 区段是否站台轨转换轨检查 // 区段是否站台轨转换轨检查
checkSectionFunctionType(elementMap, errMsgList); MapDeviceBuilder.checkSectionFunctionType(elementMap, errMsgList);
// 信号机 // 信号机
buildSignal(graphData, elementMap, deviceMap, errMsgList); MapDeviceBuilder.buildSignal(graphData, elementMap, deviceMap, errMsgList);
// 折返区段左右信号机存在校验 // 折返区段左右信号机存在校验
for (Section section : physicalSectionList) { for (Section section : physicalSectionList) {
@ -692,13 +693,19 @@ public class MapDeviceBuilder {
} }
} }
// 接触网 // 接触网
buildCatenary(graphData, elementMap, errMsgList, mapDataBuildResult.getCatenaryMap()); MapDeviceBuilder.buildCatenary(graphData, elementMap, errMsgList, mapDataBuildResult.getCatenaryMap());
//应答器 //应答器
buildResponderDataRef(graphData, elementMap, errMsgList, mapDataBuildResult.getSectionRespondersMap()); MapDeviceBuilder.buildResponderDataRef(graphData, elementMap, errMsgList, mapDataBuildResult.getSectionRespondersMap());
if (mapDataBuildResult.getErrMsgList().isEmpty()) { if (mapDataBuildResult.getErrMsgList().isEmpty()) {
Map<String, Set<Section>> sectionArriveMap = buildNormalStandTrackAdjoinSections(mapDataBuildResult.getDeviceMap()); Map<String, Set<Section>> sectionArriveMap = MapDeviceBuilder.buildNormalStandTrackAdjoinSections(mapDataBuildResult.getDeviceMap());
mapDataBuildResult.setSectionArriveNearMap(sectionArriveMap); mapDataBuildResult.setSectionArriveNearMap(sectionArriveMap);
} }
// 构建接区间辅助指示灯
MapDeviceBuilder.buildAssistIndicator(elementMap, errMsgList, graphData.getIndicatorLightList());
// 构建辅助改方按钮
MapDeviceBuilder.buildAssistButton(elementMap, errMsgList, graphData.getSignalButtonList());
} }
private static List<MapStationStandNewVO> buildStand(MapGraphDataNewVO graphData, Map<String, MapElement> elementMap, List<String> errMsgList) { private static List<MapStationStandNewVO> buildStand(MapGraphDataNewVO graphData, Map<String, MapElement> elementMap, List<String> errMsgList) {
@ -856,12 +863,12 @@ public class MapDeviceBuilder {
Map<String, Set<Section>> sectionDirectionSectionsMap = new HashMap<>(); Map<String, Set<Section>> sectionDirectionSectionsMap = new HashMap<>();
for (Section section : standTrackList) { for (Section section : standTrackList) {
Set<Section> rightDirectionList = new HashSet<>(); Set<Section> rightDirectionList = new HashSet<>();
sectionDirectionSectionsMap.put(buildSectionDirectionKey(section, true), rightDirectionList); sectionDirectionSectionsMap.put(MapDeviceBuilder.buildSectionDirectionKey(section, true), rightDirectionList);
queryAdjoinSections(section, true, rightDirectionList); MapDeviceBuilder.queryAdjoinSections(section, true, rightDirectionList);
Set<Section> leftDirectionList = new HashSet<>(); Set<Section> leftDirectionList = new HashSet<>();
sectionDirectionSectionsMap.put(buildSectionDirectionKey(section, false), leftDirectionList); sectionDirectionSectionsMap.put(MapDeviceBuilder.buildSectionDirectionKey(section, false), leftDirectionList);
queryAdjoinSections(section, false, leftDirectionList); MapDeviceBuilder.queryAdjoinSections(section, false, leftDirectionList);
log.debug(String.format("区段[%s][右向]邻接区段为[%s],[左向]邻接区段为[%s]", MapDeviceBuilder.log.debug(String.format("区段[%s][右向]邻接区段为[%s],[左向]邻接区段为[%s]",
section.debugStr(), section.debugStr(),
String.join(",", rightDirectionList.stream().map(Section::debugStr).collect(Collectors.toList())), String.join(",", rightDirectionList.stream().map(Section::debugStr).collect(Collectors.toList())),
String.join(",", leftDirectionList.stream().map(Section::debugStr).collect(Collectors.toList())))); String.join(",", leftDirectionList.stream().map(Section::debugStr).collect(Collectors.toList()))));
@ -889,7 +896,7 @@ public class MapDeviceBuilder {
if (next == null) { // 可能到尽头了 if (next == null) { // 可能到尽头了
return; return;
} }
if (checkAdjoinSectionAndAdd(next, rightDirectionList)) { if (MapDeviceBuilder.checkAdjoinSectionAndAdd(next, rightDirectionList)) {
return; return;
} }
signal = next.getSignalOf(right); signal = next.getSignalOf(right);
@ -902,7 +909,7 @@ public class MapDeviceBuilder {
if (signal == null) { if (signal == null) {
return; return;
} }
queryAdjoinSections(signal, rightDirectionList); MapDeviceBuilder.queryAdjoinSections(signal, rightDirectionList);
} }
private static void queryAdjoinSections(Signal signal, Set<Section> rightDirectionList) { private static void queryAdjoinSections(Signal signal, Set<Section> rightDirectionList) {
@ -915,12 +922,12 @@ public class MapDeviceBuilder {
} }
List<Section> sectionList = autoSignal.getSectionList(); List<Section> sectionList = autoSignal.getSectionList();
for (Section temp : sectionList) { for (Section temp : sectionList) {
if (checkAdjoinSectionAndAdd(temp, rightDirectionList)) { if (MapDeviceBuilder.checkAdjoinSectionAndAdd(temp, rightDirectionList)) {
return; return;
} }
signal = temp.getSignalOf(right); signal = temp.getSignalOf(right);
if (signal != null) { if (signal != null) {
queryAdjoinSections(signal, rightDirectionList); MapDeviceBuilder.queryAdjoinSections(signal, rightDirectionList);
} }
} }
} else { } else {
@ -932,7 +939,7 @@ public class MapDeviceBuilder {
List<Section> sectionList = route.getSectionList(); List<Section> sectionList = route.getSectionList();
boolean finish = false; boolean finish = false;
for (Section section : sectionList) { for (Section section : sectionList) {
if (checkAdjoinSectionAndAdd(section, rightDirectionList)) { if (MapDeviceBuilder.checkAdjoinSectionAndAdd(section, rightDirectionList)) {
finish = true; finish = true;
break; break;
} }
@ -942,7 +949,7 @@ public class MapDeviceBuilder {
} }
} }
for (Signal next : queryList) { for (Signal next : queryList) {
queryAdjoinSections(next, rightDirectionList); MapDeviceBuilder.queryAdjoinSections(next, rightDirectionList);
} }
} }
} }
@ -985,17 +992,17 @@ public class MapDeviceBuilder {
} }
elementMap.put(section.getCode(), section); elementMap.put(section.getCode(), section);
section.setRoadType(sectionVO.getRoadType()); section.setRoadType(sectionVO.getRoadType());
section.setPhysical(isPhysicalSection(sectionVO.getType())); section.setPhysical(MapDeviceBuilder.isPhysicalSection(sectionVO.getType()));
section.setAxleCounter(isAxleCounterSection(sectionVO, sectionList)); section.setAxleCounter(MapDeviceBuilder.isAxleCounterSection(sectionVO, sectionList));
section.setCross(isCross(sectionVO.getType())); section.setCross(MapDeviceBuilder.isCross(sectionVO.getType()));
// 计轴区段和道岔区段校验实际长度 // 计轴区段和道岔区段校验实际长度
if (isPhysicalSection(sectionVO.getType()) && if (MapDeviceBuilder.isPhysicalSection(sectionVO.getType()) &&
(Objects.isNull(sectionVO.getLengthFact()) || (Objects.isNull(sectionVO.getLengthFact()) ||
sectionVO.getLengthFact() <= 0 || sectionVO.getLengthFact() <= 0 ||
Float.isInfinite(sectionVO.getLengthFact()) || Float.isInfinite(sectionVO.getLengthFact()) ||
Float.isNaN(sectionVO.getLengthFact()))) { Float.isNaN(sectionVO.getLengthFact()))) {
errMsgList.add(String.format("区段[%s(%s)]实际距离未设置或不为正数", sectionVO.getName(), sectionVO.getCode())); errMsgList.add(String.format("区段[%s(%s)]实际距离未设置或不为正数", sectionVO.getName(), sectionVO.getCode()));
} else if (isPhysicalSection(sectionVO.getType())) { } else if (MapDeviceBuilder.isPhysicalSection(sectionVO.getType())) {
section.setLen(sectionVO.getLengthFact()); section.setLen(sectionVO.getLengthFact());
} }
if (Objects.equals(sectionVO.getType(), BusinessConsts.Section.SectionType.Type02)) { // 逻辑区段 if (Objects.equals(sectionVO.getType(), BusinessConsts.Section.SectionType.Type02)) { // 逻辑区段
@ -1411,7 +1418,7 @@ public class MapDeviceBuilder {
error = true; error = true;
break; break;
} }
boolean find = findSectionsOfUnit(unitLeft, unitRight, sectionSet); boolean find = MapDeviceBuilder.findSectionsOfUnit(unitLeft, unitRight, sectionSet);
if (!find) { if (!find) {
errMsgList.add(String.format("接触网[%s]额外区段配置从区段[%s]向右查找不到区段[%s]", errMsgList.add(String.format("接触网[%s]额外区段配置从区段[%s]向右查找不到区段[%s]",
code, leftSection.debugStr(), rightSection.debugStr())); code, leftSection.debugStr(), rightSection.debugStr()));
@ -1421,7 +1428,7 @@ public class MapDeviceBuilder {
if (error) { if (error) {
continue; continue;
} }
boolean finish = findSectionsOfUnit(leftSection, rightSection, sectionSet); boolean finish = MapDeviceBuilder.findSectionsOfUnit(leftSection, rightSection, sectionSet);
if (!finish) { if (!finish) {
errMsgList.add(String.format("接触网配置从区段[%s]向右查找不到区段[%s]", errMsgList.add(String.format("接触网配置从区段[%s]向右查找不到区段[%s]",
leftSection.debugStr(), rightSection.debugStr())); leftSection.debugStr(), rightSection.debugStr()));
@ -1430,7 +1437,7 @@ public class MapDeviceBuilder {
SectionPosition rightPosition = new SectionPosition(rightSection, line.getRightOffset()); SectionPosition rightPosition = new SectionPosition(rightSection, line.getRightOffset());
Catenary catenary = new Catenary(code, "", leftPosition, rightPosition, sectionSet); Catenary catenary = new Catenary(code, "", leftPosition, rightPosition, sectionSet);
elementMap.put(catenary.getCode(), catenary); elementMap.put(catenary.getCode(), catenary);
catenary.getSectionSet().forEach(s -> addCatenaryMap(s, catenary, catenaryMap)); catenary.getSectionSet().forEach(s -> MapDeviceBuilder.addCatenaryMap(s, catenary, catenaryMap));
} }
} }
} }
@ -1491,7 +1498,7 @@ public class MapDeviceBuilder {
return true; return true;
if (Objects.equals(type, BusinessConsts.Section.SectionType.Type01)) { if (Objects.equals(type, BusinessConsts.Section.SectionType.Type01)) {
String parentCode = sectionVO.getParentCode(); String parentCode = sectionVO.getParentCode();
return sectionList.stream().noneMatch(section -> isCross(section.getType()) && section.getCode().equals(parentCode)); return sectionList.stream().noneMatch(section -> MapDeviceBuilder.isCross(section.getType()) && section.getCode().equals(parentCode));
} else { } else {
return false; return false;
} }
@ -1500,4 +1507,64 @@ public class MapDeviceBuilder {
private static boolean isCross(String type) { private static boolean isCross(String type) {
return Objects.equals(type, BusinessConsts.Section.SectionType.Type05); return Objects.equals(type, BusinessConsts.Section.SectionType.Type05);
} }
/**
* 构建指示灯
*
* @param elementMap 资源map
* @param errMsgList 错误提示
* @param indicatorList 指示灯信息
*/
private static void buildAssistIndicator(Map<String, MapElement> elementMap
, List<String> errMsgList, List<MapIndicatorLightVO> indicatorList) {
indicatorList
.stream()
.filter(mapIndicatorLightVO ->
Arrays.stream(DirectionLabelEnum.values())
.filter(e -> e.equals(mapIndicatorLightVO.getLabelEnum()))
.findAny()
.isPresent()
)
.forEach(mapSignalButtonVO -> {
if (elementMap.containsKey(mapSignalButtonVO.getCode())) {
errMsgList.add(String.format("指示灯[%s]必须唯一", mapSignalButtonVO.getCode()));
} else {
Indicator indicator = new Indicator(mapSignalButtonVO.getCode(), mapSignalButtonVO.getName());
indicator.setLabel(mapSignalButtonVO.getLabelEnum());
Station station = (Station) elementMap.get(mapSignalButtonVO.getStationCode());
indicator.setStation(station);
elementMap.put(indicator.getCode(), indicator);
}
});
}
/**
* 构建按钮设备
*
* @param elementMap 设备Map
* @param errMsgList 错误列表
* @param signalButtonList 按钮列表
*/
private static void buildAssistButton(Map<String, MapElement> elementMap
, List<String> errMsgList, List<MapSignalButtonVO> signalButtonList) {
signalButtonList
.stream()
.filter(mapSignalButtonVO ->
Arrays.stream(DirectionLabelEnum.values())
.filter(e -> e.equals(mapSignalButtonVO.getLabelEnum()))
.findAny()
.isPresent()
)
.forEach(mapSignalButtonVO -> {
if (elementMap.containsKey(mapSignalButtonVO.getCode())) {
errMsgList.add(String.format("按钮[%s]必须唯一", mapSignalButtonVO.getCode()));
} else {
Button button = new Button(mapSignalButtonVO.getCode(), mapSignalButtonVO.getName());
button.setLabel(mapSignalButtonVO.getLabelEnum());
Station station = (Station) elementMap.get(mapSignalButtonVO.getStationCode());
button.setStation(station);
elementMap.put(button.getCode(), button);
}
});
}
} }

View File

@ -2,7 +2,6 @@ package club.joylink.rtss.simulation.cbtc.data.map;
import club.joylink.rtss.constants.ButtonTypeEnum; import club.joylink.rtss.constants.ButtonTypeEnum;
import club.joylink.rtss.constants.DirectionLabelEnum; import club.joylink.rtss.constants.DirectionLabelEnum;
import club.joylink.rtss.simulation.cbtc.constant.SignalAspect;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -37,12 +36,17 @@ public class Button extends MapNamedElement {
*/ */
private ButtonTypeEnum type; private ButtonTypeEnum type;
public Button(String code, String name) {
super(code, name, DeviceType.BUTTON);
isPressDown = Boolean.FALSE;
}
protected Button(String code, String name, DeviceType deviceType) { protected Button(String code, String name, DeviceType deviceType) {
super(code, name, deviceType); super(code, name, deviceType);
} }
@Override @Override
public void reset() { public void reset() {
this.isPressDown = Boolean.FALSE; isPressDown = Boolean.FALSE;
} }
} }

View File

@ -4,31 +4,22 @@ package club.joylink.rtss.simulation.cbtc.data.map;
import club.joylink.rtss.constants.DirectionLabelEnum; import club.joylink.rtss.constants.DirectionLabelEnum;
import club.joylink.rtss.constants.IndicatorStatusEnum; import club.joylink.rtss.constants.IndicatorStatusEnum;
import club.joylink.rtss.constants.IndicatorTypeEnum; import club.joylink.rtss.constants.IndicatorTypeEnum;
import club.joylink.rtss.simulation.cbtc.constant.SignalAspect;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.util.List;
/** /**
* 指示灯设备 * 指示灯设备
*/ */
@Setter @Setter
@Getter @Getter
public class Indicator extends MapNamedElement{ public class Indicator extends MapNamedElement {
/** /**
* 车站 * 车站
*/ */
private Station station; private Station station;
/**
* 站台
*/
private Stand stand;
/**
* 进路
*/
private Route route;
/** /**
* 当前信号显示 * 当前信号显示
*/ */
@ -39,15 +30,35 @@ public class Indicator extends MapNamedElement{
*/ */
private DirectionLabelEnum label; private DirectionLabelEnum label;
/**
* 是否改方状态
*/
private boolean isChangeDirection;
/**
* 区段信息
*/
private List<Section> sectionList;
/**
* 站台
*/
private Stand stand;
/**
* 进路
*/
private Route route;
/** /**
* 灯类型 * 灯类型
*/ */
private IndicatorTypeEnum type; private IndicatorTypeEnum type;
/** public Indicator(String code, String name) {
* 是否改方状态 super(code, name, DeviceType.INDICATOR);
*/ isChangeDirection = Boolean.FALSE;
private boolean isChangeDirection; }
protected Indicator(String code, String name, DeviceType deviceType) { protected Indicator(String code, String name, DeviceType deviceType) {
super(code, name, deviceType); super(code, name, deviceType);
@ -55,19 +66,20 @@ public class Indicator extends MapNamedElement{
@Override @Override
public void reset() { public void reset() {
this.aspect = getDefaultStatus(); aspect = getDefaultStatus();
} }
/** /**
* 获取默认状态 * 获取默认状态
*
* @return 默认状态 * @return 默认状态
*/ */
public IndicatorStatusEnum getDefaultStatus(){ public IndicatorStatusEnum getDefaultStatus() {
// //
if (DirectionLabelEnum.S.equals(label) && IndicatorTypeEnum.RECEIVE.equals(type)) { if (DirectionLabelEnum.S.equals(label) && IndicatorTypeEnum.RECEIVE.equals(type)) {
return IndicatorStatusEnum.Y; return IndicatorStatusEnum.Y;
// //
} else if(DirectionLabelEnum.XF.equals(label) && IndicatorTypeEnum.DELIVER.equals(type)) { } else if (DirectionLabelEnum.XF.equals(label) && IndicatorTypeEnum.DELIVER.equals(type)) {
return IndicatorStatusEnum.G; return IndicatorStatusEnum.G;
} else { } else {
return IndicatorStatusEnum.No; return IndicatorStatusEnum.No;
@ -76,6 +88,7 @@ public class Indicator extends MapNamedElement{
/** /**
* 获取进路办理后的指示灯状态 * 获取进路办理后的指示灯状态
*
* @return 办理状态 * @return 办理状态
*/ */
public IndicatorStatusEnum setLockRouteStatus() { public IndicatorStatusEnum setLockRouteStatus() {

View File

@ -13,68 +13,136 @@ public abstract class MapElement {
*/ */
public abstract void reset(); public abstract void reset();
/** 设备类型 */ /**
* 设备类型
*/
public enum DeviceType { public enum DeviceType {
/** 区段 */ /**
* 区段
*/
SECTION, SECTION,
/** 计轴器 */ /**
* 计轴器
*/
AXLE_COUNTER, AXLE_COUNTER,
/** 道岔 */ /**
* 道岔
*/
SWITCH, SWITCH,
/** 信号机 */ /**
* 信号机
*/
SIGNAL, SIGNAL,
/** 车站 */ /**
* 车站
*/
STATION, STATION,
/** 站台 */ /**
* 站台
*/
STAND, STAND,
/** 屏蔽门 */ /**
* 屏蔽门
*/
PSD, PSD,
/** 紧急停车按钮 */ /**
* 紧急停车按钮
*/
ESP, ESP,
/** 区域控制器 */ /**
* 区域控制器
*/
ZC, ZC,
/** 线路控制器 */ /**
* 线路控制器
*/
LC, LC,
/** 进路 */ /**
* 进路
*/
ROUTE, ROUTE,
/** 进路延续保护 */ /**
* 进路延续保护
*/
OVERLAP, OVERLAP,
/** 超限区段 */ /**
* 超限区段
*/
OVERRUN, OVERRUN,
/** 侧防 */ /**
* 侧防
*/
FLANK_PROTECTION, FLANK_PROTECTION,
/** 自动信号 */ /**
* 自动信号
*/
AUTO_SIGNAL, AUTO_SIGNAL,
/** 自动折返 */ /**
* 自动折返
*/
CYCLE, CYCLE,
/** 列车 */ /**
* 列车
*/
TRAIN, TRAIN,
/** 列车门 */ /**
* 列车门
*/
TRAIN_DOOR, TRAIN_DOOR,
/** 交路 */ /**
* 交路
*/
ROUTING, ROUTING,
/** 站间运行等级 */ /**
* 站间运行等级
*/
RUN_LEVEL, RUN_LEVEL,
/** 方向杆 */ /**
* 方向杆
*/
DIRECTION_ROD, DIRECTION_ROD,
/** 接触网 */ /**
* 接触网
*/
CATENARY, CATENARY,
/**应答器*/ /**
* 应答器
*/
RESPONDER, RESPONDER,
/** 综合后备盘 */ /**
* 综合后备盘
*/
IBP, IBP,
/** 就地控制盘 */ /**
* 就地控制盘
*/
PSL, PSL,
/** 服务器 */ /**
* 服务器
*/
SERVER, SERVER,
/** 广播 */ /**
* 广播
*/
AUDIO, AUDIO,
/**
* 指示灯
*/
INDICATOR,
/**
* 操作按钮
*/
BUTTON
} }
/** 设备唯一编号 */ /**
* 设备唯一编号
*/
private String code; private String code;
/** 设备类型 */ /**
* 设备类型
*/
private DeviceType deviceType; private DeviceType deviceType;
protected MapElement(String code, DeviceType deviceType) { protected MapElement(String code, DeviceType deviceType) {

View File

@ -9,6 +9,7 @@
<result column="stand_code" jdbcType="VARCHAR" property="standCode"/> <result column="stand_code" jdbcType="VARCHAR" property="standCode"/>
<result column="next_stand_code" jdbcType="VARCHAR" property="nextStandCode"/> <result column="next_stand_code" jdbcType="VARCHAR" property="nextStandCode"/>
<result column="pre_stand_code" jdbcType="VARCHAR" property="preStandCode"/> <result column="pre_stand_code" jdbcType="VARCHAR" property="preStandCode"/>
<result column="type" javaType="VARCHAR" property="type"/>
</resultMap> </resultMap>
<sql id="Example_Where_Clause"> <sql id="Example_Where_Clause">
@ -74,7 +75,7 @@
</sql> </sql>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, map_id, button_code, stand_code, next_stand_code, pre_stand_code id, map_id, button_code, stand_code, next_stand_code, pre_stand_code,`type`
</sql> </sql>
<select id="selectByExample" parameterType="club.joylink.rtss.entity.ButtonStandExample" <select id="selectByExample" parameterType="club.joylink.rtss.entity.ButtonStandExample"
@ -121,10 +122,10 @@
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.ButtonStand" <insert id="insert" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.ButtonStand"
useGeneratedKeys="true"> useGeneratedKeys="true">
insert into button_stand_route (map_id, button_code,stand_code,next_stand_code,pre_stand_code) insert into button_stand_route (map_id, button_code,stand_code,next_stand_code,pre_stand_code,type)
values ( values (
#{mapId,jdbcType=BIGINT}, #{buttonCode,jdbcType=VARCHAR}, #{standCode,jdbcType=VARCHAR}, #{mapId,jdbcType=BIGINT}, #{buttonCode,jdbcType=VARCHAR}, #{standCode,jdbcType=VARCHAR},
#{nextStandCode,jdbcType=VARCHAR}, #{preStandCode,jdbcType=VARCHAR} #{nextStandCode,jdbcType=VARCHAR}, #{preStandCode,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}
) )
</insert> </insert>
@ -137,6 +138,7 @@
<if test="standCode != null">stand_code,</if> <if test="standCode != null">stand_code,</if>
<if test="nextStandCode != null">next_stand_code,</if> <if test="nextStandCode != null">next_stand_code,</if>
<if test="preStandCode != null">pre_stand_code,</if> <if test="preStandCode != null">pre_stand_code,</if>
<if test="type != null">type,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="mapId != null">#{mapId,jdbcType=BIGINT},</if> <if test="mapId != null">#{mapId,jdbcType=BIGINT},</if>
@ -144,6 +146,7 @@
<if test="standCode != null">#{standCode,jdbcType=VARCHAR},</if> <if test="standCode != null">#{standCode,jdbcType=VARCHAR},</if>
<if test="nextStandCode != null">#{nextStandCode,jdbcType=VARCHAR},</if> <if test="nextStandCode != null">#{nextStandCode,jdbcType=VARCHAR},</if>
<if test="preStandCode != null">#{preStandCode,jdbcType=VARCHAR},</if> <if test="preStandCode != null">#{preStandCode,jdbcType=VARCHAR},</if>
<if test="type != null">#{type,jdbcType=VARCHAR},</if>
</trim> </trim>
</insert> </insert>
@ -175,6 +178,9 @@
<if test="record.preStandCode != null"> <if test="record.preStandCode != null">
pre_stand_code = #{record.preStandCode,jdbcType=VARCHAR}, pre_stand_code = #{record.preStandCode,jdbcType=VARCHAR},
</if> </if>
<if test="record.type != null">
type = #{record.type,jdbcType=VARCHAR},
</if>
</set> </set>
<if test="_parameter != null"> <if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause"/> <include refid="Update_By_Example_Where_Clause"/>
@ -188,7 +194,8 @@
button_code = #{record.buttonCode,jdbcType=VARCHAR}, button_code = #{record.buttonCode,jdbcType=VARCHAR},
stand_code = #{record.standCode,jdbcType=VARCHAR}, stand_code = #{record.standCode,jdbcType=VARCHAR},
next_stand_code = #{record.nextStandCode,jdbcType=VARCHAR}, next_stand_code = #{record.nextStandCode,jdbcType=VARCHAR},
pre_stand_code = #{record.preStandCode,jdbcType=VARCHAR} pre_stand_code = #{record.preStandCode,jdbcType=VARCHAR},
type = #{record.type,jdbcType=VARCHAR}
<if test="_parameter != null"> <if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause"/> <include refid="Update_By_Example_Where_Clause"/>
</if> </if>
@ -212,6 +219,9 @@
<if test="preStandCode != null"> <if test="preStandCode != null">
pre_stand_code = #{preStandCode,jdbcType=VARCHAR}, pre_stand_code = #{preStandCode,jdbcType=VARCHAR},
</if> </if>
<if test="type != null">
type = #{type,jdbcType=VARCHAR},
</if>
</set> </set>
where id = #{id,jdbcType=BIGINT} where id = #{id,jdbcType=BIGINT}
</update> </update>
@ -222,7 +232,8 @@
button_code = #{buttonCode,jdbcType=VARCHAR}, button_code = #{buttonCode,jdbcType=VARCHAR},
stand_code = #{standCode,jdbcType=VARCHAR}, stand_code = #{standCode,jdbcType=VARCHAR},
next_stand_code = #{nextStandCode,jdbcType=VARCHAR}, next_stand_code = #{nextStandCode,jdbcType=VARCHAR},
pre_stand_code = #{preStandCode,jdbcType=VARCHAR} pre_stand_code = #{preStandCode,jdbcType=VARCHAR},
type = #{type,jdbcType=VARCHAR}
where id = #{id,jdbcType=BIGINT} where id = #{id,jdbcType=BIGINT}
</update> </update>
</mapper> </mapper>

View File

@ -10,6 +10,7 @@
<result column="next_stand_code" jdbcType="VARCHAR" property="nextStandCode"/> <result column="next_stand_code" jdbcType="VARCHAR" property="nextStandCode"/>
<result column="pre_stand_code" jdbcType="VARCHAR" property="preStandCode"/> <result column="pre_stand_code" jdbcType="VARCHAR" property="preStandCode"/>
<result column="route_code" jdbcType="VARCHAR" property="routeCode"/> <result column="route_code" jdbcType="VARCHAR" property="routeCode"/>
<result column="type" jdbcType="VARCHAR" property="type"/>
</resultMap> </resultMap>
<sql id="Example_Where_Clause"> <sql id="Example_Where_Clause">
@ -75,7 +76,7 @@
</sql> </sql>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, map_id, indicator_code, sections_code, stand_code, next_stand_code, pre_stand_code, route_code id, map_id, indicator_code, sections_code, stand_code, next_stand_code, pre_stand_code, route_code, type
</sql> </sql>
<select id="selectByExample" parameterType="club.joylink.rtss.entity.IndicatorSectionExample" <select id="selectByExample" parameterType="club.joylink.rtss.entity.IndicatorSectionExample"
@ -123,12 +124,12 @@
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.IndicatorSection" <insert id="insert" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.IndicatorSection"
useGeneratedKeys="true"> useGeneratedKeys="true">
insert into indicator_section_stand_route ( insert into indicator_section_stand_route (
map_id, indicator_code, sections_code, stand_code, next_stand_code,pre_stand_code, route_code map_id, indicator_code, sections_code, stand_code, next_stand_code,pre_stand_code, route_code,type
) )
values ( values (
#{mapId,jdbcType=BIGINT}, #{indicatorCode,jdbcType=VARCHAR}, #{sectionsCode,jdbcType=VARCHAR}, #{mapId,jdbcType=BIGINT}, #{indicatorCode,jdbcType=VARCHAR}, #{sectionsCode,jdbcType=VARCHAR},
#{standCode,jdbcType=VARCHAR},#{nextStandCode,jdbcType=VARCHAR}, #{preStandCode,jdbcType=VARCHAR}, #{standCode,jdbcType=VARCHAR},#{nextStandCode,jdbcType=VARCHAR}, #{preStandCode,jdbcType=VARCHAR},
#{routeCode,jdbcType=VARCHAR} #{routeCode,jdbcType=VARCHAR},#{type,jdbcType=VARCHAR}
) )
</insert> </insert>
@ -144,6 +145,7 @@
<if test="nextStandCode != null">next_stand_code,</if> <if test="nextStandCode != null">next_stand_code,</if>
<if test="preStandCode != null">pre_stand_code,</if> <if test="preStandCode != null">pre_stand_code,</if>
<if test="routeCode != null">route_code,</if> <if test="routeCode != null">route_code,</if>
<if test="type != null">type,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="mapId != null">#{mapId,jdbcType=BIGINT},</if> <if test="mapId != null">#{mapId,jdbcType=BIGINT},</if>
@ -153,6 +155,7 @@
<if test="nextStandCode != null">#{nextStandCode,jdbcType=VARCHAR},</if> <if test="nextStandCode != null">#{nextStandCode,jdbcType=VARCHAR},</if>
<if test="preStandCode != null">#{preStandCode,jdbcType=VARCHAR},</if> <if test="preStandCode != null">#{preStandCode,jdbcType=VARCHAR},</if>
<if test="routeCode != null">#{routeCode,jdbcType=VARCHAR},</if> <if test="routeCode != null">#{routeCode,jdbcType=VARCHAR},</if>
<if test="type != null">#{type,jdbcType=VARCHAR},</if>
</trim> </trim>
</insert> </insert>
@ -206,7 +209,8 @@
stand_code = #{record.standCode,jdbcType=VARCHAR}, stand_code = #{record.standCode,jdbcType=VARCHAR},
next_stand_code = #{record.nextStandCode,jdbcType=VARCHAR}, next_stand_code = #{record.nextStandCode,jdbcType=VARCHAR},
pre_stand_code = #{record.preStandCode,jdbcType=VARCHAR}, pre_stand_code = #{record.preStandCode,jdbcType=VARCHAR},
route_code = #{record.routeCode,jdbcType=VARCHAR} route_code = #{record.routeCode,jdbcType=VARCHAR},
type = #{record.type,jdbcType=VARCHAR}
<if test="_parameter != null"> <if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause"/> <include refid="Update_By_Example_Where_Clause"/>
</if> </if>
@ -236,6 +240,9 @@
<if test="routeCode != null"> <if test="routeCode != null">
route_code = #{routeCode,jdbcType=VARCHAR}, route_code = #{routeCode,jdbcType=VARCHAR},
</if> </if>
<if test="type != null">
type = #{type,jdbcType=VARCHAR},
</if>
</set> </set>
where id = #{id,jdbcType=BIGINT} where id = #{id,jdbcType=BIGINT}
</update> </update>
@ -249,7 +256,8 @@
stand_code = #{standCode,jdbcType=VARCHAR}, stand_code = #{standCode,jdbcType=VARCHAR},
next_stand_code = #{nextStandCode,jdbcType=VARCHAR}, next_stand_code = #{nextStandCode,jdbcType=VARCHAR},
pre_stand_code = #{preStandCode,jdbcType=VARCHAR}, pre_stand_code = #{preStandCode,jdbcType=VARCHAR},
route_code = #{routeCode,jdbcType=VARCHAR} route_code = #{routeCode,jdbcType=VARCHAR},
type = #{type,jdbcType=VARCHAR}
where id = #{id,jdbcType=BIGINT} where id = #{id,jdbcType=BIGINT}
</update> </update>
</mapper> </mapper>