Commit 1267a7c622a01793e5a5107bd9de3ee0275aa06b

Authored by 潘钊
1 parent 9a573551

update...

src/main/java/com/bsth/data/ThreadMonotor.java 0 → 100644
  1 +package com.bsth.data;
  2 +
  3 +import com.bsth.data.gpsdata.arrival.GpsRealAnalyse;
  4 +import com.bsth.data.msg_queue.DirectivePushQueue;
  5 +import com.bsth.data.msg_queue.WebSocketPushQueue;
  6 +import org.slf4j.Logger;
  7 +import org.slf4j.LoggerFactory;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +/**
  11 + * Created by panzhao on 2017/5/11.
  12 + */
  13 +@Component
  14 +public class ThreadMonotor extends Thread{
  15 +
  16 + Logger log = LoggerFactory.getLogger(this.getClass());
  17 +
  18 + @Override
  19 + public void run() {
  20 +
  21 + //线调GPS分析线程
  22 + if(GpsRealAnalyse.isBlock()){
  23 + log.warn("GpsRealAnalyse isBlock true !!!!");
  24 + GpsRealAnalyse.shutdown();
  25 + }
  26 +
  27 + //webSocket 消息推送队列
  28 + if(WebSocketPushQueue.isIdle()){
  29 + log.warn("WebSocketPushQueue isIdle true !!!!");
  30 + WebSocketPushQueue.start();
  31 + }
  32 +
  33 + //系统自动发送的网关指令 推送队列
  34 + if(DirectivePushQueue.isIdle()){
  35 + log.warn("DirectivePushQueue isIdle true !!!!");
  36 + DirectivePushQueue.start();
  37 + }
  38 + }
  39 +}
src/main/java/com/bsth/data/directive/DayOfDirectives.java
@@ -57,10 +57,11 @@ public class DayOfDirectives { @@ -57,10 +57,11 @@ public class DayOfDirectives {
57 pstDirectives = new LinkedList<>(); 57 pstDirectives = new LinkedList<>();
58 } 58 }
59 59
60 - public void put60(D60 d60) { 60 + public void put60(D60 d60, boolean pst) {
61 d60Map.put(d60.getMsgId(), d60); 61 d60Map.put(d60.getMsgId(), d60);
62 //等待持久化 62 //等待持久化
63 - pstDirectives.add(d60); 63 + if(pst)
  64 + pstDirectives.add(d60);
64 } 65 }
65 66
66 public void put64(D64 d64) { 67 public void put64(D64 d64) {
src/main/java/com/bsth/data/directive/GatewayHttpUtils.java
@@ -41,8 +41,8 @@ public class GatewayHttpUtils { @@ -41,8 +41,8 @@ public class GatewayHttpUtils {
41 41
42 //超时时间 42 //超时时间
43 RequestConfig requestConfig = RequestConfig.custom() 43 RequestConfig requestConfig = RequestConfig.custom()
44 - .setConnectTimeout(3000).setConnectionRequestTimeout(1000)  
45 - .setSocketTimeout(3000).build(); 44 + .setConnectTimeout(1500).setConnectionRequestTimeout(1000)
  45 + .setSocketTimeout(1500).build();
46 46
47 HttpPost post = new HttpPost(url); 47 HttpPost post = new HttpPost(url);
48 48
src/main/java/com/bsth/data/gpsdata/GpsRealData.java
@@ -4,7 +4,6 @@ import com.bsth.data.BasicData; @@ -4,7 +4,6 @@ import com.bsth.data.BasicData;
4 import com.bsth.data.forecast.ForecastRealServer; 4 import com.bsth.data.forecast.ForecastRealServer;
5 import com.bsth.data.gpsdata.thread.GpsDataLoaderThread; 5 import com.bsth.data.gpsdata.thread.GpsDataLoaderThread;
6 import com.bsth.data.gpsdata.thread.OfflineMonitorThread; 6 import com.bsth.data.gpsdata.thread.OfflineMonitorThread;
7 -import com.bsth.data.gpsdata.thread.ThreadPollMonitor;  
8 import com.bsth.data.schedule.DayOfSchedule; 7 import com.bsth.data.schedule.DayOfSchedule;
9 import com.bsth.entity.realcontrol.ScheduleRealInfo; 8 import com.bsth.entity.realcontrol.ScheduleRealInfo;
10 import com.google.common.collect.TreeMultimap; 9 import com.google.common.collect.TreeMultimap;
@@ -47,9 +46,6 @@ public class GpsRealData implements CommandLineRunner { @@ -47,9 +46,6 @@ public class GpsRealData implements CommandLineRunner {
47 @Autowired 46 @Autowired
48 ForecastRealServer forecastRealServer; 47 ForecastRealServer forecastRealServer;
49 48
50 - @Autowired  
51 - ThreadPollMonitor threadPollMonitor;  
52 -  
53 /** 49 /**
54 * 构造函数 50 * 构造函数
55 */ 51 */
@@ -60,15 +56,11 @@ public class GpsRealData implements CommandLineRunner { @@ -60,15 +56,11 @@ public class GpsRealData implements CommandLineRunner {
60 56
61 @Override 57 @Override
62 public void run(String... arg0) throws Exception { 58 public void run(String... arg0) throws Exception {
63 - logger.info("gpsDataLoader,20,3"); 59 + logger.info("gpsDataLoader,30,2");
64 //http形式获取GPS数据 60 //http形式获取GPS数据
65 - //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 2, TimeUnit.SECONDS); 61 + //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 30, 2, TimeUnit.SECONDS);
66 //定时扫描掉离线 62 //定时扫描掉离线
67 //Application.mainServices.scheduleWithFixedDelay(offlineMonitorThread, 120, 60, TimeUnit.SECONDS); 63 //Application.mainServices.scheduleWithFixedDelay(offlineMonitorThread, 120, 60, TimeUnit.SECONDS);
68 -  
69 - //扫描GPS线程池状态  
70 - //Application.mainServices.scheduleWithFixedDelay(threadPollMonitor, 60, 20, TimeUnit.SECONDS);  
71 -  
72 } 64 }
73 65
74 66
@@ -89,19 +81,29 @@ public class GpsRealData implements CommandLineRunner { @@ -89,19 +81,29 @@ public class GpsRealData implements CommandLineRunner {
89 gps.setExpectStopTime(forecastRealServer.expectStopTime(gps.getNbbm())); 81 gps.setExpectStopTime(forecastRealServer.expectStopTime(gps.getNbbm()));
90 } 82 }
91 } 83 }
92 - } catch (Exception e) {  
93 - logger.error("", e);  
94 - }  
95 84
96 - //刷新对照  
97 - gpsMap.put(device, gps);  
98 - if (StringUtils.isNotBlank(gps.getLineId())) {  
99 - //站点名称  
100 - gps.setStationName(getStationName(gps));  
101 - lineCode2Devices.put(gps.getLineId(), device); 85 + //刷新对照
  86 + gpsMap.put(device, gps);
  87 + if (StringUtils.isNotBlank(gps.getLineId())) {
  88 + //站点名称
  89 + gps.setStationName(getStationName(gps));
  90 + lineCode2Devices.put(gps.getLineId(), device);
  91 +
  92 + if(old != null && !gps.getLineId().equals(old.getLineId()))
  93 + lineCode2Devices.remove(old.getLineId(), device);
  94 + }
102 95
103 - if(old != null && !gps.getLineId().equals(old.getLineId()))  
104 - lineCode2Devices.remove(old.getLineId(), device); 96 + //车辆换设备了
  97 + String nbbm = gps.getNbbm();
  98 + if(old != null && StringUtils.isNotEmpty(nbbm) && !nbbm.equals(old.getNbbm())){
  99 + List<GpsEntity> list = findByNbbm(nbbm);
  100 + for(GpsEntity g : list){
  101 + if(!g.getDeviceId().equals(device))
  102 + gpsMap.remove(g.getDeviceId());
  103 + }
  104 + }
  105 + } catch (Exception e) {
  106 + logger.error("", e);
105 } 107 }
106 } 108 }
107 109
@@ -116,6 +118,16 @@ public class GpsRealData implements CommandLineRunner { @@ -116,6 +118,16 @@ public class GpsRealData implements CommandLineRunner {
116 return gpsMap.get(deviceId); 118 return gpsMap.get(deviceId);
117 } 119 }
118 120
  121 + public List<GpsEntity> findByNbbm(String nbbm){
  122 + Collection<GpsEntity> arr = gpsMap.values();
  123 + List<GpsEntity> rs = new ArrayList<>();
  124 + for(GpsEntity g : arr){
  125 + if(nbbm.equals(g.getNbbm()))
  126 + rs.add(g);
  127 + }
  128 + return rs;
  129 + }
  130 +
119 /** 131 /**
120 * @Title: get @Description: TODO(线路编码获取GPS集合) @throws 132 * @Title: get @Description: TODO(线路编码获取GPS集合) @throws
121 */ 133 */
src/main/java/com/bsth/data/gpsdata/arrival/GpsRealAnalyse.java
@@ -11,10 +11,7 @@ import org.slf4j.LoggerFactory; @@ -11,10 +11,7 @@ import org.slf4j.LoggerFactory;
11 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.stereotype.Component; 12 import org.springframework.stereotype.Component;
13 13
14 -import java.util.Collections;  
15 -import java.util.Comparator;  
16 -import java.util.List;  
17 -import java.util.Set; 14 +import java.util.*;
18 import java.util.concurrent.CountDownLatch; 15 import java.util.concurrent.CountDownLatch;
19 import java.util.concurrent.ExecutorService; 16 import java.util.concurrent.ExecutorService;
20 import java.util.concurrent.Executors; 17 import java.util.concurrent.Executors;
@@ -44,15 +41,18 @@ public class GpsRealAnalyse { @@ -44,15 +41,18 @@ public class GpsRealAnalyse {
44 @Autowired 41 @Autowired
45 GpsRealData gpsRealData; 42 GpsRealData gpsRealData;
46 43
47 - static ExecutorService threadPool = Executors.newFixedThreadPool(100); 44 + static ExecutorService threadPool = Executors.newFixedThreadPool(20);
48 45
49 public static long st; 46 public static long st;
50 public static CountDownLatch count; 47 public static CountDownLatch count;
51 48
  49 + public static boolean isBlock() {
  50 + return System.currentTimeMillis() - st > 1000 * 20;
  51 + }
  52 +
52 public void analyse(List<GpsEntity> list) { 53 public void analyse(List<GpsEntity> list) {
53 try { 54 try {
54 st = System.currentTimeMillis(); 55 st = System.currentTimeMillis();
55 - //如果正在恢复数据  
56 if (GpsDataRecovery.run) 56 if (GpsDataRecovery.run)
57 return; 57 return;
58 58
@@ -63,6 +63,7 @@ public class GpsRealAnalyse { @@ -63,6 +63,7 @@ public class GpsRealAnalyse {
63 } 63 }
64 64
65 Set<String> ks = multimap.keySet(); 65 Set<String> ks = multimap.keySet();
  66 +
66 logger.info("analyse gps size: " + list.size() + ", ks: " + ks.size()); 67 logger.info("analyse gps size: " + list.size() + ", ks: " + ks.size());
67 count = new CountDownLatch(ks.size()); 68 count = new CountDownLatch(ks.size());
68 69
@@ -125,7 +126,7 @@ public class GpsRealAnalyse { @@ -125,7 +126,7 @@ public class GpsRealAnalyse {
125 abnormalStateHandle.handle(gps, prevs); 126 abnormalStateHandle.handle(gps, prevs);
126 127
127 if (!task) 128 if (!task)
128 - return; //无任务的,到这里就结束 129 + continue; //无任务的,到这里就结束
129 130
130 //反向处理 131 //反向处理
131 reverseSignalHandle.handle(gps, prevs); 132 reverseSignalHandle.handle(gps, prevs);
src/main/java/com/bsth/data/gpsdata/arrival/handlers/InOutStationSignalHandle.java
@@ -6,12 +6,12 @@ import com.bsth.data.gpsdata.arrival.SignalHandle; @@ -6,12 +6,12 @@ import com.bsth.data.gpsdata.arrival.SignalHandle;
6 import com.bsth.data.gpsdata.arrival.utils.CircleQueue; 6 import com.bsth.data.gpsdata.arrival.utils.CircleQueue;
7 import com.bsth.data.gpsdata.arrival.utils.ScheduleSignalState; 7 import com.bsth.data.gpsdata.arrival.utils.ScheduleSignalState;
8 import com.bsth.data.gpsdata.arrival.utils.SignalSchPlanMatcher; 8 import com.bsth.data.gpsdata.arrival.utils.SignalSchPlanMatcher;
  9 +import com.bsth.data.msg_queue.DirectivePushQueue;
9 import com.bsth.data.schedule.DayOfSchedule; 10 import com.bsth.data.schedule.DayOfSchedule;
10 import com.bsth.data.schedule.ScheduleComparator; 11 import com.bsth.data.schedule.ScheduleComparator;
11 import com.bsth.data.schedule.late_adjust.LateAdjustHandle; 12 import com.bsth.data.schedule.late_adjust.LateAdjustHandle;
12 import com.bsth.entity.realcontrol.LineConfig; 13 import com.bsth.entity.realcontrol.LineConfig;
13 import com.bsth.entity.realcontrol.ScheduleRealInfo; 14 import com.bsth.entity.realcontrol.ScheduleRealInfo;
14 -import com.bsth.service.directive.DirectiveService;  
15 import com.bsth.websocket.handler.SendUtils; 15 import com.bsth.websocket.handler.SendUtils;
16 import org.apache.commons.lang3.StringUtils; 16 import org.apache.commons.lang3.StringUtils;
17 import org.slf4j.Logger; 17 import org.slf4j.Logger;
@@ -41,9 +41,6 @@ public class InOutStationSignalHandle extends SignalHandle{ @@ -41,9 +41,6 @@ public class InOutStationSignalHandle extends SignalHandle{
41 SendUtils sendUtils; 41 SendUtils sendUtils;
42 42
43 @Autowired 43 @Autowired
44 - DirectiveService directiveService;  
45 -  
46 - @Autowired  
47 ScheduleSignalState scheduleSignalState; 44 ScheduleSignalState scheduleSignalState;
48 45
49 @Autowired 46 @Autowired
@@ -151,7 +148,8 @@ public class InOutStationSignalHandle extends SignalHandle{ @@ -151,7 +148,8 @@ public class InOutStationSignalHandle extends SignalHandle{
151 148
152 if(sch.getBcType().equals("out")){ 149 if(sch.getBcType().equals("out")){
153 //出场时,切换成营运状态 150 //出场时,切换成营运状态
154 - directiveService.send60Operation(sch.getClZbh(), 0, Integer.parseInt(sch.getXlDir()), null, "出场@系统"); 151 + DirectivePushQueue.put6003(sch.getClZbh(), 0, Integer.parseInt(sch.getXlDir()), null, "出场@系统");
  152 + //directiveService.send60Operation(sch.getClZbh(), 0, Integer.parseInt(sch.getXlDir()), null, "出场@系统");
155 } 153 }
156 //出站既出场 154 //出站既出场
157 outStationAndOutPark(sch); 155 outStationAndOutPark(sch);
@@ -208,7 +206,8 @@ public class InOutStationSignalHandle extends SignalHandle{ @@ -208,7 +206,8 @@ public class InOutStationSignalHandle extends SignalHandle{
208 206
209 if(schPrev.getBcType().equals("out")){ 207 if(schPrev.getBcType().equals("out")){
210 //出场时,切换成营运状态 208 //出场时,切换成营运状态
211 - directiveService.send60Operation(schPrev.getClZbh(), 0, Integer.parseInt(schPrev.getXlDir()), null, "出场@系统"); 209 + DirectivePushQueue.put6003(schPrev.getClZbh(), 0, Integer.parseInt(schPrev.getXlDir()), null, "出场@系统");
  210 + //directiveService.send60Operation(schPrev.getClZbh(), 0, Integer.parseInt(schPrev.getXlDir()), null, "出场@系统");
212 } 211 }
213 } 212 }
214 } 213 }
@@ -276,15 +275,19 @@ public class InOutStationSignalHandle extends SignalHandle{ @@ -276,15 +275,19 @@ public class InOutStationSignalHandle extends SignalHandle{
276 //将gps转换为下一个班次走向的站内信号 275 //将gps转换为下一个班次走向的站内信号
277 transformUpdown(gps, next); 276 transformUpdown(gps, next);
278 //下发调度指令 277 //下发调度指令
279 - directiveService.send60Dispatch(next, doneSum, "到站@系统"); 278 + DirectivePushQueue.put6002(next, doneSum, "到站@系统");
  279 + //directiveService.send60Dispatch(next, doneSum, "到站@系统");
280 280
281 //套跑 -下发线路切换指令 281 //套跑 -下发线路切换指令
282 - if(!next.getXlBm().equals(sch.getXlBm()))  
283 - directiveService.lineChange(next.getClZbh(), next.getXlBm(), "套跑@系统"); 282 + if(!next.getXlBm().equals(sch.getXlBm())){
  283 + DirectivePushQueue.put64(next.getClZbh(), next.getXlBm(), "套跑@系统");
  284 + //directiveService.lineChange(next.getClZbh(), next.getXlBm(), "套跑@系统");
  285 + }
284 } 286 }
285 else if(sch.getBcType().equals("in")){ 287 else if(sch.getBcType().equals("in")){
286 //终班进场,切换成非营运状态 288 //终班进场,切换成非营运状态
287 - directiveService.send60Operation(sch.getClZbh(), 1, Integer.parseInt(sch.getXlDir()), null, "进场@系统"); 289 + DirectivePushQueue.put6003(sch.getClZbh(), 1, Integer.parseInt(sch.getXlDir()), null, "进场@系统");
  290 + //directiveService.send60Operation(sch.getClZbh(), 1, Integer.parseInt(sch.getXlDir()), null, "进场@系统");
288 } 291 }
289 } 292 }
290 else { 293 else {
src/main/java/com/bsth/data/gpsdata/recovery/GpsDataRecovery.java
@@ -164,7 +164,7 @@ public class GpsDataRecovery implements ApplicationContextAware { @@ -164,7 +164,7 @@ public class GpsDataRecovery implements ApplicationContextAware {
164 //abnormalStateHandle.handle(gps, prevs); 164 //abnormalStateHandle.handle(gps, prevs);
165 165
166 if(!task) 166 if(!task)
167 - return; //无任务的,到这里就结束 167 + continue; //无任务的,到这里就结束
168 168
169 //反向处理 169 //反向处理
170 reverseSignalHandle.handle(gps, prevs); 170 reverseSignalHandle.handle(gps, prevs);
src/main/java/com/bsth/data/gpsdata/thread/ThreadPollMonitor.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.thread;  
2 -  
3 -import com.bsth.data.gpsdata.arrival.GpsRealAnalyse;  
4 -import org.springframework.stereotype.Component;  
5 -  
6 -/**  
7 - * 线程池监听  
8 - * Created by panzhao on 2017/5/10.  
9 - */  
10 -@Component  
11 -public class ThreadPollMonitor extends Thread{  
12 -  
13 - @Override  
14 - public void run() {  
15 - long t = System.currentTimeMillis();  
16 -  
17 - if(t - GpsRealAnalyse.st > 3000 * 10){  
18 - GpsRealAnalyse.shutdown();  
19 - }  
20 - }  
21 -}  
src/main/java/com/bsth/data/msg_queue/DirectivePushQueue.java 0 → 100644
  1 +package com.bsth.data.msg_queue;
  2 +
  3 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  4 +import com.bsth.service.directive.DirectiveService;
  5 +import org.slf4j.Logger;
  6 +import org.slf4j.LoggerFactory;
  7 +import org.springframework.beans.BeansException;
  8 +import org.springframework.boot.CommandLineRunner;
  9 +import org.springframework.context.ApplicationContext;
  10 +import org.springframework.context.ApplicationContextAware;
  11 +import org.springframework.stereotype.Component;
  12 +
  13 +import java.util.LinkedList;
  14 +
  15 +/**
  16 + * 到网关的指令推送队列 (系统发送的队列, 用户手动发送的不走这里)
  17 + * Created by panzhao on 2017/5/11.
  18 + */
  19 +@Component
  20 +public class DirectivePushQueue implements CommandLineRunner, ApplicationContextAware {
  21 +
  22 + static LinkedList<QueueData_Directive> linkedList;
  23 + static DataPushThread thread;
  24 + static DirectiveService directiveService;
  25 + static long t;
  26 + static final int IDLE_TIME = 1000 * 30;
  27 +
  28 + static {
  29 + linkedList = new LinkedList<>();
  30 + }
  31 +
  32 + public static void put6002(ScheduleRealInfo sch, int finish, String sender){
  33 + QueueData_Directive qd6002 = new QueueData_Directive();
  34 + qd6002.setSch(sch);
  35 + qd6002.setFinish(finish);
  36 + qd6002.setSender(sender);
  37 + qd6002.setCode("60_02");
  38 +
  39 + linkedList.add(qd6002);
  40 + }
  41 +
  42 + public static void put6003(String nbbm, int state, int upDown, ScheduleRealInfo sch, String sender){
  43 + QueueData_Directive qd6003 = new QueueData_Directive();
  44 + qd6003.setNbbm(nbbm);
  45 + qd6003.setState(state);
  46 + qd6003.setUpDown(upDown);
  47 + qd6003.setSch(sch);
  48 + qd6003.setSender(sender);
  49 +
  50 + qd6003.setCode("60_03");
  51 +
  52 + linkedList.add(qd6003);
  53 + }
  54 +
  55 + public static void put64(String nbbm, String lineCode, String sender){
  56 + QueueData_Directive qd64 = new QueueData_Directive();
  57 + qd64.setNbbm(nbbm);
  58 + qd64.setLineCode(lineCode);
  59 + qd64.setSender(sender);
  60 +
  61 + qd64.setCode("64");
  62 +
  63 + linkedList.add(qd64);
  64 + }
  65 +
  66 + public static boolean isIdle(){
  67 + return System.currentTimeMillis() - t > IDLE_TIME;
  68 + }
  69 +
  70 + public static void start(){
  71 + if(thread != null){
  72 + thread.interrupt();
  73 + }
  74 + thread = new DataPushThread();
  75 + thread.start();
  76 + }
  77 +
  78 + @Override
  79 + public void run(String... strings) throws Exception {
  80 + start();
  81 + }
  82 +
  83 + @Override
  84 + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  85 + directiveService = applicationContext.getBean(DirectiveService.class);
  86 + }
  87 +
  88 + public static class DataPushThread extends Thread {
  89 +
  90 + Logger log = LoggerFactory.getLogger(this.getClass());
  91 +
  92 + @Override
  93 + public void run() {
  94 + boolean sleepFlag = false;
  95 + QueueData_Directive qd;
  96 + String code;
  97 + while (true) {
  98 + try {
  99 + qd = linkedList.pollFirst();
  100 + if (qd != null) {
  101 + sleepFlag = false;
  102 + code = qd.getCode();
  103 +
  104 + if(code.equals("60_02")){
  105 + directiveService.send60Dispatch(qd.getSch(), qd.getFinish(), qd.getSender());
  106 + log.info("directive 60_02 sch id: " + qd.getSch().getId());
  107 + }
  108 + else if(code.equals("60_03")){
  109 + directiveService.send60Operation(qd.getNbbm(), qd.getState(), qd.getUpDown(), null, qd.getSender());
  110 + log.info("directive 60_03 nbbm: " + qd.getNbbm());
  111 + }
  112 + else if(code.equals("64")){
  113 + directiveService.lineChange(qd.getNbbm(), qd.getLineCode(), qd.getSender());
  114 + log.info("directive 64 nbbm: " + qd.getNbbm() + " lineCode: " + qd.getLineCode());
  115 + }
  116 +
  117 + } else{
  118 + Thread.sleep(500);
  119 + if(!sleepFlag){
  120 + log.info("sleep...");
  121 + sleepFlag = true;
  122 + }
  123 + }
  124 + t = System.currentTimeMillis();
  125 + }
  126 + catch(InterruptedException e){
  127 + break;
  128 + }
  129 + catch (Exception e) {
  130 + log.error("", e);
  131 + }
  132 +
  133 + }
  134 + }
  135 + }
  136 +}
src/main/java/com/bsth/data/msg_queue/QueueData.java 0 → 100644
  1 +package com.bsth.data.msg_queue;
  2 +
  3 +import org.springframework.web.socket.TextMessage;
  4 +import org.springframework.web.socket.WebSocketSession;
  5 +
  6 +/**
  7 + * Created by panzhao on 2017/5/11.
  8 + */
  9 +public class QueueData {
  10 +
  11 + private TextMessage message;
  12 +
  13 + private WebSocketSession session;
  14 +
  15 +
  16 + public WebSocketSession getSession() {
  17 + return session;
  18 + }
  19 +
  20 + public void setSession(WebSocketSession session) {
  21 + this.session = session;
  22 + }
  23 +
  24 + public TextMessage getMessage() {
  25 + return message;
  26 + }
  27 +
  28 + public void setMessage(TextMessage message) {
  29 + this.message = message;
  30 + }
  31 +}
src/main/java/com/bsth/data/msg_queue/QueueData_Directive.java 0 → 100644
  1 +package com.bsth.data.msg_queue;
  2 +
  3 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  4 +
  5 +/**
  6 + * Created by panzhao on 2017/5/11.
  7 + */
  8 +public class QueueData_Directive {
  9 +
  10 + /**
  11 + * 指令类型
  12 + * 60_02
  13 + * 60_03
  14 + * 64
  15 + */
  16 + private String code;
  17 +
  18 + /** 60调度指令内容 60_02*/
  19 + private ScheduleRealInfo sch;
  20 + private int finish;
  21 +
  22 + /** 60 营运指令 60_03*/
  23 + private String nbbm;
  24 + private int state;
  25 + private int upDown;
  26 +
  27 + /** 64指令内容 */
  28 + private String lineCode;
  29 +
  30 + private String sender;
  31 +
  32 +
  33 + public ScheduleRealInfo getSch() {
  34 + return sch;
  35 + }
  36 +
  37 + public void setSch(ScheduleRealInfo sch) {
  38 + this.sch = sch;
  39 + }
  40 +
  41 + public int getFinish() {
  42 + return finish;
  43 + }
  44 +
  45 + public void setFinish(int finish) {
  46 + this.finish = finish;
  47 + }
  48 +
  49 + public String getSender() {
  50 + return sender;
  51 + }
  52 +
  53 + public void setSender(String sender) {
  54 + this.sender = sender;
  55 + }
  56 +
  57 + public String getNbbm() {
  58 + return nbbm;
  59 + }
  60 +
  61 + public void setNbbm(String nbbm) {
  62 + this.nbbm = nbbm;
  63 + }
  64 +
  65 + public int getState() {
  66 + return state;
  67 + }
  68 +
  69 + public void setState(int state) {
  70 + this.state = state;
  71 + }
  72 +
  73 + public int getUpDown() {
  74 + return upDown;
  75 + }
  76 +
  77 + public void setUpDown(int upDown) {
  78 + this.upDown = upDown;
  79 + }
  80 +
  81 + public String getCode() {
  82 + return code;
  83 + }
  84 +
  85 + public void setCode(String code) {
  86 + this.code = code;
  87 + }
  88 +
  89 + public String getLineCode() {
  90 + return lineCode;
  91 + }
  92 +
  93 + public void setLineCode(String lineCode) {
  94 + this.lineCode = lineCode;
  95 + }
  96 +}
src/main/java/com/bsth/data/msg_queue/WebSocketPushQueue.java 0 → 100644
  1 +package com.bsth.data.msg_queue;
  2 +
  3 +import com.bsth.common.Constants;
  4 +import org.slf4j.Logger;
  5 +import org.slf4j.LoggerFactory;
  6 +import org.springframework.boot.CommandLineRunner;
  7 +import org.springframework.stereotype.Component;
  8 +import org.springframework.web.socket.TextMessage;
  9 +import org.springframework.web.socket.WebSocketSession;
  10 +
  11 +import java.util.LinkedList;
  12 +
  13 +/**
  14 + * 线调web socket 推送队列
  15 + * Created by panzhao on 2017/5/11.
  16 + */
  17 +@Component
  18 +public class WebSocketPushQueue implements CommandLineRunner {
  19 +
  20 + static LinkedList<QueueData> linkedList;
  21 + static DataPushThread thread;
  22 + static Logger log = LoggerFactory.getLogger(WebSocketPushQueue.class);
  23 + static long t;
  24 + static final int IDLE_TIME = 1000 * 30;
  25 +
  26 + static {
  27 + linkedList = new LinkedList();
  28 + }
  29 +
  30 + public static boolean isIdle() {
  31 + return System.currentTimeMillis() - t > IDLE_TIME;
  32 + }
  33 +
  34 + public static void put(WebSocketSession session, TextMessage msg) {
  35 + QueueData qd = new QueueData();
  36 + qd.setMessage(msg);
  37 + qd.setSession(session);
  38 +
  39 + log.info("put、[" + session.getAttributes().get(Constants.SESSION_USERNAME) + "] 、" + msg.getPayload());
  40 + linkedList.add(qd);
  41 + }
  42 +
  43 + public static void start() {
  44 + if (thread != null) {
  45 + thread.interrupt();
  46 + }
  47 + thread = new DataPushThread();
  48 + thread.start();
  49 + }
  50 +
  51 + @Override
  52 + public void run(String... strings) throws Exception {
  53 + start();
  54 + }
  55 +
  56 + public static class DataPushThread extends Thread {
  57 +
  58 + Logger log = LoggerFactory.getLogger(this.getClass());
  59 +
  60 + @Override
  61 + public void run() {
  62 + QueueData qd;
  63 + WebSocketSession session;
  64 +
  65 + boolean sleepFlag = false;
  66 + while (true) {
  67 + try {
  68 + qd = linkedList.pollFirst();
  69 + if (qd != null) {
  70 + sleepFlag = false;
  71 + session = qd.getSession();
  72 + if (session.isOpen()) {
  73 + log.info("push start、[" + session.getAttributes().get(Constants.SESSION_USERNAME) + "] 、" + qd.getMessage().getPayload());
  74 + session.sendMessage(qd.getMessage());
  75 + log.info("push end..");
  76 + }
  77 + } else {
  78 + Thread.sleep(500);
  79 + if (!sleepFlag) {
  80 + log.info("sleep...");
  81 + sleepFlag = true;
  82 + }
  83 + }
  84 + t = System.currentTimeMillis();
  85 + } catch (InterruptedException e) {
  86 + break;
  87 + } catch (Exception e) {
  88 + log.error("", e);
  89 + }
  90 + }
  91 + }
  92 + }
  93 +}
src/main/java/com/bsth/data/pilot80/PilotReport.java
@@ -4,6 +4,7 @@ import com.bsth.data.BasicData; @@ -4,6 +4,7 @@ import com.bsth.data.BasicData;
4 import com.bsth.data.LineConfigData; 4 import com.bsth.data.LineConfigData;
5 import com.bsth.data.gpsdata.GpsEntity; 5 import com.bsth.data.gpsdata.GpsEntity;
6 import com.bsth.data.gpsdata.GpsRealData; 6 import com.bsth.data.gpsdata.GpsRealData;
  7 +import com.bsth.data.msg_queue.DirectivePushQueue;
7 import com.bsth.data.schedule.DayOfSchedule; 8 import com.bsth.data.schedule.DayOfSchedule;
8 import com.bsth.entity.Line; 9 import com.bsth.entity.Line;
9 import com.bsth.entity.directive.D80; 10 import com.bsth.entity.directive.D80;
@@ -82,9 +83,11 @@ public class PilotReport { @@ -82,9 +83,11 @@ public class PilotReport {
82 outSch = dayOfSchedule.next(outSch); 83 outSch = dayOfSchedule.next(outSch);
83 84
84 //下发调度指令 85 //下发调度指令
85 - directiveService.send60Dispatch(outSch, dayOfSchedule.doneSum(nbbm), "请出@系统"); 86 + DirectivePushQueue.put6002(outSch, dayOfSchedule.doneSum(nbbm), "请出@系统");
  87 + //directiveService.send60Dispatch(outSch, dayOfSchedule.doneSum(nbbm), "请出@系统");
86 //下发线路切换指令 88 //下发线路切换指令
87 - directiveService.lineChange(outSch.getClZbh(), outSch.getXlBm(), "请出@系统"); 89 + DirectivePushQueue.put64(outSch.getClZbh(), outSch.getXlBm(), "请出@系统");
  90 + //directiveService.lineChange(outSch.getClZbh(), outSch.getXlBm(), "请出@系统");
88 }else 91 }else
89 d80.setRemarks("没有出场计划"); 92 d80.setRemarks("没有出场计划");
90 93
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
@@ -7,6 +7,7 @@ import com.bsth.common.Constants; @@ -7,6 +7,7 @@ import com.bsth.common.Constants;
7 import com.bsth.common.ResponseCode; 7 import com.bsth.common.ResponseCode;
8 import com.bsth.data.BasicData; 8 import com.bsth.data.BasicData;
9 import com.bsth.data.LineConfigData; 9 import com.bsth.data.LineConfigData;
  10 +import com.bsth.data.ThreadMonotor;
10 import com.bsth.data.directive.DirectivesPstThread; 11 import com.bsth.data.directive.DirectivesPstThread;
11 import com.bsth.data.gpsdata.GpsRealData; 12 import com.bsth.data.gpsdata.GpsRealData;
12 import com.bsth.data.gpsdata.recovery.GpsDataRecovery; 13 import com.bsth.data.gpsdata.recovery.GpsDataRecovery;
@@ -139,6 +140,9 @@ public class DayOfSchedule implements CommandLineRunner { @@ -139,6 +140,9 @@ public class DayOfSchedule implements CommandLineRunner {
139 @Autowired 140 @Autowired
140 CalcOilThread calcOilThread; 141 CalcOilThread calcOilThread;
141 142
  143 + @Autowired
  144 + ThreadMonotor threadMonotor;
  145 +
142 private static DateTimeFormatter fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd"), fmtHHmm = DateTimeFormat.forPattern("HH:mm"); 146 private static DateTimeFormatter fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd"), fmtHHmm = DateTimeFormat.forPattern("HH:mm");
143 147
144 @Override 148 @Override
@@ -165,6 +169,9 @@ public class DayOfSchedule implements CommandLineRunner { @@ -165,6 +169,9 @@ public class DayOfSchedule implements CommandLineRunner {
165 169
166 //指令持久化线程 170 //指令持久化线程
167 Application.mainServices.scheduleWithFixedDelay(directivesPstThread, 180, 180, TimeUnit.SECONDS); 171 Application.mainServices.scheduleWithFixedDelay(directivesPstThread, 180, 180, TimeUnit.SECONDS);
  172 +
  173 + //监听
  174 + Application.mainServices.scheduleWithFixedDelay(threadMonotor, 120, 60, TimeUnit.SECONDS);
168 } 175 }
169 176
170 //数据恢复 177 //数据恢复
src/main/java/com/bsth/service/directive/DirectiveServiceImpl.java
@@ -85,12 +85,15 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen @@ -85,12 +85,15 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen
85 if(null != sender) 85 if(null != sender)
86 d60.setSender(sender); 86 d60.setSender(sender);
87 d60.setHttpCode(code); 87 d60.setHttpCode(code);
88 - // 添加到缓存  
89 - dayOfDirectives.put60(d60);  
90 88
91 - if (code != 0) { 89 + if (code == 0) {
  90 + // 添加到缓存
  91 + dayOfDirectives.put60(d60, true);
  92 + }
  93 + else{
92 d60.setErrorText("网关通讯失败, code: " + code); 94 d60.setErrorText("网关通讯失败, code: " + code);
93 d60Repository.save(d60); 95 d60Repository.save(d60);
  96 + dayOfDirectives.put60(d60, false);
94 } 97 }
95 return code; 98 return code;
96 } 99 }
@@ -139,12 +142,13 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen @@ -139,12 +142,13 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen
139 if (code == 0) { 142 if (code == 0) {
140 sch.setDirectiveState(60); 143 sch.setDirectiveState(60);
141 // 添加到缓存,延迟入库 144 // 添加到缓存,延迟入库
142 - dayOfDirectives.put60(d60); 145 + dayOfDirectives.put60(d60, true);
143 // 通知页面 146 // 通知页面
144 sendD60ToPage(sch); 147 sendD60ToPage(sch);
145 } 148 }
146 else{ 149 else{
147 d60.setErrorText("网关通讯失败, code: " + code); 150 d60.setErrorText("网关通讯失败, code: " + code);
  151 + dayOfDirectives.put60(d60, false);
148 d60Repository.save(d60); 152 d60Repository.save(d60);
149 } 153 }
150 return code; 154 return code;
@@ -196,11 +200,15 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen @@ -196,11 +200,15 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen
196 d60.setHttpCode(code); 200 d60.setHttpCode(code);
197 if (null != sch) 201 if (null != sch)
198 d60.setSch(sch); 202 d60.setSch(sch);
199 - dayOfDirectives.put60(d60);  
200 203
201 - if (code != 0) { 204 +
  205 + if (code == 0) {
  206 + dayOfDirectives.put60(d60, true);
  207 + }
  208 + else{
202 d60.setErrorText("网关通讯失败, code: " + code); 209 d60.setErrorText("网关通讯失败, code: " + code);
203 d60Repository.save(d60); 210 d60Repository.save(d60);
  211 + dayOfDirectives.put60(d60, false);
204 } 212 }
205 return code; 213 return code;
206 } 214 }
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
@@ -10,6 +10,7 @@ import com.bsth.controller.realcontrol.dto.DfsjChange; @@ -10,6 +10,7 @@ import com.bsth.controller.realcontrol.dto.DfsjChange;
10 import com.bsth.controller.realcontrol.dto.LpData; 10 import com.bsth.controller.realcontrol.dto.LpData;
11 import com.bsth.data.BasicData; 11 import com.bsth.data.BasicData;
12 import com.bsth.data.LineConfigData; 12 import com.bsth.data.LineConfigData;
  13 +import com.bsth.data.msg_queue.DirectivePushQueue;
13 import com.bsth.data.schedule.DayOfSchedule; 14 import com.bsth.data.schedule.DayOfSchedule;
14 import com.bsth.data.schedule.SchAttrCalculator; 15 import com.bsth.data.schedule.SchAttrCalculator;
15 import com.bsth.data.schedule.SchModifyLog; 16 import com.bsth.data.schedule.SchModifyLog;
@@ -1280,11 +1281,12 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -1280,11 +1281,12 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1280 ts.add(next); 1281 ts.add(next);
1281 } 1282 }
1282 1283
1283 - //车辆下一个要执行的班次  
1284 try{ 1284 try{
  1285 + //车辆下一个要执行的班次
1285 ScheduleRealInfo carNext = dayOfSchedule.next(sch); 1286 ScheduleRealInfo carNext = dayOfSchedule.next(sch);
1286 if(carNext != null && !carNext.getXlBm().equals(sch.getXlBm())){ 1287 if(carNext != null && !carNext.getXlBm().equals(sch.getXlBm())){
1287 - directiveService.lineChange(carNext.getClZbh(), carNext.getXlBm(), "套跑@系统"); 1288 + DirectivePushQueue.put64(carNext.getClZbh(), carNext.getXlBm(), "套跑@系统");
  1289 + //directiveService.lineChange(carNext.getClZbh(), carNext.getXlBm(), "套跑@系统");
1288 } 1290 }
1289 }catch (Exception e){logger.error("", e);} 1291 }catch (Exception e){logger.error("", e);}
1290 1292
src/main/java/com/bsth/websocket/handler/RealControlSocketHandler.java
1 package com.bsth.websocket.handler; 1 package com.bsth.websocket.handler;
2 2
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
4 -import com.bsth.common.Constants;  
5 import com.bsth.data.BasicData; 4 import com.bsth.data.BasicData;
  5 +import com.bsth.data.msg_queue.WebSocketPushQueue;
6 import com.google.common.base.Splitter; 6 import com.google.common.base.Splitter;
7 import org.slf4j.Logger; 7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory; 8 import org.slf4j.LoggerFactory;
@@ -103,7 +103,8 @@ public class RealControlSocketHandler implements WebSocketHandler { @@ -103,7 +103,8 @@ public class RealControlSocketHandler implements WebSocketHandler {
103 return; 103 return;
104 104
105 for(WebSocketSession user : list){ 105 for(WebSocketSession user : list){
106 - try { 106 + WebSocketPushQueue.put(user, message);
  107 + /*try {
107 if (user.isOpen()) { 108 if (user.isOpen()) {
108 user.sendMessage(message); 109 user.sendMessage(message);
109 } 110 }
@@ -114,7 +115,7 @@ public class RealControlSocketHandler implements WebSocketHandler { @@ -114,7 +115,7 @@ public class RealControlSocketHandler implements WebSocketHandler {
114 catch(Exception e2){} 115 catch(Exception e2){}
115 logger.error("sendMessageToLine error ...."+msg); 116 logger.error("sendMessageToLine error ...."+msg);
116 logger.error("sendMessageToLine error ....", e); 117 logger.error("sendMessageToLine error ....", e);
117 - } 118 + }*/
118 } 119 }
119 } 120 }
120 121
src/main/resources/logback.xml
@@ -182,6 +182,48 @@ @@ -182,6 +182,48 @@
182 <appender-ref ref="GPS_COUNT" /> 182 <appender-ref ref="GPS_COUNT" />
183 </logger> 183 </logger>
184 184
  185 + <!-- 消息队列纪录 -->
  186 + <appender name="QUEUE_WEB_SOCKET"
  187 + class="ch.qos.logback.core.rolling.RollingFileAppender">
  188 + <file>${LOG_BASE}/msg_queue/websocket.log</file>
  189 + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  190 + <fileNamePattern>${LOG_BASE}/msg_queue/websocket-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  191 + <timeBasedFileNamingAndTriggeringPolicy
  192 + class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  193 + <maxFileSize>100MB</maxFileSize>
  194 + </timeBasedFileNamingAndTriggeringPolicy>
  195 + </rollingPolicy>
  196 +
  197 + <layout class="ch.qos.logback.classic.PatternLayout">
  198 + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%file:%line] %-5level -%msg%n
  199 + </pattern>
  200 + </layout>
  201 + </appender>
  202 + <logger name="com.bsth.data.msg_queue.WebSocketPushQueue"
  203 + level="INFO" additivity="false">
  204 + <appender-ref ref="QUEUE_WEB_SOCKET" />
  205 + </logger>
  206 + <appender name="QUEUE_DIRECTIVE"
  207 + class="ch.qos.logback.core.rolling.RollingFileAppender">
  208 + <file>${LOG_BASE}/msg_queue/directive.log</file>
  209 + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  210 + <fileNamePattern>${LOG_BASE}/msg_queue/directive-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  211 + <timeBasedFileNamingAndTriggeringPolicy
  212 + class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  213 + <maxFileSize>100MB</maxFileSize>
  214 + </timeBasedFileNamingAndTriggeringPolicy>
  215 + </rollingPolicy>
  216 +
  217 + <layout class="ch.qos.logback.classic.PatternLayout">
  218 + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%file:%line] %-5level -%msg%n
  219 + </pattern>
  220 + </layout>
  221 + </appender>
  222 + <logger name="com.bsth.data.msg_queue.DirectivePushQueue"
  223 + level="INFO" additivity="false">
  224 + <appender-ref ref="QUEUE_DIRECTIVE" />
  225 + </logger>
  226 +
185 <!--<logger name="org.hibernate.SQL" level="TRACE">--> 227 <!--<logger name="org.hibernate.SQL" level="TRACE">-->
186 <!--<appender-ref ref="STDOUT" />--> 228 <!--<appender-ref ref="STDOUT" />-->
187 <!--</logger>--> 229 <!--</logger>-->
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/fcxxwt.html
@@ -116,10 +116,10 @@ @@ -116,10 +116,10 @@
116 <label class="uk-form-label" >调整说明</label> 116 <label class="uk-form-label" >调整说明</label>
117 <div class="uk-form-controls"> 117 <div class="uk-form-controls">
118 <select name="adjustExps"> 118 <select name="adjustExps">
119 - <option value="">请选择..</option>  
120 - {{each adjustExps as exp i}} 119 + <option value="">请选择..</option>
  120 + {{each adjustExps as exp i}}
121 <option value="{{exp}}">{{exp}}</option> 121 <option value="{{exp}}">{{exp}}</option>
122 - {{/each}} 122 + {{/each}}
123 </select> 123 </select>
124 </div> 124 </div>
125 </div> 125 </div>
@@ -129,7 +129,7 @@ @@ -129,7 +129,7 @@
129 <div class="uk-width-1-1"> 129 <div class="uk-width-1-1">
130 <div class="uk-form-row ct-stacked"> 130 <div class="uk-form-row ct-stacked">
131 <div class="uk-form-controls" style="margin-top: 5px;"> 131 <div class="uk-form-controls" style="margin-top: 5px;">
132 - <textarea id="form-s-t" cols="30" rows="5" name="remarks" data-fv-stringlength="true" data-fv-stringlength-max="50" placeholder="备注,不超过50个字符">{{sch.remarks}}</textarea> 132 + <textarea id="form-s-t" cols="30" rows="5" required name="remarks" data-fv-stringlength="true" data-fv-stringlength-max="50" placeholder="备注,不超过50个字符">{{sch.remarks}}</textarea>
133 </div> 133 </div>
134 </div> 134 </div>
135 </div> 135 </div>
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/sftz.html
@@ -54,7 +54,7 @@ @@ -54,7 +54,7 @@
54 <div class="uk-form-row ct-stacked"> 54 <div class="uk-form-row ct-stacked">
55 <label class="uk-form-label" for="form-s-t">调整说明<small class="font-danger">(不超过20个字符)</small></label> 55 <label class="uk-form-label" for="form-s-t">调整说明<small class="font-danger">(不超过20个字符)</small></label>
56 <div class="uk-form-controls"> 56 <div class="uk-form-controls">
57 - <textarea id="form-s-t" cols="30" rows="5" name="remarks" data-fv-stringlength="true" data-fv-stringlength-max="20" placeholder="不超过20个字符。非必填"></textarea> 57 + <textarea id="form-s-t" cols="30" rows="5" name="remarks" required data-fv-stringlength="true" data-fv-stringlength-max="20" placeholder="不超过20个字符。必填"></textarea>
58 </div> 58 </div>
59 </div> 59 </div>
60 </div> 60 </div>
src/main/resources/static/real_control_v2/js/main.js
@@ -169,8 +169,8 @@ var disabled_submit_btn = function (form) { @@ -169,8 +169,8 @@ var disabled_submit_btn = function (form) {
169 function showUpdateDescription() { 169 function showUpdateDescription() {
170 //更新说明 170 //更新说明
171 var updateDescription = { 171 var updateDescription = {
172 - date: '2017-05-09',  
173 - text: '<h5>恢复到了最新功能版本,并修复了临加时没有保存售票员的问题。</h5>' 172 + date: '2017-05-12',
  173 + text: '<h5>现在班次调整时,备注是必填项</h5><h5>现在中途更换设备后,需要刷新缓存数据后,再刷新线调页面。</h5><h5>分班套跑车辆将在上午最后一个班次完成后发送线路切换指令。捕捉到出场信号时也会切换至出场班次所在线路,驾驶员请求出场时候也会同步一次状态</h5><h5>修复了一些其他问题。</h5>'
174 }; 174 };
175 175
176 var storage = window.localStorage 176 var storage = window.localStorage
src/main/resources/static/real_control_v2/mapmonitor/fragments/playback_v2/main.html
@@ -864,6 +864,8 @@ @@ -864,6 +864,8 @@
864 if(typeof(upDown) == "undefined") 864 if(typeof(upDown) == "undefined")
865 upDown = roadUpdown; 865 upDown = roadUpdown;
866 866
  867 + if(upDown!= 0 && upDown != 1)
  868 + return;
867 map.clearOverlays(); 869 map.clearOverlays();
868 parkPolygons = {};//清除停车场对照 870 parkPolygons = {};//清除停车场对照
869 //路段 871 //路段