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 86 }
87 87 }
88 88  
  89 + //@Autowired
  90 + //DayOfSchedule dayOfSchedule;
89 91 public void devInit(){
90 92 log.info("devInit...");
91 93 ScheduledExecutorService sexec = Application.mainServices;
92 94 //抓取GPS数据
93 95 gpsDataLoader.setFlag(-1);
  96 + //dayOfSchedule.dataRecovery();
94 97 //sexec.scheduleWithFixedDelay(gpsDataLoader, 30, 2, TimeUnit.SECONDS);
95 98 //实际排班更新线程
96 99 //sexec.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS);
... ... @@ -98,7 +101,8 @@ public class XDApplication implements CommandLineRunner {
98 101 //sexec.scheduleWithFixedDelay(schedulePstThread, 60, 15, TimeUnit.SECONDS);
99 102 //班次修正日志延迟入库
100 103 //sexec.scheduleWithFixedDelay(seiPstThread, 60, 30, TimeUnit.SECONDS);
101   -
  104 + //调度指令延迟入库
  105 + //sexec.scheduleWithFixedDelay(directivesPstThread, 180, 180, TimeUnit.SECONDS);
102 106 //线程监听(防止重要的线程阻塞、异常结束。以及部分主备切换工作)
103 107 //sexec.scheduleWithFixedDelay(threadMonotor, 240, 60, TimeUnit.SECONDS);
104 108 }
... ... @@ -116,7 +120,7 @@ public class XDApplication implements CommandLineRunner {
116 120 sexec.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS);
117 121 //班次延迟入库线程
118 122 sexec.scheduleWithFixedDelay(schedulePstThread, 60, 10, TimeUnit.SECONDS);
119   - //班次修正日志延迟入库
  123 + //班次修正日志入库
120 124 sexec.scheduleWithFixedDelay(seiPstThread, 60, 60, TimeUnit.SECONDS);
121 125 //检查班次误点
122 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 34  
35 35 @Override
36 36 public void run() {
  37 +
37 38 LinkedList<Directive> list = DayOfDirectives.pstDirectives;
38 39  
39 40 Directive directive;
... ... @@ -46,8 +47,10 @@ public class DirectivesPstThread extends Thread {
46 47 if(d60.isDispatch()){
47 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 52 continue;
  53 + }
51 54 }
52 55 d60Repository.save(d60);
53 56 }
... ...
src/main/java/com/bsth/data/gpsdata/arrival/GpsRealAnalyse.java
... ... @@ -117,29 +117,31 @@ public class GpsRealAnalyse {
117 117 try {
118 118 Collections.sort(list, comp);
119 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 145 } finally {
144 146 if (count != null)
145 147 count.countDown();
... ...
src/main/java/com/bsth/data/gpsdata/arrival/handlers/InOutStationSignalHandle.java
... ... @@ -46,7 +46,7 @@ public class InOutStationSignalHandle extends SignalHandle{
46 46 @Autowired
47 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 51 //最大的班次时间差,防止异常的GPS时间打乱数据
52 52 private final static int MAX_NORMAL_DIFF = 1000 * 60 * 60 * 12;
... ... @@ -113,8 +113,8 @@ public class InOutStationSignalHandle extends SignalHandle{
113 113  
114 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 118 return;
119 119  
120 120 //正常班次最大时间差
... ... @@ -129,9 +129,11 @@ public class InOutStationSignalHandle extends SignalHandle{
129 129 signalSchPlanMatcher.outMatch(gps, sch);
130 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 135 return;
  136 + }
135 137  
136 138 //应用到离站缓冲区设置参数
137 139 long rsT = lineConfigData.applyOut(sch, gps.getTimestamp());
... ... @@ -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 211 private void outStationAndOutPark(ScheduleRealInfo sch){
190 212 LineConfig config = lineConfigData.get(sch.getXlBm());
... ... @@ -230,7 +252,7 @@ public class InOutStationSignalHandle extends SignalHandle{
230 252 logger.info("NullPointerException " + sch.getXlName() + " 有班次无班次历时,,,检查一下是否需要出站既出场。");
231 253 }
232 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 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 3 import com.bsth.data.gpsdata.GpsEntity;
4 4 import com.bsth.data.schedule.DayOfSchedule;
5 5 import com.bsth.entity.realcontrol.ScheduleRealInfo;
  6 +import org.slf4j.Logger;
  7 +import org.slf4j.LoggerFactory;
6 8 import org.springframework.beans.factory.annotation.Autowired;
7 9 import org.springframework.stereotype.Component;
8 10  
... ... @@ -16,6 +18,8 @@ public class SignalSchPlanMatcher {
16 18 @Autowired
17 19 DayOfSchedule dayOfSchedule;
18 20  
  21 + Logger log = LoggerFactory.getLogger(this.getClass());
  22 +
19 23 /**
20 24 * 发车信号匹配
21 25 * @param outSigal
... ... @@ -27,6 +31,25 @@ public class SignalSchPlanMatcher {
27 31 if(t < sch.getDfsjT())
28 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 54 ScheduleRealInfo next = dayOfSchedule.nextSame(sch);
32 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 60 for (String lineId : keys) {
61 61 Collections.sort(listMap.get(lineId), comp);
62 62 threadPool.execute(new RecoveryThread(listMap.get(lineId), count));
63   - /*if(nbbm.equals("W7C-001"))
  63 + /*if(nbbm.equals("W7E-016"))
64 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 69 try {
... ... @@ -82,7 +84,7 @@ public class GpsDataRecovery implements ApplicationContextAware {
82 84 Calendar calendar = Calendar.getInstance();
83 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 88 JdbcTemplate jdbcTemplate = new JdbcTemplate(DBUtils_MS.getDataSource());
87 89  
88 90 List<GpsEntity> list =
... ... @@ -150,30 +152,34 @@ public class GpsDataRecovery implements ApplicationContextAware {
150 152 CircleQueue<GpsEntity> prevs;
151 153 boolean task;
152 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 183 } finally {
178 184 count.countDown();
179 185 }
... ...
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
... ... @@ -649,7 +649,12 @@ public class DayOfSchedule {
649 649 nbbmScheduleMap.remove(sch.getClZbh(), sch);
650 650 id2SchedulMap.remove(sch.getId());
651 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 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 805 * @param nbbm
781 806 * @param bcType
... ...
src/main/java/com/bsth/service/impl/BusIntervalServiceImpl.java
... ... @@ -113,6 +113,12 @@ public class BusIntervalServiceImpl implements BusIntervalService {
113 113 schedule.setSpId(rs.getLong("sp_id"));
114 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 122 String[] split1 = schedule.getFcsj().split(":");
117 123 String[] split3 = schedule.getZdsj().split(":");
118 124 long fcsj = Long.valueOf(split1[0]) * 60 + Long.valueOf(split1[1]);
... ... @@ -669,6 +675,13 @@ public class BusIntervalServiceImpl implements BusIntervalService {
669 675 schedule.setjName(rs.getString("j_name"));
670 676 schedule.setStatus(rs.getInt("status"));
671 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 685 if(schedule.getDfsj() != null){
673 686 String[] split0 = schedule.getDfsj().split(":");
674 687 long dfsj = Long.valueOf(split0[0]) * 60 + Long.valueOf(split0[1]);
... ... @@ -1840,6 +1853,13 @@ public class BusIntervalServiceImpl implements BusIntervalService {
1840 1853 schedule.setjName(rs.getString("j_name"));
1841 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 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 81 schedule.setsName(rs.getString("s_name"));
82 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 90 if(schedule.getFcsj() != null && schedule.getZdsj() != null){
85 91 String[] split1 = schedule.getFcsj().split(":");
86 92 String[] split2 = schedule.getZdsj().split(":");
... ... @@ -548,6 +554,12 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
548 554 schedule.setQdzName(rs.getString("qdz_name"));
549 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 563 if(schedule.getFcsj() != null && schedule.getZdsj() != null){
552 564 String[] split1 = schedule.getFcsj().split(":");
553 565 String[] split2 = schedule.getZdsj().split(":");
... ... @@ -831,6 +843,12 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
831 843 schedule.setQdzName(rs.getString("qdz_name"));
832 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 852 if(schedule.getFcsj() != null && schedule.getZdsj() != null){
835 853 String[] split1 = schedule.getFcsj().split(":");
836 854 String[] split2 = schedule.getZdsj().split(":");
... ...
src/main/resources/static/pages/forms/statement/timeAndSpeed.html
... ... @@ -354,6 +354,7 @@
354 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 12 .ps-container > .ps-scrollbar-y-rail{
3 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 169 function showUpdateDescription() {
170 170 //更新说明
171 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 176 var storage = window.localStorage
... ...
src/main/resources/static/real_control_v2/mapmonitor/fragments/playback_v2/main.html
... ... @@ -32,14 +32,14 @@
32 32 <div class="uk-form-row">
33 33 <label class="uk-form-label">开始时间</label>
34 34 <div class="uk-form-controls">
35   - <input name="sDate" type="date" required/>
  35 + <input name="sDate" type="date" style="width: 100%;" required/>
36 36 </div>
37 37 </div>
38 38 </div>
39 39 <div class="uk-width-1-3" style="padding-left: 15px;">
40 40 <div class="uk-form-row">
41 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 43 </div>
44 44 </div>
45 45 </div>
... ... @@ -49,14 +49,14 @@
49 49 <div class="uk-form-row">
50 50 <label class="uk-form-label">结束时间</label>
51 51 <div class="uk-form-controls">
52   - <input name="eDate" type="date" required/>
  52 + <input name="eDate" type="date" style="width: 100%;" required/>
53 53 </div>
54 54 </div>
55 55 </div>
56 56 <div class="uk-width-1-3" style="padding-left: 15px;">
57 57 <div class="uk-form-row">
58 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 60 </div>
61 61 </div>
62 62 </div>
... ... @@ -183,6 +183,16 @@
183 183 <span class="ct_btn text-panel">
184 184 <span>共约 <span class="sum_mileage"></span> 公里,<span class="count_point"></span> 个GPS点</span><br>
185 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 196 </span>
187 197 </div>
188 198 <div class="ct-progress-bar" >
... ... @@ -294,6 +304,20 @@
294 304 $.get('/basic/cars', function (rs) {
295 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 754 //中心点和缩放级别
731 755 map.centerAndZoom(new BMap.Point(gb_map_consts.center_point.lng, gb_map_consts.center_point.lat), 16);
732 756 map.enableScrollWheelZoom();
733   - }
  757 + };
734 758  
735 759 var storage = window.localStorage;
736 760 var routes;//路段
... ... @@ -985,6 +1009,19 @@
985 1009 if(!markerIsVisible)
986 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 1025 return {
989 1026 initData: initData,
990 1027 updateCar: updateCar,
... ... @@ -992,7 +1029,8 @@
992 1029 updateTrailLine: updateTrailLine,
993 1030 refreshOverlay: switchPolyline,
994 1031 toCenterByBounds: toCenterByBounds,
995   - reset: reset
  1032 + reset: reset,
  1033 + changeLine: changeLine
996 1034 }
997 1035 })();
998 1036  
... ...