Commit 901928ec4e1f6642259bb5ebf2d237662631b867

Authored by 徐烜
2 parents 97da1203 dec696fb

Merge branch 'minhang' of http://222.66.0.204:8090//panzhaov5/bsth_control into minhang

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
@@ -354,6 +354,7 @@ @@ -354,6 +354,7 @@
354 _w_table_rowspan("#works", 4); 354 _w_table_rowspan("#works", 4);
355 } 355 }
356 }); 356 });
  357 + $("html,body").animate({scrollTop:$("#works").offset().top},700);
357 }); 358 });
358 }); 359 });
359 } 360 }
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