Commit 901928ec4e1f6642259bb5ebf2d237662631b867
Merge branch 'minhang' of http://222.66.0.204:8090//panzhaov5/bsth_control into minhang
Showing
13 changed files
with
237 additions
and
65 deletions
src/main/java/com/bsth/XDApplication.java
| @@ -86,11 +86,14 @@ public class XDApplication implements CommandLineRunner { | @@ -86,11 +86,14 @@ public class XDApplication implements CommandLineRunner { | ||
| 86 | } | 86 | } |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | + //@Autowired | ||
| 90 | + //DayOfSchedule dayOfSchedule; | ||
| 89 | public void devInit(){ | 91 | public void devInit(){ |
| 90 | log.info("devInit..."); | 92 | log.info("devInit..."); |
| 91 | ScheduledExecutorService sexec = Application.mainServices; | 93 | ScheduledExecutorService sexec = Application.mainServices; |
| 92 | //抓取GPS数据 | 94 | //抓取GPS数据 |
| 93 | gpsDataLoader.setFlag(-1); | 95 | gpsDataLoader.setFlag(-1); |
| 96 | + //dayOfSchedule.dataRecovery(); | ||
| 94 | //sexec.scheduleWithFixedDelay(gpsDataLoader, 30, 2, TimeUnit.SECONDS); | 97 | //sexec.scheduleWithFixedDelay(gpsDataLoader, 30, 2, TimeUnit.SECONDS); |
| 95 | //实际排班更新线程 | 98 | //实际排班更新线程 |
| 96 | //sexec.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS); | 99 | //sexec.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS); |
| @@ -98,7 +101,8 @@ public class XDApplication implements CommandLineRunner { | @@ -98,7 +101,8 @@ public class XDApplication implements CommandLineRunner { | ||
| 98 | //sexec.scheduleWithFixedDelay(schedulePstThread, 60, 15, TimeUnit.SECONDS); | 101 | //sexec.scheduleWithFixedDelay(schedulePstThread, 60, 15, TimeUnit.SECONDS); |
| 99 | //班次修正日志延迟入库 | 102 | //班次修正日志延迟入库 |
| 100 | //sexec.scheduleWithFixedDelay(seiPstThread, 60, 30, TimeUnit.SECONDS); | 103 | //sexec.scheduleWithFixedDelay(seiPstThread, 60, 30, TimeUnit.SECONDS); |
| 101 | - | 104 | + //调度指令延迟入库 |
| 105 | + //sexec.scheduleWithFixedDelay(directivesPstThread, 180, 180, TimeUnit.SECONDS); | ||
| 102 | //线程监听(防止重要的线程阻塞、异常结束。以及部分主备切换工作) | 106 | //线程监听(防止重要的线程阻塞、异常结束。以及部分主备切换工作) |
| 103 | //sexec.scheduleWithFixedDelay(threadMonotor, 240, 60, TimeUnit.SECONDS); | 107 | //sexec.scheduleWithFixedDelay(threadMonotor, 240, 60, TimeUnit.SECONDS); |
| 104 | } | 108 | } |
| @@ -116,7 +120,7 @@ public class XDApplication implements CommandLineRunner { | @@ -116,7 +120,7 @@ public class XDApplication implements CommandLineRunner { | ||
| 116 | sexec.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS); | 120 | sexec.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS); |
| 117 | //班次延迟入库线程 | 121 | //班次延迟入库线程 |
| 118 | sexec.scheduleWithFixedDelay(schedulePstThread, 60, 10, TimeUnit.SECONDS); | 122 | sexec.scheduleWithFixedDelay(schedulePstThread, 60, 10, TimeUnit.SECONDS); |
| 119 | - //班次修正日志延迟入库 | 123 | + //班次修正日志入库 |
| 120 | sexec.scheduleWithFixedDelay(seiPstThread, 60, 60, TimeUnit.SECONDS); | 124 | sexec.scheduleWithFixedDelay(seiPstThread, 60, 60, TimeUnit.SECONDS); |
| 121 | //检查班次误点 | 125 | //检查班次误点 |
| 122 | sexec.scheduleWithFixedDelay(scheduleLateThread, 60, 30, TimeUnit.SECONDS); | 126 | sexec.scheduleWithFixedDelay(scheduleLateThread, 60, 30, TimeUnit.SECONDS); |
src/main/java/com/bsth/data/directive/DirectivesPstThread.java
| @@ -34,6 +34,7 @@ public class DirectivesPstThread extends Thread { | @@ -34,6 +34,7 @@ public class DirectivesPstThread extends Thread { | ||
| 34 | 34 | ||
| 35 | @Override | 35 | @Override |
| 36 | public void run() { | 36 | public void run() { |
| 37 | + | ||
| 37 | LinkedList<Directive> list = DayOfDirectives.pstDirectives; | 38 | LinkedList<Directive> list = DayOfDirectives.pstDirectives; |
| 38 | 39 | ||
| 39 | Directive directive; | 40 | Directive directive; |
| @@ -46,8 +47,10 @@ public class DirectivesPstThread extends Thread { | @@ -46,8 +47,10 @@ public class DirectivesPstThread extends Thread { | ||
| 46 | if(d60.isDispatch()){ | 47 | if(d60.isDispatch()){ |
| 47 | ScheduleRealInfo sch = d60.getSch(); | 48 | ScheduleRealInfo sch = d60.getSch(); |
| 48 | //如果关联的班次已经不存在了,放弃入库 | 49 | //如果关联的班次已经不存在了,放弃入库 |
| 49 | - if(dayOfSchedule.get(sch.getId()) == null) | 50 | + if(dayOfSchedule.get(sch.getId()) == null){ |
| 51 | + logger.warn("班次:" + sch.getId() + "不存在了,调度指令放弃入库。"); | ||
| 50 | continue; | 52 | continue; |
| 53 | + } | ||
| 51 | } | 54 | } |
| 52 | d60Repository.save(d60); | 55 | d60Repository.save(d60); |
| 53 | } | 56 | } |
src/main/java/com/bsth/data/gpsdata/arrival/GpsRealAnalyse.java
| @@ -117,29 +117,31 @@ public class GpsRealAnalyse { | @@ -117,29 +117,31 @@ public class GpsRealAnalyse { | ||
| 117 | try { | 117 | try { |
| 118 | Collections.sort(list, comp); | 118 | Collections.sort(list, comp); |
| 119 | for (GpsEntity gps : list) { | 119 | for (GpsEntity gps : list) { |
| 120 | - //是否有任务 | ||
| 121 | - boolean task; | ||
| 122 | - CircleQueue<GpsEntity> prevs = GeoCacheData.getGps(gps.getNbbm()); | ||
| 123 | - //掉线处理 | ||
| 124 | - offlineSignalHandle.handle(gps, prevs); | ||
| 125 | - //状态处理 | ||
| 126 | - task = correctSignalHandle.handle(gps, prevs); | ||
| 127 | - //场,站内外判断 | ||
| 128 | - stationInsideHandle.handle(gps, prevs); | ||
| 129 | - //异常判定(越界/超速) | ||
| 130 | - abnormalStateHandle.handle(gps, prevs); | ||
| 131 | - | ||
| 132 | - if (!task) | ||
| 133 | - continue; //无任务的,到这里就结束 | ||
| 134 | - | ||
| 135 | - //反向处理 | ||
| 136 | - reverseSignalHandle.handle(gps, prevs); | ||
| 137 | - //进出站动作处理 | ||
| 138 | - inOutStationSignalHandle.handle(gps, prevs); | ||
| 139 | - GeoCacheData.putGps(gps); | 120 | + try { |
| 121 | + //是否有任务 | ||
| 122 | + boolean task; | ||
| 123 | + CircleQueue<GpsEntity> prevs = GeoCacheData.getGps(gps.getNbbm()); | ||
| 124 | + //掉线处理 | ||
| 125 | + offlineSignalHandle.handle(gps, prevs); | ||
| 126 | + //状态处理 | ||
| 127 | + task = correctSignalHandle.handle(gps, prevs); | ||
| 128 | + //场,站内外判断 | ||
| 129 | + stationInsideHandle.handle(gps, prevs); | ||
| 130 | + //异常判定(越界/超速) | ||
| 131 | + abnormalStateHandle.handle(gps, prevs); | ||
| 132 | + | ||
| 133 | + if (!task) | ||
| 134 | + continue; //无任务的,到这里就结束 | ||
| 135 | + | ||
| 136 | + //反向处理 | ||
| 137 | + reverseSignalHandle.handle(gps, prevs); | ||
| 138 | + //进出站动作处理 | ||
| 139 | + inOutStationSignalHandle.handle(gps, prevs); | ||
| 140 | + GeoCacheData.putGps(gps); | ||
| 141 | + }catch (Exception e){ | ||
| 142 | + logger.error("", e); | ||
| 143 | + } | ||
| 140 | } | 144 | } |
| 141 | - } catch (Exception e) { | ||
| 142 | - logger.error("", e); | ||
| 143 | } finally { | 145 | } finally { |
| 144 | if (count != null) | 146 | if (count != null) |
| 145 | count.countDown(); | 147 | count.countDown(); |
src/main/java/com/bsth/data/gpsdata/arrival/handlers/InOutStationSignalHandle.java
| @@ -46,7 +46,7 @@ public class InOutStationSignalHandle extends SignalHandle{ | @@ -46,7 +46,7 @@ public class InOutStationSignalHandle extends SignalHandle{ | ||
| 46 | @Autowired | 46 | @Autowired |
| 47 | SignalSchPlanMatcher signalSchPlanMatcher; | 47 | SignalSchPlanMatcher signalSchPlanMatcher; |
| 48 | 48 | ||
| 49 | - private final static int MAX_BEFORE_TIME = 1000 * 60 * 72; | 49 | + private final static int MAX_BEFORE_TIME = 1000 * 60 * 120; |
| 50 | 50 | ||
| 51 | //最大的班次时间差,防止异常的GPS时间打乱数据 | 51 | //最大的班次时间差,防止异常的GPS时间打乱数据 |
| 52 | private final static int MAX_NORMAL_DIFF = 1000 * 60 * 60 * 12; | 52 | private final static int MAX_NORMAL_DIFF = 1000 * 60 * 60 * 12; |
| @@ -113,8 +113,8 @@ public class InOutStationSignalHandle extends SignalHandle{ | @@ -113,8 +113,8 @@ public class InOutStationSignalHandle extends SignalHandle{ | ||
| 113 | 113 | ||
| 114 | int diff = (int) (sch.getDfsjT() - gps.getTimestamp()); | 114 | int diff = (int) (sch.getDfsjT() - gps.getTimestamp()); |
| 115 | 115 | ||
| 116 | - //首班出场最多提前1.2小时 | ||
| 117 | - if(dayOfSchedule.isFirstOut(sch) && diff > MAX_BEFORE_TIME) | 116 | + //首班出场最多提前2小时 |
| 117 | + if((dayOfSchedule.isFirstOut(sch) && diff > MAX_BEFORE_TIME) || diff > MAX_BEFORE_TIME / 2) | ||
| 118 | return; | 118 | return; |
| 119 | 119 | ||
| 120 | //正常班次最大时间差 | 120 | //正常班次最大时间差 |
| @@ -129,9 +129,11 @@ public class InOutStationSignalHandle extends SignalHandle{ | @@ -129,9 +129,11 @@ public class InOutStationSignalHandle extends SignalHandle{ | ||
| 129 | signalSchPlanMatcher.outMatch(gps, sch); | 129 | signalSchPlanMatcher.outMatch(gps, sch); |
| 130 | sch = dayOfSchedule.executeCurr(gps.getNbbm()); | 130 | sch = dayOfSchedule.executeCurr(gps.getNbbm()); |
| 131 | 131 | ||
| 132 | - //实发时间不覆盖 | ||
| 133 | - if(StringUtils.isNotEmpty(sch.getFcsjActual())) | 132 | + //班次已经实发 |
| 133 | + if(StringUtils.isNotEmpty(sch.getFcsjActual()) | ||
| 134 | + && !outManyFit(gps, sch)){ | ||
| 134 | return; | 135 | return; |
| 136 | + } | ||
| 135 | 137 | ||
| 136 | //应用到离站缓冲区设置参数 | 138 | //应用到离站缓冲区设置参数 |
| 137 | long rsT = lineConfigData.applyOut(sch, gps.getTimestamp()); | 139 | long rsT = lineConfigData.applyOut(sch, gps.getTimestamp()); |
| @@ -185,6 +187,26 @@ public class InOutStationSignalHandle extends SignalHandle{ | @@ -185,6 +187,26 @@ public class InOutStationSignalHandle extends SignalHandle{ | ||
| 185 | } | 187 | } |
| 186 | } | 188 | } |
| 187 | 189 | ||
| 190 | + /** | ||
| 191 | + * 是否是一个更合适的发车信号 | ||
| 192 | + * @param gps | ||
| 193 | + * @param sch | ||
| 194 | + * @return | ||
| 195 | + */ | ||
| 196 | + private boolean outManyFit(GpsEntity gps, ScheduleRealInfo sch) { | ||
| 197 | + if(StringUtils.isNotEmpty(sch.getZdsjActual())) | ||
| 198 | + return false; | ||
| 199 | + | ||
| 200 | + long t1 = sch.getFcsjActualTime(); | ||
| 201 | + long t2 = gps.getTimestamp(); | ||
| 202 | + long c = sch.getDfsjT(); | ||
| 203 | + | ||
| 204 | + if(c - t1 > 1000 * 60 * 15 && Math.abs(t2 - c) < 1000 * 60 * 5){ | ||
| 205 | + return true; | ||
| 206 | + } | ||
| 207 | + return false; | ||
| 208 | + } | ||
| 209 | + | ||
| 188 | 210 | ||
| 189 | private void outStationAndOutPark(ScheduleRealInfo sch){ | 211 | private void outStationAndOutPark(ScheduleRealInfo sch){ |
| 190 | LineConfig config = lineConfigData.get(sch.getXlBm()); | 212 | LineConfig config = lineConfigData.get(sch.getXlBm()); |
| @@ -230,7 +252,7 @@ public class InOutStationSignalHandle extends SignalHandle{ | @@ -230,7 +252,7 @@ public class InOutStationSignalHandle extends SignalHandle{ | ||
| 230 | logger.info("NullPointerException " + sch.getXlName() + " 有班次无班次历时,,,检查一下是否需要出站既出场。"); | 252 | logger.info("NullPointerException " + sch.getXlName() + " 有班次无班次历时,,,检查一下是否需要出站既出场。"); |
| 231 | } | 253 | } |
| 232 | //进场最多提前1.2小时 | 254 | //进场最多提前1.2小时 |
| 233 | - if(sch.getBcType().equals("in") && diff > MAX_BEFORE_TIME) | 255 | + if((sch.getBcType().equals("in") && diff > MAX_BEFORE_TIME) || diff > MAX_BEFORE_TIME/2) |
| 234 | return; | 256 | return; |
| 235 | 257 | ||
| 236 | //正常班次最大时间差 | 258 | //正常班次最大时间差 |
src/main/java/com/bsth/data/gpsdata/arrival/utils/SignalSchPlanMatcher.java
| @@ -3,6 +3,8 @@ package com.bsth.data.gpsdata.arrival.utils; | @@ -3,6 +3,8 @@ package com.bsth.data.gpsdata.arrival.utils; | ||
| 3 | import com.bsth.data.gpsdata.GpsEntity; | 3 | import com.bsth.data.gpsdata.GpsEntity; |
| 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 org.slf4j.Logger; | ||
| 7 | +import org.slf4j.LoggerFactory; | ||
| 6 | import org.springframework.beans.factory.annotation.Autowired; | 8 | import org.springframework.beans.factory.annotation.Autowired; |
| 7 | import org.springframework.stereotype.Component; | 9 | import org.springframework.stereotype.Component; |
| 8 | 10 | ||
| @@ -16,6 +18,8 @@ public class SignalSchPlanMatcher { | @@ -16,6 +18,8 @@ public class SignalSchPlanMatcher { | ||
| 16 | @Autowired | 18 | @Autowired |
| 17 | DayOfSchedule dayOfSchedule; | 19 | DayOfSchedule dayOfSchedule; |
| 18 | 20 | ||
| 21 | + Logger log = LoggerFactory.getLogger(this.getClass()); | ||
| 22 | + | ||
| 19 | /** | 23 | /** |
| 20 | * 发车信号匹配 | 24 | * 发车信号匹配 |
| 21 | * @param outSigal | 25 | * @param outSigal |
| @@ -27,6 +31,25 @@ public class SignalSchPlanMatcher { | @@ -27,6 +31,25 @@ public class SignalSchPlanMatcher { | ||
| 27 | if(t < sch.getDfsjT()) | 31 | if(t < sch.getDfsjT()) |
| 28 | return; | 32 | return; |
| 29 | 33 | ||
| 34 | + try{ | ||
| 35 | + //会不会是分班没有完成 | ||
| 36 | + if(sch.getBcType().equals("in")){ | ||
| 37 | + ScheduleRealInfo fbFirst = dayOfSchedule.nextByBcType(sch, "normal"); | ||
| 38 | + | ||
| 39 | + if(fbFirst == null) | ||
| 40 | + return; | ||
| 41 | + | ||
| 42 | + long dt = fbFirst.getDfsjT(); | ||
| 43 | + //前5后10 -执行分班的首个营运 | ||
| 44 | + if(dt - t < 1000 * 60 * 5 || t - dt < 1000 * 60 * 10){ | ||
| 45 | + dayOfSchedule.addExecPlan(fbFirst); | ||
| 46 | + return; | ||
| 47 | + } | ||
| 48 | + } | ||
| 49 | + }catch (Exception e){ | ||
| 50 | + log.error("", e); | ||
| 51 | + } | ||
| 52 | + | ||
| 30 | //下一个相同走向的班次 | 53 | //下一个相同走向的班次 |
| 31 | ScheduleRealInfo next = dayOfSchedule.nextSame(sch); | 54 | ScheduleRealInfo next = dayOfSchedule.nextSame(sch); |
| 32 | if(next == null || !next.getQdzCode().equals(sch.getQdzCode())) | 55 | if(next == null || !next.getQdzCode().equals(sch.getQdzCode())) |
src/main/java/com/bsth/data/gpsdata/recovery/GpsDataRecovery.java
| @@ -60,8 +60,10 @@ public class GpsDataRecovery implements ApplicationContextAware { | @@ -60,8 +60,10 @@ public class GpsDataRecovery implements ApplicationContextAware { | ||
| 60 | for (String lineId : keys) { | 60 | for (String lineId : keys) { |
| 61 | Collections.sort(listMap.get(lineId), comp); | 61 | Collections.sort(listMap.get(lineId), comp); |
| 62 | threadPool.execute(new RecoveryThread(listMap.get(lineId), count)); | 62 | threadPool.execute(new RecoveryThread(listMap.get(lineId), count)); |
| 63 | - /*if(nbbm.equals("W7C-001")) | 63 | + /*if(nbbm.equals("W7E-016")) |
| 64 | new RecoveryThread(listMap.get(nbbm), count).run();*/ | 64 | new RecoveryThread(listMap.get(nbbm), count).run();*/ |
| 65 | + /*if(lineId.equals("60028")) | ||
| 66 | + new RecoveryThread(listMap.get(lineId), count).run();*/ | ||
| 65 | } | 67 | } |
| 66 | 68 | ||
| 67 | try { | 69 | try { |
| @@ -82,7 +84,7 @@ public class GpsDataRecovery implements ApplicationContextAware { | @@ -82,7 +84,7 @@ public class GpsDataRecovery implements ApplicationContextAware { | ||
| 82 | Calendar calendar = Calendar.getInstance(); | 84 | Calendar calendar = Calendar.getInstance(); |
| 83 | int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR); | 85 | int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR); |
| 84 | 86 | ||
| 85 | - String sql = "select DEVICE_ID,LAT,LON,TS,SPEED_GPS,LINE_ID,SERVICE_STATE from bsth_c_gps_info where days_year=" + dayOfYear; | 87 | + String sql = "select DEVICE_ID,LAT,LON,TS,SPEED_GPS,LINE_ID,SERVICE_STATE from bsth_c_gps_info where days_year=143";// + dayOfYear; |
| 86 | JdbcTemplate jdbcTemplate = new JdbcTemplate(DBUtils_MS.getDataSource()); | 88 | JdbcTemplate jdbcTemplate = new JdbcTemplate(DBUtils_MS.getDataSource()); |
| 87 | 89 | ||
| 88 | List<GpsEntity> list = | 90 | List<GpsEntity> list = |
| @@ -150,30 +152,34 @@ public class GpsDataRecovery implements ApplicationContextAware { | @@ -150,30 +152,34 @@ public class GpsDataRecovery implements ApplicationContextAware { | ||
| 150 | CircleQueue<GpsEntity> prevs; | 152 | CircleQueue<GpsEntity> prevs; |
| 151 | boolean task; | 153 | boolean task; |
| 152 | for (GpsEntity gps : list) { | 154 | for (GpsEntity gps : list) { |
| 153 | - | ||
| 154 | - //是否有任务 | ||
| 155 | - | ||
| 156 | - prevs = GeoCacheData.getGps(gps.getNbbm()); | ||
| 157 | - //掉线处理 | ||
| 158 | - offlineSignalHandle.handle(gps, prevs); | ||
| 159 | - //状态处理 | ||
| 160 | - task = correctSignalHandle.handle(gps, prevs); | ||
| 161 | - //场,站内外判断 | ||
| 162 | - stationInsideHandle.handle(gps, prevs); | ||
| 163 | - //异常判定(越界/超速) | ||
| 164 | - //abnormalStateHandle.handle(gps, prevs); | ||
| 165 | - | ||
| 166 | - if(!task) | ||
| 167 | - continue; //无任务的,到这里就结束 | ||
| 168 | - | ||
| 169 | - //反向处理 | ||
| 170 | - reverseSignalHandle.handle(gps, prevs); | ||
| 171 | - //进出站动作处理 | ||
| 172 | - inOutStationSignalHandle.handle(gps, prevs); | ||
| 173 | - GeoCacheData.putGps(gps); | 155 | + try { |
| 156 | + /*if(gps.getTimestamp() >= 1495512240000L){ | ||
| 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 | + } | ||
| 174 | } | 182 | } |
| 175 | - } catch (Exception e) { | ||
| 176 | - logger.error("", e); | ||
| 177 | } finally { | 183 | } finally { |
| 178 | count.countDown(); | 184 | count.countDown(); |
| 179 | } | 185 | } |
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
| @@ -649,7 +649,12 @@ public class DayOfSchedule { | @@ -649,7 +649,12 @@ public class DayOfSchedule { | ||
| 649 | nbbmScheduleMap.remove(sch.getClZbh(), sch); | 649 | nbbmScheduleMap.remove(sch.getClZbh(), sch); |
| 650 | id2SchedulMap.remove(sch.getId()); | 650 | id2SchedulMap.remove(sch.getId()); |
| 651 | lpScheduleMap.remove(sch.getXlBm() + "_" + sch.getLpName(), sch); | 651 | lpScheduleMap.remove(sch.getXlBm() + "_" + sch.getLpName(), sch); |
| 652 | - //return sch; | 652 | + |
| 653 | + //如果正在执行该班次 | ||
| 654 | + if(carExecutePlanMap.get(sch.getClZbh()) == sch){ | ||
| 655 | + //重新计算车辆当前执行班次 | ||
| 656 | + reCalcExecPlan(sch.getClZbh()); | ||
| 657 | + } | ||
| 653 | } | 658 | } |
| 654 | 659 | ||
| 655 | 660 | ||
| @@ -776,6 +781,26 @@ public class DayOfSchedule { | @@ -776,6 +781,26 @@ public class DayOfSchedule { | ||
| 776 | } | 781 | } |
| 777 | 782 | ||
| 778 | /** | 783 | /** |
| 784 | + * @Title: nextByBcType | ||
| 785 | + * @Description: TODO(获取下一个指定班次类型的班次) | ||
| 786 | + */ | ||
| 787 | + public ScheduleRealInfo nextByBcType(ScheduleRealInfo sch, String bcType) { | ||
| 788 | + List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); | ||
| 789 | + Collections.sort(list, schFCSJComparator); | ||
| 790 | + | ||
| 791 | + boolean flag = false; | ||
| 792 | + for(ScheduleRealInfo temp : list){ | ||
| 793 | + if(temp == sch){ | ||
| 794 | + flag = true; | ||
| 795 | + } | ||
| 796 | + | ||
| 797 | + if(flag && temp.getBcType().equals(bcType)) | ||
| 798 | + return temp; | ||
| 799 | + } | ||
| 800 | + return null; | ||
| 801 | + } | ||
| 802 | + | ||
| 803 | + /** | ||
| 779 | * 搜索离当前时间最近的一个指定类型的班次 | 804 | * 搜索离当前时间最近的一个指定类型的班次 |
| 780 | * @param nbbm | 805 | * @param nbbm |
| 781 | * @param bcType | 806 | * @param bcType |
src/main/java/com/bsth/service/impl/BusIntervalServiceImpl.java
| @@ -113,6 +113,12 @@ public class BusIntervalServiceImpl implements BusIntervalService { | @@ -113,6 +113,12 @@ public class BusIntervalServiceImpl implements BusIntervalService { | ||
| 113 | schedule.setSpId(rs.getLong("sp_id")); | 113 | schedule.setSpId(rs.getLong("sp_id")); |
| 114 | schedule.setSflj(rs.getBoolean("sflj")); | 114 | schedule.setSflj(rs.getBoolean("sflj")); |
| 115 | 115 | ||
| 116 | + if(schedule.getFcsjActual() != null && schedule.getFcsjActual().trim().length() == 0){ | ||
| 117 | + schedule.setFcsjActual(null); | ||
| 118 | + } | ||
| 119 | + if(schedule.getZdsjActual() != null && schedule.getZdsjActual().trim().length() == 0){ | ||
| 120 | + schedule.setZdsjActual(null); | ||
| 121 | + } | ||
| 116 | String[] split1 = schedule.getFcsj().split(":"); | 122 | String[] split1 = schedule.getFcsj().split(":"); |
| 117 | String[] split3 = schedule.getZdsj().split(":"); | 123 | String[] split3 = schedule.getZdsj().split(":"); |
| 118 | long fcsj = Long.valueOf(split1[0]) * 60 + Long.valueOf(split1[1]); | 124 | long fcsj = Long.valueOf(split1[0]) * 60 + Long.valueOf(split1[1]); |
| @@ -669,6 +675,13 @@ public class BusIntervalServiceImpl implements BusIntervalService { | @@ -669,6 +675,13 @@ public class BusIntervalServiceImpl implements BusIntervalService { | ||
| 669 | schedule.setjName(rs.getString("j_name")); | 675 | schedule.setjName(rs.getString("j_name")); |
| 670 | schedule.setStatus(rs.getInt("status")); | 676 | schedule.setStatus(rs.getInt("status")); |
| 671 | schedule.setSpId(rs.getLong("sp_id")); | 677 | schedule.setSpId(rs.getLong("sp_id")); |
| 678 | + | ||
| 679 | + if(schedule.getFcsjActual() != null && schedule.getFcsjActual().trim().length() == 0){ | ||
| 680 | + schedule.setFcsjActual(null); | ||
| 681 | + } | ||
| 682 | + if(schedule.getZdsjActual() != null && schedule.getZdsjActual().trim().length() == 0){ | ||
| 683 | + schedule.setZdsjActual(null); | ||
| 684 | + } | ||
| 672 | if(schedule.getDfsj() != null){ | 685 | if(schedule.getDfsj() != null){ |
| 673 | String[] split0 = schedule.getDfsj().split(":"); | 686 | String[] split0 = schedule.getDfsj().split(":"); |
| 674 | long dfsj = Long.valueOf(split0[0]) * 60 + Long.valueOf(split0[1]); | 687 | long dfsj = Long.valueOf(split0[0]) * 60 + Long.valueOf(split0[1]); |
| @@ -1840,6 +1853,13 @@ public class BusIntervalServiceImpl implements BusIntervalService { | @@ -1840,6 +1853,13 @@ public class BusIntervalServiceImpl implements BusIntervalService { | ||
| 1840 | schedule.setjName(rs.getString("j_name")); | 1853 | schedule.setjName(rs.getString("j_name")); |
| 1841 | schedule.setUpdateDate(rs.getDate("update_date")); | 1854 | schedule.setUpdateDate(rs.getDate("update_date")); |
| 1842 | 1855 | ||
| 1856 | + if(schedule.getFcsjActual() != null && schedule.getFcsjActual().trim().length() == 0){ | ||
| 1857 | + schedule.setFcsjActual(null); | ||
| 1858 | + } | ||
| 1859 | + if(schedule.getZdsjActual() != null && schedule.getZdsjActual().trim().length() == 0){ | ||
| 1860 | + schedule.setZdsjActual(null); | ||
| 1861 | + } | ||
| 1862 | + | ||
| 1843 | return schedule; | 1863 | return schedule; |
| 1844 | } | 1864 | } |
| 1845 | }); | 1865 | }); |
src/main/java/com/bsth/service/schedule/impl/PeopleCarPlanServiceImpl.java
| @@ -81,6 +81,12 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { | @@ -81,6 +81,12 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { | ||
| 81 | schedule.setsName(rs.getString("s_name")); | 81 | schedule.setsName(rs.getString("s_name")); |
| 82 | schedule.setSpId(rs.getLong("sp_id")); | 82 | schedule.setSpId(rs.getLong("sp_id")); |
| 83 | 83 | ||
| 84 | + if(schedule.getFcsjActual() != null && schedule.getFcsjActual().trim().length() == 0){ | ||
| 85 | + schedule.setFcsjActual(null); | ||
| 86 | + } | ||
| 87 | + if(schedule.getZdsjActual() != null && schedule.getZdsjActual().trim().length() == 0){ | ||
| 88 | + schedule.setZdsjActual(null); | ||
| 89 | + } | ||
| 84 | if(schedule.getFcsj() != null && schedule.getZdsj() != null){ | 90 | if(schedule.getFcsj() != null && schedule.getZdsj() != null){ |
| 85 | String[] split1 = schedule.getFcsj().split(":"); | 91 | String[] split1 = schedule.getFcsj().split(":"); |
| 86 | String[] split2 = schedule.getZdsj().split(":"); | 92 | String[] split2 = schedule.getZdsj().split(":"); |
| @@ -548,6 +554,12 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { | @@ -548,6 +554,12 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { | ||
| 548 | schedule.setQdzName(rs.getString("qdz_name")); | 554 | schedule.setQdzName(rs.getString("qdz_name")); |
| 549 | schedule.setSpId(rs.getLong("sp_id")); | 555 | schedule.setSpId(rs.getLong("sp_id")); |
| 550 | 556 | ||
| 557 | + if(schedule.getFcsjActual() != null && schedule.getFcsjActual().trim().length() == 0){ | ||
| 558 | + schedule.setFcsjActual(null); | ||
| 559 | + } | ||
| 560 | + if(schedule.getZdsjActual() != null && schedule.getZdsjActual().trim().length() == 0){ | ||
| 561 | + schedule.setZdsjActual(null); | ||
| 562 | + } | ||
| 551 | if(schedule.getFcsj() != null && schedule.getZdsj() != null){ | 563 | if(schedule.getFcsj() != null && schedule.getZdsj() != null){ |
| 552 | String[] split1 = schedule.getFcsj().split(":"); | 564 | String[] split1 = schedule.getFcsj().split(":"); |
| 553 | String[] split2 = schedule.getZdsj().split(":"); | 565 | String[] split2 = schedule.getZdsj().split(":"); |
| @@ -831,6 +843,12 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { | @@ -831,6 +843,12 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { | ||
| 831 | schedule.setQdzName(rs.getString("qdz_name")); | 843 | schedule.setQdzName(rs.getString("qdz_name")); |
| 832 | schedule.setSpId(rs.getLong("sp_id")); | 844 | schedule.setSpId(rs.getLong("sp_id")); |
| 833 | 845 | ||
| 846 | + if(schedule.getFcsjActual() != null && schedule.getFcsjActual().trim().length() == 0){ | ||
| 847 | + schedule.setFcsjActual(null); | ||
| 848 | + } | ||
| 849 | + if(schedule.getZdsjActual() != null && schedule.getZdsjActual().trim().length() == 0){ | ||
| 850 | + schedule.setZdsjActual(null); | ||
| 851 | + } | ||
| 834 | if(schedule.getFcsj() != null && schedule.getZdsj() != null){ | 852 | if(schedule.getFcsj() != null && schedule.getZdsj() != null){ |
| 835 | String[] split1 = schedule.getFcsj().split(":"); | 853 | String[] split1 = schedule.getFcsj().split(":"); |
| 836 | String[] split2 = schedule.getZdsj().split(":"); | 854 | String[] split2 = schedule.getZdsj().split(":"); |
src/main/resources/static/pages/forms/statement/timeAndSpeed.html
src/main/resources/static/real_control_v2/css/main.css
| 1 | +input::-webkit-outer-spin-button, | ||
| 2 | +input::-webkit-inner-spin-button{ | ||
| 3 | + display: none; | ||
| 4 | +} | ||
| 5 | + | ||
| 6 | +input::-webkit-calendar-picker-indicator { | ||
| 7 | + display: none; | ||
| 8 | +} | ||
| 9 | + | ||
| 10 | +input::-webkit-datetime-edit { padding: 1px; } | ||
| 1 | 11 | ||
| 2 | .ps-container > .ps-scrollbar-y-rail{ | 12 | .ps-container > .ps-scrollbar-y-rail{ |
| 3 | z-index: 1 !important; | 13 | z-index: 1 !important; |
src/main/resources/static/real_control_v2/js/main.js
| @@ -169,8 +169,8 @@ var disabled_submit_btn = function (form) { | @@ -169,8 +169,8 @@ var disabled_submit_btn = function (form) { | ||
| 169 | function showUpdateDescription() { | 169 | function showUpdateDescription() { |
| 170 | //更新说明 | 170 | //更新说明 |
| 171 | var updateDescription = { | 171 | var updateDescription = { |
| 172 | - date: '2017-05-23', | ||
| 173 | - text: '<h5>现在可以在 数据&统计 里面看到部分班次修正日志。05-23之后的数据开始展现</h5>' | 172 | + date: '2017-05-24', |
| 173 | + text: '<h5>修复了一个问题,这个问题曾导致 在临加班次处于 “准备执行” 或 “正在执行” 状态时。即使删除了临加班次,当车辆发出或到终点后,有一定几率路单里会复现这个班次。</h5>' | ||
| 174 | }; | 174 | }; |
| 175 | 175 | ||
| 176 | var storage = window.localStorage | 176 | var storage = window.localStorage |
src/main/resources/static/real_control_v2/mapmonitor/fragments/playback_v2/main.html
| @@ -32,14 +32,14 @@ | @@ -32,14 +32,14 @@ | ||
| 32 | <div class="uk-form-row"> | 32 | <div class="uk-form-row"> |
| 33 | <label class="uk-form-label">开始时间</label> | 33 | <label class="uk-form-label">开始时间</label> |
| 34 | <div class="uk-form-controls"> | 34 | <div class="uk-form-controls"> |
| 35 | - <input name="sDate" type="date" required/> | 35 | + <input name="sDate" type="date" style="width: 100%;" required/> |
| 36 | </div> | 36 | </div> |
| 37 | </div> | 37 | </div> |
| 38 | </div> | 38 | </div> |
| 39 | <div class="uk-width-1-3" style="padding-left: 15px;"> | 39 | <div class="uk-width-1-3" style="padding-left: 15px;"> |
| 40 | <div class="uk-form-row"> | 40 | <div class="uk-form-row"> |
| 41 | <div class="uk-form-controls" style="margin-left: 0;"> | 41 | <div class="uk-form-controls" style="margin-left: 0;"> |
| 42 | - <input name="sTime" type="time" required/> | 42 | + <input name="sTime" type="time" style="width: calc(100% - 28px);" required/> |
| 43 | </div> | 43 | </div> |
| 44 | </div> | 44 | </div> |
| 45 | </div> | 45 | </div> |
| @@ -49,14 +49,14 @@ | @@ -49,14 +49,14 @@ | ||
| 49 | <div class="uk-form-row"> | 49 | <div class="uk-form-row"> |
| 50 | <label class="uk-form-label">结束时间</label> | 50 | <label class="uk-form-label">结束时间</label> |
| 51 | <div class="uk-form-controls"> | 51 | <div class="uk-form-controls"> |
| 52 | - <input name="eDate" type="date" required/> | 52 | + <input name="eDate" type="date" style="width: 100%;" required/> |
| 53 | </div> | 53 | </div> |
| 54 | </div> | 54 | </div> |
| 55 | </div> | 55 | </div> |
| 56 | <div class="uk-width-1-3" style="padding-left: 15px;"> | 56 | <div class="uk-width-1-3" style="padding-left: 15px;"> |
| 57 | <div class="uk-form-row"> | 57 | <div class="uk-form-row"> |
| 58 | <div class="uk-form-controls" style="margin-left: 0;"> | 58 | <div class="uk-form-controls" style="margin-left: 0;"> |
| 59 | - <input name="eTime" type="time" required/> | 59 | + <input name="eTime" type="time" style="width: calc(100% - 28px);" required/> |
| 60 | </div> | 60 | </div> |
| 61 | </div> | 61 | </div> |
| 62 | </div> | 62 | </div> |
| @@ -183,6 +183,16 @@ | @@ -183,6 +183,16 @@ | ||
| 183 | <span class="ct_btn text-panel"> | 183 | <span class="ct_btn text-panel"> |
| 184 | <span>共约 <span class="sum_mileage"></span> 公里,<span class="count_point"></span> 个GPS点</span><br> | 184 | <span>共约 <span class="sum_mileage"></span> 公里,<span class="count_point"></span> 个GPS点</span><br> |
| 185 | <a class="export-excel"><i class="uk-icon-file-excel-o"></i> 导出轨迹</a> | 185 | <a class="export-excel"><i class="uk-icon-file-excel-o"></i> 导出轨迹</a> |
| 186 | + | ||
| 187 | + <label> | ||
| 188 | + <div class="uk-button-dropdown" data-uk-dropdown> | ||
| 189 | + <a style="color: grey;margin-left: 12px;font-size: 12px;">线路底图 <i class="uk-icon-angle-down"></i></a> | ||
| 190 | + <div class="uk-dropdown uk-dropdown-scrollable" style="max-height: 300px;"> | ||
| 191 | + <ul class="uk-nav uk-nav-dropdown line_route_list"> | ||
| 192 | + </ul> | ||
| 193 | + </div> | ||
| 194 | + </div> | ||
| 195 | + </label> | ||
| 186 | </span> | 196 | </span> |
| 187 | </div> | 197 | </div> |
| 188 | <div class="ct-progress-bar" > | 198 | <div class="ct-progress-bar" > |
| @@ -294,6 +304,20 @@ | @@ -294,6 +304,20 @@ | ||
| 294 | $.get('/basic/cars', function (rs) { | 304 | $.get('/basic/cars', function (rs) { |
| 295 | gb_common.carAutocomplete($('.autocomplete-nbbm', modal), rs); | 305 | gb_common.carAutocomplete($('.autocomplete-nbbm', modal), rs); |
| 296 | }); | 306 | }); |
| 307 | + | ||
| 308 | + //初始化线路底图下拉 | ||
| 309 | + var opts=''; | ||
| 310 | + $.each(gb_data_basic.activeLines, function () { | ||
| 311 | + opts+='<li data-code="'+this.lineCode+'" data-dir="0"><a>'+this.name+'上行</a></li><li data-code="'+this.lineCode+'" data-dir="1"><a>'+this.name+'下行</a></li>'; | ||
| 312 | + }); | ||
| 313 | + $('.line_route_list', modal).html(opts); | ||
| 314 | + }); | ||
| 315 | + | ||
| 316 | + //切换线路底图 | ||
| 317 | + $(modal).on('click', '.line_route_list li', function () { | ||
| 318 | + var code = $(this).data('code'); | ||
| 319 | + var updown = $(this).data('dir'); | ||
| 320 | + mapObj.changeLine(code, updown); | ||
| 297 | }); | 321 | }); |
| 298 | 322 | ||
| 299 | /** | 323 | /** |
| @@ -730,7 +754,7 @@ | @@ -730,7 +754,7 @@ | ||
| 730 | //中心点和缩放级别 | 754 | //中心点和缩放级别 |
| 731 | map.centerAndZoom(new BMap.Point(gb_map_consts.center_point.lng, gb_map_consts.center_point.lat), 16); | 755 | map.centerAndZoom(new BMap.Point(gb_map_consts.center_point.lng, gb_map_consts.center_point.lat), 16); |
| 732 | map.enableScrollWheelZoom(); | 756 | map.enableScrollWheelZoom(); |
| 733 | - } | 757 | + }; |
| 734 | 758 | ||
| 735 | var storage = window.localStorage; | 759 | var storage = window.localStorage; |
| 736 | var routes;//路段 | 760 | var routes;//路段 |
| @@ -985,6 +1009,19 @@ | @@ -985,6 +1009,19 @@ | ||
| 985 | if(!markerIsVisible) | 1009 | if(!markerIsVisible) |
| 986 | map.panTo(gpsMarker.getPosition()); | 1010 | map.panTo(gpsMarker.getPosition()); |
| 987 | }; | 1011 | }; |
| 1012 | + | ||
| 1013 | + /** | ||
| 1014 | + * 切换线路底图 | ||
| 1015 | + */ | ||
| 1016 | + var changeLine = function (lineCode, updown) { | ||
| 1017 | + //reset(); | ||
| 1018 | + //从地图模块获取站点数据 | ||
| 1019 | + stations = gb_map_spatial_data.getStationArray(lineCode); | ||
| 1020 | + //从localStorage 获取路段 | ||
| 1021 | + routes = JSON.parse(storage.getItem(lineCode + '_route')); | ||
| 1022 | + routes = [routes.up_bd, routes.down_bd]; | ||
| 1023 | + switchPolyline(lineCode, updown); | ||
| 1024 | + }; | ||
| 988 | return { | 1025 | return { |
| 989 | initData: initData, | 1026 | initData: initData, |
| 990 | updateCar: updateCar, | 1027 | updateCar: updateCar, |
| @@ -992,7 +1029,8 @@ | @@ -992,7 +1029,8 @@ | ||
| 992 | updateTrailLine: updateTrailLine, | 1029 | updateTrailLine: updateTrailLine, |
| 993 | refreshOverlay: switchPolyline, | 1030 | refreshOverlay: switchPolyline, |
| 994 | toCenterByBounds: toCenterByBounds, | 1031 | toCenterByBounds: toCenterByBounds, |
| 995 | - reset: reset | 1032 | + reset: reset, |
| 1033 | + changeLine: changeLine | ||
| 996 | } | 1034 | } |
| 997 | })(); | 1035 | })(); |
| 998 | 1036 |