Commit ce7e5e3ce58380f5b5367c104d96f16db052140e

Authored by 潘钊
1 parent 8c5746ae

闵行7月30号,懒得写

Showing 56 changed files with 1323 additions and 480 deletions
src/main/java/com/bsth/StartCommand.java
@@ -7,11 +7,13 @@ import com.bsth.service.realcontrol.buffer.GetSchedulePlanThread; @@ -7,11 +7,13 @@ import com.bsth.service.realcontrol.buffer.GetSchedulePlanThread;
7 import com.bsth.service.realcontrol.buffer.SchedulePersistenceThread; 7 import com.bsth.service.realcontrol.buffer.SchedulePersistenceThread;
8 import com.bsth.util.DateUtils; 8 import com.bsth.util.DateUtils;
9 import com.bsth.vehicle.common.CommonRefreshThread; 9 import com.bsth.vehicle.common.CommonRefreshThread;
  10 +import com.bsth.vehicle.directive.buffer.DirectiveBuffer;
10 import com.bsth.vehicle.directive.service.DirectiveService; 11 import com.bsth.vehicle.directive.service.DirectiveService;
11 import com.bsth.vehicle.directive.thread.DirectivePersistenceThread; 12 import com.bsth.vehicle.directive.thread.DirectivePersistenceThread;
12 import com.bsth.vehicle.directive.thread.FirstScheduleIssuedThread; 13 import com.bsth.vehicle.directive.thread.FirstScheduleIssuedThread;
13 -import com.bsth.vehicle.gpsdata.GpsArrivalThread;  
14 -import com.bsth.vehicle.gpsdata.GpsRefreshThread; 14 +import com.bsth.vehicle.gpsdata.ArrivalThread;
  15 +import com.bsth.vehicle.gpsdata.GpsOfflineMonitorThread;
  16 +import com.bsth.vehicle.gpsdata.GpsRealDataRefreshThread;
15 17
16 import org.slf4j.Logger; 18 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory; 19 import org.slf4j.LoggerFactory;
@@ -36,10 +38,10 @@ public class StartCommand implements CommandLineRunner{ @@ -36,10 +38,10 @@ public class StartCommand implements CommandLineRunner{
36 @Autowired 38 @Autowired
37 SecurityMetadataSourceService invocationSecurityMetadataSourceService; 39 SecurityMetadataSourceService invocationSecurityMetadataSourceService;
38 40
39 - public static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(7); 41 + public static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(8);
40 42
41 @Autowired 43 @Autowired
42 - GpsRefreshThread gpsRefreshThread; 44 + GpsRealDataRefreshThread gpsRefreshThread;
43 @Autowired 45 @Autowired
44 GetSchedulePlanThread getSchedulePlanThread; 46 GetSchedulePlanThread getSchedulePlanThread;
45 @Autowired 47 @Autowired
@@ -49,16 +51,23 @@ public class StartCommand implements CommandLineRunner{ @@ -49,16 +51,23 @@ public class StartCommand implements CommandLineRunner{
49 @Autowired 51 @Autowired
50 SchedulePersistenceThread SchedulePersistenceThread; 52 SchedulePersistenceThread SchedulePersistenceThread;
51 @Autowired 53 @Autowired
52 - GpsArrivalThread gpsArrivalStationThread; 54 + ArrivalThread gpsArrivalStationThread;
53 @Autowired 55 @Autowired
54 FirstScheduleIssuedThread firstScheduleIssuedThread; 56 FirstScheduleIssuedThread firstScheduleIssuedThread;
55 57
56 @Autowired 58 @Autowired
57 DirectiveService directiveService; 59 DirectiveService directiveService;
58 @Autowired 60 @Autowired
  61 + DirectiveBuffer directiveBuffer;
  62 + @Autowired
59 CarConfigInfoRepository carConfigInfoRepository; 63 CarConfigInfoRepository carConfigInfoRepository;
60 64
61 - static Long hourTime = 1000 * 60 * 60L; 65 + @Autowired
  66 + GpsOfflineMonitorThread gpsOfflineMonitorThread;
  67 +
  68 + final static Long HOUR_TIME = 1000 * 60 * 60L;
  69 +
  70 + final static int HOUR_SECOND = 60 * 60;
62 71
63 @Override 72 @Override
64 public void run(String... arg0){ 73 public void run(String... arg0){
@@ -68,32 +77,44 @@ public class StartCommand implements CommandLineRunner{ @@ -68,32 +77,44 @@ public class StartCommand implements CommandLineRunner{
68 invocationSecurityMetadataSourceService.loadResourceDefine(); 77 invocationSecurityMetadataSourceService.loadResourceDefine();
69 78
70 /** 79 /**
  80 + * 车辆,设备,公司等常用的映射数据,每两小时刷新一次
  81 + */
  82 + commonRefreshThread.start();
  83 + scheduler.scheduleWithFixedDelay(commonRefreshThread, HOUR_SECOND * 2 , HOUR_SECOND * 2, TimeUnit.SECONDS);
  84 + //等映射数据加载完......睡一会吧
  85 + Thread.sleep(3000);
  86 +
  87 + /**
71 * GPS实时数据更新 线程 88 * GPS实时数据更新 线程
72 * 每8秒和网关HTTP接口同步一次 89 * 每8秒和网关HTTP接口同步一次
73 */ 90 */
74 scheduler.scheduleWithFixedDelay(gpsRefreshThread, 0, 8, TimeUnit.SECONDS); 91 scheduler.scheduleWithFixedDelay(gpsRefreshThread, 0, 8, TimeUnit.SECONDS);
75 92
76 /** 93 /**
  94 + * GPS 监控设备掉线行为
  95 + * 每分钟检测一次
  96 + */
  97 + scheduler.scheduleWithFixedDelay(gpsOfflineMonitorThread, 60, 60, TimeUnit.SECONDS);
  98 +
  99 +
  100 + /**
77 * 每天 凌晨 2 点 抓取当天实际排班 101 * 每天 凌晨 2 点 抓取当天实际排班
78 */ 102 */
79 //启动时先run一次 103 //启动时先run一次
80 getSchedulePlanThread.start(); 104 getSchedulePlanThread.start();
81 scheduler.scheduleAtFixedRate(getSchedulePlanThread 105 scheduler.scheduleAtFixedRate(getSchedulePlanThread
82 - , ((DateUtils.getTimesnight2() + hourTime * 2) - System.currentTimeMillis()) / 1000 106 + , ((DateUtils.getTimesnight2() + HOUR_TIME * 2) - System.currentTimeMillis()) / 1000
83 , 60 * 60 * 24, TimeUnit.SECONDS); 107 , 60 * 60 * 24, TimeUnit.SECONDS);
84 108
85 /** 109 /**
86 * 调度指令两分钟入库一次 110 * 调度指令两分钟入库一次
87 * 指令会缓存在内存,直到收到所有响应再入库 111 * 指令会缓存在内存,直到收到所有响应再入库
88 */ 112 */
  113 + //从数据库恢复初始数据
  114 + directiveBuffer.recovery();
89 scheduler.scheduleWithFixedDelay(directivePersistenceThread, 20, 60 * 2, TimeUnit.SECONDS); 115 scheduler.scheduleWithFixedDelay(directivePersistenceThread, 20, 60 * 2, TimeUnit.SECONDS);
90 116
91 /** 117 /**
92 - * 车辆,设备,公司等常用的映射数据,每两小时刷新一次  
93 - */  
94 - scheduler.scheduleWithFixedDelay(commonRefreshThread, 0, 60 * 60 * 2, TimeUnit.SECONDS);  
95 -  
96 - /**  
97 * 每分钟将有变更的班次入库(不包括子任务) 118 * 每分钟将有变更的班次入库(不包括子任务)
98 * 单纯为了提高 线调操作 的响应速度 119 * 单纯为了提高 线调操作 的响应速度
99 */ 120 */
@@ -103,7 +124,7 @@ public class StartCommand implements CommandLineRunner{ @@ -103,7 +124,7 @@ public class StartCommand implements CommandLineRunner{
103 * 每15秒从数据库抓取到离站信息和班次匹配 124 * 每15秒从数据库抓取到离站信息和班次匹配
104 * (网关生成的到离站数据也是延迟批量入库,所以缩短该线程执行周期并不会提高 “实际到离站” 的实时性) 125 * (网关生成的到离站数据也是延迟批量入库,所以缩短该线程执行周期并不会提高 “实际到离站” 的实时性)
105 */ 126 */
106 - scheduler.scheduleWithFixedDelay(gpsArrivalStationThread, 15, 20, TimeUnit.SECONDS); 127 + scheduler.scheduleWithFixedDelay(gpsArrivalStationThread, 35, 15, TimeUnit.SECONDS);
107 128
108 /** 129 /**
109 * 首个调度指令下发(2分钟运行一次) 130 * 首个调度指令下发(2分钟运行一次)
@@ -112,68 +133,11 @@ public class StartCommand implements CommandLineRunner{ @@ -112,68 +133,11 @@ public class StartCommand implements CommandLineRunner{
112 */ 133 */
113 scheduler.scheduleWithFixedDelay(firstScheduleIssuedThread, 60 , 60 * 2, TimeUnit.SECONDS); 134 scheduler.scheduleWithFixedDelay(firstScheduleIssuedThread, 60 , 60 * 2, TimeUnit.SECONDS);
114 135
115 - /**  
116 - * ######### 测试 ###############  
117 - */ 136 + //延迟一会
118 /* new Timer().schedule(new TimerTask() { 137 /* new Timer().schedule(new TimerTask() {
119 138
120 @Override 139 @Override
121 public void run() { 140 public void run() {
122 - //根据班次模拟一份到离站数据  
123 - Set<String> set = ScheduleBuffer.vehSchListMap.keySet();  
124 - ArrivalInfo outArr, inArr;  
125 - List<ArrivalInfo> arrList = new ArrayList<>();  
126 - Date d = new Date();  
127 - for(String nbbm : set){  
128 -  
129 - for(ScheduleRealInfo sch : ScheduleBuffer.vehSchListMap.get(nbbm)){  
130 - //发出  
131 - outArr = new ArrivalInfo(CommonMapped.vehicDeviceBiMap.inverse().get(nbbm)  
132 - , sch.getFcsjT(), sch.getXlBm(), Integer.parseInt(sch.getXlDir()), sch.getQdzCode(), 1, d , 31);  
133 -  
134 - //到达  
135 - inArr = new ArrivalInfo(CommonMapped.vehicDeviceBiMap.inverse().get(nbbm)  
136 - , sch.getZdsjT(), sch.getXlBm(), Integer.parseInt(sch.getXlDir()), sch.getZdzCode(), 0, d , 31);  
137 -  
138 - arrList.add(outArr);  
139 - arrList.add(inArr);  
140 - }  
141 - }  
142 - try {  
143 - Connection conn = DBUtils_MS.getConnection();  
144 - String sql = "insert into bsth_c_arrival_info(device_id, line_id, stop_no, ts, up_down, in_out, weeks_year, create_date)"  
145 - + " values(?, ?, ?, ? , ?, ?,?, now())";  
146 -  
147 - conn.setAutoCommit(false);  
148 - java.sql.PreparedStatement ps = conn.prepareStatement(sql);  
149 -  
150 - for(ArrivalInfo arr : arrList){  
151 - ps.setString(1, arr.getDeviceId());  
152 - ps.setString(2, arr.getLineCode());  
153 - ps.setString(3, arr.getStopNo());  
154 - ps.setLong(4, arr.getTs() == null? 0: arr.getTs());  
155 - ps.setInt(5, arr.getUpDown());  
156 - ps.setInt(6, arr.getInOut());  
157 - ps.setInt(7, arr.getWeeksYear());  
158 -  
159 - ps.addBatch();  
160 - }  
161 -  
162 - ps.executeBatch();  
163 - conn.commit();  
164 - } catch (SQLException e) {  
165 - e.printStackTrace();  
166 - }  
167 -  
168 - //new BatchSaveUtils<ArrivalInfo>().saveList(arrList, ArrivalInfo.class);  
169 - }  
170 - }, 5000);*/  
171 -  
172 -/* //延迟一会  
173 - new Timer().schedule(new TimerTask() {  
174 -  
175 - @Override  
176 - public void run() {  
177 //临时全量刷车辆线路 141 //临时全量刷车辆线路
178 List<CarConfigInfo> ccis = carConfigInfoRepository.findAll(); 142 List<CarConfigInfo> ccis = carConfigInfoRepository.findAll();
179 Cars car; 143 Cars car;
@@ -189,6 +153,7 @@ public class StartCommand implements CommandLineRunner{ @@ -189,6 +153,7 @@ public class StartCommand implements CommandLineRunner{
189 //directiveService.send60Phrase(car.getInsideCode(), ""); 153 //directiveService.send60Phrase(car.getInsideCode(), "");
190 System.out.println("返回值:" + code); 154 System.out.println("返回值:" + code);
191 } 155 }
  156 +
192 } 157 }
193 }, 1000 * 10);*/ 158 }, 1000 * 10);*/
194 159
src/main/java/com/bsth/entity/StationRoute.java
@@ -9,6 +9,9 @@ import javax.persistence.GeneratedValue; @@ -9,6 +9,9 @@ import javax.persistence.GeneratedValue;
9 import javax.persistence.GenerationType; 9 import javax.persistence.GenerationType;
10 import javax.persistence.Id; 10 import javax.persistence.Id;
11 import javax.persistence.ManyToOne; 11 import javax.persistence.ManyToOne;
  12 +import javax.persistence.NamedAttributeNode;
  13 +import javax.persistence.NamedEntityGraph;
  14 +import javax.persistence.NamedEntityGraphs;
12 import javax.persistence.Table; 15 import javax.persistence.Table;
13 16
14 import com.fasterxml.jackson.annotation.JsonIgnore; 17 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -29,6 +32,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore; @@ -29,6 +32,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
29 32
30 @Entity 33 @Entity
31 @Table(name = "bsth_c_stationroute") 34 @Table(name = "bsth_c_stationroute")
  35 +@NamedEntityGraphs({
  36 + @NamedEntityGraph(name = "stationRoute_station", attributeNodes = {
  37 + @NamedAttributeNode("station")
  38 + })
  39 +})
32 public class StationRoute { 40 public class StationRoute {
33 41
34 //站点路由ID 42 //站点路由ID
src/main/java/com/bsth/entity/realcontrol/ScheduleRealInfo.java
@@ -173,6 +173,9 @@ public class ScheduleRealInfo { @@ -173,6 +173,9 @@ public class ScheduleRealInfo {
173 /** 指令下发状态 60: 已发送, 100: 设备确认收到, 200:驾驶员确认 0:失败 */ 173 /** 指令下发状态 60: 已发送, 100: 设备确认收到, 200:驾驶员确认 0:失败 */
174 private Integer directiveState = -1; 174 private Integer directiveState = -1;
175 175
  176 + /** “运营状态” 指令下发状态 60: 已发送, 100: 设备确认收到 0:失败*/
  177 + private Integer opDirectiveState;
  178 +
176 /** 起点站计划到达时间 */ 179 /** 起点站计划到达时间 */
177 private String qdzArrDatejh; 180 private String qdzArrDatejh;
178 181
@@ -874,4 +877,12 @@ public class ScheduleRealInfo { @@ -874,4 +877,12 @@ public class ScheduleRealInfo {
874 877
875 } 878 }
876 } 879 }
  880 +
  881 + public Integer getOpDirectiveState() {
  882 + return opDirectiveState;
  883 + }
  884 +
  885 + public void setOpDirectiveState(Integer opDirectiveState) {
  886 + this.opDirectiveState = opDirectiveState;
  887 + }
877 } 888 }
src/main/java/com/bsth/repository/StationRouteRepository.java
@@ -2,6 +2,7 @@ package com.bsth.repository; @@ -2,6 +2,7 @@ package com.bsth.repository;
2 2
3 import java.util.List; 3 import java.util.List;
4 4
  5 +import org.springframework.data.jpa.repository.EntityGraph;
5 import org.springframework.data.jpa.repository.Modifying; 6 import org.springframework.data.jpa.repository.Modifying;
6 import org.springframework.data.jpa.repository.Query; 7 import org.springframework.data.jpa.repository.Query;
7 import org.springframework.stereotype.Repository; 8 import org.springframework.stereotype.Repository;
@@ -220,4 +221,8 @@ public interface StationRouteRepository extends BaseRepository&lt;StationRoute, Int @@ -220,4 +221,8 @@ public interface StationRouteRepository extends BaseRepository&lt;StationRoute, Int
220 List<Object[]> findStationRouteInfo(Integer id); 221 List<Object[]> findStationRouteInfo(Integer id);
221 222
222 List<StationRoute> findByLine(Line line); 223 List<StationRoute> findByLine(Line line);
  224 +
  225 + @EntityGraph(value = "stationRoute_station", type = EntityGraph.EntityGraphType.FETCH)
  226 + @Query("select s from StationRoute s where s.destroy=0")
  227 + List<StationRoute> findAll2();
223 } 228 }
src/main/java/com/bsth/service/realcontrol/buffer/GetSchedulePlanThread.java
@@ -3,12 +3,15 @@ package com.bsth.service.realcontrol.buffer; @@ -3,12 +3,15 @@ package com.bsth.service.realcontrol.buffer;
3 import java.text.ParseException; 3 import java.text.ParseException;
4 import java.text.SimpleDateFormat; 4 import java.text.SimpleDateFormat;
5 import java.util.Date; 5 import java.util.Date;
  6 +import java.util.HashMap;
6 import java.util.List; 7 import java.util.List;
  8 +import java.util.Map;
7 9
8 import org.slf4j.Logger; 10 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory; 11 import org.slf4j.LoggerFactory;
10 import org.springframework.beans.factory.annotation.Autowired; 12 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.stereotype.Component; 13 import org.springframework.stereotype.Component;
  14 +import org.springframework.web.socket.TextMessage;
12 15
13 import com.alibaba.fastjson.JSON; 16 import com.alibaba.fastjson.JSON;
14 import com.alibaba.fastjson.JSONArray; 17 import com.alibaba.fastjson.JSONArray;
@@ -18,6 +21,8 @@ import com.bsth.repository.realcontrol.ScheduleRealInfoRepository; @@ -18,6 +21,8 @@ import com.bsth.repository.realcontrol.ScheduleRealInfoRepository;
18 import com.bsth.repository.schedule.SchedulePlanInfoRepository; 21 import com.bsth.repository.schedule.SchedulePlanInfoRepository;
19 import com.bsth.util.BatchSaveUtils; 22 import com.bsth.util.BatchSaveUtils;
20 import com.bsth.vehicle.directive.buffer.DirectiveBuffer; 23 import com.bsth.vehicle.directive.buffer.DirectiveBuffer;
  24 +import com.bsth.vehicle.gpsdata.buffer.ArrivalDataBuffer;
  25 +import com.bsth.websocket.handler.RealControlSocketHandler;
21 26
22 /** 27 /**
23 * 28 *
@@ -43,18 +48,28 @@ public class GetSchedulePlanThread extends Thread{ @@ -43,18 +48,28 @@ public class GetSchedulePlanThread extends Thread{
43 @Autowired 48 @Autowired
44 DirectiveBuffer directiveBuffer; 49 DirectiveBuffer directiveBuffer;
45 50
  51 + @Autowired
  52 + RealControlSocketHandler realControlSocket;
  53 +
46 @Override 54 @Override
47 public void run() { 55 public void run() {
48 try{ 56 try{
49 logger.info("从计划调度抓取排班数据..."); 57 logger.info("从计划调度抓取排班数据...");
50 //清除缓存 58 //清除缓存
51 ScheduleBuffer.clear(); 59 ScheduleBuffer.clear();
  60 + ArrivalDataBuffer.clear();
52 //所有指令入库 61 //所有指令入库
53 directiveBuffer.saveAll(); 62 directiveBuffer.saveAll();
54 DirectiveBuffer.clear(); 63 DirectiveBuffer.clear();
55 64
56 //加载新的排班 65 //加载新的排班
57 loaSchedule(); 66 loaSchedule();
  67 +
  68 + //通知所有线调页面刷新
  69 + Map<String, Object> data = new HashMap<>();
  70 + data.put("fn", "refresh");
  71 + data.put("dateStr", sdfyyyyMMdd.format(new Date()));
  72 + realControlSocket.sendMessageToUsers(new TextMessage(JSON.toJSONString(data)));
58 }catch(Exception e){ 73 }catch(Exception e){
59 logger.error("",e); 74 logger.error("",e);
60 } 75 }
@@ -62,7 +77,7 @@ public class GetSchedulePlanThread extends Thread{ @@ -62,7 +77,7 @@ public class GetSchedulePlanThread extends Thread{
62 77
63 public void loaSchedule() throws ParseException{ 78 public void loaSchedule() throws ParseException{
64 List<ScheduleRealInfo> realList = null; 79 List<ScheduleRealInfo> realList = null;
65 - String dateStr = sdfyyyyMMdd.format(new Date()); 80 + String dateStr = sdfyyyyMMdd.format(new Date())/*"2016-07-28"*/;
66 //Date cDate = sdfyyyyMMdd.parse(dateStr); 81 //Date cDate = sdfyyyyMMdd.parse(dateStr);
67 //查询数据库是否有今日排班 82 //查询数据库是否有今日排班
68 int size = scheduleRealInfoRepository.countByDate(dateStr); 83 int size = scheduleRealInfoRepository.countByDate(dateStr);
src/main/java/com/bsth/service/realcontrol/buffer/ScheduleBuffer.java
@@ -182,11 +182,11 @@ public class ScheduleBuffer { @@ -182,11 +182,11 @@ public class ScheduleBuffer {
182 continue; 182 continue;
183 183
184 if(sch.getFcsjT().equals(sch2.getFcsjT())//出场,发车时间一致 184 if(sch.getFcsjT().equals(sch2.getFcsjT())//出场,发车时间一致
185 - || sch.getFcsjT().equals(sch2.getZdsjT())//进场,上一班次站点时间为进场起点时间 185 + //|| sch.getFcsjT().equals(sch2.getZdsjT())//进场,上一班次终点时间为进场起点时间
186 ){ 186 ){
187 sch.setParkIsFirstStation(true); 187 sch.setParkIsFirstStation(true);
188 sch2.setFirstStationIsPark(true); 188 sch2.setFirstStationIsPark(true);
189 - //做双关联 189 + //做双关联
190 sch2.setTwins(sch); 190 sch2.setTwins(sch);
191 sch.setTwins(sch2); 191 sch.setTwins(sch2);
192 break; 192 break;
@@ -354,15 +354,26 @@ public class ScheduleBuffer { @@ -354,15 +354,26 @@ public class ScheduleBuffer {
354 public static ScheduleRealInfo findCurrent(String nbbm){ 354 public static ScheduleRealInfo findCurrent(String nbbm){
355 List<ScheduleRealInfo> list = ScheduleBuffer.carSchListMap.get(nbbm); 355 List<ScheduleRealInfo> list = ScheduleBuffer.carSchListMap.get(nbbm);
356 356
  357 + //long t = System.currentTimeMillis();
357 int size = list.size(); 358 int size = list.size();
358 - ScheduleRealInfo sch; 359 + ScheduleRealInfo sch = null, currentSch = null, lastOver = null;
359 //最后一个状态为 正在执行的班次 360 //最后一个状态为 正在执行的班次
360 for(int i = size - 1; i > 0; i --){ 361 for(int i = size - 1; i > 0; i --){
361 sch = list.get(i); 362 sch = list.get(i);
362 - if(sch.getStatus() == 1)  
363 - return sch; 363 + if(sch.getStatus() == 1){
  364 + currentSch = sch;
  365 + break;
  366 + }
  367 +
  368 + //最后一个已完成的班次
  369 + if(null == lastOver && sch.getStatus() == 2)
  370 + lastOver = sch;
  371 + /*if(null != nearestSch
  372 + && Math.abs(sch.getZdsjT() - t) < Math.abs(nearestSch.getZdsjT() - t) ){
  373 + nearestSch = sch;
  374 + }*/
364 } 375 }
365 - return null; 376 + return currentSch == null?lastOver:currentSch;
366 } 377 }
367 378
368 /** 379 /**
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
@@ -336,6 +336,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -336,6 +336,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
336 public Map<String, Object> adjust(Long id, String nbbm, String jsy, String spy, Integer revertLine, Integer borrowLine, String borrowTimeStr, String revertTimeStr) { 336 public Map<String, Object> adjust(Long id, String nbbm, String jsy, String spy, Integer revertLine, Integer borrowLine, String borrowTimeStr, String revertTimeStr) {
337 // 班次 337 // 班次
338 ScheduleRealInfo schedule = ScheduleBuffer.pkSchedulMap.get(id); 338 ScheduleRealInfo schedule = ScheduleBuffer.pkSchedulMap.get(id);
  339 + int upDown = Integer.parseInt(schedule.getXlDir());
339 340
340 String rq = sdfMonth.format(new Date()); 341 String rq = sdfMonth.format(new Date());
341 // 换车 342 // 换车
@@ -360,7 +361,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -360,7 +361,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
360 try { 361 try {
361 //跨线路借车 362 //跨线路借车
362 Long t = sdfMinute.parse(rq + " " + borrowTimeStr).getTime(); 363 Long t = sdfMinute.parse(rq + " " + borrowTimeStr).getTime();
363 - borrowCenter.put(nbbm, borrowLine, 0, t); 364 + borrowCenter.put(nbbm, borrowLine, 0, t, upDown);
364 } catch (ParseException e) { 365 } catch (ParseException e) {
365 e.printStackTrace(); 366 e.printStackTrace();
366 } 367 }
@@ -370,7 +371,8 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -370,7 +371,8 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
370 //定时还车 371 //定时还车
371 try { 372 try {
372 Long t = sdfMinute.parse(rq + " " + revertTimeStr).getTime(); 373 Long t = sdfMinute.parse(rq + " " + revertTimeStr).getTime();
373 - borrowCenter.put(nbbm, revertLine, 1, t); 374 + //还车的时候不用切走向
  375 + borrowCenter.put(nbbm, revertLine, 1, t, -1);
374 } catch (ParseException e) { 376 } catch (ParseException e) {
375 e.printStackTrace(); 377 e.printStackTrace();
376 } 378 }
src/main/java/com/bsth/vehicle/BorrowCenter.java
@@ -45,15 +45,15 @@ public class BorrowCenter { @@ -45,15 +45,15 @@ public class BorrowCenter {
45 * @param @param time 时间 45 * @param @param time 时间
46 * @throws 46 * @throws
47 */ 47 */
48 - public void put(String nbbm, Integer lineCode, int type, Long time){ 48 + public void put(String nbbm, Integer lineCode, int type, Long time, int upDown){
49 Long t = System.currentTimeMillis(); 49 Long t = System.currentTimeMillis();
50 if(t >= time){ 50 if(t >= time){
51 //立即执行 51 //立即执行
52 - new Thread(new ChangeThread(nbbm, lineCode, type)).start(); 52 + new Thread(new ChangeThread(nbbm, lineCode, type, upDown)).start();
53 } 53 }
54 else{ 54 else{
55 //定时线程 55 //定时线程
56 - scheduler.schedule(new ChangeThread(nbbm, lineCode, type), (time - t) / 1000, TimeUnit.SECONDS); 56 + scheduler.schedule(new ChangeThread(nbbm, lineCode, type, upDown), (time - t) / 1000, TimeUnit.SECONDS);
57 } 57 }
58 } 58 }
59 59
@@ -61,17 +61,23 @@ public class BorrowCenter { @@ -61,17 +61,23 @@ public class BorrowCenter {
61 String nbbm; 61 String nbbm;
62 Integer lineCode; 62 Integer lineCode;
63 int type; 63 int type;
  64 + int upDown;
64 65
65 - public ChangeThread(String nbbm, Integer lineCode, int type) { 66 + public ChangeThread(String nbbm, Integer lineCode, int type, int upDown) {
66 this.nbbm = nbbm; 67 this.nbbm = nbbm;
67 this.lineCode = lineCode; 68 this.lineCode = lineCode;
68 this.type = type; 69 this.type = type;
  70 + this.upDown = upDown;
69 } 71 }
70 72
71 @Override 73 @Override
72 public void run() { 74 public void run() {
73 logger.info("nbbm " + (type==0?"借出":"归还") + "线路代码 " + lineCode); 75 logger.info("nbbm " + (type==0?"借出":"归还") + "线路代码 " + lineCode);
74 directiveService.lineChange(nbbm, lineCode); 76 directiveService.lineChange(nbbm, lineCode);
  77 + if(upDown != -1){
  78 + //切换走向
  79 + directiveService.upDownChange(nbbm, upDown);
  80 + }
75 } 81 }
76 } 82 }
77 } 83 }
src/main/java/com/bsth/vehicle/UpstreamEntrance.java
@@ -16,54 +16,56 @@ import com.bsth.vehicle.directive.entity.Directive80; @@ -16,54 +16,56 @@ import com.bsth.vehicle.directive.entity.Directive80;
16 16
17 /** 17 /**
18 * 18 *
19 - * @ClassName: UpstreamEntrance  
20 - * @Description: TODO(车载网关HTTP上行入口) 19 + * @ClassName: UpstreamEntrance
  20 + * @Description: TODO(车载网关HTTP上行入口)
21 * @author PanZhao 21 * @author PanZhao
22 - * @date 2016年6月7日 下午3:00:01 22 + * @date 2016年6月7日 下午3:00:01
23 * 23 *
24 */ 24 */
25 @RestController 25 @RestController
26 @RequestMapping("/control") 26 @RequestMapping("/control")
27 public class UpstreamEntrance { 27 public class UpstreamEntrance {
28 - 28 +
29 Logger logger = LoggerFactory.getLogger(this.getClass()); 29 Logger logger = LoggerFactory.getLogger(this.getClass());
30 - 30 +
31 @Autowired 31 @Autowired
32 DirectiveBuffer directiveBuffer; 32 DirectiveBuffer directiveBuffer;
33 -  
34 - @RequestMapping(value = "/upstream" , method = RequestMethod.POST)  
35 - public int main(@RequestParam String json){ 33 +
  34 + @RequestMapping(value = "/upstream", method = RequestMethod.POST)
  35 + public int main(@RequestParam String json) {
36 logger.info("upstream: " + json); 36 logger.info("upstream: " + json);
37 - JSONObject jsonParam = JSONObject.parseObject(json);  
38 -  
39 - //46和47 调度指令确认  
40 - if(jsonParam.getInteger("operCode") == null  
41 - && jsonParam.getInteger("status") != null){  
42 - try{  
43 - DirectiveReply reply = JSON.toJavaObject(jsonParam, DirectiveReply.class);  
44 - directiveBuffer.reply(reply);  
45 - }catch(NumberFormatException e){  
46 - logger.error("NumberFormatException ,,,,一般是老数据,msgId太大"); 37 + try {
  38 + JSONObject jsonParam = JSONObject.parseObject(json);
  39 +
  40 + // 46和47 调度指令确认
  41 + if (jsonParam.getInteger("operCode") == null && jsonParam.getInteger("status") != null) {
  42 + try {
  43 + DirectiveReply reply = JSON.toJavaObject(jsonParam, DirectiveReply.class);
  44 + directiveBuffer.reply(reply);
  45 + } catch (NumberFormatException e) {
  46 + logger.error("NumberFormatException ,,,,一般是老数据,msgId太大");
  47 + }
47 } 48 }
48 - }  
49 - //80协议  
50 - else if(jsonParam.getInteger("operCode") == 0X80){  
51 - try{  
52 - Directive80 report = JSON.toJavaObject(jsonParam, Directive80.class);  
53 - //驾驶员上报  
54 - if(report.getData().getOperCode2() == 0x26)  
55 - directiveBuffer.jsyReport(report);  
56 - }catch(Exception e){  
57 - logger.error("", e); 49 + // 80协议
  50 + else if (jsonParam.getInteger("operCode") == 0X80) {
  51 + try {
  52 + Directive80 report = JSON.toJavaObject(jsonParam, Directive80.class);
  53 + // 驾驶员上报
  54 + if (report.getData().getOperCode2() == 0x26)
  55 + directiveBuffer.jsyReport(report);
  56 + } catch (Exception e) {
  57 + logger.error("", e);
  58 + }
58 } 59 }
  60 + // 64协议 线路切换回复
  61 + else if (jsonParam.getInteger("operCode") == 0X64) {
  62 + directiveBuffer.reply64(jsonParam);
  63 + } else
  64 + logger.warn("未知的上行数据,p: " + json);
  65 +
  66 + } catch (Exception e) {
  67 + logger.error("", e);
59 } 68 }
60 - //64协议 线路切换回复  
61 - else if(jsonParam.getInteger("operCode") == 0X64){  
62 - directiveBuffer.reply64(jsonParam);  
63 - }  
64 - else  
65 - logger.warn("未知的上行数据,p: " + json);  
66 -  
67 return 0; 69 return 0;
68 } 70 }
69 } 71 }
src/main/java/com/bsth/vehicle/common/CommonMapped.java
1 package com.bsth.vehicle.common; 1 package com.bsth.vehicle.common;
2 2
  3 +import java.util.List;
3 import java.util.Map; 4 import java.util.Map;
4 5
5 import com.bsth.entity.Line; 6 import com.bsth.entity.Line;
  7 +import com.bsth.entity.StationRoute;
  8 +import com.google.common.collect.ArrayListMultimap;
6 import com.google.common.collect.BiMap; 9 import com.google.common.collect.BiMap;
7 import com.google.common.collect.TreeMultimap; 10 import com.google.common.collect.TreeMultimap;
8 11
@@ -48,6 +51,12 @@ public class CommonMapped { @@ -48,6 +51,12 @@ public class CommonMapped {
48 public static Map<String, String> stationCodeMap; 51 public static Map<String, String> stationCodeMap;
49 52
50 /** 53 /**
  54 + * 线路站点路由对照
  55 + * (K:线路编码, V:站点路由)
  56 + */
  57 + public static Map<Integer, List<StationRoute>> lineStationRouteMap;
  58 +
  59 + /**
51 * 线路和用户名对照 60 * 线路和用户名对照
52 * 用于webSocket定向推送消息 61 * 用于webSocket定向推送消息
53 */ 62 */
src/main/java/com/bsth/vehicle/common/CommonRefreshThread.java
1 package com.bsth.vehicle.common; 1 package com.bsth.vehicle.common;
2 2
  3 +import java.util.ArrayList;
  4 +import java.util.Collections;
  5 +import java.util.Comparator;
3 import java.util.HashMap; 6 import java.util.HashMap;
4 import java.util.Iterator; 7 import java.util.Iterator;
  8 +import java.util.List;
5 import java.util.Map; 9 import java.util.Map;
6 10
7 import org.slf4j.Logger; 11 import org.slf4j.Logger;
@@ -13,10 +17,12 @@ import com.bsth.entity.CarPark; @@ -13,10 +17,12 @@ import com.bsth.entity.CarPark;
13 import com.bsth.entity.Cars; 17 import com.bsth.entity.Cars;
14 import com.bsth.entity.Line; 18 import com.bsth.entity.Line;
15 import com.bsth.entity.Station; 19 import com.bsth.entity.Station;
  20 +import com.bsth.entity.StationRoute;
16 import com.bsth.entity.schedule.CarConfigInfo; 21 import com.bsth.entity.schedule.CarConfigInfo;
17 import com.bsth.repository.CarParkRepository; 22 import com.bsth.repository.CarParkRepository;
18 import com.bsth.repository.CarsRepository; 23 import com.bsth.repository.CarsRepository;
19 import com.bsth.repository.StationRepository; 24 import com.bsth.repository.StationRepository;
  25 +import com.bsth.repository.StationRouteRepository;
20 import com.bsth.repository.schedule.CarConfigInfoRepository; 26 import com.bsth.repository.schedule.CarConfigInfoRepository;
21 import com.google.common.collect.BiMap; 27 import com.google.common.collect.BiMap;
22 import com.google.common.collect.HashBiMap; 28 import com.google.common.collect.HashBiMap;
@@ -44,6 +50,9 @@ public class CommonRefreshThread extends Thread{ @@ -44,6 +50,9 @@ public class CommonRefreshThread extends Thread{
44 @Autowired 50 @Autowired
45 CarConfigInfoRepository carConfigInfoRepository; 51 CarConfigInfoRepository carConfigInfoRepository;
46 52
  53 + @Autowired
  54 + StationRouteRepository sRouteRepository;
  55 +
47 Logger logger = LoggerFactory.getLogger(this.getClass()); 56 Logger logger = LoggerFactory.getLogger(this.getClass());
48 57
49 @Override 58 @Override
@@ -52,6 +61,8 @@ public class CommonRefreshThread extends Thread{ @@ -52,6 +61,8 @@ public class CommonRefreshThread extends Thread{
52 initVehicMapp(); 61 initVehicMapp();
53 initStationCodeMap(); 62 initStationCodeMap();
54 initVehicLineMap(); 63 initVehicLineMap();
  64 +
  65 + initLineStationRouteMap();
55 } catch (Exception e) { 66 } catch (Exception e) {
56 e.printStackTrace(); 67 e.printStackTrace();
57 logger.error("", e); 68 logger.error("", e);
@@ -60,6 +71,36 @@ public class CommonRefreshThread extends Thread{ @@ -60,6 +71,36 @@ public class CommonRefreshThread extends Thread{
60 71
61 /** 72 /**
62 * 73 *
  74 + * @Title: initLineStationRouteMap
  75 + * @Description: TODO(加载线路站点路由信息)
  76 + * @throws
  77 + */
  78 + private void initLineStationRouteMap() {
  79 + List<StationRoute> routes = sRouteRepository.findAll2();
  80 +
  81 + Map<Integer, List<StationRoute>> map = new HashMap<>();
  82 +
  83 + Integer lineCode;
  84 + for(StationRoute route: routes){
  85 + lineCode = Integer.parseInt(route.getLineCode());
  86 + if(!map.containsKey(lineCode))
  87 + map.put(lineCode, new ArrayList<StationRoute>());
  88 +
  89 + map.get(lineCode).add(route);
  90 + }
  91 +
  92 + //排序
  93 + StationRouteComp sRouteComp = new StationRouteComp();
  94 + Iterator<List<StationRoute>> iterator = map.values().iterator();
  95 + List<StationRoute> temp;
  96 + while(iterator.hasNext()){
  97 + temp = iterator.next();
  98 + Collections.sort(temp, sRouteComp);
  99 + }
  100 + }
  101 +
  102 + /**
  103 + *
63 * @Title: initVehicLineMap 104 * @Title: initVehicLineMap
64 * @Description: TODO(根据车辆配置,加载车辆和线路对照数据) 105 * @Description: TODO(根据车辆配置,加载车辆和线路对照数据)
65 * @throws 106 * @throws
@@ -121,4 +162,12 @@ public class CommonRefreshThread extends Thread{ @@ -121,4 +162,12 @@ public class CommonRefreshThread extends Thread{
121 162
122 CommonMapped.stationCodeMap = newMap; 163 CommonMapped.stationCodeMap = newMap;
123 } 164 }
  165 +
  166 + public static class StationRouteComp implements Comparator<StationRoute>{
  167 +
  168 + @Override
  169 + public int compare(StationRoute o1, StationRoute o2) {
  170 + return o1.getStationRouteCode() - o2.getStationRouteCode();
  171 + }
  172 + }
124 } 173 }
src/main/java/com/bsth/vehicle/directive/MsgIdGenerator.java
@@ -12,11 +12,16 @@ public class MsgIdGenerator { @@ -12,11 +12,16 @@ public class MsgIdGenerator {
12 12
13 private static int msgId = 1; 13 private static int msgId = 1;
14 14
  15 + private final static int MAX_VALUE = Integer.MAX_VALUE - 10;
  16 +
15 public synchronized static int getMsgId(){ 17 public synchronized static int getMsgId(){
16 msgId ++; 18 msgId ++;
17 - if(msgId == Integer.MAX_VALUE){ 19 + if(msgId == MAX_VALUE)
18 msgId = 0; 20 msgId = 0;
19 - }  
20 return msgId; 21 return msgId;
21 } 22 }
  23 +
  24 + public static void setMsgId(int maxId){
  25 + msgId = maxId;
  26 + }
22 } 27 }
src/main/java/com/bsth/vehicle/directive/buffer/DirectiveBuffer.java
1 package com.bsth.vehicle.directive.buffer; 1 package com.bsth.vehicle.directive.buffer;
2 2
3 import java.util.ArrayList; 3 import java.util.ArrayList;
  4 +import java.util.Calendar;
  5 +import java.util.Collection;
  6 +import java.util.Comparator;
4 import java.util.HashMap; 7 import java.util.HashMap;
5 -import java.util.Iterator;  
6 import java.util.LinkedList; 8 import java.util.LinkedList;
7 import java.util.List; 9 import java.util.List;
8 import java.util.Map; 10 import java.util.Map;
@@ -12,25 +14,23 @@ import org.slf4j.LoggerFactory; @@ -12,25 +14,23 @@ import org.slf4j.LoggerFactory;
12 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.stereotype.Component; 15 import org.springframework.stereotype.Component;
14 16
15 -import com.alibaba.fastjson.JSON;  
16 import com.alibaba.fastjson.JSONObject; 17 import com.alibaba.fastjson.JSONObject;
17 import com.bsth.entity.realcontrol.ScheduleRealInfo; 18 import com.bsth.entity.realcontrol.ScheduleRealInfo;
18 import com.bsth.service.realcontrol.buffer.ScheduleBuffer; 19 import com.bsth.service.realcontrol.buffer.ScheduleBuffer;
19 import com.bsth.vehicle.common.CommonMapped; 20 import com.bsth.vehicle.common.CommonMapped;
  21 +import com.bsth.vehicle.directive.MsgIdGenerator;
20 import com.bsth.vehicle.directive.entity.Directive60; 22 import com.bsth.vehicle.directive.entity.Directive60;
21 import com.bsth.vehicle.directive.entity.DirectiveReply; 23 import com.bsth.vehicle.directive.entity.DirectiveReply;
22 import com.bsth.vehicle.directive.entity.Directive80; 24 import com.bsth.vehicle.directive.entity.Directive80;
23 import com.bsth.vehicle.directive.entity.DirectiveC0; 25 import com.bsth.vehicle.directive.entity.DirectiveC0;
24 import com.bsth.vehicle.directive.entity.DirectiveC0.DirectiveC0Data; 26 import com.bsth.vehicle.directive.entity.DirectiveC0.DirectiveC0Data;
25 -import com.bsth.vehicle.directive.entity.LineChange; 27 +import com.bsth.vehicle.directive.entity.Directive64;
26 import com.bsth.vehicle.directive.repository.Directive60Repository; 28 import com.bsth.vehicle.directive.repository.Directive60Repository;
27 import com.bsth.vehicle.directive.repository.Directive80Repository; 29 import com.bsth.vehicle.directive.repository.Directive80Repository;
28 import com.bsth.vehicle.directive.repository.LineChangeRepository; 30 import com.bsth.vehicle.directive.repository.LineChangeRepository;
29 import com.bsth.vehicle.directive.service.DirectiveService; 31 import com.bsth.vehicle.directive.service.DirectiveService;
30 -import com.bsth.vehicle.directive.util.HttpUtils;  
31 import com.bsth.websocket.handler.RealControlSocketHandler; 32 import com.bsth.websocket.handler.RealControlSocketHandler;
32 import com.google.common.collect.ArrayListMultimap; 33 import com.google.common.collect.ArrayListMultimap;
33 -import com.google.common.collect.Multimap;  
34 34
35 /** 35 /**
36 * 36 *
@@ -49,10 +49,10 @@ public class DirectiveBuffer { @@ -49,10 +49,10 @@ public class DirectiveBuffer {
49 Directive80Repository d80Repository; 49 Directive80Repository d80Repository;
50 50
51 @Autowired 51 @Autowired
52 - LineChangeRepository lineChangeRepository; 52 + LineChangeRepository d64Repository;
53 53
54 @Autowired 54 @Autowired
55 - DirectiveService directiveService; 55 + DirectiveService directiveService60;
56 56
57 57
58 /** 58 /**
@@ -61,12 +61,12 @@ public class DirectiveBuffer { @@ -61,12 +61,12 @@ public class DirectiveBuffer {
61 public static LinkedList<Directive60> transientList; 61 public static LinkedList<Directive60> transientList;
62 62
63 /** 63 /**
64 - * 等待确认的线路切换指令 64 + * 线路切换指令 64
65 */ 65 */
66 - public static Map<String, LineChange> changeMap; 66 + public static Map<String, Directive64> changeMap;
67 67
68 /** 68 /**
69 - * 当日调度指令缓存 69 + * 当日60指令缓存
70 */ 70 */
71 private static Map<Integer, Directive60> directiveMap; 71 private static Map<Integer, Directive60> directiveMap;
72 72
@@ -77,7 +77,7 @@ public class DirectiveBuffer { @@ -77,7 +77,7 @@ public class DirectiveBuffer {
77 * 驾驶员上报数据 77 * 驾驶员上报数据
78 * {K: 线路编码} 78 * {K: 线路编码}
79 */ 79 */
80 - private static Multimap<Integer, Directive80> reportMultiMap; 80 + private static ArrayListMultimap<Integer, Directive80> reportMultiMap;
81 81
82 @Autowired 82 @Autowired
83 RealControlSocketHandler socketHandler; 83 RealControlSocketHandler socketHandler;
@@ -126,13 +126,23 @@ public class DirectiveBuffer { @@ -126,13 +126,23 @@ public class DirectiveBuffer {
126 break; 126 break;
127 } 127 }
128 128
  129 + ScheduleRealInfo sch = directive.getSch();
  130 +
  131 + if(null == sch)
  132 + return;
  133 +
  134 + //调度指令回复
129 if(directive.isDispatch()){ 135 if(directive.isDispatch()){
130 //更新班次状态 136 //更新班次状态
131 - ScheduleRealInfo sch = directive.getSch();  
132 sch.setDirectiveState(reply.getStatus() * 100); 137 sch.setDirectiveState(reply.getStatus() * 100);
133 ScheduleBuffer.persistentList.add(sch); 138 ScheduleBuffer.persistentList.add(sch);
134 //通知页面 139 //通知页面
135 - directiveService.sendDirectiveToPage(sch); 140 + directiveService60.sendDirectiveToPage(sch);
  141 + }
  142 + //运营状态指令回复
  143 + else if(directive.getData().getDispatchInstruct() == 0x03){
  144 + sch.setOpDirectiveState(reply.getStatus() * 100);
  145 + ScheduleBuffer.persistentList.add(sch);
136 } 146 }
137 transientList.add(directive); 147 transientList.add(directive);
138 } 148 }
@@ -146,21 +156,21 @@ public class DirectiveBuffer { @@ -146,21 +156,21 @@ public class DirectiveBuffer {
146 public void reply64(JSONObject json){ 156 public void reply64(JSONObject json){
147 String key = json.getString("deviceId") + "_" + json.getString("timestamp"); 157 String key = json.getString("deviceId") + "_" + json.getString("timestamp");
148 158
149 - LineChange change = changeMap.get(key); 159 + Directive64 change = changeMap.get(key);
150 160
151 if(null == change) 161 if(null == change)
152 logger.warn("64响应 -找不到请求源,json: " + json); 162 logger.warn("64响应 -找不到请求源,json: " + json);
  163 + else if(change.getRespAck() != null)
  164 + logger.warn("64响应 -重复响应,json: " + json);
153 else{ 165 else{
154 JSONObject data = json.getJSONObject("data"); 166 JSONObject data = json.getJSONObject("data");
155 167
156 - changeMap.remove(key);  
157 -  
158 if(null == data) 168 if(null == data)
159 logger.warn("64响应 data is null ,json: " + json); 169 logger.warn("64响应 data is null ,json: " + json);
160 else{ 170 else{
161 change.setRespAck(data.getShort("requestAck")); 171 change.setRespAck(data.getShort("requestAck"));
162 //响应入库 172 //响应入库
163 - lineChangeRepository.save(change); 173 + d64Repository.save(change);
164 } 174 }
165 } 175 }
166 } 176 }
@@ -174,11 +184,11 @@ public class DirectiveBuffer { @@ -174,11 +184,11 @@ public class DirectiveBuffer {
174 public void jsyReport(Directive80 report){ 184 public void jsyReport(Directive80 report){
175 //将托管的线路自动处理掉 185 //将托管的线路自动处理掉
176 Integer lineCode = report.getData().getLineId(); 186 Integer lineCode = report.getData().getLineId();
177 - Integer status = ScheduleBuffer.trustMap.get(lineCode); 187 + //Integer status = ScheduleBuffer.trustMap.get(lineCode);
178 //请求代码 188 //请求代码
179 - Short requestCode = report.getData().getRequestCode(); 189 + //Short requestCode = report.getData().getRequestCode();
180 //托管 190 //托管
181 - if(null == status || status == 0){ 191 + /*if(null == status || status == 0){
182 //自动处理出场请求 192 //自动处理出场请求
183 if(requestCode == 0xA3){ 193 if(requestCode == 0xA3){
184 DirectiveC0 c0 = createC0(report, (short)0x06); 194 DirectiveC0 c0 = createC0(report, (short)0x06);
@@ -186,10 +196,11 @@ public class DirectiveBuffer { @@ -186,10 +196,11 @@ public class DirectiveBuffer {
186 report.setC0(c0); 196 report.setC0(c0);
187 d80Repository.save(report); 197 d80Repository.save(report);
188 } 198 }
189 - } 199 + }*/
190 200
191 //实时入库 201 //实时入库
192 - d80Repository.save(report); 202 + d80Repository.save(report);
  203 +
193 reportMultiMap.put(lineCode, report); 204 reportMultiMap.put(lineCode, report);
194 //推送到页面 205 //推送到页面
195 report.getData().setNbbm(CommonMapped.vehicDeviceBiMap.get(report.getDeviceId())); 206 report.getData().setNbbm(CommonMapped.vehicDeviceBiMap.get(report.getDeviceId()));
@@ -225,15 +236,23 @@ public class DirectiveBuffer { @@ -225,15 +236,23 @@ public class DirectiveBuffer {
225 * @Description: TODO(所有缓存里的指令全部入库) 236 * @Description: TODO(所有缓存里的指令全部入库)
226 */ 237 */
227 public void saveAll(){ 238 public void saveAll(){
228 - Iterator<Directive60> iterator = directiveMap.values().iterator(); 239 + //未回复的60指令入库
  240 + Collection<Directive60> ds = directiveMap.values();
229 List<Directive60> pList = new ArrayList<>(); 241 List<Directive60> pList = new ArrayList<>();
230 - Directive60 d60;  
231 - while(iterator.hasNext()){  
232 - d60 = iterator.next();  
233 - if(!d60.isPersistent())  
234 - pList.add(d60); 242 + for(Directive60 d : ds){
  243 + if(d.getReply47() == null)
  244 + pList.add(d);
  245 + }
  246 + d60Repository.save(directiveMap.values());
  247 +
  248 + //未回复的64指令入库
  249 + Collection<Directive64> ds64 = changeMap.values();
  250 + List<Directive64> pList2 = new ArrayList<>();
  251 + for(Directive64 d : ds64){
  252 + if(d.getRespAck() == null)
  253 + pList2.add(d);
235 } 254 }
236 - d60Repository.save(pList); 255 + d64Repository.save(pList2);
237 } 256 }
238 257
239 /** 258 /**
@@ -248,4 +267,106 @@ public class DirectiveBuffer { @@ -248,4 +267,106 @@ public class DirectiveBuffer {
248 reportMultiMap = ArrayListMultimap.create(); 267 reportMultiMap = ArrayListMultimap.create();
249 changeMap = new HashMap<>(); 268 changeMap = new HashMap<>();
250 } 269 }
  270 +
  271 + /**
  272 + *
  273 + * @Title: recovery
  274 + * @Description: TODO(从数据库恢复当天的指令数据到内存.)
  275 + * @throws
  276 + */
  277 + public void recovery(){
  278 + clear();
  279 +
  280 + //设置msgId
  281 + Integer maxMsgId = d60Repository.maxMsgId();
  282 + MsgIdGenerator.setMsgId(maxMsgId ++);
  283 +
  284 + Calendar cal = Calendar.getInstance();
  285 + cal.set(Calendar.HOUR_OF_DAY, 2);
  286 + cal.set(Calendar.SECOND, 0);
  287 + cal.set(Calendar.MINUTE, 0);
  288 + cal.set(Calendar.MILLISECOND, 0);
  289 + //当天2点开始恢复
  290 + long st = cal.getTimeInMillis()
  291 + ,ct = System.currentTimeMillis();
  292 +
  293 + //如果还不到2点,从前一天2点开始恢复
  294 + if(ct < st){
  295 + st -= (1000 * 60 * 60 * 24);
  296 + }
  297 +
  298 + List<Directive60> d60List = d60Repository.findByGtTime(st);
  299 + //恢复60下发指令
  300 + for(Directive60 d : d60List){
  301 + directiveMap.put(d.getMsgId(), d);
  302 + }
  303 +
  304 + //恢复80驾驶员上报
  305 + List<Directive80> d80List = d80Repository.findByGtTime(st);
  306 +
  307 + for(Directive80 d : d80List){
  308 + d.getData().setNbbm(CommonMapped.vehicDeviceBiMap.get(d.getDeviceId()));
  309 + reportMultiMap.put(d.getData().getLineId(), d);
  310 + }
  311 + }
  312 +
  313 + public static List<Directive80> findNoCofm80(Integer lineCode){
  314 + List<Directive80> list = reportMultiMap.get(lineCode)
  315 + ,rs = new ArrayList<>();
  316 +
  317 + for(Directive80 d : list){
  318 + if(!d.isConfirm())
  319 + rs.add(d);
  320 + }
  321 + return rs;
  322 + }
  323 +
  324 + public static Directive80 findById80(int id){
  325 + Collection<Directive80> ds = reportMultiMap.values();
  326 +
  327 + Directive80 rs = null;
  328 + for(Directive80 d : ds){
  329 + if(d.getId() == id){
  330 + rs = d;
  331 + break;
  332 + }
  333 + }
  334 +
  335 + return rs;
  336 + }
  337 +
  338 + /**
  339 + *
  340 + * @Title: findAll
  341 + * @Description: TODO(获取缓存里的全部指令)
  342 + * @throws
  343 + */
  344 + public static List<Object> findAll(){
  345 + List<Object> all = new ArrayList<>();
  346 + //60
  347 + all.addAll(directiveMap.values());
  348 + //64
  349 + all.addAll(changeMap.values());
  350 + return all;
  351 + }
  352 +
  353 + public static class DComparator implements Comparator<Object>{
  354 +
  355 + @Override
  356 + public int compare(Object o1, Object o2) {
  357 + Long t1,t2;
  358 + if(o1 instanceof Directive60)
  359 + t1 = ((Directive60)o1).getTimestamp();
  360 + else
  361 + t1 = ((Directive64)o1).getTimestamp();
  362 +
  363 + if(o2 instanceof Directive60)
  364 + t2 = ((Directive60)o2).getTimestamp();
  365 + else
  366 + t2 = ((Directive64)o2).getTimestamp();
  367 +
  368 + return (int) (t2 - t1);
  369 + }
  370 +
  371 + }
251 } 372 }
src/main/java/com/bsth/vehicle/directive/controller/DirectiveController.java
1 package com.bsth.vehicle.directive.controller; 1 package com.bsth.vehicle.directive.controller;
2 2
  3 +import java.util.List;
  4 +import java.util.Map;
  5 +
3 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.web.bind.annotation.RequestMapping; 7 import org.springframework.web.bind.annotation.RequestMapping;
5 import org.springframework.web.bind.annotation.RequestMethod; 8 import org.springframework.web.bind.annotation.RequestMethod;
6 import org.springframework.web.bind.annotation.RequestParam; 9 import org.springframework.web.bind.annotation.RequestParam;
7 import org.springframework.web.bind.annotation.RestController; 10 import org.springframework.web.bind.annotation.RestController;
8 11
  12 +import com.bsth.vehicle.directive.entity.Directive80;
9 import com.bsth.vehicle.directive.service.DirectiveService; 13 import com.bsth.vehicle.directive.service.DirectiveService;
10 14
11 /** 15 /**
@@ -71,4 +75,45 @@ public class DirectiveController { @@ -71,4 +75,45 @@ public class DirectiveController {
71 public int upDownChange(@RequestParam String nbbm, @RequestParam Integer upDown){ 75 public int upDownChange(@RequestParam String nbbm, @RequestParam Integer upDown){
72 return directiveService.upDownChange(nbbm, upDown); 76 return directiveService.upDownChange(nbbm, upDown);
73 } 77 }
  78 +
  79 + /**
  80 + *
  81 + * @Title: findNoCofm80
  82 + * @Description: TODO(根据线路获取未确认的80驾驶员上报数据)
  83 + * @throws
  84 + */
  85 + @RequestMapping(value = "/findNoCofm80", method = RequestMethod.GET)
  86 + public Map<String, List<Directive80>> findNoCofm80(@RequestParam String lineCodes){
  87 + return directiveService.findNoCofm80(lineCodes);
  88 + }
  89 +
  90 + /**
  91 + *
  92 + * @Title: reply80
  93 + * @Description: TODO(回复80)
  94 + * @param @param reply 0:同意 -1:不同意
  95 + * @throws
  96 + */
  97 + @RequestMapping(value = "/reply80", method = RequestMethod.POST)
  98 + public Map<String, Object> reply80(@RequestParam int id, @RequestParam int reply){
  99 + return directiveService.reply80(id, reply);
  100 + }
  101 +
  102 + /**
  103 + *
  104 + * @Title: findDirective
  105 + * @Description: TODO(查询调度指令)
  106 + * @param @param nbbm 车辆
  107 + * @param @param dType 类型
  108 + * @param @param page 页号
  109 + * @param @param size 每页数量
  110 + * @throws
  111 + */
  112 + @RequestMapping(value = "/list", method = RequestMethod.GET)
  113 + public List<Object> findDirective(@RequestParam String nbbm,@RequestParam int dType
  114 + , @RequestParam(defaultValue = "0") int page,
  115 + @RequestParam(defaultValue = "10") int size){
  116 +
  117 + return directiveService.findDirective(nbbm, dType, page, size);
  118 + }
74 } 119 }
src/main/java/com/bsth/vehicle/directive/entity/Directive60.java
@@ -73,7 +73,7 @@ public class Directive60 { @@ -73,7 +73,7 @@ public class Directive60 {
73 private boolean isDispatch; 73 private boolean isDispatch;
74 74
75 /** 75 /**
76 - * 如果是调度指令,则关联到相关的班次 76 + * 相关联的班次
77 */ 77 */
78 @ManyToOne 78 @ManyToOne
79 private ScheduleRealInfo sch; 79 private ScheduleRealInfo sch;
@@ -84,9 +84,6 @@ public class Directive60 { @@ -84,9 +84,6 @@ public class Directive60 {
84 @ManyToOne 84 @ManyToOne
85 private SysUser sender; 85 private SysUser sender;
86 86
87 - @Transient  
88 - private boolean persistent;  
89 -  
90 @Embeddable 87 @Embeddable
91 public static class DirectiveData { 88 public static class DirectiveData {
92 // 公司代码 89 // 公司代码
@@ -283,12 +280,4 @@ public class Directive60 { @@ -283,12 +280,4 @@ public class Directive60 {
283 public void setSender(SysUser sender) { 280 public void setSender(SysUser sender) {
284 this.sender = sender; 281 this.sender = sender;
285 } 282 }
286 -  
287 - public boolean isPersistent() {  
288 - return persistent;  
289 - }  
290 -  
291 - public void setPersistent(boolean persistent) {  
292 - this.persistent = persistent;  
293 - }  
294 } 283 }
src/main/java/com/bsth/vehicle/directive/entity/LineChange.java renamed to src/main/java/com/bsth/vehicle/directive/entity/Directive64.java
@@ -17,7 +17,7 @@ import javax.persistence.Id; @@ -17,7 +17,7 @@ import javax.persistence.Id;
17 */ 17 */
18 @Entity 18 @Entity
19 @Table(name = "bsth_v_directive_64") 19 @Table(name = "bsth_v_directive_64")
20 -public class LineChange { 20 +public class Directive64 {
21 21
22 @Id 22 @Id
23 @GeneratedValue 23 @GeneratedValue
src/main/java/com/bsth/vehicle/directive/entity/Directive80.java
1 package com.bsth.vehicle.directive.entity; 1 package com.bsth.vehicle.directive.entity;
2 2
  3 +import javax.persistence.CascadeType;
3 import javax.persistence.Embeddable; 4 import javax.persistence.Embeddable;
4 import javax.persistence.Entity; 5 import javax.persistence.Entity;
  6 +import javax.persistence.FetchType;
5 import javax.persistence.GeneratedValue; 7 import javax.persistence.GeneratedValue;
6 import javax.persistence.Id; 8 import javax.persistence.Id;
7 import javax.persistence.NamedAttributeNode; 9 import javax.persistence.NamedAttributeNode;
@@ -52,8 +54,14 @@ public class Directive80 { @@ -52,8 +54,14 @@ public class Directive80 {
52 /** 54 /**
53 * c0 回复 55 * c0 回复
54 */ 56 */
55 - @OneToOne 57 + @OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
56 private DirectiveC0 c0; 58 private DirectiveC0 c0;
  59 +
  60 + /** 调度员是否确认 */
  61 + private boolean confirm;
  62 +
  63 + /** 处理结果 0:同意 -1:不同意 */
  64 + private int confirmRs;
57 65
58 @Embeddable 66 @Embeddable
59 public static class DriverReportData { 67 public static class DriverReportData {
@@ -160,4 +168,20 @@ public class Directive80 { @@ -160,4 +168,20 @@ public class Directive80 {
160 public void setC0(DirectiveC0 c0) { 168 public void setC0(DirectiveC0 c0) {
161 this.c0 = c0; 169 this.c0 = c0;
162 } 170 }
  171 +
  172 + public boolean isConfirm() {
  173 + return confirm;
  174 + }
  175 +
  176 + public void setConfirm(boolean confirm) {
  177 + this.confirm = confirm;
  178 + }
  179 +
  180 + public int getConfirmRs() {
  181 + return confirmRs;
  182 + }
  183 +
  184 + public void setConfirmRs(int confirmRs) {
  185 + this.confirmRs = confirmRs;
  186 + }
163 } 187 }
src/main/java/com/bsth/vehicle/directive/entity/DirectiveC0.java
@@ -4,7 +4,6 @@ import javax.persistence.Embeddable; @@ -4,7 +4,6 @@ import javax.persistence.Embeddable;
4 import javax.persistence.Entity; 4 import javax.persistence.Entity;
5 import javax.persistence.GeneratedValue; 5 import javax.persistence.GeneratedValue;
6 import javax.persistence.Id; 6 import javax.persistence.Id;
7 -import javax.persistence.OneToOne;  
8 import javax.persistence.Table; 7 import javax.persistence.Table;
9 8
10 /** 9 /**
src/main/java/com/bsth/vehicle/directive/repository/Directive60Repository.java
1 package com.bsth.vehicle.directive.repository; 1 package com.bsth.vehicle.directive.repository;
2 2
  3 +import java.util.List;
  4 +
  5 +import org.springframework.data.jpa.repository.Query;
3 import org.springframework.stereotype.Repository; 6 import org.springframework.stereotype.Repository;
4 7
5 import com.bsth.repository.BaseRepository; 8 import com.bsth.repository.BaseRepository;
@@ -8,4 +11,10 @@ import com.bsth.vehicle.directive.entity.Directive60; @@ -8,4 +11,10 @@ import com.bsth.vehicle.directive.entity.Directive60;
8 @Repository 11 @Repository
9 public interface Directive60Repository extends BaseRepository<Directive60, Integer>{ 12 public interface Directive60Repository extends BaseRepository<Directive60, Integer>{
10 13
  14 +
  15 + @Query("select d from Directive60 d where d.data.timestamp > ?1")
  16 + public List<Directive60> findByGtTime(Long ts);
  17 +
  18 + @Query(value = "SELECT IFNULL(num,0) as maxId from (SELECT MAX(msg_id) as num FROM bsth_v_directive_60) d", nativeQuery = true)
  19 + Integer maxMsgId();
11 } 20 }
src/main/java/com/bsth/vehicle/directive/repository/Directive80Repository.java
1 package com.bsth.vehicle.directive.repository; 1 package com.bsth.vehicle.directive.repository;
2 2
  3 +import java.util.List;
  4 +
3 import org.springframework.data.domain.Page; 5 import org.springframework.data.domain.Page;
4 import org.springframework.data.domain.Pageable; 6 import org.springframework.data.domain.Pageable;
5 import org.springframework.data.jpa.domain.Specification; 7 import org.springframework.data.jpa.domain.Specification;
6 import org.springframework.data.jpa.repository.EntityGraph; 8 import org.springframework.data.jpa.repository.EntityGraph;
  9 +import org.springframework.data.jpa.repository.Query;
7 import org.springframework.stereotype.Repository; 10 import org.springframework.stereotype.Repository;
8 11
9 import com.bsth.repository.BaseRepository; 12 import com.bsth.repository.BaseRepository;
@@ -15,4 +18,8 @@ public interface Directive80Repository extends BaseRepository&lt;Directive80, Integ @@ -15,4 +18,8 @@ public interface Directive80Repository extends BaseRepository&lt;Directive80, Integ
15 @EntityGraph(value = "directive80_c0", type = EntityGraph.EntityGraphType.FETCH) 18 @EntityGraph(value = "directive80_c0", type = EntityGraph.EntityGraphType.FETCH)
16 @Override 19 @Override
17 Page<Directive80> findAll(Specification<Directive80> spec, Pageable pageable); 20 Page<Directive80> findAll(Specification<Directive80> spec, Pageable pageable);
  21 +
  22 + @EntityGraph(value = "directive80_c0", type = EntityGraph.EntityGraphType.FETCH)
  23 + @Query("select d from Directive80 d where d.timestamp > ?1")
  24 + List<Directive80> findByGtTime(long timestamp);
18 } 25 }
src/main/java/com/bsth/vehicle/directive/repository/LineChangeRepository.java
@@ -3,9 +3,9 @@ package com.bsth.vehicle.directive.repository; @@ -3,9 +3,9 @@ package com.bsth.vehicle.directive.repository;
3 import org.springframework.stereotype.Repository; 3 import org.springframework.stereotype.Repository;
4 4
5 import com.bsth.repository.BaseRepository; 5 import com.bsth.repository.BaseRepository;
6 -import com.bsth.vehicle.directive.entity.LineChange; 6 +import com.bsth.vehicle.directive.entity.Directive64;
7 7
8 @Repository 8 @Repository
9 -public interface LineChangeRepository extends BaseRepository<LineChange, Integer>{ 9 +public interface LineChangeRepository extends BaseRepository<Directive64, Integer>{
10 10
11 } 11 }
src/main/java/com/bsth/vehicle/directive/service/DirectiveService.java
1 package com.bsth.vehicle.directive.service; 1 package com.bsth.vehicle.directive.service;
2 2
3 3
  4 +import java.util.List;
  5 +import java.util.Map;
  6 +
4 import com.bsth.entity.realcontrol.ScheduleRealInfo; 7 import com.bsth.entity.realcontrol.ScheduleRealInfo;
5 import com.bsth.service.BaseService; 8 import com.bsth.service.BaseService;
6 import com.bsth.vehicle.directive.entity.Directive60; 9 import com.bsth.vehicle.directive.entity.Directive60;
  10 +import com.bsth.vehicle.directive.entity.Directive80;
7 11
8 public interface DirectiveService extends BaseService<Directive60, Integer>{ 12 public interface DirectiveService extends BaseService<Directive60, Integer>{
9 13
@@ -38,7 +42,7 @@ public interface DirectiveService extends BaseService&lt;Directive60, Integer&gt;{ @@ -38,7 +42,7 @@ public interface DirectiveService extends BaseService&lt;Directive60, Integer&gt;{
38 int send60Dispatch(Long id); 42 int send60Dispatch(Long id);
39 43
40 //60营运指令 44 //60营运指令
41 - int send60Operation(String nbbm, int state, int upDown); 45 + int send60Operation(String nbbm, int state, int upDown, ScheduleRealInfo sch);
42 46
43 /** 47 /**
44 * 48 *
@@ -67,4 +71,10 @@ public interface DirectiveService extends BaseService&lt;Directive60, Integer&gt;{ @@ -67,4 +71,10 @@ public interface DirectiveService extends BaseService&lt;Directive60, Integer&gt;{
67 * @throws 71 * @throws
68 */ 72 */
69 void sendDirectiveToPage(ScheduleRealInfo sch); 73 void sendDirectiveToPage(ScheduleRealInfo sch);
  74 +
  75 + Map<String, List<Directive80>> findNoCofm80(String lineCodes);
  76 +
  77 + Map<String, Object> reply80(int id, int reply);
  78 +
  79 + List<Object> findDirective(String nbbm, int dType, int page, int size);
70 } 80 }
src/main/java/com/bsth/vehicle/directive/service/DirectiveServiceImpl.java
1 package com.bsth.vehicle.directive.service; 1 package com.bsth.vehicle.directive.service;
2 2
3 import java.text.SimpleDateFormat; 3 import java.text.SimpleDateFormat;
  4 +import java.util.Collections;
  5 +import java.util.Comparator;
4 import java.util.Date; 6 import java.util.Date;
5 import java.util.HashMap; 7 import java.util.HashMap;
  8 +import java.util.List;
6 import java.util.Map; 9 import java.util.Map;
7 10
8 import org.slf4j.Logger; 11 import org.slf4j.Logger;
@@ -12,6 +15,7 @@ import org.springframework.stereotype.Service; @@ -12,6 +15,7 @@ import org.springframework.stereotype.Service;
12 15
13 import com.alibaba.fastjson.JSON; 16 import com.alibaba.fastjson.JSON;
14 import com.alibaba.fastjson.JSONObject; 17 import com.alibaba.fastjson.JSONObject;
  18 +import com.bsth.common.ResponseCode;
15 import com.bsth.entity.realcontrol.ScheduleRealInfo; 19 import com.bsth.entity.realcontrol.ScheduleRealInfo;
16 import com.bsth.service.impl.BaseServiceImpl; 20 import com.bsth.service.impl.BaseServiceImpl;
17 import com.bsth.service.realcontrol.buffer.ScheduleBuffer; 21 import com.bsth.service.realcontrol.buffer.ScheduleBuffer;
@@ -21,14 +25,19 @@ import com.bsth.vehicle.directive.MsgIdGenerator; @@ -21,14 +25,19 @@ import com.bsth.vehicle.directive.MsgIdGenerator;
21 import com.bsth.vehicle.directive.buffer.DirectiveBuffer; 25 import com.bsth.vehicle.directive.buffer.DirectiveBuffer;
22 import com.bsth.vehicle.directive.entity.Directive60; 26 import com.bsth.vehicle.directive.entity.Directive60;
23 import com.bsth.vehicle.directive.entity.Directive60.DirectiveData; 27 import com.bsth.vehicle.directive.entity.Directive60.DirectiveData;
24 -import com.bsth.vehicle.directive.entity.LineChange;  
25 -import com.bsth.vehicle.directive.entity.LineChange.LineChangeData; 28 +import com.bsth.vehicle.directive.entity.DirectiveC0.DirectiveC0Data;
  29 +import com.bsth.vehicle.directive.entity.Directive80;
  30 +import com.bsth.vehicle.directive.entity.DirectiveC0;
  31 +import com.bsth.vehicle.directive.entity.Directive64;
  32 +import com.bsth.vehicle.directive.entity.Directive64.LineChangeData;
26 import com.bsth.vehicle.directive.repository.Directive60Repository; 33 import com.bsth.vehicle.directive.repository.Directive60Repository;
  34 +import com.bsth.vehicle.directive.repository.Directive80Repository;
27 import com.bsth.vehicle.directive.repository.LineChangeRepository; 35 import com.bsth.vehicle.directive.repository.LineChangeRepository;
28 import com.bsth.vehicle.directive.util.HttpUtils; 36 import com.bsth.vehicle.directive.util.HttpUtils;
29 import com.bsth.vehicle.gpsdata.buffer.GpsRealDataBuffer; 37 import com.bsth.vehicle.gpsdata.buffer.GpsRealDataBuffer;
30 import com.bsth.vehicle.gpsdata.entity.GpsRealData; 38 import com.bsth.vehicle.gpsdata.entity.GpsRealData;
31 import com.bsth.websocket.handler.RealControlSocketHandler; 39 import com.bsth.websocket.handler.RealControlSocketHandler;
  40 +import com.google.common.base.Splitter;
32 41
33 @Service 42 @Service
34 public class DirectiveServiceImpl extends BaseServiceImpl<Directive60, Integer> implements DirectiveService{ 43 public class DirectiveServiceImpl extends BaseServiceImpl<Directive60, Integer> implements DirectiveService{
@@ -47,6 +56,9 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt; @@ -47,6 +56,9 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt;
47 @Autowired 56 @Autowired
48 RealControlSocketHandler socketHandler; 57 RealControlSocketHandler socketHandler;
49 58
  59 + @Autowired
  60 + Directive80Repository d80Repository;
  61 +
50 SimpleDateFormat sdfHHmm = new SimpleDateFormat("HH点mm分"); 62 SimpleDateFormat sdfHHmm = new SimpleDateFormat("HH点mm分");
51 63
52 static Long schDiff = 1000 * 60 * 60L; 64 static Long schDiff = 1000 * 60 * 60L;
@@ -142,8 +154,24 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt; @@ -142,8 +154,24 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt;
142 } 154 }
143 155
144 @Override 156 @Override
145 - public int send60Operation(String nbbm, int state, int upDown) {  
146 - return 0; 157 + public int send60Operation(String nbbm, int state, int upDown, ScheduleRealInfo sch) {
  158 + logger.info("切换运营状态, nbbm: " + nbbm + " ,state: " + state + " ,upDown:" + upDown );
  159 +
  160 + Directive60 directive = createDirective60(nbbm, nbbm + "_" + upDown, (short) 0x03, upDown, state);
  161 +
  162 + if(null == directive)
  163 + return -1;
  164 + //发送指令
  165 + int code = HttpUtils.postJson(JSON.toJSONString(directive));
  166 + if(code == 0){
  167 + //添加到缓存,等待入库
  168 + if(null != sch)
  169 + directive.setSch(sch);
  170 + DirectiveBuffer.put(directive);
  171 + }else{
  172 + logger.error("send60Phrase error, code: " + code);
  173 + }
  174 + return code;
147 } 175 }
148 176
149 /** 177 /**
@@ -154,7 +182,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt; @@ -154,7 +182,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt;
154 Long t = System.currentTimeMillis(); 182 Long t = System.currentTimeMillis();
155 String deviceId = CommonMapped.vehicDeviceBiMap.inverse().get(nbbm); 183 String deviceId = CommonMapped.vehicDeviceBiMap.inverse().get(nbbm);
156 184
157 - LineChange change = new LineChange(); 185 + Directive64 change = new Directive64();
158 LineChangeData data = new LineChangeData(); 186 LineChangeData data = new LineChangeData();
159 data.setCityCode(cityCode); 187 data.setCityCode(cityCode);
160 data.setDeviceId(deviceId); 188 data.setDeviceId(deviceId);
@@ -180,14 +208,12 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt; @@ -180,14 +208,12 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt;
180 208
181 209
182 public Directive60 create60Data(String nbbm, String text, Short dispatchInstruct, ScheduleRealInfo sch){ 210 public Directive60 create60Data(String nbbm, String text, Short dispatchInstruct, ScheduleRealInfo sch){
183 - Long timestamp = System.currentTimeMillis();  
184 211
185 /*//向测试设备发送 212 /*//向测试设备发送
186 String deviceId = "ABCDFEGH"; 213 String deviceId = "ABCDFEGH";
187 Short company = 5;*/ 214 Short company = 5;*/
188 215
189 String deviceId = CommonMapped.vehicDeviceBiMap.inverse().get(nbbm); 216 String deviceId = CommonMapped.vehicDeviceBiMap.inverse().get(nbbm);
190 - Short company = Short.parseShort(CommonMapped.vehicCompanyMap.get(nbbm));  
191 if(null == deviceId){ 217 if(null == deviceId){
192 logger.error("没有设备号对照的车辆:" + nbbm); 218 logger.error("没有设备号对照的车辆:" + nbbm);
193 return null; 219 return null;
@@ -208,6 +234,14 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt; @@ -208,6 +234,14 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt;
208 state = 0; 234 state = 0;
209 } 235 }
210 236
  237 + return createDirective60(nbbm, text, dispatchInstruct, upDown, state);
  238 + }
  239 +
  240 + public Directive60 createDirective60(String nbbm, String text, Short dispatchInstruct,int upDown,int state){
  241 + Long timestamp = System.currentTimeMillis();
  242 +
  243 + Short company = Short.parseShort(CommonMapped.vehicCompanyMap.get(nbbm));
  244 + String deviceId = CommonMapped.vehicDeviceBiMap.inverse().get(nbbm);
211 245
212 int msgId = MsgIdGenerator.getMsgId(); 246 int msgId = MsgIdGenerator.getMsgId();
213 247
@@ -242,37 +276,10 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt; @@ -242,37 +276,10 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt;
242 276
243 @Override 277 @Override
244 public int upDownChange(String nbbm, Integer upDown) { 278 public int upDownChange(String nbbm, Integer upDown) {
245 - //构造数据  
246 - String deviceId = CommonMapped.vehicDeviceBiMap.inverse().get(nbbm);  
247 - Short company = Short.parseShort(CommonMapped.vehicCompanyMap.get(nbbm));  
248 - Long timestamp = System.currentTimeMillis();  
249 - int msgId = MsgIdGenerator.getMsgId();  
250 - Directive60 directive = new Directive60();  
251 - DirectiveData data = new DirectiveData();  
252 - //一级协议  
253 - directive.setOperCode((short) 0x60);  
254 - //设备号  
255 - directive.setDeviceId(deviceId);  
256 - //时间戳  
257 - directive.setTimestamp(timestamp);  
258 - directive.setMsgId(msgId);  
259 - //构造数据  
260 - data.setDeviceId(deviceId);  
261 - data.setDispatchInstruct((short)0x03);  
262 - data.setTimestamp(timestamp);  
263 - data.setCompanyCode(company);  
264 - data.setMsgId(msgId);  
265 - data.setTxtContent(nbbm + "_" + upDown);  
266 - directive.setData(data); 279 + /*Directive60 directive = createDirective60(nbbm, nbbm + "_" + upDown, (short) 0x03, upDown, 0);
267 280
268 - long serviceState;  
269 - try{  
270 - serviceState = Consts.SERVICE_STATE[upDown][0];  
271 - }catch(IndexOutOfBoundsException e){  
272 - logger.error("upDonw: " + upDown, e); 281 + if(null == directive)
273 return -1; 282 return -1;
274 - }  
275 - data.setServiceState(serviceState);  
276 283
277 int code = HttpUtils.postJson(JSON.toJSONString(directive)); 284 int code = HttpUtils.postJson(JSON.toJSONString(directive));
278 if(code == 0){ 285 if(code == 0){
@@ -280,8 +287,8 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt; @@ -280,8 +287,8 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt;
280 DirectiveBuffer.put(directive); 287 DirectiveBuffer.put(directive);
281 }else{ 288 }else{
282 logger.error("send60 upDownChange error, code: " + code); 289 logger.error("send60 upDownChange error, code: " + code);
283 - }  
284 - return code; 290 + }*/
  291 + return send60Operation(nbbm, 0, upDown, null);
285 } 292 }
286 293
287 /** 294 /**
@@ -312,4 +319,85 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt; @@ -312,4 +319,85 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;Directive60, Integer&gt;
312 319
313 return JSON.toJSONString(param); 320 return JSON.toJSONString(param);
314 } 321 }
  322 +
  323 + @Override
  324 + public Map<String, List<Directive80>> findNoCofm80(String lineCodes) {
  325 + List<String> lineList = Splitter.on(",").trimResults().splitToList(lineCodes);
  326 +
  327 + Map<String, List<Directive80>> rs = new HashMap<>();
  328 + for(String code : lineList){
  329 + rs.put(code, DirectiveBuffer.findNoCofm80(Integer.parseInt(code)));
  330 + }
  331 +
  332 + return rs;
  333 + }
  334 +
  335 + @Override
  336 + public Map<String, Object> reply80(int id, int reply) {
  337 + Map<String, Object> rs = new HashMap<>();
  338 +
  339 + Directive80 d80 = DirectiveBuffer.findById80(id);
  340 + if(null == d80){
  341 + rs.put("status", ResponseCode.ERROR);
  342 + rs.put("msg", "服务器没有找到对应数据!");
  343 + }
  344 + else if(d80.isConfirm()){
  345 + rs.put("status", ResponseCode.ERROR);
  346 + rs.put("msg", "该数据已经被处理了!");
  347 + }
  348 + else{
  349 + d80.setConfirm(true);
  350 + d80.setConfirmRs(reply);
  351 + //封装C0数据包并回复设备
  352 + DirectiveC0 c0 = new DirectiveC0();
  353 + c0.setDeviceId(d80.getDeviceId());
  354 + c0.setTimestamp(d80.getTimestamp());
  355 + c0.setOperCode((short) 0xC0);
  356 +
  357 + DirectiveC0Data data = new DirectiveC0Data();
  358 + data.setOperCode2((short) 0x86);
  359 + data.setRequestAck((short)(reply==0?0x06:0x15));
  360 +
  361 + c0.setData(data);
  362 +
  363 + d80.setC0(c0);
  364 + //入库
  365 + d80Repository.save(d80);
  366 +
  367 + int code = HttpUtils.postJson(JSON.toJSONString(c0));
  368 +
  369 + rs.put("status", ResponseCode.SUCCESS);
  370 + if(code != 0)
  371 + rs.put("msg", "发送C0响应指令到车载设备失败,但该操作已经被系统记录!");
  372 +
  373 + //通知页面
  374 + Map<String, Object> sockMap = new HashMap<>();
  375 + sockMap.put("fn", "d80Confirm");
  376 + sockMap.put("id", d80.getId());
  377 + socketHandler.sendMessageToLine(d80.getData().getLineId(), JSON.toJSONString(sockMap));
  378 + }
  379 +
  380 + return rs;
  381 + }
  382 +
  383 + @Override
  384 + public List<Object> findDirective(String nbbm, int dType, int page, int size) {
  385 + List<Object> list = null;
  386 + if(dType == -1){
  387 + list = DirectiveBuffer.findAll();
  388 + //时间倒序
  389 + Collections.sort(list, new DirectiveBuffer.DComparator());
  390 +
  391 + int count = list.size();
  392 + //分页
  393 + int s = page * size
  394 + ,e = s + size;
  395 +
  396 + if(e > count)
  397 + e = count;
  398 +
  399 + list.subList(s, e);
  400 + }
  401 + return list;
  402 + }
315 } 403 }
src/main/java/com/bsth/vehicle/directive/thread/DirectivePersistenceThread.java
@@ -38,7 +38,6 @@ public class DirectivePersistenceThread extends Thread{ @@ -38,7 +38,6 @@ public class DirectivePersistenceThread extends Thread{
38 if(null == directive) 38 if(null == directive)
39 break; 39 break;
40 40
41 - directive.setPersistent(true);  
42 directiveRepository.save(directive); 41 directiveRepository.save(directive);
43 } 42 }
44 } 43 }
src/main/java/com/bsth/vehicle/directive/thread/FirstScheduleIssuedThread.java
@@ -3,12 +3,18 @@ package com.bsth.vehicle.directive.thread; @@ -3,12 +3,18 @@ package com.bsth.vehicle.directive.thread;
3 import java.util.List; 3 import java.util.List;
4 import java.util.Set; 4 import java.util.Set;
5 5
  6 +import org.slf4j.Logger;
  7 +import org.slf4j.LoggerFactory;
6 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.factory.annotation.Autowired;
7 import org.springframework.stereotype.Component; 9 import org.springframework.stereotype.Component;
8 10
9 import com.bsth.entity.realcontrol.ScheduleRealInfo; 11 import com.bsth.entity.realcontrol.ScheduleRealInfo;
10 import com.bsth.service.realcontrol.buffer.ScheduleBuffer; 12 import com.bsth.service.realcontrol.buffer.ScheduleBuffer;
  13 +import com.bsth.vehicle.common.CommonMapped;
11 import com.bsth.vehicle.directive.service.DirectiveService; 14 import com.bsth.vehicle.directive.service.DirectiveService;
  15 +import com.bsth.vehicle.gpsdata.buffer.GpsRealDataBuffer;
  16 +import com.bsth.vehicle.gpsdata.entity.GpsRealData;
  17 +import com.google.common.collect.BiMap;
12 18
13 /** 19 /**
14 * 20 *
@@ -24,24 +30,47 @@ public class FirstScheduleIssuedThread extends Thread{ @@ -24,24 +30,47 @@ public class FirstScheduleIssuedThread extends Thread{
24 @Autowired 30 @Autowired
25 DirectiveService directiveService; 31 DirectiveService directiveService;
26 32
  33 + //最多提前一小时开始尝试切换首班车营运状态
  34 + final static long space = 1000 * 60 * 60 ;
  35 +
  36 + Logger logger = LoggerFactory.getLogger(this.getClass());
  37 +
27 @Override 38 @Override
28 public void run() { 39 public void run() {
29 40
30 Set<String> keys = ScheduleBuffer.carSchListMap.keySet(); 41 Set<String> keys = ScheduleBuffer.carSchListMap.keySet();
31 List<ScheduleRealInfo> list; 42 List<ScheduleRealInfo> list;
  43 + BiMap<String, String> nbbmToDeviceMap = CommonMapped.vehicDeviceBiMap.inverse();
32 44
33 Long t = System.currentTimeMillis(); 45 Long t = System.currentTimeMillis();
34 ScheduleRealInfo sch; 46 ScheduleRealInfo sch;
  47 +
  48 + GpsRealData gps;
35 for(String nbbm : keys){ 49 for(String nbbm : keys){
36 - list = ScheduleBuffer.carSchListMap.get(nbbm);  
37 -  
38 - if(list.size() == 0)  
39 - continue;  
40 -  
41 - sch = list.get(0);  
42 -  
43 - if(sch.getStatus() == 0 && sch.getFcsjT() > t){  
44 - directiveService.send60Dispatch(sch, 0); 50 + gps = GpsRealDataBuffer.findByDeviceId(nbbmToDeviceMap.get(nbbm));
  51 + //如果设备在线
  52 + if(null != gps && gps.isOnline()){
  53 + list = ScheduleBuffer.carSchListMap.get(nbbm);
  54 +
  55 + if(list.size() == 0)
  56 + continue;
  57 +
  58 + sch = list.get(0);
  59 +
  60 + if(sch.getOpDirectiveState()!= 100
  61 + && sch.getStatus() == 0
  62 + && Math.abs(sch.getFcsjT() - t) < space){
  63 +
  64 + /*if(sch.getDirectiveState() == -1){
  65 + //发送调度指令
  66 + directiveService.send60Dispatch(sch, 0);
  67 + }*/
  68 + logger.info("切换首班运营状态, " + sch.getClZbh());
  69 + //切换营运状态
  70 + directiveService.send60Operation(sch.getClZbh()
  71 + , 0, Integer.parseInt(sch.getXlDir())
  72 + , sch);
  73 + }
45 } 74 }
46 } 75 }
47 76
src/main/java/com/bsth/vehicle/gpsdata/GpsArrivalThread.java renamed to src/main/java/com/bsth/vehicle/gpsdata/ArrivalThread.java
@@ -16,12 +16,11 @@ import org.slf4j.LoggerFactory; @@ -16,12 +16,11 @@ import org.slf4j.LoggerFactory;
16 import org.springframework.beans.factory.annotation.Autowired; 16 import org.springframework.beans.factory.annotation.Autowired;
17 import org.springframework.stereotype.Component; 17 import org.springframework.stereotype.Component;
18 18
19 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
20 import com.bsth.util.DateUtils; 19 import com.bsth.util.DateUtils;
21 import com.bsth.util.db.DBUtils_MS; 20 import com.bsth.util.db.DBUtils_MS;
22 import com.bsth.vehicle.directive.service.DirectiveService; 21 import com.bsth.vehicle.directive.service.DirectiveService;
23 import com.bsth.vehicle.gpsdata.arrival.MatchService; 22 import com.bsth.vehicle.gpsdata.arrival.MatchService;
24 -import com.bsth.vehicle.gpsdata.buffer.GpsArrivalDataBuffer; 23 +import com.bsth.vehicle.gpsdata.buffer.ArrivalDataBuffer;
25 import com.bsth.vehicle.gpsdata.entity.ArrivalInfo; 24 import com.bsth.vehicle.gpsdata.entity.ArrivalInfo;
26 import com.bsth.websocket.handler.RealControlSocketHandler; 25 import com.bsth.websocket.handler.RealControlSocketHandler;
27 26
@@ -34,7 +33,7 @@ import com.bsth.websocket.handler.RealControlSocketHandler; @@ -34,7 +33,7 @@ import com.bsth.websocket.handler.RealControlSocketHandler;
34 * 33 *
35 */ 34 */
36 @Component 35 @Component
37 -public class GpsArrivalThread extends Thread{ 36 +public class ArrivalThread extends Thread{
38 37
39 Logger logger = LoggerFactory.getLogger(this.getClass()); 38 Logger logger = LoggerFactory.getLogger(this.getClass());
40 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 39 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
@@ -56,7 +55,7 @@ public class GpsArrivalThread extends Thread{ @@ -56,7 +55,7 @@ public class GpsArrivalThread extends Thread{
56 e.printStackTrace(); 55 e.printStackTrace();
57 } 56 }
58 //缓存 57 //缓存
59 - GpsArrivalDataBuffer.putAll(list); 58 + ArrivalDataBuffer.putAll(list);
60 59
61 //有新到离站数据的线路 60 //有新到离站数据的线路
62 Set<String> newSet = new HashSet<>(); 61 Set<String> newSet = new HashSet<>();
@@ -220,12 +219,13 @@ public class GpsArrivalThread extends Thread{ @@ -220,12 +219,13 @@ public class GpsArrivalThread extends Thread{
220 //周数,表分区字段 219 //周数,表分区字段
221 int weeks_year = cal.get(Calendar.WEEK_OF_YEAR); 220 int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
222 //按时间标记增量加载 221 //按时间标记增量加载
223 - if(null == GpsArrivalDataBuffer.markTime){ 222 + if(null == ArrivalDataBuffer.markTime){
224 //第一次从当天0点开始 223 //第一次从当天0点开始
225 - GpsArrivalDataBuffer.markTime = DateUtils.getTimesmorning() * 1000L; 224 + ArrivalDataBuffer.markTime = DateUtils.getTimesmorning() * 1000L;
226 } 225 }
227 226
228 - String sql = "select * from bsth_c_arrival_info where weeks_year=? and ts > ? order by ts"; 227 + Long t = System.currentTimeMillis();
  228 + String sql = "select * from bsth_c_arrival_info where weeks_year=? and create_timestamp > ? and create_timestamp <=? order by create_date";
229 229
230 List<ArrivalInfo> list = new ArrayList<>(); 230 List<ArrivalInfo> list = new ArrayList<>();
231 Connection conn = null; 231 Connection conn = null;
@@ -235,19 +235,21 @@ public class GpsArrivalThread extends Thread{ @@ -235,19 +235,21 @@ public class GpsArrivalThread extends Thread{
235 conn = DBUtils_MS.getConnection(); 235 conn = DBUtils_MS.getConnection();
236 ps = conn.prepareStatement(sql); 236 ps = conn.prepareStatement(sql);
237 ps.setInt(1, weeks_year/*30*/); 237 ps.setInt(1, weeks_year/*30*/);
238 - ps.setLong(2, GpsArrivalDataBuffer.markTime/*1461361377000L*/); 238 + ps.setLong(2, ArrivalDataBuffer.markTime/*1461361377000L*/);
  239 + ps.setLong(3, t/*30*/);
  240 +
239 241
240 - Long t = System.currentTimeMillis();  
241 rs = ps.executeQuery(); 242 rs = ps.executeQuery();
242 243
243 while(rs.next()){ 244 while(rs.next()){
244 list.add(new ArrivalInfo(rs.getString("device_id"), rs.getLong("ts"), rs.getString("line_id") 245 list.add(new ArrivalInfo(rs.getString("device_id"), rs.getLong("ts"), rs.getString("line_id")
245 - , rs.getInt("up_down"), rs.getString("stop_no"), rs.getInt("in_out"), rs.getDate("create_date"), rs.getInt("weeks_year"))); 246 + , rs.getInt("up_down"), rs.getString("stop_no"), rs.getInt("in_out"), rs.getLong("create_date")
  247 + , rs.getInt("weeks_year")));
246 } 248 }
247 249
248 - System.out.println("数量:" + list.size() + " ,markTime:" + GpsArrivalDataBuffer.markTime);  
249 - //重新打时间标记  
250 - GpsArrivalDataBuffer.markTime = t; 250 + logger.info("获取 到离站 数量:" + list.size() + ", st: " + ArrivalDataBuffer.markTime + " , et: " + t);
  251 + //时间戳标记
  252 + ArrivalDataBuffer.markTime = t;
251 253
252 } catch (Exception e) { 254 } catch (Exception e) {
253 logger.error("", e); 255 logger.error("", e);
@@ -264,10 +266,9 @@ public class GpsArrivalThread extends Thread{ @@ -264,10 +266,9 @@ public class GpsArrivalThread extends Thread{
264 * @Description: TODO(提取当前时间前后一小时的计划) 266 * @Description: TODO(提取当前时间前后一小时的计划)
265 * @param @param allList 267 * @param @param allList
266 * @throws 268 * @throws
267 - */ 269 +
268 public List<ScheduleRealInfo> extractSched(List<ScheduleRealInfo> allList){ 270 public List<ScheduleRealInfo> extractSched(List<ScheduleRealInfo> allList){
269 List<ScheduleRealInfo> subList = new ArrayList<>(); 271 List<ScheduleRealInfo> subList = new ArrayList<>();
270 - System.out.println("原计划:" + allList.size());  
271 Long t = System.currentTimeMillis(); 272 Long t = System.currentTimeMillis();
272 for(ScheduleRealInfo sch : allList){ 273 for(ScheduleRealInfo sch : allList){
273 if(Math.abs(sch.getFcsjT() - t) < rang 274 if(Math.abs(sch.getFcsjT() - t) < rang
@@ -275,7 +276,6 @@ public class GpsArrivalThread extends Thread{ @@ -275,7 +276,6 @@ public class GpsArrivalThread extends Thread{
275 subList.add(sch); 276 subList.add(sch);
276 } 277 }
277 } 278 }
278 - System.out.println("按时间提取:" + subList.size());  
279 return subList; 279 return subList;
280 - } 280 + } */
281 } 281 }
src/main/java/com/bsth/vehicle/gpsdata/GpsArrivalStationThread_old.java
@@ -23,7 +23,7 @@ import com.bsth.service.realcontrol.buffer.ScheduleBuffer; @@ -23,7 +23,7 @@ import com.bsth.service.realcontrol.buffer.ScheduleBuffer;
23 import com.bsth.util.DateUtils; 23 import com.bsth.util.DateUtils;
24 import com.bsth.util.db.DBUtils_MS; 24 import com.bsth.util.db.DBUtils_MS;
25 import com.bsth.vehicle.directive.service.DirectiveService; 25 import com.bsth.vehicle.directive.service.DirectiveService;
26 -import com.bsth.vehicle.gpsdata.buffer.GpsArrivalDataBuffer; 26 +import com.bsth.vehicle.gpsdata.buffer.ArrivalDataBuffer;
27 import com.bsth.vehicle.gpsdata.entity.ArrivalInfo; 27 import com.bsth.vehicle.gpsdata.entity.ArrivalInfo;
28 import com.bsth.websocket.handler.RealControlSocketHandler; 28 import com.bsth.websocket.handler.RealControlSocketHandler;
29 29
@@ -57,16 +57,16 @@ public class GpsArrivalStationThread_old extends Thread{ @@ -57,16 +57,16 @@ public class GpsArrivalStationThread_old extends Thread{
57 } catch (ParseException e) { 57 } catch (ParseException e) {
58 e.printStackTrace(); 58 e.printStackTrace();
59 } 59 }
60 - GpsArrivalDataBuffer.putAll(list); 60 + ArrivalDataBuffer.putAll(list);
61 //实际到离站和计划排班相匹配 61 //实际到离站和计划排班相匹配
62 62
63 - Set<String> keySet = GpsArrivalDataBuffer.allMap.keySet(); 63 + Set<String> keySet = ArrivalDataBuffer.allMap.keySet();
64 System.out.println("开始..."); 64 System.out.println("开始...");
65 List<ScheduleRealInfo> schList; 65 List<ScheduleRealInfo> schList;
66 for(String key : keySet){ 66 for(String key : keySet){
67 schList = extractSched(ScheduleBuffer.carSchListMap.get(key)); 67 schList = extractSched(ScheduleBuffer.carSchListMap.get(key));
68 if(null != schList) 68 if(null != schList)
69 - match(GpsArrivalDataBuffer.allMap.get(key), schList); 69 + match(ArrivalDataBuffer.allMap.get(key), schList);
70 } 70 }
71 System.out.println("结束..."); 71 System.out.println("结束...");
72 } 72 }
@@ -207,9 +207,9 @@ public class GpsArrivalStationThread_old extends Thread{ @@ -207,9 +207,9 @@ public class GpsArrivalStationThread_old extends Thread{
207 //周数,表分区字段 207 //周数,表分区字段
208 int weeks_year = cal.get(Calendar.WEEK_OF_YEAR); 208 int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
209 //按时间标记增量加载 209 //按时间标记增量加载
210 - if(null == GpsArrivalDataBuffer.markTime){ 210 + if(null == ArrivalDataBuffer.markTime){
211 //第一次从当天0点开始 211 //第一次从当天0点开始
212 - GpsArrivalDataBuffer.markTime = DateUtils.getTimesmorning() * 1000L; 212 + ArrivalDataBuffer.markTime = DateUtils.getTimesmorning() * 1000L;
213 } 213 }
214 214
215 String sql = "select * from bsth_c_arrival_info where weeks_year=? and create_date > ? order by ts"; 215 String sql = "select * from bsth_c_arrival_info where weeks_year=? and create_date > ? order by ts";
@@ -222,18 +222,18 @@ public class GpsArrivalStationThread_old extends Thread{ @@ -222,18 +222,18 @@ public class GpsArrivalStationThread_old extends Thread{
222 conn = DBUtils_MS.getConnection(); 222 conn = DBUtils_MS.getConnection();
223 ps = conn.prepareStatement(sql); 223 ps = conn.prepareStatement(sql);
224 ps.setInt(1, weeks_year); 224 ps.setInt(1, weeks_year);
225 - ps.setLong(2, GpsArrivalDataBuffer.markTime); 225 + ps.setLong(2, ArrivalDataBuffer.markTime);
226 226
227 Long t = System.currentTimeMillis(); 227 Long t = System.currentTimeMillis();
228 rs = ps.executeQuery(); 228 rs = ps.executeQuery();
229 229
230 while(rs.next()){ 230 while(rs.next()){
231 list.add(new ArrivalInfo(rs.getString("device_id"), rs.getLong("ts"), rs.getString("line_id") 231 list.add(new ArrivalInfo(rs.getString("device_id"), rs.getLong("ts"), rs.getString("line_id")
232 - , rs.getInt("up_down"), rs.getString("stop_no"), rs.getInt("in_out"), rs.getDate("create_date"), rs.getInt("weeks_year"))); 232 + , rs.getInt("up_down"), rs.getString("stop_no"), rs.getInt("in_out"), rs.getLong("create_date"), rs.getInt("weeks_year")));
233 } 233 }
234 234
235 //重新打时间标记 235 //重新打时间标记
236 - GpsArrivalDataBuffer.markTime = t; 236 + ArrivalDataBuffer.markTime = t;
237 237
238 } catch (Exception e) { 238 } catch (Exception e) {
239 logger.error("", e); 239 logger.error("", e);
src/main/java/com/bsth/vehicle/gpsdata/GpsOfflineMonitorThread.java 0 → 100644
  1 +package com.bsth.vehicle.gpsdata;
  2 +
  3 +import java.util.Collection;
  4 +
  5 +import org.slf4j.Logger;
  6 +import org.slf4j.LoggerFactory;
  7 +import org.springframework.stereotype.Component;
  8 +
  9 +import com.bsth.vehicle.gpsdata.buffer.GpsRealDataBuffer;
  10 +import com.bsth.vehicle.gpsdata.entity.GpsRealData;
  11 +
  12 +/**
  13 + *
  14 + * @ClassName: GpsOfflineMonitorThread
  15 + * @Description: TODO(GPS 掉线监控)
  16 + * @author PanZhao
  17 + * @date 2016年7月29日 上午1:03:29
  18 + *
  19 + */
  20 +@Component
  21 +public class GpsOfflineMonitorThread extends Thread{
  22 +
  23 + Logger logger = LoggerFactory.getLogger(this.getClass());
  24 +
  25 + @Override
  26 + public void run() {
  27 +
  28 + long t = System.currentTimeMillis();
  29 + Collection<GpsRealData> allGps = GpsRealDataBuffer.allGps();
  30 +
  31 + for(GpsRealData gps : allGps){
  32 + if(t - gps.getTimestamp()
  33 + > GpsRealDataBuffer.OFFLINE_TIME){
  34 + gps.setOnline(false);
  35 + logger.info("设备:" + gps.getDeviceId() + " 掉线");
  36 + }
  37 + }
  38 + }
  39 +}
src/main/java/com/bsth/vehicle/gpsdata/GpsRefreshThread.java renamed to src/main/java/com/bsth/vehicle/gpsdata/GpsRealDataRefreshThread.java
@@ -33,15 +33,15 @@ import com.google.common.collect.ImmutableMap; @@ -33,15 +33,15 @@ import com.google.common.collect.ImmutableMap;
33 * 33 *
34 */ 34 */
35 @Component 35 @Component
36 -public class GpsRefreshThread extends Thread{ 36 +public class GpsRealDataRefreshThread extends Thread{
37 37
38 - private static Logger logger = LoggerFactory.getLogger(GpsRefreshThread.class); 38 + private static Logger logger = LoggerFactory.getLogger(GpsRealDataRefreshThread.class);
39 39
40 //接口地址 40 //接口地址
41 private static String url; 41 private static String url;
42 42
43 43
44 - public GpsRefreshThread() { 44 + public GpsRealDataRefreshThread() {
45 url = ConfigUtil.get("http.gps.real.url"); 45 url = ConfigUtil.get("http.gps.real.url");
46 } 46 }
47 47
@@ -51,7 +51,7 @@ public class GpsRefreshThread extends Thread{ @@ -51,7 +51,7 @@ public class GpsRefreshThread extends Thread{
51 @Override 51 @Override
52 public void run() { 52 public void run() {
53 try{ 53 try{
54 - Long t = System.currentTimeMillis(); 54 + //Long t = System.currentTimeMillis();
55 List<GpsRealData> newList = getterRealGpsData(); 55 List<GpsRealData> newList = getterRealGpsData();
56 56
57 if(gpsBuffer.isNullEmpty()) 57 if(gpsBuffer.isNullEmpty())
@@ -82,7 +82,7 @@ public class GpsRefreshThread extends Thread{ @@ -82,7 +82,7 @@ public class GpsRefreshThread extends Thread{
82 gpsBuffer.setLastUpdateTime(System.currentTimeMillis()); 82 gpsBuffer.setLastUpdateTime(System.currentTimeMillis());
83 } 83 }
84 84
85 - logger.info("本次刷新GPS实时数据耗时:" + (System.currentTimeMillis() - t) + "毫秒"); 85 + //logger.info("本次刷新GPS实时数据耗时:" + (System.currentTimeMillis() - t) + "毫秒");
86 }catch(Exception e){ 86 }catch(Exception e){
87 //logger.error("", e); 87 //logger.error("", e);
88 logger.error("加载gps数据失败," + e.getMessage()); 88 logger.error("加载gps数据失败," + e.getMessage());
src/main/java/com/bsth/vehicle/gpsdata/arrival/ThreadPoolTask.java
@@ -6,7 +6,7 @@ import java.util.Set; @@ -6,7 +6,7 @@ import java.util.Set;
6 import com.bsth.entity.realcontrol.ScheduleRealInfo; 6 import com.bsth.entity.realcontrol.ScheduleRealInfo;
7 import com.bsth.service.realcontrol.buffer.ScheduleBuffer; 7 import com.bsth.service.realcontrol.buffer.ScheduleBuffer;
8 import com.bsth.vehicle.gpsdata.arrival.match.ScheduleRealMatcher; 8 import com.bsth.vehicle.gpsdata.arrival.match.ScheduleRealMatcher;
9 -import com.bsth.vehicle.gpsdata.buffer.GpsArrivalDataBuffer; 9 +import com.bsth.vehicle.gpsdata.buffer.ArrivalDataBuffer;
10 import com.google.common.collect.ArrayListMultimap; 10 import com.google.common.collect.ArrayListMultimap;
11 11
12 public class ThreadPoolTask implements Runnable { 12 public class ThreadPoolTask implements Runnable {
@@ -34,8 +34,7 @@ public class ThreadPoolTask implements Runnable { @@ -34,8 +34,7 @@ public class ThreadPoolTask implements Runnable {
34 Set<String> ks = alMap.keySet(); 34 Set<String> ks = alMap.keySet();
35 35
36 for(String nbbm : ks){ 36 for(String nbbm : ks){
37 -  
38 - srMatcher = new ScheduleRealMatcher(alMap.get(nbbm), GpsArrivalDataBuffer.pops(nbbm)); 37 + srMatcher = new ScheduleRealMatcher(alMap.get(nbbm), ArrivalDataBuffer.pops(nbbm));
39 38
40 //在这里应用各种匹配规则 39 //在这里应用各种匹配规则
41 srMatcher 40 srMatcher
src/main/java/com/bsth/vehicle/gpsdata/arrival/match/ScheduleRealMatcher.java
@@ -6,11 +6,11 @@ import java.util.Collections; @@ -6,11 +6,11 @@ import java.util.Collections;
6 import java.util.Comparator; 6 import java.util.Comparator;
7 import java.util.Date; 7 import java.util.Date;
8 import java.util.HashMap; 8 import java.util.HashMap;
9 -import java.util.HashSet;  
10 import java.util.List; 9 import java.util.List;
11 import java.util.Map; 10 import java.util.Map;
12 -import java.util.Set;  
13 11
  12 +import org.slf4j.Logger;
  13 +import org.slf4j.LoggerFactory;
14 import org.springframework.beans.BeansException; 14 import org.springframework.beans.BeansException;
15 import org.springframework.context.ApplicationContext; 15 import org.springframework.context.ApplicationContext;
16 import org.springframework.context.ApplicationContextAware; 16 import org.springframework.context.ApplicationContextAware;
@@ -56,8 +56,10 @@ public class ScheduleRealMatcher implements ApplicationContextAware{ @@ -56,8 +56,10 @@ public class ScheduleRealMatcher implements ApplicationContextAware{
56 56
57 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 57 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
58 58
  59 + Logger logger = LoggerFactory.getLogger(ScheduleRealMatcher.class);
  60 +
59 //最大班次间隔 61 //最大班次间隔
60 - int maxBcsj = 0; 62 + //int maxBcsj = 0;
61 63
62 public ScheduleRealMatcher(){} 64 public ScheduleRealMatcher(){}
63 65
@@ -68,7 +70,7 @@ public class ScheduleRealMatcher implements ApplicationContextAware{ @@ -68,7 +70,7 @@ public class ScheduleRealMatcher implements ApplicationContextAware{
68 Collections.sort(schs, new Comparator<ScheduleRealInfo>() { 70 Collections.sort(schs, new Comparator<ScheduleRealInfo>() {
69 @Override 71 @Override
70 public int compare(ScheduleRealInfo s1, ScheduleRealInfo s2) { 72 public int compare(ScheduleRealInfo s1, ScheduleRealInfo s2) {
71 - return (int) (s1.getFcsjT() - s2.getFcsjT()); 73 + return (int) (s1.getDfsjT() - s2.getDfsjT());
72 } 74 }
73 }); 75 });
74 76
@@ -89,9 +91,9 @@ public class ScheduleRealMatcher implements ApplicationContextAware{ @@ -89,9 +91,9 @@ public class ScheduleRealMatcher implements ApplicationContextAware{
89 } 91 }
90 92
91 for(ScheduleRealInfo sch : schs){ 93 for(ScheduleRealInfo sch : schs){
92 - if(sch.getBcsj() != null && sch.getBcsj() > maxBcsj){ 94 + /*if(sch.getBcsj() != null && sch.getBcsj() > maxBcsj){
93 maxBcsj = sch.getBcsj(); 95 maxBcsj = sch.getBcsj();
94 - } 96 + }*/
95 97
96 if(sch.getSjfcModel() == null) 98 if(sch.getSjfcModel() == null)
97 sch.setSjfcModel(new RealTimeModel(sch.getQdzCode(), 1)); 99 sch.setSjfcModel(new RealTimeModel(sch.getQdzCode(), 1));
@@ -107,7 +109,7 @@ public class ScheduleRealMatcher implements ApplicationContextAware{ @@ -107,7 +109,7 @@ public class ScheduleRealMatcher implements ApplicationContextAware{
107 * @throws 109 * @throws
108 */ 110 */
109 public ScheduleRealMatcher timeClosest(){ 111 public ScheduleRealMatcher timeClosest(){
110 - TimeClosestGPS.match(schs, inArrivals, outArrivals, maxBcsj); 112 + TimeClosestGPS.match(schs, inArrivals, outArrivals);
111 return this; 113 return this;
112 } 114 }
113 115
@@ -119,6 +121,7 @@ public class ScheduleRealMatcher implements ApplicationContextAware{ @@ -119,6 +121,7 @@ public class ScheduleRealMatcher implements ApplicationContextAware{
119 */ 121 */
120 public void matchEnd(){ 122 public void matchEnd(){
121 123
  124 + int finish , upDown;
122 for(ScheduleRealInfo sch : schs){ 125 for(ScheduleRealInfo sch : schs){
123 //按 RealTimeModel 的优先级赋予班次实际时间 126 //按 RealTimeModel 的优先级赋予班次实际时间
124 //起点发出 127 //起点发出
@@ -151,10 +154,19 @@ public class ScheduleRealMatcher implements ApplicationContextAware{ @@ -151,10 +154,19 @@ public class ScheduleRealMatcher implements ApplicationContextAware{
151 sendFcsj(sch.getTwins());//推送到页面 154 sendFcsj(sch.getTwins());//推送到页面
152 } 155 }
153 156
154 - int finish = ScheduleBuffer.getFinishSchNo(sch.getClZbh()); 157 + finish = ScheduleBuffer.getFinishSchNo(sch.getClZbh());
  158 + upDown = Integer.parseInt(sch.getXlDir());
155 if(nextSch != null){ 159 if(nextSch != null){
156 //发送下一班次的调度指令 160 //发送下一班次的调度指令
157 directiveService.send60Dispatch(nextSch, finish); 161 directiveService.send60Dispatch(nextSch, finish);
  162 + //切换下一个班次的走向
  163 + logger.info(sch.getClZbh() + " 切换下一班次走向");
  164 + directiveService.send60Operation(nextSch.getClZbh(), 0, upDown, nextSch);
  165 + }
  166 + else{
  167 + //没有下一个班次了,切换为非营运状态
  168 + logger.info(sch.getClZbh() + " 完成所有班次,切换为非营运状态");
  169 + directiveService.send60Operation(sch.getClZbh(), 1, upDown, sch);
158 } 170 }
159 171
160 sendZdsj(sch, nextSch, finish);//推送到页面 172 sendZdsj(sch, nextSch, finish);//推送到页面
@@ -186,7 +198,8 @@ public class ScheduleRealMatcher implements ApplicationContextAware{ @@ -186,7 +198,8 @@ public class ScheduleRealMatcher implements ApplicationContextAware{
186 try{ 198 try{
187 socketHandler.sendMessageToLine(Integer.parseInt(schedule.getXlBm()), mapper.writeValueAsString(map)); 199 socketHandler.sendMessageToLine(Integer.parseInt(schedule.getXlBm()), mapper.writeValueAsString(map));
188 }catch(Exception e){ 200 }catch(Exception e){
189 - e.printStackTrace(); 201 + //e.printStackTrace();
  202 + logger.error("", e);
190 } 203 }
191 } 204 }
192 205
@@ -218,7 +231,8 @@ public class ScheduleRealMatcher implements ApplicationContextAware{ @@ -218,7 +231,8 @@ public class ScheduleRealMatcher implements ApplicationContextAware{
218 try{ 231 try{
219 socketHandler.sendMessageToLine(Integer.parseInt(schedule.getXlBm()), mapper.writeValueAsString(map)); 232 socketHandler.sendMessageToLine(Integer.parseInt(schedule.getXlBm()), mapper.writeValueAsString(map));
220 }catch(Exception e){ 233 }catch(Exception e){
221 - e.printStackTrace(); 234 + //e.printStackTrace();
  235 + logger.error("", e);
222 } 236 }
223 } 237 }
224 238
src/main/java/com/bsth/vehicle/gpsdata/arrival/match/TimeClosestGPS.java
@@ -22,31 +22,36 @@ public class TimeClosestGPS { @@ -22,31 +22,36 @@ public class TimeClosestGPS {
22 static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 22 static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
23 23
24 public static void match(List<ScheduleRealInfo> schs, 24 public static void match(List<ScheduleRealInfo> schs,
25 - List<ArrivalInfo> inList, List<ArrivalInfo> outList, int maxBcsj) { 25 + List<ArrivalInfo> inList, List<ArrivalInfo> outList/*, int maxBcsj*/) {
26 26
27 //班次ID 和 离站数据 一对一映射 27 //班次ID 和 离站数据 一对一映射
28 BiMap<Long, String> outBiMap = HashBiMap.create(); 28 BiMap<Long, String> outBiMap = HashBiMap.create();
29 //班次ID 和 到站数据 一对一映射 29 //班次ID 和 到站数据 一对一映射
30 BiMap<Long, String> inBiMap = HashBiMap.create(); 30 BiMap<Long, String> inBiMap = HashBiMap.create();
31 31
32 - Long spaceTime = maxBcsj * 60 * 1000 * 2L; 32 + Long spaceTime = /*maxBcsj * 60 * 1000 * 2L*/ 1000 * 60 * 60 * 1L;
33 33
34 RealTimeModel sjfcModel, sjddModel; 34 RealTimeModel sjfcModel, sjddModel;
35 for(ScheduleRealInfo sch : schs){ 35 for(ScheduleRealInfo sch : schs){
36 36
  37 + if(sch.getClZbh().equals("B-91163")){
  38 + System.out.println("debugger...");
  39 + }
  40 +
37 sjfcModel = sch.getSjfcModel(); 41 sjfcModel = sch.getSjfcModel();
38 sjddModel = sch.getSjddModel(); 42 sjddModel = sch.getSjddModel();
39 43
40 //起点发出 44 //起点发出
41 for(ArrivalInfo outArr : outList){ 45 for(ArrivalInfo outArr : outList){
42 - if(sjfcModel.getStation().equals(outArr.getStopNo()) 46 + if((sch.getQdzCode().equals(outArr.getStopNo())/* || sch.getQdzName().equals(outArr.getStopName())*/)
43 && Math.abs(sch.getFcsjT() - outArr.getTs()) < spaceTime){ 47 && Math.abs(sch.getFcsjT() - outArr.getTs()) < spaceTime){
44 48
45 //如果这个实际发车已经被之前班次关联 49 //如果这个实际发车已经被之前班次关联
46 - if(outBiMap.inverse().get(outArr.getId()) != null) 50 + if(outBiMap.inverse().get(outArr.getId()) != null
  51 + || outBiMap.get(sch.getId()) != null)
47 continue; 52 continue;
48 53
49 - //System.out.println("实际起点发出,计划时间:" + sch.getFcsj() + " -实际时间:" + sdf.format(new Date(outArr.getTs())) + " -" + outArr.getTs()); 54 +
50 sjfcModel.setGpsTime(outArr.getTs()); 55 sjfcModel.setGpsTime(outArr.getTs());
51 outBiMap.put(sch.getId(), outArr.getId()); 56 outBiMap.put(sch.getId(), outArr.getId());
52 } 57 }
@@ -57,13 +62,13 @@ public class TimeClosestGPS { @@ -57,13 +62,13 @@ public class TimeClosestGPS {
57 continue; 62 continue;
58 //终点到达 63 //终点到达
59 for(ArrivalInfo inArr : inList){ 64 for(ArrivalInfo inArr : inList){
60 - if(sjddModel.getStation().equals(inArr.getStopNo()) 65 + if((sch.getZdzCode().equals(inArr.getStopNo())/* || sch.getZdzName().equals(inArr.getStopName())*/)
61 && Math.abs(sch.getZdsjT() - inArr.getTs()) < spaceTime){ 66 && Math.abs(sch.getZdsjT() - inArr.getTs()) < spaceTime){
62 //如果这个实际发车已经被之前班次关联 67 //如果这个实际发车已经被之前班次关联
63 - if(inBiMap.inverse().get(inArr.getId()) != null) 68 + if(inBiMap.inverse().get(inArr.getId()) != null
  69 + || inBiMap.get(sch.getId()) != null)
64 continue; 70 continue;
65 71
66 - //System.out.println("实际到达终点,计划时间:" + sch.getZdsj() + " -实际时间:" + sdf.format(new Date(inArr.getTs())) + " -" + inArr.getTs());  
67 sjddModel.setGpsTime(inArr.getTs()); 72 sjddModel.setGpsTime(inArr.getTs());
68 inBiMap.put(sch.getId(), inArr.getId()); 73 inBiMap.put(sch.getId(), inArr.getId());
69 } 74 }
src/main/java/com/bsth/vehicle/gpsdata/buffer/GpsArrivalDataBuffer.java renamed to src/main/java/com/bsth/vehicle/gpsdata/buffer/ArrivalDataBuffer.java
@@ -19,7 +19,7 @@ import com.google.common.collect.ArrayListMultimap; @@ -19,7 +19,7 @@ import com.google.common.collect.ArrayListMultimap;
19 * @date 2016年6月27日 下午1:08:35 19 * @date 2016年6月27日 下午1:08:35
20 * 20 *
21 */ 21 */
22 -public class GpsArrivalDataBuffer { 22 +public class ArrivalDataBuffer {
23 23
24 /** 24 /**
25 * 车辆 时间戳排序的实际进出站 25 * 车辆 时间戳排序的实际进出站
@@ -69,7 +69,7 @@ public class GpsArrivalDataBuffer { @@ -69,7 +69,7 @@ public class GpsArrivalDataBuffer {
69 Collections.sort(list, new Comparator<ArrivalInfo>() { 69 Collections.sort(list, new Comparator<ArrivalInfo>() {
70 @Override 70 @Override
71 public int compare(ArrivalInfo o1, ArrivalInfo o2) { 71 public int compare(ArrivalInfo o1, ArrivalInfo o2) {
72 - return (int) (o1.getTs() - o2.getTs()); 72 + return (int) (o1.getCreateDate() - o2.getCreateDate());
73 } 73 }
74 }); 74 });
75 75
@@ -84,4 +84,15 @@ public class GpsArrivalDataBuffer { @@ -84,4 +84,15 @@ public class GpsArrivalDataBuffer {
84 allMap.put(nbbm, arrival); 84 allMap.put(nbbm, arrival);
85 } 85 }
86 } 86 }
  87 +
  88 + /**
  89 + *
  90 + * @Title: clear
  91 + * @Description: TODO(清除缓存)
  92 + * @throws
  93 + */
  94 + public static void clear(){
  95 + allMap = ArrayListMultimap.create();
  96 + markMap = new HashMap<>();
  97 + }
87 } 98 }
src/main/java/com/bsth/vehicle/gpsdata/buffer/GpsRealDataBuffer.java
1 package com.bsth.vehicle.gpsdata.buffer; 1 package com.bsth.vehicle.gpsdata.buffer;
2 2
3 import java.util.ArrayList; 3 import java.util.ArrayList;
  4 +import java.util.Collection;
4 import java.util.HashMap; 5 import java.util.HashMap;
5 import java.util.Iterator; 6 import java.util.Iterator;
6 import java.util.List; 7 import java.util.List;
@@ -49,6 +50,11 @@ public class GpsRealDataBuffer { @@ -49,6 +50,11 @@ public class GpsRealDataBuffer {
49 */ 50 */
50 private static Long lastUpdateTime; 51 private static Long lastUpdateTime;
51 52
  53 + /**
  54 + * 10分钟没有信号则认为掉线
  55 + */
  56 + public final static long OFFLINE_TIME = 1000 * 60 * 10;
  57 +
52 58
53 public boolean isNullEmpty(){ 59 public boolean isNullEmpty(){
54 return deviceGpsMap == null; 60 return deviceGpsMap == null;
@@ -93,9 +99,15 @@ public class GpsRealDataBuffer { @@ -93,9 +99,15 @@ public class GpsRealDataBuffer {
93 * @throws 99 * @throws
94 */ 100 */
95 public void updateBuffer(Set<Integer> upLines, List<GpsRealData> upGpsList){ 101 public void updateBuffer(Set<Integer> upLines, List<GpsRealData> upGpsList){
  102 + long t = System.currentTimeMillis();
96 103
97 //更新GPS点 104 //更新GPS点
98 for(GpsRealData newGps : upGpsList){ 105 for(GpsRealData newGps : upGpsList){
  106 + if(t - newGps.getTimestamp() < OFFLINE_TIME){
  107 + logger.info("设备:" + newGps.getDeviceId() + " 上线");
  108 + newGps.setOnline(true);
  109 + }
  110 +
99 deviceGpsMap.put(newGps.getDeviceId(), newGps); 111 deviceGpsMap.put(newGps.getDeviceId(), newGps);
100 } 112 }
101 113
@@ -143,16 +155,25 @@ public class GpsRealDataBuffer { @@ -143,16 +155,25 @@ public class GpsRealDataBuffer {
143 gpsData.setStationName(CommonMapped.stationCodeMap.get(gpsData.getStopNo())); 155 gpsData.setStationName(CommonMapped.stationCodeMap.get(gpsData.getStopNo()));
144 156
145 current = ScheduleBuffer.findCurrent(nbbm); 157 current = ScheduleBuffer.findCurrent(nbbm);
146 - if(null == current){ 158 +
  159 + if(null != current){
  160 + gpsData.setCurrSchId(current.getId());
  161 +
  162 + next = ScheduleBuffer.getNext(current);
  163 + if(next != null)
  164 + gpsData.setNextSchId(next.getId());
  165 +
  166 + }
  167 + /*if(null == current){
147 next = ScheduleBuffer.getFirst(nbbm); 168 next = ScheduleBuffer.getFirst(nbbm);
148 } 169 }
149 else 170 else
150 - next = ScheduleBuffer.getNext(current); 171 + next = ScheduleBuffer.getNext(current);*/
151 172
152 - if(current != null) 173 + /*if(current != null)
153 gpsData.setCurrSchId(current.getId()); 174 gpsData.setCurrSchId(current.getId());
154 if(next != null) 175 if(next != null)
155 - gpsData.setNextSchId(next.getId()); 176 + gpsData.setNextSchId(next.getId());*/
156 //gpsData.setCurrSchId(ScheduleBuffer.findCurrent(nbbm)); 177 //gpsData.setCurrSchId(ScheduleBuffer.findCurrent(nbbm));
157 /*subList = ScheduleBuffer.vehSchListMap.get(nbbm); 178 /*subList = ScheduleBuffer.vehSchListMap.get(nbbm);
158 if(subList.size() == 0) 179 if(subList.size() == 0)
@@ -206,4 +227,12 @@ public class GpsRealDataBuffer { @@ -206,4 +227,12 @@ public class GpsRealDataBuffer {
206 public Long getLastUpdateTime(){ 227 public Long getLastUpdateTime(){
207 return lastUpdateTime; 228 return lastUpdateTime;
208 } 229 }
  230 +
  231 + public static Collection<GpsRealData> allGps(){
  232 + return lineGpsMultimap.values();
  233 + }
  234 +
  235 + public static GpsRealData findByDeviceId(String deviceId){
  236 + return deviceGpsMap.get(deviceId);
  237 + }
209 } 238 }
src/main/java/com/bsth/vehicle/gpsdata/controller/GpsDataController.java
@@ -9,7 +9,9 @@ import org.springframework.web.bind.annotation.RequestMapping; @@ -9,7 +9,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
9 import org.springframework.web.bind.annotation.RequestParam; 9 import org.springframework.web.bind.annotation.RequestParam;
10 import org.springframework.web.bind.annotation.RestController; 10 import org.springframework.web.bind.annotation.RestController;
11 11
  12 +import com.bsth.vehicle.gpsdata.buffer.ArrivalDataBuffer;
12 import com.bsth.vehicle.gpsdata.buffer.GpsRealDataBuffer; 13 import com.bsth.vehicle.gpsdata.buffer.GpsRealDataBuffer;
  14 +import com.bsth.vehicle.gpsdata.entity.ArrivalInfo;
13 import com.bsth.vehicle.gpsdata.entity.GpsRealData; 15 import com.bsth.vehicle.gpsdata.entity.GpsRealData;
14 import com.bsth.vehicle.gpsdata.service.GpsDataService; 16 import com.bsth.vehicle.gpsdata.service.GpsDataService;
15 import com.google.common.base.Splitter; 17 import com.google.common.base.Splitter;
@@ -55,4 +57,9 @@ public class GpsDataController { @@ -55,4 +57,9 @@ public class GpsDataController {
55 ,@RequestParam Long et){ 57 ,@RequestParam Long et){
56 return gpsDataService.history(nbbmArray, st, et); 58 return gpsDataService.history(nbbmArray, st, et);
57 } 59 }
  60 +
  61 + @RequestMapping(value = "/arrival/ram")
  62 + public List<ArrivalInfo> ramData(@RequestParam String nbbm){
  63 + return ArrivalDataBuffer.allMap.get(nbbm);
  64 + }
58 } 65 }
src/main/java/com/bsth/vehicle/gpsdata/entity/ArrivalInfo.java
1 package com.bsth.vehicle.gpsdata.entity; 1 package com.bsth.vehicle.gpsdata.entity;
2 2
3 -import java.text.SimpleDateFormat;  
4 -import java.util.Date;  
5 -  
6 -import javax.persistence.Transient; 3 +import com.bsth.vehicle.common.CommonMapped;
7 4
8 /** 5 /**
9 * 6 *
@@ -15,21 +12,10 @@ import javax.persistence.Transient; @@ -15,21 +12,10 @@ import javax.persistence.Transient;
15 */ 12 */
16 public class ArrivalInfo { 13 public class ArrivalInfo {
17 14
18 - @Transient  
19 - static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss")  
20 - ,sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
21 -  
22 -  
23 public ArrivalInfo(String deviceId, Long ts, String lineCode, Integer upDown, String stopNo, Integer inOut, 15 public ArrivalInfo(String deviceId, Long ts, String lineCode, Integer upDown, String stopNo, Integer inOut,
24 - Date createDate, Integer weeksYear) { 16 + Long createDate, Integer weeksYear) {
25 this.deviceId = deviceId; 17 this.deviceId = deviceId;
26 18
27 - //gps是2014年的数据,临时将ts拉到今天  
28 - /*try {  
29 - this.ts = sdf2.parse("2016-07-25 " + sdf.format(new Date(ts))).getTime();  
30 - } catch (ParseException e) {  
31 - e.printStackTrace();  
32 - }*/  
33 this.ts = ts; 19 this.ts = ts;
34 20
35 this.lineCode = lineCode; 21 this.lineCode = lineCode;
@@ -38,10 +24,11 @@ public class ArrivalInfo { @@ -38,10 +24,11 @@ public class ArrivalInfo {
38 this.inOut = inOut; 24 this.inOut = inOut;
39 this.createDate = createDate; 25 this.createDate = createDate;
40 this.weeksYear = weeksYear; 26 this.weeksYear = weeksYear;
  27 + this.stopName = CommonMapped.stationCodeMap.get(this.stopNo);
41 } 28 }
42 29
43 public ArrivalInfo(String deviceId, Long ts, String lineCode, Integer upDown, String stopNo, Integer inOut, 30 public ArrivalInfo(String deviceId, Long ts, String lineCode, Integer upDown, String stopNo, Integer inOut,
44 - Date createDate, Integer weeksYear, String stopName) { 31 + Long createDate, Integer weeksYear, String stopName) {
45 this.deviceId = deviceId; 32 this.deviceId = deviceId;
46 33
47 this.ts = ts; 34 this.ts = ts;
@@ -60,6 +47,9 @@ public class ArrivalInfo { @@ -60,6 +47,9 @@ public class ArrivalInfo {
60 */ 47 */
61 private String deviceId; 48 private String deviceId;
62 49
  50 + /** 站点名称 */
  51 + private String stopName;
  52 +
63 /** 53 /**
64 * 时间戳 54 * 时间戳
65 */ 55 */
@@ -81,16 +71,11 @@ public class ArrivalInfo { @@ -81,16 +71,11 @@ public class ArrivalInfo {
81 private String stopNo; 71 private String stopNo;
82 72
83 /** 73 /**
84 - * 站点名称  
85 - */  
86 - private String stopName;  
87 -  
88 - /**  
89 * 0: 进 1:出 74 * 0: 进 1:出
90 */ 75 */
91 private Integer inOut; 76 private Integer inOut;
92 77
93 - private Date createDate; 78 + private Long createDate;
94 79
95 /** 80 /**
96 * 分区字段,当年的第几周 81 * 分区字段,当年的第几周
@@ -129,11 +114,11 @@ public class ArrivalInfo { @@ -129,11 +114,11 @@ public class ArrivalInfo {
129 this.inOut = inOut; 114 this.inOut = inOut;
130 } 115 }
131 116
132 - public Date getCreateDate() { 117 + public Long getCreateDate() {
133 return createDate; 118 return createDate;
134 } 119 }
135 120
136 - public void setCreateDate(Date createDate) { 121 + public void setCreateDate(Long createDate) {
137 this.createDate = createDate; 122 this.createDate = createDate;
138 } 123 }
139 124
src/main/java/com/bsth/vehicle/gpsdata/entity/ArrivalLinkedList.java 0 → 100644
  1 +package com.bsth.vehicle.gpsdata.entity;
  2 +
  3 +/**
  4 + *
  5 + * @ClassName: ArrivalLinkedList
  6 + * @Description: TODO(班次到离站链)
  7 + * @author PanZhao
  8 + * @date 2016年7月28日 下午2:47:52
  9 + *
  10 + */
  11 +public class ArrivalLinkedList {
  12 +
  13 + /** 车辆内部编码 */
  14 + private String nbbm;
  15 +
  16 + /** 线路编码 */
  17 + private Integer lineCode;
  18 +
  19 + /** 起始站点编码 */
  20 + private String startStation;
  21 +
  22 + /** 起点发出时间 (毫秒时间戳) */
  23 + private Long startTime;
  24 +
  25 + /** 终点到达时间 (毫秒时间戳) */
  26 + private Long endTime;
  27 +
  28 + /** 终点站点编码 */
  29 + private String endStation;
  30 +}
src/main/java/com/bsth/vehicle/gpsdata/entity/GpsRealData.java
@@ -57,6 +57,9 @@ public class GpsRealData { @@ -57,6 +57,9 @@ public class GpsRealData {
57 57
58 //下一个班次ID 58 //下一个班次ID
59 private Long nextSchId; 59 private Long nextSchId;
  60 +
  61 + /** 设备是否在线 */
  62 + private boolean online;
60 63
61 public Integer getCompanyCode() { 64 public Integer getCompanyCode() {
62 return companyCode; 65 return companyCode;
@@ -185,4 +188,12 @@ public class GpsRealData { @@ -185,4 +188,12 @@ public class GpsRealData {
185 public void setStationName(String stationName) { 188 public void setStationName(String stationName) {
186 this.stationName = stationName; 189 this.stationName = stationName;
187 } 190 }
  191 +
  192 + public boolean isOnline() {
  193 + return online;
  194 + }
  195 +
  196 + public void setOnline(boolean online) {
  197 + this.online = online;
  198 + }
188 } 199 }
src/main/java/com/bsth/vehicle/gpsdata/service/GpsDataServiceImpl.java
@@ -40,7 +40,7 @@ public class GpsDataServiceImpl implements GpsDataService{ @@ -40,7 +40,7 @@ public class GpsDataServiceImpl implements GpsDataService{
40 @Override 40 @Override
41 public List<Map<String, Object>> history(String device, Long startTime, Long endTime, int directions) { 41 public List<Map<String, Object>> history(String device, Long startTime, Long endTime, int directions) {
42 Calendar sCal = Calendar.getInstance(); 42 Calendar sCal = Calendar.getInstance();
43 - sCal.setTime(new Date(/*startTime*/)); 43 + sCal.setTime(new Date(startTime));
44 44
45 Calendar eCal = Calendar.getInstance(); 45 Calendar eCal = Calendar.getInstance();
46 eCal.setTime(new Date(endTime)); 46 eCal.setTime(new Date(endTime));
@@ -244,7 +244,6 @@ public class GpsDataServiceImpl implements GpsDataService{ @@ -244,7 +244,6 @@ public class GpsDataServiceImpl implements GpsDataService{
244 return list; 244 return list;
245 } 245 }
246 246
247 - //weekOfYear 算错了  
248 public Map<String, ArrivalInfo> findArrivalByTs(int weekOfYear, Long st, Long et, String devicesInSql){ 247 public Map<String, ArrivalInfo> findArrivalByTs(int weekOfYear, Long st, Long et, String devicesInSql){
249 Map<String, ArrivalInfo> map = new HashMap<>(); 248 Map<String, ArrivalInfo> map = new HashMap<>();
250 249
@@ -261,7 +260,7 @@ public class GpsDataServiceImpl implements GpsDataService{ @@ -261,7 +260,7 @@ public class GpsDataServiceImpl implements GpsDataService{
261 int inOut; 260 int inOut;
262 while (rs.next()) { 261 while (rs.next()) {
263 arr = new ArrivalInfo(rs.getString("DEVICE_ID"), rs.getLong("TS"), rs.getString("LINE_ID"), rs.getInt("UP_DOWN") 262 arr = new ArrivalInfo(rs.getString("DEVICE_ID"), rs.getLong("TS"), rs.getString("LINE_ID"), rs.getInt("UP_DOWN")
264 - , rs.getString("STOP_NO"), rs.getInt("IN_OUT"), rs.getDate("CREATE_DATE") , rs.getInt("WEEKS_YEAR") 263 + , rs.getString("STOP_NO"), rs.getInt("IN_OUT"), rs.getLong("CREATE_DATE") , rs.getInt("WEEKS_YEAR")
265 , CommonMapped.stationCodeMap.get(rs.getString("STOP_NO"))); 264 , CommonMapped.stationCodeMap.get(rs.getString("STOP_NO")));
266 265
267 //设备号_时间戳_进出状态 为key 266 //设备号_时间戳_进出状态 为key
@@ -276,10 +275,4 @@ public class GpsDataServiceImpl implements GpsDataService{ @@ -276,10 +275,4 @@ public class GpsDataServiceImpl implements GpsDataService{
276 } 275 }
277 return map; 276 return map;
278 } 277 }
279 -  
280 - public static void main(String[] args) {  
281 - Calendar weekCal = Calendar.getInstance();  
282 - weekCal.setTime(new Date());  
283 - System.out.println(weekCal.get(Calendar.WEEK_OF_YEAR));  
284 - }  
285 } 278 }
src/main/resources/static/assets/img/load_slow.gif 0 → 100644

3.42 KB

src/main/resources/static/gpsTest/test.html
@@ -156,7 +156,7 @@ form .item select{ @@ -156,7 +156,7 @@ form .item select{
156 156
157 //查询gps点 157 //查询gps点
158 $.get('/gps/history/' + params.device, params, function(gpsArray){ 158 $.get('/gps/history/' + params.device, params, function(gpsArray){
159 - console.log(gpsArray); 159 + console.log(stationCodeMap);
160 var marker, label, point, state, text; 160 var marker, label, point, state, text;
161 $.each(gpsArray, function(){ 161 $.each(gpsArray, function(){
162 point = new BMap.Point(this.lon, this.lat); 162 point = new BMap.Point(this.lon, this.lat);
@@ -165,12 +165,20 @@ form .item select{ @@ -165,12 +165,20 @@ form .item select{
165 165
166 if(state == 0 || state == 1){ 166 if(state == 0 || state == 1){
167 text = state == 0?'出':'进'; 167 text = state == 0?'出':'进';
  168 +
  169 + console.log(stationCodeMap[this.stopNo], this);
168 marker.setIcon(new BMap.Icon(inOuts[this.inout_stop], new BMap.Size(25,25))); 170 marker.setIcon(new BMap.Icon(inOuts[this.inout_stop], new BMap.Size(25,25)));
169 label = new BMap.Label( 171 label = new BMap.Label(
170 - stationCodeMap[this.stopNo] + '/' +moment(this.ts).format('HH:mm') + ' -'+text 172 + stationCodeMap[this.stopNo] + '/' +moment(this.ts).format('HH:mm.ss') + ' -'+text
171 , {position: point, offset: new BMap.Size(-25,-18)}); 173 , {position: point, offset: new BMap.Size(-25,-18)});
172 marker.setLabel(label); 174 marker.setLabel(label);
173 } 175 }
  176 + else{
  177 + label = new BMap.Label(moment(this.ts).format('HH:mm.ss')
  178 + , {position: point, offset: new BMap.Size(-25,-18)});
  179 + marker.setLabel(label);
  180 + }
  181 +
174 map.addOverlay(marker); 182 map.addOverlay(marker);
175 }); 183 });
176 }); 184 });
src/main/resources/static/index.html
@@ -423,6 +423,7 @@ $(function(){ @@ -423,6 +423,7 @@ $(function(){
423 function activeLeftMenu(item){ 423 function activeLeftMenu(item){
424 $(item).parent('.nav-item').addClass('active').parent('.sub-menu').show().parent().addClass('open'); 424 $(item).parent('.nav-item').addClass('active').parent('.sub-menu').show().parent().addClass('open');
425 } 425 }
  426 +
426 </script> 427 </script>
427 </body> 428 </body>
428 </html> 429 </html>
429 \ No newline at end of file 430 \ No newline at end of file
src/main/resources/static/pages/control/line/child_pages/historyMessage.html 0 → 100644
  1 +<div id="historyMessagePanel" style="margin: 17px 5px 5px;">
  2 +
  3 + <form class="form-inline" >
  4 + <div class="form-group" style="margin: 18px;">
  5 + <label class="" for="directiveSelect">指令类型:</label>
  6 + <select class="form-control" id="directiveSelect" name="dType">
  7 + <option value="-1">全部</option>
  8 + <option value="0">调度指令</option>
  9 + <option value="1">运营指令</option>
  10 + <option value="2">线路切换指令</option>
  11 + <option value="3">消息短语</option>
  12 + </select>
  13 + </div>
  14 +
  15 + <div class="form-group" >
  16 + <label class="" for="carSelect">车辆:</label>
  17 + <select class="form-control" name="nbbm" id="carSelect" style="width: 170px;"></select>
  18 + </div>
  19 + </form>
  20 +
  21 + <div class="table-scrollable">
  22 + <table class="table table-hover" style="table-layout: fixed;">
  23 + <thead>
  24 + <tr>
  25 + <th width="9%">车辆</th>
  26 + <th width="9%">时间</th>
  27 + <th width="45%">内容</th>
  28 + <th width="8%">发送人</th>
  29 + <th width="15%">状态</th>
  30 + </tr>
  31 + </thead>
  32 + <tbody>
  33 + <tr>
  34 + <td>B-84256</td>
  35 + <td>11:32</td>
  36 + <td>
  37 + <div class="text-furl">已完成6个班次,下一发车时间19点05分,由兰坪路浦江路发往江南旅游服务有限公司浦西停车保养场</div>
  38 + </td>
  39 + <td>系统</td>
  40 + <td><span class="label label-sm label-success">
  41 + 设备收到,驾驶员确认 </span></td>
  42 + </tr>
  43 + <tr>
  44 + <td>B-84256</td>
  45 + <td>11:32</td>
  46 + <td>
  47 + <div class="text-furl">已完成6个班次,下一发车时间19点05分,由兰坪路浦江路发往江南旅游服务有限公司浦西停车保养场</div>
  48 + </td>
  49 + <td>系统</td>
  50 + <td><span class="label label-sm label-success">
  51 + 设备收到,驾驶员确认 </span></td>
  52 + </tr>
  53 + <tr>
  54 + <td>B-84256</td>
  55 + <td>11:32</td>
  56 + <td>
  57 + <div class="text-furl">已完成6个班次,下一发车时间19点05分,由兰坪路浦江路发往江南旅游服务有限公司浦西停车保养场</div>
  58 + </td>
  59 + <td>系统</td>
  60 + <td><span class="label label-sm label-warning">
  61 + 设备未响应 </span></td>
  62 + </tr>
  63 + <tr>
  64 + <td>B-84256</td>
  65 + <td>11:32</td>
  66 + <td>
  67 + <div class="text-furl">已完成6个班次,下一发车时间19点05分,由兰坪路浦江路发往江南旅游服务有限公司浦西停车保养场</div>
  68 + </td>
  69 + <td>系统</td>
  70 + <td><span class="label label-sm label-danger">
  71 + 网关通讯失败 </span> <i class="fa fa-link"></i></td>
  72 + </tr>
  73 + <tr>
  74 + <td>B-84256</td>
  75 + <td>11:32</td>
  76 + <td>
  77 + <div class="text-furl">运营指令 - 上行营运</div>
  78 + </td>
  79 + <td>系统</td>
  80 + <td><span class="label label-sm label-success">
  81 + 切换成功 </span></td>
  82 + </tr>
  83 +
  84 + <tr>
  85 + <td>B-84256</td>
  86 + <td>11:32</td>
  87 + <td>
  88 + <div class="text-furl">线路切换 - 778 路</div>
  89 + </td>
  90 + <td>系统</td>
  91 + <td><span class="label label-sm label-success">
  92 + 切换成功 </span></td>
  93 + </tr>
  94 + </tbody>
  95 + </table>
  96 + </div>
  97 +</div>
  98 +
  99 +<script>
  100 +!function(){
  101 + var $car = $('#historyMessagePanel #carSelect')
  102 + ,$dType = $('#historyMessagePanel #directiveSelect');
  103 + createVehSearch($car);
  104 +}();
  105 +</script>
0 \ No newline at end of file 106 \ No newline at end of file
src/main/resources/static/pages/control/line/css/lineControl.css
@@ -1206,7 +1206,7 @@ height: 400px; @@ -1206,7 +1206,7 @@ height: 400px;
1206 position: absolute; 1206 position: absolute;
1207 right: 4px; 1207 right: 4px;
1208 bottom: 4px; 1208 bottom: 4px;
1209 - color: #a6a6a6; 1209 + color: #757474;
1210 } 1210 }
1211 1211
1212 .log-item-point{ 1212 .log-item-point{
@@ -1231,7 +1231,8 @@ height: 400px; @@ -1231,7 +1231,8 @@ height: 400px;
1231 } 1231 }
1232 1232
1233 .log-item.handle{ 1233 .log-item.handle{
1234 - height: 72px; 1234 + height: 92px;
  1235 + background: #fdfdfd;
1235 } 1236 }
1236 1237
1237 .log-item-handle{ 1238 .log-item-handle{
@@ -1241,10 +1242,28 @@ height: 400px; @@ -1241,10 +1242,28 @@ height: 400px;
1241 } 1242 }
1242 1243
1243 .log-item-handle .btn-sm{ 1244 .log-item-handle .btn-sm{
1244 - padding: 3px 7px; 1245 + padding: 1px 5px;
1245 margin-right: 3px; 1246 margin-right: 3px;
1246 } 1247 }
1247 1248
  1249 +.log-item-handle .dissent,
  1250 +.log-item-handle .msg-to-map{
  1251 + font-size: 12px;
  1252 + vertical-align: bottom;
  1253 + text-decoration: underline;
  1254 + color: #828282 !important;
  1255 +}
  1256 +
  1257 +.log-item-runing{
  1258 + position: absolute;
  1259 + bottom: 7px;
  1260 + left: 7px;
  1261 + width: 100%;
  1262 + height: 25px;
  1263 + background: #fdfdfd;
  1264 + display: none;
  1265 +}
  1266 +
1248 .log-item.handle .log-item-point{ 1267 .log-item.handle .log-item-point{
1249 top: 8px; 1268 top: 8px;
1250 } 1269 }
@@ -2324,4 +2343,18 @@ tr._tr_active.active-line-no .out-badge{ @@ -2324,4 +2343,18 @@ tr._tr_active.active-line-no .out-badge{
2324 #tab_home .tab-pane .row.card_wrap:last-child .col-lg-2 { 2343 #tab_home .tab-pane .row.card_wrap:last-child .col-lg-2 {
2325 border-bottom: 1px solid #DADADA; 2344 border-bottom: 1px solid #DADADA;
2326 border-bottom: 1px solid #DADADA; 2345 border-bottom: 1px solid #DADADA;
  2346 +}
  2347 +
  2348 +.text-furl{
  2349 + width: 100%;
  2350 + display: block;
  2351 + white-space: nowrap;
  2352 + overflow: hidden;
  2353 + text-overflow: ellipsis;
  2354 +}
  2355 +
  2356 +#historyMessagePanel table .fa-link{
  2357 + margin-left: 5px;
  2358 + vertical-align: bottom;
  2359 + cursor: pointer;
2327 } 2360 }
2328 \ No newline at end of file 2361 \ No newline at end of file
src/main/resources/static/pages/control/line/index.html
@@ -18,10 +18,11 @@ @@ -18,10 +18,11 @@
18 </div> 18 </div>
19 <div class="actions col_hide_1280" > 19 <div class="actions col_hide_1280" >
20 <div class="btn-group"> 20 <div class="btn-group">
21 - <button type="button" class="btn btn-default" disabled>  
22 - <i class="fa fa-calendar-check-o"></i> 计划排班</button>  
23 - <button type="button" class="btn btn-default" disabled>  
24 - <i class="fa fa-history"></i> 轨迹回放</button> 21 + <button type="button" class="btn btn-default" id="deviceReport">
  22 + <i class="fa fa-code-fork"></i> 设备上报</button>
  23 +
  24 + <button type="button" class="btn btn-default" id="msgAndDirect">
  25 + <i class="fa fa-bell"></i> 调度指令</button>
25 26
26 <div class="btn-group"> 27 <div class="btn-group">
27 <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" disabled> 28 <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" disabled>
@@ -181,7 +182,7 @@ @@ -181,7 +182,7 @@
181 <menu class="menu" id="homeMenu" style="display: none;"> 182 <menu class="menu" id="homeMenu" style="display: none;">
182 <li class="menu-item disabled" id="menu-linename"> 183 <li class="menu-item disabled" id="menu-linename">
183 <button type="button" class="menu-btn"> 184 <button type="button" class="menu-btn">
184 - <span class="menu-text">--- W2B-102 ---</span> 185 + <span class="menu-text">--- <span class="menu-title-nbbm"></span> ---</span>
185 </button> 186 </button>
186 </li> 187 </li>
187 <li class="menu-item" > 188 <li class="menu-item" >
@@ -227,8 +228,9 @@ @@ -227,8 +228,9 @@
227 <script src="/pages/control/line/js/homeMenu.js"></script> 228 <script src="/pages/control/line/js/homeMenu.js"></script>
228 <script src="/pages/control/line/js/alone.js"></script> 229 <script src="/pages/control/line/js/alone.js"></script>
229 <script src="/pages/control/line/js/main.js"></script> 230 <script src="/pages/control/line/js/main.js"></script>
230 -<script src="/pages/control/line/js/console.js"></script> 231 +<script src="/pages/control/line/js/messenger.js"></script>
231 <script src="/pages/control/line/js/keyboardListen.js"></script> 232 <script src="/pages/control/line/js/keyboardListen.js"></script>
  233 +<script src="/pages/control/line/js/toolbarEvent.js"></script>
232 <script> 234 <script>
233 235
234 var lineCodes = '' //全部线路编码字符串,由data.js初始化 236 var lineCodes = '' //全部线路编码字符串,由data.js初始化
@@ -252,6 +254,13 @@ $.get(&#39;/user/currentUser&#39;, function(user){ @@ -252,6 +254,13 @@ $.get(&#39;/user/currentUser&#39;, function(user){
252 //打个标记 254 //打个标记
253 storage.setItem('real_control_flag', 1); 255 storage.setItem('real_control_flag', 1);
254 256
  257 +var reqCodeMap = {0xA1: '请求恢复运营', 0xA2: '申请调档', 0xA3: '出场请求', 0xA5: '进场请求', 0xA7: '加油请求', 0x50: '车辆故障', 0x70: '路阻报告', 0x60: '事故报告', 0x11: '扣证纠纷', 0x12 : '报警'};
  258 +
  259 +function _fadeOut($that){
  260 + $that.fadeOut('normal', function(){
  261 + $that.remove();
  262 + });
  263 +}
255 $(function() { 264 $(function() {
256 //主调和监控模式横幅颜色 265 //主调和监控模式横幅颜色
257 if(operationMode == 0) 266 if(operationMode == 0)
@@ -264,7 +273,7 @@ $(function() { @@ -264,7 +273,7 @@ $(function() {
264 getTemp('temps/tooltip_tp.html'); 273 getTemp('temps/tooltip_tp.html');
265 getTemp('temps/alone_tp.html'); 274 getTemp('temps/alone_tp.html');
266 getTemp('temps/child_task_case_tp.html'); 275 getTemp('temps/child_task_case_tp.html');
267 - getTemp('temps/console.html'); 276 + getTemp('temps/messenger.html');
268 277
269 function getTemp(url){ 278 function getTemp(url){
270 $.get(url, function(template){ 279 $.get(url, function(template){
@@ -272,5 +281,14 @@ $(function() { @@ -272,5 +281,14 @@ $(function() {
272 }); 281 });
273 } 282 }
274 }); 283 });
  284 +
  285 +//监控模式下拦截POST请求
  286 +function interceptPOST(e, xhr, t){
  287 + if(t && (t.method == 'POST' || t.type == 'POST')){
  288 + console.log(e, xhr, t);
  289 + xhr.abort();
  290 + layer.msg('监控模式!',{offset: 'ct', shift : 6});
  291 + }
  292 +}
275 </script> 293 </script>
276 <script src="/pages/control/line/js/webSocketHandle.js"></script> 294 <script src="/pages/control/line/js/webSocketHandle.js"></script>
277 \ No newline at end of file 295 \ No newline at end of file
src/main/resources/static/pages/control/line/js/alone.js
@@ -37,13 +37,6 @@ var _alone = (function(){ @@ -37,13 +37,6 @@ var _alone = (function(){
37 } 37 }
38 //初始化备注弹层 38 //初始化备注弹层
39 initRemarksPop(); 39 initRemarksPop();
40 - //初始化信使  
41 - initMessenger(lineCodes);  
42 -  
43 - //消息框滚动条  
44 - $('.console-log .log-item-list').slimscroll({  
45 - height: '100%'  
46 - });  
47 40
48 cb && cb(); 41 cb && cb();
49 }); 42 });
@@ -151,13 +144,19 @@ var _alone = (function(){ @@ -151,13 +144,19 @@ var _alone = (function(){
151 144
152 //定位到班次所在的行 145 //定位到班次所在的行
153 function goToSch(sch){ 146 function goToSch(sch){
154 - var table = getTableBySch(sch) 147 + var table = getTableBySch(sch);
  148 + //如果table不可见
  149 + if(!table.is(":visible"))
  150 + return;
  151 +
  152 + var currTr = table.find('tr[data-id='+sch.id+']')
155 ,half = table.parents('._body').height() / 2 153 ,half = table.parents('._body').height() / 2
156 - ,currTr = table.find('tr[data-id='+sch.id+']')  
157 ,top = parseInt(currTr.find('td[name=lineNo]').text()) * 37 - half; 154 ,top = parseInt(currTr.find('td[name=lineNo]').text()) * 37 - half;
158 155
159 top = top>0?top:0; 156 top = top>0?top:0;
160 - currTr.addClass('anim-delay animated flash'); 157 + currTr.addClass('anim-delay animated flash').one(animationend, function(){
  158 + $(this).removeClass('anim-delay animated flash');
  159 + });
161 currTr.parents('._body').slimScroll({ scrollTo: top + 'px' }); 160 currTr.parents('._body').slimScroll({ scrollTo: top + 'px' });
162 } 161 }
163 162
@@ -190,60 +189,6 @@ var _alone = (function(){ @@ -190,60 +189,6 @@ var _alone = (function(){
190 return rs; 189 return rs;
191 } 190 }
192 191
193 - //切换托管状态  
194 - function changeTGStatus(){  
195 - var status = $(this).data('status');  
196 - if(status == 0)  
197 - status = 1;  
198 - else  
199 - status = 0;  
200 -  
201 - $(this).data('status', status);  
202 -  
203 - var lineCode = $(this).data('linecode');  
204 -  
205 - $.post('/realSchedule/trustStatus/change', {lineCode: lineCode, status: status}  
206 - ,function(rs){  
207 - if(rs == 200){  
208 - layer.msg('切换成功!');  
209 - changeTgHtml(lineCode, status);  
210 - }  
211 - });  
212 - }  
213 -  
214 - $('.portlet-fullscreen').on('click', '.tg_tools', changeTGStatus);  
215 - var tgHtml = ['托管状态,计算机自动处理&nbsp;<i class="fa fa-question-circle tgQuestion" style="cursor: pointer;"></i>', '非托管状态,手动处理!'];  
216 - var tgPopoverOps = {content: template('tg_question_info_temp', {}),html: true,placement: 'left',trigger: 'hover',container: '.portlet-fullscreen'};  
217 - function initMessenger(lineCodes){  
218 - //查询线路托管状态  
219 - $.get('/realSchedule/trustStatus', {lineCodes: lineCodes},function(rs){  
220 - for(var line in rs)  
221 - changeTgHtml(line, rs[line]);  
222 - });  
223 - }  
224 -  
225 - function changeTgHtml(line, status){  
226 - var tgTools = $('#tgTools_' + line);  
227 -  
228 - tgTools.html(tgHtml[status]).data('status', status);  
229 - var array = $('#top-tabs-wrap a[data-id='+line+'] span zz');  
230 -  
231 - if(status == 0){  
232 - //托管Question  
233 - $('.tgQuestion', tgTools).popover(tgPopoverOps);  
234 - tgTools.removeClass('hand');  
235 -  
236 - $(array[2]).text('托管');  
237 - }  
238 - else{  
239 - tgTools.addClass('hand');  
240 - $(array[2]).text('');  
241 - }  
242 -  
243 - //tab 头改变  
244 -  
245 - }  
246 -  
247 function initRemarksPop(){ 192 function initRemarksPop(){
248 //备注POPOVER 193 //备注POPOVER
249 $('.remarks-popover', '.pb-table').popover({trigger: 'hover',container: '.portlet-fullscreen',placement:'bottom'}); 194 $('.remarks-popover', '.pb-table').popover({trigger: 'hover',container: '.portlet-fullscreen',placement:'bottom'});
src/main/resources/static/pages/control/line/js/console.js deleted 100644 → 0
1 -/** 信使操作 */  
2 -  
3 -$('.portlet-fullscreen').on('click', '.log-item-handle a.log-close', function(){  
4 - $(this).parents('.log-item').remove();  
5 -});  
6 \ No newline at end of file 0 \ No newline at end of file
src/main/resources/static/pages/control/line/js/homeMenu.js
1 var _home_menu = (function(){ 1 var _home_menu = (function(){
2 2
  3 + var gbNbbm;
  4 +
3 $('#homeMenu .menu-item button').on('click', function(){ 5 $('#homeMenu .menu-item button').on('click', function(){
4 var method = $(this).data('method'); 6 var method = $(this).data('method');
5 if(!method)return; 7 if(!method)return;
6 - var nbbm = $('.vehicDataTable tr._home_tr_active').data('nbbm'); 8 + /*var nbbm = $('.vehicDataTable tr._home_tr_active').data('nbbm');
7 9
8 if(!nbbm){ 10 if(!nbbm){
9 layer.alert('无法获取车辆自编号,请尝试刷新页面!', {icon: 2, title: '异常'}); 11 layer.alert('无法获取车辆自编号,请尝试刷新页面!', {icon: 2, title: '异常'});
10 return; 12 return;
  13 + }*/
  14 + if(!gbNbbm){
  15 + layer.alert('无法获取车辆自编号,请尝试刷新页面!', {icon: 2, title: '异常'});
  16 + return;
11 } 17 }
12 - menuObject[method](nbbm); 18 + menuObject[method](gbNbbm);
13 }); 19 });
14 20
15 //右键事件 21 //右键事件
16 $('.portlet-fullscreen').on('contextmenu', '.vehicDataTable tr td', function(e){ 22 $('.portlet-fullscreen').on('contextmenu', '.vehicDataTable tr td', function(e){
17 e.preventDefault(); 23 e.preventDefault();
18 $('.vehicDataTable tr._home_tr_active').removeClass('_home_tr_active'); 24 $('.vehicDataTable tr._home_tr_active').removeClass('_home_tr_active');
19 - $(this).parent().addClass('_home_tr_active'); 25 +
  26 + var $tr = $(this).parent().addClass('_home_tr_active')
  27 + ,nbbm = $tr.data('nbbm');
  28 +
  29 + $('#homeMenu .menu-title-nbbm').text(nbbm);
  30 + gbNbbm = nbbm;
  31 +
20 showMenu(e.pageX, e.pageY + 3); 32 showMenu(e.pageX, e.pageY + 3);
21 $(document).one('click', function() { 33 $(document).one('click', function() {
22 $('#homeMenu').removeClass('show-menu'); 34 $('#homeMenu').removeClass('show-menu');
@@ -47,7 +59,7 @@ var _home_menu = (function(){ @@ -47,7 +59,7 @@ var _home_menu = (function(){
47 var menuObject = { 59 var menuObject = {
48 //发送消息短语 60 //发送消息短语
49 sendPhrase: function(nbbm){ 61 sendPhrase: function(nbbm){
50 - layer.prompt({title: '请输入短语信息', formType: 2 , shift: 5 62 + layer.prompt({title: '向 '+nbbm+' 发送短语信息', formType: 2 , shift: 5
51 }, function(space){ 63 }, function(space){
52 $.post('/directive/phrase', {nbbm: nbbm, text: space}, function(rs){ 64 $.post('/directive/phrase', {nbbm: nbbm, text: space}, function(rs){
53 if(rs == 0) 65 if(rs == 0)
src/main/resources/static/pages/control/line/js/main.js
1 !function(){ 1 !function(){
2 -  
3 - $('#exitBtn').on('click', function(){  
4 - layer.confirm('确定要退出系统?', {  
5 - btn : [ '退出', '取消' ],  
6 - icon : 3,  
7 - skin : 'layui-layer-cfm-delete'  
8 - }, function(){  
9 - //清除标记  
10 - storage.removeItem('real_control_flag');  
11 - //解绑事件  
12 - $(document).unbind('ajaxSend', interceptPOST);  
13 - layer.closeAll();  
14 - window.location.href = '/pages/control/lineallot/allot.html';  
15 - });  
16 - });  
17 -  
18 var gpsOff = 1000 * 60 * 5; 2 var gpsOff = 1000 * 60 * 5;
19 3
20 var homeObject = { 4 var homeObject = {
@@ -110,6 +94,8 @@ setTimeout(function(){ @@ -110,6 +94,8 @@ setTimeout(function(){
110 94
111 //初始化单线路调度页面 95 //初始化单线路调度页面
112 _alone.init(function(){ 96 _alone.init(function(){
  97 + //初始化信使
  98 + _messenger.init();
113 //初始化主页 99 //初始化主页
114 homeObject.init(); 100 homeObject.init();
115 }); 101 });
@@ -118,15 +104,7 @@ setTimeout(function(){ @@ -118,15 +104,7 @@ setTimeout(function(){
118 if(operationMode == 0){ 104 if(operationMode == 0){
119 $(document).on('ajaxSend', interceptPOST); 105 $(document).on('ajaxSend', interceptPOST);
120 } 106 }
121 -}, 200)  
122 -  
123 - function interceptPOST(e, xhr, t){  
124 - if(t && (t.method == 'POST' || t.type == 'POST')){  
125 - console.log(e, xhr, t);  
126 - xhr.abort();  
127 - layer.msg('监控模式!',{offset: 'ct', shift : 6});  
128 - }  
129 - } 107 +}, 300)
130 108
131 function gpslistToMap(gpslist){ 109 function gpslistToMap(gpslist){
132 var map = {} 110 var map = {}
src/main/resources/static/pages/control/line/js/messenger.js 0 → 100644
  1 +var _messenger = (function(){
  2 +
  3 + //线路托管状态
  4 + var tgStateMap;
  5 +
  6 + //定时将托管状态下的信使清理掉(不包含80)
  7 + !function(){
  8 + var f = arguments.callee
  9 + ,ct = Date.parse(new Date()) / 1000
  10 + ,list, time;
  11 +
  12 + for(var code in tgStateMap){
  13 + if(tgStateMap[code] == 1)
  14 + continue;
  15 +
  16 + list = $('#messengerList' + code).find('.log-item.fache,.log-item.zhongdian');
  17 + $.each(list, function(){
  18 + time = parseInt($(this).data('time'));
  19 + if(ct - time >= 30)
  20 + _fadeOut($(this));
  21 + });
  22 + }
  23 +
  24 + setTimeout(f, 3000);
  25 + }();
  26 +
  27 +
  28 + /** 信使操作 */
  29 + $('.portlet-fullscreen').on('click', '.log-item-handle a.log-close', function(){
  30 + _fadeOut($(this).parents('.log-item'));
  31 + });
  32 +
  33 + //80上报事件处理
  34 + //同意
  35 + $('.portlet-fullscreen').on('click','.log-item-handle .confirm', function(){
  36 + send80Reply(this, 0);
  37 + });
  38 +
  39 + //不同意
  40 + $('.portlet-fullscreen').on('click','.log-item-handle .dissent', function(){
  41 + send80Reply(this, -1);
  42 + });
  43 +
  44 + function send80Reply(that, reply){
  45 + var $handle = $(that).parents('.log-item.handle');
  46 + var id = $handle.data('id');
  47 + var $run = $handle.find('.log-item-runing');
  48 + $run.show();
  49 +
  50 + $.post('/directive/reply80', {id: id, reply: reply}, function(rs){
  51 + if(rs.status == 'ERROR')
  52 + $run.hide();
  53 +
  54 + if(rs.msg)
  55 + layer.alert(rs.msg, {icon: 0});
  56 + });
  57 + }
  58 +
  59 +
  60 + var messengerObj = {
  61 + init: function(){
  62 + //初始化信使和驾驶员上报数据
  63 + initMessenger(lineCodes);
  64 + $.get('/directive/findNoCofm80', {lineCodes: lineCodes}
  65 + , function(rs){
  66 + //填充未确认的80数据
  67 + console.log(rs);
  68 + for(var lineCode in rs){
  69 + $.each(rs[lineCode], function(){
  70 + this.dateStr = moment(this.timestamp).format('HH:mm.ss');
  71 + this.text = reqCodeMap[this.data.requestCode];
  72 + });
  73 +
  74 + rs[lineCode].sort(function(a, b){
  75 + return b.timestamp - a.timestamp;
  76 + });
  77 +
  78 + var htmlStr = template('console_80_temp', {list: rs[lineCode]});
  79 + $('#messengerList' + lineCode).html(htmlStr);
  80 + }
  81 + });
  82 +
  83 + //消息框滚动条
  84 + $('.console-log .log-item-list').slimscroll({
  85 + height: '100%'
  86 + });
  87 + }
  88 + }
  89 +
  90 +
  91 + $('.portlet-fullscreen').on('click', '.tg_tools', changeTGStatus);
  92 + var tgHtml = ['托管状态,计算机自动处理&nbsp;<i class="fa fa-question-circle tgQuestion" style="cursor: pointer;"></i>', '非托管状态,手动处理!'];
  93 +
  94 + var tgDescHtml = '<table class="tg-question-table"> '+
  95 + ' <tr>'+
  96 + ' <td>出场请求</td>'+
  97 + ' <td class="font-blue">同意(切换营运状态)</td>'+
  98 + ' </tr>'+
  99 + ' <tr>'+
  100 + ' <td>恢复运营</td>'+
  101 + ' <td>不处理</td>'+
  102 + ' </tr>'+
  103 + ' <tr>'+
  104 + ' <td>申请调档</td>'+
  105 + ' <td>不处理</td>'+
  106 + ' </tr>'+
  107 + ' <tr>'+
  108 + ' <td>进场请求</td>'+
  109 + ' <td>不处理</td>'+
  110 + ' </tr>'+
  111 + ' <tr>'+
  112 + ' <td>加油请求</td>'+
  113 + ' <td>不处理</td>'+
  114 + ' </tr>'+
  115 + ' <tr>'+
  116 + ' <td>车辆故障</td>'+
  117 + ' <td>不处理</td>'+
  118 + ' </tr>'+
  119 + ' <tr>'+
  120 + ' <td>路阻报告</td>'+
  121 + ' <td>不处理</td>'+
  122 + ' </tr>'+
  123 + ' <tr>'+
  124 + ' <td>事故报告</td>'+
  125 + ' <td>不处理</td>'+
  126 + ' </tr>'+
  127 + ' <tr>'+
  128 + ' <td>扣证纠纷 </td>'+
  129 + ' <td>不处理</td>'+
  130 + ' </tr>'+
  131 + ' <tr>'+
  132 + ' <td>报警</td>'+
  133 + ' <td>不处理</td>'+
  134 + ' </tr>'+
  135 + ' </table>';
  136 + var tgPopoverOps = {content: tgDescHtml,html: true,placement: 'left',trigger: 'hover',container: '.portlet-fullscreen'};
  137 + function initMessenger(lineCodes){
  138 + //查询线路托管状态
  139 + $.get('/realSchedule/trustStatus', {lineCodes: lineCodes},function(rs){
  140 + tgStateMap = rs;
  141 + for(var line in rs)
  142 + changeTgHtml(line, rs[line]);
  143 + });
  144 + }
  145 +
  146 + function changeTgHtml(line, status){
  147 + var tgTools = $('#tgTools_' + line);
  148 +
  149 + tgTools.html(tgHtml[status]).data('status', status);
  150 + var array = $('#top-tabs-wrap a[data-id='+line+'] span zz');
  151 +
  152 + if(status == 0){
  153 + //托管Question
  154 + $('.tgQuestion', tgTools).popover(tgPopoverOps);
  155 + tgTools.removeClass('hand');
  156 +
  157 + $(array[2]).text('托管');
  158 + }
  159 + else{
  160 + tgTools.addClass('hand');
  161 + $(array[2]).text('');
  162 + }
  163 +
  164 + //tab 头改变
  165 +
  166 + }
  167 +
  168 + //切换托管状态
  169 + var runing;
  170 + function changeTGStatus(){
  171 + if(runing)
  172 + return;
  173 + runing = true;
  174 +
  175 + var status = $(this).data('status');
  176 + if(status == 0)
  177 + status = 1;
  178 + else
  179 + status = 0;
  180 +
  181 + $(this).data('status', status);
  182 +
  183 + var lineCode = $(this).data('linecode');
  184 +
  185 + $.post('/realSchedule/trustStatus/change', {lineCode: lineCode, status: status}
  186 + ,function(rs){
  187 + if(rs == 200){
  188 + tgStateMap[lineCode] = status;
  189 + layer.msg('切换成功!');
  190 + changeTgHtml(lineCode, status);
  191 + runing = false;
  192 +
  193 + //console.log(tgStateMap);
  194 + }
  195 + });
  196 + }
  197 +
  198 + return messengerObj;
  199 +})();
  200 +
  201 +
src/main/resources/static/pages/control/line/js/toolbarEvent.js 0 → 100644
  1 +!function(){
  2 + $('#exitBtn').on('click', function(){
  3 + layer.confirm('确定要退出系统?', {
  4 + btn : [ '退出', '取消' ],
  5 + icon : 3,
  6 + skin : 'layui-layer-cfm-delete'
  7 + }, function(){
  8 + //清除标记
  9 + storage.removeItem('real_control_flag');
  10 + //解绑事件
  11 + $(document).unbind('ajaxSend', interceptPOST);
  12 + layer.closeAll();
  13 + window.location.href = '/pages/control/lineallot/allot.html';
  14 + });
  15 + });
  16 + //调度指令
  17 + $('#msgAndDirect').on('click', function(){
  18 + layer.msg('功能测试中...稍后开放!');
  19 + /*$.get('/pages/control/line/child_pages/historyMessage.html', function(content){
  20 + layer.open({
  21 + type: 1,
  22 + area: '930px',
  23 + content: content,
  24 + title : false,
  25 + success: function(){
  26 + }
  27 + });
  28 + });*/
  29 + });
  30 +
  31 + //设备上报
  32 + $('#deviceReport').on('click', function(){
  33 + layer.msg('功能测试中...稍后开放!');
  34 + });
  35 +}();
0 \ No newline at end of file 36 \ No newline at end of file
src/main/resources/static/pages/control/line/js/webSocketHandle.js
1 /** web socket */ 1 /** web socket */
2 !function(){ 2 !function(){
3 -var reqCodeMap = {0xA1: '请求恢复运营', 0xA2: '申请调档', 0xA3: '出场请求', 0xA5: '进场请求', 0xA7: '加油请求', 0x50: '车辆故障', 0x70: '路阻报告', 0x60: '事故报告', 0x11: '扣证纠纷', 0x12 : '报警'};  
4 -  
5 3
6 //将当前用户和线路绑定到后台 4 //将当前用户和线路绑定到后台
7 setTimeout(function(){ 5 setTimeout(function(){
@@ -31,20 +29,32 @@ var initWebSocket = function(){ @@ -31,20 +29,32 @@ var initWebSocket = function(){
31 console.log(e); 29 console.log(e);
32 } 30 }
33 }; 31 };
  32 +
  33 + //断开
  34 + msgSock.onclose = function(e) {
  35 + alert('和服务器连接断开....');
  36 + window.location.reload(true);
  37 + };
34 }; 38 };
35 39
36 var msgHandle = { 40 var msgHandle = {
37 - //驾驶员80上报处理 41 + //驾驶员80
38 report80: function(msg){ 42 report80: function(msg){
39 - msg.dateStr = moment(msg.timestamp).format('HH:mm'); 43 + msg.dateStr = moment(msg.timestamp).format('HH:mm.ss');
40 msg.text = reqCodeMap[msg.data.requestCode]; 44 msg.text = reqCodeMap[msg.data.requestCode];
41 45
42 - appendLogItem('console_80_temp', msg, msg.data.lineId); 46 + console.log(msg);
  47 + appendLogItem('console_80_temp', {list: [msg]}, msg.data.lineId);
  48 + },
  49 + //驾驶员80被处理
  50 + d80Confirm: function(msg){
  51 + _fadeOut($('.log-item.handle[data-id='+msg.id+']'));
43 }, 52 },
44 //车辆发出 53 //车辆发出
45 faChe: function(msg){ 54 faChe: function(msg){
46 //刷新数据 55 //刷新数据
47 _alone.refreshSchedule(msg.t); 56 _alone.refreshSchedule(msg.t);
  57 + msg.jsTime = Date.parse(new Date()) / 1000;
48 //信使 58 //信使
49 appendLogItem('console_fache_temp', msg, msg.t.xlBm); 59 appendLogItem('console_fache_temp', msg, msg.t.xlBm);
50 }, 60 },
@@ -53,6 +63,7 @@ var msgHandle = { @@ -53,6 +63,7 @@ var msgHandle = {
53 //刷新数据 63 //刷新数据
54 _alone.refreshSchedule(msg.t); 64 _alone.refreshSchedule(msg.t);
55 _alone.refreshSchedule(msg.nt); 65 _alone.refreshSchedule(msg.nt);
  66 + msg.jsTime = Date.parse(new Date()) / 1000;
56 //信使 67 //信使
57 appendLogItem('console_zhongdian_temp', msg, msg.t.xlBm); 68 appendLogItem('console_zhongdian_temp', msg, msg.t.xlBm);
58 }, 69 },
@@ -82,6 +93,13 @@ var msgHandle = { @@ -82,6 +93,13 @@ var msgHandle = {
82 break; 93 break;
83 } 94 }
84 $tr.find('td[data-name=clZbh]').attr('class', clazz); 95 $tr.find('td[data-name=clZbh]').attr('class', clazz);
  96 + },
  97 + refresh: function(msg){
  98 + //刷新
  99 + layer.msg('正在切换到 ' + msg.dateStr + '数据', {icon: 16, shade: 0.6, time: 0});
  100 + setTimeout(function(){
  101 + window.location.reload(true);
  102 + }, 1000);
85 } 103 }
86 }; 104 };
87 105
src/main/resources/static/pages/control/line/temps/alone_tp.html
@@ -87,7 +87,7 @@ @@ -87,7 +87,7 @@
87 <div class="col-md-2 panel-wrap" > 87 <div class="col-md-2 panel-wrap" >
88 <div class="_panel"> 88 <div class="_panel">
89 <div class="console-log"> 89 <div class="console-log">
90 - <div class="log-item-list"> 90 + <div class="log-item-list" id="messengerList{{lineCode}}">
91 </div> 91 </div>
92 </div> 92 </div>
93 <div class="_panel_footer tg_tools" id="tgTools_{{lineCode}}" data-linecode="{{lineCode}}"> 93 <div class="_panel_footer tg_tools" id="tgTools_{{lineCode}}" data-linecode="{{lineCode}}">
@@ -180,48 +180,7 @@ @@ -180,48 +180,7 @@
180 180
181 <!-- 托管状态描述 --> 181 <!-- 托管状态描述 -->
182 <script id="tg_question_info_temp" type="text/html"> 182 <script id="tg_question_info_temp" type="text/html">
183 -<table class="tg-question-table">  
184 - <tr>  
185 - <td>出场请求</td>  
186 - <td class="font-blue">同意(切换营运状态)</td>  
187 - </tr>  
188 - <tr>  
189 - <td>恢复运营</td>  
190 - <td>不处理</td>  
191 - </tr>  
192 - <tr>  
193 - <td>申请调档</td>  
194 - <td>不处理</td>  
195 - </tr>  
196 - <tr>  
197 - <td>进场请求</td>  
198 - <td>不处理</td>  
199 - </tr>  
200 - <tr>  
201 - <td>加油请求</td>  
202 - <td>不处理</td>  
203 - </tr>  
204 - <tr>  
205 - <td>车辆故障</td>  
206 - <td>不处理</td>  
207 - </tr>  
208 - <tr>  
209 - <td>路阻报告</td>  
210 - <td>不处理</td>  
211 - </tr>  
212 - <tr>  
213 - <td>事故报告</td>  
214 - <td>不处理</td>  
215 - </tr>  
216 - <tr>  
217 - <td>扣证纠纷 </td>  
218 - <td>不处理</td>  
219 - </tr>  
220 - <tr>  
221 - <td>报警</td>  
222 - <td>不处理</td>  
223 - </tr>  
224 -</table> 183 +
225 </script> 184 </script>
226 185
227 <!-- 待发调整 --> 186 <!-- 待发调整 -->
src/main/resources/static/pages/control/line/temps/console.html renamed to src/main/resources/static/pages/control/line/temps/messenger.html
@@ -3,35 +3,39 @@ @@ -3,35 +3,39 @@
3 3
4 <!-- 80协议上报 --> 4 <!-- 80协议上报 -->
5 <script id="console_80_temp" type="text/html"> 5 <script id="console_80_temp" type="text/html">
6 -<div class="log-item handle">  
7 - <span class="log-item-text">{{data.nbbm}} {{text}}</span>  
8 - <span class="log-item-time">{{dateStr}}</span> 6 +{{each list as item i}}
  7 +<div class="log-item handle" data-id={{item.id}}>
  8 + <span style="margin: 0px 0 7px;display: block;">{{item.dateStr}}</span>
  9 + <span class="log-item-text">{{item.data.nbbm}} {{item.text}} </span>
9 <span class="log-item-handle"> 10 <span class="log-item-handle">
10 - <!--<button type="button" class="btn blue btn-sm">同意</button>  
11 - <button type="button" class="btn red btn-sm">不同意</button>--> 11 + <button type="button" class="btn blue btn-sm confirm">同意</button>
  12 + <a href="javascript:;" class="dissent">不同意</a>
  13 + <!--<a href="javascript:;" class="msg-to-map">地图查看</a>-->
12 </span> 14 </span>
  15 + <span class="log-item-runing"><img src="/assets/img/load_slow.gif"> </span>
13 </div> 16 </div>
  17 +{{/each}}
14 </script> 18 </script>
15 19
16 -<script id="console_fache_temp" type="text/html">  
17 -<div class="log-item fache"> 20 +<script id="console_fache_temp" type="text/html" >
  21 +<div class="log-item fache" data-time={{jsTime}}>
18 <span class="log-item-text">{{t.fcsjActual}} {{t.clZbh}} 已由 {{t.qdzName}} 发出</span> 22 <span class="log-item-text">{{t.fcsjActual}} {{t.clZbh}} 已由 {{t.qdzName}} 发出</span>
19 <span class="log-item-text">执行班次 {{t.fcsj}}</span> 23 <span class="log-item-text">执行班次 {{t.fcsj}}</span>
20 <span class="log-item-time">{{dataStr}}</span> 24 <span class="log-item-time">{{dataStr}}</span>
21 <span class="log-item-handle"> 25 <span class="log-item-handle">
22 - <!--<a href="javascript:;" class="font-blue-steel log-close">确定</a>  
23 - <a href="javascript:;" class="font-red">地图</a>--> 26 + <a href="javascript:;" class="font-blue-steel log-close">确定</a>
  27 + <!--<a href="javascript:;" class="font-red">地图</a>-->
24 </span> 28 </span>
25 </div> 29 </div>
26 </script> 30 </script>
27 31
28 <script id="console_zhongdian_temp" type="text/html"> 32 <script id="console_zhongdian_temp" type="text/html">
29 -<div class="log-item zhongdian"> 33 +<div class="log-item zhongdian" data-time={{jsTime}}>
30 <span class="log-item-text">{{t.zdsjActual}} {{t.clZbh}} 到达 {{t.zdzName}};已完成 {{finish}} 个班次;下一发车时间 {{nt.fcsj}};由{{nt.qdzName}} 发往 {{nt.zdzName}};应到{{nt.zdsj}}</span> 34 <span class="log-item-text">{{t.zdsjActual}} {{t.clZbh}} 到达 {{t.zdzName}};已完成 {{finish}} 个班次;下一发车时间 {{nt.fcsj}};由{{nt.qdzName}} 发往 {{nt.zdzName}};应到{{nt.zdsj}}</span>
31 <span class="log-item-time">{{dataStr}}</span> 35 <span class="log-item-time">{{dataStr}}</span>
32 <span class="log-item-handle"> 36 <span class="log-item-handle">
33 - <!--<a href="javascript:;" class="font-blue-steel log-close">确定</a>  
34 - <a href="javascript:;" class="font-red">地图</a>--> 37 + <a href="javascript:;" class="font-blue-steel log-close">确定</a>
  38 + <!--<a href="javascript:;" class="font-red">地图</a>-->
35 </span> 39 </span>
36 </div> 40 </div>
37 </script> 41 </script>
38 \ No newline at end of file 42 \ No newline at end of file
src/main/resources/static/pages/mapmonitor/real/js/playBack.js
@@ -105,7 +105,7 @@ var playBack = (function() { @@ -105,7 +105,7 @@ var playBack = (function() {
105 else{ 105 else{
106 markerMap[gps.nbbm] = getCurrMap().addHistoryMarker(gps);//添加marker 106 markerMap[gps.nbbm] = getCurrMap().addHistoryMarker(gps);//添加marker
107 //定位到marker 107 //定位到marker
108 - getCurrMap().markerToCenter(markerMap[gps.nbbm]); 108 + //getCurrMap().markerToCenter(markerMap[gps.nbbm]);
109 } 109 }
110 110
111 if(gps.inout_stop != -1){ 111 if(gps.inout_stop != -1){
src/main/resources/static/pages/mapmonitor/real/temps/vehicle.html
@@ -81,7 +81,7 @@ @@ -81,7 +81,7 @@
81 <p class="banci-info"> 81 <p class="banci-info">
82 开往 82 开往
83 {{if currSch!=null}}{{currSch.zdzName}}{{/if}} 83 {{if currSch!=null}}{{currSch.zdzName}}{{/if}}
84 - ( 预计 未知时间 到达 ) 84 + ( 预计 ? 到达 )
85 </p> 85 </p>
86 <p class="banci-info"> 86 <p class="banci-info">
87 {{if nextSch!=null}} 87 {{if nextSch!=null}}