diff --git a/src/main/java/club/joylink/rtss/constants/MapPrdTypeEnum.java b/src/main/java/club/joylink/rtss/constants/MapPrdTypeEnum.java index 91c97a423..f4503c99f 100644 --- a/src/main/java/club/joylink/rtss/constants/MapPrdTypeEnum.java +++ b/src/main/java/club/joylink/rtss/constants/MapPrdTypeEnum.java @@ -11,6 +11,7 @@ public enum MapPrdTypeEnum { SCHEDULING("05", "派班工作站"), ISCS("06", "ISCS工作站"), BIG_SCREEN("07", "大屏工作站"), + RUN_PLAN_MAKE("08", "运行图编制工作站") ; private String code; diff --git a/src/main/java/club/joylink/rtss/controller/publish/MapController.java b/src/main/java/club/joylink/rtss/controller/publish/MapController.java index 51cb6bafa..64009d08a 100644 --- a/src/main/java/club/joylink/rtss/controller/publish/MapController.java +++ b/src/main/java/club/joylink/rtss/controller/publish/MapController.java @@ -11,10 +11,7 @@ import club.joylink.rtss.vo.UserVO; import club.joylink.rtss.vo.client.*; import club.joylink.rtss.vo.client.local.LocalDataVO; import club.joylink.rtss.vo.client.map.*; -import club.joylink.rtss.vo.client.map.newmap.MapGraphDataNewVO; -import club.joylink.rtss.vo.client.map.newmap.MapPSDVO; -import club.joylink.rtss.vo.client.map.newmap.MapStationNewVO; -import club.joylink.rtss.vo.client.map.newmap.MapStationStandNewVO; +import club.joylink.rtss.vo.client.map.newmap.*; import club.joylink.rtss.vo.client.validGroup.MapInfoSortCheck; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -251,6 +248,12 @@ public class MapController { return this.iMapService.getStationHasPsdStands(id, stationCode); } + @ApiOperation("获取地图车站下的区段") + @GetMapping("/{id}/station/{stationCode}/sections") + public List querySectionsUnderTheStation(@PathVariable Long id, @PathVariable String stationCode){ + return this.iMapService.querySectionsUnderTheStation(id, stationCode); + } + @ApiOperation(value = "获取地图站台关联的屏蔽门") @GetMapping("/{id}/stand/{standCode}/psd") public List getStandPsds(@PathVariable Long id, @@ -287,4 +290,10 @@ public class MapController { public List getAllStations() { return iMapService.getAllStations(); } + + @ApiOperation("查询地图下所有区段") + @GetMapping("/{id}/sections") + public List querySectionsUnderMap(@PathVariable Long id) { + return iMapService.querySectionsUnderMap(id); + } } diff --git a/src/main/java/club/joylink/rtss/controller/simulation/SimulationV1Controller.java b/src/main/java/club/joylink/rtss/controller/simulation/SimulationV1Controller.java index 3129c1a61..d78321009 100644 --- a/src/main/java/club/joylink/rtss/controller/simulation/SimulationV1Controller.java +++ b/src/main/java/club/joylink/rtss/controller/simulation/SimulationV1Controller.java @@ -276,8 +276,8 @@ public class SimulationV1Controller { @ApiOperation("按下IBP盘按钮") @PutMapping("/{group}/ibp/{button}") - public void pressIbpButton(@PathVariable String group, String stationCode, @PathVariable VirtualRealityIbp.Button button) { - iVirtualRealityIBPService.pressTheButton(group, stationCode, button); + public void pressIbpButton(@PathVariable String group, String stationCode, @PathVariable VirtualRealityIbp.ButtonType button, String buttonCode) { + iVirtualRealityIBPService.pressTheButton(group, stationCode, button, buttonCode); } @ApiOperation("查询报警列表") diff --git a/src/main/java/club/joylink/rtss/services/IMapService.java b/src/main/java/club/joylink/rtss/services/IMapService.java index c801dba73..4549e4d82 100644 --- a/src/main/java/club/joylink/rtss/services/IMapService.java +++ b/src/main/java/club/joylink/rtss/services/IMapService.java @@ -8,6 +8,7 @@ import club.joylink.rtss.vo.client.PageQueryVO; import club.joylink.rtss.vo.client.PageVO; import club.joylink.rtss.vo.client.map.*; import club.joylink.rtss.vo.client.map.newmap.MapPSDVO; +import club.joylink.rtss.vo.client.map.newmap.MapSectionNewVO; import club.joylink.rtss.vo.client.map.newmap.MapStationNewVO; import club.joylink.rtss.vo.client.map.newmap.MapStationStandNewVO; @@ -281,4 +282,14 @@ public interface IMapService { * 获取所有车站 */ List getAllStations(); + + /** + * 查询地图/车站下的区段 + */ + List querySectionsUnderTheStation(Long id, String stationCode); + + /** + * 查询地图下的所有区段 + */ + List querySectionsUnderMap(Long id); } diff --git a/src/main/java/club/joylink/rtss/services/IVirtualRealityIbpService.java b/src/main/java/club/joylink/rtss/services/IVirtualRealityIbpService.java index a8d469bff..fe7797398 100644 --- a/src/main/java/club/joylink/rtss/services/IVirtualRealityIbpService.java +++ b/src/main/java/club/joylink/rtss/services/IVirtualRealityIbpService.java @@ -15,8 +15,9 @@ public interface IVirtualRealityIbpService { /** * 按下按钮 + * @param buttonCode 区分统一类型按钮,目前只是宁波一的区段按钮 */ - void pressTheButton(String group, String stationCode, VirtualRealityIbp.Button button); + void pressTheButton(String group, String stationCode, VirtualRealityIbp.ButtonType button, String buttonCode); /** * 收集并发送IBP的状态数据 diff --git a/src/main/java/club/joylink/rtss/services/MapService.java b/src/main/java/club/joylink/rtss/services/MapService.java index 4e038e094..c2c14a9b7 100644 --- a/src/main/java/club/joylink/rtss/services/MapService.java +++ b/src/main/java/club/joylink/rtss/services/MapService.java @@ -23,6 +23,7 @@ import club.joylink.rtss.vo.client.PageQueryVO; import club.joylink.rtss.vo.client.PageVO; import club.joylink.rtss.vo.client.map.*; import club.joylink.rtss.vo.client.map.newmap.MapPSDVO; +import club.joylink.rtss.vo.client.map.newmap.MapSectionNewVO; import club.joylink.rtss.vo.client.map.newmap.MapStationNewVO; import club.joylink.rtss.vo.client.map.newmap.MapStationStandNewVO; import club.joylink.rtss.vo.client.runplan.RunPlanLoadVO; @@ -839,6 +840,19 @@ public class MapService implements IMapService { .map(MapVO::findSortedAllStationListNew).flatMap(Collection::stream).collect(Collectors.toList()); } + @Override + public List querySectionsUnderTheStation(Long id, String stationCode) { + MapVO mapDetail = getMapDetail(id); + return mapDetail.getGraphDataNew().getSectionList().stream() + .filter(section -> Objects.equals(section.getBelongStation(), stationCode)).collect(Collectors.toList()); + } + + @Override + public List querySectionsUnderMap(Long id) { + MapVO mapDetail = getMapDetail(id); + return mapDetail.getGraphDataNew().getSectionList(); + } + /** * 该版本的地图数据是否存在 */ diff --git a/src/main/java/club/joylink/rtss/services/OrderService.java b/src/main/java/club/joylink/rtss/services/OrderService.java index 8121208a4..a87b4af9c 100644 --- a/src/main/java/club/joylink/rtss/services/OrderService.java +++ b/src/main/java/club/joylink/rtss/services/OrderService.java @@ -1,8 +1,10 @@ package club.joylink.rtss.services; +import club.joylink.rtss.configuration.configProp.OtherConfig; import club.joylink.rtss.constants.BusinessConsts; import club.joylink.rtss.constants.SaleOrderPayStatusEnum; import club.joylink.rtss.constants.SaleOrderTypeEnum; +import club.joylink.rtss.constants.SystemEnv; import club.joylink.rtss.dao.SaleOrderDAO; import club.joylink.rtss.dao.SaleOrderDetailDAO; import club.joylink.rtss.entity.SaleOrder; @@ -57,6 +59,9 @@ public class OrderService implements IOrderService { @Autowired private WechatPayService wechatPayService; + @Autowired + private OtherConfig otherConfig; + @Override public PageVO queryPagedOrders(OrderQueryVO queryVO) { return queryPagedOrders(queryVO, null); @@ -155,6 +160,9 @@ public class OrderService implements IOrderService { @Override public WxPayUnifiedOrderResultVO pay(long id, String payType, String description) { SaleOrder order = getEntity(id); + if (!SystemEnv.isPrdEnv(otherConfig.getEnv())) { + order.setCode(order.getCode() + "-" + otherConfig.getEnv()); + } if (!StringUtils.hasText(description)) { description = "城轨平台权限"; } @@ -281,7 +289,8 @@ public class OrderService implements IOrderService { SaleOrderTypeEnum type = SaleOrderTypeEnum.getSaleOrderTypeByCode(createVO.getOrderType()); switch (type) { case Individual: - BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotNull(createVO.getPrice(), "个人订单价格不能为空"); + BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertTrue(createVO.getPrice() != null || createVO.getPriceInCents() != null, + "个人订单价格不能为空"); case Business_Contract: // BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotNull(createVO.getOrganizationId(), "订单组织/单位不能为空"); // BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotNull(createVO.getContractNo(), "订单合同号不能为空"); @@ -298,7 +307,7 @@ public class OrderService implements IOrderService { BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotNull(createVO.getStartTime(), "非永久订单开始时间不能为空"); BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotNull(createVO.getMonthAmount(), "非永久订单购买时长不能为空"); } - BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotNull(createVO.getPrice(), "订单总价不能为空"); + BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertTrue(createVO.getPrice() != null || createVO.getPriceInCents() != null, "订单总价不能为空"); BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotNull(createVO.getPayWays(), "订单支付方式不能为空"); BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotNull(createVO.getPayStatus(), "订单支付状态不能为空"); break; diff --git a/src/main/java/club/joylink/rtss/services/OrgUserService.java b/src/main/java/club/joylink/rtss/services/OrgUserService.java index 4db0966b6..e8eb03f5c 100644 --- a/src/main/java/club/joylink/rtss/services/OrgUserService.java +++ b/src/main/java/club/joylink/rtss/services/OrgUserService.java @@ -80,6 +80,8 @@ public class OrgUserService implements IOrgUserService { public CompanyVO create(CompanyVO companyVO) { Org entity = companyVO.toDB(); this.orgDAO.insert(entity); + entity.setRootId(entity.getId()); + orgDAO.updateByPrimaryKey(entity); return new CompanyVO(entity); } diff --git a/src/main/java/club/joylink/rtss/services/VirtualRealityIbpService.java b/src/main/java/club/joylink/rtss/services/VirtualRealityIbpService.java index c3be33172..2c37a5dfc 100644 --- a/src/main/java/club/joylink/rtss/services/VirtualRealityIbpService.java +++ b/src/main/java/club/joylink/rtss/services/VirtualRealityIbpService.java @@ -55,7 +55,7 @@ public class VirtualRealityIbpService implements IVirtualRealityIbpService { } @Override - public void pressTheButton(String group, String stationCode, VirtualRealityIbp.Button button) { + public void pressTheButton(String group, String stationCode, VirtualRealityIbp.ButtonType button, String buttonCode) { Objects.requireNonNull(group); Objects.requireNonNull(button); @@ -109,6 +109,9 @@ public class VirtualRealityIbpService implements IVirtualRealityIbpService { case SXYS: ibp.setSxys(!ibp.isSxys()); break; + case PRERESET: + ciApiService.axleReset(simulation, buttonCode); + break; } } diff --git a/src/main/java/club/joylink/rtss/services/completition/CompetitionPracticalService.java b/src/main/java/club/joylink/rtss/services/completition/CompetitionPracticalService.java index eb91b98bf..d86c819a9 100644 --- a/src/main/java/club/joylink/rtss/services/completition/CompetitionPracticalService.java +++ b/src/main/java/club/joylink/rtss/services/completition/CompetitionPracticalService.java @@ -437,7 +437,7 @@ public class CompetitionPracticalService implements ICompetitionPracticalService SaleGoods goods = iGoodsService.getByPermissionId(permission.getId()); //创建订单 OrderCreateVO orderCreate = new OrderCreateVO(); - orderCreate.setPrice(200f * monthAmount); + orderCreate.setPriceInCents(20000 * monthAmount); orderCreate.setPayWays(SaleOrderPayWaysEnum.Wechat.getCode()); orderCreate.setPayStatus(SaleOrderPayStatusEnum.Unpaid.getCode()); orderCreate.setOrderType(SaleOrderTypeEnum.Individual.getCode()); diff --git a/src/main/java/club/joylink/rtss/services/pay/wechat/WechatPayService.java b/src/main/java/club/joylink/rtss/services/pay/wechat/WechatPayService.java index 4cf4c5485..36d2e463b 100644 --- a/src/main/java/club/joylink/rtss/services/pay/wechat/WechatPayService.java +++ b/src/main/java/club/joylink/rtss/services/pay/wechat/WechatPayService.java @@ -178,7 +178,81 @@ public class WechatPayService { // System.out.println(decryptToString(associated_data.getBytes(), nonce.getBytes(), ciphertext)); WechatPayService service = new WechatPayService(); - service.queryOrder("2021012900013"); + new Thread(() -> { + try { + service.queryOrder("2021012900013"); + System.out.println("Thread_" + 1); + for (; ; ) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + }).start(); + new Thread(() -> { + try { + service.queryOrder("2021012900013"); + System.out.println("Thread_" + 2); + for (; ; ) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + }).start(); + new Thread(() -> { + try { + service.queryOrder("2021012900013"); + System.out.println("Thread_" + 3); + for (; ; ) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + }).start(); + new Thread(() -> { + try { + service.queryOrder("2021012900013"); + System.out.println("Thread_" + 4); + for (; ; ) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + }).start(); + new Thread(() -> { + try { + service.queryOrder("2021012900013"); + System.out.println("Thread_" + 5); + for (; ; ) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + }).start(); } /** diff --git a/src/main/java/club/joylink/rtss/services/training/generatornew/GeneratorNew.java b/src/main/java/club/joylink/rtss/services/training/generatornew/GeneratorNew.java index e5cfb29a5..b814f6e68 100644 --- a/src/main/java/club/joylink/rtss/services/training/generatornew/GeneratorNew.java +++ b/src/main/java/club/joylink/rtss/services/training/generatornew/GeneratorNew.java @@ -59,6 +59,9 @@ public interface GeneratorNew { case STAND: ((Stand) mapDevice).getDeviceStation().setControlMode(Station.ControlMode.Local); break; + case CYCLE: + ((Cycle) mapDevice).getStation().setControlMode(Station.ControlMode.Local); + break; } } // 实训基本信息 diff --git a/src/main/java/club/joylink/rtss/services/training/generatornew/base/SignalGeneratorNew.java b/src/main/java/club/joylink/rtss/services/training/generatornew/base/SignalGeneratorNew.java index 2b4fdd213..8fefb6193 100644 --- a/src/main/java/club/joylink/rtss/services/training/generatornew/base/SignalGeneratorNew.java +++ b/src/main/java/club/joylink/rtss/services/training/generatornew/base/SignalGeneratorNew.java @@ -329,13 +329,16 @@ public class SignalGeneratorNew implements GeneratorNew { } case Signal_Set_Guide: { // 若信号机可开引导信号,则生成实训,暂不设置背景(暂时先简单处理,此处业务比较复杂,需明确后再生成各种情况的实训) - if (signal.isCallOn()) { // 不是引导信号机,不生成 +// if (signal.isCallOn()) { // 不是引导信号机,不生成 //非折返进路办理引导 List notTurnBackRouteList = routeList.stream() .filter(route -> !route.isTurnBack()) .collect(Collectors.toList()); - if (routeLikeHa1) { - // 对于ATP进路、地面联锁进路、引导进路类的,取引导进路 + if (routeLikeHa1 ) { + if (!signal.isCallOn()) { + continue; + } + // 对于ATP进路、地面联锁进路、引导进路类的,取引导进路 notTurnBackRouteList = notTurnBackRouteList.stream() .filter(route -> route.isGuide()) .collect(Collectors.toList()); @@ -346,11 +349,16 @@ public class SignalGeneratorNew implements GeneratorNew { deviceStatusModifyTool.closeSignalDirectly(route.getStart()); } deviceStatusModifyTool.loadManualTrainOfGroup(simulation, "001",signal.getSection(),signal.isRight()); + if(operateDefinitionVO.onlyOperateSignal()){ + trainingVOList.add(this.build(config, simulation, signal,null, operateDefinitionVO)); + simulation.reset(); + break; + } trainingVOList.add(this.build(config, simulation, route,null, operateDefinitionVO)); // 仿真重置 simulation.reset(); } - } +// } continue; } case Signal_Close_Guide: { @@ -376,7 +384,7 @@ public class SignalGeneratorNew implements GeneratorNew { } case Signal_Cancel_Guide: { // 若信号可开放引导信号,生成实训,背景设置为开放引导进路/开放引导信号 - if (signal.isCallOn()) { +// if (signal.isCallOn()) { if (!CollectionUtils.isEmpty(routeList)) { for (Route route : routeList) { if (routeLikeHa1 && @@ -386,12 +394,17 @@ public class SignalGeneratorNew implements GeneratorNew { } if (!route.isTurnBack()) { this.deviceStatusModifyTool.openGuideRouteDirect(simulation, route); + if(operateDefinitionVO.onlyOperateSignal()){ + trainingVOList.add(this.build(config, simulation, signal,null, operateDefinitionVO)); + simulation.reset(); + break; + } trainingVOList.add(this.build(config, simulation, route,null, operateDefinitionVO)); // 仿真重置 simulation.reset(); } } - } +// } // else if(Objects.nonNull(signal.getAutoSignal())) { // 信号机是自动信号 // this.deviceStatusModifyTool.openGuideSignalDirectly(signal); // trainingVOList.add(this.build(config, simulation, signal, operateDefinitionVO)); diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/ATSLogicLoop.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/ATSLogicLoop.java index 93b3c1149..524353e0c 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/ATSLogicLoop.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/ATSLogicLoop.java @@ -50,8 +50,8 @@ public class ATSLogicLoop { // 站台倒计时 this.atsStandService.countDown(simulation); - // 取消过期的控制权转换申请 - atsStationService.cancelInvalidControlTransferApplication(simulation); + // 车站随时间变化的属性更新 + this.atsStationService.updateField(simulation); // long end = System.currentTimeMillis(); // System.out.println(String.format("------------ATS自动排列进路逻辑耗时: %s ms", (end-start))); } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/AtsApiService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/AtsApiService.java index 30c063809..980c24dcd 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/AtsApiService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/AtsApiService.java @@ -41,4 +41,6 @@ public interface AtsApiService { * @param sectionCode */ void handleTrainOnTransfer(Simulation simulation, String groupNumber, String sectionCode); + + void cancelStandSkipSetOfTrain(Simulation simulation, String groupNumber, String standCode); } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/AtsApiServiceImpl.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/AtsApiServiceImpl.java index af5e21d89..403716c99 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/AtsApiServiceImpl.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/AtsApiServiceImpl.java @@ -1,10 +1,12 @@ package club.joylink.rtss.simulation.cbtc.ATS; import club.joylink.rtss.simulation.cbtc.ATS.service.AtsPlanService; +import club.joylink.rtss.simulation.cbtc.ATS.service.AtsStandService; import club.joylink.rtss.simulation.cbtc.Simulation; import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository; import club.joylink.rtss.simulation.cbtc.data.map.MapElement; import club.joylink.rtss.simulation.cbtc.data.map.Section; +import club.joylink.rtss.simulation.cbtc.data.map.Stand; import club.joylink.rtss.simulation.cbtc.data.map.Station; import club.joylink.rtss.simulation.cbtc.data.support.TrainStopMessage; import club.joylink.rtss.simulation.cbtc.data.vo.TrainInfo; @@ -25,6 +27,9 @@ public class AtsApiServiceImpl implements AtsApiService { @Autowired private AtsPlanService atsPlanService; + @Autowired + private AtsStandService atsStandService; + @Autowired private ATSMessageCollectAndDispatcher atsMessageCollectAndDispatcher; @@ -72,4 +77,14 @@ public class AtsApiServiceImpl implements AtsApiService { this.atsPlanService.handleTrainOnTransfer(simulation, train, section); } + @Override + public void cancelStandSkipSetOfTrain(Simulation simulation, String groupNumber, String standCode) { + SimulationDataRepository repository = simulation.getRepository(); + TrainInfo train = repository.findSupervisedTrainByGroup(groupNumber); + if (Objects.isNull(train)) { + return; + } + atsStandService.cancelJumpStop(simulation, standCode,groupNumber); + } + } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java index be3134eba..9ef798acd 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java @@ -39,6 +39,8 @@ public class Operation { // Switch_Single_Lock_Chain(), // /** 单解(联动) */ // Switch_Single_Unlock_Chain(), + /** 初始化封锁 */ + Switch_Initialize_Block, /** 封锁 */ Switch_Block(), /** 解封 */ @@ -79,6 +81,8 @@ public class Operation { Switch_Force_Unlock, /** 挤岔恢复 */ Switch_Squeeze_Recovery, + /** 命令 */ + Switch_Command, //--------------------------- 区段 --------------------------- /** 封锁 */ @@ -99,6 +103,8 @@ public class Operation { Cancel_All_Limit_Speed(), /** 计轴预复位 */ Section_Axis_Pre_Reset(), + /** 计轴复位 */ + Section_Reset, /** 故障解锁 */ Section_Fault_Unlock(), /** 确认计轴有效 */ @@ -147,6 +153,10 @@ public class Operation { Signal_Cancel_Auto_Turn_Back, /** 信号机总取消 */ Signal_Total_Cancel, + /** 初始化引导 */ + Signal_Initialize_Guide, + /** 取消引导的初始化 */ + Signal_Cancel_Guide_Initialization, /** 办理引导 */ Signal_Set_Guide, /** 取消引导 */ @@ -157,6 +167,10 @@ public class Operation { Stand_Set_Jump_Stop(), /** 取消跳停 */ Stand_Cancel_Jump_Stop(), + /** 全站台设置跳停 */ + Stand_All_Set_Jump_Stop(), + /** 全站台取消跳停 */ + Stand_All_Cancel_Jump_Stop(), /** 设置扣车 */ Stand_Set_Hold_Train(), /** 取消扣车 */ @@ -189,6 +203,10 @@ public class Operation { Stand_Open_Psd, /** 取消设置(扣车或跳停) */ Stand_Cancel_Setting, + /** 系统扣车 */ + Stand_Sys_Hold_Train(), + /** 取消系统扣车 */ + Stand_Cancel_Sys_Hold_Train(), //--------------------------- 控制模式 --------------------------- /** 请求站控 */ @@ -209,7 +227,7 @@ public class Operation { CM_Surrender_Control(), /** 连锁控 */ CM_Interlock_Control(), - /** 回复中控请求(同意/拒绝) */ + /** 回复连锁控请求(同意/拒绝) */ CM_Reply_Interlock_Control(), //--------------------------- 集中车站 --------------------------- @@ -239,6 +257,25 @@ public class Operation { Station_CIArea_Close_AllSignal, /** 重启令解(哈尔滨) */ Station_Restart, + /** 全站设置自动通过 */ + Station_Set_CI_Auto, + /** 全站取消自动通过 */ + Station_Cancel_CI_Auto, + /** 设置/取消强制点灯 */ + Station_Set_Or_Cancel_Force_Physical_Signal, + /** 预复位(宁波一) */ + Station_Pre_Reset, + /** 取消预复位 */ + Station_Cancel_Pre_Reset, + //车站控制授权 + /** 区域选择(请求区域控制权【泰雷兹】) */ + Station_Control_Apply, + /** 授权转移 */ + Station_Control_Transfer, + /** 下放站控 */ + Station_Control_Devolve, + /** 收回站控 */ + Station_Control_Revoke, //--------------------------- 列车 --------------------------- /** 在指定区段加载一辆计划列车(本地开发使用) */ @@ -309,6 +346,8 @@ public class Operation { Train_Link, /** 排列进路到 */ Train_Set_Route, + /** 设置运行类型 */ + Train_Set_Run_Type, //--------------------------- 司机 --------------------------- /** 改变列车的牵引/制动力 */ diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SectionOperateHandler.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SectionOperateHandler.java index a48409911..b7bb41aea 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SectionOperateHandler.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SectionOperateHandler.java @@ -103,6 +103,12 @@ public class SectionOperateHandler { ciApiService.axlePreReset(simulation, sectionCode); } + /**区段计轴复位*/ + @OperateHandlerMapping(type =Operation.Type.Section_Reset) + public void axleReset(Simulation simulation, String sectionCode) { + ciApiService.axleReset(simulation, sectionCode); + } + /**确认计轴有效*/ @OperateHandlerMapping(type = Operation.Type.Section_Confirm_Axis_Valid) public void confirmAxisValid(Simulation simulation, String sectionCode) { diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SignalOperateHandler.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SignalOperateHandler.java index 394c3f4b0..eea1c314e 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SignalOperateHandler.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SignalOperateHandler.java @@ -275,6 +275,22 @@ public class SignalOperateHandler { atsRouteService.totalCancel(simulation, signalCode); } + /** + * 初始化引导 + */ + @OperateHandlerMapping(type = Operation.Type.Signal_Initialize_Guide) + public void initializeGuide(Simulation simulation, String signalCode) { + ciApiService.initializeGuide(simulation, signalCode); + } + + /** + * 初始化引导 + */ + @OperateHandlerMapping(type = Operation.Type.Signal_Cancel_Guide_Initialization) + public void cancelGuideInitialization(Simulation simulation, String signalCode) { + ciApiService.cancelGuideInitialization(simulation, signalCode); + } + /** * 办理引导 */ diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StandOperateHandler.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StandOperateHandler.java index 8ef427578..b90391f8a 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StandOperateHandler.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StandOperateHandler.java @@ -39,6 +39,23 @@ public class StandOperateHandler { atsStandService.cancelJumpStop(simulation, standCode, trainGroupNumber); } + /** + * 多站台设置跳停 + */ + @OperateHandlerMapping(type = Operation.Type.Stand_All_Set_Jump_Stop) + public void setJumpStop(Simulation simulation, List standCodes, String trainGroupNumber) { + standCodes.forEach(s -> atsStandService.setJumpStop(simulation, s, trainGroupNumber)); + + } + + /** + * 多站台取消跳停 + */ + @OperateHandlerMapping(type = Operation.Type.Stand_All_Cancel_Jump_Stop) + public void cancelJumpStop(Simulation simulation, List standCodes, String trainGroupNumber) { + standCodes.forEach(s -> atsStandService.cancelJumpStop(simulation, s, trainGroupNumber)); + } + /** * 设置扣车 */ @@ -73,6 +90,22 @@ public class StandOperateHandler { } + /** + * 设置系统扣车 + */ + @OperateHandlerMapping(type = Operation.Type.Stand_Sys_Hold_Train) + public void setSysHoldTrain(Simulation simulation) { + this.atsStandService.sysHoldTrain(simulation); + } + + /** + * 取消系统扣车 + */ + @OperateHandlerMapping(type = Operation.Type.Stand_Cancel_Sys_Hold_Train) + public void cancelSysHoldTrain(Simulation simulation) { + this.atsStandService.cancelSysHoldTrain(simulation); + } + /** * 提前发车 */ diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationOperateHandler.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationOperateHandler.java index 1a3f27e6a..b103d233c 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationOperateHandler.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationOperateHandler.java @@ -1,5 +1,6 @@ package club.joylink.rtss.simulation.cbtc.ATS.operation.handler; +import club.joylink.rtss.exception.BusinessExceptionAssertEnum; import club.joylink.rtss.simulation.cbtc.ATS.operation.Operation; import club.joylink.rtss.simulation.cbtc.ATS.operation.annotation.OperateHandler; import club.joylink.rtss.simulation.cbtc.ATS.operation.annotation.OperateHandlerMapping; @@ -161,6 +162,7 @@ public class StationOperateHandler { atsStationService.emergencyStationControl(simulation, fromMember, stationCodes); } + /**回复站控请求c*/ @OperateHandlerMapping(type = Operation.Type.CM_Reply_Station_Control) public void replyForStationControl(Simulation simulation, List replyVOList){ @@ -187,14 +189,14 @@ public class StationOperateHandler { repository.getSignalList().stream().filter(s -> Objects.equals(stationCode,s.getInterlockStation().getCode())).forEach(signal -> ciApiService.blockadeSignal(simulation, signal.getCode())); } - /**交出控制权*/ + /**交出控制权/下放站控*/ @OperateHandlerMapping(type = Operation.Type.CM_Surrender_Control) public void surrenderControl(Simulation simulation, SimulationMember member, String stationCode){ SimulationDataRepository repository = simulation.getRepository(); this.atsStationService.surrenderControl(simulation, member, repository.getByCode(stationCode, Station.class)); } - /**交出控制权*/ + /**接收控制权*/ @OperateHandlerMapping(type = Operation.Type.CM_Receive_Control) public void receiveControl(Simulation simulation, SimulationMember member, String stationCode){ SimulationDataRepository repository = simulation.getRepository(); @@ -206,4 +208,57 @@ public class StationOperateHandler { SimulationDataRepository repository = simulation.getRepository(); this.ciApiService.restart(simulation, repository.getByCode(stationCode, Station.class)); } + + @OperateHandlerMapping(type = Operation.Type.Station_Set_CI_Auto) + public void setCIAuto(Simulation simulation, String stationCode) { + SimulationDataRepository repository = simulation.getRepository(); + this.atsStationService.setCIAuto(simulation, repository.getByCode(stationCode, Station.class)); + } + + @OperateHandlerMapping(type = Operation.Type.Station_Cancel_CI_Auto) + public void cancelCIAuto(Simulation simulation, String stationCode) { + SimulationDataRepository repository = simulation.getRepository(); + this.atsStationService.cancelCIAuto(simulation, repository.getByCode(stationCode, Station.class)); + } + + @OperateHandlerMapping(type = Operation.Type.Station_Set_Or_Cancel_Force_Physical_Signal) + public void setOrCancelForcePhysicalSignal(Simulation simulation, String stationCode) { + SimulationDataRepository repository = simulation.getRepository(); + this.atsStationService.setOrCancelForcePhysicalSignal(simulation, repository.getByCode(stationCode, Station.class)); + } + + @OperateHandlerMapping(type = Operation.Type.Station_Control_Apply) + public void applyControl(Simulation simulation, List stationCodes, SimulationMember simulationMember) { + BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertCollectionNotEmpty(stationCodes, "未选择车站"); + this.atsStationService.applyControl(simulation, stationCodes, simulationMember); + } + + @OperateHandlerMapping(type = Operation.Type.Station_Control_Transfer) + public void transferControl(Simulation simulation, List stationCodes, boolean agree, SimulationMember simulationMember) { + this.atsStationService.transferControl(simulation, stationCodes, agree, simulationMember); + } + + @OperateHandlerMapping(type = Operation.Type.Station_Control_Devolve) + public void devolveControl(Simulation simulation, List stationCodes, SimulationMember simulationMember) { + BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertCollectionNotEmpty(stationCodes, "未选择车站"); + this.atsStationService.devolveControl(simulation, stationCodes, simulationMember); + } + + @OperateHandlerMapping(type = Operation.Type.Station_Control_Revoke) + public void revokeControl(Simulation simulation, List stationCodes, SimulationMember simulationMember) { + BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertCollectionNotEmpty(stationCodes, "未选择车站"); + this.atsStationService.revokeControl(simulation, stationCodes, simulationMember); + } + + @OperateHandlerMapping(type = Operation.Type.Station_Pre_Reset) + public void preReset(Simulation simulation, String stationCode) { + SimulationDataRepository repository = simulation.getRepository(); + this.atsStationService.preReset(simulation, repository.getByCode(stationCode, Station.class)); + } + + @OperateHandlerMapping(type = Operation.Type.Station_Cancel_Pre_Reset) + public void cancelPreReset(Simulation simulation, String stationCode) { + SimulationDataRepository repository = simulation.getRepository(); + this.atsStationService.cancelPreReset(simulation, repository.getByCode(stationCode, Station.class)); + } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SwitchOperateHandler.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SwitchOperateHandler.java index f431421c5..b188813f9 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SwitchOperateHandler.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/SwitchOperateHandler.java @@ -164,6 +164,12 @@ public class SwitchOperateHandler { // } // } + /**道岔初始化封锁*/ + @OperateHandlerMapping(type =Operation.Type.Switch_Initialize_Block) + public void initializeBlock(Simulation simulation, String switchCode) { + ciApiService.initializeBlock(simulation, switchCode); + } + /**道岔封锁l*/ @OperateHandlerMapping(type =Operation.Type.Switch_Block) public void blockadeSwitch(Simulation simulation, String switchCode) { @@ -266,4 +272,10 @@ public class SwitchOperateHandler { public void switchSqueezeRecovery(Simulation simulation, String switchCode) { ciApiService.switchSqueezeRecovery(simulation, switchCode); } + + /** 命令【泰雷兹】 */ + @OperateHandlerMapping(type = Operation.Type.Switch_Command) + public void switchCommand(Simulation simulation, String switchCode, Boolean auto, Boolean reserve, Boolean normal) { + ciApiService.switchCommand(simulation, switchCode, auto, reserve, normal); + } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/TrainOperateHandler.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/TrainOperateHandler.java index 04bbe75ef..deeb6b1a9 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/TrainOperateHandler.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/TrainOperateHandler.java @@ -321,8 +321,16 @@ public class TrainOperateHandler { /** * 排列进路到(站台/信号机)【泰雷兹】 */ - @OperateHandlerMapping(type = Operation.Type.Train_Link) + @OperateHandlerMapping(type = Operation.Type.Train_Set_Route) public void setRouteTo(Simulation simulation, RoutePathVO routePath) { atsTrainService.setRouteTo(simulation, routePath); } + + /** + * 设置列车运行类型【泰雷兹】 + */ + @OperateHandlerMapping(type = Operation.Type.Train_Set_Run_Type) + public void setRunType(Simulation simulation, String groupNumber, VirtualRealityTrain.RunType runType) { + atsTrainService.setRunType(simulation, groupNumber, runType); + } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsRouteService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsRouteService.java index f9f53df20..25c950d37 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsRouteService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsRouteService.java @@ -95,20 +95,41 @@ public class AtsRouteService { */ public void setCiAuto(Simulation simulation, String signalCode) { Signal signal = simulation.getRepository().getByCode(signalCode, Signal.class); - Route lockedRoute = signal.getLockedRoute(); - if (lockedRoute == null) { - throw new SimulationException(SimulationExceptionType.Operation_Handle_FAIL, - String.format("信号机[%s(%s)]没有已锁闭进路,不能设置联锁自动进路", signal.getName(), signal.getCode())); + if (simulation.getRepository().getConfig().isSetRouteBeforeSetFlt()) { + Route lockedRoute = signal.getLockedRoute(); + if (lockedRoute == null) { + throw new SimulationException(SimulationExceptionType.Operation_Handle_FAIL, + String.format("信号机[%s(%s)]没有已锁闭进路,不能设置联锁自动进路", signal.getName(), signal.getCode())); + } + if (!lockedRoute.isFlt()) { + throw new SimulationException(SimulationExceptionType.Unsupported_Operation, + String.format("进路[%s]不能设置车队进路", lockedRoute.getCode())); + } + if (lockedRoute.isCiControl()) { + throw new SimulationException(SimulationExceptionType.Operation_Conflict, + String.format("进路[%s(%s)]自动追踪已开启,不能设置联锁自动进路", lockedRoute.getName(), lockedRoute.getCode())); + } + lockedRoute.setFleetMode(true); + } else { + List routeList = signal.getRouteList(); + BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertCollectionNotEmpty(routeList, signal.debugStr() + "不是进路始端信号机"); + // 筛选最适合的进路,筛选逻辑与办理引导时筛选逻辑类似 + List fltRoutes = routeList.stream().filter(Route::isFlt).collect(Collectors.toList()); + BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertCollectionNotEmpty(fltRoutes, signal.debugStr() + "下没有可设置的车队进路"); + List collect = fltRoutes.stream() + .filter(r -> !r.isTurnBack() && CollectionUtils.isEmpty(r.getSwitchList())) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(collect)) { + collect = fltRoutes.stream().filter(r -> !r.isTurnBack()).collect(Collectors.toList()); + } + if (CollectionUtils.isEmpty(collect)) { + collect = fltRoutes; + } + Route route = collect.get(0); + Route.CheckFailMessage message = routeService.setting(simulation, route); + BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertNull(message, route.debugStr() + "无法办理"); + route.setFleetMode(true); } - if (!lockedRoute.isFlt()) { - throw new SimulationException(SimulationExceptionType.Unsupported_Operation, - String.format("进路[%s]不能设置车队进路", lockedRoute.getCode())); - } - if (lockedRoute.isCiControl()) { - throw new SimulationException(SimulationExceptionType.Operation_Conflict, - String.format("进路[%s(%s)]自动追踪已开启,不能设置联锁自动进路", lockedRoute.getName(), lockedRoute.getCode())); - } - lockedRoute.setFleetMode(true); } /** @@ -125,6 +146,9 @@ public class AtsRouteService { throw new SimulationException(SimulationExceptionType.Operation_Repetition, String.format("信号机[%s(%s)]没有打开连锁自动进路,不能取消联锁自动进路", signal.getName(), signal.getCode())); } lockedRoute.setFleetMode(false); + if (simulation.getRepository().getConfig().isCancelRouteWhenCancelFlt()) { + routeService.cancelWithoutCheck(simulation, lockedRoute); + } } /** diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsStandService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsStandService.java index f7328d2a2..943349fb0 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsStandService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsStandService.java @@ -120,6 +120,7 @@ public class AtsStandService { standList.forEach(stand -> stand.setTrainParking(false)); } + /** * 设置站台跳停(指定列车跳停) */ @@ -203,7 +204,7 @@ public class AtsStandService { public void cancelJumpStop(Simulation simulation, String standCode, String trainGroupNumber) { Stand stand = getStand(simulation, standCode); if (!stand.isJumpStop()) { - throw new SimulationException(SimulationExceptionType.Operation_Repetition); + return; } if (!StringUtils.hasText(trainGroupNumber)) { //如果是取消站台跳停 stand.setAllSkip(false); @@ -329,6 +330,10 @@ public class AtsStandService { } else { this.ciApiService.standHoldTrain(simulation, standCode, false); } + checkAndSetTrainHold(simulation, stand); + } + + private void checkAndSetTrainHold(Simulation simulation, Stand stand) { if (stand.isHoldTrain()) { // 先默认CBTC模式,扣车状态发送给列车 List superviseTrainList = simulation.getRepository().getSuperviseTrainList(); @@ -342,6 +347,34 @@ public class AtsStandService { } } + public void sysHoldTrain(Simulation simulation) { + List stands = simulation.getRepository().getStandList(); + stands.forEach(stand -> { + if (stand.isJumpStop()) { + stand.setAllSkip(false); + stand.getSkipSet().clear(); + } + this.ciApiService.sysHoldTrain(simulation, stand.getCode()); + checkAndSetTrainHold(simulation, stand); + }); + List onlineTrainList = simulation.getRepository().getOnlineTrainList(); + for (VirtualRealityTrain train : onlineTrainList) { + if (train.isJump()) { + this.onboardAtpApiService.cancelJump(simulation, train.getGroupNumber()); + } + } + } + + public void cancelSysHoldTrain(Simulation simulation) { + List stands = simulation.getRepository().getStandList(); + stands.forEach(stand -> { + if (stand.isSysHoldTrain()) { + this.ciApiService.sysHoldTrainCancel(simulation, stand.getCode()); + this.checkAndCancelTrainHold(simulation, stand); + } + }); + } + public void forceCancelHoldTrain(Simulation simulation, String standCode) { Stand stand = simulation.getRepository().getByCode(standCode, Stand.class); if (stand.isCenterHoldTrain()) { diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsStationService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsStationService.java index 28bc8070b..eaa8be8f7 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsStationService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsStationService.java @@ -8,21 +8,24 @@ import club.joylink.rtss.simulation.cbtc.command.OperationMessage; import club.joylink.rtss.simulation.cbtc.constant.SimulationConstants; import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository; import club.joylink.rtss.simulation.cbtc.data.map.Route; +import club.joylink.rtss.simulation.cbtc.data.map.Signal; import club.joylink.rtss.simulation.cbtc.data.map.Station; import club.joylink.rtss.simulation.cbtc.data.map.Switch; import club.joylink.rtss.simulation.cbtc.data.status.StationStatus; import club.joylink.rtss.simulation.cbtc.data.support.StationTurnBackStrategyOption; import club.joylink.rtss.simulation.cbtc.data.vo.ControlTransferReplyVO; +import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySignal; import club.joylink.rtss.simulation.cbtc.exception.SimulationException; import club.joylink.rtss.simulation.cbtc.exception.SimulationExceptionType; import club.joylink.rtss.simulation.cbtc.member.SimulationMember; +import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.*; +import java.util.stream.Collectors; @Component @@ -33,7 +36,7 @@ public class AtsStationService { private ATSMessageCollectAndDispatcher atsMessageCollectAndDispatcher; @Autowired - private ApplicationContext applicationContext; + private AtsRouteService atsRouteService; public StationStatus info(Simulation simulation, String stationCode) { Station station = getStation(simulation, stationCode); @@ -231,6 +234,7 @@ public class AtsStationService { atsMessageCollectAndDispatcher.handlerOperateMessage(simulation, new OperationMessage(fromMember.getId(), new HashSet<>(Collections.singleton(fromMember)), Operation.Type.CM_Reply_Interlock_Control, null, true, stationCodes)); } + /** * 回复站控请求c */ @@ -368,19 +372,167 @@ public class AtsStationService { } /** - * 取消失效的控制权转换申请 + * 更新车站控制权转换倒计时及有效性 */ - public void cancelInvalidControlTransferApplication(Simulation simulation) { - for (Station station : simulation.getRepository().getStationList()) { - if (station.isControlTransferApplying()) { - Integer validDuration = station.getValidDuration(); - validDuration -= SimulationConstants.ATS_LOOP_RATE; - if (validDuration <= 0) { - station.cancelControlTransferApplication(); - } else { - station.setValidDuration(validDuration); - } + public void updateControlTransferApplicationStatus(Station station) { + if (station.isControlTransferApplying()) { + Integer validDuration = station.getValidDuration(); + validDuration -= SimulationConstants.ATS_LOOP_RATE; + if (validDuration <= 0) { + station.cancelControlTransferApplication(); + } else { + station.setValidDuration(validDuration); } } } + + /** + * 全站设置自动通过进路 + */ + public void setCIAuto(Simulation simulation, @NonNull Station station) { + List routes = simulation.getRepository().getRouteList(); + routes.stream() + .filter(route -> station.equals(route.getInterlockStation()) && route.isFlt() && !route.isFleetMode()) + .map(Route::getStart) + .distinct() + .forEach(signal -> atsRouteService.setCiAuto(simulation, signal.getCode())); + } + + /** + * 全站取消自动通过进路 + */ + public void cancelCIAuto(Simulation simulation, @NonNull Station station) { + List routes = simulation.getRepository().getRouteList(); + routes.stream().filter(route -> station.equals(route.getInterlockStation()) && route.isFlt() && route.isFleetMode()) + .filter(route -> station.equals(route.getInterlockStation()) && route.isFleetMode()) + .map(Route::getStart) + .forEach(signal -> atsRouteService.cancelCiAuto(simulation, signal.getCode())); + } + + /** + * 设置/取消强制点灯 + */ + public void setOrCancelForcePhysicalSignal(Simulation simulation, @NonNull Station station) { + List signalList = simulation.getRepository().getSignalList().stream() + .filter(signal -> station.equals(signal.getInterlockStation())).collect(Collectors.toList()); + BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertCollectionNotEmpty(signalList, station.debugStr() + "下无信号机"); + if (!signalList.get(0).isForcePhysical()) { + signalList.forEach(signal -> { + VirtualRealitySignal virtualSignal = signal.getVirtualSignal(); + if (virtualSignal != null) { + virtualSignal.apply(signal.isGreenOpen(), signal.isYellowOpen(), signal.isRedOpen()); + } + signal.changeLightType(false); + signal.setForcePhysical(true); + }); + } else { + signalList.forEach(signal -> signal.setForcePhysical(false)); + } + } + + /** + * 计轴预复位 + */ + public void preReset(Simulation simulation, Station station) { + station.getPreResetValidDuration().set(60 * 1000); + } + + /** + * 更新车站随时间变化的属性 + */ + public void updateField(Simulation simulation) { + List stations = simulation.getRepository().getStationList(); + for (Station station : stations) { + //更新车站控制权转换倒计时及有效性 + this.updateControlTransferApplicationStatus(station); + // 更新车站预复位的剩余时间 + this.updatePreResetRemainderTime(station); + } + } + + private void updatePreResetRemainderTime(Station station) { + int validDuration = station.getPreResetValidDuration().get(); + if (validDuration > 0) { + station.getPreResetValidDuration().compareAndExchange(validDuration, Math.max(0, validDuration - SimulationConstants.ATS_LOOP_RATE)); + } + } + + public void applyControl(Simulation simulation, List stationCodes, SimulationMember member) { + if (CollectionUtils.isEmpty(stationCodes)) { + throw new SimulationException(SimulationExceptionType.Operation_Handle_FAIL, "申请控制的车站列表不能为空"); + } + //TODO 角色和设备检查 + synchronized (simulation) { + SimulationDataRepository repository = simulation.getRepository(); + BusinessExceptionAssertEnum.INVALID_OPERATION.assertNotTrue(stationCodes.stream().anyMatch(s -> Objects.nonNull(repository.getByCode(s, Station.class).getControlApplicant())), "申请列车存在已被申请的车站"); + stationCodes.forEach(s -> { + Station station = repository.getByCode(s, Station.class); + if (station.getController() == null) { + station.setController(member); + } else { + station.setControlApplicant(member); + } + }); + } + } + + public void transferControl(Simulation simulation, List stationCodes, boolean agree, SimulationMember member) { + if (CollectionUtils.isEmpty(stationCodes)) { + throw new SimulationException(SimulationExceptionType.Operation_Handle_FAIL, "控制权转移的车站列表不能为空"); + } + //TODO 角色和设备检查 + synchronized (simulation) { + SimulationDataRepository repository = simulation.getRepository(); + stationCodes.forEach(s -> { + Station station = repository.getByCode(s, Station.class); + if (agree) { + if (station.getController() == null || Objects.equals(station.getController(), member)) { + station.setController(station.getControlApplicant()); + station.setControlApplicant(null); + } + return; + } + station.setControlApplicant(null); + }); + } + } + + public void devolveControl(Simulation simulation, List stationCodes, SimulationMember member) { + if (CollectionUtils.isEmpty(stationCodes)) { + throw new SimulationException(SimulationExceptionType.Operation_Handle_FAIL, "控制权下放的车站列表不能为空"); + } + //TODO 角色和设备检查 + synchronized (simulation) { + SimulationDataRepository repository = simulation.getRepository(); + stationCodes.forEach(s -> { + Station station = repository.getByCode(s, Station.class); + if (Objects.nonNull(station.getController()) && Objects.equals(station.getController(), member)) { + station.setController(null); + station.setEmergencyController(false); + station.setControlApplicant(null); + } + }); + } + } + + + public void revokeControl(Simulation simulation, List stationCodes, SimulationMember member) { + if (CollectionUtils.isEmpty(stationCodes)) { + throw new SimulationException(SimulationExceptionType.Operation_Handle_FAIL, "回收控制权的车站列表不能为空"); + } + //TODO 角色和设备检查 + synchronized (simulation) { + SimulationDataRepository repository = simulation.getRepository(); + stationCodes.forEach(s -> { + Station station = repository.getByCode(s, Station.class); + station.setController(member); + station.setEmergencyController(true); + station.setControlApplicant(null); + }); + } + } + + public void cancelPreReset(Simulation simulation, Station station) { + station.getPreResetValidDuration().set(0); + } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsTrainService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsTrainService.java index 2b12c983f..e4fdded5c 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsTrainService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/AtsTrainService.java @@ -896,4 +896,12 @@ public class AtsTrainService { public void setRouteTo(Simulation simulation, RoutePathVO routePath) { routePath.getRouteList().forEach(routeCode -> ciApiService.settingRoute(simulation, routeCode)); } + + /** + * 设置列车运行类型 + */ + public void setRunType(Simulation simulation, String groupNumber, VirtualRealityTrain.RunType runType) { + VirtualRealityTrain train = simulation.getRepository().getOnlineTrainBy(groupNumber); + train.setRunType(runType); + } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/CiApiService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/CiApiService.java index ff007355b..6ebbbf1fc 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/CiApiService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/CiApiService.java @@ -250,6 +250,8 @@ public interface CiApiService { */ void standHoldTrain(Simulation simulation, String standCode, boolean center); + void sysHoldTrain(Simulation simulation, String standCode); + /** * 站台取消扣车,联锁关系处理 * @param simulation @@ -258,6 +260,8 @@ public interface CiApiService { */ void standHoldTrainCancel(Simulation simulation, String standCode, boolean center); + void sysHoldTrainCancel(Simulation simulation, String standCode); + void standHoldTrainCancelAll(Simulation simulation, String standCode); /** @@ -337,4 +341,26 @@ public interface CiApiService { * 挤岔恢复 */ void switchSqueezeRecovery(Simulation simulation, String switchCode); + + /** + * 命令 + */ + void switchCommand(Simulation simulation, String switchCode, Boolean auto, Boolean reserve, Boolean normal); + + /** + * 初始化封锁 + */ + void initializeBlock(Simulation simulation, String switchCode); + + /** + * 初始化引导 + */ + void initializeGuide(Simulation simulation, String signalCode); + + /** + * 取消引导的初始化 + */ + void cancelGuideInitialization(Simulation simulation, String signalCode); + + void axleReset(Simulation simulation, String sectionCode); } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/CiApiServiceImpl.java b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/CiApiServiceImpl.java index c76285380..98e6b8091 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/CiApiServiceImpl.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/CiApiServiceImpl.java @@ -153,6 +153,19 @@ public class CiApiServiceImpl implements CiApiService { @Override public void blockadeSwitch(Simulation simulation, String switchCode) { Switch aSwitch = simulation.getRepository().getByCode(switchCode, Switch.class); + //条件检查 + MapConfig config = simulation.getRepository().getConfig(); + if (config.isBlockadeCommandOnlyValidInStandbyMode()) { + boolean standbyMode = simulation.getRepository().getRouteList() + .stream().filter(route -> route.isRouteSwitch(aSwitch)).anyMatch(route -> !route.isCbtcMode()); //包含该道岔的进路是否有处于后备模式的 + if (!standbyMode) { + return; + } + } + if (config.isSomeCommandNeedInit()) { + BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(aSwitch.isInit(), aSwitch.debugStr() + "未初始化"); + } + this.switchService.blockade(aSwitch); } @@ -223,12 +236,18 @@ public class CiApiServiceImpl implements CiApiService { Section section = simulation.getRepository().getByCode(sectionCode, Section.class); if (section.isCross()) { Optional
crossLockedSectionOptional = section.getLogicList().stream().filter(Section::isLocked).findAny(); - BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(crossLockedSectionOptional.isPresent(), - section.debugStr() + "未锁闭,无需解锁"); + if (crossLockedSectionOptional.isEmpty()) { + return; + } +// BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(crossLockedSectionOptional.isPresent(), +// section.debugStr() + "未锁闭,无需解锁"); section = crossLockedSectionOptional.get(); } - BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(section.isLocked(), - section.debugStr() + "未锁闭,无需解锁"); + if (!section.isLocked()) { + return; + } +// BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(section.isLocked(), +// section.debugStr() + "未锁闭,无需解锁"); List lockedRouteList = simulation.getRepository().queryAllLockedRoute(); Route lockedRoute = null; for (Route route : lockedRouteList) { @@ -332,12 +351,24 @@ public class CiApiServiceImpl implements CiApiService { this.standService.holdTrain(simulation, stand, center); } + @Override + public void sysHoldTrain(Simulation simulation, String standCode) { + Stand stand = simulation.getRepository().getByCode(standCode, Stand.class); + this.standService.sysHoldTrain(simulation, stand); + } + @Override public void standHoldTrainCancel(Simulation simulation, String standCode, boolean center) { Stand stand = simulation.getRepository().getByCode(standCode, Stand.class); this.standService.cancelHoldTrain(simulation, stand, center); } + @Override + public void sysHoldTrainCancel(Simulation simulation, String standCode) { + Stand stand = simulation.getRepository().getByCode(standCode, Stand.class); + this.standService.cancelSysHoldTrain(simulation, stand); + } + @Override public void standHoldTrainCancelAll(Simulation simulation, String standCode) { Stand stand = simulation.getRepository().getByCode(standCode, Stand.class); @@ -399,11 +430,16 @@ public class CiApiServiceImpl implements CiApiService { BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertNotNull(signal.getLockedRoute(), String.format("信号机[%s]无已办理进路", signal.getCode())); } } + if (config.isSomeCommandNeedInit()) { + BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(signal.isInit(), signal.debugStr() + "未初始化"); + } BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(signal.isClose(), String.format("信号机[%s]需处于关闭状态", signal.getCode())); boolean signalApproachOccupied = signal.getApproachPathList() .stream().anyMatch(sectionPath -> sectionPath.getSectionList().stream().anyMatch(Section::isOccupied)); - BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(signalApproachOccupied, - String.format("对%s开放引导操作失败,接近区段没有列车占用", signal.getName())); + if (config.isNeedApproachLockBeforeSetGuide()) { + BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(signalApproachOccupied, + String.format("对%s开放引导操作失败,接近区段没有列车占用", signal.getName())); + } //办理引导进路或开放引导信号 if (config.isGuideNeedRouteSettingFirst()) { signalService.openGuideSignal(simulation, signal); @@ -516,15 +552,8 @@ public class CiApiServiceImpl implements CiApiService { @Override public void axlePreReset(Simulation simulation, String sectionCode) { - Section section = simulation.getRepository().getByCode(sectionCode, Section.class); - Section chooseSection = section; - if (!section.isAxleCounter()) { - section = section.getParent(); - } - BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(section != null && section.isAxleCounter(), - chooseSection.debugStr() + "不是计轴区段"); - VirtualRealitySectionAxleCounter virtualAxleCounter = section.getVirtualAxleCounter(); - BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(virtualAxleCounter.isOccupy(), chooseSection + "计轴未占用,无需预复位"); + VirtualRealitySectionAxleCounter virtualAxleCounter = getAxleCounterAndCheck4Reset(simulation, sectionCode); + virtualAxleCounter.preReset(); } @@ -539,4 +568,70 @@ public class CiApiServiceImpl implements CiApiService { Switch aSwitch = simulation.getRepository().getByCode(switchCode, Switch.class); Switch.SwitchFault.SQUEEZE.fix(aSwitch); } + + @Override + public void switchCommand(Simulation simulation, String switchCode, Boolean auto, Boolean reserve, Boolean normal) { + Switch aSwitch = simulation.getRepository().getByCode(switchCode, Switch.class); + if (auto != null) { + aSwitch.setAuto(auto); + } else { + if (normal != null) { + BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(!aSwitch.isAuto(), "道岔未处于人工模式"); + if (normal) { + switchService.turn2NormalPosition(simulation, aSwitch); + } else { + switchService.turn2ReversePosition(simulation, aSwitch); + } + } + } + if (reserve != null) { + aSwitch.setDispatcherReserve(reserve); + } + } + + @Override + public void initializeBlock(Simulation simulation, String switchCode) { + Switch aSwitch = simulation.getRepository().getByCode(switchCode, Switch.class); + aSwitch.setInit(true); + } + + @Override + public void initializeGuide(Simulation simulation, String signalCode) { + Signal signal = simulation.getRepository().getByCode(signalCode, Signal.class); + signal.setInit(true); + } + + @Override + public void cancelGuideInitialization(Simulation simulation, String signalCode) { + Signal signal = simulation.getRepository().getByCode(signalCode, Signal.class); + signal.setInit(false); + } + + @Override + public void axleReset(Simulation simulation, String sectionCode) { + VirtualRealitySectionAxleCounter axle = getAxleCounterAndCheck4Reset(simulation, sectionCode); + axle.axleReset(); + } + + /** + * 获取计轴器并为预复位/复位操作检查设备状态 + */ + private VirtualRealitySectionAxleCounter getAxleCounterAndCheck4Reset(Simulation simulation, String sectionCode) { + Section section = simulation.getRepository().getByCode(sectionCode, Section.class); + Section chooseSection = section; + if (!section.isAxleCounter()) { + section = section.getParent(); + } + //条件检查 + BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(section != null && section.isAxleCounter(), + chooseSection.debugStr() + "不是计轴区段"); + VirtualRealitySectionAxleCounter virtualAxleCounter = section.getVirtualAxleCounter(); + BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(virtualAxleCounter.isOccupy(), chooseSection.debugStr() + "计轴未占用,无需预复位"); + if (simulation.getRepository().getConfig().isStationPreResetBeforeAxlePreReset()) { + Station station = section.getStation(); + BusinessExceptionAssertEnum.SYSTEM_EXCEPTION.assertNotNull(station, chooseSection.debugStr() + "没有所属车站"); + BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(station.isPreReset(), station.debugStr() + "需处于预复位状态"); + } + return virtualAxleCounter; + } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/RouteService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/RouteService.java index 783060e18..1f77405f5 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/RouteService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/RouteService.java @@ -778,26 +778,30 @@ public class RouteService { * @param route */ public boolean humanCancel(Simulation simulation, Route route) { - if (route.isDelayUnlocking()) { // 已经在延时解锁中 - throw new SimulationException(SimulationExceptionType.Operation_Handle_FAIL, - String.format("正在延时解锁")); - } - if (simulation.getRepository().getConfig().isCancelAtsControlOfAllRoutesWhenCancelRoute()) { - route.getStart().getRouteList().forEach(aRoute -> { - aRoute.setAtsControl(false); - aRoute.setCiControl(false); - }); + if (route.isGuideSignalOpen()) { //根据宁波一HMI教学视频添加该分支 + this.cancelGuideRoute(simulation, route); } else { - route.setAtsControl(false); + if (route.isDelayUnlocking()) { // 已经在延时解锁中 + throw new SimulationException(SimulationExceptionType.Operation_Handle_FAIL, + String.format("正在延时解锁")); + } + if (simulation.getRepository().getConfig().isCancelAtsControlOfAllRoutesWhenCancelRoute()) { + route.getStart().getRouteList().forEach(aRoute -> { + aRoute.setAtsControl(false); + aRoute.setCiControl(false); + }); + } else { + route.setAtsControl(false); + } + // 关闭始端信号 + this.routeClose(simulation, route); + log.debug(String.format("人解进路,信号机[%s(%s)]关灯", + route.getStart().getName(), route.getStart().getCode())); + // 设置延时 + route.getStart().setDelayTime(route.getDelayReleaseTime() * 1000); + route.setDelayUnlocking(true); + route.getLogicSections().forEach(section -> section.setDelayUnlock(true)); } - // 关闭始端信号 - this.routeClose(simulation, route); - log.debug(String.format("人解进路,信号机[%s(%s)]关灯", - route.getStart().getName(), route.getStart().getCode())); - // 设置延时 - route.getStart().setDelayTime(route.getDelayReleaseTime() * 1000); - route.setDelayUnlocking(true); - route.getLogicSections().forEach(section -> section.setDelayUnlock(true)); return true; } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SignalService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SignalService.java index f507d3bb8..3519e9c7c 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SignalService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SignalService.java @@ -4,8 +4,10 @@ import club.joylink.rtss.simulation.cbtc.Simulation; import club.joylink.rtss.simulation.cbtc.data.map.Route; import club.joylink.rtss.simulation.cbtc.data.map.Signal; import club.joylink.rtss.simulation.cbtc.data.support.SignalApproachMessage; +import club.joylink.rtss.simulation.cbtc.event.RouteModeChangeEvent; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @@ -22,6 +24,9 @@ public class SignalService { @Autowired private VrSignalControlService vrSignalControlService; + @Autowired + private ApplicationContext applicationContext; + /** * 封锁(封锁后,包含信号机的进路不能排列) * @param signal @@ -113,6 +118,7 @@ public class SignalService { } else { signal.guideStart(); } + signal.setInit(false); } /** @@ -127,12 +133,12 @@ public class SignalService { } signal.setApproachMsg(approachMessage.getApproachMsg()); if (signal.isNctApproach()) { // 接近区段非通信车占用 - this.changeRoutesCBTCMode(signal, false); + this.changeRoutesCBTCMode(simulation, signal, false); if (signal.isLogicLight()) { // 非通信车占用,改为物理点灯 this.changeSignalLightType(simulation, signal, false); } } else if (signal.isCbtcApproach()) { // 接近区段通信车占用 - this.changeRoutesCBTCMode(signal, true); + this.changeRoutesCBTCMode(simulation, signal, true); if (!signal.isLogicLight()) { this.changeSignalLightType(simulation, signal, true); } @@ -154,10 +160,11 @@ public class SignalService { } } - private void changeRoutesCBTCMode(Signal signal, boolean cbtc) { + private void changeRoutesCBTCMode(Simulation simulation, Signal signal, boolean cbtc) { List routeList = signal.getRouteList(); if (!CollectionUtils.isEmpty(routeList)) { routeList.forEach(route -> route.setCbtcMode(cbtc)); + applicationContext.publishEvent(new RouteModeChangeEvent(this, simulation, routeList)); } } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/StandService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/StandService.java index e9882be17..ef8cc7a97 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/StandService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/StandService.java @@ -89,6 +89,26 @@ public class StandService { } } + /**系统扣车*/ + public void sysHoldTrain(Simulation simulation, Stand stand) { + stand.setSysHoldTrain(true); + // 关闭出站信号机 + Signal signal = stand.getSection().getSignalOf(stand.isRight()); + if (Objects.nonNull(signal)) { + MapConfig config = simulation.getRepository().getConfig(); + if (config.isStandHoldCloseLogicLight() || !signal.isLogicLight()) { + this.signalService.close(simulation, signal); + } + } + } + + public void cancelSysHoldTrain(Simulation simulation, Stand stand) { + stand.setSysHoldTrain(false); + // 如果所有扣车都取消,开放出站信号机 + if (!stand.isHoldTrain()) { + this.reopenSignal(simulation, stand); + } + } /** * 取消扣车 * diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SwitchService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SwitchService.java index e32866acb..dc9a7a6d2 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SwitchService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SwitchService.java @@ -7,15 +7,20 @@ import club.joylink.rtss.simulation.cbtc.constant.SimulationModule; import club.joylink.rtss.simulation.cbtc.data.map.Route; import club.joylink.rtss.simulation.cbtc.data.map.Signal; import club.joylink.rtss.simulation.cbtc.data.map.Switch; +import club.joylink.rtss.simulation.cbtc.data.map.SwitchElement; import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySwitch; +import club.joylink.rtss.simulation.cbtc.event.RouteModeChangeEvent; import club.joylink.rtss.simulation.cbtc.event.SimulationDeviceControlEvent; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * 道岔服务 @@ -111,6 +116,7 @@ public class SwitchService { aSwitch.getB().setBlockade(true); aSwitch.getC().setBlockade(true); } + aSwitch.setInit(false); } /** @@ -179,4 +185,46 @@ public class SwitchService { } } } + + @EventListener + public void handle(RouteModeChangeEvent event) { + this.switchStatusUpdate(event.getSimulation(), event.getRoutes()); + } + + /** + * 道岔的封锁失效状态更新 + */ + private void switchStatusUpdate(Simulation simulation, List routes) { + if (!simulation.getRepository().getConfig().isBlockadeCommandOnlyValidInStandbyMode()) { + return; + } + if (!CollectionUtils.isEmpty(routes)) { + if (!routes.get(0).isCbtcMode()) { //进路的状态被设为非cbtc + routes.forEach(route -> { + route.getSwitchList().forEach(switchElement -> { + Switch aSwitch = switchElement.getASwitch(); + if (aSwitch.isBlockade()) { + aSwitch.setBlockadeInvalid(false); + } + }); + }); + } else { + List switches = routes.stream() + .flatMap(route -> route.getSwitchList() + .stream() + .map(SwitchElement::getASwitch) + .filter(aSwitch -> aSwitch.isBlockade() && !aSwitch.isBlockadeInvalid())) + .collect(Collectors.toList()); //进路下所有处于封锁且封锁有效状态的道岔 + for (Route route : simulation.getRepository().getRouteList()) { + if (!route.isCbtcMode()) { + switches.removeIf(route::isRouteSwitch); + if (switches.isEmpty()) { + break; + } + } + } + switches.forEach(aSwitch -> aSwitch.setBlockadeInvalid(true)); + } + } + } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/competition/CompetitionAndScriptManager.java b/src/main/java/club/joylink/rtss/simulation/cbtc/competition/CompetitionAndScriptManager.java index dd2ae3f2b..8a44008e3 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/competition/CompetitionAndScriptManager.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/competition/CompetitionAndScriptManager.java @@ -60,6 +60,7 @@ public class CompetitionAndScriptManager { @Qualifier("baiDuVoiceService") private IVoiceService iVoiceService; + @Deprecated public void run(Simulation simulation) { //--- 确认剧本需要运行 --- CompetitionBO competition = simulation.getCompetition(); diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/conversation/ConversationManagerService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/conversation/ConversationManagerService.java index cf70f80bf..153c5d34a 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/conversation/ConversationManagerService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/conversation/ConversationManagerService.java @@ -1,16 +1,15 @@ package club.joylink.rtss.simulation.cbtc.conversation; +import club.joylink.rtss.services.IVoiceService; import club.joylink.rtss.simulation.cbtc.GroupSimulationCache; import club.joylink.rtss.simulation.cbtc.Simulation; -import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository; +import club.joylink.rtss.simulation.cbtc.competition.ScriptExecuteService; import club.joylink.rtss.simulation.cbtc.data.vo.ConversationVO; import club.joylink.rtss.simulation.cbtc.event.*; import club.joylink.rtss.simulation.cbtc.exception.SimulationException; import club.joylink.rtss.simulation.cbtc.exception.SimulationExceptionType; import club.joylink.rtss.simulation.cbtc.member.SimulationMember; import club.joylink.rtss.simulation.cbtc.member.SimulationUser; -import club.joylink.rtss.services.IVoiceService; -import club.joylink.rtss.simulation.cbtc.competition.ScriptExecuteService; import club.joylink.rtss.vo.UserVO; import club.joylink.rtss.vo.client.VoiceRecognitionResult; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/conversation/SimulationVoiceHandler.java b/src/main/java/club/joylink/rtss/simulation/cbtc/conversation/SimulationVoiceHandler.java index c88f1dac8..278e2808b 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/conversation/SimulationVoiceHandler.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/conversation/SimulationVoiceHandler.java @@ -87,6 +87,7 @@ public class SimulationVoiceHandler { replacementList.add(new Replacement("(控子权|控质权|放置权|矿质权|空置权)", "控制权")); replacementList.add(new Replacement("(手机号)", "手信号")); replacementList.add(new Replacement("(鼓掌|部长)", "故障")); + replacementList.add(new Replacement("(向凤)", "下放")); //------------- 设备相关 -------------- replacementList.add(new Replacement("(宇花祭|玉花祭|雨化寨|氯化钙|绿化带|优化钙)", "鱼化寨")); replacementList.add(new Replacement("(保税局)", "保税区")); diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/MapConfig.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/MapConfig.java index fe46e0e8c..aa8c80a15 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/MapConfig.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/MapConfig.java @@ -166,6 +166,41 @@ public class MapConfig { */ private boolean adjustOperationAutomatically; + /** + * 在办理车队进路前是否要先排列进路 + */ + private boolean setRouteBeforeSetFlt; + + /** + * 在取消车队进路时同时取消进路 + */ + private boolean cancelRouteWhenCancelFlt; + + /** + * 办理引导前需要信号机接近锁闭 + */ + private boolean needApproachLockBeforeSetGuide; + +// /** +// * 站台指定列车跳停仅跳停一次 +// */ +// private boolean standSkipSetTrainOnlyOnce; + + /** + * 封锁命令(状态)仅在后备模式下有效 + */ + private boolean blockadeCommandOnlyValidInStandbyMode; + + /** + * 一些命令需要初始化【泰雷兹】(道岔封锁、信号机开放引导) + */ + private boolean someCommandNeedInit; + + /** + * 计轴预复位前需要车站预复位 + */ + private boolean stationPreResetBeforeAxlePreReset; + private Set needConfirmConnectMembers = Stream.of(DISPATCHER, STATION_SUPERVISOR, MAINTAINER, ELECTRIC_DISPATCHER).collect(Collectors.toSet()); @@ -200,6 +235,13 @@ public class MapConfig { setAllowEarlyDepartureWhenHoldTrain(configVO.isAllowEarlyDepartureWhenHoldTrain()); setEBWhenCancelRoute(configVO.isEBWhenCancelRoute()); setAdjustOperationAutomatically(configVO.isAdjustOperationAutomatically()); + setSetRouteBeforeSetFlt(configVO.isSetRouteBeforeSetFlt()); + setCancelRouteWhenCancelFlt(configVO.isCancelRouteWhenCancelFlt()); + setNeedApproachLockBeforeSetGuide(configVO.isNeedApproachLockBeforeSetGuide()); +// setStandSkipSetTrainOnlyOnce(configVO.isStandSkipSetTrainOnlyOnce()); + setBlockadeCommandOnlyValidInStandbyMode(configVO.isBlockadeCommandOnlyValidInStandbyMode()); + setSomeCommandNeedInit(configVO.isSwitchBlockadeCommandNeedInit()); + setStationPreResetBeforeAxlePreReset(configVO.isStationPreResetBeforeAxlePreReset()); } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Signal.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Signal.java index af26a32bf..8f6790087 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Signal.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Signal.java @@ -186,11 +186,21 @@ public class Signal extends MayOutOfOrderDevice { */ private SignalApproachMessage.ApproachMessage approachMsg; + /** + * 强制物理点灯 + */ + private boolean forcePhysical; + /** * 无状态 */ private boolean noStatus; + /** + * 初始化 + */ + private boolean init; + @Override public void reset() { super.reset(); @@ -198,14 +208,16 @@ public class Signal extends MayOutOfOrderDevice { this.level = 1; this.blockade = false; this.reblockade = false; - this.changeLightType(true); + this.logicLight = this.isCtc(); this.greenOpen = false; this.yellowOpen = false; this.redOpen = true; this.delayTime = 0; this.guideRemain = 0; this.approachMsg = SignalApproachMessage.ApproachMessage.NULL; + this.forcePhysical = false; this.noStatus = false; + this.init = false; } @Override @@ -217,6 +229,12 @@ public class Signal extends MayOutOfOrderDevice { if (SignalFault.MAIN_FILAMENT_BROKEN.equals(getFault()) && logic) { return; } + if (logic && forcePhysical) { + return; + } + if (!logic && virtual) { + return; + } if (this.isCtc()) { this.logicLight = logic; diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Stand.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Stand.java index 5b1cb93c5..27bfceb3e 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Stand.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Stand.java @@ -82,6 +82,9 @@ public class Stand extends MayOutOfOrderDevice { */ private volatile boolean centerHoldTrain; + /**系统扣车*/ + private volatile boolean sysHoldTrain; + /** * 区间自动扣车 */ @@ -153,6 +156,7 @@ public class Stand extends MayOutOfOrderDevice { this.remainTime = 0; this.stationHoldTrain = false; this.centerHoldTrain = false; + this.sysHoldTrain = false; this.autoHoldTrain = false; this.allSkip = false; this.skipSet = Collections.synchronizedSet(new HashSet<>()); @@ -175,7 +179,7 @@ public class Stand extends MayOutOfOrderDevice { */ //TODO 反向扣车是否计算在内 public boolean isHoldTrain() { - return stationHoldTrain || centerHoldTrain; + return stationHoldTrain || centerHoldTrain || sysHoldTrain; } /** diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Station.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Station.java index 4feee7ea2..176b55d6c 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Station.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Station.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @Getter @@ -162,6 +163,26 @@ public class Station extends MayOutOfOrderDevice { */ private LocalTime restartTime; + /** + * 该车站的控制权拥有者 + */ + private SimulationMember controller; + + /** + * 是否紧急控制 + */ + private boolean emergencyController; + + /** + * 控制权申请者 + */ + private SimulationMember controlApplicant; + + /** + * 预复位剩余时间/ms + */ + private AtomicInteger preResetValidDuration = new AtomicInteger(0); + @Override public void reset() { super.reset(); @@ -180,6 +201,11 @@ public class Station extends MayOutOfOrderDevice { this.apply2TheControlMode = null; this.validDuration = null; this.interlockMachineStarting = false; + this.restartTime = null; + this.controller = null; + this.emergencyController = false; + this.controlApplicant = null; + this.preResetValidDuration = new AtomicInteger(0); } public List getStandOf(boolean right) { @@ -362,6 +388,28 @@ public class Station extends MayOutOfOrderDevice { throw new SimulationException(SimulationExceptionType.Illegal_Argument, String.format("区段[%s]不是车站[%s]的站台轨", section.getCode(), this.getCode())); } + public String getControllerId() { + if (controller == null) { + return null; + } + return controller.getId(); + } + + public String getControlApplicantId() { + if (controlApplicant == null) { + return null; + } + return controlApplicant.getId(); + } + + public int getPreResetValidDurationInSeconds() { + return this.preResetValidDuration.get() / 1000; + } + + public boolean isPreReset() { + return this.preResetValidDuration != null && this.preResetValidDuration.get() > 0; + } + public enum ControlMode { /** * 交出未被接收 @@ -379,6 +427,7 @@ public class Station extends MayOutOfOrderDevice { * 紧急站控 */ Emergency, + /** * 联锁控 */ @@ -436,7 +485,7 @@ public class Station extends MayOutOfOrderDevice { } public String debugStr() { - return String.format("%s", this.getName()); + return String.format("车站[%s]", this.getName()); } @Override diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Switch.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Switch.java index 6d245a7de..10988c836 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Switch.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/Switch.java @@ -104,6 +104,31 @@ public class Switch extends MayOutOfOrderDevice { */ private boolean preReset; + /** + * 自动 + */ + private boolean auto; + + /** + * 中央调度员预留 + */ + private boolean dispatcherReserve; + + /** + * 联锁预留 + */ + private boolean interlockReserve; + + /** + * 封锁失效 + */ + private boolean blockadeInvalid; + + /** + * 初始化 + */ + private boolean init; + @Override public void reset() { super.reset(); @@ -118,6 +143,11 @@ public class Switch extends MayOutOfOrderDevice { this.delayTime = 0; this.noStatus = false; this.preReset = false; + this.auto = false; + this.dispatcherReserve = false; + this.interlockReserve = false; + this.blockadeInvalid = false; + this.init = false; } /** diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/StandStatus.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/StandStatus.java index 6ba8faf93..a3f87bf75 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/StandStatus.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/StandStatus.java @@ -41,6 +41,10 @@ public class StandStatus extends DeviceStatus { @JsonSerialize(using = Boolean2NumSerializer.class) private boolean centerHoldTrain; + /**中心是否扣车*/ + @JsonSerialize(using = Boolean2NumSerializer.class) + private boolean sysHoldTrain; + /**区间自动扣车*/ @JsonSerialize(using = Boolean2NumSerializer.class) private boolean autoHoldTrain; @@ -90,6 +94,7 @@ public class StandStatus extends DeviceStatus { this.emergencyClosed = stand.isEmergencyClosed(); this.stationHoldTrain = stand.isStationHoldTrain(); this.centerHoldTrain = stand.isCenterHoldTrain(); + this.sysHoldTrain = stand.isSysHoldTrain(); this.autoHoldTrain = stand.isAutoHoldTrain(); this.allSkip = stand.isAllSkip(); this.skipSet = new HashSet<>(stand.getSkipSet()); @@ -143,6 +148,11 @@ public class StandStatus extends DeviceStatus { status.setCenterHoldTrain(this.centerHoldTrain); change = true; } + if (!Objects.equals(this.sysHoldTrain, stand.isSysHoldTrain())) { + this.sysHoldTrain = stand.isSysHoldTrain(); + status.setSysHoldTrain(this.sysHoldTrain); + change = true; + } if (!Objects.equals(this.autoHoldTrain, stand.isAutoHoldTrain())) { this.autoHoldTrain = stand.isAutoHoldTrain(); status.setAutoHoldTrain(this.autoHoldTrain); @@ -220,6 +230,7 @@ public class StandStatus extends DeviceStatus { statusVO.setAllSkip(allSkip); statusVO.setAutoHoldTrain(autoHoldTrain); statusVO.setCenterHoldTrain(centerHoldTrain); + statusVO.setSysHoldTrain(sysHoldTrain); statusVO.setStationHoldTrain(stationHoldTrain); statusVO.setEmergencyClosed(emergencyClosed); statusVO.setTrainParking(trainParking); diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/StationStatus.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/StationStatus.java index 9fccfba2c..cf1940246 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/StationStatus.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/StationStatus.java @@ -1,13 +1,13 @@ package club.joylink.rtss.simulation.cbtc.data.status; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import club.joylink.rtss.simulation.cbtc.data.map.MapElement; import club.joylink.rtss.simulation.cbtc.data.map.Station; import club.joylink.rtss.simulation.cbtc.data.vo.DeviceStatusVO; import club.joylink.rtss.simulation.cbtc.data.vo.StationStatusVO; import club.joylink.rtss.util.jsonSerialize.Boolean2NumDeserializer; import club.joylink.rtss.util.jsonSerialize.Boolean2NumSerializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Getter; import java.time.LocalTime; @@ -47,13 +47,33 @@ public class StationStatus extends DeviceStatus { private Station.ControlMode apply2TheControlMode; /** - * 控制权转换申请失效时刻 + * 控制权转换申请有效时长/s */ private Integer validDuration; /**连锁机上电重启时间*/ private LocalTime restartTime; + /** + * 该车站的控制权拥有者 + */ + private String controller; + + /** + * 是否紧急控制 + */ + private boolean emergencyController; + + /** + * 控制权申请者 + */ + private String controlApplicant; + + /** + * 预复位有效时长 + */ + private int preResetValidDuration; + public StationStatus(Station station) { super(station.getCode(), station.getDeviceType()); this.controlMode = station.getControlMode(); @@ -63,6 +83,10 @@ public class StationStatus extends DeviceStatus { this.apply2TheControlMode = station.getApply2TheControlMode(); this.validDuration = station.getValidDurationInSeconds(); this.restartTime = station.getRestartTime(); + this.controller = station.getControllerId(); + this.emergencyController = station.isEmergencyController(); + this.controlApplicant = station.getControlApplicantId(); + this.preResetValidDuration = station.getPreResetValidDurationInSeconds(); } @Override @@ -106,6 +130,26 @@ public class StationStatus extends DeviceStatus { this.restartTime = station.getRestartTime(); status.setRestartTime(restartTime); } + if (!Objects.equals(this.controller, station.getControllerId())) { + change = true; + this.controller = station.getControllerId(); + } + status.setController(this.controller); + if (!Objects.equals(this.emergencyController, station.isEmergencyController())) { + change = true; + this.emergencyController = station.isEmergencyController(); + status.setEmergencyController(this.emergencyController); + } + if (!Objects.equals(this.controlApplicant, station.getControlApplicantId())) { + change = true; + this.controlApplicant = station.getControlApplicantId(); + } + status.setControlApplicant(this.controlApplicant); + if (!Objects.equals(this.preResetValidDuration, station.getPreResetValidDurationInSeconds())) { + change = true; + this.preResetValidDuration = station.getPreResetValidDurationInSeconds(); + status.setPreResetValidDuration(this.preResetValidDuration); + } return change; } @@ -119,6 +163,10 @@ public class StationStatus extends DeviceStatus { statusVO.setApply2TheControlMode(apply2TheControlMode); statusVO.setValidDuration(validDuration); statusVO.setRestartTime(restartTime); + statusVO.setController(controller); + statusVO.setEmergencyController(emergencyController); + statusVO.setControlApplicant(controlApplicant); + statusVO.setPreResetValidDuration(preResetValidDuration); return statusVO; } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/SwitchStatus.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/SwitchStatus.java index 3976d0b2b..579c1c3c5 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/SwitchStatus.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/status/SwitchStatus.java @@ -66,7 +66,25 @@ public class SwitchStatus extends DeviceStatus { @JsonSerialize(using = Boolean2NumSerializer.class) private boolean preReset; - private int speedUpLimit; + /** + * 自动 + */ + private boolean auto; + + /** + * 中央调度员预留 + */ + private boolean dispatcherReserve; + + /** + * 联锁预留 + */ + private boolean interlockReserve; + + /** + * 封锁失效 + */ + private boolean blockadeInvalid; /** * 故障 @@ -85,6 +103,10 @@ public class SwitchStatus extends DeviceStatus { this.delayTime = aSwitch.getDelayTime() / 1000; this.noStatus = aSwitch.isNoStatus(); this.preReset = aSwitch.isPreReset(); + this.auto = aSwitch.isAuto(); + this.dispatcherReserve = aSwitch.isDispatcherReserve(); + this.interlockReserve = aSwitch.isInterlockReserve(); + this.blockadeInvalid = aSwitch.isBlockadeInvalid(); } @Override @@ -143,6 +165,26 @@ public class SwitchStatus extends DeviceStatus { status.setPreReset(this.preReset); change = true; } + if (!Objects.equals(this.auto, aSwitch.isAuto())) { + this.auto = aSwitch.isAuto(); + status.setAuto(this.auto); + change = true; + } + if (!Objects.equals(this.dispatcherReserve, aSwitch.isDispatcherReserve())) { + this.dispatcherReserve = aSwitch.isDispatcherReserve(); + status.setDispatcherReserve(this.dispatcherReserve); + change = true; + } + if (!Objects.equals(this.interlockReserve, aSwitch.isInterlockReserve())) { + this.interlockReserve = aSwitch.isInterlockReserve(); + status.setInterlockReserve(this.interlockReserve); + change = true; + } + if (!Objects.equals(this.blockadeInvalid, aSwitch.isBlockadeInvalid())) { + this.blockadeInvalid = aSwitch.isBlockadeInvalid(); + status.setBlockadeInvalid(this.blockadeInvalid); + change = true; + } if (!Objects.equals(this.fault, aSwitch.getFault())) { this.fault = (Switch.SwitchFault) aSwitch.getFault(); change = true; @@ -163,6 +205,10 @@ public class SwitchStatus extends DeviceStatus { statusVO.setSingleLock(singleLock); statusVO.setNoStatus(noStatus); statusVO.setPreReset(preReset); + statusVO.setAuto(auto); + statusVO.setDispatcherReserve(dispatcherReserve); + statusVO.setInterlockReserve(interlockReserve); + statusVO.setBlockadeInvalid(blockadeInvalid); statusVO.setFault(this.fault != null ? this.fault.name() : null); return statusVO; } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/storage/device/StorageStation.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/storage/device/StorageStation.java index e9dc9ea8b..b247ab032 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/storage/device/StorageStation.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/storage/device/StorageStation.java @@ -1,17 +1,21 @@ package club.joylink.rtss.simulation.cbtc.data.storage.device; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import club.joylink.rtss.simulation.cbtc.Simulation; import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository; import club.joylink.rtss.simulation.cbtc.data.map.MapElement; import club.joylink.rtss.simulation.cbtc.data.map.Station; import club.joylink.rtss.util.jsonSerialize.Boolean2NumDeserializer; import club.joylink.rtss.util.jsonSerialize.Boolean2NumSerializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.time.LocalTime; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; + @Getter @Setter @NoArgsConstructor @@ -49,6 +53,18 @@ public class StorageStation extends StorageDevice { */ private Integer validDuration; + private Boolean interlockMachineStarting; + + private LocalTime restartTime; + + private String controller; + + private Boolean emergencyController; + + private String controlApplicant; + + private Integer preResetValidDuration; + public StorageStation(String code) { super(code); } @@ -75,6 +91,18 @@ public class StorageStation extends StorageDevice { if (station.getValidDuration() != null) { storageStation.setValidDuration(station.getValidDuration()); } + if (station.isInterlockMachineStarting()) { + storageStation.setInterlockMachineStarting(station.isInterlockMachineStarting()); + } + storageStation.setRestartTime(station.getRestartTime()); + storageStation.setController(station.getControllerId()); + if (station.isEmergencyController()) { + storageStation.setEmergencyController(station.isEmergencyController()); + } + storageStation.setControlApplicant(station.getControlApplicantId()); + if (station.getPreResetValidDuration() != null && station.getPreResetValidDuration().get() != 0) { + storageStation.setPreResetValidDuration(station.getPreResetValidDuration().get()); + } return storageStation; } @@ -92,5 +120,11 @@ public class StorageStation extends StorageDevice { } station.setApply2TheControlMode(apply2TheControlMode); station.setValidDuration(validDuration); + station.setInterlockMachineStarting(interlockMachineStarting != null ? interlockMachineStarting : false); + station.setRestartTime(restartTime); + station.setController(controller != null ? simulation.getSimulationMemberById(controller) : null); + station.setEmergencyController(emergencyController != null ? emergencyController : false); + station.setControlApplicant(controlApplicant != null ? simulation.getSimulationMemberById(controlApplicant) : null); + station.setPreResetValidDuration(new AtomicInteger(Objects.requireNonNullElse(preResetValidDuration, 0))); } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/StandStatusVO.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/StandStatusVO.java index 19b8cd162..9226b842f 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/StandStatusVO.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/StandStatusVO.java @@ -37,6 +37,10 @@ public class StandStatusVO extends DeviceStatusVO { @JsonSerialize(using = Boolean2NumSerializer.class) private Boolean centerHoldTrain; + /**是否系统扣车*/ + @JsonSerialize(using = Boolean2NumSerializer.class) + private Boolean sysHoldTrain; + /**区间自动扣车*/ @JsonSerialize(using = Boolean2NumSerializer.class) private Boolean autoHoldTrain; diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/StationStatusVO.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/StationStatusVO.java index 526f9fa20..11897069a 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/StationStatusVO.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/StationStatusVO.java @@ -1,15 +1,14 @@ package club.joylink.rtss.simulation.cbtc.data.vo; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import club.joylink.rtss.simulation.cbtc.data.map.Station; import club.joylink.rtss.util.jsonSerialize.Boolean2NumDeserializer; import club.joylink.rtss.util.jsonSerialize.Boolean2NumSerializer; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Getter; import lombok.Setter; -import java.time.LocalDateTime; import java.time.LocalTime; /** @@ -52,6 +51,25 @@ public class StationStatusVO extends DeviceStatusVO { private LocalTime restartTime; + /** + * 该车站的控制权拥有者 + */ + @JsonInclude() + private String controller; + + /** + * 是否紧急控制 + */ + private Boolean emergencyController; + + /** + * 控制权申请者 + */ + @JsonInclude() + private String controlApplicant; + + private Integer preResetValidDuration; + public StationStatusVO(Station station) { super(station.getCode(), station.getDeviceType()); } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/SwitchStatusVO.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/SwitchStatusVO.java index c660c08dd..e024bb8a8 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/SwitchStatusVO.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/SwitchStatusVO.java @@ -55,6 +55,18 @@ public class SwitchStatusVO extends DeviceStatusVO { @JsonSerialize(using = Boolean2NumSerializer.class) private Boolean preReset; + @JsonSerialize(using = Boolean2NumSerializer.class) + private Boolean auto; + + @JsonSerialize(using = Boolean2NumSerializer.class) + private Boolean dispatcherReserve; + + @JsonSerialize(using = Boolean2NumSerializer.class) + private Boolean interlockReserve; + + @JsonSerialize(using = Boolean2NumSerializer.class) + private Boolean blockadeInvalid; + @JsonInclude private String fault; diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityIbp.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityIbp.java index c1bb91ad8..00c6d6a48 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityIbp.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityIbp.java @@ -44,7 +44,7 @@ public class VirtualRealityIbp { this.xxys = false; } - public enum Button{ + public enum ButtonType { //------------------ 信号 ------------------ /** 下行扣车 */ XXKC, @@ -70,5 +70,9 @@ public class VirtualRealityIbp { SXKM, /** 上行钥匙 */ SXYS, + + //------------------ 区段 ------------------ + /** 预复位 */ + PRERESET, } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealitySectionAxleCounter.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealitySectionAxleCounter.java index aa3e8e6b6..fbe12fa80 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealitySectionAxleCounter.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealitySectionAxleCounter.java @@ -114,15 +114,22 @@ public class VirtualRealitySectionAxleCounter extends VirtualRealityDevice { public void judgePreResetSuccess() { if (preReset) { if (leftCount == 0 && rightCount == 0) { - preReset = false; - if (Fault.FAULT.equals(this.fault)) { - this.fault = null; - } - this.clear(); + axleReset(); } } } + /** + * 计轴复位 + */ + public void axleReset() { + preReset = false; + if (Fault.FAULT.equals(this.fault)) { + this.fault = null; + } + this.clear(); + } + public enum Fault { FAULT { @Override diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityTrain.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityTrain.java index 2fc7b9538..537665562 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityTrain.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityTrain.java @@ -368,6 +368,39 @@ public class VirtualRealityTrain extends VirtualRealityDevice { /**最近经过的两个应答器*/ private Queue lastTwoPassedResponders = new FixedQueue<>(Responders_Record); + /** + * 运行类型 + */ + private RunType runType; + + public void setRunType(RunType runType) { + this.runType = runType; + switch (runType) { + case ENERGY_CONSERVATION: + this.atoSpeedMax = this.atpSpeedMax * 0.2f * 0.9f; + break; + case MIDDLE_ONE: + this.atoSpeedMax = this.atpSpeedMax * 0.4f * 0.9f; + break; + case MIDDLE_TWO: + this.atoSpeedMax = this.atpSpeedMax * 0.6f * 0.9f; + break; + case NORMAL: + this.atoSpeedMax = this.atpSpeedMax * 0.8f * 0.9f; + break; + case ACCELERATE: + this.atoSpeedMax = this.atpSpeedMax * 0.9f; + break; + } + } + + public void setAtoSpeedMax(float atoSpeedMax) { + if (runType != null) { + return; + } + this.atoSpeedMax = atoSpeedMax; + } + public void setAtpOn(boolean on) { this.atpOn = on; if (!on) { //如果是关闭ATP,取消信号EB @@ -432,6 +465,7 @@ public class VirtualRealityTrain extends VirtualRealityDevice { this.pantograph2Up = true; this.linkTrain = null; this.lastTwoPassedResponders = new FixedQueue<>(Responders_Record); + this.runType = null; } public boolean isEB() { @@ -1056,4 +1090,17 @@ public class VirtualRealityTrain extends VirtualRealityDevice { } } + public enum RunType{ + /** 节能 */ + ENERGY_CONSERVATION, + /** 中间的1 */ + MIDDLE_ONE, + /** 中间的2 */ + MIDDLE_TWO, + /** 正常 */ + NORMAL, + /** 加速 */ + ACCELERATE, + } + } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/event/RouteModeChangeEvent.java b/src/main/java/club/joylink/rtss/simulation/cbtc/event/RouteModeChangeEvent.java new file mode 100644 index 000000000..a9d1992ff --- /dev/null +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/event/RouteModeChangeEvent.java @@ -0,0 +1,17 @@ +package club.joylink.rtss.simulation.cbtc.event; + +import club.joylink.rtss.simulation.cbtc.Simulation; +import club.joylink.rtss.simulation.cbtc.data.map.Route; +import lombok.Getter; + +import java.util.List; + +@Getter +public class RouteModeChangeEvent extends AbstractSimulationEvent{ + private List routes; + + public RouteModeChangeEvent(Object source, Simulation simulation, List routes) { + super(source, simulation); + this.routes = routes; + } +} diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATO/service/ATOService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATO/service/ATOService.java index 49fd116e1..3060a0f71 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATO/service/ATOService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATO/service/ATOService.java @@ -158,7 +158,7 @@ public class ATOService { // nextStopStandSection.getName(), nextStopStandSection.getCode())); boolean parking = true; Signal signal = target.getSignalOf(right); - if (!train.isHold() && (train.isJump() && signal.isNormalOpen() || !train.isNextParking())) { + if (!train.isHold() && (train.isJump() && (Objects.isNull(signal) || signal.isNormalOpen()) || !train.isNextParking())) { parking = false; } if (parking) { diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATP/ATPLogicLoop.java b/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATP/ATPLogicLoop.java index eb789ee07..9010a6a07 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATP/ATPLogicLoop.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATP/ATPLogicLoop.java @@ -161,7 +161,7 @@ public class ATPLogicLoop { } // 列车倒车限速 if (ControlGear.Reverse.equals(train.getGear())) { - if (train.getSpeed() > 25 / 3.6) { + if (train.getSpeed() > 5 / 3.6) { //5km/h从西安二操作手册得来 atpService.triggerSignalEB(train); } } @@ -215,6 +215,14 @@ public class ATPLogicLoop { case OPEN_DOOR: // 开门 if (train.isJump()) { // 列车跳停,跳过开门 train.earlyDeparture(); +// if (simulation.getRepository().getConfig().isStandSkipSetTrainOnlyOnce()) { + List standList = train.getHeadPosition().getSection().getStandList(); + if (!CollectionUtils.isEmpty(standList)) { + standList.stream().filter(stand -> stand.isGivenTrainSkip(train.getGroupNumber())).forEach(stand -> { + atsApiService.cancelStandSkipSetOfTrain(simulation,train.getGroupNumber(), stand.getCode()); + }); + } +// } } else { this.atoService.syncOpenDoor(simulation, train); if (this.isAllDoorOpen(simulation, train)) { @@ -234,7 +242,7 @@ public class ATPLogicLoop { } break; case CLOSE_DOOR: // 关门 - Signal signal = train.getHeadPosition().getSection().getSignalOf(train.isRight()); +// Signal signal = train.getHeadPosition().getSection().getSignalOf(train.isRight()); if (!train.isHold() || simulation.getRepository().getConfig().isAllowEarlyDepartureWhenHoldTrain()) { // 列车未扣车或允许在扣车状态下提前发车 // if (Objects.nonNull(signal) && !signal.isNormalOpen()) { // if (!train.isRMMode() && !train.isNRMMode()) { @@ -638,22 +646,32 @@ public class ATPLogicLoop { */ private void checkTrainJumpAndSend2Ats(Simulation simulation, VirtualRealityTrain train, SectionPosition headPosition, SectionPosition tailPosition, boolean right) { - if (!train.isStop()) { // 列车未停车 - // 判断列车是否成功跳站 - Station nextStation = train.getNextStation(); - if (Objects.nonNull(nextStation)) { - Section tailSection = tailPosition.getSection(); - if (tailSection.isNormalStandTrack() && - Objects.equals(nextStation, tailSection.getStation())) { - // 列车尾部在计划的下一站台轨 - SectionPosition standEndPosition = new SectionPosition(tailSection, right ? tailSection.getLen() : 0); - Float distance = CalculateService.calculateDistance(standEndPosition, headPosition, right); - if (Objects.nonNull(distance) && distance > 5) { - // 列车成功越站 - this.atsApiService.handleTrainPassingStation(simulation, train.getGroupNumber(), - nextStation.getCode(), tailSection.getCode()); - } - } + if (train.isStop()) { + return; + } + // 列车未停车 + // 判断列车是否成功跳站 + Station nextStation = train.getNextStation(); + if (Objects.isNull(nextStation)) { + return; + } + Section tailSection = tailPosition.getSection(); + if (tailSection.isNormalStandTrack() && + Objects.equals(nextStation, tailSection.getStation())) { + // 列车尾部在计划的下一站台轨 + SectionPosition standEndPosition = new SectionPosition(tailSection, right ? tailSection.getLen() : 0); + Float distance = CalculateService.calculateDistance(standEndPosition, headPosition, right); + if (Objects.nonNull(distance) && distance > 5) { + // 列车成功越站 + this.atsApiService.handleTrainPassingStation(simulation, train.getGroupNumber(), + nextStation.getCode(), tailSection.getCode()); +// if (simulation.getRepository().getConfig().isStandSkipSetTrainOnlyOnce()) { +// List standList = train.getHeadPosition().getSection().getStandList(); +// if (CollectionUtils.isEmpty(standList)) { +// return; +// } +// standList.stream().filter(stand -> stand.isGivenTrainSkip(train.getGroupNumber())).forEach(stand -> atsApiService.cancelStandSkipSetOfTrain(simulation, train.getGroupNumber(), stand.getCode())); +// } } } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/robot/RobotLogicLoop.java b/src/main/java/club/joylink/rtss/simulation/cbtc/robot/RobotLogicLoop.java index 43636967e..9cda4657a 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/robot/RobotLogicLoop.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/robot/RobotLogicLoop.java @@ -14,11 +14,14 @@ import club.joylink.rtss.simulation.cbtc.driving.DrivingService; import club.joylink.rtss.simulation.cbtc.member.SimulationMember; import club.joylink.rtss.simulation.cbtc.onboard.ATO.SpeedCurve; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.task.TaskExecutor; import org.springframework.stereotype.Component; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -38,13 +41,20 @@ public class RobotLogicLoop { @Autowired private DriverOperateHandler driverOperateHandler; + @Qualifier("nsExecutor") + @Autowired + private TaskExecutor executor; /** * 根据目标位置运行 */ public void run(Simulation simulation) { - robotDriverLogicLoop(simulation); + executor.execute(() -> robotDriverLogicLoop(simulation)); + executor.execute(() -> robotReplyControlTransferApplicationLogicLoop(simulation)); + executor.execute(() -> robotStationControlAutoTransfer(simulation)); + + + - robotReplyControlTransferApplicationLogicLoop(simulation); } /** @@ -151,6 +161,18 @@ public class RobotLogicLoop { } } + /**机器人自动执行车站控制权限转移*/ + private void robotStationControlAutoTransfer(Simulation simulation) { + if (simulation.getScript() != null && simulation.getScript().isBgSet()) { + return; + } + Map> robotControlStations = simulation.getRepository().getStationList().stream() + .filter(station -> Objects.nonNull(station.getController()) && station.getController().isRobot() && Objects.nonNull(station.getControlApplicant())).collect(Collectors.groupingBy(Station::getController)); + robotControlStations.forEach((controler, stations) -> { + atsStationService.transferControl(simulation, stations.stream().map(Station::getCode).collect(Collectors.toList()), true, controler); + }); + } + /** * 机器人回复控制权转换申请 * diff --git a/src/main/java/club/joylink/rtss/vo/client/map/MapTrainModelVO.java b/src/main/java/club/joylink/rtss/vo/client/map/MapTrainModelVO.java index c985d3e07..add226a23 100644 --- a/src/main/java/club/joylink/rtss/vo/client/map/MapTrainModelVO.java +++ b/src/main/java/club/joylink/rtss/vo/client/map/MapTrainModelVO.java @@ -34,49 +34,70 @@ public class MapTrainModelVO { /** * 车长-- 米 */ - @ApiModelProperty(value = "车长") + @ApiModelProperty(value = "车长/m") @NotNull(message = "车长不能为空") private Float length; /** - * 平均速度 + * 车重-- 吨 */ - @ApiModelProperty(value = "平均速度") - @NotNull(message = "平均速度不能为空") - private Float averageVelocity; + @ApiModelProperty(value = "重量/t") + @NotNull(message = "重量不能为空") + private Float weight; /** - * 平均减速度 + * 车厢数量 */ - @ApiModelProperty(value = "平均减速度") - @NotNull(message = "平均减速度不能为空") - private Float averageDeceleration; - - /** - * 默认速度 - */ - @ApiModelProperty(value = "默认速度") - @NotNull(message = "默认速度不能为空") - private Float defaultVelocity; - - /** - * 最大速度 - */ - @ApiModelProperty(value = "最大速度") - @NotNull(message = "最大速度不能为空") - private Float maxVelocity; - - /** - * 安全运行距离(米) - */ - @ApiModelProperty(value = "安全运行距离,单位:米") - @NotNull(message = "安全运行距离不能为空") - private Float safeDistance; - - /** - * 安全运行距离上限(米) - */ - @ApiModelProperty(value = "安全运行距离上限,单位:米") - @NotNull(message = "安全运行距离上限不能为空") - private Float maxSafeDistance; + @ApiModelProperty(value = "车厢数量") + @NotNull(message = "车厢数量不能为空") + private Integer numberOfCars; +// +// /** +// * 车长-- 米 +// */ +// @ApiModelProperty(value = "车长") +// @NotNull(message = "车长不能为空") +// private Float length; +// +// /** +// * 平均速度 +// */ +// @ApiModelProperty(value = "平均速度") +// @NotNull(message = "平均速度不能为空") +// private Float averageVelocity; +// +// /** +// * 平均减速度 +// */ +// @ApiModelProperty(value = "平均减速度") +// @NotNull(message = "平均减速度不能为空") +// private Float averageDeceleration; +// +// /** +// * 默认速度 +// */ +// @ApiModelProperty(value = "默认速度") +// @NotNull(message = "默认速度不能为空") +// private Float defaultVelocity; +// +// /** +// * 最大速度 +// */ +// @ApiModelProperty(value = "最大速度") +// @NotNull(message = "最大速度不能为空") +// private Float maxVelocity; +// +// /** +// * 安全运行距离(米) +// */ +// @ApiModelProperty(value = "安全运行距离,单位:米") +// @NotNull(message = "安全运行距离不能为空") +// private Float safeDistance; +// +// /** +// * 安全运行距离上限(米) +// */ +// @ApiModelProperty(value = "安全运行距离上限,单位:米") +// @NotNull(message = "安全运行距离上限不能为空") +// private Float maxSafeDistance; } diff --git a/src/main/java/club/joylink/rtss/vo/client/map/RealLineConfigVO.java b/src/main/java/club/joylink/rtss/vo/client/map/RealLineConfigVO.java index 92a4662ef..61388bf74 100644 --- a/src/main/java/club/joylink/rtss/vo/client/map/RealLineConfigVO.java +++ b/src/main/java/club/joylink/rtss/vo/client/map/RealLineConfigVO.java @@ -105,6 +105,41 @@ public class RealLineConfigVO { */ private boolean adjustOperationAutomatically = true; + /** + * 在办理车队进路前是否要先排列进路 + */ + private boolean setRouteBeforeSetFlt = true; + + /** + * 在取消车队进路时同时取消进路 + */ + private boolean cancelRouteWhenCancelFlt; + + /** + * 办理引导前需要信号机接近锁闭 + */ + private boolean needApproachLockBeforeSetGuide = true; + +// /** +// * 站台指定列车跳停仅跳停一次 +// */ +// private boolean standSkipSetTrainOnlyOnce; + + /** + * 封锁命令(状态)仅在后备模式下有效 + */ + private boolean blockadeCommandOnlyValidInStandbyMode; + + /** + * 道岔封锁命令需要初始化 + */ + private boolean switchBlockadeCommandNeedInit; + + /** + * 计轴预复位前需要车站预复位 + */ + private boolean stationPreResetBeforeAxlePreReset; + public static RealLineConfigVO parseJsonStr(String configData) { if (StringUtils.hasText(configData)) { return JsonUtils.read(configData, RealLineConfigVO.class); diff --git a/src/main/java/club/joylink/rtss/vo/client/map/newmap/MapStationNewVO.java b/src/main/java/club/joylink/rtss/vo/client/map/newmap/MapStationNewVO.java index dcc9e3a58..9ce25424c 100644 --- a/src/main/java/club/joylink/rtss/vo/client/map/newmap/MapStationNewVO.java +++ b/src/main/java/club/joylink/rtss/vo/client/map/newmap/MapStationNewVO.java @@ -239,12 +239,6 @@ public class MapStationNewVO { @ApiModelProperty(value = "引导总锁按钮坐标") private Point guideTotalLockPoint; - @ApiModelProperty("现地显示是否折行") - private boolean foldLine; - - @ApiModelProperty("折行偏移") - private Point foldLineOffset; - public void addStand(MapStationStandNewVO standVO) { if(Objects.isNull(getStandList())) { this.standList = new ArrayList<>(); diff --git a/src/main/java/club/joylink/rtss/vo/client/order/OrderCreateVO.java b/src/main/java/club/joylink/rtss/vo/client/order/OrderCreateVO.java index 6ba87366d..6ec7c7b60 100644 --- a/src/main/java/club/joylink/rtss/vo/client/order/OrderCreateVO.java +++ b/src/main/java/club/joylink/rtss/vo/client/order/OrderCreateVO.java @@ -28,6 +28,11 @@ public class OrderCreateVO implements Serializable { private Float price; + /** + * 以分为单位的价格 + */ + private Integer priceInCents; + private String payWays; @NotBlank(message = "支付状态不能为空") @@ -55,7 +60,9 @@ public class OrderCreateVO implements Serializable { public SaleOrder convert2DB() { SaleOrder saleOrder = new SaleOrder(); saleOrder.setOrganizationId(organizationId); - if (price != null) { + if (priceInCents != null) { + saleOrder.setPrice(priceInCents.longValue()); + } else if (price != null) { saleOrder.setPrice((long) (price * 100)); } saleOrder.setPayWays(payWays);