Commit c42749a8b19cdbc683c58181181594dd991c8dca

Authored by 潘钊
1 parent 28e47111

update...

Showing 75 changed files with 3932 additions and 5153 deletions
@@ -250,15 +250,6 @@ @@ -250,15 +250,6 @@
250 <version>1.7.4</version> 250 <version>1.7.4</version>
251 </dependency> 251 </dependency>
252 252
253 -  
254 - <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId>  
255 - <optional>true</optional> </dependency> -->  
256 - <dependency>  
257 - <groupId>com.vividsolutions</groupId>  
258 - <artifactId>jts</artifactId>  
259 - <version>1.13</version>  
260 - </dependency>  
261 -  
262 <dependency> 253 <dependency>
263 <groupId>org.dbunit</groupId> 254 <groupId>org.dbunit</groupId>
264 <artifactId>dbunit</artifactId> 255 <artifactId>dbunit</artifactId>
src/main/java/com/bsth/controller/DeviceGpsController.java
1 package com.bsth.controller; 1 package com.bsth.controller;
2 2
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.GpsRealData; 3 +import com.bsth.data.gpsdata_v2.GpsRealData;
  4 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
5 import com.fasterxml.jackson.core.JsonParseException; 5 import com.fasterxml.jackson.core.JsonParseException;
6 import com.fasterxml.jackson.databind.JsonMappingException; 6 import com.fasterxml.jackson.databind.JsonMappingException;
7 import com.fasterxml.jackson.databind.ObjectMapper; 7 import com.fasterxml.jackson.databind.ObjectMapper;
src/main/java/com/bsth/controller/gps/GpsController.java
1 package com.bsth.controller.gps; 1 package com.bsth.controller.gps;
2 2
3 import com.bsth.data.BasicData; 3 import com.bsth.data.BasicData;
4 -import com.bsth.data.gpsdata.GpsEntity;  
5 -import com.bsth.data.gpsdata.GpsRealData;  
6 -import com.bsth.entity.excep.Speeding; 4 +import com.bsth.data.gpsdata_v2.GpsRealData;
  5 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
7 import com.bsth.service.gps.GpsService; 6 import com.bsth.service.gps.GpsService;
8 import com.bsth.service.gps.entity.GpsSpeed; 7 import com.bsth.service.gps.entity.GpsSpeed;
9 -import com.bsth.util.PageObject;  
10 import com.google.common.base.Splitter; 8 import com.google.common.base.Splitter;
11 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.web.bind.annotation.*; 10 import org.springframework.web.bind.annotation.*;
13 11
14 import javax.servlet.http.HttpServletResponse; 12 import javax.servlet.http.HttpServletResponse;
15 -  
16 import java.text.ParseException; 13 import java.text.ParseException;
17 import java.util.ArrayList; 14 import java.util.ArrayList;
18 import java.util.List; 15 import java.util.List;
src/main/java/com/bsth/controller/realcontrol/RealMapController.java
1 package com.bsth.controller.realcontrol; 1 package com.bsth.controller.realcontrol;
2 2
3 -import com.bsth.data.gpsdata.arrival.GeoCacheData;  
4 -import com.bsth.data.gpsdata.arrival.entity.TimedEnableStationRoute;  
5 import com.bsth.service.realcontrol.RealMapService; 3 import com.bsth.service.realcontrol.RealMapService;
6 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.beans.factory.annotation.Autowired;
7 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMapping;
8 -import org.springframework.web.bind.annotation.RequestMethod;  
9 import org.springframework.web.bind.annotation.RequestParam; 6 import org.springframework.web.bind.annotation.RequestParam;
10 import org.springframework.web.bind.annotation.RestController; 7 import org.springframework.web.bind.annotation.RestController;
11 8
@@ -77,9 +74,4 @@ public class RealMapController { @@ -77,9 +74,4 @@ public class RealMapController {
77 public Map<String, Object> multiSectionRoute(@RequestParam String codeIdx){ 74 public Map<String, Object> multiSectionRoute(@RequestParam String codeIdx){
78 return realMapService.multiSectionRoute(codeIdx); 75 return realMapService.multiSectionRoute(codeIdx);
79 } 76 }
80 -  
81 - @RequestMapping(value = "/lockAndFlxedTimeEnabled", method = RequestMethod.POST)  
82 - public void lockAndFlxedTimeEnabled(TimedEnableStationRoute tes){  
83 - GeoCacheData.tesMap.put(tes.getLineCode(), tes);  
84 - }  
85 } 77 }
src/main/java/com/bsth/controller/realcontrol/ServiceDataInterface.java
@@ -5,8 +5,8 @@ import com.bsth.data.BasicData; @@ -5,8 +5,8 @@ import com.bsth.data.BasicData;
5 import com.bsth.data.directive.DayOfDirectives; 5 import com.bsth.data.directive.DayOfDirectives;
6 import com.bsth.data.directive.DirectiveCreator; 6 import com.bsth.data.directive.DirectiveCreator;
7 import com.bsth.data.directive.GatewayHttpUtils; 7 import com.bsth.data.directive.GatewayHttpUtils;
8 -import com.bsth.data.gpsdata.GpsEntity;  
9 -import com.bsth.data.gpsdata.GpsRealData; 8 +import com.bsth.data.gpsdata_v2.GpsRealData;
  9 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
10 import com.bsth.data.schedule.DayOfSchedule; 10 import com.bsth.data.schedule.DayOfSchedule;
11 import com.bsth.entity.directive.D60; 11 import com.bsth.entity.directive.D60;
12 import com.bsth.entity.realcontrol.ScheduleRealInfo; 12 import com.bsth.entity.realcontrol.ScheduleRealInfo;
src/main/java/com/bsth/controller/realcontrol/SignalStateController.java
1 -package com.bsth.controller.realcontrol;  
2 -  
3 -import com.bsth.data.gpsdata.SignalStateData;  
4 -import com.bsth.data.gpsdata.arrival.entity.SignalState;  
5 -import org.springframework.beans.factory.annotation.Autowired;  
6 -import org.springframework.web.bind.annotation.RequestMapping;  
7 -import org.springframework.web.bind.annotation.RequestParam;  
8 -import org.springframework.web.bind.annotation.RestController;  
9 -  
10 -import java.util.List;  
11 -  
12 -/**  
13 - * Created by panzhao on 2016/12/30.  
14 - */  
15 -@RestController  
16 -@RequestMapping("signalState")  
17 -public class SignalStateController {  
18 -  
19 - @Autowired  
20 - SignalStateData signalStateData;  
21 -  
22 - @RequestMapping("/multi")  
23 - public List<SignalState> findByMultiLine(@RequestParam String idx){  
24 - return signalStateData.get(idx);  
25 - }  
26 -} 1 +//package com.bsth.controller.realcontrol;
  2 +//
  3 +//import com.bsth.data.gpsdata.SignalStateData;
  4 +//import com.bsth.data.gpsdata.arrival.entity.SignalState;
  5 +//import org.springframework.beans.factory.annotation.Autowired;
  6 +//import org.springframework.web.bind.annotation.RequestMapping;
  7 +//import org.springframework.web.bind.annotation.RequestParam;
  8 +//import org.springframework.web.bind.annotation.RestController;
  9 +//
  10 +//import java.util.List;
  11 +//
  12 +///**
  13 +// * Created by panzhao on 2016/12/30.
  14 +// */
  15 +//@RestController
  16 +//@RequestMapping("signalState")
  17 +//public class SignalStateController {
  18 +//
  19 +// @Autowired
  20 +// SignalStateData signalStateData;
  21 +//
  22 +// @RequestMapping("/multi")
  23 +// public List<SignalState> findByMultiLine(@RequestParam String idx){
  24 +// return signalStateData.get(idx);
  25 +// }
  26 +//}
src/main/java/com/bsth/controller/realcontrol/anomalyCheckController.java
1 package com.bsth.controller.realcontrol; 1 package com.bsth.controller.realcontrol;
2 2
3 -import com.bsth.data.gpsdata.arrival.GeoCacheData;  
4 -import com.bsth.data.gpsdata.arrival.GpsRealAnalyse;  
5 -import com.bsth.data.gpsdata.thread.GpsDataLoaderThread; 3 +import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
  4 +import com.bsth.data.gpsdata_v2.thread.GpsDataLoaderThread;
6 import com.bsth.data.msg_queue.DirectivePushQueue; 5 import com.bsth.data.msg_queue.DirectivePushQueue;
7 import com.bsth.data.msg_queue.WebSocketPushQueue; 6 import com.bsth.data.msg_queue.WebSocketPushQueue;
8 import com.bsth.data.schedule.DayOfSchedule; 7 import com.bsth.data.schedule.DayOfSchedule;
@@ -59,11 +58,6 @@ public class anomalyCheckController { @@ -59,11 +58,6 @@ public class anomalyCheckController {
59 } 58 }
60 } 59 }
61 60
62 - @RequestMapping(value = "/shutdownThreadPool")  
63 - public void shutdownThreadPool(){  
64 - GpsRealAnalyse.shutdown();  
65 - }  
66 -  
67 @RequestMapping(value = "/directivePushQueue") 61 @RequestMapping(value = "/directivePushQueue")
68 public void directivePushQueue(){ 62 public void directivePushQueue(){
69 DirectivePushQueue.start(); 63 DirectivePushQueue.start();
src/main/java/com/bsth/data/BasicData.java
1 package com.bsth.data; 1 package com.bsth.data;
2 2
3 -import com.bsth.data.gpsdata.arrival.GeoCacheData; 3 +import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
4 import com.bsth.data.pinyin.PersionPinYinBuffer; 4 import com.bsth.data.pinyin.PersionPinYinBuffer;
5 import com.bsth.entity.*; 5 import com.bsth.entity.*;
6 import com.bsth.entity.schedule.CarConfigInfo; 6 import com.bsth.entity.schedule.CarConfigInfo;
src/main/java/com/bsth/data/ThreadMonotor.java
1 package com.bsth.data; 1 package com.bsth.data;
2 2
3 -import com.bsth.data.gpsdata.arrival.GpsRealAnalyse;  
4 -import com.bsth.data.gpsdata.thread.GpsDataLoaderThread;  
5 import org.slf4j.Logger; 3 import org.slf4j.Logger;
6 import org.slf4j.LoggerFactory; 4 import org.slf4j.LoggerFactory;
7 import org.springframework.stereotype.Component; 5 import org.springframework.stereotype.Component;
@@ -23,10 +21,10 @@ public class ThreadMonotor extends Thread{ @@ -23,10 +21,10 @@ public class ThreadMonotor extends Thread{
23 GpsRealAnalyse.shutdown(); 21 GpsRealAnalyse.shutdown();
24 }*/ 22 }*/
25 23
26 - if(GpsRealAnalyse.isIdle()){ 24 + /*if(GpsRealAnalyse.isIdle()){
27 //切换到备用的网关实时GPS对照数据 25 //切换到备用的网关实时GPS对照数据
28 GpsDataLoaderThread.setFlag(-1); 26 GpsDataLoaderThread.setFlag(-1);
29 - } 27 + }*/
30 28
31 //webSocket 消息推送队列 29 //webSocket 消息推送队列
32 /*if(WebSocketPushQueue.isIdle()){ 30 /*if(WebSocketPushQueue.isIdle()){
src/main/java/com/bsth/data/directive/DayOfDirectives.java
@@ -152,13 +152,14 @@ public class DayOfDirectives { @@ -152,13 +152,14 @@ public class DayOfDirectives {
152 152
153 public void clear(String device){ 153 public void clear(String device){
154 int c60 = 0, c64 = 0; 154 int c60 = 0, c64 = 0;
155 - //找到该设备的60数据 155 +
156 Collection<D60> d60s = d60Map.values(); 156 Collection<D60> d60s = d60Map.values();
157 List<D60> rem60List = new ArrayList<>(); 157 List<D60> rem60List = new ArrayList<>();
158 for(D60 d60 : d60s){ 158 for(D60 d60 : d60s){
159 if(device.equals(d60.getDeviceId())) 159 if(device.equals(d60.getDeviceId()))
160 rem60List.add(d60); 160 rem60List.add(d60);
161 } 161 }
  162 +
162 //清除60数据 163 //清除60数据
163 for(D60 d60 : rem60List){ 164 for(D60 d60 : rem60List){
164 if(d60.getReply47() == null) 165 if(d60.getReply47() == null)
@@ -166,6 +167,8 @@ public class DayOfDirectives { @@ -166,6 +167,8 @@ public class DayOfDirectives {
166 if(null != d60Map.remove(d60.getMsgId())) 167 if(null != d60Map.remove(d60.getMsgId()))
167 c60 ++; 168 c60 ++;
168 } 169 }
  170 +
  171 + rem60List.clear();
169 if(c60 > 0) 172 if(c60 > 0)
170 logger.info("清除60数据 ," + c60); 173 logger.info("清除60数据 ," + c60);
171 174
@@ -186,6 +189,7 @@ public class DayOfDirectives { @@ -186,6 +189,7 @@ public class DayOfDirectives {
186 c64 ++; 189 c64 ++;
187 } 190 }
188 191
  192 + rem64List.clear();
189 if(c64 > 0) 193 if(c64 > 0)
190 logger.info("清除64数据 ," + c64); 194 logger.info("清除64数据 ," + c64);
191 } 195 }
src/main/java/com/bsth/data/forecast/ForecastRealServer.java
@@ -4,8 +4,8 @@ import com.bsth.data.forecast.entity.ForecastResult; @@ -4,8 +4,8 @@ import com.bsth.data.forecast.entity.ForecastResult;
4 import com.bsth.data.forecast.entity.ForecastResult.ForecastResultItem; 4 import com.bsth.data.forecast.entity.ForecastResult.ForecastResultItem;
5 import com.bsth.data.forecast.entity.SimpleRoute; 5 import com.bsth.data.forecast.entity.SimpleRoute;
6 import com.bsth.data.forecast.entity.SimpleRoute.TimeRange; 6 import com.bsth.data.forecast.entity.SimpleRoute.TimeRange;
7 -import com.bsth.data.gpsdata.GpsEntity;  
8 -import com.bsth.data.gpsdata.GpsRealData; 7 +import com.bsth.data.gpsdata_v2.GpsRealData;
  8 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
9 import com.bsth.data.schedule.DayOfSchedule; 9 import com.bsth.data.schedule.DayOfSchedule;
10 import com.bsth.entity.realcontrol.ScheduleRealInfo; 10 import com.bsth.entity.realcontrol.ScheduleRealInfo;
11 import com.google.common.collect.ArrayListMultimap; 11 import com.google.common.collect.ArrayListMultimap;
src/main/java/com/bsth/data/gpsdata/SignalStateData.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata;  
2 -  
3 -import com.bsth.data.gpsdata.arrival.entity.SignalState;  
4 -import com.bsth.websocket.handler.SendUtils;  
5 -import com.google.common.base.Splitter;  
6 -import com.google.common.collect.ArrayListMultimap;  
7 -import org.springframework.beans.factory.annotation.Autowired;  
8 -import org.springframework.stereotype.Component;  
9 -  
10 -import java.util.ArrayList;  
11 -import java.util.List;  
12 -  
13 -/**  
14 - * 信号状态数据  
15 - * Created by panzhao on 2016/12/30.  
16 - */  
17 -@Component  
18 -public class SignalStateData {  
19 -  
20 - @Autowired  
21 - SendUtils sendUtils;  
22 -  
23 - private static ArrayListMultimap<String, SignalState> listMultimap = ArrayListMultimap.create();  
24 -  
25 - public void put(SignalState state){  
26 - //listMultimap.put(state.getLineCode(), state);  
27 - //推送到客户端  
28 - //sendUtils.sendSignalState(state);  
29 - }  
30 -  
31 - public List<SignalState> get(String idx){  
32 - List<SignalState> rs = new ArrayList<>();  
33 - List<String> ids = Splitter.on(",").splitToList(idx);  
34 -  
35 - for(String lineCode : ids){  
36 - rs.addAll(listMultimap.get(lineCode));  
37 - }  
38 - return rs;  
39 - }  
40 -}  
src/main/java/com/bsth/data/gpsdata/arrival/GeoCacheData.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.arrival.entity.StationRoute;  
5 -import com.bsth.data.gpsdata.arrival.entity.TimedEnableStationRoute;  
6 -import com.bsth.data.gpsdata.arrival.precondition.entity.PreconditionGeo;  
7 -import com.bsth.data.gpsdata.arrival.utils.CircleQueue;  
8 -import com.bsth.data.gpsdata.arrival.utils.StationRouteComp;  
9 -import com.google.common.base.Splitter;  
10 -import com.google.common.collect.ArrayListMultimap;  
11 -import com.vividsolutions.jts.geom.Coordinate;  
12 -import com.vividsolutions.jts.geom.GeometryFactory;  
13 -import com.vividsolutions.jts.geom.LineString;  
14 -import com.vividsolutions.jts.geom.Polygon;  
15 -import org.apache.commons.lang3.StringUtils;  
16 -import org.slf4j.Logger;  
17 -import org.slf4j.LoggerFactory;  
18 -import org.springframework.beans.factory.annotation.Autowired;  
19 -import org.springframework.jdbc.core.BeanPropertyRowMapper;  
20 -import org.springframework.jdbc.core.JdbcTemplate;  
21 -import org.springframework.jdbc.core.RowMapper;  
22 -import org.springframework.stereotype.Component;  
23 -  
24 -import java.sql.ResultSet;  
25 -import java.sql.SQLException;  
26 -import java.util.*;  
27 -  
28 -/**  
29 - * Created by panzhao on 2016/12/23.  
30 - */  
31 -@Component  
32 -public class GeoCacheData {  
33 -  
34 - static Logger logger = LoggerFactory.getLogger(GeoCacheData.class);  
35 -  
36 - //每辆车缓存最后500条gps  
37 - private static final int CACHE_SIZE = 500;  
38 - private static Map<String, CircleQueue<GpsEntity>> gpsCacheMap = new HashMap<>();  
39 -  
40 - //线路路段走向  
41 - private static ArrayListMultimap<String, LineString> sectionCacheMap;  
42 -  
43 - //路段编码和名称对照  
44 - private static Map<String, String> sectionCode2Name;  
45 -  
46 - //线路站点路由  
47 - private static ArrayListMultimap<String, StationRoute> stationCacheMap;  
48 - //线路前置进站围栏  
49 - public static ArrayListMultimap<String, PreconditionGeo> premiseGeoMap;  
50 -  
51 - //线路_上下行_站点编码 ——> 站点  
52 - private static Map<String, StationRoute> routeCodeMap;  
53 -  
54 - //停车场  
55 - public static Map<String, Polygon> tccMap;  
56 - //停车场  
57 - public static Map<String, com.bsth.util.Geo.Polygon> tccMap2;  
58 -  
59 - //线路限速信息  
60 - private static Map<String, Double> speedLimitMap;  
61 -  
62 - //需要定时刷新的站点路由  
63 - public static Map<String, TimedEnableStationRoute> tesMap = new HashMap<>();  
64 -  
65 - @Autowired  
66 - JdbcTemplate jdbcTemplate;  
67 -  
68 - public static CircleQueue<GpsEntity> getGps(String nbbm) {  
69 - return gpsCacheMap.get(nbbm);  
70 - }  
71 -  
72 - public static void putGps(GpsEntity gps) {  
73 - CircleQueue<GpsEntity> queue = gpsCacheMap.get(gps.getNbbm());  
74 - if (queue == null) {  
75 - queue = new CircleQueue<>(CACHE_SIZE);  
76 - gpsCacheMap.put(gps.getNbbm(), queue);  
77 - }  
78 - queue.add(gps);  
79 - }  
80 -  
81 - public static void clear(String nbbm) {  
82 - try {  
83 - CircleQueue<GpsEntity> queue = gpsCacheMap.get(nbbm);  
84 - if (queue != null)  
85 - queue.clear();  
86 - } catch (Exception e) {  
87 - logger.error("", e);  
88 - }  
89 - }  
90 -  
91 - public static Map<String, String> sectionCode2NameMap(){  
92 - return sectionCode2Name;  
93 - }  
94 -  
95 - public static StationRoute getRouteCode(GpsEntity gps) {  
96 - return routeCodeMap.get(gps.getLineId() + "_" + gps.getUpDown() + "_" + gps.getStopNo());  
97 - }  
98 -  
99 - public static List<StationRoute> getStationRoute(String lineCode, int directions) {  
100 - return stationCacheMap.get(lineCode + "_" + directions);  
101 - }  
102 -  
103 - public static StationRoute getStation(String lineCode, int directions, String code) {  
104 - List<StationRoute> list = getStationRoute(lineCode, directions);  
105 -  
106 - for (StationRoute sr : list) {  
107 - if (sr.getCode().equals(code)) {  
108 - return sr;  
109 - }  
110 - }  
111 - return null;  
112 - }  
113 -  
114 - public static Double speedLimit(String lineCode){  
115 - return speedLimitMap.get(lineCode);  
116 - }  
117 -  
118 - public static List<LineString> getLineStringList(GpsEntity gps){  
119 - return sectionCacheMap.get(gps.getLineId() + "_" + gps.getUpDown());  
120 - }  
121 -  
122 - public static List<StationRoute> midwayStation(String lineCode, int directions, String sCode, String eCode) {  
123 - List<StationRoute> list = getStationRoute(lineCode, directions), rs = new ArrayList<>();  
124 -  
125 - boolean flag = false;  
126 - for (StationRoute sr : list) {  
127 - if (flag)  
128 - rs.add(sr);  
129 - if (sr.getCode().equals(sCode))  
130 - flag = true;  
131 - else if (sr.getCode().equals(eCode))  
132 - break;  
133 - }  
134 - return rs;  
135 - }  
136 -  
137 - public static Polygon getTccPolygon(String code) {  
138 - return tccMap.get(code);  
139 - }  
140 -  
141 - GeometryFactory geometryFactory = new GeometryFactory();  
142 - public void loadData() {  
143 - loadStationRoutesData();  
144 - loadTccMapData();  
145 - loadSpeedLimit();  
146 -  
147 - //加载路段信息  
148 - loadRoadsData();  
149 -  
150 - //加载前置进站围栏  
151 - loadPremiseGeoData();  
152 - }  
153 -  
154 - private void loadPremiseGeoData() {  
155 - ArrayListMultimap<String, PreconditionGeo> premiseGeoMapCopy = ArrayListMultimap.create();  
156 -  
157 - String sql = "select * from bsth_f_geo_premise";  
158 - List<PreconditionGeo> list = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(PreconditionGeo.class));  
159 -  
160 - List<String> coordList;  
161 - String[] cs;  
162 - com.bsth.util.Geo.Point point;  
163 - List<com.bsth.util.Geo.Point> ps;  
164 - StationRoute sr;  
165 - for(PreconditionGeo p : list){  
166 - try{  
167 - sr = routeCodeMap.get(p.getLineCode()+"_"+p.getUpDown()+"_"+p.getStationCode());  
168 - p.setOrder(sr.getRouteSort());  
169 - //polygon  
170 - ps = new ArrayList<>();  
171 - coordList = Splitter.on(",").trimResults().splitToList(p.getCoords());  
172 - for(String c : coordList){  
173 - cs = c.split(" ");  
174 - point = new com.bsth.util.Geo.Point(Double.parseDouble(cs[0]), Double.parseDouble(cs[1]));  
175 - ps.add(point);  
176 - }  
177 -  
178 - p.setPolygon(new com.bsth.util.Geo.Polygon(ps));  
179 -  
180 - sr.setPremise(true);  
181 - //按线路,走向分组  
182 - premiseGeoMapCopy.put(p.getLineCode()+"_"+p.getUpDown(), p);  
183 - }catch (Exception e){  
184 - logger.error("", e);  
185 - }  
186 - }  
187 -  
188 - //排序  
189 - Set<String> ks = premiseGeoMapCopy.keySet();  
190 - PreconditionGeoComp comp = new PreconditionGeoComp();  
191 - for(String k : ks){  
192 - Collections.sort(premiseGeoMapCopy.get(k), comp);  
193 - }  
194 -  
195 - premiseGeoMap = premiseGeoMapCopy;  
196 - }  
197 -  
198 - private static class PreconditionGeoComp implements Comparator<PreconditionGeo>{  
199 -  
200 - @Override  
201 - public int compare(PreconditionGeo p1, PreconditionGeo p2) {  
202 - return p1.getOrder() - p2.getOrder();  
203 - }  
204 - }  
205 -  
206 - private void loadRoadsData() {  
207 - //加载线路下路段空间数据  
208 - String sql = "select r.LINE_CODE,r.SECTION_CODE,r.SECTIONROUTE_CODE,s.SECTION_NAME,ST_AsText(s.GSECTION_VECTOR) as GSECTION_VECTOR, r.DIRECTIONS, s.CROSES_ROAD from bsth_c_sectionroute r INNER JOIN bsth_c_section s on r.section=s.id where r.destroy=0 and GSECTION_VECTOR is not null order by line_code,directions,sectionroute_code";  
209 - List<Map<String, Object>> secList = jdbcTemplate.queryForList(sql);  
210 -  
211 - String polygonStr, key;  
212 - String[] coords;  
213 - int i, len;  
214 - ArrayListMultimap<String, LineString> sectionCacheTempMap = ArrayListMultimap.create();  
215 - Coordinate[] cds;  
216 - String[] temps1, temps2;  
217 - for (Map<String, Object> tMap : secList) {  
218 - //空间数据映射  
219 - polygonStr = tMap.get("GSECTION_VECTOR").toString();  
220 - key = tMap.get("LINE_CODE") + "_" + tMap.get("DIRECTIONS");  
221 -  
222 - coords = polygonStr.substring(11, polygonStr.length() - 1).split(",");  
223 - len = coords.length - 1;  
224 - //每2个点连一条线  
225 - for(i = 0; i < len; i ++){  
226 - temps1 = coords[i].split(" ");  
227 - temps2 = coords[i + 1].split(" ");  
228 -  
229 - cds = new Coordinate[2];  
230 - cds[0] = new Coordinate(Float.parseFloat(temps1[1]), Float.parseFloat(temps1[0]));  
231 - cds[1] = new Coordinate(Float.parseFloat(temps2[1]), Float.parseFloat(temps2[0]));  
232 -  
233 - sectionCacheTempMap.put(key, geometryFactory.createLineString(cds));  
234 - }  
235 - }  
236 -  
237 - if(sectionCacheTempMap.size() > 0)  
238 - sectionCacheMap = sectionCacheTempMap;  
239 -  
240 - Map<String, String> sectionCode2NameTemp = new HashMap<>();  
241 -  
242 - //加载全量路段编码和名称对照  
243 - sql = "select SECTION_CODE,SECTION_NAME,CROSES_ROAD from bsth_c_section";  
244 - secList = jdbcTemplate.queryForList(sql);  
245 - String name = null, code;  
246 - for (Map<String, Object> tMap : secList) {  
247 - if(tMap.get("CROSES_ROAD") != null && StringUtils.isNotEmpty(tMap.get("CROSES_ROAD").toString()))  
248 - name = tMap.get("CROSES_ROAD").toString();  
249 - else if(tMap.get("SECTION_NAME") != null && StringUtils.isNotEmpty(tMap.get("SECTION_NAME").toString()))  
250 - name = tMap.get("SECTION_NAME").toString();  
251 -  
252 - code = tMap.get("SECTION_CODE").toString();  
253 - sectionCode2NameTemp.put(code, name);  
254 - }  
255 - if(sectionCode2NameTemp.size() > 0)  
256 - sectionCode2Name = sectionCode2NameTemp;  
257 - }  
258 -  
259 - private void loadTccMapData(){  
260 - //加载停车场数据  
261 - String sql = "select PARK_CODE, ST_AsText(G_PARK_POINT) as G_PARK_POINT from bsth_c_car_park where park_code is not null and b_park_point is not null";  
262 - List<Map<String, Object>> tccList = jdbcTemplate.queryForList(sql);  
263 - Map<String, Polygon> tccTempMap = new HashMap<>();  
264 -  
265 - Polygon polygon;  
266 - for (Map<String, Object> tMap : tccList) {  
267 -  
268 - try {  
269 - polygon = geometryFactory.createPolygon(parsePolygon(tMap.get("G_PARK_POINT").toString()));  
270 - tccTempMap.put(tMap.get("PARK_CODE").toString()  
271 - , polygon);  
272 - } catch (Exception e) {  
273 - logger.error("停车场:" + tMap.get("PARK_CODE"), e);  
274 - }  
275 - }  
276 - if (tccTempMap.size() > 0){  
277 - tccMap = tccTempMap;  
278 - tccMap2 = convertPolygonMap(tccMap);  
279 - }  
280 - }  
281 -  
282 - private Map<String, com.bsth.util.Geo.Polygon> convertPolygonMap(Map<String, Polygon> tccMap) {  
283 - Map<String, com.bsth.util.Geo.Polygon> rsMap = new HashMap<>();  
284 - Set<String> ks = tccMap.keySet();  
285 - for(String k : ks){  
286 - rsMap.put(k, convertPolygon(tccMap.get(k)));  
287 - }  
288 - return rsMap;  
289 - }  
290 -  
291 - public static com.bsth.util.Geo.Polygon convertPolygon(Polygon polygon) {  
292 - List<com.bsth.util.Geo.Point> ps = new ArrayList<>();  
293 - com.bsth.util.Geo.Point p;  
294 -  
295 - Coordinate[] cs = polygon.getCoordinates();  
296 - for(int i = 0; i < cs.length;i ++){  
297 - p = new com.bsth.util.Geo.Point(cs[i].y, cs[i].x);  
298 - ps.add(p);  
299 - }  
300 - return new com.bsth.util.Geo.Polygon(ps);  
301 - }  
302 -  
303 - private void loadStationRoutesData(){  
304 - //加载站点路由  
305 - String sql = "select r.LINE_CODE,r.DIRECTIONS,r.STATION_CODE,r.STATION_MARK,s.SHAPES_TYPE,s.G_LONX,s.G_LATY,ST_AsText(s.G_POLYGON_GRID) as G_POLYGON_GRID,s.RADIUS, r.STATION_ROUTE_CODE,s.STATION_NAME from bsth_c_stationroute r left join bsth_c_station s on r.station=s.id where r.destroy=0 order by r.station_route_code";  
306 - List<StationRoute> routeList = jdbcTemplate.query(sql, new RowMapper<StationRoute>() {  
307 - @Override  
308 - public StationRoute mapRow(ResultSet rs, int rowNum) throws SQLException {  
309 - StationRoute sRoute = new StationRoute();  
310 - sRoute.setCode(rs.getString("STATION_CODE"));  
311 - sRoute.setLineCode(rs.getString("LINE_CODE"));  
312 - sRoute.setDirections(rs.getInt("DIRECTIONS"));  
313 - sRoute.setPoint(geometryFactory.createPoint(new Coordinate(rs.getFloat("G_LATY"), rs.getFloat("G_LONX"))));  
314 - sRoute.setRadius(rs.getFloat("RADIUS"));  
315 - sRoute.setRouteSort(rs.getInt("STATION_ROUTE_CODE"));  
316 - sRoute.setMark(rs.getString("STATION_MARK"));  
317 - sRoute.setName(rs.getString("STATION_NAME"));  
318 -  
319 - String shapesType = rs.getString("SHAPES_TYPE");  
320 - //多边形电子围栏  
321 - if (StringUtils.isNotEmpty(shapesType) && shapesType.equals("d")) {  
322 - sRoute.setPolygon(geometryFactory.createPolygon(parsePolygon(rs.getString("G_POLYGON_GRID"))));  
323 - }  
324 - return sRoute;  
325 - }  
326 - });  
327 - //按线路和走向分组  
328 - if (routeList.size() > 0) {  
329 - ArrayListMultimap<String, StationRoute> tempMap = ArrayListMultimap.create();  
330 - Map<String, StationRoute> codeMap = new HashMap<>(routeList.size());  
331 - for (StationRoute sr : routeList) {  
332 - tempMap.put(sr.getLineCode() + "_" + sr.getDirections(), sr);  
333 - //站点编码 ——> 和路由顺序对照  
334 - codeMap.put(sr.getLineCode() + "_" + sr.getDirections() + "_" + sr.getCode(), sr);  
335 - }  
336 -  
337 - StationRouteComp srCom = new StationRouteComp();  
338 - //连接路由  
339 - Set<String> set = tempMap.keySet();  
340 - for (String key : set) {  
341 - Collections.sort(tempMap.get(key), srCom);  
342 - connectStationRoute(tempMap.get(key));  
343 - }  
344 -  
345 - //定时启用的站点走向  
346 - if(tesMap.size() > 0){  
347 - List<String> rems = new ArrayList<>();  
348 - long t = System.currentTimeMillis();  
349 - for(TimedEnableStationRoute tes : tesMap.values()){  
350 - if(tes.getEnableTime() > t){  
351 - logger.info("锁住站点路由," + tes.getLineCode());  
352 - tempMap.replaceValues(tes.getLineCode() + "_0", stationCacheMap.get(tes.getLineCode() + "_0"));  
353 - tempMap.replaceValues(tes.getLineCode() + "_1", stationCacheMap.get(tes.getLineCode() + "_1"));  
354 - }  
355 - else  
356 - rems.add(tes.getLineCode());  
357 - }  
358 -  
359 - //remove  
360 - if(rems.size() > 0){  
361 - for(String lineCode : rems){  
362 - logger.info("启用路由," + lineCode);  
363 - tesMap.remove(lineCode);  
364 - }  
365 - }  
366 - }  
367 - stationCacheMap = tempMap;  
368 - routeCodeMap = codeMap;  
369 - }  
370 - }  
371 -  
372 - private void loadSpeedLimit(){  
373 - //加载线路限速信息  
374 - String sql = "select l.LINE_CODE,i.SPEEDING from bsth_c_line_information i left join bsth_c_line l on i.line=l.id where i.speed_limit is not null";  
375 - List<Map<String, Object>> speedMap = jdbcTemplate.queryForList(sql);  
376 - Map<String, Double> speedTempMap = new HashMap<>();  
377 - for (Map<String, Object> tMap : speedMap) {  
378 - try {  
379 - speedTempMap.put(tMap.get("LINE_CODE").toString(), Double.parseDouble(tMap.get("SPEEDING").toString()));  
380 - } catch (NumberFormatException e) {  
381 - logger.error("speeding is null...");  
382 - }  
383 - }  
384 - speedLimitMap = speedTempMap;  
385 - }  
386 -  
387 - private void connectStationRoute(List<StationRoute> list) {  
388 - int size = list.size();  
389 - StationRoute sr = null;  
390 - for (int i = 0; i < size; i++) {  
391 - sr = list.get(i);  
392 - //上一个  
393 - if (i > 0)  
394 - sr.setPrve(list.get(i - 1));  
395 - //下一个  
396 - if (i < size - 1)  
397 - sr.setNext(list.get(i + 1));  
398 - }  
399 - }  
400 -  
401 - public Coordinate[] parsePolygon(String polygonStr) {  
402 - String[] coords = polygonStr.substring(9, polygonStr.length() - 2).split(","), temps;  
403 -  
404 - Coordinate[] cds = new Coordinate[coords.length];  
405 - int len = coords.length;  
406 - for (int i = 0; i < len; i++) {  
407 - temps = coords[i].split(" ");  
408 - cds[i] = new Coordinate(Float.parseFloat(temps[1]), Float.parseFloat(temps[0]));  
409 - }  
410 - return cds;  
411 - }  
412 -  
413 - /**  
414 - * 是不是终点站  
415 - *  
416 - * @param lineId  
417 - * @param upDown  
418 - * @param stationCode  
419 - * @return  
420 - */  
421 - public static boolean isEndStation(String lineId, Byte upDown, String stationCode) {  
422 - StationRoute station = routeCodeMap.get(lineId + "_" + upDown + "_" + stationCode);  
423 - return station != null && station.getMark().equals("E");  
424 - }  
425 -}  
426 \ No newline at end of file 0 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/arrival/SignalHandle.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.arrival.entity.StationRoute;  
5 -import com.bsth.data.gpsdata.arrival.utils.CircleQueue;  
6 -import com.bsth.data.gpsdata.arrival.utils.GeoUtils;  
7 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
8 -import org.joda.time.format.DateTimeFormat;  
9 -import org.joda.time.format.DateTimeFormatter;  
10 -import org.slf4j.Logger;  
11 -import org.slf4j.LoggerFactory;  
12 -  
13 -import java.util.List;  
14 -  
15 -/**  
16 - * Created by panzhao on 2016/12/27.  
17 - */  
18 -public abstract class SignalHandle {  
19 -  
20 - public abstract boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs);  
21 -  
22 - protected boolean isNotEmpty(CircleQueue<GpsEntity> prevs) {  
23 - return prevs != null && prevs.size() > 0 && prevs.getTail() != null;  
24 - }  
25 -  
26 -/* protected boolean isDriftSignal(GpsEntity gps) {  
27 - return gps.getLat() == 0 || gps.getLon() == 0;  
28 - }*/  
29 -  
30 - /**  
31 - * gps掉线  
32 - * @param gps  
33 - * @return  
34 - */  
35 - protected boolean isGpsOffline(GpsEntity gps){  
36 - return gps.getLat() == 0 || gps.getLon() == 0;  
37 - }  
38 -  
39 - protected boolean isOffline(GpsEntity gps){  
40 - return gps.getAbnormalStatus() != null && gps.getAbnormalStatus().equals("offline");  
41 - }  
42 - /**  
43 - * 是不是异常信号  
44 - *  
45 - * @param gps  
46 - * @return protected boolean isAbnormal(GpsEntity gps) {  
47 - return gps.getLat() == 0 || gps.getLon() == 0;  
48 - }*/  
49 -  
50 - /**  
51 - * 连续异常信号个数统计  
52 - *  
53 - * @param  
54 - * @return protected int abnormalCount(CircleQueue<GpsEntity> prevs) {  
55 - * int count = 0;  
56 - * <p>  
57 - * if (!isNotEmpty(prevs))  
58 - * return count;  
59 - * <p>  
60 - * GpsEntity[] array = (GpsEntity[]) prevs.getQueue();  
61 - * GpsEntity gps;  
62 - * for (int i = array.length - 1; i > 0; i--) {  
63 - * gps = array[i];  
64 - * <p>  
65 - * if (isAbnormal(gps))  
66 - * count++;  
67 - * else  
68 - * break;  
69 - * }  
70 - * <p>  
71 - * return count;  
72 - * }  
73 - */  
74 -  
75 - Logger logger = LoggerFactory.getLogger(this.getClass());  
76 - private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm");  
77 - protected void transformUpdown(GpsEntity gps, ScheduleRealInfo sch) {  
78 - byte updown = Byte.parseByte(sch.getXlDir());  
79 - //gps 切换走向  
80 - gps.setUpDown(updown);  
81 - gps.setPremiseCode(null);  
82 -  
83 - List<StationRoute> srs = GeoCacheData.getStationRoute(sch.getXlBm(), updown);  
84 - StationRoute station = GeoUtils.gpsInStation(gps, srs);  
85 - if (station != null) {  
86 - gps.setStopNo(station.getCode());  
87 - }  
88 -  
89 - logger.info(gps.getTimestamp() + " -" + fmtHHmm.print(gps.getTimestamp()) + " 车辆 :" + gps.getNbbm() + " 切换到走向 : " + updown);  
90 - }  
91 -  
92 - /**  
93 - * 是否是从异常状态恢复的第一个信号  
94 - *  
95 - * @param gps  
96 - * @param prevs  
97 - * @return  
98 - */  
99 - protected boolean abnormalRecovery(GpsEntity gps, CircleQueue<GpsEntity> prevs) {  
100 - if (prevs == null || prevs.size() == 0)  
101 - return false;  
102 -  
103 - GpsEntity prev = prevs.getTail();  
104 - //从异常状态恢复  
105 - if (isGpsOffline(prev)  
106 - && !isGpsOffline(gps)) {  
107 - return true;  
108 - }  
109 -  
110 - return false;  
111 - }  
112 -}  
113 \ No newline at end of file 0 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/arrival/entity/ArrivalInfo.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.entity;  
2 -  
3 -/**  
4 - * 到离站信息  
5 - * Created by panzhao on 2017/2/20.  
6 - */  
7 -public class ArrivalInfo {  
8 -  
9 - private String lineCode;  
10 -  
11 - private String deviceId;  
12 -  
13 - /** 时间戳 */  
14 - private Long ts;  
15 -  
16 - private String stop;  
17 -  
18 - private Integer upDown;  
19 -  
20 - private int inOut;  
21 -  
22 -  
23 -}  
src/main/java/com/bsth/data/gpsdata/arrival/entity/RouteReverse.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.entity;  
2 -  
3 -/** 路由反转  
4 - * Created by panzhao on 2016/12/28.  
5 - */  
6 -public class RouteReverse {  
7 -  
8 - private String nbbm;  
9 - //反转个数  
10 - private int count;  
11 -  
12 - //详细 1,2,3,2,1  
13 - private String detail;  
14 -  
15 - //掉头站点  
16 - private String turned;  
17 -  
18 - //掉头时间  
19 - private long zt;  
20 -  
21 - //检测时间  
22 - private long ct;  
23 -  
24 - //是否闭合  
25 - private boolean close;  
26 -  
27 - //信号不明确  
28 - private boolean vague;  
29 -  
30 - public int getCount() {  
31 - return count;  
32 - }  
33 -  
34 - public void setCount(int count) {  
35 - this.count = count;  
36 - }  
37 -  
38 - public String getDetail() {  
39 - return detail;  
40 - }  
41 -  
42 - public void setDetail(String detail) {  
43 - this.detail = detail;  
44 - }  
45 -  
46 - public String getTurned() {  
47 - return turned;  
48 - }  
49 -  
50 - public void setTurned(String turned) {  
51 - this.turned = turned;  
52 - }  
53 -  
54 - public boolean isClose() {  
55 - return close;  
56 - }  
57 -  
58 - public void setClose(boolean close) {  
59 - this.close = close;  
60 - }  
61 -  
62 - public long getZt() {  
63 - return zt;  
64 - }  
65 -  
66 - public void setZt(long zt) {  
67 - this.zt = zt;  
68 - }  
69 -  
70 - public long getCt() {  
71 - return ct;  
72 - }  
73 -  
74 - public void setCt(long ct) {  
75 - this.ct = ct;  
76 - }  
77 -  
78 - public String getNbbm() {  
79 - return nbbm;  
80 - }  
81 -  
82 - public void setNbbm(String nbbm) {  
83 - this.nbbm = nbbm;  
84 - }  
85 -  
86 - public boolean isVague() {  
87 - return vague;  
88 - }  
89 -  
90 - public void setVague(boolean vague) {  
91 - this.vague = vague;  
92 - }  
93 -}  
94 \ No newline at end of file 0 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/arrival/entity/SignalAbnormal.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.entity;  
2 -  
3 -/**  
4 - * 班次信号异常(漂移 或 断线)  
5 - * Created by panzhao on 2016/12/31.  
6 - */  
7 -public class SignalAbnormal {  
8 -  
9 - private Long et;  
10 -  
11 - /** drift or reconnection */  
12 - private String abnormalType;  
13 -  
14 - private Long st;  
15 -  
16 - private String nearPoint;  
17 -  
18 - private String destCode;  
19 -  
20 - private Long ct;  
21 -  
22 - //0: 发车 1:到站  
23 - private int outOrIn;  
24 -  
25 - public Long getEt() {  
26 - return et;  
27 - }  
28 -  
29 - public void setEt(Long et) {  
30 - this.et = et;  
31 - }  
32 -  
33 - public String getAbnormalType() {  
34 - return abnormalType;  
35 - }  
36 -  
37 - public void setAbnormalType(String abnormalType) {  
38 - this.abnormalType = abnormalType;  
39 - }  
40 -  
41 - public Long getSt() {  
42 - return st;  
43 - }  
44 -  
45 - public void setSt(Long st) {  
46 - this.st = st;  
47 - }  
48 -  
49 - public String getNearPoint() {  
50 - return nearPoint;  
51 - }  
52 -  
53 - public void setNearPoint(String nearPoint) {  
54 - this.nearPoint = nearPoint;  
55 - }  
56 -  
57 - public Long getCt() {  
58 - return ct;  
59 - }  
60 -  
61 - public void setCt(Long ct) {  
62 - this.ct = ct;  
63 - }  
64 -  
65 - public int getOutOrIn() {  
66 - return outOrIn;  
67 - }  
68 -  
69 - public void setOutOrIn(int outOrIn) {  
70 - this.outOrIn = outOrIn;  
71 - }  
72 -  
73 - public String getDestCode() {  
74 - return destCode;  
75 - }  
76 -  
77 - public void setDestCode(String destCode) {  
78 - this.destCode = destCode;  
79 - }  
80 -}  
src/main/java/com/bsth/data/gpsdata/arrival/entity/SignalState.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.entity;  
2 -  
3 -import com.bsth.data.BasicData;  
4 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
5 -import org.joda.time.format.DateTimeFormat;  
6 -import org.joda.time.format.DateTimeFormatter;  
7 -  
8 -/**  
9 - * 信号状态  
10 - * Created by panzhao on 2016/12/30.  
11 - */  
12 -public class SignalState {  
13 -  
14 - private String type;  
15 -  
16 - private Long st;  
17 -  
18 - //private Long checkTime;  
19 -  
20 - private Long schId;  
21 -  
22 - private String lineCode;  
23 -  
24 - private String text;  
25 -  
26 - private RouteReverse reverse;  
27 -  
28 - private SignalAbnormal signalAbnormal;  
29 -  
30 - private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm");  
31 -  
32 - /**  
33 - * 记录区间调头  
34 - *  
35 - * @param sch  
36 - * @param reverse  
37 - * @return  
38 - */  
39 - public static SignalState reverseSignalSTate(ScheduleRealInfo sch, RouteReverse reverse) {  
40 - /*if(reverse.isVague())  
41 - return null;*/  
42 -  
43 - SignalState state = new SignalState();  
44 - state.setSchId(sch.getId());  
45 - state.setType("route_reverse");  
46 - //state.setCheckTime(System.currentTimeMillis());  
47 -  
48 - String stationName = BasicData.stationCode2NameMap.get(sch.getXlBm() + "_" + sch.getXlDir() + "_" + reverse.getTurned());  
49 - state.setText(fmtHHmm.print(reverse.getZt()) + " 从 " + stationName + " 站掉头");  
50 - state.setSt(sch.getFcsjActualTime());  
51 - state.setLineCode(sch.getXlBm());  
52 - state.setReverse(reverse);  
53 - return state;  
54 - }  
55 -  
56 - public static SignalState abnormalSignalSTate(ScheduleRealInfo sch, SignalAbnormal signalAbnormal) {  
57 - SignalState state = new SignalState();  
58 - state.setSchId(sch.getId());  
59 - state.setType("abnormal_signal");  
60 - //state.setCheckTime(signalAbnormal.getCt());  
61 - state.setLineCode(sch.getXlBm());  
62 -  
63 - String text = (fmtHHmm.print(signalAbnormal.getSt()) + " ~ " + fmtHHmm.print(signalAbnormal.getEt()));  
64 - String abnormType = signalAbnormal.getAbnormalType();  
65 - if (abnormType.equals("drift"))  
66 - text += "(GPS无效)";  
67 - else if (abnormType.equals("reconnection"))  
68 - text += "(信号丢失)";  
69 -  
70 - state.setText(text);  
71 - state.setSignalAbnormal(signalAbnormal);  
72 - return state;  
73 - }  
74 -  
75 - public String getType() {  
76 - return type;  
77 - }  
78 -  
79 - public void setType(String type) {  
80 - this.type = type;  
81 - }  
82 -  
83 - public long getSchId() {  
84 - return schId;  
85 - }  
86 -  
87 - public void setSchId(long schId) {  
88 - this.schId = schId;  
89 - }  
90 -  
91 - public String getLineCode() {  
92 - return lineCode;  
93 - }  
94 -  
95 - public void setLineCode(String lineCode) {  
96 - this.lineCode = lineCode;  
97 - }  
98 -  
99 - public Long getSt() {  
100 - return st;  
101 - }  
102 -  
103 - public void setSt(Long st) {  
104 - this.st = st;  
105 - }  
106 -  
107 - public String getText() {  
108 - return text;  
109 - }  
110 -  
111 - public void setText(String text) {  
112 - this.text = text;  
113 - }  
114 -  
115 - public RouteReverse getReverse() {  
116 - return reverse;  
117 - }  
118 -  
119 - public void setReverse(RouteReverse reverse) {  
120 - this.reverse = reverse;  
121 - }  
122 -  
123 - public SignalAbnormal getSignalAbnormal() {  
124 - return signalAbnormal;  
125 - }  
126 -  
127 - public void setSignalAbnormal(SignalAbnormal signalAbnormal) {  
128 - this.signalAbnormal = signalAbnormal;  
129 - }  
130 -}  
src/main/java/com/bsth/data/gpsdata/arrival/entity/TimedEnableStationRoute.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.entity;  
2 -  
3 -/**  
4 - * 定时启用站点路由  
5 - * Created by panzhao on 2017/8/28.  
6 - */  
7 -public class TimedEnableStationRoute {  
8 -  
9 - private String lineCode;  
10 -  
11 - private Long enableTime;  
12 -  
13 - public String getLineCode() {  
14 - return lineCode;  
15 - }  
16 -  
17 - public void setLineCode(String lineCode) {  
18 - this.lineCode = lineCode;  
19 - }  
20 -  
21 - public Long getEnableTime() {  
22 - return enableTime;  
23 - }  
24 -  
25 - public void setEnableTime(Long enableTime) {  
26 - this.enableTime = enableTime;  
27 - }  
28 -}  
src/main/java/com/bsth/data/gpsdata/arrival/handlers/CorrectSignalHandle.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.handlers;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.arrival.SignalHandle;  
5 -import com.bsth.data.gpsdata.arrival.utils.CircleQueue;  
6 -import com.bsth.data.gpsdata.status_manager.GpsStatusManager;  
7 -import com.bsth.data.schedule.DayOfSchedule;  
8 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
9 -import com.bsth.service.directive.DirectiveService;  
10 -import org.slf4j.Logger;  
11 -import org.slf4j.LoggerFactory;  
12 -import org.springframework.beans.factory.annotation.Autowired;  
13 -import org.springframework.stereotype.Component;  
14 -  
15 -/**  
16 - * 信号状态纠正  
17 - * Created by panzhao on 2016/12/27.  
18 - */  
19 -@Component  
20 -public class CorrectSignalHandle extends SignalHandle {  
21 -  
22 - @Autowired  
23 - DayOfSchedule dayOfSchedule;  
24 - @Autowired  
25 - DirectiveService directiveService;  
26 -  
27 - @Autowired  
28 - GpsStatusManager gpsStatusManager;  
29 -  
30 - Logger logger = LoggerFactory.getLogger(this.getClass());  
31 -  
32 - @Override  
33 - public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) {  
34 - ScheduleRealInfo task = dayOfSchedule.executeCurr(gps.getNbbm());  
35 - if(task == null)  
36 - return false;  
37 - //ScheduleRealInfo sch;  
38 -  
39 - //子任务  
40 - /*if(task.getClass().isAssignableFrom(ChildTaskPlan.class)){  
41 - ChildTaskPlan childTask = (ChildTaskPlan) task;  
42 - sch = childTask.getSchedule();  
43 - }  
44 - else  
45 - sch = (ScheduleRealInfo) task;*/  
46 -  
47 - byte updown = Byte.parseByte(task.getXlDir());  
48 - //走向  
49 - if(gps.getUpDown() != updown){  
50 - gps.setUpDown(updown);  
51 - //gps.setState(0);  
52 - }  
53 -  
54 - //(转发的数据不管)  
55 - if(gps.getSource() != 0){  
56 - //gps=非营运 或走向不对 && 班次=非空驶 ;切换到营运状态  
57 - if((!gps.isService() || gps.getUpDown() != updown) &&  
58 - !dayOfSchedule.emptyService(task)){  
59 - gpsStatusManager.changeServiceState(gps.getNbbm(), updown, 0, "同步@系统");  
60 - }  
61 -  
62 - //需要切换线路  
63 - if(!task.getXlBm().equals(gps.getLineId())){  
64 - gpsStatusManager.changeLine(gps.getNbbm(), task.getXlBm(), "同步@系统");  
65 - }  
66 - }  
67 -  
68 - return true;  
69 - }  
70 -}  
71 \ No newline at end of file 0 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/arrival/handlers/InOutStationSignalHandle.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.handlers;  
2 -  
3 -import com.bsth.data.LineConfigData;  
4 -import com.bsth.data.gpsdata.GpsEntity;  
5 -import com.bsth.data.gpsdata.arrival.GeoCacheData;  
6 -import com.bsth.data.gpsdata.arrival.SignalHandle;  
7 -import com.bsth.data.gpsdata.arrival.entity.StationRoute;  
8 -import com.bsth.data.gpsdata.arrival.utils.CircleQueue;  
9 -import com.bsth.data.gpsdata.arrival.utils.ScheduleSignalState;  
10 -import com.bsth.data.gpsdata.arrival.utils.SignalSchPlanMatcher;  
11 -import com.bsth.data.gpsdata.status_manager.GpsStatusManager;  
12 -import com.bsth.data.msg_queue.DirectivePushQueue;  
13 -import com.bsth.data.schedule.DayOfSchedule;  
14 -import com.bsth.data.schedule.ScheduleComparator;  
15 -import com.bsth.data.schedule.late_adjust.LateAdjustHandle;  
16 -import com.bsth.entity.realcontrol.LineConfig;  
17 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
18 -import com.bsth.websocket.handler.SendUtils;  
19 -import org.apache.commons.lang3.StringUtils;  
20 -import org.slf4j.Logger;  
21 -import org.slf4j.LoggerFactory;  
22 -import org.springframework.beans.factory.annotation.Autowired;  
23 -import org.springframework.stereotype.Component;  
24 -  
25 -import java.util.Collections;  
26 -import java.util.List;  
27 -  
28 -/**  
29 - * 进出站动作处理  
30 - * Created by panzhao on 2016/12/27.  
31 - */  
32 -@Component  
33 -public class InOutStationSignalHandle extends SignalHandle{  
34 -  
35 - Logger logger = LoggerFactory.getLogger(this.getClass());  
36 -  
37 - @Autowired  
38 - DayOfSchedule dayOfSchedule;  
39 -  
40 - @Autowired  
41 - LineConfigData lineConfigData;  
42 -  
43 - @Autowired  
44 - SendUtils sendUtils;  
45 -  
46 - @Autowired  
47 - ScheduleSignalState scheduleSignalState;  
48 -  
49 - @Autowired  
50 - SignalSchPlanMatcher signalSchPlanMatcher;  
51 -  
52 - @Autowired  
53 - GpsStatusManager gpsStatusManager;  
54 -  
55 - private final static int MAX_BEFORE_TIME = 1000 * 60 * 120;  
56 -  
57 - //最大的班次时间差,防止异常的GPS时间打乱数据  
58 - private final static int MAX_NORMAL_DIFF = 1000 * 60 * 60 * 12;  
59 -  
60 - @Override  
61 - public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) {  
62 - //忽略掉线信号  
63 - if(isGpsOffline(gps))  
64 - return false;  
65 -  
66 - /*//从异常状态恢复的第一个信号*/  
67 - if(abnormalRecovery(gps, prevs)){  
68 - //回溯一下之前的轨迹  
69 - //scheduleSignalState.signalRetrospect(gps);  
70 - return false;  
71 - }  
72 -  
73 - try{  
74 - if(isNotEmpty(prevs)){  
75 - GpsEntity prev = prevs.getTail();  
76 - if(isOutStation(gps, prev))  
77 - outStation(gps, prev);  
78 -  
79 -  
80 - if(isInStation(gps, prev))  
81 - inStation(gps, prev);  
82 - }  
83 - }catch (Exception e){  
84 - logger.error("in out error info ..", e);  
85 - }  
86 -  
87 - return true;  
88 - }  
89 -  
90 - private boolean isOutStation(GpsEntity gps, GpsEntity prev){  
91 - //从站内到站外  
92 - if(prev.getInstation() > 0 && gps.getInstation() == 0)  
93 - return true;  
94 -  
95 - //从站内到另一个站内  
96 - if(prev.getInstation() > 0 && gps.getInstation() > 0  
97 - && !prev.getStopNo().equals(gps.getStopNo()))  
98 - return true;  
99 -  
100 - //在被起点站覆盖的情况下出场  
101 - if(isOutPark(gps, prev)){  
102 - return true;  
103 - }  
104 - return false;  
105 - }  
106 -  
107 - private boolean isInStation(GpsEntity gps, GpsEntity prev){  
108 - //从站外到站内  
109 - if(prev.getInstation() == 0 && gps.getInstation() > 0  
110 - /*&& !prev.getStopNo().equals(gps.getStopNo())*/){  
111 - return true;  
112 - }  
113 -  
114 - //从站内到另一个站内  
115 - if(prev.getInstation() == 1 && gps.getInstation() == 1  
116 - && !prev.getStopNo().equals(gps.getStopNo())  
117 - && !prev.getStation().getName().equals(gps.getStation().getName()))  
118 - return true;  
119 -  
120 - //从场内到站内  
121 - if(prev.getInstation() == 2 && gps.getInstation() == 1){  
122 - return true;  
123 - }  
124 -  
125 - //被起点站覆盖的情况下进场  
126 - if(isInPark(gps, prev))  
127 - return true;  
128 - return false;  
129 - }  
130 -  
131 - /**  
132 - * 出站/出场  
133 - * @param gps 当前点  
134 - * @param prev 上一个点  
135 - */  
136 - private void outStation(GpsEntity gps, GpsEntity prev) {  
137 - ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());  
138 - String qdzCode = sch.getQdzCode();  
139 -  
140 - int diff = (int) (sch.getDfsjT() - gps.getTimestamp());  
141 -  
142 - //首班出场最多提前2小时  
143 - if((dayOfSchedule.isFirstOut(sch) && diff > MAX_BEFORE_TIME) || diff > MAX_BEFORE_TIME / 2)  
144 - return;  
145 -  
146 - //正常班次最大时间差  
147 - if(Math.abs(diff) > MAX_NORMAL_DIFF)  
148 - return;  
149 -  
150 - //起点发车  
151 - if(qdzCode != null  
152 - && prev.getStopNo().equals(qdzCode)  
153 - && (gps.getInstation()==0 || !gps.getStopNo().equals(prev.getStopNo()))  
154 - && !willDepart(gps, prev, sch)){  
155 -  
156 - gps.setPremiseCode(null);  
157 - //发车班次匹配  
158 - signalSchPlanMatcher.outMatch(gps, sch);  
159 - sch = dayOfSchedule.executeCurr(gps.getNbbm());  
160 -  
161 - //班次已经实发  
162 - if(StringUtils.isNotEmpty(sch.getFcsjActual())  
163 - && !outManyFit(gps, sch)){  
164 - return;  
165 - }  
166 -  
167 - //应用到离站缓冲区设置参数  
168 - long rsT = lineConfigData.applyOut(sch, gps.getTimestamp());  
169 -  
170 - //实发时间  
171 - sch.setFcsjActualAll(rsT);  
172 - sch.setSiginCompate(1);  
173 -  
174 - //出站既出场  
175 - outStationAndOutPark(sch);  
176 - //通知客户端  
177 - sendUtils.sendFcsj(sch);  
178 - //持久化  
179 - dayOfSchedule.save(sch);  
180 -  
181 - //清理应发未发标记  
182 - LateAdjustHandle.remove(sch.getClZbh());  
183 -  
184 - if(!gps.isService() && !dayOfSchedule.emptyService(sch)){  
185 - //切换成营运状态  
186 - gpsStatusManager.changeServiceState(sch.getClZbh(), sch.getXlDir(), 0, "发车@系统");  
187 - }  
188 -  
189 - logger.info("车辆:" + sch.getClZbh() + " 班次:" + sch.getDfsj() + "发车, 时间:" + sch.getFcsjActual());  
190 - }  
191 - else if(isOutSch(sch)){  
192 - //有出场动作(起点站覆盖停车场时,并且不设置出站既出场,逻辑可能会走到这里)  
193 - try{  
194 - if(isOutPark(gps, prev)){  
195 - if(prev.getCarparkNo().equals(sch.getQdzCode())){  
196 - //再试一下出场  
197 - GpsEntity prevClone = (GpsEntity) prev.clone(),  
198 - gpsClone = (GpsEntity) gps.clone();  
199 - prevClone.setStopNo(prevClone.getCarparkNo());  
200 - gpsClone.setInstation(0);  
201 - outStation(gpsClone, prevClone);  
202 - return;  
203 - }  
204 - }  
205 - }catch (Exception e){logger.error("",e);}  
206 -  
207 - ScheduleRealInfo next = dayOfSchedule.nextSame(sch);  
208 - //如果下一个班次是区间,并且是环线  
209 - if(next != null && next.getBcType().equals("region")){  
210 - next = dayOfSchedule.nextSame(next);  
211 - if(next == null || !next.getQdzName().equals(next.getZdzName())){  
212 - return;  
213 - }  
214 - }  
215 - if(next != null && prev.getStopNo().equals(next.getQdzCode())){  
216 - //发下一个班次  
217 - if(dayOfSchedule.addExecPlan(next))  
218 - outStation(gps, prev);  
219 - }  
220 - }  
221 - //当前班次是区间  
222 - else if(sch.getBcType().equals("region")){  
223 - ScheduleRealInfo next = dayOfSchedule.nextSame(sch);  
224 - if(next==null || !next.getQdzName().equals(next.getZdzName())){  
225 - return;  
226 - }  
227 - //是环线  
228 - if(prev.getStopNo().equals(next.getQdzCode())){  
229 - //发下一个班次  
230 - if(dayOfSchedule.addExecPlan(next))  
231 - outStation(gps, prev);  
232 - }  
233 - }  
234 - }  
235 -  
236 - /**  
237 - * 是否是一个更合适的发车信号  
238 - * @param gps  
239 - * @param sch  
240 - * @return  
241 - */  
242 - private boolean outManyFit(GpsEntity gps, ScheduleRealInfo sch) {  
243 - LineConfig conf = lineConfigData.get(sch.getXlBm());  
244 - if(null != conf && conf.isLockFirstOutTime())  
245 - return false;//锁定第一个发车信号,不匹配最佳  
246 -  
247 - if(StringUtils.isNotEmpty(sch.getZdsjActual()))  
248 - return false;  
249 -  
250 - long t1 = sch.getFcsjActualTime();  
251 - long t2 = gps.getTimestamp();  
252 - long c = sch.getDfsjT();  
253 -  
254 - /*if(c - t1 > 1000 * 60 * 15 && Math.abs(t2 - c) < 1000 * 60 * 5){  
255 - return true;  
256 - }*/  
257 - int threshold = 1000 * 60 * 5;  
258 - if(Math.abs(t2 - c) < threshold && c - t1 > threshold){  
259 - return true;  
260 - }  
261 - //if(Math.abs(t2 - c) < 1000 * 60 * 5 && c - t1 > 1000 * 60 * 5)  
262 - return false;  
263 - }  
264 -  
265 -  
266 - private void outStationAndOutPark(ScheduleRealInfo sch){  
267 - try{  
268 - LineConfig config = lineConfigData.get(sch.getXlBm());  
269 - //限定出站既出场的停车场  
270 - String park = config.getTwinsPark();  
271 - boolean limitPark = StringUtils.isNotEmpty(park);  
272 -  
273 - if (config != null && config.getOutConfig() == 2) {  
274 - //出站既出场  
275 - ScheduleRealInfo schPrev = dayOfSchedule.prev(sch);  
276 - if (schPrev != null && schPrev.getBcType().equals("out") && (schPrev.getBcsj()==0 || schPrev.getJhlcOrig().intValue()==0)  
277 - && (!limitPark || park.equals(schPrev.getQdzCode()))) {  
278 -  
279 - schPrev.setFcsjActualAll(sch.getFcsjActualTime());  
280 - schPrev.setZdsjActualAll(sch.getFcsjActualTime());  
281 - //起点实到  
282 - sch.setQdzArrDatesj(schPrev.getZdsjActual());  
283 -  
284 - sendUtils.refreshSch(schPrev);  
285 - dayOfSchedule.save(schPrev);  
286 - }  
287 - }  
288 - }catch (Exception e){  
289 - logger.error("", e);  
290 - }  
291 - }  
292 -  
293 - /**  
294 - * 进站  
295 - * @param gps 当前点  
296 - * @param prev 上一个点  
297 - */  
298 - private void inStation(GpsEntity gps, GpsEntity prev){  
299 - ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());  
300 -  
301 - if(gps.getStopNo().equals(sch.getZdzCode())  
302 - && (!gps.getStopNo().equals(prev.getStopNo()) || gps.getStopNo().equals(prev.getPremiseCode()))){  
303 -  
304 - int diff = 0;  
305 - try{  
306 - diff = (int) (sch.getZdsjT() - gps.getTimestamp());  
307 - }catch(NullPointerException e){  
308 - logger.info("NullPointerException " + sch.getXlName() + " 有班次无班次历时,,,检查一下是否需要出站既出场。");  
309 - }  
310 - //进场最多提前1.2小时  
311 - if((sch.getBcType().equals("in") && diff > MAX_BEFORE_TIME) || diff > MAX_BEFORE_TIME/2)  
312 - return;  
313 -  
314 - //正常班次最大时间差  
315 - if(Math.abs(diff) > MAX_NORMAL_DIFF)  
316 - return;  
317 -  
318 - //校验进站前置约束  
319 - if(!validInPremise(gps)){  
320 - return;  
321 - }  
322 -  
323 - //环线或内外圈 ,飘出去再回来  
324 - if(sch.getQdzCode().equals(sch.getZdzCode())  
325 - && StringUtils.isNotEmpty(sch.getFcsjActual())  
326 - && gps.getTimestamp() - sch.getFcsjActualTime() < 1000 * 60 * 3){  
327 - sch.clearFcsjActual();  
328 - sendUtils.refreshSch(sch);  
329 - return;  
330 - }  
331 -  
332 - //实达时间不覆盖  
333 - if(StringUtils.isNotEmpty(sch.getZdsjActual()))  
334 - return;  
335 -  
336 - //应用到离站缓冲区设置参数  
337 - long rsT = lineConfigData.applyIn(sch, gps.getTimestamp());  
338 -  
339 - sch.setZdsjActualAll(rsT);  
340 - sch.setSiginCompate(2);  
341 - //通知误点停靠程序,有车辆到站  
342 - LateAdjustHandle.carArrive(gps);  
343 -  
344 - //已完成班次数  
345 - int doneSum = dayOfSchedule.doneSum(sch.getClZbh());  
346 - ScheduleRealInfo next = dayOfSchedule.next(sch);  
347 - //持久化  
348 - dayOfSchedule.save(sch);  
349 -  
350 - if(next != null){  
351 - dayOfSchedule.addExecPlan(next);  
352 - //进站既进场  
353 - inStationAndInPark(sch, next);  
354 - }  
355 -  
356 - //该路牌的下一个班次,起点实际到达时间  
357 - ScheduleRealInfo lpNext = dayOfSchedule.nextByLp(sch);  
358 - if(lpNext != null){  
359 - lpNext.setQdzArrDatesj(sch.getZdsjActual());  
360 - }  
361 -  
362 - //通知客户端  
363 - sendUtils.sendZdsj(sch, lpNext, doneSum);  
364 - logger.info("车辆:" + sch.getClZbh() + " 班次:" + sch.getDfsj() + "到终点, 时间:" + sch.getZdsjActual());  
365 - //清除车辆误点调整监听  
366 - LateAdjustHandle.remove(sch.getClZbh());  
367 - //准备执行下一个班次  
368 - if (next != null) {  
369 - //将gps转换为下一个班次走向的站内信号  
370 - transformUpdown(gps, next);  
371 - //下发调度指令  
372 - DirectivePushQueue.put6002(next, doneSum, "到站@系统");  
373 -  
374 - //套跑 -下发线路切换指令  
375 - if(!next.getXlBm().equals(sch.getXlBm())){  
376 - gpsStatusManager.changeLine(next.getClZbh(), next.getXlBm(), "套跑@系统");  
377 - }  
378 -  
379 - //下一个班次是空驶班次  
380 - if(dayOfSchedule.emptyService(next))  
381 - nonService(sch, "空驶@系统");  
382 - } else  
383 - nonService(sch, "结束@系统");  
384 - }  
385 - else {  
386 - /*if(sch.getFcsjActual() == null){  
387 - //有进站,但班次没有实发,向前追溯一下信号  
388 - scheduleSignalState.signalRetrospect(gps, sch);  
389 - }  
390 -*/  
391 - //被起点站覆盖的情况下进场,没有设置出站既是出场,逻辑会走到这里(模拟进站信号)  
392 - if(isInSch(sch)){  
393 - try{  
394 - if(isInPark(gps, prev)){  
395 - if(gps.getCarparkNo().equals(sch.getZdzCode())){  
396 - //再试一下进场  
397 - GpsEntity gpsClone = (GpsEntity) gps.clone(),  
398 - prevClone = (GpsEntity) prev.clone();  
399 - gpsClone.setStopNo(gpsClone.getCarparkNo());  
400 - prevClone.setStopNo(null);  
401 - inStation(gpsClone, prevClone);  
402 - return;  
403 - }  
404 - }  
405 - }catch (Exception e){  
406 - logger.error("", e);  
407 - }  
408 - }  
409 -  
410 - //如果当前班次是出场,并且进的是下一个班次的终点  
411 - if(sch.getBcType().equals("out")){  
412 - ScheduleRealInfo next = dayOfSchedule.next(sch);  
413 - if(next != null && next.getZdzCode().equals(gps.getStopNo())){  
414 - List<ScheduleRealInfo> halfList = dayOfSchedule.findByNbbm(sch.getClZbh());  
415 - //和当前进站信号最匹配的一个班次  
416 - ScheduleRealInfo nearSch = nearScheduleByGpsIn(gps, halfList);  
417 -  
418 - if(nearSch != null){  
419 - //直接跳到这个班次  
420 - if(dayOfSchedule.addExecPlan(nearSch))  
421 - inStation(gps, prev);//重新进站  
422 - }  
423 - }  
424 - }  
425 - }  
426 - }  
427 -  
428 - /**  
429 - * 校验进站前置约束  
430 - * @param gps  
431 - * @return  
432 - */  
433 - private boolean validInPremise(GpsEntity gps) {  
434 - StationRoute sr = gps.getStation();  
435 - if(null == sr || !sr.isPremise())  
436 - return true;  
437 -  
438 - String premiseCode = gps.getPremiseCode();  
439 -  
440 - if(StringUtils.isNotEmpty(premiseCode) && premiseCode.equals(gps.getStopNo())){  
441 - logger.info("满足前置进站约束 " + premiseCode);  
442 - return true;  
443 - }  
444 - else{  
445 - logger.info(gps.getNbbm() + " not premiseCode 不满足前置进站约束 " + premiseCode);  
446 - }  
447 - return false;  
448 - }  
449 -  
450 - /**  
451 - * 和当前进站信号最匹配的一个班次  
452 - * @param gps  
453 - * @param halfList  
454 - * @return  
455 - */  
456 - private ScheduleRealInfo nearScheduleByGpsIn(GpsEntity gps, List<ScheduleRealInfo> halfList){  
457 - if(halfList == null || halfList.size() == 0)  
458 - return null;  
459 -  
460 - //排序  
461 - Collections.sort(halfList, new ScheduleComparator.FCSJ());  
462 - ScheduleRealInfo near = null;// = halfList.get(0);  
463 - ScheduleRealInfo sch;  
464 -  
465 - String stopId = gps.getStopNo();  
466 - for(int i = 0; i < halfList.size(); i ++){  
467 - sch = halfList.get(i);  
468 - if(!sch.getZdzCode().equals(stopId) || sch.getStatus()==2)  
469 - continue;  
470 -  
471 - if(sch.getZdsjT() < gps.getTimestamp())  
472 - near = sch;  
473 - else  
474 - break;  
475 -  
476 - }  
477 - return near;  
478 - }  
479 -  
480 - /**  
481 - * 进站既进场  
482 - * @param sch  
483 - */  
484 - private void inStationAndInPark(ScheduleRealInfo sch, ScheduleRealInfo next){  
485 - LineConfig config = lineConfigData.get(sch.getXlBm());  
486 - //限定出站既出场的停车场  
487 - String park = config.getTwinsPark();  
488 - boolean limitPark = StringUtils.isNotEmpty(park);  
489 -  
490 -  
491 - if (next.getBcType().equals("in") && config.getOutConfig() == 2 && (next.getBcsj()==0 || next.getJhlcOrig().intValue()==0)  
492 - && (!limitPark || park.equals(next.getZdzCode()))) {  
493 -  
494 - next.setFcsjActualAll(sch.getZdsjActualTime());  
495 - next.setZdsjActualAll(sch.getZdsjActualTime());  
496 -  
497 - sendUtils.refreshSch(next);  
498 - dayOfSchedule.save(next);  
499 -  
500 - //分班的时候,需要再跳过1个班次  
501 - next = dayOfSchedule.next(next);  
502 - if(next != null)  
503 - dayOfSchedule.addExecPlan(next);  
504 -  
505 - //进场,切换成非营运状态  
506 - nonService(sch, "进场@系统");  
507 - }  
508 - }  
509 -  
510 - /**  
511 - * 发车漂移判定(这里出现的误判,由车辆到达中途站的时候补偿)  
512 - * @param gps  
513 - * @param prev  
514 - * @param task  
515 - * @return  
516 - */  
517 - private boolean willDepart(GpsEntity gps, GpsEntity prev, Object task){  
518 -  
519 - /*ScheduleRealInfo sch = (ScheduleRealInfo) task;  
520 - ScheduleRealInfo prevTask = dayOfSchedule.prev(sch);  
521 - if(prevTask == null || prevTask.getBcType().equals("out"))  
522 - return false;  
523 -  
524 - //计划停站时间  
525 - int stopTimePlan = (int) (sch.getDfsjT() - prevTask.getZdsjT());  
526 -  
527 - if(stopTimePlan < 1000 * 60 * 10)  
528 - return false;  
529 -  
530 - //实际停站时间  
531 - if(prevTask.getZdsjActual() != null){  
532 - int actualTime = (int) (gps.getTimestamp() - prevTask.getZdsjActualTime());  
533 -  
534 - if(actualTime < stopTimePlan * 0.8){  
535 - logger.info("漂移判定");  
536 -  
537 - return true;  
538 - }  
539 - }*/  
540 - return false;  
541 - }  
542 -  
543 - private boolean isOutPark(GpsEntity gps, GpsEntity prve){  
544 - if(StringUtils.isNotEmpty(prve.getCarparkNo()) && StringUtils.isEmpty(gps.getCarparkNo()))  
545 - return true;  
546 - return false;  
547 - }  
548 -  
549 - private boolean isInPark(GpsEntity gps, GpsEntity prve){  
550 - if(StringUtils.isNotEmpty(gps.getCarparkNo()) && StringUtils.isEmpty(prve.getCarparkNo()))  
551 - return true;  
552 - return false;  
553 - }  
554 -  
555 - private boolean isOutSch(ScheduleRealInfo sch){  
556 - return sch.getBcType().equals("out") || GeoCacheData.tccMap.keySet().contains(sch.getQdzCode());  
557 - }  
558 -  
559 - private boolean isInSch(ScheduleRealInfo sch){  
560 - return sch.getBcType().equals("in") || GeoCacheData.tccMap.keySet().contains(sch.getZdzCode());  
561 - }  
562 -  
563 - /**  
564 - * 切换为非营运状态  
565 - * @param sch  
566 - * @param sender  
567 - */  
568 - private void nonService(ScheduleRealInfo sch, String sender){  
569 - gpsStatusManager.changeServiceState(sch.getClZbh(), sch.getXlDir(), 1, sender);  
570 - }  
571 -}  
572 \ No newline at end of file 0 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/arrival/handlers/OfflineSignalHandle.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.handlers;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.arrival.GeoCacheData;  
5 -import com.bsth.data.gpsdata.arrival.SignalHandle;  
6 -import com.bsth.data.gpsdata.arrival.utils.CircleQueue;  
7 -import org.springframework.stereotype.Component;  
8 -  
9 -/**  
10 - * 信号断线重连处理  
11 - * Created by panzhao on 2016/12/27.  
12 - */  
13 -@Component  
14 -public class OfflineSignalHandle extends SignalHandle{  
15 -  
16 - //断开4分钟,标记为重连信号  
17 - private final static int OFFLINE_TIME = 1000 * 60 * 4;  
18 -  
19 - //断开70分钟,之前的信号不再有参考价值  
20 - private final static int CLEAR_TIME = 1000 * 60 * 70;  
21 -  
22 - @Override  
23 - public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) {  
24 - //掉线信号不管  
25 - if(isGpsOffline(gps)){  
26 - gps.setSignalState("gps-offline");  
27 - gps.setAbnormalStatus("gps-offline");  
28 - return true;  
29 - }  
30 -  
31 - if(isNotEmpty(prevs)){  
32 - GpsEntity prev = prevs.getTail();  
33 - //间隔太大就丢弃,不管之前还是之后  
34 - int space = Math.abs((int) (gps.getTimestamp() - prev.getTimestamp()));  
35 - if(space > OFFLINE_TIME)  
36 - gps.setSignalState("reconnection");  
37 -  
38 - if(space > CLEAR_TIME){  
39 - //清理缓存的信号  
40 - GeoCacheData.clear(gps.getNbbm());  
41 - }  
42 - }  
43 - return true;  
44 - }  
45 -}  
46 \ No newline at end of file 0 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/arrival/handlers/ReverseSignalHandle.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.handlers;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.arrival.GeoCacheData;  
5 -import com.bsth.data.gpsdata.arrival.SignalHandle;  
6 -import com.bsth.data.gpsdata.arrival.entity.RouteReverse;  
7 -import com.bsth.data.gpsdata.arrival.entity.StationRoute;  
8 -import com.bsth.data.gpsdata.arrival.utils.CircleQueue;  
9 -import com.bsth.data.gpsdata.arrival.utils.ScheduleSignalState;  
10 -import com.bsth.data.schedule.DayOfSchedule;  
11 -import org.slf4j.Logger;  
12 -import org.slf4j.LoggerFactory;  
13 -import org.springframework.beans.factory.annotation.Autowired;  
14 -import org.springframework.stereotype.Component;  
15 -  
16 -/**  
17 - * 路由反向信号处理  
18 - * Created by panzhao on 2016/12/28.  
19 - */  
20 -@Component  
21 -public class ReverseSignalHandle extends SignalHandle {  
22 -  
23 - Logger logger = LoggerFactory.getLogger(this.getClass());  
24 -  
25 - @Autowired  
26 - DayOfSchedule dayOfSchedule;  
27 -  
28 - @Autowired  
29 - ScheduleSignalState scheduleSignalState;  
30 -  
31 - @Override  
32 - public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) {  
33 - if (!isNotEmpty(prevs))  
34 - return false;  
35 -  
36 - GpsEntity prev = prevs.getTail();  
37 -  
38 - if (isReverse(gps, prev)) {  
39 - RouteReverse reverse = reverseSearch(prevs, gps);  
40 -  
41 - if (reverse != null && reverse.getCount() >= 3  
42 - && reverse.isClose()  
43 - && !GeoCacheData.isEndStation(gps.getLineId(), gps.getUpDown(), reverse.getTurned())) {  
44 - scheduleSignalState.reverseAnalyse(reverse);  
45 - }  
46 - }  
47 - return false;  
48 - }  
49 -  
50 - /**  
51 - * 搜索路由反向详细  
52 - *  
53 - * @param prevs  
54 - * @param gps  
55 - * @return  
56 - */  
57 - public RouteReverse reverseSearch(CircleQueue<GpsEntity> prevs, GpsEntity gps) {  
58 - RouteReverse routeReverse = new RouteReverse();  
59 - int count = 0;  
60 - String path = "";  
61 - long zt = 0L;  
62 - boolean half = false;  
63 -  
64 - //当前站点  
65 - StationRoute curr = GeoCacheData.getRouteCode(gps), sr;  
66 - GpsEntity prev;  
67 - Object[] array = prevs.getQueue();  
68 - for (int i = array.length - 1; i > 0; i--) {  
69 - prev = (GpsEntity) array[i];  
70 -  
71 - if (!prev.getUpDown().equals(gps.getUpDown())  
72 - || prev.getSignalState().equals("reconnection"))  
73 - break;  
74 -  
75 - if (prev.getInstation() == 1) {  
76 - sr = GeoCacheData.getRouteCode(prev);  
77 - if(sr == null)  
78 - return null;  
79 -  
80 - if (sr.getRouteSort() > curr.getRouteSort()) {  
81 - if(half){  
82 - routeReverse.setVague(true);  
83 - }  
84 -  
85 - path += (curr.getCode() + ",");  
86 - count++;  
87 - zt = prev.getTimestamp();  
88 - } else if (sr.getRouteSort() < curr.getRouteSort()) {  
89 - if (routeReverse.getTurned() == null) {  
90 - routeReverse.setTurned(curr.getCode());  
91 - half = true;  
92 - }  
93 -  
94 - path += (curr.getCode() + ",");  
95 - //掉头前当前站  
96 - if (sr.getCode().equals(gps.getStopNo())) {  
97 - routeReverse.setClose(true);  
98 - path += sr.getCode();  
99 - break;  
100 - }  
101 - }  
102 -  
103 - curr = sr;  
104 - }  
105 - }  
106 -  
107 - routeReverse.setZt(zt);  
108 - routeReverse.setCount(count);  
109 - routeReverse.setDetail(path);  
110 - routeReverse.setCt(gps.getTimestamp());  
111 - routeReverse.setNbbm(gps.getNbbm());  
112 - return routeReverse;  
113 - }  
114 -  
115 - /**  
116 - * 是否反向  
117 - *  
118 - * @param gps  
119 - * @param prev  
120 - * @return  
121 - */  
122 - public boolean isReverse(GpsEntity gps, GpsEntity prev) {  
123 - if (gps.getInstation() == 1  
124 - &&  
125 - gps.getUpDown().equals(prev.getUpDown())  
126 - && !gps.getStopNo().equals(prev.getStopNo())) {  
127 -  
128 - StationRoute currStation = GeoCacheData.getRouteCode(gps);  
129 - StationRoute prevStation = GeoCacheData.getRouteCode(prev);  
130 -  
131 - if (currStation == null || prevStation == null)  
132 - return false;  
133 -  
134 - if (currStation.getRouteSort() < prevStation.getRouteSort())  
135 - return true;  
136 - }  
137 - return false;  
138 - }  
139 -}  
140 \ No newline at end of file 0 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/arrival/precondition/InPreconditionHandler.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.precondition;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import org.springframework.stereotype.Component;  
5 -  
6 -/**  
7 - * 进站(前置电子围栏)  
8 - * Created by panzhao on 2017/9/23.  
9 - */  
10 -@Component  
11 -public class InPreconditionHandler {  
12 -  
13 - /**  
14 - * 进站动作是否有通过前置围栏  
15 - * @param gps  
16 - * @param prev  
17 - * @return  
18 - */  
19 - public boolean isPass(GpsEntity gps, GpsEntity prev){  
20 - return false;  
21 - }  
22 -}  
src/main/java/com/bsth/data/gpsdata/arrival/utils/ScheduleSignalState.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.utils;  
2 -  
3 -import com.bsth.data.LineConfigData;  
4 -import com.bsth.data.gpsdata.GpsEntity;  
5 -import com.bsth.data.gpsdata.SignalStateData;  
6 -import com.bsth.data.gpsdata.arrival.GeoCacheData;  
7 -import com.bsth.data.gpsdata.arrival.entity.RouteReverse;  
8 -import com.bsth.data.gpsdata.arrival.entity.SignalAbnormal;  
9 -import com.bsth.data.gpsdata.arrival.entity.SignalState;  
10 -import com.bsth.data.schedule.DayOfSchedule;  
11 -import com.bsth.entity.realcontrol.LineConfig;  
12 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
13 -import org.slf4j.Logger;  
14 -import org.slf4j.LoggerFactory;  
15 -import org.springframework.beans.factory.annotation.Autowired;  
16 -import org.springframework.stereotype.Component;  
17 -  
18 -/**  
19 - * 班次信号状态分析  
20 - * Created by panzhao on 2016/12/29.  
21 - */  
22 -@Component  
23 -public class ScheduleSignalState {  
24 -  
25 - @Autowired  
26 - DayOfSchedule dayOfSchedule;  
27 -  
28 - Logger logger = LoggerFactory.getLogger(this.getClass());  
29 -  
30 - @Autowired  
31 - LineConfigData lineConfigData;  
32 -  
33 - @Autowired  
34 - SignalStateData signalStateData;  
35 -  
36 - /**  
37 - * 路由反向分析  
38 - */  
39 - public void reverseAnalyse(RouteReverse reverse) {  
40 - ScheduleRealInfo sch = dayOfSchedule.executeCurr(reverse.getNbbm());  
41 -  
42 - String bcType = sch.getBcType();  
43 -  
44 - switch (bcType) {  
45 - case "out":  
46 - outReverseAnalyse(sch, reverse);  
47 - break;  
48 - case "normal":  
49 - normalReverseAnalyse(sch, reverse);  
50 - break;  
51 - }  
52 - }  
53 -  
54 - /**  
55 - * 出场班次路由反向分析  
56 - *  
57 - * @param sch  
58 - */  
59 - private void outReverseAnalyse(ScheduleRealInfo sch, RouteReverse reverse) {  
60 - long t = reverse.getCt();  
61 - //出场班次终点时间前,允许反向轨迹  
62 - if (sch.getZdsjT() != null && sch.getZdsjT() > t) {  
63 - return;  
64 - }  
65 -  
66 - int rt;  
67 - //从实发 到 当前时间 < 计划运送时间 * 0.9  
68 - if (sch.getFcsjActual() != null && sch.getBcsj() != null) {  
69 - rt = (int) (t - sch.getFcsjActualTime());  
70 - if (rt < sch.getBcsj() * 0.9)  
71 - return;  
72 - }  
73 -  
74 - ScheduleRealInfo next = dayOfSchedule.next(sch);  
75 - if (next != null && next.getXlDir().equals(sch.getXlDir()))  
76 - return;  
77 -  
78 - if(next == null)  
79 - return;  
80 - //时间足够下一个班次待发时间运行到当前站  
81 - int runTime = reverse.getCount() * 1500 * 60;  
82 - if (next.getDfsjT() + runTime < t) {  
83 - //跳到下一个班次  
84 - dayOfSchedule.addExecPlan(next);  
85 - }  
86 - }  
87 -  
88 - /**  
89 - * 正常班次路由反向分析  
90 - *  
91 - * @param sch  
92 - * @param reverse  
93 - */  
94 - private void normalReverseAnalyse(ScheduleRealInfo sch, RouteReverse reverse) {  
95 - LineConfig conf = lineConfigData.get(sch.getXlBm());  
96 -  
97 - if (conf.isReadReverse()) {  
98 - //跳下一个班次  
99 - ScheduleRealInfo next = dayOfSchedule.next(sch);  
100 - if (next != null)  
101 - dayOfSchedule.addExecPlan(next);  
102 -  
103 - //记录信号状态  
104 - SignalState signalState = SignalState.reverseSignalSTate(sch, reverse);  
105 - if(signalState != null)  
106 - signalStateData.put(signalState);  
107 - }  
108 - }  
109 -  
110 - public void signalRetrospect(GpsEntity gps) {  
111 - signalRetrospect(gps, dayOfSchedule.executeCurr(gps.getNbbm()));  
112 - }  
113 -  
114 - /**  
115 - * 信号追溯  
116 - *  
117 - * @param gps  
118 - * @param sch  
119 - */  
120 - public void signalRetrospect(GpsEntity gps, ScheduleRealInfo sch) {  
121 - //回放数据,是否有掉线或者漂移  
122 - CircleQueue<GpsEntity> queue = GeoCacheData.getGps(gps.getNbbm());  
123 - if (queue == null || queue.size() == 0 /*|| gps.getInstation() == 0*/)  
124 - return;  
125 -  
126 - //起始时间点  
127 - long st = 0;  
128 - ScheduleRealInfo prev = dayOfSchedule.prev(sch);  
129 -  
130 - if (prev != null) {  
131 - if (prev.getZdsjActual() != null)  
132 - st = prev.getZdsjActualTime();  
133 - else  
134 - st = (GeoCacheData.midwayStation(gps.getLineId(), gps.getUpDown(), sch.getQdzCode(), gps.getStopNo()).size() + 1) * (1000 * 60 * 5);  
135 - }  
136 -  
137 - Object[] tempArray = queue.getQueue();  
138 - int len = tempArray.length;  
139 -  
140 - Object[] array = new Object[len + 1];  
141 - System.arraycopy(tempArray, 0, array, 0, len);  
142 - array[len] = gps;  
143 -  
144 - String gpsState = "";  
145 - GpsEntity tempGps, nearGps = null;  
146 - int i = len - 1;  
147 - for (; i >= 0; i--) {  
148 - tempGps = (GpsEntity) array[i];  
149 -  
150 - gpsState = tempGps.getSignalState();  
151 - if (gpsState.equals("truncation"))  
152 - break;  
153 - else if (gpsState.equals("drift")) {  
154 - nearGps = (GpsEntity) array[i + 1];  
155 - break;  
156 - } else if (gpsState.equals("reconnection")) {  
157 - nearGps = tempGps;  
158 - break;  
159 - }  
160 -  
161 - if (tempGps.getTimestamp() < st)  
162 - break;  
163 - }  
164 -  
165 - if (nearGps != null && i > 0) {  
166 - createSignalAbnormal(gpsState, nearGps, i, array, sch);  
167 - }  
168 - }  
169 -  
170 - private void createSignalAbnormal(String gpsState, GpsEntity nearGps, int i, Object[] array, ScheduleRealInfo sch) {  
171 - switch (gpsState) {  
172 - case "drift":  
173 - driftSignalAbnormal(nearGps, i, array, sch);  
174 - break;  
175 - case "reconnection":  
176 - offlineSignalAbnormal(nearGps, ((GpsEntity) array[i - 1]), sch);  
177 - break;  
178 - }  
179 - }  
180 -  
181 - /**  
182 - * 掉线异常状态记录  
183 - *  
184 - * @param e  
185 - * @param s  
186 - */  
187 - private void offlineSignalAbnormal(GpsEntity e, GpsEntity s, ScheduleRealInfo sch) {  
188 - long st = s.getTimestamp(), et = e.getTimestamp();  
189 -  
190 - //掉线超过10分钟才记录  
191 - if (et - st < (1000 * 60 * 10))  
192 - return;  
193 -  
194 - SignalAbnormal signalAbnormal = new SignalAbnormal();  
195 - signalAbnormal.setSt(st);  
196 - signalAbnormal.setEt(et);  
197 - signalAbnormal.setAbnormalType("reconnection");  
198 - signalAbnormal.setDestCode(sch.getQdzCode());  
199 - signalAbnormal.setOutOrIn(0);  
200 -  
201 - //截断GPS  
202 - e.setSignalState("truncation");  
203 -  
204 - //记录信号状态  
205 - SignalState signalState = SignalState.abnormalSignalSTate(sch, signalAbnormal);  
206 - signalStateData.put(signalState);  
207 - }  
208 -  
209 - /**  
210 - * 漂移异常状态记录  
211 - *  
212 - * @param nearGps  
213 - * @param i  
214 - * @param array  
215 - */  
216 - private void driftSignalAbnormal(GpsEntity nearGps, int i, Object[] array, ScheduleRealInfo sch) {  
217 - GpsEntity gps, s = null;  
218 - //找到漂移开始时间  
219 - for (; i >= 0; i--) {  
220 - gps = (GpsEntity) array[i];  
221 -  
222 - if (!gps.getSignalState().equals("drift") || i == 0  
223 - || gps.getSignalState().equals("truncation")) {  
224 - s = gps;  
225 - break;  
226 - }  
227 - }  
228 -  
229 - long st = s.getTimestamp(), et = nearGps.getTimestamp();  
230 - if (et - st < (1000 * 60 * 3))  
231 - return;  
232 - /*if (s != null){  
233 - st = s.getTimestamp();  
234 - //漂移小于3分钟  
235 - if(et - st < (1000 * 60 * 3))  
236 - return;  
237 - }*/  
238 -  
239 -  
240 - SignalAbnormal signalAbnormal = new SignalAbnormal();  
241 - signalAbnormal.setSt(st);  
242 - signalAbnormal.setEt(et);  
243 - signalAbnormal.setAbnormalType("drift");  
244 - signalAbnormal.setDestCode(sch.getQdzCode());  
245 - signalAbnormal.setOutOrIn(0);  
246 -  
247 - //截断GPS  
248 - nearGps.setSignalState("truncation");  
249 -  
250 - //记录信号状态  
251 - SignalState signalState = SignalState.abnormalSignalSTate(sch, signalAbnormal);  
252 - signalStateData.put(signalState);  
253 - }  
254 -}  
255 \ No newline at end of file 0 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/arrival/utils/SignalSchPlanMatcher.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.arrival.utils;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.schedule.DayOfSchedule;  
5 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
6 -import org.slf4j.Logger;  
7 -import org.slf4j.LoggerFactory;  
8 -import org.springframework.beans.factory.annotation.Autowired;  
9 -import org.springframework.stereotype.Component;  
10 -  
11 -/**  
12 - * 班次匹配器  
13 - * Created by panzhao on 2016/12/31.  
14 - */  
15 -@Component  
16 -public class SignalSchPlanMatcher {  
17 -  
18 - @Autowired  
19 - DayOfSchedule dayOfSchedule;  
20 -  
21 - Logger log = LoggerFactory.getLogger(this.getClass());  
22 -  
23 - /**  
24 - * 发车信号匹配  
25 - * @param outSigal  
26 - * @param sch  
27 - * @return  
28 - */  
29 - public void outMatch(GpsEntity outSigal, ScheduleRealInfo sch){  
30 - long t = outSigal.getTimestamp();  
31 - if(t < sch.getDfsjT())  
32 - return;  
33 -  
34 - try{  
35 - //会不会是分班没有完成  
36 - if(sch.getBcType().equals("in") && t - sch.getDfsjT() > 1000 * 60 * 20){  
37 - ScheduleRealInfo fbFirst = dayOfSchedule.nextByBcType(sch, "normal");  
38 -  
39 - if(fbFirst == null || !fbFirst.getQdzCode().equals(outSigal.getStopNo()))  
40 - return;  
41 -  
42 - long dt = fbFirst.getDfsjT();  
43 - //晚于待发前4分钟 -执行分班的首个营运  
44 - if(dt - t < 1000 * 60 * 4){  
45 - dayOfSchedule.addExecPlan(fbFirst);  
46 - return;  
47 - }  
48 - }  
49 -  
50 - //线路编码不匹配  
51 - if("out".equals(sch.getBcType()) && !sch.getXlBm().equals(outSigal.getLineId())){  
52 - ScheduleRealInfo nextOut = dayOfSchedule.nextByBcType(sch, "out");  
53 - if(nextOut != null && nextOut.getXlBm().equals(outSigal.getLineId())  
54 - && fcSpace(sch, outSigal) > fcSpace(nextOut, outSigal)){  
55 - dayOfSchedule.addExecPlan(nextOut);  
56 - return;  
57 - }  
58 - }  
59 - }catch (Exception e){  
60 - log.error("", e);  
61 - }  
62 -  
63 - //下一个相同走向的班次  
64 - ScheduleRealInfo next = dayOfSchedule.nextSame(sch);  
65 - if(next == null || !next.getQdzCode().equals(sch.getQdzCode()))  
66 - return;  
67 -  
68 - //晚于班次间隔百分之70,跳下一个班次  
69 - double s = (int) (next.getDfsjT() - sch.getDfsjT());  
70 - double r = (int) (t - sch.getDfsjT());  
71 - if(r / s > 0.7){  
72 - if(dayOfSchedule.addExecPlan(next))  
73 - outMatch(outSigal, next);  
74 - }  
75 - }  
76 -  
77 - public static int fcSpace(ScheduleRealInfo sch, GpsEntity gps){  
78 - return (int) Math.abs((sch.getDfsjT() - gps.getTimestamp()));  
79 - }  
80 -}  
src/main/java/com/bsth/data/gpsdata/thread/GpsDataLoaderThread.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.thread;  
2 -  
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONObject;  
5 -import com.bsth.data.BasicData;  
6 -import com.bsth.data.gpsdata.GpsEntity;  
7 -import com.bsth.data.gpsdata.GpsRealData;  
8 -import com.bsth.data.gpsdata.arrival.GpsRealAnalyse;  
9 -import com.bsth.util.ConfigUtil;  
10 -import org.apache.commons.lang3.StringUtils;  
11 -import org.apache.http.HttpEntity;  
12 -import org.apache.http.client.config.RequestConfig;  
13 -import org.apache.http.client.methods.CloseableHttpResponse;  
14 -import org.apache.http.client.methods.HttpGet;  
15 -import org.apache.http.impl.client.CloseableHttpClient;  
16 -import org.apache.http.impl.client.HttpClients;  
17 -import org.slf4j.Logger;  
18 -import org.slf4j.LoggerFactory;  
19 -import org.springframework.beans.factory.annotation.Autowired;  
20 -import org.springframework.stereotype.Component;  
21 -  
22 -import java.io.BufferedReader;  
23 -import java.io.InputStreamReader;  
24 -import java.util.ArrayList;  
25 -import java.util.List;  
26 -  
27 -/**  
28 - * Created by panzhao on 2017/1/11.  
29 - */  
30 -@Component  
31 -public class GpsDataLoaderThread extends Thread {  
32 -  
33 - Logger logger = LoggerFactory.getLogger(GpsDataLoaderThread.class);  
34 -  
35 - /**  
36 - * 构造函数  
37 - */  
38 - public GpsDataLoaderThread() {  
39 - url = ConfigUtil.get("http.gps.real.url");  
40 - clientUrl = ConfigUtil.get("http.gps.real.cache.url");  
41 - }  
42 -  
43 - // 网关数据接口地址  
44 - private static String url;  
45 - // GPS客户端内存数据接口  
46 - private static String clientUrl;  
47 -  
48 - //0:从GPS客户端内存获取 -1:从网关获取  
49 - private static int flag = 0;  
50 -  
51 - public static void setFlag(int v) {  
52 - flag = v;  
53 - }  
54 -  
55 - public static int getFlag(int v) {  
56 - return flag;  
57 - }  
58 -  
59 - @Autowired  
60 - GpsRealData gpsRealData;  
61 -  
62 - @Autowired  
63 - GpsRealAnalyse gpsRealAnalyse;  
64 -  
65 - @Override  
66 - public void run() {  
67 - try {  
68 - if (flag == 0)  
69 - load();  
70 - else  
71 - loadByGateway();  
72 - } catch (Exception e) {  
73 - logger.error("", e);  
74 - }  
75 - }  
76 -  
77 - /**  
78 - * 从网关获取实时GPS数据  
79 - *  
80 - * @throws Exception  
81 - */  
82 - public void loadByGateway() throws Exception {  
83 - List<GpsEntity> list = null;  
84 - List<GpsEntity> updateList = new ArrayList<>();  
85 - CloseableHttpClient httpClient = null;  
86 - CloseableHttpResponse response = null;  
87 - try {  
88 - httpClient = HttpClients.createDefault();  
89 - HttpGet get = new HttpGet(url);  
90 - //超时时间  
91 - RequestConfig requestConfig = RequestConfig.custom()  
92 - .setConnectTimeout(1500).setConnectionRequestTimeout(1000)  
93 - .setSocketTimeout(1500).build();  
94 - get.setConfig(requestConfig);  
95 -  
96 - response = httpClient.execute(get);  
97 -  
98 - HttpEntity entity = response.getEntity();  
99 - if (null != entity) {  
100 - BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));  
101 - StringBuilder stringBuffer = new StringBuilder();  
102 - String str;  
103 - while ((str = br.readLine()) != null)  
104 - stringBuffer.append(str);  
105 -  
106 - JSONObject jsonObj = JSON.parseObject(stringBuffer.toString());  
107 -  
108 - if (jsonObj != null)  
109 - list = JSON.parseArray(jsonObj.getString("data"), GpsEntity.class);  
110 -  
111 - //过滤掉无效的点位  
112 - list = filterInvalid(list);  
113 -  
114 - String nbbm;  
115 - GpsEntity old;  
116 - for (GpsEntity gps : list) {  
117 -  
118 - //没有设备号  
119 - if (StringUtils.isBlank(gps.getDeviceId()))  
120 - continue;  
121 -  
122 - old = gpsRealData.get(gps.getDeviceId());  
123 - if (old != null &&  
124 - old.getTimestamp().equals(gps.getTimestamp()) &&  
125 - old.getLat().equals(gps.getLat()) &&  
126 - old.getLon().equals(gps.getLon()))  
127 - continue;  
128 -  
129 - nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId());  
130 - if (StringUtils.isBlank(nbbm))  
131 - gps.setIncomplete(true);//标记为异常数据  
132 - else  
133 - gps.setNbbm(nbbm);  
134 - //有更新的点位  
135 - updateList.add(gps);  
136 - }  
137 - logger.info("全量点:" + list.size() + ",更新点" + updateList.size());  
138 - //分析数据  
139 - gpsRealAnalyse.analyse(updateList);  
140 - } else  
141 - logger.error("real gps result is null");  
142 - } catch (Exception e) {  
143 - logger.error("", e);  
144 - } finally {  
145 - if (null != httpClient)  
146 - httpClient.close();  
147 - if (null != response)  
148 - response.close();  
149 - }  
150 - }  
151 -  
152 - /**  
153 - * 过滤无效的gps点位  
154 - *  
155 - * @param list  
156 - * @return  
157 - */  
158 - private List<GpsEntity> filterInvalid(List<GpsEntity> list) {  
159 - List<GpsEntity> rsList = new ArrayList<>();  
160 -  
161 - try {  
162 - for (GpsEntity gps : list) {  
163 - if (gps.getValid() == 0)  
164 - rsList.add(gps);  
165 - }  
166 -  
167 - if (rsList.size() < list.size())  
168 - logger.info("过滤无效的点位 : " + (list.size() - rsList.size()));  
169 - } catch (Exception e) {  
170 - logger.error("", e);  
171 - rsList = list;  
172 - }  
173 - return rsList;  
174 - }  
175 -  
176 - /**  
177 - * 从客户端内存获取GPS数据  
178 - */  
179 - public void load() throws Exception {  
180 - List<GpsEntity> list;  
181 - CloseableHttpClient httpClient = null;  
182 - CloseableHttpResponse response = null;  
183 -  
184 - try {  
185 - logger.info("load start...");  
186 - httpClient = HttpClients.createDefault();  
187 - HttpGet get = new HttpGet(clientUrl);  
188 - //超时时间  
189 - RequestConfig requestConfig = RequestConfig.custom()  
190 - .setConnectTimeout(2000).setConnectionRequestTimeout(1000)  
191 - .setSocketTimeout(3000).build();  
192 - get.setConfig(requestConfig);  
193 -  
194 - response = httpClient.execute(get);  
195 -  
196 - HttpEntity entity = response.getEntity();  
197 - if (null != entity) {  
198 - BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));  
199 - StringBuilder stringBuffer = new StringBuilder();  
200 - String str;  
201 - while ((str = br.readLine()) != null)  
202 - stringBuffer.append(str);  
203 -  
204 - list = JSON.parseArray(stringBuffer.toString(), GpsEntity.class);  
205 -  
206 - //过滤掉无效的点位  
207 - list = filterInvalid(list);  
208 -  
209 - String nbbm;  
210 - logger.info("load end!");  
211 - for (GpsEntity gps : list) {  
212 -  
213 - //没有设备号  
214 - if (StringUtils.isBlank(gps.getDeviceId()))  
215 - continue;  
216 -  
217 - nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId());  
218 - if (StringUtils.isBlank(nbbm))  
219 - gps.setIncomplete(true);//标记为异常数据  
220 - else  
221 - gps.setNbbm(nbbm);  
222 - }  
223 - //分析数据  
224 - gpsRealAnalyse.analyse(list);  
225 - } else  
226 - logger.error("client gps result is null");  
227 - } catch (Exception e) {  
228 - logger.error("", e);  
229 - } finally {  
230 - if (null != httpClient)  
231 - httpClient.close();  
232 - if (null != response)  
233 - response.close();  
234 - }  
235 - }  
236 -}  
237 \ No newline at end of file 0 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/thread/OfflineMonitorThread.java deleted 100644 → 0
1 -package com.bsth.data.gpsdata.thread;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.GpsRealData;  
5 -import com.bsth.websocket.handler.SendUtils;  
6 -import org.slf4j.Logger;  
7 -import org.slf4j.LoggerFactory;  
8 -import org.springframework.beans.factory.annotation.Autowired;  
9 -import org.springframework.stereotype.Component;  
10 -  
11 -import java.util.Collection;  
12 -  
13 -/**  
14 - * GPS掉离线监控  
15 - * Created by panzhao on 2017/1/11.  
16 - */  
17 -@Component  
18 -public class OfflineMonitorThread extends Thread{  
19 -  
20 - @Autowired  
21 - GpsRealData gpsRealData;  
22 -  
23 - //掉线阈值  
24 - private final static int LOSE_TIME = 1000 * 60 * 10;  
25 -  
26 - Logger logger = LoggerFactory.getLogger(this.getClass());  
27 -  
28 - @Autowired  
29 - SendUtils sendUtils;  
30 -  
31 - //无任务时 离线阈值  
32 - //private final static int OFFLINE_TIME = 1000 * 60 * 10;  
33 -  
34 - @Override  
35 - public void run() {  
36 - try{  
37 - long t = System.currentTimeMillis();  
38 - Collection<GpsEntity> list = gpsRealData.all();  
39 -  
40 - String state;  
41 - for(GpsEntity gps : list){  
42 - state = gps.getAbnormalStatus();  
43 -  
44 - if(state != null && state.equals("offline"))  
45 - continue;  
46 -  
47 - if (t - gps.getTimestamp() > LOSE_TIME){  
48 - gps.offline();  
49 -  
50 - //通知页面有设备掉线  
51 - sendUtils.deviceOffline(gps);  
52 - }  
53 - }  
54 - }catch (Exception e){  
55 - logger.error("", e);  
56 - }  
57 - }  
58 -}  
src/main/java/com/bsth/data/gpsdata/arrival/GpsRealAnalyse.java renamed to src/main/java/com/bsth/data/gpsdata_v2/DataHandleProcess.java
1 -package com.bsth.data.gpsdata.arrival;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.GpsRealData;  
5 -import com.bsth.data.gpsdata.arrival.handlers.*;  
6 -import com.bsth.data.gpsdata.arrival.utils.CircleQueue;  
7 -import com.bsth.data.gpsdata.recovery.GpsDataRecovery;  
8 -import com.google.common.collect.ArrayListMultimap;  
9 -import org.slf4j.Logger;  
10 -import org.slf4j.LoggerFactory;  
11 -import org.springframework.beans.factory.annotation.Autowired;  
12 -import org.springframework.stereotype.Component;  
13 -  
14 -import java.util.*;  
15 -import java.util.concurrent.CountDownLatch;  
16 -import java.util.concurrent.ExecutorService;  
17 -import java.util.concurrent.Executors;  
18 -  
19 -/**  
20 - * gps 实时数据分析  
21 - * Created by panzhao on 2016/12/27.  
22 - */  
23 -@Component  
24 -public class GpsRealAnalyse {  
25 -  
26 - static Logger logger = LoggerFactory.getLogger(GpsRealAnalyse.class);  
27 -  
28 - @Autowired  
29 - OfflineSignalHandle offlineSignalHandle;  
30 - @Autowired  
31 - CorrectSignalHandle correctSignalHandle;  
32 - @Autowired  
33 - StationInsideHandle stationInsideHandle;  
34 - @Autowired  
35 - InOutStationSignalHandle inOutStationSignalHandle;  
36 - @Autowired  
37 - ReverseSignalHandle reverseSignalHandle;  
38 - @Autowired  
39 - AbnormalStateHandle abnormalStateHandle;  
40 -  
41 - @Autowired  
42 - GpsRealData gpsRealData;  
43 -  
44 - final static int POOL_SIZE = 25;  
45 - static ExecutorService threadPool = Executors.newFixedThreadPool(POOL_SIZE + 1);  
46 -  
47 - public static long st;  
48 - public static CountDownLatch count;  
49 -  
50 - public static boolean isBlock() {  
51 - return System.currentTimeMillis() - st > 1000 * 20;  
52 - }  
53 -  
54 - public static boolean isIdle(){  
55 - return System.currentTimeMillis() - st > 1000 * 60;  
56 - }  
57 -  
58 - public void analyse(List<GpsEntity> list) {  
59 - try {  
60 - if(list.size() == 0 || GpsDataRecovery.run)  
61 - return;  
62 - st = System.currentTimeMillis();  
63 -  
64 - //按设备号分组数据(一个设备号的多条数据,必须在一个线程里跑)  
65 - ArrayListMultimap multimap = ArrayListMultimap.create();  
66 - for (GpsEntity gps : list) {  
67 - multimap.put(gps.getDeviceId(), gps);  
68 - }  
69 - List<String> deviceList = new ArrayList<>(multimap.keySet());  
70 -  
71 - //数据均分给线程  
72 - ArrayListMultimap dataListMap = ArrayListMultimap.create();  
73 - int size = deviceList.size(), threadIndex=0, threadSize = size / POOL_SIZE;  
74 - for(int i = 0; i < size; i++){  
75 - if(i % threadSize == 0)  
76 - threadIndex ++;  
77 - dataListMap.putAll(threadIndex, multimap.get(deviceList.get(i)));  
78 - }  
79 - Set<Integer> ks = dataListMap.keySet();  
80 - logger.info("analyse gps size: " + list.size() + ", ks: " + ks.size());  
81 - count = new CountDownLatch(ks.size());  
82 -  
83 - for (Integer index : ks) {  
84 - threadPool.execute(new SignalHandleThread(dataListMap.get(index), count));  
85 - }  
86 -  
87 - //等待子线程结束  
88 - count.await();  
89 -  
90 - //加入实时gps对照  
91 - for (GpsEntity gps : list)  
92 - gpsRealData.put(gps);  
93 -  
94 - logger.info("time , " + (System.currentTimeMillis() - st));  
95 - } catch (Exception e) {  
96 - logger.error("", e);  
97 - }  
98 - }  
99 -  
100 - public static void shutdown() {  
101 - logger.warn("GpsRealAnalyse shutdown!!");  
102 - threadPool.shutdownNow();  
103 - long len = count.getCount();  
104 - for (int i = 0; i < len; i++) {  
105 - count.countDown();  
106 - }  
107 -  
108 - threadPool = Executors.newFixedThreadPool(100);  
109 - }  
110 -  
111 - static GpsComp comp = new GpsComp();  
112 -  
113 - public class SignalHandleThread implements Runnable {  
114 -  
115 - List<GpsEntity> list;  
116 - CountDownLatch count;  
117 -  
118 - SignalHandleThread(List<GpsEntity> gpsList, CountDownLatch count) {  
119 - this.list = gpsList;  
120 - this.count = count;  
121 - }  
122 -  
123 - @Override  
124 - public void run() {  
125 -  
126 - try {  
127 - Collections.sort(list, comp);  
128 - for (GpsEntity gps : list) {  
129 - try {  
130 - //是否有任务  
131 - boolean task;  
132 - CircleQueue<GpsEntity> prevs = GeoCacheData.getGps(gps.getNbbm());  
133 - //掉线处理  
134 - offlineSignalHandle.handle(gps, prevs);  
135 - //状态处理  
136 - task = correctSignalHandle.handle(gps, prevs);  
137 - //场,站内外判断  
138 - stationInsideHandle.handle(gps, prevs);  
139 - //异常判定(越界/超速)  
140 - abnormalStateHandle.handle(gps, prevs);  
141 -  
142 - if (!task)  
143 - continue; //无任务的,到这里就结束  
144 -  
145 - //反向处理  
146 - reverseSignalHandle.handle(gps, prevs);  
147 - //进出站动作处理  
148 - inOutStationSignalHandle.handle(gps, prevs);  
149 - GeoCacheData.putGps(gps);  
150 - }catch (Exception e){  
151 - logger.error("", e);  
152 - }  
153 - }  
154 - } finally {  
155 - if (count != null)  
156 - count.countDown();  
157 - }  
158 - }  
159 - }  
160 -  
161 - public static class GpsComp implements Comparator<GpsEntity> {  
162 -  
163 - @Override  
164 - public int compare(GpsEntity g1, GpsEntity g2) {  
165 - return g1.getTimestamp().compareTo(g2.getTimestamp());  
166 - }  
167 - }  
168 -} 1 +package com.bsth.data.gpsdata_v2;
  2 +
  3 +import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
  4 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  5 +import com.bsth.data.gpsdata_v2.handlers.*;
  6 +import com.google.common.collect.ArrayListMultimap;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import java.util.ArrayList;
  13 +import java.util.List;
  14 +import java.util.Set;
  15 +import java.util.concurrent.CountDownLatch;
  16 +import java.util.concurrent.ExecutorService;
  17 +import java.util.concurrent.Executors;
  18 +import java.util.concurrent.ThreadFactory;
  19 +
  20 +/**
  21 + * 实时信号数据处理
  22 + * Created by panzhao on 2017/11/15.
  23 + */
  24 +@Component
  25 +public class DataHandleProcess {
  26 +
  27 + static Logger logger = LoggerFactory.getLogger(DataHandleProcess.class);
  28 + final static int POOL_SIZE = 25;
  29 +
  30 + static ExecutorService threadPool = Executors.newFixedThreadPool(POOL_SIZE + 1, new HandlerThreadFactory());
  31 + public static CountDownLatch count;
  32 +
  33 + @Autowired
  34 + GpsStateProcess gpsStateProcess;
  35 + @Autowired
  36 + StationInsideProcess stationInsideProcess;
  37 + @Autowired
  38 + AbnormalStateProcess abnormalStateProcess;
  39 + @Autowired
  40 + InStationProcess inStationProcess;
  41 + @Autowired
  42 + OutStationProcess outStationProcess;
  43 + @Autowired
  44 + ReverseRouteProcess reverseRouteProcess;
  45 +
  46 + @Autowired
  47 + GpsRealData gpsRealData;
  48 +
  49 + public void handle(List<GpsEntity> list) {
  50 + try {
  51 + //按设备号分组数据(一个设备的多条数据,必须在一个线程里跑)
  52 + ArrayListMultimap multimap = ArrayListMultimap.create();
  53 + for (GpsEntity gps : list) {
  54 + multimap.put(gps.getDeviceId(), gps);
  55 + }
  56 + List<String> deviceList = new ArrayList<>(multimap.keySet());
  57 +
  58 + //数据均分给线程
  59 + ArrayListMultimap dataListMap = ArrayListMultimap.create();
  60 + int size = deviceList.size(), threadIndex = 0, threadSize = size / POOL_SIZE;
  61 + for (int i = 0; i < size; i++) {
  62 + if (i % threadSize == 0)
  63 + threadIndex++;
  64 + dataListMap.putAll(threadIndex, multimap.get(deviceList.get(i)));
  65 + }
  66 + Set<Integer> ks = dataListMap.keySet();
  67 + logger.info("analyse gps size: " + list.size() + ", ks: " + ks.size());
  68 + count = new CountDownLatch(ks.size());
  69 +
  70 + for (Integer index : ks) {
  71 + threadPool.submit(new SignalHandleThread(dataListMap.get(index), count));
  72 + }
  73 +
  74 + //等待子线程结束
  75 + count.await();
  76 +
  77 + //加入实时gps对照
  78 + for (GpsEntity gps : list)
  79 + gpsRealData.put(gps);
  80 + } catch (Exception e) {
  81 + logger.error("", e);
  82 + }
  83 + }
  84 +
  85 + public class SignalHandleThread implements Runnable {
  86 +
  87 + List<GpsEntity> list;
  88 + CountDownLatch count;
  89 +
  90 + SignalHandleThread(List<GpsEntity> gpsList, CountDownLatch count) {
  91 + this.list = gpsList;
  92 + this.count = count;
  93 + }
  94 +
  95 + @Override
  96 + public void run() {
  97 + try {
  98 + for (GpsEntity gps : list) {
  99 + try{
  100 + gpsStateProcess.process(gps);//状态处理
  101 + stationInsideProcess.process(gps);//场站内外判定
  102 + reverseRouteProcess.process(gps);//反向路由处理
  103 + abnormalStateProcess.process(gps);//超速越界
  104 +
  105 + inStationProcess.process(gps);//进站
  106 + outStationProcess.process(gps);//出站
  107 +
  108 + GpsCacheData.putGps(gps);//历史gps缓存
  109 + }catch (Exception e){
  110 + logger.error("", e);
  111 + }
  112 + }
  113 + } catch (Exception e) {
  114 + //logger.error("", e);
  115 + } finally {
  116 + if (count != null)
  117 + count.countDown();
  118 + }
  119 + }
  120 + }
  121 +
  122 + static class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
  123 + @Override
  124 + public void uncaughtException(Thread t, Throwable e) {
  125 + logger.error("caught " , e);
  126 + }
  127 + }
  128 +
  129 + static class HandlerThreadFactory implements ThreadFactory {
  130 + @Override
  131 + public Thread newThread(Runnable r) {
  132 + Thread t = new Thread(r);
  133 + t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
  134 + return t;
  135 + }
  136 + }
  137 +}
src/main/java/com/bsth/data/gpsdata/GpsRealData.java renamed to src/main/java/com/bsth/data/gpsdata_v2/GpsRealData.java
1 -package com.bsth.data.gpsdata;  
2 -  
3 -import com.bsth.data.BasicData;  
4 -import com.bsth.data.forecast.ForecastRealServer;  
5 -import com.bsth.data.schedule.DayOfSchedule;  
6 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
7 -import com.google.common.collect.TreeMultimap;  
8 -import org.apache.commons.lang3.StringUtils;  
9 -import org.slf4j.Logger;  
10 -import org.slf4j.LoggerFactory;  
11 -import org.springframework.beans.factory.annotation.Autowired;  
12 -import org.springframework.stereotype.Component;  
13 -  
14 -import java.util.*;  
15 -import java.util.concurrent.ConcurrentHashMap;  
16 -import java.util.concurrent.ConcurrentMap;  
17 -  
18 -/**  
19 - * @author PanZhao  
20 - * @ClassName: GpsRealData  
21 - * @Description: TODO(实时GPS数据集合)  
22 - * @date 2016年8月12日 下午2:04:41  
23 - */  
24 -@Component  
25 -public class GpsRealData {  
26 -  
27 - static Logger logger = LoggerFactory.getLogger(GpsRealData.class);  
28 -  
29 - private static ConcurrentMap<String, GpsEntity> gpsMap;  
30 -  
31 - //按线路分组设备号  
32 - private static TreeMultimap<String, String> lineCode2Devices;  
33 -  
34 - @Autowired  
35 - DayOfSchedule dayOfSchedule;  
36 -  
37 - @Autowired  
38 - ForecastRealServer forecastRealServer;  
39 -  
40 - /**  
41 - * 构造函数  
42 - */  
43 - public GpsRealData() {  
44 - gpsMap = new ConcurrentHashMap<>();  
45 - lineCode2Devices = TreeMultimap.create();  
46 - }  
47 -  
48 -  
49 - public void put(GpsEntity gps) {  
50 - String device = gps.getDeviceId();  
51 - GpsEntity old = gpsMap.get(device);  
52 -  
53 - try {  
54 - if (!StringUtils.isEmpty(gps.getStopNo())) {  
55 - //站点编码改变  
56 - if (null == old || !gps.getStopNo().equals(old.getStopNo())) {  
57 - gps.setArrTime(gps.getTimestamp());  
58 - //预测到达终点时间  
59 - forecastRealServer.forecast(gps.getNbbm(), gps);  
60 - } else {  
61 - gps.setArrTime(old.getArrTime());  
62 - //不预测, 重新计算终点时间  
63 - gps.setExpectStopTime(forecastRealServer.expectStopTime(gps.getNbbm()));  
64 - }  
65 - }  
66 -  
67 - //刷新对照  
68 - gpsMap.put(device, gps);  
69 - if (StringUtils.isNotBlank(gps.getLineId())) {  
70 - //站点名称  
71 - gps.setStationName(getStationName(gps));  
72 - lineCode2Devices.put(gps.getLineId(), device);  
73 -  
74 - if(old != null && !gps.getLineId().equals(old.getLineId()))  
75 - lineCode2Devices.remove(old.getLineId(), device);  
76 - }  
77 -  
78 - //车辆换设备了  
79 - String nbbm = gps.getNbbm();  
80 - if(old != null && StringUtils.isNotEmpty(nbbm) && !nbbm.equals(old.getNbbm())){  
81 - List<GpsEntity> list = findByNbbm(nbbm);  
82 - for(GpsEntity g : list){  
83 - if(!g.getDeviceId().equals(device))  
84 - gpsMap.remove(g.getDeviceId());  
85 - }  
86 - }  
87 - } catch (Exception e) {  
88 - logger.error("", e);  
89 - }  
90 - }  
91 -  
92 - public String getStationName(GpsEntity gps) {  
93 - return BasicData.getStationNameByCode(gps.getStopNo(), gps.getLineId() + "_" + gps.getUpDown() + "_");  
94 - }  
95 -  
96 - /**  
97 - * @Title: get @Description: TODO(设备号获取GPS)  
98 - */  
99 - public GpsEntity get(String deviceId) {  
100 - return gpsMap.get(deviceId);  
101 - }  
102 -  
103 - public List<GpsEntity> findByNbbm(String nbbm){  
104 - Collection<GpsEntity> arr = gpsMap.values();  
105 - List<GpsEntity> rs = new ArrayList<>();  
106 - for(GpsEntity g : arr){  
107 - if(nbbm.equals(g.getNbbm()))  
108 - rs.add(g);  
109 - }  
110 - return rs;  
111 - }  
112 -  
113 - public GpsEntity getByNbbm(String nbbm){  
114 - String device = BasicData.deviceId2NbbmMap.inverse().get(nbbm);  
115 - if(StringUtils.isNotBlank(device))  
116 - return get(device);  
117 - else  
118 - return null;  
119 - }  
120 -  
121 - /**  
122 - * @Title: get @Description: TODO(线路编码获取GPS集合) @throws  
123 - */  
124 - public List<GpsEntity> getByLine(String lineCode) {  
125 - NavigableSet<String> set = lineCode2Devices.get(lineCode);  
126 -  
127 - List<GpsEntity> rs = new ArrayList<>();  
128 - GpsEntity gps;  
129 - ScheduleRealInfo sch;  
130 - for (String device : set) {  
131 - gps = gpsMap.get(device);  
132 - //过滤异常GPS数据  
133 - if (gps == null || gps.isIncomplete())  
134 - continue;  
135 -  
136 - sch = dayOfSchedule.execPlanMap().get(gps.getNbbm());  
137 - if (null != sch)  
138 - gps.setSchId(sch.getId());  
139 - rs.add(gps);  
140 - }  
141 -  
142 - return rs;  
143 - }  
144 -  
145 - public List<GpsEntity> get(List<String> pArray) {  
146 - List<GpsEntity> list = new ArrayList<>();  
147 -  
148 - for (String code : pArray)  
149 - list.addAll(getByLine(code));  
150 - return list;  
151 - }  
152 -  
153 - public Set<String> allDevices() {  
154 - return gpsMap.keySet();  
155 - }  
156 -  
157 - public Collection<GpsEntity> all() {  
158 - return gpsMap.values();  
159 - }  
160 -  
161 - public void remove(String device) {  
162 - gpsMap.remove(device);  
163 - } 1 +package com.bsth.data.gpsdata_v2;
  2 +
  3 +import com.bsth.data.BasicData;
  4 +import com.bsth.data.forecast.ForecastRealServer;
  5 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  6 +import com.bsth.data.schedule.DayOfSchedule;
  7 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  8 +import com.google.common.collect.TreeMultimap;
  9 +import org.apache.commons.lang3.StringUtils;
  10 +import org.slf4j.Logger;
  11 +import org.slf4j.LoggerFactory;
  12 +import org.springframework.beans.factory.annotation.Autowired;
  13 +import org.springframework.stereotype.Component;
  14 +
  15 +import java.util.*;
  16 +import java.util.concurrent.ConcurrentHashMap;
  17 +import java.util.concurrent.ConcurrentMap;
  18 +
  19 +/**
  20 + * @author PanZhao
  21 + * @ClassName: GpsRealData
  22 + * @Description: TODO(实时GPS数据集合)
  23 + * @date 2016年8月12日 下午2:04:41
  24 + */
  25 +@Component
  26 +public class GpsRealData {
  27 +
  28 + static Logger logger = LoggerFactory.getLogger(GpsRealData.class);
  29 +
  30 + private static ConcurrentMap<String, GpsEntity> gpsMap;
  31 +
  32 + //按线路分组设备号
  33 + private static TreeMultimap<String, String> lineCode2Devices;
  34 +
  35 + @Autowired
  36 + DayOfSchedule dayOfSchedule;
  37 +
  38 + @Autowired
  39 + ForecastRealServer forecastRealServer;
  40 +
  41 + /**
  42 + * 构造函数
  43 + */
  44 + public GpsRealData() {
  45 + gpsMap = new ConcurrentHashMap<>();
  46 + lineCode2Devices = TreeMultimap.create();
  47 + }
  48 +
  49 +
  50 + public void put(GpsEntity gps) {
  51 + String device = gps.getDeviceId();
  52 + GpsEntity old = gpsMap.get(device);
  53 +
  54 + try {
  55 + if (!StringUtils.isEmpty(gps.getStopNo())) {
  56 + //站点编码改变
  57 + if (null == old || !gps.getStopNo().equals(old.getStopNo())) {
  58 + gps.setArrTime(gps.getTimestamp());
  59 + //预测到达终点时间
  60 + forecastRealServer.forecast(gps.getNbbm(), gps);
  61 + } else {
  62 + gps.setArrTime(old.getArrTime());
  63 + //不预测, 重新计算终点时间
  64 + gps.setExpectStopTime(forecastRealServer.expectStopTime(gps.getNbbm()));
  65 + }
  66 + }
  67 +
  68 + //刷新对照
  69 + gpsMap.put(device, gps);
  70 + if (StringUtils.isNotBlank(gps.getLineId())) {
  71 + //站点名称
  72 + gps.setStationName(getStationName(gps));
  73 + lineCode2Devices.put(gps.getLineId(), device);
  74 +
  75 + if(old != null && !gps.getLineId().equals(old.getLineId()))
  76 + lineCode2Devices.remove(old.getLineId(), device);
  77 + }
  78 +
  79 + //车辆换设备了
  80 + String nbbm = gps.getNbbm();
  81 + if(old != null && StringUtils.isNotEmpty(nbbm) && !nbbm.equals(old.getNbbm())){
  82 + List<GpsEntity> list = findByNbbm(nbbm);
  83 + for(GpsEntity g : list){
  84 + if(!g.getDeviceId().equals(device))
  85 + gpsMap.remove(g.getDeviceId());
  86 + }
  87 + }
  88 + } catch (Exception e) {
  89 + logger.error("", e);
  90 + }
  91 + }
  92 +
  93 + public String getStationName(GpsEntity gps) {
  94 + return BasicData.getStationNameByCode(gps.getStopNo(), gps.getLineId() + "_" + gps.getUpDown() + "_");
  95 + }
  96 +
  97 + /**
  98 + * @Title: get @Description: TODO(设备号获取GPS)
  99 + */
  100 + public GpsEntity get(String deviceId) {
  101 + return gpsMap.get(deviceId);
  102 + }
  103 +
  104 + public List<GpsEntity> findByNbbm(String nbbm){
  105 + Collection<GpsEntity> arr = gpsMap.values();
  106 + List<GpsEntity> rs = new ArrayList<>();
  107 + for(GpsEntity g : arr){
  108 + if(nbbm.equals(g.getNbbm()))
  109 + rs.add(g);
  110 + }
  111 + return rs;
  112 + }
  113 +
  114 + public GpsEntity getByNbbm(String nbbm){
  115 + String device = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
  116 + if(StringUtils.isNotBlank(device))
  117 + return get(device);
  118 + else
  119 + return null;
  120 + }
  121 +
  122 + /**
  123 + * @Title: get @Description: TODO(线路编码获取GPS集合) @throws
  124 + */
  125 + public List<GpsEntity> getByLine(String lineCode) {
  126 + NavigableSet<String> set = lineCode2Devices.get(lineCode);
  127 +
  128 + List<GpsEntity> rs = new ArrayList<>();
  129 + GpsEntity gps;
  130 + ScheduleRealInfo sch;
  131 + for (String device : set) {
  132 + gps = gpsMap.get(device);
  133 + //过滤异常GPS数据
  134 + if (gps == null || StringUtils.isBlank(gps.getNbbm()))
  135 + continue;
  136 +
  137 + sch = dayOfSchedule.execPlanMap().get(gps.getNbbm());
  138 + if (null != sch)
  139 + gps.setSchId(sch.getId());
  140 + rs.add(gps);
  141 + }
  142 +
  143 + return rs;
  144 + }
  145 +
  146 + public List<GpsEntity> get(List<String> pArray) {
  147 + List<GpsEntity> list = new ArrayList<>();
  148 +
  149 + for (String code : pArray)
  150 + list.addAll(getByLine(code));
  151 + return list;
  152 + }
  153 +
  154 + public Set<String> allDevices() {
  155 + return gpsMap.keySet();
  156 + }
  157 +
  158 + public Collection<GpsEntity> all() {
  159 + return gpsMap.values();
  160 + }
  161 +
  162 + public void remove(String device) {
  163 + gpsMap.remove(device);
  164 + }
164 } 165 }
165 \ No newline at end of file 166 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata_v2/cache/GeoCacheData.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.cache;
  2 +
  3 +import com.bsth.data.gpsdata_v2.entity.CtLineString;
  4 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  5 +import com.bsth.data.gpsdata_v2.entity.PreconditionGeo;
  6 +import com.bsth.data.gpsdata_v2.entity.StationRoute;
  7 +import com.bsth.data.gpsdata_v2.utils.StationRouteComp;
  8 +import com.bsth.util.Geo.Point;
  9 +import com.bsth.util.Geo.Polygon;
  10 +import com.google.common.base.Splitter;
  11 +import com.google.common.collect.ArrayListMultimap;
  12 +import org.apache.commons.lang3.StringUtils;
  13 +import org.slf4j.Logger;
  14 +import org.slf4j.LoggerFactory;
  15 +import org.springframework.beans.factory.annotation.Autowired;
  16 +import org.springframework.jdbc.core.BeanPropertyRowMapper;
  17 +import org.springframework.jdbc.core.JdbcTemplate;
  18 +import org.springframework.jdbc.core.RowMapper;
  19 +import org.springframework.stereotype.Component;
  20 +
  21 +import java.sql.ResultSet;
  22 +import java.sql.SQLException;
  23 +import java.util.*;
  24 +
  25 +/**
  26 + * 空间数据缓存
  27 + * Created by panzhao on 2017/11/15.
  28 + */
  29 +@Component
  30 +public class GeoCacheData {
  31 +
  32 + static Logger logger = LoggerFactory.getLogger(GeoCacheData.class);
  33 +
  34 + /**
  35 + * 线路路段走向
  36 + */
  37 + private static ArrayListMultimap<String, CtLineString> sectionCacheMap;
  38 + /**
  39 + * 路段编码和名称对照
  40 + */
  41 + private static Map<String, String> sectionCode2Name;
  42 + /**
  43 + * 线路站点路由
  44 + */
  45 + private static ArrayListMultimap<String, StationRoute> stationCacheMap;
  46 + /**
  47 + * 线路前置进站围栏
  48 + */
  49 + public static ArrayListMultimap<String, PreconditionGeo> premiseGeoMap;
  50 + /**
  51 + * 线路_上下行_站点编码 ——> 站点
  52 + */
  53 + private static Map<String, StationRoute> routeCodeMap;
  54 + /**
  55 + * 停车场
  56 + */
  57 + public static Map<String, Polygon> tccMap;
  58 + /**
  59 + * 线路限速信息
  60 + */
  61 + private static Map<String, Double> speedLimitMap;
  62 +
  63 + @Autowired
  64 + JdbcTemplate jdbcTemplate;
  65 +
  66 + public void loadData() {
  67 + loadStationRoutesData();
  68 + loadTccMapData();
  69 + loadSpeedLimit();
  70 +
  71 + //加载路段信息
  72 + loadRoadsData();
  73 +
  74 + //加载前置进站围栏
  75 + loadPremiseGeoData();
  76 + }
  77 +
  78 + public static List<StationRoute> getStationRoute(String lineCode, int directions) {
  79 + return stationCacheMap.get(lineCode + "_" + directions);
  80 + }
  81 +
  82 + public static StationRoute getRouteCode(GpsEntity gps) {
  83 + return routeCodeMap.get(gps.getLineId() + "_" + gps.getUpDown() + "_" + gps.getStopNo());
  84 + }
  85 +
  86 + public static Double speedLimit(String lineCode){
  87 + return speedLimitMap.get(lineCode);
  88 + }
  89 +
  90 + public static List<CtLineString> getLineStringList(GpsEntity gps){
  91 + return sectionCacheMap.get(gps.getLineId() + "_" + gps.getUpDown());
  92 + }
  93 +
  94 + private void loadStationRoutesData(){
  95 + String sql = "select r.LINE_CODE,r.DIRECTIONS,r.STATION_CODE,r.STATION_MARK,s.SHAPES_TYPE,s.G_LONX,s.G_LATY,ST_AsText(s.G_POLYGON_GRID) as G_POLYGON_GRID,s.RADIUS, r.STATION_ROUTE_CODE,s.STATION_NAME from bsth_c_stationroute r left join bsth_c_station s on r.station=s.id where r.destroy=0 order by r.station_route_code";
  96 + List<StationRoute> routeList = jdbcTemplate.query(sql, new RowMapper<StationRoute>() {
  97 +
  98 + @Override
  99 + public StationRoute mapRow(ResultSet rs, int rowNum) throws SQLException {
  100 + StationRoute sRoute = new StationRoute();
  101 + sRoute.setCode(rs.getString("STATION_CODE"));
  102 + sRoute.setLineCode(rs.getString("LINE_CODE"));
  103 + sRoute.setDirections(rs.getInt("DIRECTIONS"));
  104 + sRoute.setPoint(new Point(rs.getFloat("G_LONX"), rs.getFloat("G_LATY")));
  105 + sRoute.setRadius(rs.getFloat("RADIUS"));
  106 + sRoute.setRouteSort(rs.getInt("STATION_ROUTE_CODE"));
  107 + sRoute.setMark(rs.getString("STATION_MARK"));
  108 + sRoute.setName(rs.getString("STATION_NAME"));
  109 +
  110 + String shapesType = rs.getString("SHAPES_TYPE");
  111 + //多边形电子围栏
  112 + if (StringUtils.isNotEmpty(shapesType) && shapesType.equals("d"))
  113 + sRoute.setPolygon(parsePolygon(rs.getString("G_POLYGON_GRID")));
  114 + return sRoute;
  115 + }
  116 + });
  117 +
  118 + //按线路和走向分组
  119 + if (routeList.size() > 0) {
  120 + ArrayListMultimap<String, StationRoute> tempMap = ArrayListMultimap.create();
  121 + Map<String, StationRoute> codeMap = new HashMap<>(routeList.size());
  122 + for (StationRoute sr : routeList) {
  123 + tempMap.put(sr.getLineCode() + "_" + sr.getDirections(), sr);
  124 + //站点编码 ——> 和路由顺序对照
  125 + codeMap.put(sr.getLineCode() + "_" + sr.getDirections() + "_" + sr.getCode(), sr);
  126 + }
  127 +
  128 + StationRouteComp srCom = new StationRouteComp();
  129 + //连接路由
  130 + Set<String> set = tempMap.keySet();
  131 + for (String key : set) {
  132 + Collections.sort(tempMap.get(key), srCom);
  133 + connectStationRoute(tempMap.get(key));
  134 + }
  135 + stationCacheMap = tempMap;
  136 + routeCodeMap = codeMap;
  137 + }
  138 + }
  139 +
  140 + private void loadTccMapData(){
  141 + //加载停车场数据
  142 + String sql = "select PARK_CODE, ST_AsText(G_PARK_POINT) as G_PARK_POINT from bsth_c_car_park where park_code is not null and b_park_point is not null";
  143 + List<Map<String, Object>> tccList = jdbcTemplate.queryForList(sql);
  144 + Map<String, Polygon> tccTempMap = new HashMap<>();
  145 +
  146 + Polygon polygon;
  147 + for (Map<String, Object> tMap : tccList) {
  148 +
  149 + try {
  150 + polygon = parsePolygon(tMap.get("G_PARK_POINT").toString());
  151 + tccTempMap.put(tMap.get("PARK_CODE").toString()
  152 + , polygon);
  153 + } catch (Exception e) {
  154 + logger.error("停车场:" + tMap.get("PARK_CODE"), e);
  155 + }
  156 + }
  157 + if (tccTempMap.size() > 0){
  158 + tccMap = tccTempMap;
  159 + }
  160 + }
  161 +
  162 + private void loadSpeedLimit(){
  163 + //加载线路限速信息
  164 + String sql = "select l.LINE_CODE,i.SPEEDING from bsth_c_line_information i left join bsth_c_line l on i.line=l.id where i.speed_limit is not null";
  165 + List<Map<String, Object>> speedMap = jdbcTemplate.queryForList(sql);
  166 + Map<String, Double> speedTempMap = new HashMap<>();
  167 + for (Map<String, Object> tMap : speedMap) {
  168 + try {
  169 + speedTempMap.put(tMap.get("LINE_CODE").toString(), Double.parseDouble(tMap.get("SPEEDING").toString()));
  170 + } catch (NumberFormatException e) {
  171 + logger.error("speeding is null...");
  172 + }
  173 + }
  174 + speedLimitMap = speedTempMap;
  175 + }
  176 +
  177 + private void loadRoadsData() {
  178 + //加载线路下路段空间数据
  179 + String sql = "select r.LINE_CODE,r.SECTION_CODE,r.SECTIONROUTE_CODE,s.SECTION_NAME,ST_AsText(s.GSECTION_VECTOR) as GSECTION_VECTOR, r.DIRECTIONS, s.CROSES_ROAD from bsth_c_sectionroute r INNER JOIN bsth_c_section s on r.section=s.id where r.destroy=0 and GSECTION_VECTOR is not null order by line_code,directions,sectionroute_code";
  180 + List<Map<String, Object>> secList = jdbcTemplate.queryForList(sql);
  181 +
  182 + String polygonStr, key;
  183 + String[] coords;
  184 + int i, len;
  185 + ArrayListMultimap<String, CtLineString> sectionCacheTempMap = ArrayListMultimap.create();
  186 + String[] temps1, temps2;
  187 + CtLineString lineString;
  188 + for (Map<String, Object> tMap : secList) {
  189 + //空间数据映射
  190 + polygonStr = tMap.get("GSECTION_VECTOR").toString();
  191 + key = tMap.get("LINE_CODE") + "_" + tMap.get("DIRECTIONS");
  192 +
  193 + coords = polygonStr.substring(11, polygonStr.length() - 1).split(",");
  194 + len = coords.length - 1;
  195 + //每2个点连一条线
  196 + for(i = 0; i < len; i ++){
  197 + temps1 = coords[i].split(" ");
  198 + temps2 = coords[i + 1].split(" ");
  199 +
  200 + lineString = new CtLineString();
  201 + lineString.setS(new Point(Float.parseFloat(temps1[0]), Float.parseFloat(temps1[1])));
  202 + lineString.setE(new Point(Float.parseFloat(temps2[0]), Float.parseFloat(temps2[1])));
  203 +
  204 + sectionCacheTempMap.put(key, lineString);
  205 + }
  206 + }
  207 +
  208 + if(sectionCacheTempMap.size() > 0)
  209 + sectionCacheMap = sectionCacheTempMap;
  210 +
  211 + Map<String, String> sectionCode2NameTemp = new HashMap<>();
  212 +
  213 + //加载全量路段编码和名称对照
  214 + sql = "select SECTION_CODE,SECTION_NAME,CROSES_ROAD from bsth_c_section";
  215 + secList = jdbcTemplate.queryForList(sql);
  216 + String name = null, code;
  217 + for (Map<String, Object> tMap : secList) {
  218 + if(tMap.get("CROSES_ROAD") != null && StringUtils.isNotEmpty(tMap.get("CROSES_ROAD").toString()))
  219 + name = tMap.get("CROSES_ROAD").toString();
  220 + else if(tMap.get("SECTION_NAME") != null && StringUtils.isNotEmpty(tMap.get("SECTION_NAME").toString()))
  221 + name = tMap.get("SECTION_NAME").toString();
  222 +
  223 + code = tMap.get("SECTION_CODE").toString();
  224 + sectionCode2NameTemp.put(code, name);
  225 + }
  226 + if(sectionCode2NameTemp.size() > 0)
  227 + sectionCode2Name = sectionCode2NameTemp;
  228 + }
  229 +
  230 + private void loadPremiseGeoData() {
  231 + ArrayListMultimap<String, PreconditionGeo> premiseGeoMapCopy = ArrayListMultimap.create();
  232 +
  233 + String sql = "select * from bsth_f_geo_premise";
  234 + List<PreconditionGeo> list = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(PreconditionGeo.class));
  235 +
  236 + List<String> coordList;
  237 + String[] cs;
  238 + Point point;
  239 + List<Point> ps;
  240 + StationRoute sr;
  241 + for(PreconditionGeo p : list){
  242 + try{
  243 + sr = routeCodeMap.get(p.getLineCode()+"_"+p.getUpDown()+"_"+p.getStationCode());
  244 + p.setOrder(sr.getRouteSort());
  245 + //polygon
  246 + ps = new ArrayList<>();
  247 + coordList = Splitter.on(",").trimResults().splitToList(p.getCoords());
  248 + for(String c : coordList){
  249 + cs = c.split(" ");
  250 + point = new Point(Double.parseDouble(cs[0]), Double.parseDouble(cs[1]));
  251 + ps.add(point);
  252 + }
  253 +
  254 + p.setPolygon(new Polygon(ps));
  255 +
  256 + sr.setPremise(true);
  257 + //按线路,走向分组
  258 + premiseGeoMapCopy.put(p.getLineCode()+"_"+p.getUpDown(), p);
  259 + }catch (Exception e){
  260 + logger.error("", e);
  261 + }
  262 + }
  263 +
  264 + //排序
  265 + Set<String> ks = premiseGeoMapCopy.keySet();
  266 + PreconditionGeoComp comp = new PreconditionGeoComp();
  267 + for(String k : ks){
  268 + Collections.sort(premiseGeoMapCopy.get(k), comp);
  269 + }
  270 +
  271 + premiseGeoMap = premiseGeoMapCopy;
  272 + }
  273 +
  274 + public Polygon parsePolygon(String polygonStr) {
  275 + String[] coords = polygonStr.substring(9, polygonStr.length() - 2).split(","), temps;
  276 +
  277 + List<Point> cds = new ArrayList<>(coords.length);
  278 + int len = coords.length;
  279 + for (int i = 0; i < len; i++) {
  280 + temps = coords[i].split(" ");
  281 + cds.add(new Point(Float.parseFloat(temps[1]), Float.parseFloat(temps[0])));
  282 + }
  283 + return new Polygon(cds);
  284 + }
  285 +
  286 + private void connectStationRoute(List<StationRoute> list) {
  287 + int size = list.size();
  288 + StationRoute sr = null;
  289 + for (int i = 0; i < size; i++) {
  290 + sr = list.get(i);
  291 + //上一个
  292 + if (i > 0)
  293 + sr.setPrve(list.get(i - 1));
  294 + //下一个
  295 + if (i < size - 1)
  296 + sr.setNext(list.get(i + 1));
  297 + }
  298 + }
  299 +
  300 + private static class PreconditionGeoComp implements Comparator<PreconditionGeo>{
  301 +
  302 + @Override
  303 + public int compare(PreconditionGeo p1, PreconditionGeo p2) {
  304 + return p1.getOrder() - p2.getOrder();
  305 + }
  306 + }
  307 +
  308 + public static Map<String, String> sectionCode2NameMap(){
  309 + return sectionCode2Name;
  310 + }
  311 +}
src/main/java/com/bsth/data/gpsdata_v2/cache/GpsCacheData.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.cache;
  2 +
  3 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  4 +import com.bsth.data.gpsdata_v2.entity.StationRoute;
  5 +import com.bsth.data.gpsdata_v2.entity.trail.GpsExecTrail;
  6 +import com.bsth.data.gpsdata_v2.utils.CircleQueue;
  7 +import com.google.common.collect.ArrayListMultimap;
  8 +import org.slf4j.Logger;
  9 +import org.slf4j.LoggerFactory;
  10 +
  11 +import java.util.*;
  12 +
  13 +/**
  14 + * gps 数据缓存
  15 + * Created by panzhao on 2017/11/15.
  16 + */
  17 +public class GpsCacheData {
  18 +
  19 + /**
  20 + * 每辆车缓存最后300条gps
  21 + */
  22 + private static final int CACHE_SIZE = 300;
  23 + private static Map<String, CircleQueue<GpsEntity>> gpsCacheMap = new HashMap<>();
  24 +
  25 + /**
  26 + * 车辆执行班次的详细 进出站数据
  27 + */
  28 + private static ArrayListMultimap<String, GpsExecTrail> trailListMultimap = ArrayListMultimap.create();
  29 +
  30 + static Logger logger = LoggerFactory.getLogger(GpsCacheData.class);
  31 +
  32 + public static CircleQueue<GpsEntity> getGps(String device) {
  33 + return gpsCacheMap.get(device);
  34 + }
  35 +
  36 + public static GpsExecTrail gpsExecTrail(String nbbm){
  37 + List<GpsExecTrail> list = trailListMultimap.get(nbbm);
  38 +
  39 + GpsExecTrail trail;
  40 + if(null == list || list.size() == 0
  41 + || list.get(list.size() - 1).isEnd()){
  42 + trail = new GpsExecTrail();
  43 +
  44 + trailListMultimap.put(nbbm, trail);
  45 + }
  46 + else{
  47 + trail = list.get(list.size() - 1);
  48 + }
  49 +
  50 + return trail;
  51 + }
  52 +
  53 + public static void out(GpsEntity gps){
  54 + GpsExecTrail trail = gpsExecTrail(gps.getNbbm());
  55 + trail.getSrs().add(gps);
  56 +
  57 + }
  58 +
  59 + public static void in(GpsEntity gps, boolean end){
  60 + GpsExecTrail trail = gpsExecTrail(gps.getNbbm());
  61 + trail.getSrs().add(gps);
  62 + trail.setEnd(end);
  63 + }
  64 +
  65 + public static GpsEntity getPrev(GpsEntity gps){
  66 + CircleQueue<GpsEntity> queue = gpsCacheMap.get(gps.getDeviceId());
  67 + if(queue != null)
  68 + return queue.getTail();
  69 + return null;
  70 + }
  71 +
  72 + public static void putGps(GpsEntity gps) {
  73 + CircleQueue<GpsEntity> queue = gpsCacheMap.get(gps.getDeviceId());
  74 + if (queue == null) {
  75 + queue = new CircleQueue<>(CACHE_SIZE);
  76 + gpsCacheMap.put(gps.getDeviceId(), queue);
  77 + }
  78 + queue.add(gps);
  79 + }
  80 +
  81 + public static void clear(String deviceId) {
  82 + try {
  83 + CircleQueue<GpsEntity> queue = gpsCacheMap.get(deviceId);
  84 + if (queue != null)
  85 + queue.clear();
  86 + } catch (Exception e) {
  87 + logger.error("", e);
  88 + }
  89 + }
  90 +
  91 + public static StationRoute prevStation(GpsEntity gps) {
  92 + List<GpsExecTrail> trails = trailListMultimap.get(gps.getNbbm());
  93 + if(null == trails || trails.size() == 0)
  94 + return null;
  95 +
  96 + GpsEntity prev;
  97 + for(int i = trails.size() - 1; i > 0; i--){
  98 + prev = trails.get(i).getSrs().peekLast();
  99 +
  100 + if(prev != null){
  101 + return GeoCacheData.getRouteCode(prev);
  102 + }
  103 + }
  104 + return null;
  105 + }
  106 +
  107 + public static List<StationRoute> prevMultiStation(GpsEntity gps) {
  108 + List<StationRoute> rs = new ArrayList<>();
  109 + List<GpsExecTrail> trails = trailListMultimap.get(gps.getNbbm());
  110 + if(null == trails || trails.size() == 0)
  111 + return null;
  112 +
  113 + for(int i = trails.size() - 1; i > 0; i--){
  114 + rs.addAll(searchLinked(trails.get(i).getSrs(), gps.getUpDown()));
  115 + if(rs.size() > 3)
  116 + break;
  117 + }
  118 + return rs;
  119 + }
  120 +
  121 + private static List<StationRoute> searchLinked(LinkedList<GpsEntity> list, int upDown){
  122 + List<StationRoute> rs = new ArrayList<>();
  123 + Iterator<GpsEntity> iterator = list.iterator();
  124 + GpsEntity gps;
  125 + int prevCode=0;
  126 + while (iterator.hasNext()){
  127 + gps = iterator.next();
  128 + if(gps.getInstation()!=1)
  129 + continue;
  130 +
  131 + if(gps.getUpDown() != upDown)
  132 + break;
  133 +
  134 + if(gps.getStation().getRouteSort() != prevCode)
  135 + rs.add(gps.getStation());
  136 +
  137 + prevCode = gps.getStation().getRouteSort();
  138 +
  139 + if(rs.size() >= 3)
  140 + break;
  141 + }
  142 + return rs;
  143 + }
  144 +}
src/main/java/com/bsth/data/gpsdata_v2/entity/CtLineString.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.entity;
  2 +
  3 +import com.bsth.util.Geo.Point;
  4 +
  5 +import java.util.List;
  6 +
  7 +/**
  8 + * Created by panzhao on 2017/11/15.
  9 + */
  10 +public class CtLineString {
  11 +
  12 + public CtLineString(){}
  13 + public CtLineString(List<Point> ps){
  14 + s = ps.get(0);
  15 + e = ps.get(1);
  16 + }
  17 +
  18 + Point s;
  19 +
  20 + Point e;
  21 +
  22 + public Point getS() {
  23 + return s;
  24 + }
  25 +
  26 + public void setS(Point s) {
  27 + this.s = s;
  28 + }
  29 +
  30 + public Point getE() {
  31 + return e;
  32 + }
  33 +
  34 + public void setE(Point e) {
  35 + this.e = e;
  36 + }
  37 +}
src/main/java/com/bsth/data/gpsdata/GpsEntity.java renamed to src/main/java/com/bsth/data/gpsdata_v2/entity/GpsEntity.java
1 -package com.bsth.data.gpsdata;  
2 -  
3 -import com.bsth.data.gpsdata.arrival.entity.StationRoute;  
4 -import com.fasterxml.jackson.annotation.JsonIgnore;  
5 -  
6 -/**  
7 - *  
8 - * @ClassName: GpsRealData  
9 - * @Description: TODO(HTTP接口的实时GPS数据)  
10 - * @author PanZhao  
11 - * @date 2016年5月11日 下午4:32:07  
12 - *  
13 - */  
14 -public class GpsEntity implements Cloneable{  
15 -  
16 - /** 公司代码 */  
17 - private Short companyCode;  
18 -  
19 - /** 线路编码 */  
20 - private String lineId;  
21 -  
22 - /** 设备编码 */  
23 - private String deviceId;  
24 -  
25 - /** 停车场编码 */  
26 - private String carparkNo;  
27 -  
28 - /** 站点编码 */  
29 - private String stopNo;  
30 -  
31 - /** 站点名称 */  
32 - private String stationName;  
33 -  
34 - /** 到站时间 */  
35 - private long arrTime;  
36 -  
37 - /** 经度 */  
38 - private Float lon;  
39 -  
40 - /** 纬度 */  
41 - private Float lat;  
42 -  
43 - /** GPS发送时间戳 */  
44 - private Long timestamp;  
45 -  
46 - /** 网关收到时间 */  
47 - private Long serverTimestamp;  
48 -  
49 - /** 速度 */  
50 - private Float speed;  
51 -  
52 - /** 方向(角度) */  
53 - private float direction;  
54 -  
55 - /** 营运状态( 0 营运 ,1 非营运, -1 无效) */  
56 - private Integer state;  
57 -  
58 - /** 上下行(0 上行 , 1 下行 , -1 无效) */  
59 - private Byte upDown;  
60 -  
61 - /** 车辆内部编码 */  
62 - private String nbbm;  
63 -  
64 - /** 预计到达终点时间 */  
65 - private Float expectStopTime;  
66 -  
67 - /** 当前执行班次ID */  
68 - private Long schId;  
69 -  
70 - /** 是否是不完整的数据 */  
71 - private boolean incomplete;  
72 -  
73 - private int version;  
74 -  
75 - /** 0: 站外 1:站内 2:场内 */  
76 - private int instation;  
77 -  
78 - /** 站点信息,站内时有值 */  
79 - @JsonIgnore  
80 - private StationRoute station;  
81 -  
82 - /**  
83 - * 前置约束 -站点编码  
84 - */  
85 - @JsonIgnore  
86 - private String premiseCode;  
87 -  
88 - /** 状态 */  
89 - private String signalState = "normal";  
90 -  
91 - /** 异常状态 */  
92 - private String abnormalStatus;  
93 -  
94 - /** 越界距离 */  
95 - private double outOfBoundDistance;  
96 -  
97 - /** gps是否有效 设备端发送的状态 */  
98 - private int valid;  
99 -  
100 - /**  
101 - * 数据来源  
102 - * 1:网关  
103 - * 0:转发  
104 - */  
105 - private int source = -1;  
106 -  
107 - public Object clone() {  
108 - try {  
109 - return super.clone();  
110 - } catch (CloneNotSupportedException e) {  
111 - return null;  
112 - }  
113 - }  
114 -  
115 - public String getDeviceId() {  
116 - return deviceId;  
117 - }  
118 -  
119 - public void setDeviceId(String deviceId) {  
120 - this.deviceId = deviceId;  
121 - }  
122 -  
123 - public String getCarparkNo() {  
124 - return carparkNo;  
125 - }  
126 -  
127 - public void setCarparkNo(String carparkNo) {  
128 - this.carparkNo = carparkNo;  
129 - }  
130 -  
131 - public String getStopNo() {  
132 - return stopNo;  
133 - }  
134 -  
135 - public void setStopNo(String stopNo) {  
136 - this.stopNo = stopNo;  
137 - }  
138 -  
139 - public Float getLon() {  
140 - return lon;  
141 - }  
142 -  
143 - public void setLon(Float lon) {  
144 - this.lon = lon;  
145 - }  
146 -  
147 - public Float getLat() {  
148 - return lat;  
149 - }  
150 -  
151 - public void setLat(Float lat) {  
152 - this.lat = lat;  
153 - }  
154 -  
155 - public Long getTimestamp() {  
156 - return timestamp;  
157 - }  
158 -  
159 - public void setTimestamp(Long timestamp) {  
160 - this.timestamp = timestamp;  
161 - }  
162 -  
163 -  
164 - public Integer getState() {  
165 - return state;  
166 - }  
167 -  
168 - public void setState(Integer state) {  
169 - this.state = state;  
170 - }  
171 -  
172 - public String getNbbm() {  
173 - return nbbm;  
174 - }  
175 -  
176 - public void setNbbm(String nbbm) {  
177 - this.nbbm = nbbm;  
178 - }  
179 -  
180 - public String getStationName() {  
181 - return stationName;  
182 - }  
183 -  
184 - public void setStationName(String stationName) {  
185 - this.stationName = stationName;  
186 - }  
187 -  
188 - public long getArrTime() {  
189 - return arrTime;  
190 - }  
191 -  
192 - public void setArrTime(long arrTime) {  
193 - this.arrTime = arrTime;  
194 - }  
195 -  
196 - public Float getExpectStopTime() {  
197 - return expectStopTime;  
198 - }  
199 -  
200 - public void setExpectStopTime(Float expectStopTime) {  
201 - this.expectStopTime = expectStopTime;  
202 - }  
203 -  
204 - public String getLineId() {  
205 - return lineId;  
206 - }  
207 -  
208 - public void setLineId(String lineId) {  
209 - this.lineId = lineId;  
210 - }  
211 -  
212 - public Long getSchId() {  
213 - return schId;  
214 - }  
215 -  
216 - public void setSchId(Long schId) {  
217 - this.schId = schId;  
218 - }  
219 -  
220 -  
221 - public int getVersion() {  
222 - return version;  
223 - }  
224 -  
225 - public void setVersion(int version) {  
226 - this.version = version;  
227 - }  
228 -  
229 - public StationRoute getStation() {  
230 - return station;  
231 - }  
232 -  
233 - public void setStation(StationRoute station) {  
234 - this.station = station;  
235 - }  
236 -  
237 - public String getSignalState() {  
238 - return signalState;  
239 - }  
240 -  
241 - public void setSignalState(String signalState) {  
242 - this.signalState = signalState;  
243 - }  
244 -  
245 - public int getInstation() {  
246 - return instation;  
247 - }  
248 -  
249 - public void setInstation(int instation) {  
250 - this.instation = instation;  
251 - }  
252 -  
253 - public String getAbnormalStatus() {  
254 - return abnormalStatus;  
255 - }  
256 -  
257 - public void setAbnormalStatus(String abnormalStatus) {  
258 - this.abnormalStatus = abnormalStatus;  
259 - }  
260 -  
261 - public boolean isIncomplete() {  
262 - return incomplete;  
263 - }  
264 -  
265 - public void setIncomplete(boolean incomplete) {  
266 - this.incomplete = incomplete;  
267 - }  
268 -  
269 - public double getOutOfBoundDistance() {  
270 - return outOfBoundDistance;  
271 - }  
272 -  
273 - public void setOutOfBoundDistance(double outOfBoundDistance) {  
274 - this.outOfBoundDistance = outOfBoundDistance;  
275 - }  
276 -  
277 - public int getValid() {  
278 - return valid;  
279 - }  
280 -  
281 - public void setValid(int valid) {  
282 - this.valid = valid;  
283 - }  
284 -  
285 -  
286 -  
287 - public short getCompanyCode() {  
288 - return companyCode;  
289 - }  
290 -  
291 - public void setCompanyCode(short companyCode) {  
292 - this.companyCode = companyCode;  
293 - }  
294 -  
295 - public Byte getUpDown() {  
296 - return upDown;  
297 - }  
298 -  
299 - public void setUpDown(Byte upDown) {  
300 - this.upDown = upDown;  
301 - }  
302 -  
303 -  
304 - public float getDirection() {  
305 - return direction;  
306 - }  
307 -  
308 - public void setDirection(float direction) {  
309 - this.direction = direction;  
310 - }  
311 -  
312 - public Float getSpeed() {  
313 - return speed;  
314 - }  
315 -  
316 - public void setSpeed(Float speed) {  
317 - this.speed = speed;  
318 - }  
319 -  
320 - public int getSource() {  
321 - return source;  
322 - }  
323 -  
324 - public void setSource(int source) {  
325 - this.source = source;  
326 - }  
327 -  
328 - public void offline(){  
329 - this.setAbnormalStatus("offline");  
330 - }  
331 -  
332 -/* public boolean isOnline(){  
333 - if(isOffline())  
334 - return false;  
335 -  
336 - long t = System.currentTimeMillis();  
337 -  
338 - if((t - this.getServerTimestamp()) > 1000 * 60 * 2){  
339 - return false;  
340 - }  
341 -  
342 - if((this.getServerTimestamp() - t) > 1000 * 60 * 3){  
343 - return false;  
344 - }  
345 - return true;  
346 - }*/  
347 -  
348 - /**  
349 - * 是否营运  
350 - * @return  
351 - */  
352 - public boolean isService(){  
353 - return state!=null && state==0;  
354 - }  
355 -  
356 - public boolean isOffline(){  
357 - return this.getAbnormalStatus() != null && this.getAbnormalStatus().equals("offline");  
358 - }  
359 -  
360 - public Long getServerTimestamp() {  
361 - return serverTimestamp;  
362 - }  
363 -  
364 - public void setServerTimestamp(Long serverTimestamp) {  
365 - this.serverTimestamp = serverTimestamp;  
366 - }  
367 -  
368 - public String getPremiseCode() {  
369 - return premiseCode;  
370 - }  
371 -  
372 - public void setPremiseCode(String premiseCode) {  
373 - this.premiseCode = premiseCode;  
374 - }  
375 -} 1 +package com.bsth.data.gpsdata_v2.entity;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonIgnore;
  4 +
  5 +/**
  6 + *
  7 + * @ClassName: GpsRealData
  8 + * @Description: TODO(HTTP接口的实时GPS数据)
  9 + * @author PanZhao
  10 + * @date 2016年5月11日 下午4:32:07
  11 + *
  12 + */
  13 +public class GpsEntity implements Cloneable{
  14 +
  15 + /** 公司代码 */
  16 + private Short companyCode;
  17 +
  18 + /** 线路编码 */
  19 + private String lineId;
  20 +
  21 + /** 设备编码 */
  22 + private String deviceId;
  23 +
  24 + /** 停车场编码 */
  25 + private String carparkNo;
  26 +
  27 + /** 站点编码 */
  28 + private String stopNo;
  29 +
  30 + /** 站点名称 */
  31 + private String stationName;
  32 +
  33 + /** 到站时间 */
  34 + private long arrTime;
  35 +
  36 + /** 经度 */
  37 + private Float lon;
  38 +
  39 + /** 纬度 */
  40 + private Float lat;
  41 +
  42 + /** GPS发送时间戳 */
  43 + private Long timestamp;
  44 +
  45 + /** 网关收到时间 */
  46 + private Long serverTimestamp;
  47 +
  48 + /** 速度 */
  49 + private Float speed;
  50 +
  51 + /** 方向(角度) */
  52 + private float direction;
  53 +
  54 + /** 营运状态( 0 营运 ,1 非营运, -1 无效) */
  55 + private Integer state;
  56 +
  57 + /** 上下行(0 上行 , 1 下行 , -1 无效) */
  58 + private Byte upDown;
  59 +
  60 + /** 车辆内部编码 */
  61 + private String nbbm;
  62 +
  63 + /** 预计到达终点时间 */
  64 + private Float expectStopTime;
  65 +
  66 + /** 当前执行班次ID */
  67 + private Long schId;
  68 +
  69 + private int version;
  70 +
  71 + /** 0: 站外 1:站内 2:场内 */
  72 + private int instation;
  73 +
  74 + /** 站点信息,站内时有值 */
  75 + @JsonIgnore
  76 + private StationRoute station;
  77 +
  78 + /**
  79 + * 前置约束 -站点编码
  80 + */
  81 + @JsonIgnore
  82 + private String premiseCode;
  83 +
  84 + /** 状态 */
  85 + private String signalState = "normal";
  86 +
  87 + /** 异常状态 */
  88 + private String abnormalStatus;
  89 +
  90 + /** 越界距离 */
  91 + private double outOfBoundDistance;
  92 +
  93 + /** gps是否有效 设备端发送的状态 */
  94 + private int valid;
  95 +
  96 + /**
  97 + * 数据来源
  98 + * 1:网关
  99 + * 0:转发
  100 + */
  101 + private int source = -1;
  102 +
  103 + public Object clone() {
  104 + try {
  105 + return super.clone();
  106 + } catch (CloneNotSupportedException e) {
  107 + return null;
  108 + }
  109 + }
  110 +
  111 + public String getDeviceId() {
  112 + return deviceId;
  113 + }
  114 +
  115 + public void setDeviceId(String deviceId) {
  116 + this.deviceId = deviceId;
  117 + }
  118 +
  119 + public String getCarparkNo() {
  120 + return carparkNo;
  121 + }
  122 +
  123 + public void setCarparkNo(String carparkNo) {
  124 + this.carparkNo = carparkNo;
  125 + }
  126 +
  127 + public String getStopNo() {
  128 + return stopNo;
  129 + }
  130 +
  131 + public void setStopNo(String stopNo) {
  132 + this.stopNo = stopNo;
  133 + }
  134 +
  135 + public Float getLon() {
  136 + return lon;
  137 + }
  138 +
  139 + public void setLon(Float lon) {
  140 + this.lon = lon;
  141 + }
  142 +
  143 + public Float getLat() {
  144 + return lat;
  145 + }
  146 +
  147 + public void setLat(Float lat) {
  148 + this.lat = lat;
  149 + }
  150 +
  151 + public Long getTimestamp() {
  152 + return timestamp;
  153 + }
  154 +
  155 + public void setTimestamp(Long timestamp) {
  156 + this.timestamp = timestamp;
  157 + }
  158 +
  159 +
  160 + public Integer getState() {
  161 + return state;
  162 + }
  163 +
  164 + public void setState(Integer state) {
  165 + this.state = state;
  166 + }
  167 +
  168 + public String getNbbm() {
  169 + return nbbm;
  170 + }
  171 +
  172 + public void setNbbm(String nbbm) {
  173 + this.nbbm = nbbm;
  174 + }
  175 +
  176 + public String getStationName() {
  177 + return stationName;
  178 + }
  179 +
  180 + public void setStationName(String stationName) {
  181 + this.stationName = stationName;
  182 + }
  183 +
  184 + public long getArrTime() {
  185 + return arrTime;
  186 + }
  187 +
  188 + public void setArrTime(long arrTime) {
  189 + this.arrTime = arrTime;
  190 + }
  191 +
  192 + public Float getExpectStopTime() {
  193 + return expectStopTime;
  194 + }
  195 +
  196 + public void setExpectStopTime(Float expectStopTime) {
  197 + this.expectStopTime = expectStopTime;
  198 + }
  199 +
  200 + public String getLineId() {
  201 + return lineId;
  202 + }
  203 +
  204 + public void setLineId(String lineId) {
  205 + this.lineId = lineId;
  206 + }
  207 +
  208 + public Long getSchId() {
  209 + return schId;
  210 + }
  211 +
  212 + public void setSchId(Long schId) {
  213 + this.schId = schId;
  214 + }
  215 +
  216 +
  217 + public int getVersion() {
  218 + return version;
  219 + }
  220 +
  221 + public void setVersion(int version) {
  222 + this.version = version;
  223 + }
  224 +
  225 + public StationRoute getStation() {
  226 + return station;
  227 + }
  228 +
  229 + public void setStation(StationRoute station) {
  230 + this.station = station;
  231 + }
  232 +
  233 + public String getSignalState() {
  234 + return signalState;
  235 + }
  236 +
  237 + public void setSignalState(String signalState) {
  238 + this.signalState = signalState;
  239 + }
  240 +
  241 + public int getInstation() {
  242 + return instation;
  243 + }
  244 +
  245 + public void setInstation(int instation) {
  246 + this.instation = instation;
  247 + }
  248 +
  249 + public String getAbnormalStatus() {
  250 + return abnormalStatus;
  251 + }
  252 +
  253 + public void setAbnormalStatus(String abnormalStatus) {
  254 + this.abnormalStatus = abnormalStatus;
  255 + }
  256 +
  257 + public double getOutOfBoundDistance() {
  258 + return outOfBoundDistance;
  259 + }
  260 +
  261 + public void setOutOfBoundDistance(double outOfBoundDistance) {
  262 + this.outOfBoundDistance = outOfBoundDistance;
  263 + }
  264 +
  265 + public int getValid() {
  266 + return valid;
  267 + }
  268 +
  269 + public void setValid(int valid) {
  270 + this.valid = valid;
  271 + }
  272 +
  273 +
  274 +
  275 + public short getCompanyCode() {
  276 + return companyCode;
  277 + }
  278 +
  279 + public void setCompanyCode(short companyCode) {
  280 + this.companyCode = companyCode;
  281 + }
  282 +
  283 + public Byte getUpDown() {
  284 + return upDown;
  285 + }
  286 +
  287 + public void setUpDown(Byte upDown) {
  288 + this.upDown = upDown;
  289 + }
  290 +
  291 +
  292 + public float getDirection() {
  293 + return direction;
  294 + }
  295 +
  296 + public void setDirection(float direction) {
  297 + this.direction = direction;
  298 + }
  299 +
  300 + public Float getSpeed() {
  301 + return speed;
  302 + }
  303 +
  304 + public void setSpeed(Float speed) {
  305 + this.speed = speed;
  306 + }
  307 +
  308 + public int getSource() {
  309 + return source;
  310 + }
  311 +
  312 + public void setSource(int source) {
  313 + this.source = source;
  314 + }
  315 +
  316 + public void offline(){
  317 + this.setAbnormalStatus("offline");
  318 + }
  319 +
  320 +/* public boolean isOnline(){
  321 + if(isOffline())
  322 + return false;
  323 +
  324 + long t = System.currentTimeMillis();
  325 +
  326 + if((t - this.getServerTimestamp()) > 1000 * 60 * 2){
  327 + return false;
  328 + }
  329 +
  330 + if((this.getServerTimestamp() - t) > 1000 * 60 * 3){
  331 + return false;
  332 + }
  333 + return true;
  334 + }*/
  335 +
  336 + /**
  337 + * 是否营运
  338 + * @return
  339 + */
  340 + public boolean isService(){
  341 + return state!=null && state==0;
  342 + }
  343 +
  344 + public boolean isOffline(){
  345 + return this.getAbnormalStatus() != null && this.getAbnormalStatus().equals("offline");
  346 + }
  347 +
  348 + public Long getServerTimestamp() {
  349 + return serverTimestamp;
  350 + }
  351 +
  352 + public void setServerTimestamp(Long serverTimestamp) {
  353 + this.serverTimestamp = serverTimestamp;
  354 + }
  355 +
  356 + public String getPremiseCode() {
  357 + return premiseCode;
  358 + }
  359 +
  360 + public void setPremiseCode(String premiseCode) {
  361 + this.premiseCode = premiseCode;
  362 + }
  363 +}
src/main/java/com/bsth/data/gpsdata/arrival/precondition/entity/PreconditionGeo.java renamed to src/main/java/com/bsth/data/gpsdata_v2/entity/PreconditionGeo.java
1 -package com.bsth.data.gpsdata.arrival.precondition.entity;  
2 -  
3 -import com.bsth.util.Geo.Polygon;  
4 -  
5 -/**  
6 - * 前置围栏 -地理坐标  
7 - * Created by panzhao on 2017/9/23.  
8 - */  
9 -public class PreconditionGeo {  
10 -  
11 - private String name;  
12 -  
13 - /**  
14 - * 前置约束的站点编码  
15 - */  
16 - private String stationCode;  
17 -  
18 - /**  
19 - * 线路编码  
20 - */  
21 - private String lineCode;  
22 -  
23 - /**  
24 - * 上下行  
25 - */  
26 - private int upDown;  
27 -  
28 - /**  
29 - * 多边形坐标  
30 - */  
31 - private String coords;  
32 -  
33 - private com.bsth.util.Geo.Polygon polygon;  
34 -  
35 - private Integer order;  
36 -  
37 - public String getName() {  
38 - return name;  
39 - }  
40 -  
41 - public void setName(String name) {  
42 - this.name = name;  
43 - }  
44 -  
45 - public String getStationCode() {  
46 - return stationCode;  
47 - }  
48 -  
49 - public void setStationCode(String stationCode) {  
50 - this.stationCode = stationCode;  
51 - }  
52 -  
53 - public String getLineCode() {  
54 - return lineCode;  
55 - }  
56 -  
57 - public void setLineCode(String lineCode) {  
58 - this.lineCode = lineCode;  
59 - }  
60 -  
61 - public int getUpDown() {  
62 - return upDown;  
63 - }  
64 -  
65 - public void setUpDown(int upDown) {  
66 - this.upDown = upDown;  
67 - }  
68 -  
69 - public String getCoords() {  
70 - return coords;  
71 - }  
72 -  
73 - public void setCoords(String coords) {  
74 - this.coords = coords;  
75 - }  
76 -  
77 - public Integer getOrder() {  
78 - return order;  
79 - }  
80 -  
81 - public void setOrder(Integer order) {  
82 - this.order = order;  
83 - }  
84 -  
85 - public Polygon getPolygon() {  
86 - return polygon;  
87 - }  
88 -  
89 - public void setPolygon(Polygon polygon) {  
90 - this.polygon = polygon;  
91 - }  
92 -} 1 +package com.bsth.data.gpsdata_v2.entity;
  2 +
  3 +import com.bsth.util.Geo.Polygon;
  4 +
  5 +/**
  6 + * 前置围栏 -地理坐标
  7 + * Created by panzhao on 2017/9/23.
  8 + */
  9 +public class PreconditionGeo {
  10 +
  11 + private String name;
  12 +
  13 + /**
  14 + * 前置约束的站点编码
  15 + */
  16 + private String stationCode;
  17 +
  18 + /**
  19 + * 线路编码
  20 + */
  21 + private String lineCode;
  22 +
  23 + /**
  24 + * 上下行
  25 + */
  26 + private int upDown;
  27 +
  28 + /**
  29 + * 多边形坐标
  30 + */
  31 + private String coords;
  32 +
  33 + private com.bsth.util.Geo.Polygon polygon;
  34 +
  35 + private Integer order;
  36 +
  37 + public String getName() {
  38 + return name;
  39 + }
  40 +
  41 + public void setName(String name) {
  42 + this.name = name;
  43 + }
  44 +
  45 + public String getStationCode() {
  46 + return stationCode;
  47 + }
  48 +
  49 + public void setStationCode(String stationCode) {
  50 + this.stationCode = stationCode;
  51 + }
  52 +
  53 + public String getLineCode() {
  54 + return lineCode;
  55 + }
  56 +
  57 + public void setLineCode(String lineCode) {
  58 + this.lineCode = lineCode;
  59 + }
  60 +
  61 + public int getUpDown() {
  62 + return upDown;
  63 + }
  64 +
  65 + public void setUpDown(int upDown) {
  66 + this.upDown = upDown;
  67 + }
  68 +
  69 + public String getCoords() {
  70 + return coords;
  71 + }
  72 +
  73 + public void setCoords(String coords) {
  74 + this.coords = coords;
  75 + }
  76 +
  77 + public Integer getOrder() {
  78 + return order;
  79 + }
  80 +
  81 + public void setOrder(Integer order) {
  82 + this.order = order;
  83 + }
  84 +
  85 + public Polygon getPolygon() {
  86 + return polygon;
  87 + }
  88 +
  89 + public void setPolygon(Polygon polygon) {
  90 + this.polygon = polygon;
  91 + }
  92 +}
src/main/java/com/bsth/data/gpsdata/arrival/entity/StationRoute.java renamed to src/main/java/com/bsth/data/gpsdata_v2/entity/StationRoute.java
1 -package com.bsth.data.gpsdata.arrival.entity;  
2 -  
3 -import com.vividsolutions.jts.geom.Point;  
4 -import com.vividsolutions.jts.geom.Polygon;  
5 -  
6 -/**  
7 - * Created by panzhao on 2016/12/23.  
8 - */  
9 -public class StationRoute {  
10 -  
11 - /**  
12 - * 线路编码  
13 - */  
14 - private String lineCode;  
15 -  
16 - /**  
17 - * 上下行  
18 - */  
19 - private int directions;  
20 -  
21 - /**  
22 - * 站点编码  
23 - */  
24 - private String code;  
25 -  
26 - /**  
27 - * 路由顺序  
28 - */  
29 - private int routeSort;  
30 -  
31 - /**  
32 - * 站点位置  
33 - */  
34 - private Point point;  
35 -  
36 - /**  
37 - * 圆形半径  
38 - */  
39 - private Float radius;  
40 -  
41 - /**  
42 - * 多边形电子围栏  
43 - */  
44 - private Polygon polygon;  
45 -  
46 - /**  
47 - * 站点标记  
48 - */  
49 - private String mark;  
50 -  
51 - /**  
52 - * 下一站  
53 - */  
54 - private StationRoute next;  
55 -  
56 - /**  
57 - * 上一站  
58 - */  
59 - private StationRoute prve;  
60 -  
61 - private String name;  
62 -  
63 - /**  
64 - * 是否有前置进站约束  
65 - */  
66 - private boolean premise;  
67 -  
68 - public String getCode() {  
69 - return code;  
70 - }  
71 -  
72 - public void setCode(String code) {  
73 - this.code = code;  
74 - }  
75 -  
76 - public int getRouteSort() {  
77 - return routeSort;  
78 - }  
79 -  
80 - public void setRouteSort(int routeSort) {  
81 - this.routeSort = routeSort;  
82 - }  
83 -  
84 - public Point getPoint() {  
85 - return point;  
86 - }  
87 -  
88 - public void setPoint(Point point) {  
89 - this.point = point;  
90 - }  
91 -  
92 - public Float getRadius() {  
93 - return radius;  
94 - }  
95 -  
96 - public void setRadius(Float radius) {  
97 - this.radius = radius;  
98 - }  
99 -  
100 - public Polygon getPolygon() {  
101 - return polygon;  
102 - }  
103 -  
104 - public void setPolygon(Polygon polygon) {  
105 - this.polygon = polygon;  
106 - }  
107 -  
108 - public String getLineCode() {  
109 - return lineCode;  
110 - }  
111 -  
112 - public void setLineCode(String lineCode) {  
113 - this.lineCode = lineCode;  
114 - }  
115 -  
116 - public int getDirections() {  
117 - return directions;  
118 - }  
119 -  
120 - public void setDirections(int directions) {  
121 - this.directions = directions;  
122 - }  
123 -  
124 - public StationRoute getNext() {  
125 - return next;  
126 - }  
127 -  
128 - public void setNext(StationRoute next) {  
129 - this.next = next;  
130 - }  
131 -  
132 - public StationRoute getPrve() {  
133 - return prve;  
134 - }  
135 -  
136 - public void setPrve(StationRoute prve) {  
137 - this.prve = prve;  
138 - }  
139 -  
140 - public String getMark() {  
141 - return mark;  
142 - }  
143 -  
144 - public void setMark(String mark) {  
145 - this.mark = mark;  
146 - }  
147 -  
148 - public String getName() {  
149 - return name;  
150 - }  
151 -  
152 - public void setName(String name) {  
153 - this.name = name;  
154 - }  
155 -  
156 - public boolean isPremise() {  
157 - return premise;  
158 - }  
159 -  
160 - public void setPremise(boolean premise) {  
161 - this.premise = premise;  
162 - }  
163 -}  
164 - 1 +package com.bsth.data.gpsdata_v2.entity;
  2 +
  3 +import com.bsth.util.Geo.Point;
  4 +import com.bsth.util.Geo.Polygon;
  5 +
  6 +/**
  7 + * Created by panzhao on 2016/12/23.
  8 + */
  9 +public class StationRoute {
  10 +
  11 + /**
  12 + * 线路编码
  13 + */
  14 + private String lineCode;
  15 +
  16 + /**
  17 + * 上下行
  18 + */
  19 + private int directions;
  20 +
  21 + /**
  22 + * 站点编码
  23 + */
  24 + private String code;
  25 +
  26 + /**
  27 + * 路由顺序
  28 + */
  29 + private int routeSort;
  30 +
  31 + /**
  32 + * 站点位置
  33 + */
  34 + private Point point;
  35 +
  36 + /**
  37 + * 圆形半径
  38 + */
  39 + private Float radius;
  40 +
  41 + /**
  42 + * 多边形电子围栏
  43 + */
  44 + private Polygon polygon;
  45 +
  46 + /**
  47 + * 站点标记
  48 + */
  49 + private String mark;
  50 +
  51 + /**
  52 + * 下一站
  53 + */
  54 + private StationRoute next;
  55 +
  56 + /**
  57 + * 上一站
  58 + */
  59 + private StationRoute prve;
  60 +
  61 + private String name;
  62 +
  63 + /**
  64 + * 是否有前置进站约束
  65 + */
  66 + private boolean premise;
  67 +
  68 + public String getCode() {
  69 + return code;
  70 + }
  71 +
  72 + public void setCode(String code) {
  73 + this.code = code;
  74 + }
  75 +
  76 + public int getRouteSort() {
  77 + return routeSort;
  78 + }
  79 +
  80 + public void setRouteSort(int routeSort) {
  81 + this.routeSort = routeSort;
  82 + }
  83 +
  84 + public Point getPoint() {
  85 + return point;
  86 + }
  87 +
  88 + public void setPoint(Point point) {
  89 + this.point = point;
  90 + }
  91 +
  92 + public Float getRadius() {
  93 + return radius;
  94 + }
  95 +
  96 + public void setRadius(Float radius) {
  97 + this.radius = radius;
  98 + }
  99 +
  100 + public Polygon getPolygon() {
  101 + return polygon;
  102 + }
  103 +
  104 + public void setPolygon(Polygon polygon) {
  105 + this.polygon = polygon;
  106 + }
  107 +
  108 + public String getLineCode() {
  109 + return lineCode;
  110 + }
  111 +
  112 + public void setLineCode(String lineCode) {
  113 + this.lineCode = lineCode;
  114 + }
  115 +
  116 + public int getDirections() {
  117 + return directions;
  118 + }
  119 +
  120 + public void setDirections(int directions) {
  121 + this.directions = directions;
  122 + }
  123 +
  124 + public StationRoute getNext() {
  125 + return next;
  126 + }
  127 +
  128 + public void setNext(StationRoute next) {
  129 + this.next = next;
  130 + }
  131 +
  132 + public StationRoute getPrve() {
  133 + return prve;
  134 + }
  135 +
  136 + public void setPrve(StationRoute prve) {
  137 + this.prve = prve;
  138 + }
  139 +
  140 + public String getMark() {
  141 + return mark;
  142 + }
  143 +
  144 + public void setMark(String mark) {
  145 + this.mark = mark;
  146 + }
  147 +
  148 + public String getName() {
  149 + return name;
  150 + }
  151 +
  152 + public void setName(String name) {
  153 + this.name = name;
  154 + }
  155 +
  156 + public boolean isPremise() {
  157 + return premise;
  158 + }
  159 +
  160 + public void setPremise(boolean premise) {
  161 + this.premise = premise;
  162 + }
  163 +}
  164 +
src/main/java/com/bsth/data/gpsdata_v2/entity/trail/GpsExecTrail.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.entity.trail;
  2 +
  3 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  4 +
  5 +import java.util.LinkedList;
  6 +
  7 +/**
  8 + * GPS 班次执行轨迹,过程数据
  9 + * Created by panzhao on 2017/11/16.
  10 + */
  11 +public class GpsExecTrail {
  12 +
  13 + /**
  14 + * 执行的班次ID
  15 + */
  16 + private Long schId;
  17 +
  18 + /**
  19 + * 实际经过的站点路由
  20 + */
  21 + private LinkedList<GpsEntity> srs = new LinkedList<>();
  22 +
  23 + /**
  24 + * 车辆编码
  25 + */
  26 + private String nbbm;
  27 +
  28 + /**
  29 + * 是否结束
  30 + */
  31 + private boolean end;
  32 +
  33 + public Long getSchId() {
  34 + return schId;
  35 + }
  36 +
  37 + public void setSchId(Long schId) {
  38 + this.schId = schId;
  39 + }
  40 +
  41 + public LinkedList<GpsEntity> getSrs() {
  42 + return srs;
  43 + }
  44 +
  45 + public void setSrs(LinkedList<GpsEntity> srs) {
  46 + this.srs = srs;
  47 + }
  48 +
  49 + public String getNbbm() {
  50 + return nbbm;
  51 + }
  52 +
  53 + public void setNbbm(String nbbm) {
  54 + this.nbbm = nbbm;
  55 + }
  56 +
  57 + public boolean isEnd() {
  58 + return end;
  59 + }
  60 +
  61 + public void setEnd(boolean end) {
  62 + this.end = end;
  63 + }
  64 +}
src/main/java/com/bsth/data/gpsdata/arrival/handlers/AbnormalStateHandle.java renamed to src/main/java/com/bsth/data/gpsdata_v2/handlers/AbnormalStateProcess.java
1 -package com.bsth.data.gpsdata.arrival.handlers;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.arrival.GeoCacheData;  
5 -import com.bsth.data.gpsdata.arrival.SignalHandle;  
6 -import com.bsth.data.gpsdata.arrival.utils.CircleQueue;  
7 -import com.bsth.data.gpsdata.arrival.utils.GeoUtils;  
8 -import com.vividsolutions.jts.geom.Coordinate;  
9 -import com.vividsolutions.jts.geom.GeometryFactory;  
10 -import com.vividsolutions.jts.geom.LineString;  
11 -import com.vividsolutions.jts.geom.Point;  
12 -import org.springframework.stereotype.Component;  
13 -  
14 -import java.util.List;  
15 -  
16 -/**  
17 - * GPS异常状态判定 (越界/超速)  
18 - * Created by panzhao on 2017/1/10.  
19 - */  
20 -@Component  
21 -public class AbnormalStateHandle extends SignalHandle{  
22 -  
23 - //默认限速  
24 - private static final double DEFAULT_SPEED_LIMIT = 60;  
25 - //越界阈值  
26 - private static final double OUT_BOUNDS_THRESHOLD = 100;  
27 -  
28 - GeometryFactory geometryFactory = new GeometryFactory();  
29 -  
30 - @Override  
31 - public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) {  
32 -  
33 - if(isOffline(gps))  
34 - return false;  
35 -  
36 - if(overspeed(gps))  
37 - return true;  
38 -  
39 - if(outOfBounds((gps)))  
40 - return true;  
41 -  
42 - return false;  
43 - }  
44 -  
45 - /**  
46 - * 是否超速  
47 - * @param gps  
48 - * @return  
49 - */  
50 - public boolean overspeed(GpsEntity gps){  
51 - double maxSpeed = DEFAULT_SPEED_LIMIT;  
52 - if(GeoCacheData.speedLimit(gps.getLineId()) != null)  
53 - maxSpeed = GeoCacheData.speedLimit(gps.getLineId());  
54 -  
55 - if(gps.getSpeed() > maxSpeed){  
56 - gps.setAbnormalStatus("overspeed");  
57 - return true;  
58 - }  
59 - return false;  
60 - }  
61 -  
62 - /**  
63 - * 是否越界  
64 - * @param gps  
65 - * @return  
66 - */  
67 - public boolean outOfBounds(GpsEntity gps){  
68 - //只处理电子围栏外的车  
69 - if(gps.getInstation() != 0){  
70 - return false;  
71 - }  
72 -  
73 - List<LineString> list = GeoCacheData.getLineStringList(gps);  
74 - Point point = geometryFactory.createPoint(new Coordinate(gps.getLat(), gps.getLon()));  
75 -  
76 - double min = -1, distance;  
77 -  
78 - for(LineString lineString : list){  
79 - distance = GeoUtils.getDistanceFromLine(lineString, point);  
80 -  
81 - if(min == -1 || min > distance)  
82 - min = distance;  
83 - }  
84 -  
85 - gps.setOutOfBoundDistance(min);  
86 - if(min > OUT_BOUNDS_THRESHOLD){  
87 - gps.setAbnormalStatus("outBounds");  
88 - return true;  
89 - }  
90 - return false;  
91 - }  
92 -} 1 +package com.bsth.data.gpsdata_v2.handlers;
  2 +
  3 +import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
  4 +import com.bsth.data.gpsdata_v2.entity.CtLineString;
  5 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  6 +import com.bsth.data.gpsdata_v2.utils.GeoUtils;
  7 +import com.bsth.util.Geo.Point;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 越界/超速 判断
  14 + * Created by panzhao on 2017/11/16.
  15 + */
  16 +@Component
  17 +public class AbnormalStateProcess {
  18 +
  19 + /**
  20 + * 默认限速
  21 + */
  22 + private static final double DEFAULT_SPEED_LIMIT = 60;
  23 + /**
  24 + * 越界阈值
  25 + */
  26 + private static final double OUT_BOUNDS_THRESHOLD = 100;
  27 +
  28 +
  29 + public void process(GpsEntity gps) {
  30 + if(isOffline(gps))
  31 + return;
  32 +
  33 + if(overspeed(gps))
  34 + return;
  35 +
  36 + if(outOfBounds((gps)))
  37 + return;
  38 + }
  39 +
  40 + private boolean isOffline(GpsEntity gps){
  41 + return gps.getAbnormalStatus() != null && gps.getAbnormalStatus().equals("offline");
  42 + }
  43 +
  44 +
  45 + /**
  46 + * 是否超速
  47 + * @param gps
  48 + * @return
  49 + */
  50 + private boolean overspeed(GpsEntity gps){
  51 + double maxSpeed = DEFAULT_SPEED_LIMIT;
  52 + if(GeoCacheData.speedLimit(gps.getLineId()) != null)
  53 + maxSpeed = GeoCacheData.speedLimit(gps.getLineId());
  54 +
  55 + if(gps.getSpeed() > maxSpeed){
  56 + gps.setAbnormalStatus("overspeed");
  57 + return true;
  58 + }
  59 + return false;
  60 + }
  61 +
  62 +
  63 + /**
  64 + * 是否越界
  65 + * @param gps
  66 + * @return
  67 + */
  68 + public boolean outOfBounds(GpsEntity gps){
  69 + //只处理场站外的车
  70 + if(gps.getInstation() != 0){
  71 + return false;
  72 + }
  73 +
  74 + List<CtLineString> list = GeoCacheData.getLineStringList(gps);
  75 + Point point = new Point(gps.getLon(), gps.getLat());
  76 +
  77 + double min = -1, distance;
  78 +
  79 + for(CtLineString lineString : list){
  80 + distance = GeoUtils.getDistanceFromLine(lineString.getS(),lineString.getE(), point);
  81 +
  82 + if(min == -1 || min > distance)
  83 + min = distance;
  84 + }
  85 +
  86 + gps.setOutOfBoundDistance(min);
  87 + if(min > OUT_BOUNDS_THRESHOLD){
  88 + gps.setAbnormalStatus("outBounds");
  89 + return true;
  90 + }
  91 + return false;
  92 + }
  93 +}
src/main/java/com/bsth/data/gpsdata_v2/handlers/GpsStateProcess.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.handlers;
  2 +
  3 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  4 +import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;
  5 +import com.bsth.data.schedule.DayOfSchedule;
  6 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +/**
  11 + * GPS 状态处理
  12 + * Created by panzhao on 2017/11/15.
  13 + */
  14 +@Component
  15 +public class GpsStateProcess {
  16 +
  17 + @Autowired
  18 + DayOfSchedule dayOfSchedule;
  19 +
  20 + @Autowired
  21 + GpsStatusManager gpsStatusManager;
  22 +
  23 + public void process(GpsEntity gps){
  24 + //在执行的任务
  25 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
  26 +
  27 + if(null == sch)
  28 + return;
  29 +
  30 + byte upDown = Byte.parseByte(sch.getXlDir());
  31 +
  32 + if(gps.getUpDown() != upDown){
  33 + gps.setUpDown(upDown);//修正走向
  34 + }
  35 +
  36 + if((!gps.isService() || gps.getUpDown() != upDown) &&
  37 + !dayOfSchedule.emptyService(sch)){
  38 + //下发指令纠正车载的 营运状态 和 走向
  39 + gpsStatusManager.changeServiceState(gps.getNbbm(), upDown, 0, "同步@系统");
  40 + }
  41 +
  42 + if(!sch.getXlBm().equals(gps.getLineId())){
  43 + //切换车载的 线路编码
  44 + gpsStatusManager.changeLine(gps.getNbbm(), sch.getXlBm(), "同步@系统");
  45 + }
  46 + }
  47 +}
src/main/java/com/bsth/data/gpsdata_v2/handlers/InStationProcess.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.handlers;
  2 +
  3 +import com.bsth.data.LineConfigData;
  4 +import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
  5 +import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
  6 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  7 +import com.bsth.data.gpsdata_v2.entity.StationRoute;
  8 +import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;
  9 +import com.bsth.data.gpsdata_v2.utils.GeoUtils;
  10 +import com.bsth.data.msg_queue.DirectivePushQueue;
  11 +import com.bsth.data.schedule.DayOfSchedule;
  12 +import com.bsth.data.schedule.late_adjust.LateAdjustHandle;
  13 +import com.bsth.entity.realcontrol.LineConfig;
  14 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  15 +import com.bsth.websocket.handler.SendUtils;
  16 +import org.apache.commons.lang3.StringUtils;
  17 +import org.slf4j.Logger;
  18 +import org.slf4j.LoggerFactory;
  19 +import org.springframework.beans.factory.annotation.Autowired;
  20 +import org.springframework.stereotype.Component;
  21 +
  22 +import java.util.List;
  23 +
  24 +/**
  25 + * 车辆到站处理程序
  26 + * Created by panzhao on 2017/11/16.
  27 + */
  28 +@Component
  29 +public class InStationProcess {
  30 +
  31 + @Autowired
  32 + DayOfSchedule dayOfSchedule;
  33 +
  34 + @Autowired
  35 + LineConfigData lineConfigData;
  36 +
  37 + @Autowired
  38 + SendUtils sendUtils;
  39 +
  40 + @Autowired
  41 + GpsStatusManager gpsStatusManager;
  42 +
  43 + Logger logger = LoggerFactory.getLogger(this.getClass());
  44 +
  45 + public void process(GpsEntity gps){
  46 + GpsEntity prev = GpsCacheData.getPrev(gps);
  47 +
  48 + if(isInsideStation(gps) &&
  49 + (prev == null || !isInsideStation(prev) || !prev.getStopNo().equals(gps.getStopNo()))){
  50 + inStation(gps, prev); //进站
  51 + }
  52 + }
  53 +
  54 + private boolean isInsideStation(GpsEntity gps){
  55 + return gps.getInstation() >= 1;
  56 + }
  57 +
  58 + /**
  59 + * 进站
  60 + * @param gps
  61 + * @param prev
  62 + */
  63 + private void inStation(GpsEntity gps, GpsEntity prev){
  64 + //要经过一个中途站才能进
  65 + StationRoute s = GpsCacheData.prevStation(gps);
  66 + List<StationRoute> routes = GeoCacheData.getStationRoute(gps.getLineId(), gps.getUpDown());
  67 + if(routes.size() > 3 && null != s && s.getName().equals(gps.getStation().getName())){
  68 + logger.info("没有进中途站,拒绝进场... -" + gps.getNbbm() + " -time:" + gps.getTimestamp());
  69 + return;
  70 + }
  71 +
  72 +
  73 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
  74 + boolean isEnd=false;
  75 +
  76 + //进终点
  77 + if(null != sch && sch.getZdzCode().equals(gps.getStopNo())){
  78 + inEndStation(sch, gps);
  79 + isEnd = true;
  80 + }
  81 +
  82 + GpsCacheData.in(gps, isEnd);
  83 + }
  84 +
  85 + /**
  86 + * 进班次终点
  87 + * @param gps
  88 + */
  89 + private void inEndStation(ScheduleRealInfo sch, GpsEntity gps) {
  90 + String nbbm = sch.getClZbh();
  91 + //校验进站前置约束
  92 + if(!validInPremise(gps))
  93 + return;
  94 +
  95 + //实达时间不覆盖
  96 + if(StringUtils.isNotEmpty(sch.getZdsjActual()))
  97 + return;
  98 +
  99 + //应用到离站缓冲区设置参数
  100 + long rsT = lineConfigData.applyIn(sch, gps.getTimestamp());
  101 +
  102 + sch.setZdsjActualAll(rsT);
  103 + sch.setSiginCompate(2);
  104 + //通知误点停靠程序,有车辆到站
  105 + LateAdjustHandle.carArrive(gps);
  106 +
  107 + //持久化
  108 + dayOfSchedule.save(sch);
  109 +
  110 + //车辆的下一个班次
  111 + ScheduleRealInfo next = dayOfSchedule.next(sch);
  112 + if(next != null){
  113 + dayOfSchedule.addExecPlan(next);
  114 + inStationAndInPark(sch, next);//进站既进场
  115 + }
  116 +
  117 + //路牌的下一个班次,页面显示起点实际到达时间
  118 + ScheduleRealInfo lpNext = dayOfSchedule.nextByLp(sch);
  119 + if(lpNext != null){
  120 + lpNext.setQdzArrDatesj(sch.getZdsjActual());
  121 + }
  122 +
  123 + //已完成班次数
  124 + int doneSum = dayOfSchedule.doneSum(nbbm);
  125 + //webSocket
  126 + sendUtils.sendZdsj(sch, lpNext, doneSum);
  127 +
  128 + logger.info("车辆:" + nbbm + " 班次:" + sch.getDfsj() + "到终点, 时间:" + sch.getZdsjActual());
  129 +
  130 + //清除车辆误点调整监听
  131 + LateAdjustHandle.remove(nbbm);
  132 +
  133 + //将gps转换成下一个班次走向的站内信号(应对只有一个站内信号 即 发出时)
  134 + transformUpDown(gps, next);
  135 +
  136 + //下发调度指令
  137 + DirectivePushQueue.put6002(next, doneSum, "到站@系统");
  138 +
  139 + //套跑 -下发线路切换指令
  140 + if(null != next && !next.getXlBm().equals(sch.getXlBm())){
  141 + gpsStatusManager.changeLine(next.getClZbh(), next.getXlBm(), "套跑@系统");
  142 + }
  143 +
  144 + if(null == next && gps.isService())
  145 + nonService(sch, "结束@系统");//班次结束
  146 + else if(dayOfSchedule.emptyService(next))
  147 + nonService(sch, "空驶@系统");//下一班非营运
  148 + }
  149 +
  150 + /**
  151 + * 校验进站前置约束
  152 + * @param gps
  153 + * @return
  154 + */
  155 + private boolean validInPremise(GpsEntity gps) {
  156 + StationRoute sr = gps.getStation();
  157 + if(null == sr || !sr.isPremise())
  158 + return true;
  159 +
  160 + String premiseCode = gps.getPremiseCode();
  161 +
  162 + if(StringUtils.isNotEmpty(premiseCode) && premiseCode.equals(gps.getStopNo())){
  163 + logger.info("满足前置进站约束 " + premiseCode);
  164 + return true;
  165 + }
  166 + else{
  167 + logger.info(gps.getNbbm() + " not premiseCode 不满足前置进站约束 " + premiseCode);
  168 + }
  169 + return false;
  170 + }
  171 +
  172 + /**
  173 + * 进站既进场
  174 + * @param sch
  175 + */
  176 + private void inStationAndInPark(ScheduleRealInfo sch, ScheduleRealInfo next){
  177 + LineConfig config = lineConfigData.get(sch.getXlBm());
  178 + //限定出站既出场的停车场
  179 + String park = config.getTwinsPark();
  180 + boolean limitPark = StringUtils.isNotEmpty(park);
  181 +
  182 +
  183 + if (next.getBcType().equals("in") && config.getOutConfig() == 2 && isEmptyMileage(next)
  184 + && (!limitPark || park.equals(next.getZdzCode()))) {
  185 +
  186 + endSch(next, sch.getZdsjActualTime());
  187 +
  188 + sendUtils.refreshSch(next);
  189 + dayOfSchedule.save(next);
  190 +
  191 + //分班的时候,需要再跳过1个班次
  192 + next = dayOfSchedule.next(next);
  193 + if(next != null)
  194 + dayOfSchedule.addExecPlan(next);
  195 +
  196 + //进场,切换成非营运状态
  197 + nonService(sch, "进场@系统");
  198 + }
  199 + }
  200 +
  201 +
  202 + private boolean isEmptyMileage(ScheduleRealInfo sch){
  203 + return sch.getBcsj()==0 || sch.getJhlcOrig().intValue()==0;
  204 + }
  205 +
  206 +
  207 + /**
  208 + * 切换为非营运状态
  209 + * @param sch
  210 + * @param sender
  211 + */
  212 + private void nonService(ScheduleRealInfo sch, String sender){
  213 + gpsStatusManager.changeServiceState(sch.getClZbh(), sch.getXlDir(), 1, sender);
  214 + }
  215 +
  216 + private void endSch(ScheduleRealInfo sch, Long t){
  217 + sch.setFcsjActualAll(t);
  218 + sch.setZdsjActualAll(t);
  219 + }
  220 +
  221 + private void transformUpDown(GpsEntity gps, ScheduleRealInfo sch) {
  222 + if(null == sch)
  223 + return;
  224 + byte upDown = Byte.parseByte(sch.getXlDir());
  225 + //gps 切换走向
  226 + gps.setUpDown(upDown);
  227 + gps.setPremiseCode(null);
  228 +
  229 + List<StationRoute> srs = GeoCacheData.getStationRoute(sch.getXlBm(), upDown);
  230 + StationRoute station = GeoUtils.gpsInStation(gps, srs);
  231 + if (station != null) {
  232 + gps.setStopNo(station.getCode());
  233 + }
  234 + }
  235 +}
src/main/java/com/bsth/data/gpsdata_v2/handlers/OutStationProcess.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.handlers;
  2 +
  3 +import com.bsth.data.LineConfigData;
  4 +import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
  5 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  6 +import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;
  7 +import com.bsth.data.schedule.DayOfSchedule;
  8 +import com.bsth.data.schedule.late_adjust.LateAdjustHandle;
  9 +import com.bsth.entity.realcontrol.LineConfig;
  10 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  11 +import com.bsth.websocket.handler.SendUtils;
  12 +import org.apache.commons.lang3.StringUtils;
  13 +import org.slf4j.Logger;
  14 +import org.slf4j.LoggerFactory;
  15 +import org.springframework.beans.factory.annotation.Autowired;
  16 +import org.springframework.stereotype.Component;
  17 +
  18 +/**
  19 + * 车辆出站处理程序
  20 + * Created by panzhao on 2017/11/16.
  21 + */
  22 +@Component
  23 +public class OutStationProcess {
  24 +
  25 + @Autowired
  26 + DayOfSchedule dayOfSchedule;
  27 +
  28 + Logger logger = LoggerFactory.getLogger(this.getClass());
  29 +
  30 + @Autowired
  31 + LineConfigData lineConfigData;
  32 +
  33 + @Autowired
  34 + SendUtils sendUtils;
  35 +
  36 + @Autowired
  37 + GpsStatusManager gpsStatusManager;
  38 +
  39 + public void process(GpsEntity gps){
  40 + GpsEntity prev = GpsCacheData.getPrev(gps);
  41 + if(gps.getInstation()==0 && prev!=null && isInsideStation(prev)){
  42 + outStation(gps); //出站
  43 + }
  44 + }
  45 +
  46 + private boolean isInsideStation(GpsEntity gps){
  47 + return gps.getInstation() >= 1;
  48 + }
  49 +
  50 + /**
  51 + * 出站
  52 + * @param gps
  53 + */
  54 + private void outStation(GpsEntity gps) {
  55 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
  56 +
  57 + //起点发车
  58 + if (null != sch && sch.getQdzCode().equals(gps.getStopNo())){
  59 + gps.setPremiseCode(null);//清除前置围栏标记
  60 +
  61 + if(StringUtils.isNotEmpty(sch.getFcsjActual())
  62 + && !outManyFit(gps, sch)){
  63 + return;//班次已经实发
  64 + }
  65 +
  66 + //应用到离站缓冲区设置参数
  67 + long rsT = lineConfigData.applyOut(sch, gps.getTimestamp());
  68 + //实发时间
  69 + sch.setFcsjActualAll(rsT);
  70 + sch.setSiginCompate(1);
  71 +
  72 + //出站既出场
  73 + outStationAndOutPark(sch);
  74 +
  75 + //webSocket
  76 + sendUtils.sendFcsj(sch);
  77 +
  78 + //持久化
  79 + dayOfSchedule.save(sch);
  80 +
  81 + //清理应发未发标记
  82 + LateAdjustHandle.remove(sch.getClZbh());
  83 +
  84 + //发车的时候,同步一下状态
  85 + if(!gps.isService() && !dayOfSchedule.emptyService(sch))
  86 + gpsStatusManager.changeServiceState(sch.getClZbh(), sch.getXlDir(), 0, "发车@系统");
  87 +
  88 + logger.info("车辆:" + sch.getClZbh() + " 班次:" + sch.getDfsj() + "发车, 时间:" + sch.getFcsjActual());
  89 + }
  90 +
  91 + GpsCacheData.out(gps);
  92 + }
  93 +
  94 + /**
  95 + * 是否是一个更合适的发车信号
  96 + * @param gps
  97 + * @param sch
  98 + * @return
  99 + */
  100 + private boolean outManyFit(GpsEntity gps, ScheduleRealInfo sch) {
  101 + LineConfig conf = lineConfigData.get(sch.getXlBm());
  102 + if(null != conf && conf.isLockFirstOutTime())
  103 + return false;
  104 +
  105 + if(StringUtils.isNotEmpty(sch.getZdsjActual()))
  106 + return false;
  107 +
  108 + long t1 = sch.getFcsjActualTime();
  109 + long t2 = gps.getTimestamp();
  110 + long c = sch.getDfsjT();
  111 +
  112 + int threshold = 1000 * 60 * 5;
  113 + if(Math.abs(t2 - c) < threshold && c - t1 > threshold){
  114 + return true;
  115 + }
  116 + return false;
  117 + }
  118 +
  119 + private void outStationAndOutPark(ScheduleRealInfo sch){
  120 + try{
  121 + LineConfig config = lineConfigData.get(sch.getXlBm());
  122 + //限定出站既出场的停车场
  123 + String park = config.getTwinsPark();
  124 + boolean limitPark = StringUtils.isNotEmpty(park);
  125 +
  126 + if (config != null && config.getOutConfig() == 2) {
  127 + //出站既出场
  128 + ScheduleRealInfo schPrev = dayOfSchedule.prev(sch);
  129 + if (isOut(schPrev) && isEmptyMileage(schPrev)
  130 + && (!limitPark || park.equals(schPrev.getQdzCode()))) {
  131 +
  132 + endSch(schPrev, sch.getFcsjActualTime());
  133 +
  134 + //起点实到
  135 + sch.setQdzArrDatesj(schPrev.getZdsjActual());
  136 +
  137 + sendUtils.refreshSch(schPrev);
  138 + dayOfSchedule.save(schPrev);
  139 + }
  140 + }
  141 + }catch (Exception e){
  142 + logger.error("", e);
  143 + }
  144 + }
  145 +
  146 + private boolean isEmptyMileage(ScheduleRealInfo sch){
  147 + return sch.getBcsj()==0 || sch.getJhlcOrig().intValue()==0;
  148 + }
  149 +
  150 + private boolean isOut(ScheduleRealInfo sch){
  151 + return sch != null && sch.getBcType().equals("out");
  152 + }
  153 +
  154 + private void endSch(ScheduleRealInfo sch, Long t){
  155 + sch.setFcsjActualAll(t);
  156 + sch.setZdsjActualAll(t);
  157 + }
  158 +}
src/main/java/com/bsth/data/gpsdata_v2/handlers/ReverseRouteProcess.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.handlers;
  2 +
  3 +import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
  4 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  5 +import com.bsth.data.gpsdata_v2.entity.StationRoute;
  6 +import com.bsth.data.schedule.DayOfSchedule;
  7 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 反向路由处理(进站的时候处理)
  15 + * Created by panzhao on 2017/11/20.
  16 + */
  17 +@Component
  18 +public class ReverseRouteProcess {
  19 +
  20 + private static final int REVER_THRESHOLD = 3;
  21 +
  22 + private static final long TIME_THRESHOLD = 1000 * 60 * 120;
  23 +
  24 + @Autowired
  25 + DayOfSchedule dayOfSchedule;
  26 +
  27 + public void process(GpsEntity gps){
  28 + if(reversRoute(gps)){
  29 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
  30 + if(isInOut(sch) || !sch.getXlBm().equals(gps.getLineId()))
  31 + return;
  32 +
  33 + //next
  34 + ScheduleRealInfo next = dayOfSchedule.next(sch);
  35 + if(isInOut(next))
  36 + return;
  37 +
  38 + //跳下一个班次
  39 + if(Math.abs(next.getDfsjT() - gps.getTimestamp()) < TIME_THRESHOLD)
  40 + dayOfSchedule.addExecPlan(next);
  41 + }
  42 + }
  43 +
  44 + private boolean reversRoute(GpsEntity gps) {
  45 + if(gps.getInstation() != 1)
  46 + return false;
  47 +
  48 + int sortNo = gps.getStation().getRouteSort();
  49 + StationRoute prev = GpsCacheData.prevStation(gps);
  50 + //和上一个站点是反向
  51 + if(sortNo < prev.getRouteSort()){
  52 +
  53 + //满足3个进站反向信号
  54 + List<StationRoute> prevs = GpsCacheData.prevMultiStation(gps);
  55 +
  56 + int count = 0;
  57 + for(StationRoute s : prevs){
  58 + if(sortNo < s.getRouteSort())
  59 + count ++;
  60 + sortNo = s.getRouteSort();
  61 + }
  62 +
  63 + if(count >= REVER_THRESHOLD)
  64 + return true;
  65 + }
  66 +
  67 + return false;
  68 + }
  69 +
  70 + private boolean isInOut(ScheduleRealInfo sch){
  71 + return sch.getBcType().equals("in") || sch.getBcType().equals("out");
  72 + }
  73 +}
src/main/java/com/bsth/data/gpsdata/arrival/handlers/StationInsideHandle.java renamed to src/main/java/com/bsth/data/gpsdata_v2/handlers/StationInsideProcess.java
1 -package com.bsth.data.gpsdata.arrival.handlers;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.arrival.GeoCacheData;  
5 -import com.bsth.data.gpsdata.arrival.SignalHandle;  
6 -import com.bsth.data.gpsdata.arrival.entity.StationRoute;  
7 -import com.bsth.data.gpsdata.arrival.utils.CircleQueue;  
8 -import com.bsth.data.gpsdata.arrival.utils.GeoUtils;  
9 -import org.slf4j.Logger;  
10 -import org.slf4j.LoggerFactory;  
11 -import org.springframework.stereotype.Component;  
12 -  
13 -import java.util.List;  
14 -  
15 -/**  
16 - * 站内站外判定  
17 - * Created by panzhao on 2016/12/27.  
18 - */  
19 -@Component  
20 -public class StationInsideHandle extends SignalHandle {  
21 -  
22 - Logger logger = LoggerFactory.getLogger(this.getClass());  
23 -  
24 - @Override  
25 - public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) {  
26 - //是否在场内  
27 - String parkCode = GeoUtils.gpsInCarpark(gps);  
28 - if (parkCode != null) {  
29 - gps.setInstation(2);  
30 - gps.setStopNo(parkCode);  
31 - gps.setCarparkNo(parkCode);  
32 - }  
33 -  
34 - //是否在站内  
35 - List<StationRoute> srs = GeoCacheData.getStationRoute(gps.getLineId(), gps.getUpDown());  
36 - StationRoute station = GeoUtils.gpsInStation(gps, srs);  
37 - if (station != null) {  
38 - gps.setInstation(1);  
39 - gps.setStopNo(station.getCode());  
40 - gps.setStation(station);  
41 - }  
42 -  
43 - //是否在进站前置围栏内  
44 - String premiseCode = GeoUtils.gpsInPremiseGeo(gps);  
45 - gps.setPremiseCode(premiseCode);  
46 -  
47 - if(isNotEmpty(prevs)){  
48 - try {  
49 - GpsEntity prev = prevs.getTail();  
50 - //继承前置围栏  
51 - if(null == premiseCode && null != prev.getPremiseCode())  
52 - gps.setPremiseCode(prev.getPremiseCode());  
53 -  
54 - //在场,站外  
55 - if(gps.getInstation() == 0){  
56 - //继承上一个点的站点编码  
57 - gps.setStopNo(prev.getStopNo());  
58 -  
59 - /*if(null == premiseCode && null != prev.getPremiseCode())  
60 - gps.setPremiseCode(prev.getPremiseCode());*/  
61 - }  
62 - /*else if(null != gps.getPremiseCode() && !gps.getStopNo().equals(gps.getPremiseCode())){  
63 - gps.setPremiseCode(null);  
64 - }*/  
65 - }catch (Exception e){  
66 - logger.error("", e);  
67 - }  
68 - }  
69 -  
70 -/*  
71 - //在场,站外  
72 - if(gps.getInstation() == 0 && isNotEmpty(prevs)){  
73 - //继承上一个点的站点编码  
74 - GpsEntity prev = prevs.getTail();  
75 - gps.setStopNo(prev.getStopNo());  
76 - }  
77 -*/  
78 - return true;  
79 - }  
80 -} 1 +package com.bsth.data.gpsdata_v2.handlers;
  2 +
  3 +import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
  4 +import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
  5 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  6 +import com.bsth.data.gpsdata_v2.entity.StationRoute;
  7 +import com.bsth.data.gpsdata_v2.utils.GeoUtils;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 站内 场内判定
  14 + * Created by panzhao on 2017/11/16.
  15 + */
  16 +@Component
  17 +public class StationInsideProcess {
  18 +
  19 + public void process(GpsEntity gps){
  20 + //是否在场内
  21 + String parkCode = GeoUtils.gpsInCarpark(gps);
  22 +
  23 + if (parkCode != null) {
  24 + gps.setInstation(2);
  25 + gps.setStopNo(parkCode);
  26 + gps.setCarparkNo(parkCode);
  27 + }
  28 +
  29 + //是否在站内
  30 + List<StationRoute> srs = GeoCacheData.getStationRoute(gps.getLineId(), gps.getUpDown());
  31 + StationRoute station = GeoUtils.gpsInStation(gps, srs);
  32 + if (station != null) {
  33 + gps.setInstation(1);
  34 + gps.setStopNo(station.getCode());
  35 + gps.setStation(station);
  36 + }
  37 +
  38 + //是否在进站前置围栏内
  39 + String premiseCode = GeoUtils.gpsInPremiseGeo(gps);
  40 + gps.setPremiseCode(premiseCode);
  41 +
  42 + //上一个点位
  43 + GpsEntity prev = GpsCacheData.getPrev(gps);
  44 +
  45 + if(null != prev){
  46 + //继承前置围栏状态
  47 + if(null == premiseCode && null != prev.getPremiseCode())
  48 + gps.setPremiseCode(prev.getPremiseCode());
  49 +
  50 + //在场,站外
  51 + if(gps.getInstation() == 0){
  52 + gps.setStopNo(prev.getStopNo());//继承上一个点的站点编码
  53 + }
  54 + }
  55 + }
  56 +}
src/main/java/com/bsth/data/gpsdata_v2/load/GatewayHttpLoader.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.load;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.bsth.data.BasicData;
  5 +import com.bsth.data.gpsdata_v2.GpsRealData;
  6 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  7 +import com.bsth.data.gpsdata_v2.utils.GpsDataUtils;
  8 +import com.bsth.util.ConfigUtil;
  9 +import org.apache.commons.lang3.StringUtils;
  10 +import org.apache.http.HttpEntity;
  11 +import org.apache.http.client.config.RequestConfig;
  12 +import org.apache.http.client.methods.CloseableHttpResponse;
  13 +import org.apache.http.client.methods.HttpGet;
  14 +import org.apache.http.impl.client.CloseableHttpClient;
  15 +import org.apache.http.impl.client.HttpClients;
  16 +import org.slf4j.Logger;
  17 +import org.slf4j.LoggerFactory;
  18 +import org.springframework.beans.BeansException;
  19 +import org.springframework.context.ApplicationContext;
  20 +import org.springframework.context.ApplicationContextAware;
  21 +import org.springframework.stereotype.Component;
  22 +
  23 +import java.io.BufferedReader;
  24 +import java.io.InputStreamReader;
  25 +import java.util.ArrayList;
  26 +import java.util.List;
  27 +
  28 +/**
  29 + * 从网关http 接口加载数据
  30 + * Created by panzhao on 2017/11/15.
  31 + */
  32 +@Component
  33 +public class GatewayHttpLoader implements ApplicationContextAware{
  34 +
  35 + static Logger logger = LoggerFactory.getLogger(GatewayHttpLoader.class);
  36 +
  37 + static String url;
  38 + static List<GpsEntity> list;
  39 + static CloseableHttpClient httpClient = null;
  40 + static HttpGet get;
  41 + static RequestConfig requestConfig;
  42 + static CloseableHttpResponse response;
  43 + static HttpEntity entity;
  44 + static BufferedReader br;
  45 +
  46 + static GpsRealData gpsRealData;
  47 +
  48 + static{
  49 + url = ConfigUtil.get("http.gps.real.url");
  50 + list = new ArrayList<>();
  51 + httpClient = HttpClients.createDefault();
  52 + get = new HttpGet(url);
  53 + requestConfig = RequestConfig.custom()
  54 + .setConnectTimeout(1500).setConnectionRequestTimeout(1000)
  55 + .setSocketTimeout(1500).build();
  56 + get.setConfig(requestConfig);
  57 + }
  58 +
  59 + public static List<GpsEntity> load(){
  60 + try{
  61 + if(list.size() > 0)
  62 + list.clear();
  63 +
  64 + response = httpClient.execute(get);
  65 + entity = response.getEntity();
  66 +
  67 + if(null == entity)
  68 + return list;
  69 +
  70 + br = new BufferedReader(new InputStreamReader(entity.getContent()));
  71 +
  72 + StringBuilder sb = new StringBuilder();
  73 + String str;
  74 + while ((str = br.readLine()) != null)
  75 + sb.append(str);
  76 +
  77 + list = JSON.parseArray(JSON.parseObject(sb.toString()).getString("data"), GpsEntity.class);
  78 + //过滤掉无效的点位
  79 + list = GpsDataUtils.clearInvalid(list);
  80 +
  81 + List<GpsEntity> ups = new ArrayList<>();
  82 + String nbbm;
  83 + for (GpsEntity gps : list) {
  84 + if (StringUtils.isBlank(gps.getDeviceId()))
  85 + continue;
  86 +
  87 + if (gps_equals(gpsRealData.get(gps.getDeviceId()), gps))
  88 + continue;
  89 +
  90 + nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId());
  91 + gps.setNbbm(nbbm);
  92 + ups.add(gps);
  93 + }
  94 + list = ups;
  95 +
  96 + if (null != response)
  97 + response.close();
  98 + }catch (Exception e){
  99 + logger.error("", e);
  100 + }
  101 + return list;
  102 + }
  103 +
  104 +
  105 + private static boolean gps_equals(GpsEntity old, GpsEntity gps){
  106 + if(old != null &&
  107 + old.getTimestamp().equals(gps.getTimestamp()) &&
  108 + old.getLat().equals(gps.getLat()) &&
  109 + old.getLon().equals(gps.getLon()))
  110 + return true;
  111 + return false;
  112 + }
  113 +
  114 + @Override
  115 + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  116 + gpsRealData = applicationContext.getBean(GpsRealData.class);
  117 + }
  118 +}
src/main/java/com/bsth/data/gpsdata_v2/load/SocketClientLoader.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.load;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.bsth.data.BasicData;
  5 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  6 +import com.bsth.data.gpsdata_v2.utils.GpsDataUtils;
  7 +import com.bsth.util.ConfigUtil;
  8 +import org.apache.http.HttpEntity;
  9 +import org.apache.http.client.config.RequestConfig;
  10 +import org.apache.http.client.methods.CloseableHttpResponse;
  11 +import org.apache.http.client.methods.HttpGet;
  12 +import org.apache.http.impl.client.CloseableHttpClient;
  13 +import org.apache.http.impl.client.HttpClients;
  14 +import org.slf4j.Logger;
  15 +import org.slf4j.LoggerFactory;
  16 +import org.springframework.stereotype.Component;
  17 +
  18 +import java.io.BufferedReader;
  19 +import java.io.InputStreamReader;
  20 +import java.util.ArrayList;
  21 +import java.util.List;
  22 +
  23 +/**
  24 + * 从专用的socket client 加载数据
  25 + * Created by panzhao on 2017/11/15.
  26 + */
  27 +@Component
  28 +public class SocketClientLoader {
  29 +
  30 + static Logger logger = LoggerFactory.getLogger(SocketClientLoader.class);
  31 +
  32 + static String url;
  33 + static List<GpsEntity> list;
  34 + static CloseableHttpClient httpClient = null;
  35 + static HttpGet get;
  36 + static RequestConfig requestConfig;
  37 + static CloseableHttpResponse response;
  38 + static HttpEntity entity;
  39 + static BufferedReader br;
  40 +
  41 + static {
  42 + url = ConfigUtil.get("http.gps.real.cache.url");
  43 + list = new ArrayList<>();
  44 + httpClient = HttpClients.createDefault();
  45 + get = new HttpGet(url);
  46 + requestConfig = RequestConfig.custom()
  47 + .setConnectTimeout(1500).setConnectionRequestTimeout(1000)
  48 + .setSocketTimeout(1500).build();
  49 + get.setConfig(requestConfig);
  50 + }
  51 +
  52 + public static List<GpsEntity> load(){
  53 + try {
  54 + if(list.size() > 0)
  55 + list.clear();
  56 + logger.info("load start...");
  57 + response = httpClient.execute(get);
  58 + entity = response.getEntity();
  59 + if(null == entity)
  60 + return list;
  61 +
  62 + br = new BufferedReader(new InputStreamReader(entity.getContent()));
  63 + StringBuilder sb = new StringBuilder();
  64 + String str;
  65 + while ((str = br.readLine()) != null)
  66 + sb.append(str);
  67 +
  68 + list = JSON.parseArray(sb.toString(), GpsEntity.class);
  69 +
  70 + //过滤掉无效的点位
  71 + list = GpsDataUtils.clearInvalid(list);
  72 +
  73 + logger.info("load end!");
  74 + for (GpsEntity gps : list) {
  75 + gps.setNbbm(BasicData.deviceId2NbbmMap.get(gps.getDeviceId()));
  76 + }
  77 +
  78 + if (null != response)
  79 + response.close();
  80 + } catch (Exception e) {
  81 + logger.error("", e);
  82 + }
  83 +
  84 + return list;
  85 + }
  86 +}
src/main/java/com/bsth/data/gpsdata_v2/rfid/UploadRfidDataService.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.rfid;
  2 +
  3 +import com.bsth.data.gpsdata_v2.rfid.entity.RfidInoutStation;
  4 +import com.bsth.data.gpsdata_v2.rfid.handle.RfidSignalHandle;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.web.bind.annotation.RequestBody;
  7 +import org.springframework.web.bind.annotation.RequestMapping;
  8 +import org.springframework.web.bind.annotation.RestController;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * RFID 数据上传入口
  14 + * Created by panzhao on 2017/11/22.
  15 + */
  16 +@RestController
  17 +@RequestMapping("/up/rfid")
  18 +public class UploadRfidDataService {
  19 +
  20 + @Autowired
  21 + RfidSignalHandle rfidSignalHandle;
  22 +
  23 + @RequestMapping("inside")
  24 + public void inside(@RequestBody List<RfidInoutStation> list) {
  25 + rfidSignalHandle.handle(list);
  26 + }
  27 +}
src/main/java/com/bsth/data/gpsdata_v2/rfid/entity/RfidInoutStation.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.rfid.entity;
  2 +
  3 +/**
  4 + * RFID 进出数据
  5 + * Created by panzhao on 2017/11/22.
  6 + */
  7 +public class RfidInoutStation {
  8 +
  9 + private String nbbm;
  10 +
  11 + private String station;
  12 +
  13 + /**
  14 + * 0 进
  15 + * 1 出
  16 + */
  17 + private int type;
  18 +
  19 + /**
  20 + * 信号时间
  21 + */
  22 + private long t;
  23 +
  24 + public String getNbbm() {
  25 + return nbbm;
  26 + }
  27 +
  28 + public void setNbbm(String nbbm) {
  29 + this.nbbm = nbbm;
  30 + }
  31 +
  32 + public String getStation() {
  33 + return station;
  34 + }
  35 +
  36 + public void setStation(String station) {
  37 + this.station = station;
  38 + }
  39 +
  40 + public int getType() {
  41 + return type;
  42 + }
  43 +
  44 + public void setType(int type) {
  45 + this.type = type;
  46 + }
  47 +
  48 + public long getT() {
  49 + return t;
  50 + }
  51 +
  52 + public void setT(long t) {
  53 + this.t = t;
  54 + }
  55 +}
src/main/java/com/bsth/data/gpsdata_v2/rfid/handle/RfidSignalHandle.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.rfid.handle;
  2 +
  3 +import com.bsth.data.gpsdata_v2.rfid.entity.RfidInoutStation;
  4 +import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;
  5 +import com.bsth.data.msg_queue.DirectivePushQueue;
  6 +import com.bsth.data.schedule.DayOfSchedule;
  7 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  8 +import com.bsth.websocket.handler.SendUtils;
  9 +import org.apache.commons.lang3.StringUtils;
  10 +import org.slf4j.Logger;
  11 +import org.slf4j.LoggerFactory;
  12 +import org.springframework.beans.factory.annotation.Autowired;
  13 +import org.springframework.stereotype.Component;
  14 +
  15 +import java.util.List;
  16 +
  17 +/**
  18 + * RFID信号处理
  19 + * Created by panzhao on 2017/11/22.
  20 + */
  21 +@Component
  22 +public class RfidSignalHandle {
  23 +
  24 + @Autowired
  25 + DayOfSchedule dayOfSchedule;
  26 +
  27 + @Autowired
  28 + SendUtils sendUtils;
  29 +
  30 + @Autowired
  31 + GpsStatusManager gpsStatusManager;
  32 +
  33 + Logger logger = LoggerFactory.getLogger(this.getClass());
  34 +
  35 + public void handle(List<RfidInoutStation> list){
  36 + for(RfidInoutStation signal : list){
  37 + if(signal.getType()==0)
  38 + in(signal);
  39 + else if(signal.getType()==1)
  40 + out(signal);
  41 + }
  42 + }
  43 +
  44 + /**
  45 + * 出
  46 + * @param signal
  47 + */
  48 + private void out(RfidInoutStation signal) {
  49 + try{
  50 + String nbbm = signal.getNbbm();
  51 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(nbbm);
  52 +
  53 + if(null == sch)
  54 + return;
  55 +
  56 + if(sch.getQdzCode().equals(signal.getStation())
  57 + && StringUtils.isEmpty(sch.getFcsjActual())){
  58 +
  59 + //班次发车
  60 + sch.setFcsjActualAll(signal.getT());
  61 +
  62 + //webSocket
  63 + sendUtils.sendFcsj(sch);
  64 +
  65 + //持久化
  66 + dayOfSchedule.save(sch);
  67 +
  68 + logger.info("RFID; 车辆:" + sch.getClZbh() + " 班次:" + sch.getDfsj() + "发车, 时间:" + sch.getFcsjActual());
  69 + }
  70 + }catch (Exception e){
  71 + logger.error("", e);
  72 + }
  73 + }
  74 +
  75 + /**
  76 + * 进
  77 + * @param signal
  78 + */
  79 + private void in(RfidInoutStation signal) {
  80 + try{
  81 + String nbbm = signal.getNbbm();
  82 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(nbbm);
  83 +
  84 + if(sch.getZdzCode().equals(signal.getStation())
  85 + && StringUtils.isEmpty(sch.getZdsjActual())){
  86 +
  87 + sch.setZdsjActualAll(signal.getT());
  88 +
  89 +
  90 + //持久化
  91 + dayOfSchedule.save(sch);
  92 +
  93 + //车辆的下一个班次
  94 + ScheduleRealInfo next = dayOfSchedule.next(sch);
  95 + if(next != null){
  96 + dayOfSchedule.addExecPlan(next);
  97 + //inStationAndInPark(sch, next);//进站既进场
  98 + }
  99 +
  100 + //路牌的下一个班次,页面显示起点实际到达时间
  101 + ScheduleRealInfo lpNext = dayOfSchedule.nextByLp(sch);
  102 + if(lpNext != null){
  103 + lpNext.setQdzArrDatesj(sch.getZdsjActual());
  104 + }
  105 +
  106 + //已完成班次数
  107 + int doneSum = dayOfSchedule.doneSum(nbbm);
  108 +
  109 + //webSocket
  110 + sendUtils.sendZdsj(sch, lpNext, doneSum);
  111 +
  112 + logger.info("RFID; 车辆:" + nbbm + " 班次:" + sch.getDfsj() + "到终点, 时间:" + sch.getZdsjActual());
  113 +
  114 + //下发调度指令
  115 + DirectivePushQueue.put6002(next, doneSum, "rfid@系统");
  116 +
  117 + //套跑 -下发线路切换指令
  118 + if(null != next && !next.getXlBm().equals(sch.getXlBm())){
  119 + gpsStatusManager.changeLine(next.getClZbh(), next.getXlBm(), "rfid@系统");
  120 + }
  121 +
  122 + if(null == next)
  123 + nonService(sch, "rfid1@系统");//班次结束
  124 + else if(dayOfSchedule.emptyService(next))
  125 + nonService(sch, "rfid2@系统");//下一班非营运
  126 + }
  127 + }catch (Exception e){
  128 + logger.error("", e);
  129 + }
  130 + }
  131 +
  132 + /**
  133 + * 将车载设备切换为非营运状态
  134 + * @param sch
  135 + * @param sender
  136 + */
  137 + private void nonService(ScheduleRealInfo sch, String sender){
  138 + gpsStatusManager.changeServiceState(sch.getClZbh(), sch.getXlDir(), 1, sender);
  139 + }
  140 +}
src/main/java/com/bsth/data/gpsdata/status_manager/GpsStatusManager.java renamed to src/main/java/com/bsth/data/gpsdata_v2/status_manager/GpsStatusManager.java
1 -package com.bsth.data.gpsdata.status_manager;  
2 -  
3 -import com.bsth.Application;  
4 -import com.bsth.data.gpsdata.status_manager.gps_line_state.LineStateHandle;  
5 -import com.bsth.data.gpsdata.status_manager.gps_service_state.ServiceStateHandle;  
6 -import org.springframework.beans.factory.annotation.Autowired;  
7 -import org.springframework.boot.CommandLineRunner;  
8 -import org.springframework.stereotype.Component;  
9 -  
10 -import java.util.concurrent.TimeUnit;  
11 -  
12 -/**  
13 - * GPS 状态管理  
14 - * Created by panzhao on 2017/7/13.  
15 - */  
16 -@Component  
17 -public class GpsStatusManager implements CommandLineRunner {  
18 -  
19 - @Autowired  
20 - StatusCheckThread checkThread;  
21 -  
22 - @Autowired  
23 - LineStateHandle lineStateHandle;  
24 -  
25 - @Autowired  
26 - ServiceStateHandle serviceStateHandle;  
27 -  
28 - /**  
29 - * 切换线路  
30 - * @param nbbm  
31 - * @param lineCode  
32 - * @param sender  
33 - */  
34 - public void changeLine(String nbbm, String lineCode, String sender){  
35 - lineStateHandle.changeLine(nbbm, lineCode, sender);  
36 - }  
37 -  
38 - /**  
39 - * 切换营运状态  
40 - * @param nbbm  
41 - * @param state 0 营运, 1:非营运  
42 - * @param sender  
43 - */  
44 - public void changeServiceState(String nbbm, String upDown,int state, String sender){  
45 - changeServiceState(nbbm, Integer.parseInt(upDown), state, sender);  
46 - }  
47 -  
48 - /**  
49 - * 切换营运状态  
50 - * @param nbbm  
51 - * @param state 0 营运, 1:非营运  
52 - * @param sender  
53 - */  
54 - public void changeServiceState(String nbbm, int upDown,int state, String sender){  
55 - serviceStateHandle.changeState(nbbm, upDown, state, sender);  
56 - }  
57 -  
58 - @Override  
59 - public void run(String... strings) throws Exception {  
60 - Application.mainServices.scheduleWithFixedDelay(checkThread, 120, 120, TimeUnit.SECONDS);  
61 - }  
62 -  
63 - @Component  
64 - public static class StatusCheckThread extends Thread{  
65 -  
66 - @Autowired  
67 - LineStateHandle lineStateHandle;  
68 -  
69 - @Autowired  
70 - ServiceStateHandle serviceStateHandle;  
71 -  
72 - @Override  
73 - public void run() {  
74 - /** 检查线路切换结果 */  
75 - lineStateHandle.checkResultAll();  
76 - /** 检查营运状态切换结果 */  
77 - serviceStateHandle.checkResultAll();  
78 - }  
79 - }  
80 -} 1 +package com.bsth.data.gpsdata_v2.status_manager;
  2 +
  3 +import com.bsth.Application;
  4 +import com.bsth.data.gpsdata_v2.status_manager.gps_line_state.LineStateHandle;
  5 +import com.bsth.data.gpsdata_v2.status_manager.gps_service_state.ServiceStateHandle;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.boot.CommandLineRunner;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +import java.util.concurrent.TimeUnit;
  11 +
  12 +/**
  13 + * GPS 状态管理
  14 + * Created by panzhao on 2017/7/13.
  15 + */
  16 +@Component
  17 +public class GpsStatusManager implements CommandLineRunner {
  18 +
  19 + @Autowired
  20 + StatusCheckThread checkThread;
  21 +
  22 + @Autowired
  23 + LineStateHandle lineStateHandle;
  24 +
  25 + @Autowired
  26 + ServiceStateHandle serviceStateHandle;
  27 +
  28 + /**
  29 + * 切换线路
  30 + * @param nbbm
  31 + * @param lineCode
  32 + * @param sender
  33 + */
  34 + public void changeLine(String nbbm, String lineCode, String sender){
  35 + lineStateHandle.changeLine(nbbm, lineCode, sender);
  36 + }
  37 +
  38 + /**
  39 + * 切换营运状态
  40 + * @param nbbm
  41 + * @param state 0 营运, 1:非营运
  42 + * @param sender
  43 + */
  44 + public void changeServiceState(String nbbm, String upDown,int state, String sender){
  45 + changeServiceState(nbbm, Integer.parseInt(upDown), state, sender);
  46 + }
  47 +
  48 + /**
  49 + * 切换营运状态
  50 + * @param nbbm
  51 + * @param state 0 营运, 1:非营运
  52 + * @param sender
  53 + */
  54 + public void changeServiceState(String nbbm, int upDown,int state, String sender){
  55 + serviceStateHandle.changeState(nbbm, upDown, state, sender);
  56 + }
  57 +
  58 + @Override
  59 + public void run(String... strings) throws Exception {
  60 + Application.mainServices.scheduleWithFixedDelay(checkThread, 120, 120, TimeUnit.SECONDS);
  61 + }
  62 +
  63 + @Component
  64 + public static class StatusCheckThread extends Thread{
  65 +
  66 + @Autowired
  67 + LineStateHandle lineStateHandle;
  68 +
  69 + @Autowired
  70 + ServiceStateHandle serviceStateHandle;
  71 +
  72 + @Override
  73 + public void run() {
  74 + /** 检查线路切换结果 */
  75 + lineStateHandle.checkResultAll();
  76 + /** 检查营运状态切换结果 */
  77 + serviceStateHandle.checkResultAll();
  78 + }
  79 + }
  80 +}
src/main/java/com/bsth/data/gpsdata/status_manager/gps_line_state/ChangeBean.java renamed to src/main/java/com/bsth/data/gpsdata_v2/status_manager/gps_line_state/ChangeBean.java
1 -package com.bsth.data.gpsdata.status_manager.gps_line_state;  
2 -  
3 -/**  
4 - * Created by panzhao on 2017/7/13.  
5 - */  
6 -public class ChangeBean {  
7 -  
8 - /**  
9 - * 车辆自编号  
10 - */  
11 - private String nbbm;  
12 -  
13 - /**  
14 - * 要切换到的线路  
15 - */  
16 - private String lineCode;  
17 -  
18 - /**  
19 - * 指令发送次数  
20 - */  
21 - private int sendCount;  
22 -  
23 - /**  
24 - * 上次指令时间  
25 - */  
26 - private long st;  
27 -  
28 - /**发送人 */  
29 - private String sender;  
30 -  
31 - public static ChangeBean getInstance(String nbbm, String lineCode, String sender){  
32 - ChangeBean cb = new ChangeBean();  
33 - cb.setNbbm(nbbm);  
34 - cb.setLineCode(lineCode);  
35 - cb.setSendCount(0);  
36 - cb.setSender(sender);  
37 - return cb;  
38 - }  
39 -  
40 - public void countPlus(){  
41 - sendCount ++;  
42 - }  
43 -  
44 - public String getLineCode() {  
45 - return lineCode;  
46 - }  
47 -  
48 - public void setLineCode(String lineCode) {  
49 - this.lineCode = lineCode;  
50 - }  
51 -  
52 - public int getSendCount() {  
53 - return sendCount;  
54 - }  
55 -  
56 - public void setSendCount(int sendCount) {  
57 - this.sendCount = sendCount;  
58 - }  
59 -  
60 - public long getSt() {  
61 - return st;  
62 - }  
63 -  
64 - public void setSt(long st) {  
65 - this.st = st;  
66 - }  
67 -  
68 - public String getSender() {  
69 - return sender;  
70 - }  
71 -  
72 - public void setSender(String sender) {  
73 - this.sender = sender;  
74 - }  
75 -  
76 - public String getNbbm() {  
77 - return nbbm;  
78 - }  
79 -  
80 - public void setNbbm(String nbbm) {  
81 - this.nbbm = nbbm;  
82 - }  
83 -} 1 +package com.bsth.data.gpsdata_v2.status_manager.gps_line_state;
  2 +
  3 +/**
  4 + * Created by panzhao on 2017/7/13.
  5 + */
  6 +public class ChangeBean {
  7 +
  8 + /**
  9 + * 车辆自编号
  10 + */
  11 + private String nbbm;
  12 +
  13 + /**
  14 + * 要切换到的线路
  15 + */
  16 + private String lineCode;
  17 +
  18 + /**
  19 + * 指令发送次数
  20 + */
  21 + private int sendCount;
  22 +
  23 + /**
  24 + * 上次指令时间
  25 + */
  26 + private long st;
  27 +
  28 + /**发送人 */
  29 + private String sender;
  30 +
  31 + public static ChangeBean getInstance(String nbbm, String lineCode, String sender){
  32 + ChangeBean cb = new ChangeBean();
  33 + cb.setNbbm(nbbm);
  34 + cb.setLineCode(lineCode);
  35 + cb.setSendCount(0);
  36 + cb.setSender(sender);
  37 + return cb;
  38 + }
  39 +
  40 + public void countPlus(){
  41 + sendCount ++;
  42 + }
  43 +
  44 + public String getLineCode() {
  45 + return lineCode;
  46 + }
  47 +
  48 + public void setLineCode(String lineCode) {
  49 + this.lineCode = lineCode;
  50 + }
  51 +
  52 + public int getSendCount() {
  53 + return sendCount;
  54 + }
  55 +
  56 + public void setSendCount(int sendCount) {
  57 + this.sendCount = sendCount;
  58 + }
  59 +
  60 + public long getSt() {
  61 + return st;
  62 + }
  63 +
  64 + public void setSt(long st) {
  65 + this.st = st;
  66 + }
  67 +
  68 + public String getSender() {
  69 + return sender;
  70 + }
  71 +
  72 + public void setSender(String sender) {
  73 + this.sender = sender;
  74 + }
  75 +
  76 + public String getNbbm() {
  77 + return nbbm;
  78 + }
  79 +
  80 + public void setNbbm(String nbbm) {
  81 + this.nbbm = nbbm;
  82 + }
  83 +}
src/main/java/com/bsth/data/gpsdata/status_manager/gps_line_state/LineStateHandle.java renamed to src/main/java/com/bsth/data/gpsdata_v2/status_manager/gps_line_state/LineStateHandle.java
1 -package com.bsth.data.gpsdata.status_manager.gps_line_state;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.GpsRealData;  
5 -import com.bsth.data.msg_queue.DirectivePushQueue;  
6 -import com.bsth.service.directive.DirectiveService;  
7 -import org.slf4j.Logger;  
8 -import org.slf4j.LoggerFactory;  
9 -import org.springframework.beans.factory.annotation.Autowired;  
10 -import org.springframework.stereotype.Component;  
11 -  
12 -import java.util.Collection;  
13 -import java.util.concurrent.ConcurrentHashMap;  
14 -  
15 -/**  
16 - * 设备线路状态处理  
17 - * Created by panzhao on 2017/7/13.  
18 - */  
19 -@Component  
20 -public class LineStateHandle {  
21 -  
22 - private static ConcurrentHashMap<String, ChangeBean> map;  
23 -  
24 - @Autowired  
25 - DirectiveService directiveService;  
26 - @Autowired  
27 - GpsRealData gpsRealData;  
28 -  
29 - Logger logger = LoggerFactory.getLogger(this.getClass());  
30 -  
31 - /** 重发次数 */  
32 - private final static int MAX_SEND_COUNT=3;  
33 - /** 重发间隔 */  
34 - private final static int SEND_SPACE=1000 * 60 * 6;  
35 - /** 最大有效时间 */  
36 - private final static int MAX_AVAIL_TIME=1000 * 60 * 60 * 2;  
37 -  
38 - static{  
39 - map = new ConcurrentHashMap();  
40 - }  
41 -  
42 - public void changeLine(String nbbm, String lineCode, String sender){  
43 - ChangeBean cb = map.get(nbbm);  
44 - if(cb != null && cb.getLineCode().equals(lineCode)){  
45 - return;  
46 - }  
47 -  
48 - cb = ChangeBean.getInstance(nbbm, lineCode, sender);  
49 - map.put(nbbm, cb);  
50 -  
51 - changeLine(cb);  
52 - }  
53 -  
54 - private void changeLine(ChangeBean cb){  
55 - cb.setSt(System.currentTimeMillis());  
56 - cb.countPlus();  
57 - DirectivePushQueue.put64(cb.getNbbm(), cb.getLineCode(), cb.getSender());  
58 - }  
59 -  
60 -  
61 - public void checkResultAll(){  
62 - Collection<ChangeBean> cbs = map.values();  
63 - for(ChangeBean cb : cbs){  
64 - checkResult(cb);  
65 - }  
66 - }  
67 -  
68 - private void checkResult(ChangeBean cb){  
69 - try{  
70 - GpsEntity gps = gpsRealData.getByNbbm(cb.getNbbm());  
71 - if(gps == null)  
72 - return;  
73 -  
74 - if(cb.getLineCode().equals(gps.getLineId())){  
75 - map.remove(cb.getNbbm());  
76 - logger.info("线路切换成功," + cb.getNbbm() + "、" + cb.getLineCode());  
77 - }  
78 - else{  
79 - reSend(cb);  
80 - }  
81 - }catch (Exception e){  
82 - logger.error("", e);  
83 - }  
84 - }  
85 -  
86 - private void reSend(ChangeBean cb){  
87 - if(cb.getSendCount() >= MAX_SEND_COUNT){  
88 - map.remove(cb.getNbbm());  
89 - logger.info("超过重发次数," + cb.getNbbm() + "、" + cb.getLineCode());  
90 - return;  
91 - }  
92 -  
93 - long diff = System.currentTimeMillis() - cb.getSt();  
94 - if(diff >= MAX_AVAIL_TIME){  
95 - map.remove(cb.getNbbm());  
96 - logger.info("超过有效时间," + cb.getNbbm() + "、" + cb.getLineCode() + "、" + cb.getSt());  
97 - return;  
98 - }  
99 -  
100 - if(diff >= SEND_SPACE){  
101 - cb.setSender("补发@系统");  
102 - changeLine(cb);  
103 - logger.info("重发线路切换指令," + cb.getNbbm() + "、" + cb.getLineCode());  
104 - return;  
105 - }  
106 - }  
107 -} 1 +package com.bsth.data.gpsdata_v2.status_manager.gps_line_state;
  2 +
  3 +import com.bsth.data.gpsdata_v2.GpsRealData;
  4 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  5 +import com.bsth.data.msg_queue.DirectivePushQueue;
  6 +import com.bsth.service.directive.DirectiveService;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import java.util.Collection;
  13 +import java.util.concurrent.ConcurrentHashMap;
  14 +
  15 +/**
  16 + * 设备线路状态处理
  17 + * Created by panzhao on 2017/7/13.
  18 + */
  19 +@Component
  20 +public class LineStateHandle {
  21 +
  22 + private static ConcurrentHashMap<String, ChangeBean> map;
  23 +
  24 + @Autowired
  25 + DirectiveService directiveService;
  26 + @Autowired
  27 + GpsRealData gpsRealData;
  28 +
  29 + Logger logger = LoggerFactory.getLogger(this.getClass());
  30 +
  31 + /** 重发次数 */
  32 + private final static int MAX_SEND_COUNT=3;
  33 + /** 重发间隔 */
  34 + private final static int SEND_SPACE=1000 * 60 * 6;
  35 + /** 最大有效时间 */
  36 + private final static int MAX_AVAIL_TIME=1000 * 60 * 60 * 2;
  37 +
  38 + static{
  39 + map = new ConcurrentHashMap();
  40 + }
  41 +
  42 + public void changeLine(String nbbm, String lineCode, String sender){
  43 + ChangeBean cb = map.get(nbbm);
  44 + if(cb != null && cb.getLineCode().equals(lineCode)){
  45 + return;
  46 + }
  47 +
  48 + cb = ChangeBean.getInstance(nbbm, lineCode, sender);
  49 + map.put(nbbm, cb);
  50 +
  51 + changeLine(cb);
  52 + }
  53 +
  54 + private void changeLine(ChangeBean cb){
  55 + cb.setSt(System.currentTimeMillis());
  56 + cb.countPlus();
  57 + DirectivePushQueue.put64(cb.getNbbm(), cb.getLineCode(), cb.getSender());
  58 + }
  59 +
  60 +
  61 + public void checkResultAll(){
  62 + Collection<ChangeBean> cbs = map.values();
  63 + for(ChangeBean cb : cbs){
  64 + checkResult(cb);
  65 + }
  66 + }
  67 +
  68 + private void checkResult(ChangeBean cb){
  69 + try{
  70 + GpsEntity gps = gpsRealData.getByNbbm(cb.getNbbm());
  71 + if(gps == null)
  72 + return;
  73 +
  74 + if(cb.getLineCode().equals(gps.getLineId())){
  75 + map.remove(cb.getNbbm());
  76 + logger.info("线路切换成功," + cb.getNbbm() + "、" + cb.getLineCode());
  77 + }
  78 + else{
  79 + reSend(cb);
  80 + }
  81 + }catch (Exception e){
  82 + logger.error("", e);
  83 + }
  84 + }
  85 +
  86 + private void reSend(ChangeBean cb){
  87 + if(cb.getSendCount() >= MAX_SEND_COUNT){
  88 + map.remove(cb.getNbbm());
  89 + logger.info("超过重发次数," + cb.getNbbm() + "、" + cb.getLineCode());
  90 + return;
  91 + }
  92 +
  93 + long diff = System.currentTimeMillis() - cb.getSt();
  94 + if(diff >= MAX_AVAIL_TIME){
  95 + map.remove(cb.getNbbm());
  96 + logger.info("超过有效时间," + cb.getNbbm() + "、" + cb.getLineCode() + "、" + cb.getSt());
  97 + return;
  98 + }
  99 +
  100 + if(diff >= SEND_SPACE){
  101 + cb.setSender("补发@系统");
  102 + changeLine(cb);
  103 + logger.info("重发线路切换指令," + cb.getNbbm() + "、" + cb.getLineCode());
  104 + return;
  105 + }
  106 + }
  107 +}
src/main/java/com/bsth/data/gpsdata/status_manager/gps_service_state/ServiceStateHandle.java renamed to src/main/java/com/bsth/data/gpsdata_v2/status_manager/gps_service_state/ServiceStateHandle.java
1 -package com.bsth.data.gpsdata.status_manager.gps_service_state;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.GpsRealData;  
5 -import com.bsth.data.msg_queue.DirectivePushQueue;  
6 -import com.bsth.service.directive.DirectiveService;  
7 -import org.slf4j.Logger;  
8 -import org.slf4j.LoggerFactory;  
9 -import org.springframework.beans.factory.annotation.Autowired;  
10 -import org.springframework.stereotype.Component;  
11 -  
12 -import java.util.Collection;  
13 -import java.util.concurrent.ConcurrentHashMap;  
14 -  
15 -/**  
16 - * 设备营运状态/上下行 处理  
17 - * Created by panzhao on 2017/7/13.  
18 - */  
19 -@Component  
20 -public class ServiceStateHandle {  
21 -  
22 - private static ConcurrentHashMap<String, StateBean> map;  
23 -  
24 - @Autowired  
25 - DirectiveService directiveService;  
26 - @Autowired  
27 - GpsRealData gpsRealData;  
28 -  
29 - Logger logger = LoggerFactory.getLogger(this.getClass());  
30 -  
31 - /** 重发次数 */  
32 - private final static int MAX_SEND_COUNT=3;  
33 - /** 重发间隔 */  
34 - private final static int SEND_SPACE=1000 * 60 * 3;  
35 - /** 最大有效时间 */  
36 - private final static int MAX_AVAIL_TIME=1000 * 60 * 50;  
37 -  
38 - static{  
39 - map = new ConcurrentHashMap();  
40 - }  
41 -  
42 - public void changeState(String nbbm, int upDown ,int state, String sender){  
43 - if(map.containsKey(nbbm)){  
44 - return;  
45 - }  
46 - StateBean sb = StateBean.getInstance(nbbm, upDown, state, sender);  
47 - map.put(nbbm, sb);  
48 - changeState(sb);  
49 - }  
50 -  
51 - private void changeState(StateBean sb){  
52 - sb.setSt(System.currentTimeMillis());  
53 - sb.countPlus();  
54 - DirectivePushQueue.put6003(sb.getNbbm(), sb.getState(), sb.getUpDown(), sb.getSender());  
55 - }  
56 -  
57 - public void checkResultAll(){  
58 - Collection<StateBean> sbs = map.values();  
59 - for(StateBean sb : sbs){  
60 - checkResult(sb);  
61 - }  
62 - }  
63 -  
64 - private void checkResult(StateBean sb){  
65 - try{  
66 - GpsEntity gps = gpsRealData.getByNbbm(sb.getNbbm());  
67 - if(gps == null)  
68 - return;  
69 -  
70 - if(gps.getState().equals(sb.getState()) && gps.getUpDown() == sb.getUpDown()){  
71 - map.remove(sb.getNbbm());  
72 - logger.info("状态切换成功," + sb.getNbbm() + "、" + sb.getState() + "、" + sb.getUpDown());  
73 - }  
74 - else  
75 - reSend(sb);  
76 - }catch (Exception e){  
77 - logger.error("", e);  
78 - }  
79 - }  
80 -  
81 - private void reSend(StateBean sb){  
82 - if(sb.getSendCount() >= MAX_SEND_COUNT){  
83 - map.remove(sb.getNbbm());  
84 - logger.info("超过重发次数," + sb.getNbbm() + "、" + sb.getState());  
85 - return;  
86 - }  
87 -  
88 - long diff = System.currentTimeMillis() - sb.getSt();  
89 - if(diff >= MAX_AVAIL_TIME){  
90 - map.remove(sb.getNbbm());  
91 - logger.info("状态切换超过有效时间," + sb.getNbbm() + "、" + sb.getState() + "、" + sb.getSt());  
92 - return;  
93 - }  
94 -  
95 - if(diff >= SEND_SPACE){  
96 - sb.setSender("补发@系统");  
97 - changeState(sb);  
98 - logger.info("重发状态切换指令," + sb.getNbbm() + "、" + sb.getState() + "、" + sb.getUpDown());  
99 - return;  
100 - }  
101 - }  
102 -} 1 +package com.bsth.data.gpsdata_v2.status_manager.gps_service_state;
  2 +
  3 +import com.bsth.data.gpsdata_v2.GpsRealData;
  4 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  5 +import com.bsth.data.msg_queue.DirectivePushQueue;
  6 +import com.bsth.service.directive.DirectiveService;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import java.util.Collection;
  13 +import java.util.concurrent.ConcurrentHashMap;
  14 +
  15 +/**
  16 + * 设备营运状态/上下行 处理
  17 + * Created by panzhao on 2017/7/13.
  18 + */
  19 +@Component
  20 +public class ServiceStateHandle {
  21 +
  22 + private static ConcurrentHashMap<String, StateBean> map;
  23 +
  24 + @Autowired
  25 + DirectiveService directiveService;
  26 + @Autowired
  27 + GpsRealData gpsRealData;
  28 +
  29 + Logger logger = LoggerFactory.getLogger(this.getClass());
  30 +
  31 + /** 重发次数 */
  32 + private final static int MAX_SEND_COUNT=3;
  33 + /** 重发间隔 */
  34 + private final static int SEND_SPACE=1000 * 60 * 3;
  35 + /** 最大有效时间 */
  36 + private final static int MAX_AVAIL_TIME=1000 * 60 * 50;
  37 +
  38 + static{
  39 + map = new ConcurrentHashMap();
  40 + }
  41 +
  42 + public void changeState(String nbbm, int upDown ,int state, String sender){
  43 + if(map.containsKey(nbbm)){
  44 + return;
  45 + }
  46 + StateBean sb = StateBean.getInstance(nbbm, upDown, state, sender);
  47 + map.put(nbbm, sb);
  48 + changeState(sb);
  49 + }
  50 +
  51 + private void changeState(StateBean sb){
  52 + sb.setSt(System.currentTimeMillis());
  53 + sb.countPlus();
  54 + DirectivePushQueue.put6003(sb.getNbbm(), sb.getState(), sb.getUpDown(), sb.getSender());
  55 + }
  56 +
  57 + public void checkResultAll(){
  58 + Collection<StateBean> sbs = map.values();
  59 + for(StateBean sb : sbs){
  60 + checkResult(sb);
  61 + }
  62 + }
  63 +
  64 + private void checkResult(StateBean sb){
  65 + try{
  66 + GpsEntity gps = gpsRealData.getByNbbm(sb.getNbbm());
  67 + if(gps == null)
  68 + return;
  69 +
  70 + if(gps.getState().equals(sb.getState()) && gps.getUpDown() == sb.getUpDown()){
  71 + map.remove(sb.getNbbm());
  72 + logger.info("状态切换成功," + sb.getNbbm() + "、" + sb.getState() + "、" + sb.getUpDown());
  73 + }
  74 + else
  75 + reSend(sb);
  76 + }catch (Exception e){
  77 + logger.error("", e);
  78 + }
  79 + }
  80 +
  81 + private void reSend(StateBean sb){
  82 + if(sb.getSendCount() >= MAX_SEND_COUNT){
  83 + map.remove(sb.getNbbm());
  84 + logger.info("超过重发次数," + sb.getNbbm() + "、" + sb.getState());
  85 + return;
  86 + }
  87 +
  88 + long diff = System.currentTimeMillis() - sb.getSt();
  89 + if(diff >= MAX_AVAIL_TIME){
  90 + map.remove(sb.getNbbm());
  91 + logger.info("状态切换超过有效时间," + sb.getNbbm() + "、" + sb.getState() + "、" + sb.getSt());
  92 + return;
  93 + }
  94 +
  95 + if(diff >= SEND_SPACE){
  96 + sb.setSender("补发@系统");
  97 + changeState(sb);
  98 + logger.info("重发状态切换指令," + sb.getNbbm() + "、" + sb.getState() + "、" + sb.getUpDown());
  99 + return;
  100 + }
  101 + }
  102 +}
src/main/java/com/bsth/data/gpsdata/status_manager/gps_service_state/StateBean.java renamed to src/main/java/com/bsth/data/gpsdata_v2/status_manager/gps_service_state/StateBean.java
1 -package com.bsth.data.gpsdata.status_manager.gps_service_state;  
2 -  
3 -/**  
4 - * Created by panzhao on 2017/7/13.  
5 - */  
6 -public class StateBean {  
7 -  
8 - /**  
9 - * 车辆自编号  
10 - */  
11 - private String nbbm;  
12 -  
13 - /**  
14 - * 要切换到营运状态  
15 - */  
16 - private int state;  
17 -  
18 - /**  
19 - * 要切换到的上下行  
20 - */  
21 - private int upDown;  
22 -  
23 - /**  
24 - * 指令发送次数  
25 - */  
26 - private int sendCount;  
27 -  
28 - /**  
29 - * 上次指令时间  
30 - */  
31 - private long st;  
32 -  
33 - /**发送人 */  
34 - private String sender;  
35 -  
36 - public static StateBean getInstance(String nbbm, int upDown, int state, String sender){  
37 - StateBean sb = new StateBean();  
38 - sb.setNbbm(nbbm);  
39 - sb.setState(state);  
40 - sb.setSendCount(0);  
41 - sb.setSender(sender);  
42 - sb.setUpDown(upDown);  
43 - return sb;  
44 - }  
45 -  
46 - public int getState() {  
47 - return state;  
48 - }  
49 -  
50 - public void setState(int state) {  
51 - this.state = state;  
52 - }  
53 -  
54 - public int getSendCount() {  
55 - return sendCount;  
56 - }  
57 -  
58 - public void setSendCount(int sendCount) {  
59 - this.sendCount = sendCount;  
60 - }  
61 -  
62 - public long getSt() {  
63 - return st;  
64 - }  
65 -  
66 - public void setSt(long st) {  
67 - this.st = st;  
68 - }  
69 -  
70 - public String getSender() {  
71 - return sender;  
72 - }  
73 -  
74 - public void setSender(String sender) {  
75 - this.sender = sender;  
76 - }  
77 -  
78 - public void countPlus(){  
79 - sendCount ++;  
80 - }  
81 -  
82 - public int getUpDown() {  
83 - return upDown;  
84 - }  
85 -  
86 - public void setUpDown(int upDown) {  
87 - this.upDown = upDown;  
88 - }  
89 -  
90 - public String getNbbm() {  
91 - return nbbm;  
92 - }  
93 -  
94 - public void setNbbm(String nbbm) {  
95 - this.nbbm = nbbm;  
96 - }  
97 -} 1 +package com.bsth.data.gpsdata_v2.status_manager.gps_service_state;
  2 +
  3 +/**
  4 + * Created by panzhao on 2017/7/13.
  5 + */
  6 +public class StateBean {
  7 +
  8 + /**
  9 + * 车辆自编号
  10 + */
  11 + private String nbbm;
  12 +
  13 + /**
  14 + * 要切换到营运状态
  15 + */
  16 + private int state;
  17 +
  18 + /**
  19 + * 要切换到的上下行
  20 + */
  21 + private int upDown;
  22 +
  23 + /**
  24 + * 指令发送次数
  25 + */
  26 + private int sendCount;
  27 +
  28 + /**
  29 + * 上次指令时间
  30 + */
  31 + private long st;
  32 +
  33 + /**发送人 */
  34 + private String sender;
  35 +
  36 + public static StateBean getInstance(String nbbm, int upDown, int state, String sender){
  37 + StateBean sb = new StateBean();
  38 + sb.setNbbm(nbbm);
  39 + sb.setState(state);
  40 + sb.setSendCount(0);
  41 + sb.setSender(sender);
  42 + sb.setUpDown(upDown);
  43 + return sb;
  44 + }
  45 +
  46 + public int getState() {
  47 + return state;
  48 + }
  49 +
  50 + public void setState(int state) {
  51 + this.state = state;
  52 + }
  53 +
  54 + public int getSendCount() {
  55 + return sendCount;
  56 + }
  57 +
  58 + public void setSendCount(int sendCount) {
  59 + this.sendCount = sendCount;
  60 + }
  61 +
  62 + public long getSt() {
  63 + return st;
  64 + }
  65 +
  66 + public void setSt(long st) {
  67 + this.st = st;
  68 + }
  69 +
  70 + public String getSender() {
  71 + return sender;
  72 + }
  73 +
  74 + public void setSender(String sender) {
  75 + this.sender = sender;
  76 + }
  77 +
  78 + public void countPlus(){
  79 + sendCount ++;
  80 + }
  81 +
  82 + public int getUpDown() {
  83 + return upDown;
  84 + }
  85 +
  86 + public void setUpDown(int upDown) {
  87 + this.upDown = upDown;
  88 + }
  89 +
  90 + public String getNbbm() {
  91 + return nbbm;
  92 + }
  93 +
  94 + public void setNbbm(String nbbm) {
  95 + this.nbbm = nbbm;
  96 + }
  97 +}
src/main/java/com/bsth/data/gpsdata_v2/thread/GpsDataLoaderThread.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.thread;
  2 +
  3 +import com.bsth.data.gpsdata_v2.DataHandleProcess;
  4 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  5 +import com.bsth.data.gpsdata_v2.load.GatewayHttpLoader;
  6 +import com.bsth.data.gpsdata_v2.load.SocketClientLoader;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * Created by panzhao on 2017/1/11.
  16 + */
  17 +@Component
  18 +public class GpsDataLoaderThread extends Thread {
  19 +
  20 + Logger logger = LoggerFactory.getLogger(this.getClass());
  21 +
  22 + //0:从GPS客户端内存获取 -1:从网关获取
  23 + private static int flag = 0;
  24 +
  25 + public static void setFlag(int v) {
  26 + flag = v;
  27 + }
  28 +
  29 + @Autowired
  30 + DataHandleProcess handleProcess;
  31 +
  32 + @Override
  33 + public void run() {
  34 + try {
  35 + List<GpsEntity> list;
  36 + if (flag == 0)
  37 + list = SocketClientLoader.load();
  38 + else
  39 + list = GatewayHttpLoader.load();
  40 +
  41 + if(null != list && list.size() > 0)
  42 + handleProcess.handle(list);
  43 + } catch (Exception e) {
  44 + logger.error("", e);
  45 + }
  46 + }
  47 +}
0 \ No newline at end of file 48 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/arrival/utils/CircleQueue.java renamed to src/main/java/com/bsth/data/gpsdata_v2/utils/CircleQueue.java
1 -package com.bsth.data.gpsdata.arrival.utils;  
2 -  
3 -import java.util.Arrays;  
4 -  
5 -/**  
6 - * 循环队列  
7 - * Created by panzhao on 2016/12/23.  
8 - */  
9 -public class CircleQueue<T> {  
10 -  
11 - /**  
12 - * (循环队列)数组的容量  
13 - */  
14 - public int capacity;  
15 -  
16 - /**  
17 - * 数组:保存循环队列的元素  
18 - */  
19 - public Object[] elementData;  
20 -  
21 - /**  
22 - * 头  
23 - */  
24 - public int head = 0;  
25 -  
26 - /**  
27 - * 尾  
28 - */  
29 - public int tail = 0;  
30 -  
31 - /**  
32 - * 以指定长度的数组来创建循环队列  
33 - *  
34 - * @param initSize  
35 - */  
36 - public CircleQueue(final int initSize) {  
37 - capacity = initSize;  
38 - elementData = new Object[capacity];  
39 - }  
40 -  
41 - /**  
42 - * 获取循环队列的大小  
43 - */  
44 - public int size() {  
45 - if (isEmpty()) {  
46 - return 0;  
47 - } else if (isFull()) {  
48 - return capacity;  
49 - } else {  
50 - return tail + 1;  
51 - }  
52 - }  
53 -  
54 - /**  
55 - * 插入队尾一个元素  
56 - */  
57 - public void add(final T element) {  
58 - if (isEmpty()) {  
59 - elementData[0] = element;  
60 - } else if (isFull()) {  
61 - elementData[head] = element;  
62 - head++;  
63 - tail++;  
64 - head = head == capacity ? 0 : head;  
65 - tail = tail == capacity ? 0 : tail;  
66 - } else {  
67 - elementData[tail + 1] = element;  
68 - tail++;  
69 - }  
70 - }  
71 -  
72 - public boolean isEmpty() {  
73 - return tail == head && tail == 0 && elementData[tail] == null;  
74 - }  
75 -  
76 - public boolean isFull() {  
77 - return head != 0 && head - tail == 1 || head == 0 && tail == capacity - 1;  
78 - }  
79 -  
80 - public void clear() {  
81 - Arrays.fill(elementData, null);  
82 - head = 0;  
83 - tail = 0;  
84 - }  
85 -  
86 - /**  
87 - * @return 取 循环队列里的值(先进的index=0)  
88 - */  
89 - public Object[] getQueue() {  
90 - final Object[] elementDataSort;  
91 - final Object[] elementDataCopy = elementData.clone();  
92 - if (isEmpty()) {  
93 - elementDataSort = new Object[0];  
94 - } else if (isFull()) {  
95 - elementDataSort = new Object[capacity];  
96 - int indexMax = capacity;  
97 - int indexSort = 0;  
98 - for (int i = head; i < indexMax;) {  
99 - elementDataSort[indexSort] = elementDataCopy[i];  
100 - indexSort++;  
101 - i++;  
102 - if (i == capacity) {  
103 - i = 0;  
104 - indexMax = head;  
105 - }  
106 - }  
107 - } else {  
108 - elementDataSort = new Object[tail + 1];  
109 - for (int i = 0; i <= tail; i++) {  
110 - elementDataSort[i] = elementDataCopy[i];  
111 - }  
112 - }  
113 - return elementDataSort;  
114 - }  
115 -  
116 - /**  
117 - * 取最后一个值  
118 - * @return  
119 - */  
120 - public T getTail(){  
121 - return elementData[tail] == null?null:(T)elementData[tail];  
122 - } 1 +package com.bsth.data.gpsdata_v2.utils;
  2 +
  3 +import java.util.Arrays;
  4 +
  5 +/**
  6 + * 循环队列
  7 + * Created by panzhao on 2016/12/23.
  8 + */
  9 +public class CircleQueue<T> {
  10 +
  11 + /**
  12 + * (循环队列)数组的容量
  13 + */
  14 + public int capacity;
  15 +
  16 + /**
  17 + * 数组:保存循环队列的元素
  18 + */
  19 + public Object[] elementData;
  20 +
  21 + /**
  22 + * 头
  23 + */
  24 + public int head = 0;
  25 +
  26 + /**
  27 + * 尾
  28 + */
  29 + public int tail = 0;
  30 +
  31 + /**
  32 + * 以指定长度的数组来创建循环队列
  33 + *
  34 + * @param initSize
  35 + */
  36 + public CircleQueue(final int initSize) {
  37 + capacity = initSize;
  38 + elementData = new Object[capacity];
  39 + }
  40 +
  41 + /**
  42 + * 获取循环队列的大小
  43 + */
  44 + public int size() {
  45 + if (isEmpty()) {
  46 + return 0;
  47 + } else if (isFull()) {
  48 + return capacity;
  49 + } else {
  50 + return tail + 1;
  51 + }
  52 + }
  53 +
  54 + /**
  55 + * 插入队尾一个元素
  56 + */
  57 + public void add(final T element) {
  58 + if (isEmpty()) {
  59 + elementData[0] = element;
  60 + } else if (isFull()) {
  61 + elementData[head] = element;
  62 + head++;
  63 + tail++;
  64 + head = head == capacity ? 0 : head;
  65 + tail = tail == capacity ? 0 : tail;
  66 + } else {
  67 + elementData[tail + 1] = element;
  68 + tail++;
  69 + }
  70 + }
  71 +
  72 + public boolean isEmpty() {
  73 + return tail == head && tail == 0 && elementData[tail] == null;
  74 + }
  75 +
  76 + public boolean isFull() {
  77 + return head != 0 && head - tail == 1 || head == 0 && tail == capacity - 1;
  78 + }
  79 +
  80 + public void clear() {
  81 + Arrays.fill(elementData, null);
  82 + head = 0;
  83 + tail = 0;
  84 + }
  85 +
  86 + /**
  87 + * @return 取 循环队列里的值(先进的index=0)
  88 + */
  89 + public Object[] getQueue() {
  90 + final Object[] elementDataSort;
  91 + final Object[] elementDataCopy = elementData.clone();
  92 + if (isEmpty()) {
  93 + elementDataSort = new Object[0];
  94 + } else if (isFull()) {
  95 + elementDataSort = new Object[capacity];
  96 + int indexMax = capacity;
  97 + int indexSort = 0;
  98 + for (int i = head; i < indexMax;) {
  99 + elementDataSort[indexSort] = elementDataCopy[i];
  100 + indexSort++;
  101 + i++;
  102 + if (i == capacity) {
  103 + i = 0;
  104 + indexMax = head;
  105 + }
  106 + }
  107 + } else {
  108 + elementDataSort = new Object[tail + 1];
  109 + for (int i = 0; i <= tail; i++) {
  110 + elementDataSort[i] = elementDataCopy[i];
  111 + }
  112 + }
  113 + return elementDataSort;
  114 + }
  115 +
  116 + /**
  117 + * 取最后一个值
  118 + * @return
  119 + */
  120 + public T getTail(){
  121 + return elementData[tail] == null?null:(T)elementData[tail];
  122 + }
123 } 123 }
124 \ No newline at end of file 124 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/arrival/utils/GeoUtils.java renamed to src/main/java/com/bsth/data/gpsdata_v2/utils/GeoUtils.java
1 -package com.bsth.data.gpsdata.arrival.utils;  
2 -  
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 -import com.bsth.data.gpsdata.arrival.GeoCacheData;  
5 -import com.bsth.data.gpsdata.arrival.entity.StationRoute;  
6 -import com.bsth.data.gpsdata.arrival.precondition.entity.PreconditionGeo;  
7 -import com.vividsolutions.jts.geom.Coordinate;  
8 -import com.vividsolutions.jts.geom.GeometryFactory;  
9 -import com.vividsolutions.jts.geom.LineString;  
10 -import com.vividsolutions.jts.geom.Point;  
11 -  
12 -import java.util.List;  
13 -import java.util.Map;  
14 -import java.util.Set;  
15 -  
16 -/**  
17 - * Created by panzhao on 2016/12/23.  
18 - */  
19 -public class GeoUtils {  
20 -  
21 - private final static double EARTHRADIUS = 6378137;  
22 -  
23 - private static GeometryFactory geometryFactory = new GeometryFactory();  
24 - /**  
25 - * gps是否在路由上的某个站内  
26 - *  
27 - * @param gps  
28 - * @param srs  
29 - * @return  
30 - */  
31 - public static StationRoute gpsInStation(GpsEntity gps, List<StationRoute> srs) {  
32 - Point point = geometryFactory.createPoint(new Coordinate(gps.getLat(), gps.getLon()));  
33 - double min = -1, distance;  
34 - StationRoute stationRoute = null;  
35 -  
36 - for (StationRoute sr : srs) {  
37 - if (sr.getPolygon() == null) {  
38 - //圆形  
39 - distance = getDistance(sr.getPoint(), point);//sr.getPoint().distance(point);  
40 -  
41 - if (distance > sr.getRadius())  
42 - continue;  
43 -  
44 - if (min > distance || min == -1) {  
45 - min = distance;  
46 - stationRoute = sr;  
47 - }  
48 - } else {  
49 - //多边形  
50 - /*if (sr.getPolygon().contains(point)) {  
51 - stationRoute = sr;  
52 - break;  
53 - }*/  
54 - com.bsth.util.Geo.Polygon polygon2 = GeoCacheData.convertPolygon(sr.getPolygon());  
55 - com.bsth.util.Geo.Point point2 = new com.bsth.util.Geo.Point(gps.getLon(), gps.getLat());  
56 - if(com.bsth.util.Geo.GeoUtils.isPointInPolygon(point2, polygon2)){  
57 - stationRoute = sr;  
58 - break;  
59 - }  
60 - }  
61 - }  
62 - return stationRoute;  
63 - }  
64 -  
65 - public static double getDistance(Point p1, Point p2) {  
66 - double lng1 = getLoop(p1.getY(), -180, 180), lat1 = getRange(  
67 - p1.getX(), -74, 74);  
68 - double lng2 = getLoop(p2.getY(), -180, 180), lat2 = getRange(  
69 - p2.getX(), -74, 74);  
70 -  
71 - double x1, x2, y1, y2;  
72 - x1 = degreeToRad(lng1);  
73 - y1 = degreeToRad(lat1);  
74 - x2 = degreeToRad(lng2);  
75 - y2 = degreeToRad(lat2);  
76 - return EARTHRADIUS  
77 - * Math.acos((Math.sin(y1) * Math.sin(y2) + Math.cos(y1)  
78 - * Math.cos(y2) * Math.cos(x2 - x1)));  
79 - }  
80 -  
81 - private static double getLoop(double v, double a, double b) {  
82 - while (v > b) {  
83 - v -= b - a;  
84 - }  
85 - while (v < a) {  
86 - v += b - a;  
87 - }  
88 - return v;  
89 - }  
90 -  
91 - private static double getRange(double v, double a, double b) {  
92 - v = Math.min(Math.max(v, a), b);  
93 - return v;  
94 - }  
95 -  
96 - private static double degreeToRad(double degree) {  
97 - return Math.PI * degree / 180;  
98 - }  
99 -  
100 - /**  
101 - * 计算点 到 线的距离  
102 - * @param line  
103 - * @param p  
104 - * @return  
105 - */  
106 - public static double getDistanceFromLine(LineString line, Point p){  
107 - Point s = line.getStartPoint();  
108 - Point e = line.getEndPoint();  
109 - return getDistanceFromLine(s, e, p);  
110 - }  
111 -  
112 - public static double getDistanceFromLine(Point s, Point e, Point p){  
113 - double d1 = getDistance(s, p);  
114 - double d2 = getDistance(p, e);  
115 - double d3 = getDistance(s, e);  
116 - double distance = 0;  
117 -  
118 - double alpha = Math.acos((d1*d1 + d3*d3 - d2*d2)/(2*d1*d3));  
119 - double beta = Math.acos((d2*d2 + d3*d3 - d1*d1)/(2*d2*d3));  
120 -  
121 - if(alpha>Math.PI/2) {  
122 - distance = d1;  
123 - }  
124 - else if(beta > Math.PI/2) {  
125 - distance = d2;  
126 - }  
127 - else {  
128 - distance = Math.sin(alpha) * d1;  
129 - }  
130 - return distance;  
131 - }  
132 -  
133 -  
134 - /**  
135 - * gps 是否在某个停车场内  
136 - * @param gps  
137 - * @return  
138 - public static String gpsInCarpark(GpsEntity gps){  
139 - Point point = geometryFactory.createPoint(new Coordinate(gps.getLat(), gps.getLon()));  
140 -  
141 - Map<String, Polygon> carparkMap = GeoCacheData.tccMap;  
142 - Set<String> codes = carparkMap.keySet();  
143 - Polygon polygon;  
144 - for(String code : codes){  
145 - polygon = carparkMap.get(code);  
146 - if(point.within(polygon)){  
147 - return code;  
148 - }  
149 - }  
150 - return null;  
151 - }*/  
152 -  
153 - /**  
154 - * gps 是否在某个停车场内  
155 - * @param gps  
156 - * @return  
157 - */  
158 - public static String gpsInCarpark(GpsEntity gps){  
159 - com.bsth.util.Geo.Point point = new com.bsth.util.Geo.Point(gps.getLon(), gps.getLat());  
160 - Map<String, com.bsth.util.Geo.Polygon> carparkMap = GeoCacheData.tccMap2;  
161 - com.bsth.util.Geo.Polygon polygon;  
162 - Set<String> codes = carparkMap.keySet();  
163 - for(String code : codes){  
164 - polygon = carparkMap.get(code);  
165 - if(com.bsth.util.Geo.GeoUtils.isPointInPolygon(point, polygon)){  
166 - return code;  
167 - }  
168 - }  
169 - return null;  
170 - }  
171 -  
172 - /**  
173 - * 是否在进站前置围栏内  
174 - * @param gps  
175 - * @return  
176 - */  
177 - public static String gpsInPremiseGeo(GpsEntity gps) {  
178 - List<PreconditionGeo> list = GeoCacheData.premiseGeoMap.get(gps.getLineId()+"_"+gps.getUpDown());  
179 -  
180 - if(null == list || list.size()==0)  
181 - return null;  
182 -  
183 - com.bsth.util.Geo.Point point = new com.bsth.util.Geo.Point(gps.getLon(), gps.getLat());  
184 - com.bsth.util.Geo.Polygon polygon;  
185 - for(PreconditionGeo p : list){  
186 - polygon = p.getPolygon();  
187 - if(com.bsth.util.Geo.GeoUtils.isPointInPolygon(point, polygon)){  
188 - return p.getStationCode();  
189 - }  
190 - }  
191 - return null;  
192 - }  
193 -  
194 - /**  
195 - * 是否是有效的连续点  
196 - * @param prevGps  
197 - * @param gps  
198 - * @return  
199 - */  
200 - public static boolean overdue(GpsEntity prevGps, GpsEntity gps) {  
201 - return gps.getTimestamp() - prevGps.getTimestamp() < 120000;  
202 - }  
203 -  
204 - /**  
205 - * 计算2条直线的最短距离  
206 - * @param p1  
207 - * @param p2  
208 - * @param p3  
209 - * @param p4  
210 - * @return  
211 - */  
212 - public static double getDistanceLineToLine(Point p1, Point p2, Point p3, Point p4){  
213 - double distance;  
214 - double x1 = p1.getX(); //A点坐标(x1,y1,z1)  
215 - double y1 = p1.getY();  
216 - double z1 = 0;  
217 - double x2 = p2.getX(); //B点坐标(x2,y2,z2)  
218 - double y2 = p2.getY();  
219 - double z2 = 0;  
220 - double x3 = p3.getX(); //C点坐标(x3,y3,z3)  
221 - double y3 = p3.getY();  
222 - double z3 = 0;  
223 - double x4 = p4.getX(); //D点坐标(x4,y4,z4)  
224 - double y4 = p4.getY();  
225 - double z4 = 0;  
226 -  
227 - double a = (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1);  
228 - double b = -((x2-x1)*(x4-x3)+(y2-y1)*(y4-y3)+(z2-z1)*(z4-z3));  
229 - double c = -((x1-x2)*(x1-x3)+(y1-y2)*(y1-y3)+(z1-z2)*(z1-z3));  
230 -  
231 - double d = -((x2-x1)*(x4-x3)+(y2-y1)*(y4-y3)+(z2-z1)*(z4-z3));  
232 - double e = (x4-x3)*(x4-x3)+(y4-y3)*(y4-y3)+(z4-z3)*(z4-z3);  
233 - double f = -((x1-x3)*(x4-x3)+(y1-y3)*(y4-y3)+(z1-z3)*(z4-z3));  
234 -  
235 - //平行  
236 - if ((a*e-b*d)==0&&(b*d-a*e)==0)  
237 - {  
238 - double d1 = getDistance(p1, p3);  
239 - double d2 = getDistance(p1, p4);  
240 - distance = (d1<d2)?d1:d2;  
241 - return distance;  
242 - }  
243 -  
244 - double s = (b*f-e*c)/(a*e-b*d);  
245 - double t = (a*f-d*c)/(b*d-a*e);  
246 -  
247 - //说明P点落在线段AB上,Q点落在线段CD上  
248 - if(0<=s&&s<=1&&0<=t&&t<=1)  
249 - {  
250 - //2条线段的公垂线段PQ;  
251 - //P点坐标  
252 - double X = x1+s*(x2-x1);  
253 - double Y = y1+s*(y2-y1);  
254 - double Z = z1+s*(z2-z1);  
255 - //Q点坐标  
256 - double U = x3+t*(x4-x3);  
257 - double V = y3+t*(y4-y3);  
258 - double W = z3+t*(z4-z3);  
259 - Point p = geometryFactory.createPoint(new Coordinate(X, Y, Z));  
260 - Point q = geometryFactory.createPoint(new Coordinate(U, V, W));  
261 - distance = getDistance(p, q);  
262 - }  
263 - else  
264 - {  
265 - double d1 = getDistanceFromLine(p3,p4,p1);  
266 - double d2 = getDistanceFromLine(p3,p4,p2);  
267 - double d3 = getDistanceFromLine(p1,p2,p3);  
268 - double d4 = getDistanceFromLine(p1,p2,p4);  
269 - distance = (d1<d2)?d1:d2;  
270 - distance = (distance<d3)?distance:d3;  
271 - distance = (distance<d4)?distance:d4;  
272 - }  
273 -  
274 - return distance;  
275 - }  
276 -  
277 - /**  
278 - * 计算点 到 线的垂直交点  
279 - * @param lp1  
280 - * @param lp2  
281 - * @param p  
282 - * @return  
283 - */  
284 - public static Point perpendularPoint(Point lp1, Point lp2, Point p){  
285 - double a = lp1.getX() - lp2.getX(), b = lp2.getY() - lp1.getY(), c = lp1.getY() * lp2.getX() - lp2.getY() * lp1.getX();  
286 - double lon = (Math.pow(b, 2) * p.getY() - a * b * p.getX() - a * c) / (Math.pow(a, 2) + Math.pow(b, 2));  
287 - double lat = (Math.pow(a, 2) * p.getX() - a * b * p.getY() - b * c) / (Math.pow(a, 2) + Math.pow(b, 2));  
288 -  
289 - return geometryFactory.createPoint(new Coordinate(lat, lon));  
290 - }  
291 -} 1 +package com.bsth.data.gpsdata_v2.utils;
  2 +
  3 +import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
  4 +import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
  5 +import com.bsth.data.gpsdata_v2.entity.CtLineString;
  6 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  7 +import com.bsth.data.gpsdata_v2.entity.PreconditionGeo;
  8 +import com.bsth.data.gpsdata_v2.entity.StationRoute;
  9 +import com.bsth.util.Geo.Bounds;
  10 +import com.bsth.util.Geo.Point;
  11 +import com.bsth.util.Geo.Polygon;
  12 +
  13 +import java.util.*;
  14 +
  15 +/**
  16 + * Created by panzhao on 2016/12/23.
  17 + */
  18 +public class GeoUtils {
  19 +
  20 + private final static double EARTH_RADIUS = 6378137;
  21 +
  22 + private static StationRouteComp sComp = new StationRouteComp();
  23 + /**
  24 + * gps是否在路由上的某个站内
  25 + *
  26 + * @param gps
  27 + * @param srs
  28 + * @return
  29 + */
  30 + public static StationRoute gpsInStation(GpsEntity gps, List<StationRoute> srs) {
  31 + List<StationRoute> rs = new ArrayList<>();
  32 +
  33 + Point point = new Point(gps.getLon(), gps.getLat());
  34 + double distance;
  35 +
  36 + for (StationRoute sr : srs) {
  37 + if (sr.getPolygon() == null) {
  38 + //圆形
  39 + distance = getDistance(sr.getPoint(), point);
  40 +
  41 + if (distance > sr.getRadius())
  42 + continue;
  43 +
  44 + rs.add(sr);
  45 + } else if(isPointInPolygon(point, sr.getPolygon())){
  46 + rs.add(sr);
  47 + }
  48 + }
  49 +
  50 + if(rs.size() == 0)
  51 + return null;
  52 + else
  53 + return findNearStation(rs, gps);
  54 + }
  55 +
  56 + private static StationRoute findNearStation(List<StationRoute> rs, GpsEntity gps) {
  57 + if(rs.size() > 1){
  58 + //按路由顺序排序
  59 + Collections.sort(rs, sComp);
  60 +
  61 + //上一个进出的站点
  62 + StationRoute ps = GpsCacheData.prevStation(gps);
  63 + if(null != ps){
  64 + for(StationRoute s : rs){
  65 + if(s.getRouteSort() >= ps.getRouteSort())
  66 + return s;
  67 + }
  68 + }
  69 + }
  70 + return rs.get(0);
  71 + }
  72 +
  73 +
  74 + public static double getDistance(Point p1, Point p2) {
  75 + double lng1 = getLoop(p1.getLon(), -180, 180), lat1 = getRange(
  76 + p1.getLat(), -74, 74);
  77 + double lng2 = getLoop(p2.getLon(), -180, 180), lat2 = getRange(
  78 + p2.getLat(), -74, 74);
  79 +
  80 + double x1, x2, y1, y2;
  81 + x1 = degreeToRad(lng1);
  82 + y1 = degreeToRad(lat1);
  83 + x2 = degreeToRad(lng2);
  84 + y2 = degreeToRad(lat2);
  85 + return EARTH_RADIUS
  86 + * Math.acos((Math.sin(y1) * Math.sin(y2) + Math.cos(y1)
  87 + * Math.cos(y2) * Math.cos(x2 - x1)));
  88 + }
  89 +
  90 + private static double getLoop(double v, double a, double b) {
  91 + while (v > b) {
  92 + v -= b - a;
  93 + }
  94 + while (v < a) {
  95 + v += b - a;
  96 + }
  97 + return v;
  98 + }
  99 +
  100 + private static double getRange(double v, double a, double b) {
  101 + v = Math.min(Math.max(v, a), b);
  102 + return v;
  103 + }
  104 +
  105 + private static double degreeToRad(double degree) {
  106 + return Math.PI * degree / 180;
  107 + }
  108 +
  109 + public static double getDistanceFromLine(CtLineString lineString, Point p){
  110 + return getDistanceFromLine(lineString.getS(), lineString.getE(), p);
  111 + }
  112 +
  113 + /**
  114 + * 计算点 到 线的距离
  115 + * @param line
  116 + * @param p
  117 + * @return
  118 + */
  119 + public static double getDistanceFromLine(Point s, Point e, Point p){
  120 + double d1 = getDistance(s, p);
  121 + double d2 = getDistance(p, e);
  122 + double d3 = getDistance(s, e);
  123 + double distance = 0;
  124 +
  125 + double alpha = Math.acos((d1*d1 + d3*d3 - d2*d2)/(2*d1*d3));
  126 + double beta = Math.acos((d2*d2 + d3*d3 - d1*d1)/(2*d2*d3));
  127 +
  128 + if(alpha>Math.PI/2) {
  129 + distance = d1;
  130 + }
  131 + else if(beta > Math.PI/2) {
  132 + distance = d2;
  133 + }
  134 + else {
  135 + distance = Math.sin(alpha) * d1;
  136 + }
  137 + return distance;
  138 + }
  139 +
  140 + /**
  141 + * gps 是否在某个停车场内
  142 + * @param gps
  143 + * @return
  144 + */
  145 + public static String gpsInCarpark(GpsEntity gps){
  146 + Point point = new Point(gps.getLon(), gps.getLat());
  147 + Map<String, Polygon> carparkMap = GeoCacheData.tccMap;
  148 +
  149 + Set<String> codes = carparkMap.keySet();
  150 + for(String code : codes){
  151 + if(isPointInPolygon(point, carparkMap.get(code))){
  152 + return code;
  153 + }
  154 + }
  155 + return null;
  156 + }
  157 +
  158 + /**
  159 + * 是否在进站前置围栏内
  160 + * @param gps
  161 + * @return
  162 + */
  163 + public static String gpsInPremiseGeo(GpsEntity gps) {
  164 + List<PreconditionGeo> list = GeoCacheData.premiseGeoMap.get(gps.getLineId()+"_"+gps.getUpDown());
  165 +
  166 + if(null == list || list.size()==0)
  167 + return null;
  168 +
  169 + Point point = new Point(gps.getLon(), gps.getLat());
  170 + for(PreconditionGeo p : list){
  171 + if(isPointInPolygon(point, p.getPolygon())){
  172 + return p.getStationCode();
  173 + }
  174 + }
  175 + return null;
  176 + }
  177 +
  178 + /**
  179 + * 是否是有效的连续点
  180 + * @param prevGps
  181 + * @param gps
  182 + * @return
  183 + */
  184 + public static boolean overdue(GpsEntity prevGps, GpsEntity gps) {
  185 + return gps.getTimestamp() - prevGps.getTimestamp() < 120000;
  186 + }
  187 +
  188 + /**
  189 + * 计算2条直线的最短距离
  190 + * @param p1
  191 + * @param p2
  192 + * @param p3
  193 + * @param p4
  194 + * @return
  195 + */
  196 + public static double getDistanceLineToLine(Point p1, Point p2, Point p3, Point p4){
  197 + double distance;
  198 + double x1 = p1.getLat(); //A点坐标(x1,y1,z1)
  199 + double y1 = p1.getLon();
  200 + double z1 = 0;
  201 + double x2 = p2.getLat(); //B点坐标(x2,y2,z2)
  202 + double y2 = p2.getLon();
  203 + double z2 = 0;
  204 + double x3 = p3.getLat(); //C点坐标(x3,y3,z3)
  205 + double y3 = p3.getLon();
  206 + double z3 = 0;
  207 + double x4 = p4.getLat(); //D点坐标(x4,y4,z4)
  208 + double y4 = p4.getLon();
  209 + double z4 = 0;
  210 +
  211 + double a = (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1);
  212 + double b = -((x2-x1)*(x4-x3)+(y2-y1)*(y4-y3)+(z2-z1)*(z4-z3));
  213 + double c = -((x1-x2)*(x1-x3)+(y1-y2)*(y1-y3)+(z1-z2)*(z1-z3));
  214 +
  215 + double d = -((x2-x1)*(x4-x3)+(y2-y1)*(y4-y3)+(z2-z1)*(z4-z3));
  216 + double e = (x4-x3)*(x4-x3)+(y4-y3)*(y4-y3)+(z4-z3)*(z4-z3);
  217 + double f = -((x1-x3)*(x4-x3)+(y1-y3)*(y4-y3)+(z1-z3)*(z4-z3));
  218 +
  219 + //平行
  220 + if ((a*e-b*d)==0&&(b*d-a*e)==0)
  221 + {
  222 + double d1 = getDistance(p1, p3);
  223 + double d2 = getDistance(p1, p4);
  224 + distance = (d1<d2)?d1:d2;
  225 + return distance;
  226 + }
  227 +
  228 + double s = (b*f-e*c)/(a*e-b*d);
  229 + double t = (a*f-d*c)/(b*d-a*e);
  230 +
  231 + //说明P点落在线段AB上,Q点落在线段CD上
  232 + if(0<=s&&s<=1&&0<=t&&t<=1)
  233 + {
  234 + //2条线段的公垂线段PQ;
  235 + //P点坐标
  236 + double X = x1+s*(x2-x1);
  237 + double Y = y1+s*(y2-y1);
  238 + double Z = z1+s*(z2-z1);
  239 + //Q点坐标
  240 + double U = x3+t*(x4-x3);
  241 + double V = y3+t*(y4-y3);
  242 + double W = z3+t*(z4-z3);
  243 +
  244 + Point p = new Point(Y, X);
  245 + Point q = new Point(V, U);
  246 + distance = getDistance(p, q);
  247 + }
  248 + else
  249 + {
  250 + double d1 = getDistanceFromLine(p3,p4,p1);
  251 + double d2 = getDistanceFromLine(p3,p4,p2);
  252 + double d3 = getDistanceFromLine(p1,p2,p3);
  253 + double d4 = getDistanceFromLine(p1,p2,p4);
  254 + distance = (d1<d2)?d1:d2;
  255 + distance = (distance<d3)?distance:d3;
  256 + distance = (distance<d4)?distance:d4;
  257 + }
  258 +
  259 + return distance;
  260 + }
  261 +
  262 + /**
  263 + * 计算点 到 线的垂直交点
  264 + * @param lp1
  265 + * @param lp2
  266 + * @param p
  267 + * @return
  268 + */
  269 + public static Point perpendularPoint(Point lp1, Point lp2, Point p){
  270 + double a = lp1.getLat() - lp2.getLat(), b = lp2.getLon() - lp1.getLon(), c = lp1.getLon() * lp2.getLat() - lp2.getLon() * lp1.getLat();
  271 + double lon = (Math.pow(b, 2) * p.getLon() - a * b * p.getLat() - a * c) / (Math.pow(a, 2) + Math.pow(b, 2));
  272 + double lat = (Math.pow(a, 2) * p.getLat() - a * b * p.getLon() - b * c) / (Math.pow(a, 2) + Math.pow(b, 2));
  273 +
  274 + return new Point(lon, lat);
  275 + }
  276 +
  277 + public static boolean isPointInRect(Point point, Bounds bounds) {
  278 + Point sw = bounds.getSouthWest(); // 西南脚点
  279 + Point ne = bounds.getNorthEast(); // 东北脚点
  280 + return (point.getLon() >= sw.getLon() && point.getLon() <= ne.getLon()
  281 + && point.getLat() >= sw.getLat() && point.getLat() <= ne
  282 + .getLat());
  283 + }
  284 +
  285 + public static boolean isPointInPolygon(Point point, Polygon polygon) {
  286 + Bounds polygonBounds = polygon.getBounds();
  287 + if (!isPointInRect(point, polygonBounds)) {
  288 + return false;
  289 + }
  290 +
  291 + List<Point> pts = polygon.getPoints();// 获取多边形点
  292 +
  293 + // 下述代码来源:http://paulbourke.net/geometry/insidepoly/,进行了部分修改
  294 + // 基本思想是利用射线法,计算射线与多边形各边的交点,如果是偶数,则点在多边形外,否则
  295 + // 在多边形内。还会考虑一些特殊情况,如点在多边形顶点上,点在多边形边上等特殊情况。
  296 +
  297 + int N = pts.size();
  298 + boolean boundOrVertex = true; // 如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
  299 + int intersectCount = 0;// cross points count of x
  300 + double precision = 2e-10; // 浮点类型计算时候与0比较时候的容差
  301 + Point p1, p2;// neighbour bound vertices
  302 + Point p = point; // 测试点
  303 +
  304 + p1 = pts.get(0);// left vertex
  305 + for (int i = 1; i <= N; ++i) {// check all rays
  306 + if (p.equals(p1)) {
  307 + return boundOrVertex;// p is an vertex
  308 + }
  309 +
  310 + p2 = pts.get(i % N);// right vertex
  311 + if (p.getLat() < Math.min(p1.getLat(), p2.getLat())
  312 + || p.getLat() > Math.max(p1.getLat(), p2.getLat())) {// ray
  313 + // is
  314 + // outside
  315 + // of
  316 + // our
  317 + // interests
  318 + p1 = p2;
  319 + continue;// next ray left point
  320 + }
  321 +
  322 + if (p.getLat() > Math.min(p1.getLat(), p2.getLat())
  323 + && p.getLat() < Math.max(p1.getLat(), p2.getLat())) {// ray
  324 + // is
  325 + // crossing
  326 + // over
  327 + // by
  328 + // the
  329 + // algorithm
  330 + // (common
  331 + // part
  332 + // of)
  333 + if (p.getLon() <= Math.max(p1.getLon(), p2.getLon())) {// x is
  334 + // before
  335 + // of
  336 + // ray
  337 + if (p1.getLat() == p2.getLat()
  338 + && p.getLon() >= Math.min(p1.getLon(), p2.getLon())) {// overlies
  339 + // on
  340 + // a
  341 + // horizontal
  342 + // ray
  343 + return boundOrVertex;
  344 + }
  345 +
  346 + if (p1.getLon() == p2.getLon()) {// ray is vertical
  347 + if (p1.getLon() == p.getLon()) {// overlies on a
  348 + // vertical ray
  349 + return boundOrVertex;
  350 + } else {// before ray
  351 + ++intersectCount;
  352 + }
  353 + } else {// cross point on the left side
  354 + double xinters = (p.getLat() - p1.getLat())
  355 + * (p2.getLon() - p1.getLon())
  356 + / (p2.getLat() - p1.getLat()) + p1.getLon();// cross
  357 + // point
  358 + // of
  359 + // lng
  360 + if (Math.abs(p.getLon() - xinters) < precision) {// overlies
  361 + // on
  362 + // a
  363 + // ray
  364 + return boundOrVertex;
  365 + }
  366 +
  367 + if (p.getLon() < xinters) {// before ray
  368 + ++intersectCount;
  369 + }
  370 + }
  371 + }
  372 + } else {// special case when ray is crossing through the vertex
  373 + if (p.getLat() == p2.getLat() && p.getLon() <= p2.getLon()) {// p
  374 + // crossing
  375 + // over
  376 + // p2
  377 + Point p3 = pts.get((i + 1) % N); // next vertex
  378 + if (p.getLat() >= Math.min(p1.getLat(), p3.getLat())
  379 + && p.getLat() <= Math.max(p1.getLat(), p3.getLat())) {// p.lat
  380 + // lies
  381 + // between
  382 + // p1.lat
  383 + // &
  384 + // p3.lat
  385 + ++intersectCount;
  386 + } else {
  387 + intersectCount += 2;
  388 + }
  389 + }
  390 + }
  391 + p1 = p2;// next ray left point
  392 + }
  393 +
  394 + if (intersectCount % 2 == 0) {// 偶数在多边形外
  395 + return false;
  396 + } else { // 奇数在多边形内
  397 + return true;
  398 + }
  399 + }
  400 +
  401 +}
src/main/java/com/bsth/data/gpsdata/recovery/GpsDataRecovery.java renamed to src/main/java/com/bsth/data/gpsdata_v2/utils/GpsDataRecovery.java
1 -package com.bsth.data.gpsdata.recovery;  
2 -  
3 -import com.bsth.data.BasicData;  
4 -import com.bsth.data.gpsdata.GpsEntity;  
5 -import com.bsth.data.gpsdata.arrival.GeoCacheData;  
6 -import com.bsth.data.gpsdata.arrival.handlers.*;  
7 -import com.bsth.data.gpsdata.arrival.utils.CircleQueue;  
8 -import com.bsth.util.db.DBUtils_MS;  
9 -import com.google.common.collect.ArrayListMultimap;  
10 -import org.slf4j.Logger;  
11 -import org.slf4j.LoggerFactory;  
12 -import org.springframework.beans.BeansException;  
13 -import org.springframework.context.ApplicationContext;  
14 -import org.springframework.context.ApplicationContextAware;  
15 -import org.springframework.jdbc.core.JdbcTemplate;  
16 -import org.springframework.jdbc.core.RowMapper;  
17 -import org.springframework.stereotype.Component;  
18 -  
19 -import java.sql.ResultSet;  
20 -import java.sql.SQLException;  
21 -import java.util.*;  
22 -import java.util.concurrent.CountDownLatch;  
23 -import java.util.concurrent.ExecutorService;  
24 -import java.util.concurrent.Executors;  
25 -  
26 -/**  
27 - * gps数据恢复  
28 - * Created by panzhao on 2016/12/24.  
29 - */  
30 -@Component  
31 -public class GpsDataRecovery implements ApplicationContextAware {  
32 -  
33 - static Logger logger = LoggerFactory.getLogger(GpsDataRecovery.class);  
34 -  
35 - public static boolean run;  
36 -  
37 - static ExecutorService threadPool = Executors.newFixedThreadPool(10);  
38 -  
39 - static OfflineSignalHandle offlineSignalHandle;  
40 - static CorrectSignalHandle correctSignalHandle;  
41 - static StationInsideHandle stationInsideHandle;  
42 - static InOutStationSignalHandle inOutStationSignalHandle;  
43 - static ReverseSignalHandle reverseSignalHandle;  
44 -  
45 - public void recovery() {  
46 - List<GpsEntity> list = loadData();  
47 -  
48 - //按线路分组数据  
49 - ArrayListMultimap<String, GpsEntity> listMap = ArrayListMultimap.create();  
50 - for (GpsEntity gps : list) {  
51 - if (gps.getNbbm() != null)  
52 - listMap.put(gps.getNbbm(), gps);  
53 - }  
54 -  
55 -  
56 - Set<String> keys = listMap.keySet();  
57 -  
58 - CountDownLatch count = new CountDownLatch(keys.size());  
59 - GpsComp comp = new GpsComp();  
60 - for (String nbbm : keys) {  
61 - Collections.sort(listMap.get(nbbm), comp);  
62 - threadPool.execute(new RecoveryThread(listMap.get(nbbm), count));  
63 - /*if(nbbm.equals("W2H-015"))  
64 - new RecoveryThread(listMap.get(nbbm), count).run();*/  
65 - /*if(lineId.equals("60028"))  
66 - new RecoveryThread(listMap.get(lineId), count).run();*/  
67 - }  
68 -  
69 - try {  
70 - count.await();  
71 - run = false;  
72 - logger.info("数据恢复完成....");  
73 - } catch (InterruptedException e) {  
74 - logger.error("", e);  
75 - }  
76 - }  
77 -  
78 - /**  
79 - * 加载当天的gps数据  
80 - *  
81 - * @return  
82 - */  
83 - public List<GpsEntity> loadData() {  
84 - Calendar calendar = Calendar.getInstance();  
85 - int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);  
86 -  
87 - String sql = "select DEVICE_ID,LAT,LON,TS,SPEED_GPS,LINE_ID,SERVICE_STATE from bsth_c_gps_info where days_year=285";// + dayOfYear;  
88 - JdbcTemplate jdbcTemplate = new JdbcTemplate(DBUtils_MS.getDataSource());  
89 -  
90 - List<GpsEntity> list =  
91 - jdbcTemplate.query(sql, new RowMapper<GpsEntity>() {  
92 - @Override  
93 - public GpsEntity mapRow(ResultSet rs, int rowNum) throws SQLException {  
94 - GpsEntity gps = new GpsEntity();  
95 -  
96 - gps.setDeviceId(rs.getString("DEVICE_ID"));  
97 - gps.setNbbm(BasicData.deviceId2NbbmMap.get(gps.getDeviceId()));  
98 - gps.setSpeed(rs.getFloat("SPEED_GPS"));  
99 - gps.setLat(rs.getFloat("LAT"));  
100 - gps.setLon(rs.getFloat("LON"));  
101 - gps.setLineId(rs.getString("LINE_ID"));  
102 - gps.setTimestamp(rs.getLong("TS"));  
103 - gps.setUpDown((byte) getUpOrDown(rs.getLong("SERVICE_STATE")));  
104 - return gps;  
105 - }  
106 - });  
107 - return list;  
108 - }  
109 -  
110 - /**  
111 - * 王通 2016/6/29 9:23:24 获取车辆线路上下行  
112 - *  
113 - * @return -1无效 0上行 1下行  
114 - */  
115 - public static int getUpOrDown(long serviceState) {  
116 - if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000  
117 - || (serviceState & 0x01000000) == 0x01000000 || (serviceState & 0x08000000) == 0x08000000)  
118 - return -1;  
119 - return (((serviceState & 0x10000000) == 0x10000000) ? 1 : 0);  
120 - }  
121 -  
122 - @Override  
123 - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  
124 - offlineSignalHandle = applicationContext.getBean(OfflineSignalHandle.class);  
125 - correctSignalHandle = applicationContext.getBean(CorrectSignalHandle.class);  
126 - stationInsideHandle = applicationContext.getBean(StationInsideHandle.class);  
127 - inOutStationSignalHandle = applicationContext.getBean(InOutStationSignalHandle.class);  
128 - reverseSignalHandle = applicationContext.getBean(ReverseSignalHandle.class);  
129 - }  
130 -  
131 - public static class GpsComp implements Comparator<GpsEntity> {  
132 -  
133 - @Override  
134 - public int compare(GpsEntity g1, GpsEntity g2) {  
135 - return g1.getTimestamp().compareTo(g2.getTimestamp());  
136 - }  
137 - }  
138 -  
139 - public static class RecoveryThread implements Runnable {  
140 - List<GpsEntity> list;  
141 - CountDownLatch count;  
142 -  
143 - RecoveryThread(List<GpsEntity> list, CountDownLatch count) {  
144 - this.list = list;  
145 - this.count = count;  
146 - }  
147 -  
148 - @Override  
149 - public void run() {  
150 - try {  
151 - //循环gps恢复数据  
152 - CircleQueue<GpsEntity> prevs;  
153 - boolean task;  
154 - for (GpsEntity gps : list) {  
155 - try {  
156 - /*if(gps.getTimestamp() >= 1506216540000L){  
157 - System.out.println("debugger...");  
158 - }*/  
159 - //是否有任务  
160 -  
161 - prevs = GeoCacheData.getGps(gps.getNbbm());  
162 - //掉线处理  
163 - offlineSignalHandle.handle(gps, prevs);  
164 - //状态处理  
165 - task = correctSignalHandle.handle(gps, prevs);  
166 - //场,站内外判断  
167 - stationInsideHandle.handle(gps, prevs);  
168 - //异常判定(越界/超速)  
169 - //abnormalStateHandle.handle(gps, prevs);  
170 -  
171 - if (!task)  
172 - continue; //无任务的,到这里就结束  
173 -  
174 - //反向处理  
175 - reverseSignalHandle.handle(gps, prevs);  
176 - //进出站动作处理  
177 - inOutStationSignalHandle.handle(gps, prevs);  
178 - GeoCacheData.putGps(gps);  
179 - } catch (Exception e) {  
180 - logger.error("", e);  
181 - }  
182 - }  
183 - } finally {  
184 - count.countDown();  
185 - }  
186 - }  
187 - } 1 +package com.bsth.data.gpsdata_v2.utils;
  2 +
  3 +import com.bsth.data.BasicData;
  4 +import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
  5 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  6 +import com.bsth.data.gpsdata_v2.handlers.*;
  7 +import com.bsth.util.db.DBUtils_MS;
  8 +import com.google.common.collect.ArrayListMultimap;
  9 +import org.slf4j.Logger;
  10 +import org.slf4j.LoggerFactory;
  11 +import org.springframework.beans.BeansException;
  12 +import org.springframework.context.ApplicationContext;
  13 +import org.springframework.context.ApplicationContextAware;
  14 +import org.springframework.jdbc.core.JdbcTemplate;
  15 +import org.springframework.jdbc.core.RowMapper;
  16 +import org.springframework.stereotype.Component;
  17 +
  18 +import java.sql.ResultSet;
  19 +import java.sql.SQLException;
  20 +import java.util.*;
  21 +import java.util.concurrent.CountDownLatch;
  22 +import java.util.concurrent.ExecutorService;
  23 +import java.util.concurrent.Executors;
  24 +
  25 +/**
  26 + * gps数据恢复
  27 + * Created by panzhao on 2016/12/24.
  28 + */
  29 +@Component
  30 +public class GpsDataRecovery implements ApplicationContextAware {
  31 +
  32 + static Logger logger = LoggerFactory.getLogger(GpsDataRecovery.class);
  33 +
  34 + public static boolean run;
  35 +
  36 + static ExecutorService threadPool = Executors.newFixedThreadPool(10);
  37 +
  38 + static GpsStateProcess gpsStateProcess;
  39 + static StationInsideProcess stationInsideProcess;
  40 + static InStationProcess inStationProcess;
  41 + static OutStationProcess outStationProcess;
  42 + static AbnormalStateProcess abnormalStateProcess;
  43 +
  44 + public void recovery() {
  45 + List<GpsEntity> list = loadData();
  46 +
  47 + //按线路分组数据
  48 + ArrayListMultimap<String, GpsEntity> listMap = ArrayListMultimap.create();
  49 + for (GpsEntity gps : list) {
  50 + if (gps.getNbbm() != null)
  51 + listMap.put(gps.getNbbm(), gps);
  52 + }
  53 +
  54 +
  55 + Set<String> keys = listMap.keySet();
  56 +
  57 + CountDownLatch count = new CountDownLatch(keys.size());
  58 + GpsComp comp = new GpsComp();
  59 + for (String nbbm : keys) {
  60 + Collections.sort(listMap.get(nbbm), comp);
  61 + threadPool.submit(new RecoveryThread(listMap.get(nbbm), count));
  62 + /*if(nbbm.equals("W2H-015"))
  63 + new RecoveryThread(listMap.get(nbbm), count).run();*/
  64 + /*if(lineId.equals("60028"))
  65 + new RecoveryThread(listMap.get(lineId), count).run();*/
  66 + }
  67 +
  68 + try {
  69 + count.await();
  70 + run = false;
  71 + logger.info("数据恢复完成....");
  72 + } catch (InterruptedException e) {
  73 + logger.error("", e);
  74 + }
  75 + }
  76 +
  77 + /**
  78 + * 加载当天的gps数据
  79 + *
  80 + * @return
  81 + */
  82 + public List<GpsEntity> loadData() {
  83 + Calendar calendar = Calendar.getInstance();
  84 + int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
  85 +
  86 + String sql = "select DEVICE_ID,LAT,LON,TS,SPEED_GPS,LINE_ID,SERVICE_STATE from bsth_c_gps_info where days_year=" + dayOfYear;
  87 + JdbcTemplate jdbcTemplate = new JdbcTemplate(DBUtils_MS.getDataSource());
  88 +
  89 + List<GpsEntity> list =
  90 + jdbcTemplate.query(sql, new RowMapper<GpsEntity>() {
  91 + @Override
  92 + public GpsEntity mapRow(ResultSet rs, int rowNum) throws SQLException {
  93 + GpsEntity gps = new GpsEntity();
  94 +
  95 + gps.setDeviceId(rs.getString("DEVICE_ID"));
  96 + gps.setNbbm(BasicData.deviceId2NbbmMap.get(gps.getDeviceId()));
  97 + gps.setSpeed(rs.getFloat("SPEED_GPS"));
  98 + gps.setLat(rs.getFloat("LAT"));
  99 + gps.setLon(rs.getFloat("LON"));
  100 + gps.setLineId(rs.getString("LINE_ID"));
  101 + gps.setTimestamp(rs.getLong("TS"));
  102 + gps.setUpDown((byte) getUpOrDown(rs.getLong("SERVICE_STATE")));
  103 + return gps;
  104 + }
  105 + });
  106 + return list;
  107 + }
  108 +
  109 + /**
  110 + * 王通 2016/6/29 9:23:24 获取车辆线路上下行
  111 + *
  112 + * @return -1无效 0上行 1下行
  113 + */
  114 + public static int getUpOrDown(long serviceState) {
  115 + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000
  116 + || (serviceState & 0x01000000) == 0x01000000 || (serviceState & 0x08000000) == 0x08000000)
  117 + return -1;
  118 + return (((serviceState & 0x10000000) == 0x10000000) ? 1 : 0);
  119 + }
  120 +
  121 + @Override
  122 + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  123 + gpsStateProcess = applicationContext.getBean(GpsStateProcess.class);
  124 + stationInsideProcess = applicationContext.getBean(StationInsideProcess.class);
  125 + inStationProcess = applicationContext.getBean(InStationProcess.class);
  126 + outStationProcess = applicationContext.getBean(OutStationProcess.class);
  127 + abnormalStateProcess = applicationContext.getBean(AbnormalStateProcess.class);
  128 + }
  129 +
  130 + public static class GpsComp implements Comparator<GpsEntity> {
  131 +
  132 + @Override
  133 + public int compare(GpsEntity g1, GpsEntity g2) {
  134 + return g1.getTimestamp().compareTo(g2.getTimestamp());
  135 + }
  136 + }
  137 +
  138 + public static class RecoveryThread implements Runnable {
  139 + List<GpsEntity> list;
  140 + CountDownLatch count;
  141 +
  142 + RecoveryThread(List<GpsEntity> list, CountDownLatch count) {
  143 + this.list = list;
  144 + this.count = count;
  145 + }
  146 +
  147 + @Override
  148 + public void run() {
  149 + try {
  150 + //循环gps恢复数据
  151 + for (GpsEntity gps : list) {
  152 + try {
  153 +
  154 + gpsStateProcess.process(gps);//状态处理
  155 + stationInsideProcess.process(gps);//场站内外判定
  156 +
  157 +
  158 + abnormalStateProcess.process(gps);//超速越界
  159 +
  160 + inStationProcess.process(gps);//进站
  161 + outStationProcess.process(gps);//出站
  162 +
  163 + GpsCacheData.putGps(gps);//历史gps缓存
  164 + } catch (Exception e) {
  165 + logger.error("", e);
  166 + }
  167 + }
  168 + } finally {
  169 + count.countDown();
  170 + }
  171 + }
  172 + }
188 } 173 }
189 \ No newline at end of file 174 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata_v2/utils/GpsDataUtils.java 0 → 100644
  1 +package com.bsth.data.gpsdata_v2.utils;
  2 +
  3 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  4 +import org.slf4j.Logger;
  5 +import org.slf4j.LoggerFactory;
  6 +
  7 +import java.util.ArrayList;
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * Created by panzhao on 2017/11/15.
  12 + */
  13 +public class GpsDataUtils {
  14 +
  15 + static Logger logger = LoggerFactory.getLogger(GpsDataUtils.class);
  16 +
  17 + /**
  18 + * 过滤无效的gps点位
  19 + *
  20 + * @param list
  21 + * @return
  22 + */
  23 + public static List<GpsEntity> clearInvalid(List<GpsEntity> list) {
  24 + List<GpsEntity> rs = new ArrayList<>();
  25 +
  26 + try {
  27 + for (GpsEntity gps : list) {
  28 + if (gps.getValid() == 0)
  29 + rs.add(gps);
  30 + }
  31 +
  32 + if (rs.size() < list.size())
  33 + logger.info("过滤无效的点位 : " + (list.size() - rs.size()));
  34 + } catch (Exception e) {
  35 + logger.error("", e);
  36 + rs = list;
  37 + }
  38 + return rs;
  39 + }
  40 +}
src/main/java/com/bsth/data/gpsdata/arrival/utils/StationRouteComp.java renamed to src/main/java/com/bsth/data/gpsdata_v2/utils/StationRouteComp.java
1 -package com.bsth.data.gpsdata.arrival.utils;  
2 -  
3 -import com.bsth.data.gpsdata.arrival.entity.StationRoute;  
4 -  
5 -import java.util.Comparator;  
6 -  
7 -/**  
8 - * Created by panzhao on 2016/12/24.  
9 - */  
10 -public class StationRouteComp implements Comparator<StationRoute>{  
11 - @Override  
12 - public int compare(StationRoute s1, StationRoute s2) {  
13 - return s1.getRouteSort() - s2.getRouteSort();  
14 - }  
15 -} 1 +package com.bsth.data.gpsdata_v2.utils;
  2 +
  3 +
  4 +import com.bsth.data.gpsdata_v2.entity.StationRoute;
  5 +
  6 +import java.util.Comparator;
  7 +
  8 +/**
  9 + * Created by panzhao on 2016/12/24.
  10 + */
  11 +public class StationRouteComp implements Comparator<StationRoute>{
  12 + @Override
  13 + public int compare(StationRoute s1, StationRoute s2) {
  14 + return s1.getRouteSort() - s2.getRouteSort();
  15 + }
  16 +}
src/main/java/com/bsth/data/msg_queue/DirectivePushQueue.java
@@ -29,6 +29,8 @@ public class DirectivePushQueue implements ApplicationContextAware { @@ -29,6 +29,8 @@ public class DirectivePushQueue implements ApplicationContextAware {
29 } 29 }
30 30
31 public static void put6002(ScheduleRealInfo sch, int finish, String sender){ 31 public static void put6002(ScheduleRealInfo sch, int finish, String sender){
  32 + if(null == sch)
  33 + return;
32 QueueData_Directive qd6002 = new QueueData_Directive(); 34 QueueData_Directive qd6002 = new QueueData_Directive();
33 qd6002.setSch(sch); 35 qd6002.setSch(sch);
34 qd6002.setFinish(finish); 36 qd6002.setFinish(finish);
src/main/java/com/bsth/data/pilot80/PilotReport.java
@@ -2,8 +2,8 @@ package com.bsth.data.pilot80; @@ -2,8 +2,8 @@ package com.bsth.data.pilot80;
2 2
3 import com.bsth.data.BasicData; 3 import com.bsth.data.BasicData;
4 import com.bsth.data.LineConfigData; 4 import com.bsth.data.LineConfigData;
5 -import com.bsth.data.gpsdata.GpsRealData;  
6 -import com.bsth.data.gpsdata.status_manager.GpsStatusManager; 5 +import com.bsth.data.gpsdata_v2.GpsRealData;
  6 +import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;
7 import com.bsth.data.msg_queue.DirectivePushQueue; 7 import com.bsth.data.msg_queue.DirectivePushQueue;
8 import com.bsth.data.schedule.DayOfSchedule; 8 import com.bsth.data.schedule.DayOfSchedule;
9 import com.bsth.entity.directive.D80; 9 import com.bsth.entity.directive.D80;
@@ -93,13 +93,13 @@ public class PilotReport { @@ -93,13 +93,13 @@ public class PilotReport {
93 break; 93 break;
94 } 94 }
95 95
96 - //推送到页面  
97 - sendUtils.send80ToPage(d80);  
98 -  
99 //反射搜索用 瞬时字段 96 //反射搜索用 瞬时字段
100 d80.setLineId(d80.getData().getLineId()); 97 d80.setLineId(d80.getData().getLineId());
101 d80.setNbbm(d80.getData().getNbbm()); 98 d80.setNbbm(d80.getData().getNbbm());
102 d80.setRequestCode(d80.getData().getRequestCode()); 99 d80.setRequestCode(d80.getData().getRequestCode());
  100 +
  101 + //推送到页面
  102 + sendUtils.send80ToPage(d80);
103 } catch (Exception e) { 103 } catch (Exception e) {
104 logger.error("", e); 104 logger.error("", e);
105 } 105 }
@@ -242,6 +242,8 @@ public class PilotReport { @@ -242,6 +242,8 @@ public class PilotReport {
242 for (D80 d80 : rems) { 242 for (D80 d80 : rems) {
243 d80Maps.remove(d80.getId()); 243 d80Maps.remove(d80.getId());
244 } 244 }
  245 +
  246 + rems.clear();
245 logger.info("清除 80数据 after: " + d80Maps.size()); 247 logger.info("清除 80数据 after: " + d80Maps.size());
246 } 248 }
247 } 249 }
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
@@ -5,8 +5,8 @@ import com.alibaba.fastjson.JSONArray; @@ -5,8 +5,8 @@ import com.alibaba.fastjson.JSONArray;
5 import com.bsth.common.Constants; 5 import com.bsth.common.Constants;
6 import com.bsth.common.ResponseCode; 6 import com.bsth.common.ResponseCode;
7 import com.bsth.data.LineConfigData; 7 import com.bsth.data.LineConfigData;
8 -import com.bsth.data.gpsdata.GpsRealData;  
9 -import com.bsth.data.gpsdata.recovery.GpsDataRecovery; 8 +import com.bsth.data.gpsdata_v2.GpsRealData;
  9 +import com.bsth.data.gpsdata_v2.utils.GpsDataRecovery;
10 import com.bsth.data.schedule.f_a_l.FirstAndLastHandler; 10 import com.bsth.data.schedule.f_a_l.FirstAndLastHandler;
11 import com.bsth.entity.realcontrol.LineConfig; 11 import com.bsth.entity.realcontrol.LineConfig;
12 import com.bsth.entity.realcontrol.ScheduleRealInfo; 12 import com.bsth.entity.realcontrol.ScheduleRealInfo;
@@ -111,8 +111,6 @@ public class DayOfSchedule { @@ -111,8 +111,6 @@ public class DayOfSchedule {
111 111
112 //数据恢复 112 //数据恢复
113 public void dataRecovery() { 113 public void dataRecovery() {
114 - GpsDataRecovery.run = true;  
115 -  
116 Collection<LineConfig> confs = lineConfigs.getAll(); 114 Collection<LineConfig> confs = lineConfigs.getAll();
117 String lineCode, currSchDate; 115 String lineCode, currSchDate;
118 for (LineConfig conf : confs) { 116 for (LineConfig conf : confs) {
@@ -260,8 +258,8 @@ public class DayOfSchedule { @@ -260,8 +258,8 @@ public class DayOfSchedule {
260 public void clearRAMData(String lineCode) { 258 public void clearRAMData(String lineCode) {
261 int count = 0; 259 int count = 0;
262 List<ScheduleRealInfo> remList = new ArrayList<>(); 260 List<ScheduleRealInfo> remList = new ArrayList<>();
263 - Collection<ScheduleRealInfo> schs = nbbmScheduleMap.values();  
264 - for (ScheduleRealInfo sch : schs) { 261 + Collection<ScheduleRealInfo> all = id2SchedulMap.values();
  262 + for (ScheduleRealInfo sch : all) {
265 if (sch.getXlBm().equals(lineCode)) 263 if (sch.getXlBm().equals(lineCode))
266 remList.add(sch); 264 remList.add(sch);
267 } 265 }
@@ -271,22 +269,19 @@ public class DayOfSchedule { @@ -271,22 +269,19 @@ public class DayOfSchedule {
271 nbbmScheduleMap.remove(sch.getClZbh(), sch); 269 nbbmScheduleMap.remove(sch.getClZbh(), sch);
272 id2SchedulMap.remove(sch.getId()); 270 id2SchedulMap.remove(sch.getId());
273 count++; 271 count++;
274 - }  
275 - }  
276 272
277 - //清理路牌对照  
278 - List<String> lprms = new ArrayList<>();  
279 - Set<String> lps = lpScheduleMap.keySet();  
280 - for (String lp : lps) {  
281 - if (lp.startsWith(lineCode + "_"))  
282 - lprms.add(lp);  
283 - } 273 + //清理路牌对照
  274 + lpScheduleMap.removeAll(sch.getXlBm() + "_" + sch.getLpName());
284 275
285 - for (String lp : lprms){  
286 - logger.info("清理路牌映射 " + lp);  
287 - lpScheduleMap.removeAll(lp); 276 + //清除车辆 ——> 执行班次对照
  277 + carExecutePlanMap.remove(sch.getClZbh());
  278 + }
288 } 279 }
  280 + //清理计划排班
  281 + schedulePlanMap.remove(lineCode);
289 282
  283 + remList.clear();
  284 + remList = null;
290 logger.info(lineCode + "排班清理 " + count); 285 logger.info(lineCode + "排班清理 " + count);
291 } 286 }
292 287
@@ -512,35 +507,6 @@ public class DayOfSchedule { @@ -512,35 +507,6 @@ public class DayOfSchedule {
512 return item.getXlDir().equals(sch.getXlDir()); 507 return item.getXlDir().equals(sch.getXlDir());
513 } 508 }
514 }); 509 });
515 - /*int outConfig = -1;  
516 - LineConfig config = lineConfigData.get(sch.getXlBm());  
517 - if (config != null)  
518 - outConfig = config.getOutConfig();  
519 -  
520 - //限定出站既出场的停车场  
521 - String park = config.getTwinsPark();  
522 - boolean limitPark = StringUtils.isNotEmpty(park);  
523 - boolean flag = false;  
524 - ScheduleRealInfo next = null;  
525 - for (ScheduleRealInfo temp : list) {  
526 - if (temp.getId() == sch.getId()) {  
527 - flag = true;  
528 - continue;  
529 - }  
530 - //忽略烂班  
531 - if (temp.isDestroy())  
532 - continue;  
533 -  
534 - //出站既出场,忽略出场班次  
535 - if (outConfig == 2 && temp.getBcType().equals("out")  
536 - && (!limitPark || park.equals(temp.getQdzCode())))  
537 - continue;  
538 -  
539 - if (flag && temp.getXlDir().equals(sch.getXlDir())) {  
540 - next = temp;  
541 - break;  
542 - }  
543 - }*/  
544 return next(subList, sch); 510 return next(subList, sch);
545 } 511 }
546 512
@@ -724,12 +690,6 @@ public class DayOfSchedule { @@ -724,12 +690,6 @@ public class DayOfSchedule {
724 } 690 }
725 } 691 }
726 692
727 -  
728 -/* public List<ScheduleRealInfo> updateQdzTimePlan(String nbbm) {  
729 - Collections.sort(nbbmScheduleMap.get(nbbm), schFCSJComparator);  
730 - return schAttrCalculator.updateQdzTimePlan(nbbmScheduleMap.get(nbbm));  
731 - }*/  
732 -  
733 public List<ScheduleRealInfo> updateQdzTimePlan(String lpName) { 693 public List<ScheduleRealInfo> updateQdzTimePlan(String lpName) {
734 List<ScheduleRealInfo> list = lpScheduleMap.get(lpName); 694 List<ScheduleRealInfo> list = lpScheduleMap.get(lpName);
735 Collections.sort(list, schFCSJComparator); 695 Collections.sort(list, schFCSJComparator);
@@ -755,45 +715,6 @@ public class DayOfSchedule { @@ -755,45 +715,6 @@ public class DayOfSchedule {
755 return rs; 715 return rs;
756 } 716 }
757 717
758 - /**  
759 - * @Title: prveNotExecNum  
760 - * @Description: TODO(班次之前未执行班次数量)  
761 -  
762 - public int prveNotExecNum(ScheduleRealInfo sch) {  
763 - int n = 0;  
764 - List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh());  
765 - for (ScheduleRealInfo s : list) {  
766 - if (s.getFcsjActual() == null && !s.isDestroy())  
767 - n++;  
768 -  
769 - if (s.getId().equals(sch.getId()))  
770 - break;  
771 - }  
772 - return n;  
773 - }*/  
774 -  
775 - /**  
776 - * @Title: validEndTime  
777 - * @Description: TODO(是否是有效的到达时间)  
778 -  
779 - public boolean validEndTime(ScheduleRealInfo sch, Long ts) {  
780 - if (sch.getFcsjActualTime() != null && sch.getFcsjActualTime() > ts)  
781 - return false;  
782 -  
783 - return validTime(sch, ts);  
784 - }*/  
785 -  
786 - /**  
787 - * @Title: validStartTime  
788 - * @Description: TODO(是否是合适的发车时间)  
789 -  
790 - public boolean validStartTime(ScheduleRealInfo sch, Long ts) {  
791 - if (sch.getZdsjActualTime() != null && sch.getZdsjActualTime() < ts)  
792 - return false;  
793 -  
794 - return validTime(sch, ts);  
795 - }*/  
796 -  
797 public boolean validTime(ScheduleRealInfo sch, Long ts) { 718 public boolean validTime(ScheduleRealInfo sch, Long ts) {
798 List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); 719 List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh());
799 int ci = list.indexOf(sch); 720 int ci = list.indexOf(sch);
@@ -825,7 +746,6 @@ public class DayOfSchedule { @@ -825,7 +746,6 @@ public class DayOfSchedule {
825 } 746 }
826 747
827 public void save(ScheduleRealInfo sch) { 748 public void save(ScheduleRealInfo sch) {
828 - //schRepository.save(sch);  
829 sch.setUpdateDate(new Date()); 749 sch.setUpdateDate(new Date());
830 pstBuffer.add(sch); 750 pstBuffer.add(sch);
831 } 751 }
@@ -904,10 +824,6 @@ public class DayOfSchedule { @@ -904,10 +824,6 @@ public class DayOfSchedule {
904 return outList; 824 return outList;
905 } 825 }
906 826
907 -/* public Set<String> allCar() {  
908 - return nbbmScheduleMap.keySet();  
909 - }*/  
910 -  
911 public Collection<ScheduleRealInfo> findAll() { 827 public Collection<ScheduleRealInfo> findAll() {
912 return nbbmScheduleMap.values(); 828 return nbbmScheduleMap.values();
913 } 829 }
@@ -961,10 +877,6 @@ public class DayOfSchedule { @@ -961,10 +877,6 @@ public class DayOfSchedule {
961 nbbmScheduleMap.put(newClZbh, sch); 877 nbbmScheduleMap.put(newClZbh, sch);
962 } 878 }
963 879
964 - //重新计算班次应到时间  
965 - //ups.addAll(updateQdzTimePlan(oldClzbh));  
966 - //ups.addAll(updateQdzTimePlan(newClZbh));  
967 -  
968 //重新计算车辆当前执行班次 880 //重新计算车辆当前执行班次
969 reCalcExecPlan(newClZbh); 881 reCalcExecPlan(newClZbh);
970 reCalcExecPlan(sch.getClZbh()); 882 reCalcExecPlan(sch.getClZbh());
@@ -986,50 +898,6 @@ public class DayOfSchedule { @@ -986,50 +898,6 @@ public class DayOfSchedule {
986 898
987 ScheduleRealInfo sch = schAttrCalculator.calcCurrentExecSch(list); 899 ScheduleRealInfo sch = schAttrCalculator.calcCurrentExecSch(list);
988 carExecutePlanMap.put(nbbm, sch); 900 carExecutePlanMap.put(nbbm, sch);
989 -  
990 -  
991 - /* try{  
992 - GpsEntity gps = gpsRealData.get(BasicData.deviceId2NbbmMap.inverse().get(nbbm));  
993 - if (gps == null || !gps.isOnline())  
994 - return;//设备不在线  
995 -  
996 - *//*if(sch == null && gps.isService())  
997 - DirectivePushQueue.put6003(nbbm, 1, 0, null, "系统");//无任务*//*  
998 -  
999 - //String bcType = sch.getBcType();  
1000 - *//*if(bcType.equals("normal")  
1001 - || bcType.equals("region")  
1002 - || bcType.equals("major")){  
1003 - //全程、区间、放站,切换到营运状态  
1004 - if(!gps.isService()){  
1005 - DirectivePushQueue.put6003(nbbm, 0, Integer.parseInt(sch.getXlDir()), sch, "系统");  
1006 - }  
1007 - }  
1008 - else if(gps.isService()){  
1009 - DirectivePushQueue.put6003(nbbm, 1, 0, null, "系统");//空驶任务  
1010 - }*//*  
1011 - }catch (Exception e){  
1012 - logger.error("", e);  
1013 - }  
1014 - *//*try {  
1015 - //切换设备状态  
1016 - GpsEntity gps = gpsRealData.get(BasicData.deviceId2NbbmMap.inverse().get(nbbm));  
1017 - if (gps == null || !gps.isOnline())  
1018 - return;  
1019 - if (sch == null) {  
1020 - logger.info("车辆" + nbbm + "无可执行任务,切换至非营运状态");  
1021 - DirectivePushQueue.put6003(nbbm, 1, 0, null, "系统");  
1022 - return;  
1023 - }  
1024 -  
1025 - if (StringUtils.isNotEmpty(gps.getLineId()) && !gps.getLineId().equals(sch.getXlBm())) {  
1026 - //下发线路切换指令  
1027 - DirectivePushQueue.put64(nbbm, sch.getXlBm(), "系统");  
1028 - logger.info("车辆" + nbbm + "切换至" + sch.getXlBm() + " -原" + gps.getLineId() + " --重新计算当前执行班次!");  
1029 - }  
1030 - } catch (Exception e) {  
1031 - logger.error("", e);  
1032 - }*/  
1033 } 901 }
1034 902
1035 /** 903 /**
@@ -1043,30 +911,6 @@ public class DayOfSchedule { @@ -1043,30 +911,6 @@ public class DayOfSchedule {
1043 return type.equals("out") || type.equals("in") || type.equals("venting") || type.equals("ldks"); 911 return type.equals("out") || type.equals("in") || type.equals("venting") || type.equals("ldks");
1044 } 912 }
1045 913
1046 - /**  
1047 - * 是否在执行首班出场  
1048 - *  
1049 - * @param nbbm  
1050 - * @return  
1051 -  
1052 - public boolean isExecFirstOut(String nbbm, long time) {  
1053 - try {  
1054 - List<ScheduleRealInfo> list = nbbmScheduleMap.get(nbbm);  
1055 - ScheduleRealInfo second = list.get(2),  
1056 - first = executeCurr(nbbm);  
1057 -  
1058 - if (first.getBcType().equals("out")  
1059 - && first.getDfsjT() < second.getDfsjT()  
1060 - && doneSum(nbbm) == 0 && second.getDfsjT() > time)  
1061 - return true;  
1062 - } catch (Exception e) {  
1063 - logger.error("", e);  
1064 - }  
1065 -  
1066 - return false;  
1067 - }*/  
1068 -  
1069 -  
1070 @Autowired 914 @Autowired
1071 JdbcTemplate jdbcTemplate; 915 JdbcTemplate jdbcTemplate;
1072 916
src/main/java/com/bsth/data/schedule/SchAttrCalculator.java
@@ -208,7 +208,7 @@ public class SchAttrCalculator { @@ -208,7 +208,7 @@ public class SchAttrCalculator {
208 public ScheduleRealInfo calcCurrentExecSch(List<ScheduleRealInfo> list) { 208 public ScheduleRealInfo calcCurrentExecSch(List<ScheduleRealInfo> list) {
209 String lineCode = list.get(0).getXlBm(); 209 String lineCode = list.get(0).getXlBm();
210 LineConfig conf = lineConfigData.get(lineCode); 210 LineConfig conf = lineConfigData.get(lineCode);
211 - long t = System.currentTimeMillis(); 211 +
212 int outConfig = -1; 212 int outConfig = -1;
213 //限定出站既出场的停车场 213 //限定出站既出场的停车场
214 String park = null; 214 String park = null;
@@ -218,7 +218,10 @@ public class SchAttrCalculator { @@ -218,7 +218,10 @@ public class SchAttrCalculator {
218 } 218 }
219 boolean limitPark = StringUtils.isNotEmpty(park); 219 boolean limitPark = StringUtils.isNotEmpty(park);
220 220
221 - for (ScheduleRealInfo sch : list) { 221 + ScheduleRealInfo sch, prev = null;
  222 + for(int i = list.size() - 1; i > 0; i --){
  223 + sch = list.get(i);
  224 +
222 //如果是出站既出场,忽略出场班次 225 //如果是出站既出场,忽略出场班次
223 if (outConfig == 2 && sch.getBcType().equals("out") 226 if (outConfig == 2 && sch.getBcType().equals("out")
224 && (!limitPark || park.equals(sch.getQdzCode())) 227 && (!limitPark || park.equals(sch.getQdzCode()))
@@ -229,81 +232,11 @@ public class SchAttrCalculator { @@ -229,81 +232,11 @@ public class SchAttrCalculator {
229 if (sch.isDestroy()) 232 if (sch.isDestroy())
230 continue; 233 continue;
231 234
232 - //已执行  
233 if (StringUtils.isNotEmpty(sch.getZdsjActual())) 235 if (StringUtils.isNotEmpty(sch.getZdsjActual()))
234 - continue;  
235 -  
236 - if (Math.abs((t - sch.getDfsjT())) > 1000 * 60 * 60) {  
237 - //差值较大,倒着找看有没有更合适的  
238 - ScheduleRealInfo schReverse = calcCurrentExecSchReverse(list, outConfig, limitPark, park);  
239 - if (null != schReverse && !schReverse.getId().equals(sch.getId())) {  
240 - logger.info("calc_current_exec_sch_reverse... -" + schReverse.getId());  
241 - return suitableExecSch(schReverse, sch, t);  
242 - }  
243 - }  
244 - return sch;  
245 - }  
246 - return null;  
247 - }  
248 -  
249 - /**  
250 - * 反转匹配一个班次  
251 - *  
252 - * @param list  
253 - * @param outConfig  
254 - * @param limitPark  
255 - * @param park  
256 - * @return  
257 - */  
258 - private ScheduleRealInfo calcCurrentExecSchReverse(List<ScheduleRealInfo> list, int outConfig, boolean limitPark, String park) {  
259 - ScheduleRealInfo near = null;  
260 - for (ScheduleRealInfo sch : list) {  
261 - //如果是出站既出场,忽略出场班次  
262 - if (outConfig == 2 && isInout(sch)  
263 - && (!limitPark || park.equals(sch.getQdzCode()) || park.equals(sch.getZdzCode()))  
264 - && (sch.getBcsj()==0 || sch.getJhlcOrig().intValue()==0))  
265 - continue;  
266 -  
267 - //忽略烂班  
268 - if (sch.isDestroy())  
269 - continue;  
270 -  
271 - if (StringUtils.isNotEmpty(sch.getZdsjActual())) {  
272 - near = null;  
273 - continue;  
274 - } 236 + break;
275 237
276 - if (null == near)  
277 - near = sch; 238 + prev = sch;
278 } 239 }
279 - return near;  
280 - }  
281 -  
282 - /**  
283 - * 比较2个班次,谁是指定时间更合适执行的  
284 - *  
285 - * @param schReverse  
286 - * @param sch  
287 - * @param t  
288 - * @return  
289 - */  
290 - private ScheduleRealInfo suitableExecSch(ScheduleRealInfo schReverse, ScheduleRealInfo sch, long t) {  
291 - return Math.abs(t - schReverse.getDfsjT()) > Math.abs(t - sch.getDfsjT()) ? sch : schReverse;  
292 - }  
293 -  
294 - private boolean isInout(ScheduleRealInfo sch) {  
295 - return sch.getBcType().equals("out") || sch.getBcType().equals("in");  
296 - }  
297 -  
298 - /**  
299 - *  
300 - * @param fcsjT  
301 - * @param zdsjT  
302 - */  
303 - public boolean isValid(Long fcsjT, Long zdsjT) {  
304 - if(null != fcsjT && null != zdsjT)  
305 - return fcsjT < zdsjT;  
306 -  
307 - return true; 240 + return prev;
308 } 241 }
309 } 242 }
src/main/java/com/bsth/data/schedule/auto_exec/RealScheduleAutoExecHandler.java
1 package com.bsth.data.schedule.auto_exec; 1 package com.bsth.data.schedule.auto_exec;
2 2
3 -import com.bsth.data.gpsdata.status_manager.GpsStatusManager; 3 +import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;
4 import com.bsth.data.schedule.DayOfSchedule; 4 import com.bsth.data.schedule.DayOfSchedule;
5 import com.bsth.entity.realcontrol.ScheduleRealInfo; 5 import com.bsth.entity.realcontrol.ScheduleRealInfo;
6 import com.bsth.websocket.handler.SendUtils; 6 import com.bsth.websocket.handler.SendUtils;
src/main/java/com/bsth/data/schedule/late_adjust/LateAdjustHandle.java
@@ -3,7 +3,7 @@ package com.bsth.data.schedule.late_adjust; @@ -3,7 +3,7 @@ package com.bsth.data.schedule.late_adjust;
3 3
4 import com.bsth.data.BasicData; 4 import com.bsth.data.BasicData;
5 import com.bsth.data.LineConfigData; 5 import com.bsth.data.LineConfigData;
6 -import com.bsth.data.gpsdata.GpsEntity; 6 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
7 import com.bsth.entity.realcontrol.LineConfig; 7 import com.bsth.entity.realcontrol.LineConfig;
8 import com.bsth.entity.realcontrol.ScheduleRealInfo; 8 import com.bsth.entity.realcontrol.ScheduleRealInfo;
9 import com.bsth.util.Arith; 9 import com.bsth.util.Arith;
src/main/java/com/bsth/data/schedule/thread/ScheduleRefreshThread.java
@@ -28,10 +28,7 @@ public class ScheduleRefreshThread extends Thread{ @@ -28,10 +28,7 @@ public class ScheduleRefreshThread extends Thread{
28 28
29 @Autowired 29 @Autowired
30 DayOfSchedule dayOfSchedule; 30 DayOfSchedule dayOfSchedule;
31 -  
32 - /*@Autowired  
33 - ArrivalData_GPS arrivalData;*/  
34 - 31 +
35 @Autowired 32 @Autowired
36 LineConfigData lineConfs; 33 LineConfigData lineConfs;
37 34
src/main/java/com/bsth/service/directive/DirectiveServiceImpl.java
@@ -7,8 +7,8 @@ import com.bsth.data.BasicData; @@ -7,8 +7,8 @@ import com.bsth.data.BasicData;
7 import com.bsth.data.directive.DayOfDirectives; 7 import com.bsth.data.directive.DayOfDirectives;
8 import com.bsth.data.directive.DirectiveCreator; 8 import com.bsth.data.directive.DirectiveCreator;
9 import com.bsth.data.directive.GatewayHttpUtils; 9 import com.bsth.data.directive.GatewayHttpUtils;
10 -import com.bsth.data.gpsdata.GpsEntity;  
11 -import com.bsth.data.gpsdata.GpsRealData; 10 +import com.bsth.data.gpsdata_v2.GpsRealData;
  11 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
12 import com.bsth.data.pilot80.PilotReport; 12 import com.bsth.data.pilot80.PilotReport;
13 import com.bsth.data.schedule.DayOfSchedule; 13 import com.bsth.data.schedule.DayOfSchedule;
14 import com.bsth.data.utils.ListFilterUtils; 14 import com.bsth.data.utils.ListFilterUtils;
src/main/java/com/bsth/service/gps/GpsService.java
1 package com.bsth.service.gps; 1 package com.bsth.service.gps;
2 2
3 -import com.bsth.data.gpsdata.GpsEntity;  
4 import com.bsth.service.gps.entity.GpsOutbound_DTO; 3 import com.bsth.service.gps.entity.GpsOutbound_DTO;
5 import com.bsth.service.gps.entity.GpsSpeed; 4 import com.bsth.service.gps.entity.GpsSpeed;
6 import com.bsth.service.gps.entity.GpsSpeed_DTO; 5 import com.bsth.service.gps.entity.GpsSpeed_DTO;
7 -import com.bsth.util.PageObject;  
8 6
9 import javax.servlet.http.HttpServletResponse; 7 import javax.servlet.http.HttpServletResponse;
10 -  
11 import java.text.ParseException; 8 import java.text.ParseException;
12 import java.util.List; 9 import java.util.List;
13 import java.util.Map; 10 import java.util.Map;
src/main/java/com/bsth/service/gps/GpsServiceImpl.java
@@ -3,10 +3,10 @@ package com.bsth.service.gps; @@ -3,10 +3,10 @@ package com.bsth.service.gps;
3 import com.bsth.common.ResponseCode; 3 import com.bsth.common.ResponseCode;
4 import com.bsth.data.BasicData; 4 import com.bsth.data.BasicData;
5 import com.bsth.data.forecast.entity.ArrivalEntity; 5 import com.bsth.data.forecast.entity.ArrivalEntity;
6 -import com.bsth.data.gpsdata.GpsEntity;  
7 -import com.bsth.data.gpsdata.GpsRealData;  
8 -import com.bsth.data.gpsdata.arrival.GeoCacheData;  
9 -import com.bsth.data.gpsdata.arrival.utils.GeoUtils; 6 +import com.bsth.data.gpsdata_v2.GpsRealData;
  7 +import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
  8 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  9 +import com.bsth.data.gpsdata_v2.utils.GeoUtils;
10 import com.bsth.data.safe_driv.SafeDriv; 10 import com.bsth.data.safe_driv.SafeDriv;
11 import com.bsth.data.safe_driv.SafeDrivCenter; 11 import com.bsth.data.safe_driv.SafeDrivCenter;
12 import com.bsth.data.schedule.DayOfSchedule; 12 import com.bsth.data.schedule.DayOfSchedule;
src/main/java/com/bsth/service/gps/entity/HistoryGps_DTO.java
@@ -3,10 +3,8 @@ package com.bsth.service.gps.entity; @@ -3,10 +3,8 @@ package com.bsth.service.gps.entity;
3 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONObject; 4 import com.alibaba.fastjson.JSONObject;
5 import com.bsth.data.forecast.entity.ArrivalEntity; 5 import com.bsth.data.forecast.entity.ArrivalEntity;
  6 +import com.bsth.util.Geo.Point;
6 import com.fasterxml.jackson.annotation.JsonIgnore; 7 import com.fasterxml.jackson.annotation.JsonIgnore;
7 -import com.vividsolutions.jts.geom.Coordinate;  
8 -import com.vividsolutions.jts.geom.GeometryFactory;  
9 -import com.vividsolutions.jts.geom.Point;  
10 8
11 import java.util.List; 9 import java.util.List;
12 import java.util.Map; 10 import java.util.Map;
@@ -20,10 +18,9 @@ public class HistoryGps_DTO { @@ -20,10 +18,9 @@ public class HistoryGps_DTO {
20 public static List<HistoryGps_DTO> craete(List<Map<String, Object>> mapList) { 18 public static List<HistoryGps_DTO> craete(List<Map<String, Object>> mapList) {
21 List<HistoryGps_DTO> list = JSONObject.parseArray(JSON.toJSONString(mapList), HistoryGps_DTO.class); 19 List<HistoryGps_DTO> list = JSONObject.parseArray(JSON.toJSONString(mapList), HistoryGps_DTO.class);
22 20
23 - GeometryFactory geometryFactory = new GeometryFactory();  
24 Point point; 21 Point point;
25 for (HistoryGps_DTO gps : list) { 22 for (HistoryGps_DTO gps : list) {
26 - point = geometryFactory.createPoint(new Coordinate(gps.getLat(), gps.getLon())); 23 + point = new Point(gps.getLon(), gps.getLat());
27 gps.setPoint(point); 24 gps.setPoint(point);
28 } 25 }
29 return list; 26 return list;
src/main/java/com/bsth/service/gps/entity/HistoryGps_DTOV3.java
@@ -3,10 +3,8 @@ package com.bsth.service.gps.entity; @@ -3,10 +3,8 @@ package com.bsth.service.gps.entity;
3 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONObject; 4 import com.alibaba.fastjson.JSONObject;
5 import com.bsth.data.forecast.entity.ArrivalEntity; 5 import com.bsth.data.forecast.entity.ArrivalEntity;
  6 +import com.bsth.util.Geo.Point;
6 import com.fasterxml.jackson.annotation.JsonIgnore; 7 import com.fasterxml.jackson.annotation.JsonIgnore;
7 -import com.vividsolutions.jts.geom.Coordinate;  
8 -import com.vividsolutions.jts.geom.GeometryFactory;  
9 -import com.vividsolutions.jts.geom.Point;  
10 8
11 import java.util.List; 9 import java.util.List;
12 import java.util.Map; 10 import java.util.Map;
@@ -20,10 +18,9 @@ public class HistoryGps_DTOV3 { @@ -20,10 +18,9 @@ public class HistoryGps_DTOV3 {
20 public static List<HistoryGps_DTOV3> craete(List<Map<String, Object>> mapList) { 18 public static List<HistoryGps_DTOV3> craete(List<Map<String, Object>> mapList) {
21 List<HistoryGps_DTOV3> list = JSONObject.parseArray(JSON.toJSONString(mapList), HistoryGps_DTOV3.class); 19 List<HistoryGps_DTOV3> list = JSONObject.parseArray(JSON.toJSONString(mapList), HistoryGps_DTOV3.class);
22 20
23 - GeometryFactory geometryFactory = new GeometryFactory();  
24 Point point; 21 Point point;
25 for (HistoryGps_DTOV3 gps : list) { 22 for (HistoryGps_DTOV3 gps : list) {
26 - point = geometryFactory.createPoint(new Coordinate(gps.getLat(), gps.getLon())); 23 + point = new Point(gps.getLon(), gps.getLat());
27 gps.setPoint(point); 24 gps.setPoint(point);
28 } 25 }
29 return list; 26 return list;
src/main/java/com/bsth/service/gps/entity/Road_DTO.java
@@ -2,10 +2,9 @@ package com.bsth.service.gps.entity; @@ -2,10 +2,9 @@ package com.bsth.service.gps.entity;
2 2
3 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONObject; 4 import com.alibaba.fastjson.JSONObject;
  5 +import com.bsth.data.gpsdata_v2.entity.CtLineString;
  6 +import com.bsth.util.Geo.Point;
5 import com.fasterxml.jackson.annotation.JsonIgnore; 7 import com.fasterxml.jackson.annotation.JsonIgnore;
6 -import com.vividsolutions.jts.geom.Coordinate;  
7 -import com.vividsolutions.jts.geom.GeometryFactory;  
8 -import com.vividsolutions.jts.geom.LineString;  
9 8
10 import java.util.ArrayList; 9 import java.util.ArrayList;
11 import java.util.List; 10 import java.util.List;
@@ -24,9 +23,9 @@ public class Road_DTO { @@ -24,9 +23,9 @@ public class Road_DTO {
24 String[] coords; 23 String[] coords;
25 int i, len; 24 int i, len;
26 String[] temps;//1, temps2; 25 String[] temps;//1, temps2;
27 - List<Coordinate> cds; 26 + List<Point> cds;
28 27
29 - GeometryFactory geometryFactory = new GeometryFactory(); 28 + //GeometryFactory geometryFactory = new GeometryFactory();
30 for(Road_DTO road : list){ 29 for(Road_DTO road : list){
31 polygonStr = road.getGROAD_VECTOR(); 30 polygonStr = road.getGROAD_VECTOR();
32 coords = polygonStr.substring(11, polygonStr.length() - 1).split(","); 31 coords = polygonStr.substring(11, polygonStr.length() - 1).split(",");
@@ -36,11 +35,10 @@ public class Road_DTO { @@ -36,11 +35,10 @@ public class Road_DTO {
36 //每2个点连一条线 35 //每2个点连一条线
37 for(i = 0; i < len; i ++){ 36 for(i = 0; i < len; i ++){
38 temps = coords[i].split(" "); 37 temps = coords[i].split(" ");
39 - cds.add(new Coordinate(Float.parseFloat(temps[1]), Float.parseFloat(temps[0]))); 38 + cds.add(new Point(Float.parseFloat(temps[0]), Float.parseFloat(temps[1])));
40 } 39 }
41 40
42 - Coordinate[] cdsArray = new Coordinate[cds.size()];  
43 - road.setLineStr(geometryFactory.createLineString(cds.toArray(cdsArray))); 41 + road.setLineStr(new CtLineString(cds));
44 } 42 }
45 return list; 43 return list;
46 } 44 }
@@ -57,7 +55,7 @@ public class Road_DTO { @@ -57,7 +55,7 @@ public class Road_DTO {
57 private double SPEED; 55 private double SPEED;
58 56
59 @JsonIgnore 57 @JsonIgnore
60 - private LineString lineStr; 58 + private CtLineString lineStr;
61 59
62 public long getID() { 60 public long getID() {
63 return ID; 61 return ID;
@@ -99,11 +97,12 @@ public class Road_DTO { @@ -99,11 +97,12 @@ public class Road_DTO {
99 this.SPEED = SPEED; 97 this.SPEED = SPEED;
100 } 98 }
101 99
102 - public LineString getLineStr() { 100 +
  101 + public CtLineString getLineStr() {
103 return lineStr; 102 return lineStr;
104 } 103 }
105 104
106 - public void setLineStr(LineString lineStr) { 105 + public void setLineStr(CtLineString lineStr) {
107 this.lineStr = lineStr; 106 this.lineStr = lineStr;
108 } 107 }
109 } 108 }
src/main/java/com/bsth/service/realcontrol/impl/RealMapServiceImpl.java
@@ -2,15 +2,12 @@ package com.bsth.service.realcontrol.impl; @@ -2,15 +2,12 @@ package com.bsth.service.realcontrol.impl;
2 2
3 import com.bsth.common.ResponseCode; 3 import com.bsth.common.ResponseCode;
4 import com.bsth.controller.realcontrol.dto.StationSpatialData; 4 import com.bsth.controller.realcontrol.dto.StationSpatialData;
5 -import com.bsth.data.gpsdata.arrival.utils.GeoUtils;  
6 import com.bsth.entity.CarPark; 5 import com.bsth.entity.CarPark;
7 import com.bsth.service.realcontrol.RealMapService; 6 import com.bsth.service.realcontrol.RealMapService;
8 import com.bsth.service.realcontrol.dto.SectionRouteCoords; 7 import com.bsth.service.realcontrol.dto.SectionRouteCoords;
9 import com.bsth.util.TransGPS; 8 import com.bsth.util.TransGPS;
10 -import com.google.common.base.Joiner;  
11 import com.google.common.base.Splitter; 9 import com.google.common.base.Splitter;
12 import com.google.common.collect.ArrayListMultimap; 10 import com.google.common.collect.ArrayListMultimap;
13 -import com.vividsolutions.jts.geom.*;  
14 import org.slf4j.Logger; 11 import org.slf4j.Logger;
15 import org.slf4j.LoggerFactory; 12 import org.slf4j.LoggerFactory;
16 import org.springframework.beans.factory.annotation.Autowired; 13 import org.springframework.beans.factory.annotation.Autowired;
@@ -250,171 +247,4 @@ public class RealMapServiceImpl implements RealMapService { @@ -250,171 +247,4 @@ public class RealMapServiceImpl implements RealMapService {
250 } 247 }
251 return gcjList; 248 return gcjList;
252 } 249 }
253 -  
254 - /**  
255 - * 将相连的路段拼接起来,去掉接口覆盖区域。  
256 - * 主要因为前端地图绘制时,过多的路段会带来性能消耗。在这里提前拼接好以减少路段数量  
257 - * @param list  
258 - * @return  
259 - */  
260 - private List<String> jointCoords(List<String> list){  
261 - List<String> rs = new ArrayList<>();  
262 - int len = list.size();  
263 - if(len == 0)  
264 - return rs;  
265 -  
266 - String joinstr = list.get(0);  
267 - String str;  
268 - for(int i = 1; i < len; i ++){  
269 - str = jointCoords(joinstr.toString(), list.get(i));  
270 - if(str != null)  
271 - joinstr = str;  
272 - else{  
273 - rs.add(joinstr.toString());  
274 - joinstr = list.get(i);  
275 - }  
276 - }  
277 - rs.add(joinstr);  
278 - return rs;  
279 - }  
280 -  
281 - static GeometryFactory geometryFactory = new GeometryFactory();  
282 - private String jointCoords(String c1, String c2){  
283 - String rs=null;  
284 - LineString s1 = createLineString(c1);  
285 - LineString s2 = createLineString(c2);  
286 -  
287 -  
288 - /*if(s1.intersects(s2)){  
289 - //2条线相交  
290 - Geometry g = s1.intersection(s2);  
291 - Point inPoint = geometryFactory.createPoint(g.getCoordinates()[0]);  
292 - //s1 = replacePoint(s1, s1.getCoordinates().length - 1, inPoint);  
293 - //s2 = replacePoint(s2, 0, inPoint);  
294 -  
295 - //rs = toString(s1);  
296 - //rs += ("," + toString(s2));  
297 - rs = replacePoint(c1, s1.getCoordinates().length - 1, inPoint);  
298 - rs += ("," + replacePoint(c2, 0, null));  
299 - }  
300 - else {*/  
301 - //距离10米内的点直接连起来  
302 - double distance = GeoUtils.getDistanceLineToLine(s1.getStartPoint(), s1.getEndPoint(), s2.getStartPoint(), s2.getEndPoint());  
303 - if(distance < 10){  
304 - //s2 = replacePoint(s2, 0, s1.getEndPoint());  
305 - rs = c1;  
306 -  
307 - //获取c1终点到 c2 的垂直交点  
308 - //s1.getEndPoint()  
309 - //rs += ("," + replacePoint(c2, 0, null));  
310 - //rs = toString(s1);  
311 - //rs += ("," + toString(s2));  
312 - }  
313 - //}  
314 - return rs;  
315 - }  
316 -  
317 - /**  
318 - * 替换线段中指定的一个点位  
319 - * @param index  
320 - * @param p  
321 -  
322 - private LineString replacePoint(LineString line, int index, Point p){  
323 - Coordinate[] array = line.getCoordinates();  
324 - array[index] = p.getCoordinate();  
325 -  
326 - return geometryFactory.createLineString(array);  
327 - }*/  
328 -  
329 - private String replacePoint(String lineStr, int index, Point p){  
330 - List<String> list = new ArrayList<>(Splitter.on(",").splitToList(lineStr));  
331 - list.remove(index);  
332 - if(p != null){  
333 - list.add(index, p.getX() + " " + p.getY());  
334 - }  
335 - return Joiner.on(",").join(list);  
336 - }  
337 -  
338 - private LineString createLineString(String c){  
339 - List<String> list = Splitter.on(",").splitToList(c);  
340 -  
341 - Coordinate[] cds = new Coordinate[list.size()];  
342 - String[] strs;  
343 - for(int i = 0; i < list.size(); i ++){  
344 - strs = list.get(i).split(" ");  
345 - cds[i] = new Coordinate(Float.parseFloat(strs[1]), Float.parseFloat(strs[0]));  
346 - }  
347 - return geometryFactory.createLineString(cds);  
348 - }  
349 -  
350 - private String toString(LineString line){  
351 - Coordinate[] all = line.getCoordinates();  
352 -  
353 - Coordinate[] cs;  
354 - StringBuilder sb = new StringBuilder("");  
355 - for(int i = 0; i < all.length - 1; i ++){  
356 - cs = new Coordinate[2];  
357 - cs[0] = all[i];  
358 - cs[1] = all[i + 1];  
359 -  
360 - sb.append("," + cs[0].y + " " + cs[0].x);  
361 - sb.append("," + cs[1].y + " " + cs[1].x);  
362 - }  
363 - sb.deleteCharAt(0);  
364 - return sb.toString();  
365 - }  
366 -  
367 -/* private String truncationEnd(LineString lineString, Point p){  
368 - Coordinate[] all = lineString.getCoordinates();  
369 - LineString sl;  
370 -  
371 - Coordinate[] cs;  
372 - StringBuilder sb = new StringBuilder("");  
373 - double threshold = 0.1,distance;  
374 - for(int i = 0; i < all.length - 1; i ++){  
375 - cs = new Coordinate[2];  
376 - cs[0] = all[i];  
377 - cs[1] = all[i + 1];  
378 - sl = geometryFactory.createLineString(cs);  
379 -  
380 - sb.append("," + cs[0].y + " " + cs[0].x);  
381 - distance = GeoUtils.getDistanceFromLine(sl, p);  
382 - if(distance < threshold){  
383 - sb.append("," + p.getY() + " " + p.getX());  
384 - break;  
385 - }  
386 - else  
387 - sb.append("," + cs[1].y + " " + cs[1].x);  
388 - }  
389 - sb.deleteCharAt(0);  
390 - return sb.toString();  
391 - }  
392 -  
393 - private String truncationStart(LineString lineString, Point p){  
394 - Coordinate[] all = lineString.getCoordinates();  
395 - LineString sl;  
396 -  
397 - Coordinate[] cs;  
398 - StringBuilder sb = new StringBuilder("");  
399 - double threshold = 0.1,distance;  
400 - for(int i = 0; i < all.length - 1; i ++){  
401 - cs = new Coordinate[2];  
402 - cs[0] = all[i];  
403 - cs[1] = all[i + 1];  
404 - sl = geometryFactory.createLineString(cs);  
405 -  
406 - distance = GeoUtils.getDistanceFromLine(sl, p);  
407 - if(distance < threshold){  
408 - sb.append("," + p.getY() + " " + p.getX());  
409 - sb.append("," + cs[1].y + " " + cs[1].x);  
410 - break;  
411 - }  
412 - else{  
413 - sb.append("," + cs[0].y + " " + cs[0].x);  
414 - sb.append("," + cs[1].y + " " + cs[1].x);  
415 - }  
416 - }  
417 - sb.deleteCharAt(0);  
418 - return sb.toString();  
419 - }*/  
420 } 250 }
src/main/java/com/bsth/websocket/handler/SendUtils.java
@@ -3,8 +3,7 @@ package com.bsth.websocket.handler; @@ -3,8 +3,7 @@ package com.bsth.websocket.handler;
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
4 import com.bsth.data.BasicData; 4 import com.bsth.data.BasicData;
5 import com.bsth.data.LineConfigData; 5 import com.bsth.data.LineConfigData;
6 -import com.bsth.data.gpsdata.GpsEntity;  
7 -import com.bsth.data.gpsdata.arrival.entity.SignalState; 6 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
8 import com.bsth.data.safe_driv.SafeDriv; 7 import com.bsth.data.safe_driv.SafeDriv;
9 import com.bsth.entity.directive.D80; 8 import com.bsth.entity.directive.D80;
10 import com.bsth.entity.realcontrol.ScheduleRealInfo; 9 import com.bsth.entity.realcontrol.ScheduleRealInfo;
@@ -81,8 +80,6 @@ public class SendUtils{ @@ -81,8 +80,6 @@ public class SendUtils{
81 * TODO(推送到达终点时间) @param @param schedule 班次 @throws 80 * TODO(推送到达终点时间) @param @param schedule 班次 @throws
82 */ 81 */
83 public void sendZdsj(ScheduleRealInfo sch, ScheduleRealInfo nextSch, int finish) { 82 public void sendZdsj(ScheduleRealInfo sch, ScheduleRealInfo nextSch, int finish) {
84 - //处理进站即进场的班次  
85 - //connectInSchTime(sch);  
86 83
87 Map<String, Object> map = new HashMap<>(); 84 Map<String, Object> map = new HashMap<>();
88 map.put("fn", "zhongDian"); 85 map.put("fn", "zhongDian");
@@ -103,7 +100,7 @@ public class SendUtils{ @@ -103,7 +100,7 @@ public class SendUtils{
103 /** 100 /**
104 * 推送班次信号状态 101 * 推送班次信号状态
105 * @param state 102 * @param state
106 - */ 103 +
107 public void sendSignalState(SignalState state){ 104 public void sendSignalState(SignalState state){
108 Map<String, Object> map = new HashMap<>(); 105 Map<String, Object> map = new HashMap<>();
109 map.put("fn", "signal_state"); 106 map.put("fn", "signal_state");
@@ -116,7 +113,7 @@ public class SendUtils{ @@ -116,7 +113,7 @@ public class SendUtils{
116 } catch (Exception e) { 113 } catch (Exception e) {
117 logger.error("", e); 114 logger.error("", e);
118 } 115 }
119 - } 116 + }*/
120 117
121 /** 118 /**
122 * 119 *
src/main/resources/static/real_control_v2/mapmonitor/fragments/map_infowindow.html
@@ -38,6 +38,7 @@ @@ -38,6 +38,7 @@
38 {{if expectStopTime!=null}} 38 {{if expectStopTime!=null}}
39 <a href="javascript:;" style="color: #07D;margin-right: 7px;">预计 {{expectStopTime}} 分钟到达终点</a> 39 <a href="javascript:;" style="color: #07D;margin-right: 7px;">预计 {{expectStopTime}} 分钟到达终点</a>
40 {{/if}} 40 {{/if}}
  41 + <a href="javascript:;" style="float: left;" onclick="javascript:window.open('http://180.166.5.82:9005/transport_server/dvr_monitor1.jsp?userid=4&deviceid={{deviceId}}');">DVR</a>
41 <a href="javascript:;" style="float: right;" onclick="javascript:gb_map_play_back.initParams('{{deviceId}}', '{{nbbm}}');">轨迹回放</a> 42 <a href="javascript:;" style="float: right;" onclick="javascript:gb_map_play_back.initParams('{{deviceId}}', '{{nbbm}}');">轨迹回放</a>
42 </div> 43 </div>
43 </script> 44 </script>