Commit 13ba7d4d83b279959d57677b9dd632a175aeb402

Authored by 潘钊
1 parent c117dacc

update...

src/main/java/com/bsth/data/gpsdata/GpsEntity.java
... ... @@ -79,6 +79,12 @@ public class GpsEntity implements Cloneable{
79 79 @JsonIgnore
80 80 private StationRoute station;
81 81  
  82 + /**
  83 + * 前置约束 -站点编码
  84 + */
  85 + @JsonIgnore
  86 + private String premiseCode;
  87 +
82 88 /** 状态 */
83 89 private String signalState = "normal";
84 90  
... ... @@ -358,4 +364,12 @@ public class GpsEntity implements Cloneable{
358 364 public void setServerTimestamp(Long serverTimestamp) {
359 365 this.serverTimestamp = serverTimestamp;
360 366 }
  367 +
  368 + public String getPremiseCode() {
  369 + return premiseCode;
  370 + }
  371 +
  372 + public void setPremiseCode(String premiseCode) {
  373 + this.premiseCode = premiseCode;
  374 + }
361 375 }
... ...
src/main/java/com/bsth/data/gpsdata/arrival/GeoCacheData.java
... ... @@ -3,8 +3,10 @@ package com.bsth.data.gpsdata.arrival;
3 3 import com.bsth.data.gpsdata.GpsEntity;
4 4 import com.bsth.data.gpsdata.arrival.entity.StationRoute;
5 5 import com.bsth.data.gpsdata.arrival.entity.TimedEnableStationRoute;
  6 +import com.bsth.data.gpsdata.arrival.precondition.entity.PreconditionGeo;
6 7 import com.bsth.data.gpsdata.arrival.utils.CircleQueue;
7 8 import com.bsth.data.gpsdata.arrival.utils.StationRouteComp;
  9 +import com.google.common.base.Splitter;
8 10 import com.google.common.collect.ArrayListMultimap;
9 11 import com.vividsolutions.jts.geom.Coordinate;
10 12 import com.vividsolutions.jts.geom.GeometryFactory;
... ... @@ -14,6 +16,7 @@ import org.apache.commons.lang3.StringUtils;
14 16 import org.slf4j.Logger;
15 17 import org.slf4j.LoggerFactory;
16 18 import org.springframework.beans.factory.annotation.Autowired;
  19 +import org.springframework.jdbc.core.BeanPropertyRowMapper;
17 20 import org.springframework.jdbc.core.JdbcTemplate;
18 21 import org.springframework.jdbc.core.RowMapper;
19 22 import org.springframework.stereotype.Component;
... ... @@ -42,6 +45,8 @@ public class GeoCacheData {
42 45  
43 46 //线路站点路由
44 47 private static ArrayListMultimap<String, StationRoute> stationCacheMap;
  48 + //线路前置进站围栏
  49 + public static ArrayListMultimap<String, PreconditionGeo> premiseGeoMap;
45 50  
46 51 //线路_上下行_站点编码 ——> 站点
47 52 private static Map<String, StationRoute> routeCodeMap;
... ... @@ -56,7 +61,6 @@ public class GeoCacheData {
56 61  
57 62 //需要定时刷新的站点路由
58 63 public static Map<String, TimedEnableStationRoute> tesMap = new HashMap<>();
59   - //TimedEnableStationRoute
60 64  
61 65 @Autowired
62 66 JdbcTemplate jdbcTemplate;
... ... @@ -68,10 +72,6 @@ public class GeoCacheData {
68 72 public static void putGps(GpsEntity gps) {
69 73 CircleQueue<GpsEntity> queue = gpsCacheMap.get(gps.getNbbm());
70 74 if (queue == null) {
71   - /*//第一个点从站内开始
72   - if (gps.getInstation() == 0)
73   - return;*/
74   -
75 75 queue = new CircleQueue<>(CACHE_SIZE);
76 76 gpsCacheMap.put(gps.getNbbm(), queue);
77 77 }
... ... @@ -146,6 +146,61 @@ public class GeoCacheData {
146 146  
147 147 //加载路段信息
148 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 + }
149 204 }
150 205  
151 206 private void loadRoadsData() {
... ...
src/main/java/com/bsth/data/gpsdata/arrival/SignalHandle.java
... ... @@ -78,6 +78,7 @@ public abstract class SignalHandle {
78 78 byte updown = Byte.parseByte(sch.getXlDir());
79 79 //gps 切换走向
80 80 gps.setUpDown(updown);
  81 + gps.setPremiseCode(null);
81 82  
82 83 List<StationRoute> srs = GeoCacheData.getStationRoute(sch.getXlBm(), updown);
83 84 StationRoute station = GeoUtils.gpsInStation(gps, srs);
... ...
src/main/java/com/bsth/data/gpsdata/arrival/entity/StationRoute.java
... ... @@ -60,6 +60,11 @@ public class StationRoute {
60 60  
61 61 private String name;
62 62  
  63 + /**
  64 + * 是否有前置进站约束
  65 + */
  66 + private boolean premise;
  67 +
63 68 public String getCode() {
64 69 return code;
65 70 }
... ... @@ -147,5 +152,13 @@ public class StationRoute {
147 152 public void setName(String name) {
148 153 this.name = name;
149 154 }
  155 +
  156 + public boolean isPremise() {
  157 + return premise;
  158 + }
  159 +
  160 + public void setPremise(boolean premise) {
  161 + this.premise = premise;
  162 + }
150 163 }
151 164  
... ...
src/main/java/com/bsth/data/gpsdata/arrival/handlers/InOutStationSignalHandle.java
... ... @@ -4,6 +4,7 @@ import com.bsth.data.LineConfigData;
4 4 import com.bsth.data.gpsdata.GpsEntity;
5 5 import com.bsth.data.gpsdata.arrival.GeoCacheData;
6 6 import com.bsth.data.gpsdata.arrival.SignalHandle;
  7 +import com.bsth.data.gpsdata.arrival.entity.StationRoute;
7 8 import com.bsth.data.gpsdata.arrival.utils.CircleQueue;
8 9 import com.bsth.data.gpsdata.arrival.utils.ScheduleSignalState;
9 10 import com.bsth.data.gpsdata.arrival.utils.SignalSchPlanMatcher;
... ... @@ -148,6 +149,7 @@ public class InOutStationSignalHandle extends SignalHandle{
148 149 && (gps.getInstation()==0 || !gps.getStopNo().equals(prev.getStopNo()))
149 150 && !willDepart(gps, prev, sch)){
150 151  
  152 + gps.setPremiseCode(null);
151 153 //发车班次匹配
152 154 signalSchPlanMatcher.outMatch(gps, sch);
153 155 sch = dayOfSchedule.executeCurr(gps.getNbbm());
... ... @@ -234,6 +236,10 @@ public class InOutStationSignalHandle extends SignalHandle{
234 236 * @return
235 237 */
236 238 private boolean outManyFit(GpsEntity gps, ScheduleRealInfo sch) {
  239 + LineConfig conf = lineConfigData.get(sch.getXlBm());
  240 + if(null != conf && conf.isLockFirstOutTime())
  241 + return false;//锁定第一个发车信号,不匹配最佳
  242 +
237 243 if(StringUtils.isNotEmpty(sch.getZdsjActual()))
238 244 return false;
239 245  
... ... @@ -289,7 +295,7 @@ public class InOutStationSignalHandle extends SignalHandle{
289 295 ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
290 296  
291 297 if(gps.getStopNo().equals(sch.getZdzCode())
292   - && !gps.getStopNo().equals(prev.getStopNo())){
  298 + && (!gps.getStopNo().equals(prev.getStopNo()) || gps.getStopNo().equals(prev.getPremiseCode()))){
293 299  
294 300 int diff = 0;
295 301 try{
... ... @@ -305,6 +311,11 @@ public class InOutStationSignalHandle extends SignalHandle{
305 311 if(Math.abs(diff) > MAX_NORMAL_DIFF)
306 312 return;
307 313  
  314 + //校验进站前置约束
  315 + if(!validInPremise(gps)){
  316 + return;
  317 + }
  318 +
308 319 //环线或内外圈 ,飘出去再回来
309 320 if(sch.getQdzCode().equals(sch.getZdzCode())
310 321 && StringUtils.isNotEmpty(sch.getFcsjActual())
... ... @@ -409,6 +420,28 @@ public class InOutStationSignalHandle extends SignalHandle{
409 420 }
410 421  
411 422 /**
  423 + * 校验进站前置约束
  424 + * @param gps
  425 + * @return
  426 + */
  427 + private boolean validInPremise(GpsEntity gps) {
  428 + StationRoute sr = gps.getStation();
  429 + if(null == sr || !sr.isPremise())
  430 + return true;
  431 +
  432 + String premiseCode = gps.getPremiseCode();
  433 +
  434 + if(StringUtils.isNotEmpty(premiseCode) && premiseCode.equals(gps.getStopNo())){
  435 + logger.info("满足前置进站约束 " + premiseCode);
  436 + return true;
  437 + }
  438 + else{
  439 + logger.info(gps.getNbbm() + " not premiseCode 不满足前置进站约束 " + premiseCode);
  440 + }
  441 + return false;
  442 + }
  443 +
  444 + /**
412 445 * 和当前进站信号最匹配的一个班次
413 446 * @param gps
414 447 * @param halfList
... ...
src/main/java/com/bsth/data/gpsdata/arrival/handlers/StationInsideHandle.java
... ... @@ -6,6 +6,8 @@ import com.bsth.data.gpsdata.arrival.SignalHandle;
6 6 import com.bsth.data.gpsdata.arrival.entity.StationRoute;
7 7 import com.bsth.data.gpsdata.arrival.utils.CircleQueue;
8 8 import com.bsth.data.gpsdata.arrival.utils.GeoUtils;
  9 +import org.slf4j.Logger;
  10 +import org.slf4j.LoggerFactory;
9 11 import org.springframework.stereotype.Component;
10 12  
11 13 import java.util.List;
... ... @@ -17,6 +19,7 @@ import java.util.List;
17 19 @Component
18 20 public class StationInsideHandle extends SignalHandle {
19 21  
  22 + Logger logger = LoggerFactory.getLogger(this.getClass());
20 23  
21 24 @Override
22 25 public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) {
... ... @@ -37,13 +40,41 @@ public class StationInsideHandle extends SignalHandle {
37 40 gps.setStation(station);
38 41 }
39 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 +/*
40 71 //在场,站外
41 72 if(gps.getInstation() == 0 && isNotEmpty(prevs)){
42 73 //继承上一个点的站点编码
43 74 GpsEntity prev = prevs.getTail();
44 75 gps.setStopNo(prev.getStopNo());
45 76 }
46   -
  77 +*/
47 78 return true;
48 79 }
49 80 }
... ...
src/main/java/com/bsth/data/gpsdata/arrival/precondition/InPreconditionHandler.java 0 → 100644
  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/precondition/entity/PreconditionGeo.java 0 → 100644
  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 +}
... ...
src/main/java/com/bsth/data/gpsdata/arrival/utils/GeoUtils.java
... ... @@ -3,6 +3,7 @@ package com.bsth.data.gpsdata.arrival.utils;
3 3 import com.bsth.data.gpsdata.GpsEntity;
4 4 import com.bsth.data.gpsdata.arrival.GeoCacheData;
5 5 import com.bsth.data.gpsdata.arrival.entity.StationRoute;
  6 +import com.bsth.data.gpsdata.arrival.precondition.entity.PreconditionGeo;
6 7 import com.vividsolutions.jts.geom.Coordinate;
7 8 import com.vividsolutions.jts.geom.GeometryFactory;
8 9 import com.vividsolutions.jts.geom.LineString;
... ... @@ -169,6 +170,28 @@ public class GeoUtils {
169 170 }
170 171  
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 + /**
172 195 * 是否是有效的连续点
173 196 * @param prevGps
174 197 * @param gps
... ...
src/main/java/com/bsth/data/gpsdata/recovery/GpsDataRecovery.java
... ... @@ -60,7 +60,7 @@ public class GpsDataRecovery implements ApplicationContextAware {
60 60 for (String nbbm : keys) {
61 61 Collections.sort(listMap.get(nbbm), comp);
62 62 threadPool.execute(new RecoveryThread(listMap.get(nbbm), count));
63   - /*if(nbbm.equals("S0K-004"))
  63 + /*if(nbbm.equals("W2H-015"))
64 64 new RecoveryThread(listMap.get(nbbm), count).run();*/
65 65 /*if(lineId.equals("60028"))
66 66 new RecoveryThread(listMap.get(lineId), count).run();*/
... ... @@ -84,7 +84,7 @@ public class GpsDataRecovery implements ApplicationContextAware {
84 84 Calendar calendar = Calendar.getInstance();
85 85 int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
86 86  
87   - String sql = "select DEVICE_ID,LAT,LON,TS,SPEED_GPS,LINE_ID,SERVICE_STATE from bsth_c_gps_info where days_year=246";// + dayOfYear;
  87 + String sql = "select DEVICE_ID,LAT,LON,TS,SPEED_GPS,LINE_ID,SERVICE_STATE from bsth_c_gps_info where days_year=267";// + dayOfYear;
88 88 JdbcTemplate jdbcTemplate = new JdbcTemplate(DBUtils_MS.getDataSource());
89 89  
90 90 List<GpsEntity> list =
... ... @@ -153,7 +153,7 @@ public class GpsDataRecovery implements ApplicationContextAware {
153 153 boolean task;
154 154 for (GpsEntity gps : list) {
155 155 try {
156   - /*if(gps.getTimestamp() >= 1504298280000L){
  156 + /*if(gps.getTimestamp() >= 1506216540000L){
157 157 System.out.println("debugger...");
158 158 }*/
159 159 //是否有任务
... ...
src/main/java/com/bsth/entity/realcontrol/LineConfig.java
... ... @@ -89,6 +89,11 @@ public class LineConfig {
89 89 private int upStopMinute;
90 90 private int downStopMinute;
91 91  
  92 + /**
  93 + * 使用第一个发车时间,不匹配最佳时间
  94 + */
  95 + private boolean lockFirstOutTime;
  96 +
92 97  
93 98 @OneToMany(cascade = CascadeType.ALL)
94 99 private Set<D80ReplyTemp> d80Temps = new HashSet<>();
... ... @@ -281,4 +286,12 @@ public class LineConfig {
281 286 public void setTwinsStation(String twinsStation) {
282 287 this.twinsStation = twinsStation;
283 288 }
  289 +
  290 + public boolean isLockFirstOutTime() {
  291 + return lockFirstOutTime;
  292 + }
  293 +
  294 + public void setLockFirstOutTime(boolean lockFirstOutTime) {
  295 + this.lockFirstOutTime = lockFirstOutTime;
  296 + }
284 297 }
... ...
src/main/java/com/bsth/entity/realcontrol/ScheduleRealInfo.java
... ... @@ -642,7 +642,8 @@ public class ScheduleRealInfo {
642 642 public void calcEndTime(){
643 643 //计划终点时间
644 644 if(this.getBcsj() != null){
645   - this.setZdsjT(this.getDfsjT() + (this.getBcsj() * 60 * 1000));
  645 + //this.setZdsjT(this.getDfsjT() + (this.getBcsj() * 60 * 1000));
  646 + this.setZdsjT(this.getFcsjT() + (this.getBcsj() * 60 * 1000));//计划终点时间不变
646 647 this.setZdsj(fmtHHmm.print(this.zdsjT));
647 648 }
648 649 }
... ...
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
... ... @@ -251,12 +251,12 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
251 251 List<ScheduleRealInfo> ts = new ArrayList<>();
252 252 ts.add(schedule);
253 253 //调整终点时间和下一个班次的应到时间
254   - schedule.calcEndTime();
255   - ScheduleRealInfo nextSch = dayOfSchedule.nextByLp2(schedule);
  254 + //schedule.calcEndTime();
  255 + /*ScheduleRealInfo nextSch = dayOfSchedule.nextByLp2(schedule);
256 256 if (null != nextSch) {
257 257 nextSch.setQdzArrDatejh(schedule.getZdsj());
258 258 ts.add(nextSch);
259   - }
  259 + }*/
260 260  
261 261 //调整班次类型
262 262 if (StringUtils.isNotEmpty(bcType) && !bcType.equals(schedule.getBcType())) {
... ...