Commit d9a30fd7d18aee737ddf5b0871fa84baf1dede7f

Authored by 王通
1 parent 8e5d540b

1.

Too many changes to show.

To preserve performance only 11 of 14 files are displayed.

@@ -107,6 +107,5 @@ @@ -107,6 +107,5 @@
107 107
108 <properties> 108 <properties>
109 <start-class>com.bsth.Application</start-class> 109 <start-class>com.bsth.Application</start-class>
110 - <javacpp.platform>linux-x86_64</javacpp.platform>  
111 </properties> 110 </properties>
112 </project> 111 </project>
schedule-core/pom.xml
@@ -414,10 +414,23 @@ @@ -414,10 +414,23 @@
414 <version>1.5.3</version> 414 <version>1.5.3</version>
415 </dependency> 415 </dependency>
416 416
  417 + <!-- 核心依赖 -->
417 <dependency> 418 <dependency>
418 <groupId>org.bytedeco</groupId> 419 <groupId>org.bytedeco</groupId>
419 - <artifactId>javacv-platform</artifactId>  
420 - <version>1.5.11</version> 420 + <artifactId>javacv</artifactId>
  421 + <version>1.5.5</version>
  422 + </dependency>
  423 + <dependency>
  424 + <groupId>org.bytedeco</groupId>
  425 + <artifactId>javacpp</artifactId>
  426 + <version>1.5.5</version>
  427 + </dependency>
  428 + <!-- Linux x86_64平台特定的FFmpeg依赖 -->
  429 + <dependency>
  430 + <groupId>org.bytedeco</groupId>
  431 + <artifactId>ffmpeg</artifactId>
  432 + <version>4.3.2-1.5.5</version>
  433 + <classifier>${javacpp.platform}</classifier>
421 </dependency> 434 </dependency>
422 </dependencies> 435 </dependencies>
423 <dependencyManagement> 436 <dependencyManagement>
@@ -508,4 +521,8 @@ @@ -508,4 +521,8 @@
508 </releases> 521 </releases>
509 </pluginRepository> 522 </pluginRepository>
510 </pluginRepositories> 523 </pluginRepositories>
  524 +
  525 + <properties>
  526 + <javacpp.platform>windows-x86_64</javacpp.platform>
  527 + </properties>
511 </project> 528 </project>
schedule-core/src/main/java/com/bsth/controller/calc/CalcMixController.java
@@ -89,7 +89,7 @@ public class CalcMixController { @@ -89,7 +89,7 @@ public class CalcMixController {
89 return service.singledatatj(line, startDate, endDate, tjtype, cont, gsdmSing, fgsdmSing, sfdc); 89 return service.singledatatj(line, startDate, endDate, tjtype, cont, gsdmSing, fgsdmSing, sfdc);
90 } 90 }
91 91
92 - //浦东公交线路调查表 92 + //峨眉公交线路调查表
93 @RequestMapping(value = "/calcInvestigateMonth", method = RequestMethod.GET) 93 @RequestMapping(value = "/calcInvestigateMonth", method = RequestMethod.GET)
94 public List<CalcInvestigateMonth> calcInvestigateMonth(@RequestParam Map<String, Object> map) { 94 public List<CalcInvestigateMonth> calcInvestigateMonth(@RequestParam Map<String, Object> map) {
95 String gsbm=""; 95 String gsbm="";
schedule-core/src/main/java/com/bsth/service/calc/CalcMixService.java
@@ -14,7 +14,7 @@ public interface CalcMixService { @@ -14,7 +14,7 @@ public interface CalcMixService {
14 14
15 List<Map<String, Object>> singledatatj(String line, String startDate, String endDate, String tjtype, String cont, String gsdmSing, String fgsdmSing, String sfdc); 15 List<Map<String, Object>> singledatatj(String line, String startDate, String endDate, String tjtype, String cont, String gsdmSing, String fgsdmSing, String sfdc);
16 16
17 - //浦东公交线路调查表 17 + //峨眉公交线路调查表
18 List<CalcInvestigateMonth> calcInvestigateMonth(String gsbm, String fgsbm, String month, String line, String xlName, String nature, String type); 18 List<CalcInvestigateMonth> calcInvestigateMonth(String gsbm, String fgsbm, String month, String line, String xlName, String nature, String type);
19 19
20 } 20 }
schedule-core/src/main/java/com/bsth/service/calc/impl/CalcMixServiceImpl.java
@@ -387,7 +387,7 @@ public class CalcMixServiceImpl implements CalcMixService { @@ -387,7 +387,7 @@ public class CalcMixServiceImpl implements CalcMixService {
387 return resList; 387 return resList;
388 } 388 }
389 389
390 - //浦东公交线路调查表 390 + //峨眉公交线路调查表
391 @Override 391 @Override
392 public List<CalcInvestigateMonth> calcInvestigateMonth(String gsbm, String fgsbm, String month, String line, 392 public List<CalcInvestigateMonth> calcInvestigateMonth(String gsbm, String fgsbm, String month, String line,
393 String xlName, String nature, String type) { 393 String xlName, String nature, String type) {
@@ -484,7 +484,7 @@ public class CalcMixServiceImpl implements CalcMixService { @@ -484,7 +484,7 @@ public class CalcMixServiceImpl implements CalcMixService {
484 listI.add(mapList.iterator()); 484 listI.add(mapList.iterator());
485 String path = this.getClass().getResource("/").getPath() + "static/pages/forms/"; 485 String path = this.getClass().getResource("/").getPath() + "static/pages/forms/";
486 ee.excelReplace(listI, new Object[]{m}, path + "mould/calcInvestigateMonth.xls", 486 ee.excelReplace(listI, new Object[]{m}, path + "mould/calcInvestigateMonth.xls",
487 - path + "export/" + "浦东公交线路调查表"+month+".xls"); 487 + path + "export/" + "峨眉公交线路调查表"+month+".xls");
488 } catch (Exception e) { 488 } catch (Exception e) {
489 // TODO: handle exception 489 // TODO: handle exception
490 e.printStackTrace(); 490 e.printStackTrace();
schedule-core/src/main/java/com/bsth/service/forms/impl/BudgetServiceImpl.java
@@ -3185,7 +3185,7 @@ public class BudgetServiceImpl extends BaseServiceImpl&lt;Budget, Integer&gt; implemen @@ -3185,7 +3185,7 @@ public class BudgetServiceImpl extends BaseServiceImpl&lt;Budget, Integer&gt; implemen
3185 } else if("26".equals(sp[0])){ 3185 } else if("26".equals(sp[0])){
3186 gs = "南汇公司"; 3186 gs = "南汇公司";
3187 } else if("all".equals(sp[0])){ 3187 } else if("all".equals(sp[0])){
3188 - gs = "浦东公交合计"; 3188 + gs = "峨眉公交合计";
3189 num = "0"; 3189 num = "0";
3190 } 3190 }
3191 if("1".equals(sp[1])){ 3191 if("1".equals(sp[1])){
@@ -3242,7 +3242,7 @@ public class BudgetServiceImpl extends BaseServiceImpl&lt;Budget, Integer&gt; implemen @@ -3242,7 +3242,7 @@ public class BudgetServiceImpl extends BaseServiceImpl&lt;Budget, Integer&gt; implemen
3242 } else if("26".equals(sp[0])){ 3242 } else if("26".equals(sp[0])){
3243 gs = "南汇公司"; 3243 gs = "南汇公司";
3244 } else if("all".equals(sp[0])){ 3244 } else if("all".equals(sp[0])){
3245 - gs = "浦东公交合计"; 3245 + gs = "峨眉公交合计";
3246 num = "0"; 3246 num = "0";
3247 } 3247 }
3248 if("1".equals(sp[1])){ 3248 if("1".equals(sp[1])){
src/main/resources/rules/kBase1_core_plan.drl
1 -package com.bsth.service.schedule.impl.plan.kBase1.core.plan;  
2 -  
3 -import org.joda.time.*;  
4 -import java.util.*;  
5 -  
6 -import com.bsth.service.schedule.impl.plan.kBase1.core.plan.PlanCalcuParam_input;  
7 -import com.bsth.service.schedule.impl.plan.kBase1.core.plan.PlanResult;  
8 -  
9 -import com.bsth.repository.schedule.TTInfoDetailRepository;  
10 -import com.bsth.repository.schedule.CarConfigInfoRepository;  
11 -import com.bsth.repository.schedule.EmployeeConfigInfoRepository;  
12 -import com.bsth.repository.LineRepository;  
13 -import com.bsth.repository.BusinessRepository;  
14 -  
15 -import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResult_output;  
16 -import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResults_output;  
17 -import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.TTInfoResult_output;  
18 -import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.TTInfoResults_output;  
19 -import com.bsth.entity.Line;  
20 -import com.bsth.entity.Business;  
21 -  
22 -import com.bsth.entity.schedule.CarConfigInfo;  
23 -import com.bsth.entity.schedule.EmployeeConfigInfo;  
24 -import com.bsth.entity.schedule.TTInfo;  
25 -import com.bsth.entity.schedule.TTInfoDetail;  
26 -import com.bsth.entity.schedule.SchedulePlanInfo;  
27 -  
28 -import org.slf4j.Logger  
29 -import org.joda.time.format.DateTimeFormat  
30 -import org.apache.commons.lang3.StringUtils  
31 -import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleRule_Type;  
32 -  
33 -  
34 -// 全局日志类(一般使用调用此规则的service类)  
35 -global Logger log;  
36 -  
37 -global TTInfoDetailRepository tTInfoDetailRepository;  
38 -global CarConfigInfoRepository carConfigInfoRepository;  
39 -global EmployeeConfigInfoRepository employeeConfigInfoRepository;  
40 -global LineRepository lineRepository;  
41 -global BusinessRepository businessRepository;  
42 -  
43 -// 输出  
44 -global PlanResult planResult;  
45 -  
46 -function Map xlidParams(String xlid) {  
47 - Map param = new HashMap();  
48 - param.put("xl.id_eq", Integer.valueOf(xlid));  
49 - return param;  
50 -}  
51 -  
52 -function List ecList(EmployeeConfigInfoRepository repo, String ecids) {  
53 - List<String> ids = Arrays.asList(ecids.split("-"));  
54 - List rst = new ArrayList();  
55 - for (int i = 0; i < ids.size(); i++) {  
56 - rst.add(repo.findById(Long.parseLong(ids.get(i))).get());  
57 - }  
58 - return rst;  
59 -}  
60 -  
61 -function LocalTime fcsjTime(String fcsj) {  
62 - if ("NULL".equals(fcsj)) {  
63 - return null;  
64 - }  
65 - return LocalTime.parse(fcsj, DateTimeFormat.forPattern("HH:mm"));  
66 -}  
67 -  
68 -function String ttInfoId_sd(Map map, DateTime sd) {  
69 - TTInfoResult_output ttInfoResult_output = (TTInfoResult_output) map.get(sd);  
70 - return ttInfoResult_output.getTtInfoId();  
71 -}  
72 -  
73 -function Map gsMap(List gses) {  
74 - Map gsMap = new HashMap();  
75 - for (int i = 0; i < gses.size(); i++) {  
76 - Business gs = (Business) gses.get(i);  
77 - if (StringUtils.isNotEmpty(gs.getBusinessCode())) {  
78 - if ("88".equals(gs.getUpCode())) { // 浦东公交  
79 - gsMap.put(gs.getBusinessCode(), gs);  
80 - }  
81 - if (gs.getBusinessCode().equals(gs.getUpCode())) { // 闵行,青浦  
82 - gsMap.put(gs.getBusinessCode(), gs);  
83 - }  
84 - }  
85 - }  
86 - return gsMap;  
87 -}  
88 -  
89 -function Map fgsMap(List gses) {  
90 - // 这里简单将 businessCode和upCode合并  
91 - Map fgsMap = new HashMap();  
92 - for (int i = 0; i < gses.size(); i++) {  
93 - Business gs = (Business) gses.get(i);  
94 - if (StringUtils.isNotEmpty(gs.getBusinessCode()) && StringUtils.isNotEmpty(gs.getUpCode())) {  
95 - fgsMap.put(gs.getUpCode() + "_" + gs.getBusinessCode(), gs);  
96 - }  
97 - }  
98 - return fgsMap;  
99 -}  
100 -  
101 -/*  
102 - 规则说明:  
103 - 根据循环规则输出,时刻表选择规则输出,组合计算排班明细  
104 -*/  
105 -  
106 -//-------------------- 第一阶段、计算迭代数据 -----------------//  
107 -declare Loop_result  
108 - xlId: String // 线路id  
109 -  
110 - ruleLoop: List // 每天分配的规则 List<ScheduleResult_output>  
111 -  
112 - ttInfoMapLoop_temp: Map // 每天分配的时刻表 Map<DataTime, Collection<TTInfoResult_output>>  
113 - ttInfoMapLoop: Map // 每天分配的时刻表 Map<DataTime, TTInfoResult_output>  
114 - ttInfoMap: Map // 总共用到的时刻表 Map<id, TTInfoResult_output>  
115 -end  
116 -  
117 -rule "calcu_step1_Loop_result"  
118 - salience 1000  
119 - when  
120 - $param: PlanCalcuParam_input($xlId: xlId)  
121 - then  
122 - Loop_result loop_result = new Loop_result();  
123 - loop_result.setXlId($xlId);  
124 - loop_result.setRuleLoop($param.getScheduleResults_output().getResults());  
125 -  
126 - loop_result.setTtInfoMapLoop(new HashMap());  
127 - loop_result.setTtInfoMap(new HashMap());  
128 -  
129 - com.google.common.collect.Multimap ttInfoMap_temp =  
130 - (com.google.common.collect.Multimap)  
131 - $param.getTtInfoResults_output().getResults().get(  
132 - String.valueOf($xlId));  
133 -  
134 - loop_result.setTtInfoMapLoop_temp(ttInfoMap_temp.asMap());  
135 -  
136 - insert(loop_result);  
137 -  
138 -// log.info("calcu_step1_Loop_result");  
139 -end  
140 -  
141 -rule "calcu_step2_loop_result"  
142 - salience 1000  
143 - no-loop  
144 - when  
145 - $param: PlanCalcuParam_input($xlId: xlId)  
146 - $lr: Loop_result(xlId == $xlId)  
147 - $sd: DateTime() from $lr.ttInfoMapLoop_temp.keySet()  
148 - then  
149 - // 当天时刻表只取第一张 TODO:  
150 - Collection col = (Collection) $lr.getTtInfoMapLoop_temp().get($sd);  
151 - Iterator iter = col.iterator();  
152 - TTInfoResult_output ttInfo_result = (TTInfoResult_output) iter.next();  
153 - $lr.getTtInfoMapLoop().put($sd, ttInfo_result);  
154 -  
155 - // 总共使用的时刻表  
156 - $lr.getTtInfoMap().put(ttInfo_result.getTtInfoId(), ttInfo_result);  
157 -  
158 - update($lr);  
159 -  
160 -// log.info("calcu_step2_Loop_result");  
161 -end  
162 -  
163 -//-------------------- 第二阶段、将时刻表班次,车辆配置,人员配置信息载入 -----------------//  
164 -  
165 -//--------------- 车辆配置信息载入 -------------//  
166 -declare CarConfig_Wraps  
167 - xlId: String // 线路Id  
168 - ccMap: Map // 车辆配置Map Map<id, CarConfigInfo>  
169 -end  
170 -  
171 -rule "calcu_CarConfig_Wraps"  
172 - salience 800  
173 - when  
174 - $lr: Loop_result($xlId: xlId)  
175 - then  
176 - List carConfigInfos = carConfigInfoRepository.findByXlId(Integer.parseInt($xlId));  
177 -  
178 - CarConfig_Wraps carConfig_wraps = new CarConfig_Wraps();  
179 - carConfig_wraps.setXlId($xlId);  
180 - carConfig_wraps.setCcMap(new HashMap());  
181 -  
182 - for (int i = 0; i < carConfigInfos.size(); i++) {  
183 - CarConfigInfo carConfigInfo = (CarConfigInfo) carConfigInfos.get(i);  
184 - carConfig_wraps.getCcMap().put(carConfigInfo.getId().toString(), carConfigInfo);  
185 - }  
186 -  
187 - insert(carConfig_wraps);  
188 -  
189 - log.info("calcu_CarConfig_Wrap");  
190 -end  
191 -  
192 -//--------------- 人员配置信息载入 --------------//  
193 -declare EmployeeConfig_Wraps  
194 - xlId: String // 线路Id  
195 - ecMap: Map // 人员配置Map Map<id, EmployeeConfigInfo>  
196 -end  
197 -  
198 -rule "calcu_EmployeeConfig_Wraps"  
199 - salience 800  
200 - when  
201 - $lr: Loop_result($xlId: xlId)  
202 - then  
203 - List employeeConfigInfos = employeeConfigInfoRepository.findByXlId(Integer.parseInt($xlId));  
204 -  
205 - EmployeeConfig_Wraps employeeConfig_wraps = new EmployeeConfig_Wraps();  
206 - employeeConfig_wraps.setXlId($xlId);  
207 - employeeConfig_wraps.setEcMap(new HashMap());  
208 -  
209 - for (int i = 0; i < employeeConfigInfos.size(); i++) {  
210 - EmployeeConfigInfo employeeConfigInfo = (EmployeeConfigInfo) employeeConfigInfos.get(i);  
211 - employeeConfig_wraps.getEcMap().put(employeeConfigInfo.getId().toString(), employeeConfigInfo);  
212 - }  
213 -  
214 - insert(employeeConfig_wraps);  
215 -  
216 - log.info("calcu_EmployeeConfig_Wrap");  
217 -end  
218 -  
219 -//----------------- 时刻表班次信息载入 -----------------//  
220 -declare TTInfo_gid_stat  
221 - xlId: String // 线路id(cast字符串-方便比较)  
222 - ttInfoId: String // 时刻表id(cast字符串-方便比较)  
223 - gid: String // 路牌id(cast字符串-方便比较)  
224 -  
225 - maxFcno: Integer // 最大发车顺序号  
226 -  
227 - fbTime: LocalTime // 分班时间  
228 - fbfcno: Integer // 分班发车顺序号  
229 -end  
230 -  
231 -rule "calcu_TTInfo_gid_stat"  
232 - salience 800  
233 - when  
234 - $lr: Loop_result($xlId: xlId)  
235 - $ttInfoId: String() from $lr.getTtInfoMap().keySet()  
236 - $gids: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidscount($ttd))  
237 - $gid: String() from $gids  
238 - $fbtime_str: String() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidfbtime($ttd))  
239 - $fbfcno: Integer() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidfbfcno($ttd))  
240 - $maxfcno: Double() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), max($ttd.getFcno()))  
241 - then  
242 - TTInfo_gid_stat ttInfo_gid_stat = new TTInfo_gid_stat();  
243 - ttInfo_gid_stat.setXlId($xlId);  
244 - ttInfo_gid_stat.setTtInfoId($ttInfoId);  
245 - ttInfo_gid_stat.setGid($gid);  
246 -  
247 - ttInfo_gid_stat.setMaxFcno($maxfcno.intValue());  
248 - ttInfo_gid_stat.setFbTime(fcsjTime($fbtime_str));  
249 - ttInfo_gid_stat.setFbfcno($fbfcno);  
250 -  
251 - insert(ttInfo_gid_stat);  
252 -  
253 -// log.info("xlid={},ttid={},gid={},maxfcno={},fbtime={},fbfcno={}",  
254 -// $xlId, $ttInfoId, $gid, ttInfo_gid_stat.getMaxFcno(), ttInfo_gid_stat.getFbTime(), ttInfo_gid_stat.getFbfcno());  
255 -  
256 -end  
257 -  
258 -declare TTInfoDetail_Wrap  
259 - isFirstBc: Boolean = false // 是否是当前路牌的第一个班次  
260 - isLastBc: Boolean = false // 是否是当前路牌的最后一个班次  
261 - isFb: Boolean = false // 是否分班  
262 -  
263 - self: TTInfoDetail // 原始数据  
264 -end  
265 -  
266 -declare TTInfoDetail_Wraps  
267 - xlId: String // 线路id(cast字符串-方便比较)  
268 - ttInfoId: String // 时刻表id(cast字符串-方便比较)  
269 -  
270 - detailsMap: Map // 明细Map,Map<路牌id, List<TTInfoDetail_Wrap>>  
271 -end  
272 -  
273 -rule "calcu_TTInfoDetail_Wraps"  
274 - salience 700  
275 - when  
276 - $lr: Loop_result($xlId: xlId)  
277 - $ttInfoId: String() from $lr.getTtInfoMap().keySet()  
278 - $ttInfoStatList: List(size > 0) from collect (TTInfo_gid_stat(ttInfoId == $ttInfoId))  
279 - then  
280 - TTInfoDetail_Wraps ttInfoDetail_wraps = new TTInfoDetail_Wraps();  
281 - ttInfoDetail_wraps.setXlId($xlId);  
282 - ttInfoDetail_wraps.setTtInfoId($ttInfoId);  
283 - ttInfoDetail_wraps.setDetailsMap(new HashMap());  
284 -  
285 - // 将list的形式变成 Map<路牌id, TTInfo_gid_stat>  
286 - Map statMap = new HashMap();  
287 - for (int i = 0; i < $ttInfoStatList.size(); i++) {  
288 - TTInfo_gid_stat ttInfo_gid_stat = (TTInfo_gid_stat) $ttInfoStatList.get(i);  
289 - statMap.put(ttInfo_gid_stat.getGid(), ttInfo_gid_stat);  
290 - }  
291 -  
292 - // 迭代ttinfodetail,拼装 TTInfoDetail_Wraps  
293 - List detaillist = tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId));  
294 - for (int j = 0; j < detaillist.size(); j++) {  
295 - TTInfoDetail ttInfoDetail = (TTInfoDetail) detaillist.get(j);  
296 - String gid = String.valueOf(ttInfoDetail.getLp().getId());  
297 -  
298 - if (ttInfoDetail_wraps.getDetailsMap().get(gid) == null) {  
299 - ttInfoDetail_wraps.getDetailsMap().put(gid, new ArrayList());  
300 - }  
301 -  
302 - // 获取stat  
303 - TTInfo_gid_stat ttInfo_gid_stat = (TTInfo_gid_stat) statMap.get(gid);  
304 -  
305 - TTInfoDetail_Wrap ttInfoDetail_wrap = new TTInfoDetail_Wrap();  
306 - ttInfoDetail_wrap.setIsFirstBc(1 == ttInfoDetail.getFcno());  
307 - ttInfoDetail_wrap.setIsLastBc(ttInfo_gid_stat.getMaxFcno() == ttInfoDetail.getFcno());  
308 -  
309 - LocalTime fcsj = fcsjTime(ttInfoDetail.getFcsj());  
310 - LocalTime fbsj = ttInfo_gid_stat.getFbTime();  
311 - Integer fbfcno = ttInfo_gid_stat.getFbfcno();  
312 - // 不用时间判定,因为有的路牌,后面的班次都是凌晨的,时间反而比分班时间早,不合理,所以使用发车顺序号做第二次比较  
313 -// ttInfoDetail_wrap.setIsFb(fbsj == null ? false : (fcsj.isEqual(fbsj) || fcsj.isAfter(fbsj)));  
314 - ttInfoDetail_wrap.setIsFb(fbsj == null ? false : ttInfoDetail.getFcno() >= fbfcno);  
315 -  
316 - ttInfoDetail_wrap.setSelf(ttInfoDetail);  
317 -  
318 - ((List) ttInfoDetail_wraps.getDetailsMap().get(gid)).add(ttInfoDetail_wrap);  
319 -  
320 - }  
321 -  
322 -  
323 - insert(ttInfoDetail_wraps);  
324 -  
325 - log.info("xlid={}, ttinfoid={}, lpstatCount={}, detailLpCount={}",  
326 - $xlId, $ttInfoId, $ttInfoStatList.size(), ttInfoDetail_wraps.getDetailsMap().keySet().size());  
327 -  
328 -  
329 -end  
330 -  
331 -declare TTInfoDetail_Wraps_map  
332 - xlId: String // 线路id(cast字符串-方便比较)  
333 -  
334 - wrapsMap: Map // 明细Map,Map<时刻表Id, TTInfoDetail_Wraps>  
335 -end  
336 -  
337 -rule "calcu_TTInfoDetail_Wraps_toMap"  
338 - salience 600  
339 - when  
340 - $lr: Loop_result($xlId: xlId)  
341 - $wrapsList: List(size > 0) from collect (TTInfoDetail_Wraps(xlId == $xlId))  
342 - then  
343 - // 转换成Map  
344 - TTInfoDetail_Wraps_map all = new TTInfoDetail_Wraps_map();  
345 - all.setXlId($xlId);  
346 - all.setWrapsMap(new HashMap());  
347 -  
348 - for (int i = 0; i < $wrapsList.size(); i++) {  
349 - TTInfoDetail_Wraps ttInfoDetail_wraps = (TTInfoDetail_Wraps) $wrapsList.get(i);  
350 - all.getWrapsMap().put(ttInfoDetail_wraps.getTtInfoId(), ttInfoDetail_wraps);  
351 - }  
352 -  
353 - insert(all);  
354 -end  
355 -  
356 -  
357 -  
358 -  
359 -//-------------------- 第三阶段、合并计算SchedulePlanInfo -----------------//  
360 -  
361 -  
362 -rule "Calcu_SchedulePlanInfo"  
363 - salience 500  
364 - when  
365 - $param: PlanCalcuParam_input($xlId: xlId)  
366 - $lr: Loop_result(xlId == $xlId)  
367 - $ccs: CarConfig_Wraps(xlId == $xlId)  
368 - $ecs: EmployeeConfig_Wraps(xlId == $xlId)  
369 - $tts: TTInfoDetail_Wraps_map(xlId == $xlId)  
370 - then  
371 - // 线路  
372 - Line xl = lineRepository.findById(Integer.parseInt($xlId)).get();  
373 -  
374 - // 查找公司  
375 - List gses = (List) businessRepository.findAll();  
376 - // 构造公司代码对应map  
377 - Map gsMap = gsMap(gses);  
378 - // 构造分公司对应的map  
379 - Map fgsMap = fgsMap(gses);  
380 -  
381 - for (int i = 0; i < $lr.getRuleLoop().size(); i++) {  
382 - ScheduleResult_output sro = (ScheduleResult_output) $lr.getRuleLoop().get(i);  
383 -  
384 - // 日期  
385 - DateTime sd = sro.getSd();  
386 - // 路牌  
387 - String gid = sro.getGuideboardId();  
388 - // 车辆配置  
389 - CarConfigInfo carConfigInfo = sro.getsType() == ScheduleRule_Type.NORMAL ?  
390 - (CarConfigInfo) $ccs.getCcMap().get(sro.getCarConfigId()) : null;  
391 - // 人员配置  
392 - List eclist = sro.getsType() == ScheduleRule_Type.NORMAL ?  
393 - ecList(employeeConfigInfoRepository, sro.getEmployeeConfigId()) : null;  
394 -  
395 - // 时刻表id  
396 - String ttInfoId = ttInfoId_sd($lr.getTtInfoMapLoop(), sd);  
397 - TTInfoDetail_Wraps ttInfoDetail_wraps = (TTInfoDetail_Wraps) $tts.getWrapsMap().get(ttInfoId);  
398 - if (ttInfoDetail_wraps == null) {  
399 - // 时刻表为空,直接跳过  
400 - // 如1118路,周末不开,此是时刻表指定一个空表  
401 - // TODO:这个以后要改的,选时刻表的规则要修正,没有默认的时刻表  
402 - continue;  
403 - }  
404 -  
405 - List detaillist = (List) ttInfoDetail_wraps.getDetailsMap().get(gid);  
406 - if (detaillist == null) {  
407 - // 这里翻到的路牌时刻表里可能没有,  
408 - // 因为没有考虑翻班格式(就是做几休几)  
409 - // 所有翻班格式全由时刻表决定,即时刻表有的路牌就做,没有不做  
410 - continue;  
411 - }  
412 -  
413 - for (int j = 0; j < detaillist.size(); j++) {  
414 - TTInfoDetail_Wrap wrap = (TTInfoDetail_Wrap) detaillist.get(j);  
415 -  
416 - SchedulePlanInfo schedulePlanInfo = new SchedulePlanInfo(  
417 - xl,  
418 - sro,  
419 - wrap.getSelf(),  
420 - wrap.getIsFb(),  
421 - carConfigInfo,  
422 - eclist,  
423 - $param.getSchedulePlan(),  
424 - wrap.getIsFirstBc(),  
425 - wrap.getIsLastBc(),  
426 - sro.getsType()  
427 - );  
428 -  
429 - // 获取公司,分公司信息  
430 - String gsbm = xl.getCompany();  
431 - String fgsbm = xl.getBrancheCompany();  
432 - Business gs = null;  
433 - Business fgs = null;  
434 -  
435 - if (StringUtils.isNotEmpty(gsbm)) {  
436 - gs = (Business) gsMap.get(gsbm);  
437 - }  
438 - if (StringUtils.isNotEmpty(gsbm) && StringUtils.isNotEmpty(fgsbm)) {  
439 - fgs = (Business) fgsMap.get(gsbm + "_" + fgsbm);  
440 - }  
441 -  
442 - if (gs != null) {  
443 - schedulePlanInfo.setGsBm(gs.getBusinessCode());  
444 - schedulePlanInfo.setGsName(gs.getBusinessName());  
445 - }  
446 - if (fgs != null) {  
447 - schedulePlanInfo.setFgsBm(fgs.getBusinessCode());  
448 - schedulePlanInfo.setFgsName(fgs.getBusinessName());  
449 - }  
450 -  
451 - // 操作人,操作时间  
452 - schedulePlanInfo.setCreateBy($param.getSchedulePlan().getCreateBy());  
453 - schedulePlanInfo.setCreateDate($param.getSchedulePlan().getCreateDate());  
454 - schedulePlanInfo.setUpdateBy($param.getSchedulePlan().getUpdateBy());  
455 - schedulePlanInfo.setUpdateDate($param.getSchedulePlan().getUpdateDate());  
456 -  
457 - // result 输出  
458 - planResult.getSchedulePlanInfos().add(schedulePlanInfo);  
459 -  
460 - }  
461 -  
462 - }  
463 -  
464 - log.info("xlid={} plan ok!", $xlId);  
465 -  
466 -end  
467 -  
468 -  
469 -  
470 -  
471 -  
472 -  
473 -  
474 -  
475 -  
476 -  
477 -  
478 -  
479 -  
480 - 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.plan;
  2 +
  3 +import org.joda.time.*;
  4 +import java.util.*;
  5 +
  6 +import com.bsth.service.schedule.impl.plan.kBase1.core.plan.PlanCalcuParam_input;
  7 +import com.bsth.service.schedule.impl.plan.kBase1.core.plan.PlanResult;
  8 +
  9 +import com.bsth.repository.schedule.TTInfoDetailRepository;
  10 +import com.bsth.repository.schedule.CarConfigInfoRepository;
  11 +import com.bsth.repository.schedule.EmployeeConfigInfoRepository;
  12 +import com.bsth.repository.LineRepository;
  13 +import com.bsth.repository.BusinessRepository;
  14 +
  15 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResult_output;
  16 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResults_output;
  17 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.TTInfoResult_output;
  18 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.TTInfoResults_output;
  19 +import com.bsth.entity.Line;
  20 +import com.bsth.entity.Business;
  21 +
  22 +import com.bsth.entity.schedule.CarConfigInfo;
  23 +import com.bsth.entity.schedule.EmployeeConfigInfo;
  24 +import com.bsth.entity.schedule.TTInfo;
  25 +import com.bsth.entity.schedule.TTInfoDetail;
  26 +import com.bsth.entity.schedule.SchedulePlanInfo;
  27 +
  28 +import org.slf4j.Logger
  29 +import org.joda.time.format.DateTimeFormat
  30 +import org.apache.commons.lang3.StringUtils
  31 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleRule_Type;
  32 +
  33 +
  34 +// 全局日志类(一般使用调用此规则的service类)
  35 +global Logger log;
  36 +
  37 +global TTInfoDetailRepository tTInfoDetailRepository;
  38 +global CarConfigInfoRepository carConfigInfoRepository;
  39 +global EmployeeConfigInfoRepository employeeConfigInfoRepository;
  40 +global LineRepository lineRepository;
  41 +global BusinessRepository businessRepository;
  42 +
  43 +// 输出
  44 +global PlanResult planResult;
  45 +
  46 +function Map xlidParams(String xlid) {
  47 + Map param = new HashMap();
  48 + param.put("xl.id_eq", Integer.valueOf(xlid));
  49 + return param;
  50 +}
  51 +
  52 +function List ecList(EmployeeConfigInfoRepository repo, String ecids) {
  53 + List<String> ids = Arrays.asList(ecids.split("-"));
  54 + List rst = new ArrayList();
  55 + for (int i = 0; i < ids.size(); i++) {
  56 + rst.add(repo.findById(Long.parseLong(ids.get(i))).get());
  57 + }
  58 + return rst;
  59 +}
  60 +
  61 +function LocalTime fcsjTime(String fcsj) {
  62 + if ("NULL".equals(fcsj)) {
  63 + return null;
  64 + }
  65 + return LocalTime.parse(fcsj, DateTimeFormat.forPattern("HH:mm"));
  66 +}
  67 +
  68 +function String ttInfoId_sd(Map map, DateTime sd) {
  69 + TTInfoResult_output ttInfoResult_output = (TTInfoResult_output) map.get(sd);
  70 + return ttInfoResult_output.getTtInfoId();
  71 +}
  72 +
  73 +function Map gsMap(List gses) {
  74 + Map gsMap = new HashMap();
  75 + for (int i = 0; i < gses.size(); i++) {
  76 + Business gs = (Business) gses.get(i);
  77 + if (StringUtils.isNotEmpty(gs.getBusinessCode())) {
  78 + if ("88".equals(gs.getUpCode())) { // 峨眉公交
  79 + gsMap.put(gs.getBusinessCode(), gs);
  80 + }
  81 + if (gs.getBusinessCode().equals(gs.getUpCode())) { // 闵行,青浦
  82 + gsMap.put(gs.getBusinessCode(), gs);
  83 + }
  84 + }
  85 + }
  86 + return gsMap;
  87 +}
  88 +
  89 +function Map fgsMap(List gses) {
  90 + // 这里简单将 businessCode和upCode合并
  91 + Map fgsMap = new HashMap();
  92 + for (int i = 0; i < gses.size(); i++) {
  93 + Business gs = (Business) gses.get(i);
  94 + if (StringUtils.isNotEmpty(gs.getBusinessCode()) && StringUtils.isNotEmpty(gs.getUpCode())) {
  95 + fgsMap.put(gs.getUpCode() + "_" + gs.getBusinessCode(), gs);
  96 + }
  97 + }
  98 + return fgsMap;
  99 +}
  100 +
  101 +/*
  102 + 规则说明:
  103 + 根据循环规则输出,时刻表选择规则输出,组合计算排班明细
  104 +*/
  105 +
  106 +//-------------------- 第一阶段、计算迭代数据 -----------------//
  107 +declare Loop_result
  108 + xlId: String // 线路id
  109 +
  110 + ruleLoop: List // 每天分配的规则 List<ScheduleResult_output>
  111 +
  112 + ttInfoMapLoop_temp: Map // 每天分配的时刻表 Map<DataTime, Collection<TTInfoResult_output>>
  113 + ttInfoMapLoop: Map // 每天分配的时刻表 Map<DataTime, TTInfoResult_output>
  114 + ttInfoMap: Map // 总共用到的时刻表 Map<id, TTInfoResult_output>
  115 +end
  116 +
  117 +rule "calcu_step1_Loop_result"
  118 + salience 1000
  119 + when
  120 + $param: PlanCalcuParam_input($xlId: xlId)
  121 + then
  122 + Loop_result loop_result = new Loop_result();
  123 + loop_result.setXlId($xlId);
  124 + loop_result.setRuleLoop($param.getScheduleResults_output().getResults());
  125 +
  126 + loop_result.setTtInfoMapLoop(new HashMap());
  127 + loop_result.setTtInfoMap(new HashMap());
  128 +
  129 + com.google.common.collect.Multimap ttInfoMap_temp =
  130 + (com.google.common.collect.Multimap)
  131 + $param.getTtInfoResults_output().getResults().get(
  132 + String.valueOf($xlId));
  133 +
  134 + loop_result.setTtInfoMapLoop_temp(ttInfoMap_temp.asMap());
  135 +
  136 + insert(loop_result);
  137 +
  138 +// log.info("calcu_step1_Loop_result");
  139 +end
  140 +
  141 +rule "calcu_step2_loop_result"
  142 + salience 1000
  143 + no-loop
  144 + when
  145 + $param: PlanCalcuParam_input($xlId: xlId)
  146 + $lr: Loop_result(xlId == $xlId)
  147 + $sd: DateTime() from $lr.ttInfoMapLoop_temp.keySet()
  148 + then
  149 + // 当天时刻表只取第一张 TODO:
  150 + Collection col = (Collection) $lr.getTtInfoMapLoop_temp().get($sd);
  151 + Iterator iter = col.iterator();
  152 + TTInfoResult_output ttInfo_result = (TTInfoResult_output) iter.next();
  153 + $lr.getTtInfoMapLoop().put($sd, ttInfo_result);
  154 +
  155 + // 总共使用的时刻表
  156 + $lr.getTtInfoMap().put(ttInfo_result.getTtInfoId(), ttInfo_result);
  157 +
  158 + update($lr);
  159 +
  160 +// log.info("calcu_step2_Loop_result");
  161 +end
  162 +
  163 +//-------------------- 第二阶段、将时刻表班次,车辆配置,人员配置信息载入 -----------------//
  164 +
  165 +//--------------- 车辆配置信息载入 -------------//
  166 +declare CarConfig_Wraps
  167 + xlId: String // 线路Id
  168 + ccMap: Map // 车辆配置Map Map<id, CarConfigInfo>
  169 +end
  170 +
  171 +rule "calcu_CarConfig_Wraps"
  172 + salience 800
  173 + when
  174 + $lr: Loop_result($xlId: xlId)
  175 + then
  176 + List carConfigInfos = carConfigInfoRepository.findByXlId(Integer.parseInt($xlId));
  177 +
  178 + CarConfig_Wraps carConfig_wraps = new CarConfig_Wraps();
  179 + carConfig_wraps.setXlId($xlId);
  180 + carConfig_wraps.setCcMap(new HashMap());
  181 +
  182 + for (int i = 0; i < carConfigInfos.size(); i++) {
  183 + CarConfigInfo carConfigInfo = (CarConfigInfo) carConfigInfos.get(i);
  184 + carConfig_wraps.getCcMap().put(carConfigInfo.getId().toString(), carConfigInfo);
  185 + }
  186 +
  187 + insert(carConfig_wraps);
  188 +
  189 + log.info("calcu_CarConfig_Wrap");
  190 +end
  191 +
  192 +//--------------- 人员配置信息载入 --------------//
  193 +declare EmployeeConfig_Wraps
  194 + xlId: String // 线路Id
  195 + ecMap: Map // 人员配置Map Map<id, EmployeeConfigInfo>
  196 +end
  197 +
  198 +rule "calcu_EmployeeConfig_Wraps"
  199 + salience 800
  200 + when
  201 + $lr: Loop_result($xlId: xlId)
  202 + then
  203 + List employeeConfigInfos = employeeConfigInfoRepository.findByXlId(Integer.parseInt($xlId));
  204 +
  205 + EmployeeConfig_Wraps employeeConfig_wraps = new EmployeeConfig_Wraps();
  206 + employeeConfig_wraps.setXlId($xlId);
  207 + employeeConfig_wraps.setEcMap(new HashMap());
  208 +
  209 + for (int i = 0; i < employeeConfigInfos.size(); i++) {
  210 + EmployeeConfigInfo employeeConfigInfo = (EmployeeConfigInfo) employeeConfigInfos.get(i);
  211 + employeeConfig_wraps.getEcMap().put(employeeConfigInfo.getId().toString(), employeeConfigInfo);
  212 + }
  213 +
  214 + insert(employeeConfig_wraps);
  215 +
  216 + log.info("calcu_EmployeeConfig_Wrap");
  217 +end
  218 +
  219 +//----------------- 时刻表班次信息载入 -----------------//
  220 +declare TTInfo_gid_stat
  221 + xlId: String // 线路id(cast字符串-方便比较)
  222 + ttInfoId: String // 时刻表id(cast字符串-方便比较)
  223 + gid: String // 路牌id(cast字符串-方便比较)
  224 +
  225 + maxFcno: Integer // 最大发车顺序号
  226 +
  227 + fbTime: LocalTime // 分班时间
  228 + fbfcno: Integer // 分班发车顺序号
  229 +end
  230 +
  231 +rule "calcu_TTInfo_gid_stat"
  232 + salience 800
  233 + when
  234 + $lr: Loop_result($xlId: xlId)
  235 + $ttInfoId: String() from $lr.getTtInfoMap().keySet()
  236 + $gids: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidscount($ttd))
  237 + $gid: String() from $gids
  238 + $fbtime_str: String() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidfbtime($ttd))
  239 + $fbfcno: Integer() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidfbfcno($ttd))
  240 + $maxfcno: Double() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), max($ttd.getFcno()))
  241 + then
  242 + TTInfo_gid_stat ttInfo_gid_stat = new TTInfo_gid_stat();
  243 + ttInfo_gid_stat.setXlId($xlId);
  244 + ttInfo_gid_stat.setTtInfoId($ttInfoId);
  245 + ttInfo_gid_stat.setGid($gid);
  246 +
  247 + ttInfo_gid_stat.setMaxFcno($maxfcno.intValue());
  248 + ttInfo_gid_stat.setFbTime(fcsjTime($fbtime_str));
  249 + ttInfo_gid_stat.setFbfcno($fbfcno);
  250 +
  251 + insert(ttInfo_gid_stat);
  252 +
  253 +// log.info("xlid={},ttid={},gid={},maxfcno={},fbtime={},fbfcno={}",
  254 +// $xlId, $ttInfoId, $gid, ttInfo_gid_stat.getMaxFcno(), ttInfo_gid_stat.getFbTime(), ttInfo_gid_stat.getFbfcno());
  255 +
  256 +end
  257 +
  258 +declare TTInfoDetail_Wrap
  259 + isFirstBc: Boolean = false // 是否是当前路牌的第一个班次
  260 + isLastBc: Boolean = false // 是否是当前路牌的最后一个班次
  261 + isFb: Boolean = false // 是否分班
  262 +
  263 + self: TTInfoDetail // 原始数据
  264 +end
  265 +
  266 +declare TTInfoDetail_Wraps
  267 + xlId: String // 线路id(cast字符串-方便比较)
  268 + ttInfoId: String // 时刻表id(cast字符串-方便比较)
  269 +
  270 + detailsMap: Map // 明细Map,Map<路牌id, List<TTInfoDetail_Wrap>>
  271 +end
  272 +
  273 +rule "calcu_TTInfoDetail_Wraps"
  274 + salience 700
  275 + when
  276 + $lr: Loop_result($xlId: xlId)
  277 + $ttInfoId: String() from $lr.getTtInfoMap().keySet()
  278 + $ttInfoStatList: List(size > 0) from collect (TTInfo_gid_stat(ttInfoId == $ttInfoId))
  279 + then
  280 + TTInfoDetail_Wraps ttInfoDetail_wraps = new TTInfoDetail_Wraps();
  281 + ttInfoDetail_wraps.setXlId($xlId);
  282 + ttInfoDetail_wraps.setTtInfoId($ttInfoId);
  283 + ttInfoDetail_wraps.setDetailsMap(new HashMap());
  284 +
  285 + // 将list的形式变成 Map<路牌id, TTInfo_gid_stat>
  286 + Map statMap = new HashMap();
  287 + for (int i = 0; i < $ttInfoStatList.size(); i++) {
  288 + TTInfo_gid_stat ttInfo_gid_stat = (TTInfo_gid_stat) $ttInfoStatList.get(i);
  289 + statMap.put(ttInfo_gid_stat.getGid(), ttInfo_gid_stat);
  290 + }
  291 +
  292 + // 迭代ttinfodetail,拼装 TTInfoDetail_Wraps
  293 + List detaillist = tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId));
  294 + for (int j = 0; j < detaillist.size(); j++) {
  295 + TTInfoDetail ttInfoDetail = (TTInfoDetail) detaillist.get(j);
  296 + String gid = String.valueOf(ttInfoDetail.getLp().getId());
  297 +
  298 + if (ttInfoDetail_wraps.getDetailsMap().get(gid) == null) {
  299 + ttInfoDetail_wraps.getDetailsMap().put(gid, new ArrayList());
  300 + }
  301 +
  302 + // 获取stat
  303 + TTInfo_gid_stat ttInfo_gid_stat = (TTInfo_gid_stat) statMap.get(gid);
  304 +
  305 + TTInfoDetail_Wrap ttInfoDetail_wrap = new TTInfoDetail_Wrap();
  306 + ttInfoDetail_wrap.setIsFirstBc(1 == ttInfoDetail.getFcno());
  307 + ttInfoDetail_wrap.setIsLastBc(ttInfo_gid_stat.getMaxFcno() == ttInfoDetail.getFcno());
  308 +
  309 + LocalTime fcsj = fcsjTime(ttInfoDetail.getFcsj());
  310 + LocalTime fbsj = ttInfo_gid_stat.getFbTime();
  311 + Integer fbfcno = ttInfo_gid_stat.getFbfcno();
  312 + // 不用时间判定,因为有的路牌,后面的班次都是凌晨的,时间反而比分班时间早,不合理,所以使用发车顺序号做第二次比较
  313 +// ttInfoDetail_wrap.setIsFb(fbsj == null ? false : (fcsj.isEqual(fbsj) || fcsj.isAfter(fbsj)));
  314 + ttInfoDetail_wrap.setIsFb(fbsj == null ? false : ttInfoDetail.getFcno() >= fbfcno);
  315 +
  316 + ttInfoDetail_wrap.setSelf(ttInfoDetail);
  317 +
  318 + ((List) ttInfoDetail_wraps.getDetailsMap().get(gid)).add(ttInfoDetail_wrap);
  319 +
  320 + }
  321 +
  322 +
  323 + insert(ttInfoDetail_wraps);
  324 +
  325 + log.info("xlid={}, ttinfoid={}, lpstatCount={}, detailLpCount={}",
  326 + $xlId, $ttInfoId, $ttInfoStatList.size(), ttInfoDetail_wraps.getDetailsMap().keySet().size());
  327 +
  328 +
  329 +end
  330 +
  331 +declare TTInfoDetail_Wraps_map
  332 + xlId: String // 线路id(cast字符串-方便比较)
  333 +
  334 + wrapsMap: Map // 明细Map,Map<时刻表Id, TTInfoDetail_Wraps>
  335 +end
  336 +
  337 +rule "calcu_TTInfoDetail_Wraps_toMap"
  338 + salience 600
  339 + when
  340 + $lr: Loop_result($xlId: xlId)
  341 + $wrapsList: List(size > 0) from collect (TTInfoDetail_Wraps(xlId == $xlId))
  342 + then
  343 + // 转换成Map
  344 + TTInfoDetail_Wraps_map all = new TTInfoDetail_Wraps_map();
  345 + all.setXlId($xlId);
  346 + all.setWrapsMap(new HashMap());
  347 +
  348 + for (int i = 0; i < $wrapsList.size(); i++) {
  349 + TTInfoDetail_Wraps ttInfoDetail_wraps = (TTInfoDetail_Wraps) $wrapsList.get(i);
  350 + all.getWrapsMap().put(ttInfoDetail_wraps.getTtInfoId(), ttInfoDetail_wraps);
  351 + }
  352 +
  353 + insert(all);
  354 +end
  355 +
  356 +
  357 +
  358 +
  359 +//-------------------- 第三阶段、合并计算SchedulePlanInfo -----------------//
  360 +
  361 +
  362 +rule "Calcu_SchedulePlanInfo"
  363 + salience 500
  364 + when
  365 + $param: PlanCalcuParam_input($xlId: xlId)
  366 + $lr: Loop_result(xlId == $xlId)
  367 + $ccs: CarConfig_Wraps(xlId == $xlId)
  368 + $ecs: EmployeeConfig_Wraps(xlId == $xlId)
  369 + $tts: TTInfoDetail_Wraps_map(xlId == $xlId)
  370 + then
  371 + // 线路
  372 + Line xl = lineRepository.findById(Integer.parseInt($xlId)).get();
  373 +
  374 + // 查找公司
  375 + List gses = (List) businessRepository.findAll();
  376 + // 构造公司代码对应map
  377 + Map gsMap = gsMap(gses);
  378 + // 构造分公司对应的map
  379 + Map fgsMap = fgsMap(gses);
  380 +
  381 + for (int i = 0; i < $lr.getRuleLoop().size(); i++) {
  382 + ScheduleResult_output sro = (ScheduleResult_output) $lr.getRuleLoop().get(i);
  383 +
  384 + // 日期
  385 + DateTime sd = sro.getSd();
  386 + // 路牌
  387 + String gid = sro.getGuideboardId();
  388 + // 车辆配置
  389 + CarConfigInfo carConfigInfo = sro.getsType() == ScheduleRule_Type.NORMAL ?
  390 + (CarConfigInfo) $ccs.getCcMap().get(sro.getCarConfigId()) : null;
  391 + // 人员配置
  392 + List eclist = sro.getsType() == ScheduleRule_Type.NORMAL ?
  393 + ecList(employeeConfigInfoRepository, sro.getEmployeeConfigId()) : null;
  394 +
  395 + // 时刻表id
  396 + String ttInfoId = ttInfoId_sd($lr.getTtInfoMapLoop(), sd);
  397 + TTInfoDetail_Wraps ttInfoDetail_wraps = (TTInfoDetail_Wraps) $tts.getWrapsMap().get(ttInfoId);
  398 + if (ttInfoDetail_wraps == null) {
  399 + // 时刻表为空,直接跳过
  400 + // 如1118路,周末不开,此是时刻表指定一个空表
  401 + // TODO:这个以后要改的,选时刻表的规则要修正,没有默认的时刻表
  402 + continue;
  403 + }
  404 +
  405 + List detaillist = (List) ttInfoDetail_wraps.getDetailsMap().get(gid);
  406 + if (detaillist == null) {
  407 + // 这里翻到的路牌时刻表里可能没有,
  408 + // 因为没有考虑翻班格式(就是做几休几)
  409 + // 所有翻班格式全由时刻表决定,即时刻表有的路牌就做,没有不做
  410 + continue;
  411 + }
  412 +
  413 + for (int j = 0; j < detaillist.size(); j++) {
  414 + TTInfoDetail_Wrap wrap = (TTInfoDetail_Wrap) detaillist.get(j);
  415 +
  416 + SchedulePlanInfo schedulePlanInfo = new SchedulePlanInfo(
  417 + xl,
  418 + sro,
  419 + wrap.getSelf(),
  420 + wrap.getIsFb(),
  421 + carConfigInfo,
  422 + eclist,
  423 + $param.getSchedulePlan(),
  424 + wrap.getIsFirstBc(),
  425 + wrap.getIsLastBc(),
  426 + sro.getsType()
  427 + );
  428 +
  429 + // 获取公司,分公司信息
  430 + String gsbm = xl.getCompany();
  431 + String fgsbm = xl.getBrancheCompany();
  432 + Business gs = null;
  433 + Business fgs = null;
  434 +
  435 + if (StringUtils.isNotEmpty(gsbm)) {
  436 + gs = (Business) gsMap.get(gsbm);
  437 + }
  438 + if (StringUtils.isNotEmpty(gsbm) && StringUtils.isNotEmpty(fgsbm)) {
  439 + fgs = (Business) fgsMap.get(gsbm + "_" + fgsbm);
  440 + }
  441 +
  442 + if (gs != null) {
  443 + schedulePlanInfo.setGsBm(gs.getBusinessCode());
  444 + schedulePlanInfo.setGsName(gs.getBusinessName());
  445 + }
  446 + if (fgs != null) {
  447 + schedulePlanInfo.setFgsBm(fgs.getBusinessCode());
  448 + schedulePlanInfo.setFgsName(fgs.getBusinessName());
  449 + }
  450 +
  451 + // 操作人,操作时间
  452 + schedulePlanInfo.setCreateBy($param.getSchedulePlan().getCreateBy());
  453 + schedulePlanInfo.setCreateDate($param.getSchedulePlan().getCreateDate());
  454 + schedulePlanInfo.setUpdateBy($param.getSchedulePlan().getUpdateBy());
  455 + schedulePlanInfo.setUpdateDate($param.getSchedulePlan().getUpdateDate());
  456 +
  457 + // result 输出
  458 + planResult.getSchedulePlanInfos().add(schedulePlanInfo);
  459 +
  460 + }
  461 +
  462 + }
  463 +
  464 + log.info("xlid={} plan ok!", $xlId);
  465 +
  466 +end
  467 +
  468 +
  469 +
  470 +
  471 +
  472 +
  473 +
  474 +
  475 +
  476 +
  477 +
  478 +
  479 +
  480 +
src/main/resources/static/e10adc3949ba59abbe56e057f20f883e.html
@@ -181,7 +181,7 @@ @@ -181,7 +181,7 @@
181 <div class="wrapper ng-scope"> 181 <div class="wrapper ng-scope">
182 <div id="loginPanel" class="dialog dialog-shadow"> 182 <div id="loginPanel" class="dialog dialog-shadow">
183 <br> 183 <br>
184 - <h3 class="logo-text">浦东公交调度系统</h3> 184 + <h3 class="logo-text">峨眉公交调度系统</h3>
185 <hr> 185 <hr>
186 <form style="padding: 0px 35px;"> 186 <form style="padding: 0px 35px;">
187 <div class="form-group" style="margin-bottom: 0"> 187 <div class="form-group" style="margin-bottom: 0">
src/main/resources/static/index.html
1 -<!DOCTYPE html>  
2 -<html lang="zh">  
3 -<head>  
4 - <meta name="renderer" content="webkit" />  
5 - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />  
6 - <meta charset="UTF-8">  
7 - <title>调度系统</title>  
8 -  
9 - <meta http-equiv="Pragma" content="no-cache">  
10 - <meta http-equiv="Cache-control" content="no-cache">  
11 - <meta http-equiv="Cache" content="no-cache">  
12 -  
13 - <!-- Font Awesome 图标字体 -->  
14 - <link  
15 - href="/metronic_v4.5.4/plugins/font-awesome/css/font-awesome.min.css"  
16 - rel="stylesheet" type="text/css" />  
17 - <!-- Bootstrap style -->  
18 - <link href="/metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css"  
19 - rel="stylesheet" type="text/css" />  
20 - <!-- jsTree 数插件 -->  
21 - <link  
22 - href="/metronic_v4.5.4/plugins/jstree/dist/themes/default/style.min.css"  
23 - rel="stylesheet" type="text/css" />  
24 - <!-- MULTI-select 多选下拉框美化 -->  
25 - <link  
26 - href="/metronic_v4.5.4/plugins/jquery-multi-select/css/multi-select.css"  
27 - rel="stylesheet" type="text/css" />  
28 -  
29 - <!-- editable -->  
30 - <link  
31 - href="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/css/bootstrap-editable.css"  
32 - rel="stylesheet" type="text/css" />  
33 - <!-- METRONIC style -->  
34 - <link href="/metronic_v4.5.4/layout4/css/themes/light.min.css"  
35 - rel="stylesheet" type="text/css" id="style_color" />  
36 - <link href="/metronic_v4.5.4/css/components.css" rel="stylesheet"  
37 - type="text/css" />  
38 - <link href="/metronic_v4.5.4/css/plugins.css" rel="stylesheet"  
39 - type="text/css" />  
40 - <link href="/metronic_v4.5.4/layout4/css/layout.min.css"  
41 - rel="stylesheet" type="text/css" />  
42 - <link href="/metronic_v4.5.4/layout4/css/custom.min.css"  
43 - rel="stylesheet" type="text/css" />  
44 - <!-- select2 下拉框插件 -->  
45 - <link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css"  
46 - rel="stylesheet" type="text/css" />  
47 - <link  
48 - href="/metronic_v4.5.4/plugins/select2/css/select2-bootstrap.min.css"  
49 - rel="stylesheet" type="text/css" />  
50 - <!-- layer 弹层 插件 -->  
51 - <link href="/assets/plugins/layer-v2.4/layer/skin/layer.css"  
52 - rel="stylesheet" type="text/css" />  
53 - <!-- fileinput 上传 插件 -->  
54 - <link href="/assets/plugins/fileinput/css/fileinput.min.css"  
55 - rel="stylesheet" type="text/css" />  
56 - <!-- iCheck 单选框和复选框 -->  
57 - <link href="/metronic_v4.5.4/plugins/icheck/skins/all.css"  
58 - rel="stylesheet" type="text/css" />  
59 - <!-- 日期控件 -->  
60 - <link  
61 - href="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/css/bootstrap-datetimepicker.min.css"  
62 - rel="stylesheet" type="text/css" />  
63 - <!-- table 表格控件 -->  
64 - <!--<link rel="stylesheet"-->  
65 - <!--href="//api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css"-->  
66 - <!--type="text/css" />-->  
67 - <link href="/metronic_v4.5.4/plugins/bootstrap-tagsinput/bootstrap-tagsinput.css" rel="stylesheet" type="text/css"/>  
68 - <!-- handsontable样式 -->  
69 - <link rel="stylesheet"  
70 - href="/assets/bower_components/handsontable/dist/handsontable.full.css" />  
71 - <!-- sweetalert样式 -->  
72 - <link rel="stylesheet"  
73 - href="/assets/bower_components/sweetalert/dist/sweetalert.css" />  
74 - <!-- schedule计划调度AngularJS模块主css -->  
75 - <link rel="stylesheet" href="/pages/scheduleApp/module/common/main.css"  
76 - type="text/css" />  
77 - <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" merge="plugins"/>  
78 -  
79 - <!-- CSS动画 -->  
80 - <link  
81 - href="/metronic_v4.5.4/plugins/tipso/css/animate.css"  
82 - rel="stylesheet" type="text/css" />  
83 -  
84 - <!-- 提示工具样式 -->  
85 - <link  
86 - href="/metronic_v4.5.4/plugins/tipso/css/tipso.css"  
87 - rel="stylesheet" type="text/css" />  
88 -  
89 - <style type="text/css">  
90 - .searchForm {  
91 -  
92 - }  
93 -  
94 - .searchForm .form-group .control-label {  
95 - padding-right: 0px;  
96 - text-align: right;  
97 - margin-top: 7px;  
98 - }  
99 -  
100 - .searchForm .form-group>div {  
101 - padding-left: 10px;  
102 - padding-right: 0px;  
103 - }  
104 -  
105 - .searchForm .row>div {  
106 - padding-left: 0px;  
107 - padding-right: 0px;  
108 - padding: 5px 0 5px 0;  
109 - width: 270px;  
110 - display: inline-block;  
111 - }  
112 -  
113 - .searchForm .form-actions {  
114 -  
115 - }  
116 -  
117 - tr.row-active td {  
118 - border-bottom: 1px solid blue !important;  
119 - color: blue;  
120 - }  
121 -  
122 - .ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection  
123 - {  
124 - font-size: 14px;  
125 - }  
126 -  
127 - .ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection  
128 - {  
129 - padding: 6px 26px;  
130 - }  
131 -  
132 - .ms-container .ms-list {  
133 - height: 306px;  
134 - }  
135 -  
136 - .ms-container .ms-selectable,.ms-container .ms-selection {  
137 - width: 47%;  
138 - }  
139 -  
140 - .ms-container {  
141 - width: 470px;  
142 - margin: auto;  
143 - }  
144 -  
145 - .multi-custom-header-left {  
146 - text-align: center;  
147 - padding: 7px;  
148 - color: #3B3F51;  
149 - }  
150 -  
151 - .multi-custom-header-right {  
152 - text-align: center;  
153 - padding: 7px;  
154 - font-weight: bold;  
155 - color: #36C6D3;  
156 - }  
157 -  
158 - .mt-element-list .list-simple.mt-list-container ul>.mt-list-item>.list-item-content  
159 - {  
160 - padding: 0 55px 0 0px;  
161 - }  
162 -  
163 - .mt-element-list .list-simple.mt-list-container ul>.mt-list-item {  
164 - padding: 3.3px 0;  
165 - }  
166 -  
167 - #route-container {  
168 - display: none;  
169 - }  
170 -  
171 - .page-content.active {  
172 - display: block !important;  
173 - }  
174 -  
175 - .page-header.navbar .page-logo .logo-default {  
176 - margin: 0;  
177 - }  
178 -  
179 - .page-header.navbar .top-menu .navbar-nav>li.dropdown.open .dropdown-toggle  
180 - {  
181 - background-color: #284a99;  
182 - }  
183 -  
184 - .page-header.navbar .page-logo {  
185 - padding-right: 10px;  
186 - }  
187 -  
188 - .page-logo .logo-default.logo-default-text {  
189 - font-weight: 600;  
190 - color: white !important;  
191 - margin-top: 19px !important;  
192 - font-size: 24px;  
193 - text-decoration: none;  
194 - }  
195 -  
196 - .page-logo .logo-default.logo-default-text:HOVER {  
197 - color: #dedede !important;  
198 - }  
199 -  
200 - body,.page-content-wrapper,#pjax-container{  
201 - height: 100%;  
202 - }  
203 - html{  
204 - height: 90%;  
205 - }  
206 - .page-container{  
207 - height: 100%;  
208 - }  
209 - </style>  
210 -  
211 - <!-- ocLazyLoading载入文件的位置 -->  
212 - <link id="ng_load_plugins_before" />  
213 -  
214 -</head>  
215 -<body  
216 - class="page-container-bg-solid page-header-fixed page-sidebar-closed-hide-logo page-sidebar-fixed">  
217 -<div class="page-header navbar navbar-fixed-top"  
218 - style="background: linear-gradient(to bottom, #124e78, #125688);">  
219 - <div class="page-header-inner ">  
220 - <!-- LOGO -->  
221 - <div class="page-logo">  
222 - <a href="index.html" class="logo-default logo-default-text">  
223 - 浦东公交调度系统 </a>  
224 - <div class="menu-toggler sidebar-toggler"></div>  
225 - </div>  
226 - <!-- END LOGO -->  
227 - <a href="javascript:;" class="menu-toggler responsive-toggler"  
228 - data-toggle="collapse" data-target=".navbar-collapse"> </a>  
229 - <div class="page-top">  
230 - <div class="top-menu">  
231 - <ul class="nav navbar-nav pull-right">  
232 - <!-- 信息通知区 -->  
233 - <li  
234 - class="dropdown dropdown-extended dropdown-notification dropdown-dark"  
235 - id="header_notification_bar"><a href="javascript:;"  
236 - class="dropdown-toggle" data-toggle="dropdown"  
237 - data-hover="dropdown" data-close-others="true"> <i  
238 - class="fa fa-bell"></i> <span class="badge badge-success">  
239 - 0 </span>  
240 - </a>  
241 - <ul class="dropdown-menu" style="max-width: 345px; width: 345px;">  
242 - <li class="external">  
243 - <h3>  
244 - 今日 <span class="bold">0 条</span> 通知  
245 - </h3> <a href="javascript:;">查看全部</a>  
246 - </li>  
247 - <li>  
248 - <ul class="dropdown-menu-list scroller" style="height: 250px;"  
249 - data-handle-color="#637283">  
250 - </ul>  
251 - </li>  
252 - </ul></li>  
253 - <li class="dropdown dropdown-user dropdown-dark"><a  
254 - href="javascript:;" class="dropdown-toggle"  
255 - data-toggle="dropdown" data-hover="dropdown"  
256 - data-close-others="true"> <span id="indexTopUName"  
257 - class="username username-hide-on-mobile"  
258 - style="vertical-align: middle;"> <i class="fa fa-user"></i></span>  
259 - </a>  
260 - <ul class="dropdown-menu dropdown-menu-default">  
261 - <li><a href="javascript:;"> <i class="fa fa-user"></i>  
262 - 我的信息  
263 - </a></li>  
264 - <li><a href="javascript:;" id="changePWD"> <i  
265 - class="fa fa-unlock-alt"></i> 修改密码  
266 - </a></li>  
267 - <li class="divider"></li>  
268 - <li><a href="javascript:;"> <i class="fa fa-lock"></i>  
269 - 锁屏  
270 - </a></li>  
271 - <li><a href="/logout"> <i class="fa fa-key"></i> 注销登陆  
272 - </a></li>  
273 - </ul></li>  
274 - </ul>  
275 - </div>  
276 - </div>  
277 - </div>  
278 -</div>  
279 -<div class="page-container">  
280 - <div class="page-sidebar-wrapper">  
281 - <div class="page-sidebar navbar-collapse collapse">  
282 - <ul class="page-sidebar-menu page-sidebar-menu-fixed"  
283 - data-keep-expanded="false" data-auto-scroll="true"  
284 - data-slide-speed="200" id="leftMenuSidebar">  
285 - </ul>  
286 - </div>  
287 - </div>  
288 - <div class="page-content-wrapper">  
289 - <div id="pjax-container" class="page-content"></div>  
290 -  
291 - <div id="route-container">  
292 - <div ng-app="ScheduleApp">  
293 - <div ng-controller="ScheduleAppController">  
294 -  
295 - <!-- loading widget -->  
296 - <div id="loadingWidget" class="flyover mask" loading-widget>  
297 - <div class="alert alert-info">  
298 - <strong>载入中......</strong>  
299 - </div>  
300 - </div>  
301 -  
302 - <div ui-view class="uv"></div>  
303 - </div>  
304 - </div>  
305 - </div>  
306 - </div>  
307 -</div>  
308 -  
309 -<script id="menu_list_temp" type="text/html">  
310 - {{each list as group i}}  
311 - <li class="heading">  
312 - <h3 class="uppercase">{{group.name}}</h3>  
313 - </li>  
314 - {{each group.children as dir j}}  
315 - <li class="nav-item">  
316 - <a href="javascript:;" class="nav-link nav-toggle ">  
317 - <i class="{{dir.icon}}"></i>  
318 - <span class="title">{{dir.name}}</span>  
319 - <span class="arrow"></span>  
320 - </a>  
321 - <ul class="sub-menu">  
322 - {{each dir.children as module s}}  
323 - <li class="nav-item ">  
324 - {{if module.container=="pjax-container"}}  
325 - <a href="/pages/{{module.path}}" class="nav-link " data-pjax>  
326 - <span class="title">{{module.name}}</span>  
327 - </a>  
328 - {{else}}  
329 - <a href="{{module.path}}" class="nav-link " data-angularjs>  
330 - <span class="title">{{module.name}}</span>  
331 - </a>  
332 - {{/if}}  
333 - </li>  
334 - {{/each}}  
335 - </ul>  
336 - </li>  
337 - {{/each}}  
338 - {{/each}}  
339 -  
340 -</script>  
341 -<script>  
342 - delete window.require;  
343 - delete window.exports;  
344 - delete window.module;  
345 -</script>  
346 -<!-- jQuery -->  
347 -<script src="/metronic_v4.5.4/plugins/jquery.min.js" data-exclude=1></script>  
348 -<!-- bootstrap -->  
349 -<script src="/metronic_v4.5.4/plugins/bootstrap/js/bootstrap.min.js"  
350 - data-exclude=1></script>  
351 -<script src="/pages/forms/statement/js/jquery.autocompleter.js"></script>  
352 -<script src="/pages/forms/statement/js/jquery.PrintArea.js"></script>  
353 -<!-- MTRONIC JS -->  
354 -<script src="/metronic_v4.5.4/scripts/app.min.js" data-exclude=1></script>  
355 -<script src="/metronic_v4.5.4/layout4/scripts/layout.min.js"  
356 - data-exclude=1></script>  
357 -<!-- 虚拟滚动条 -->  
358 -<script  
359 - src="/metronic_v4.5.4/plugins/jquery-slimscroll/jquery.slimscroll.min.js"></script>  
360 -<!-- jsTree 树插件 -->  
361 -<script src="/metronic_v4.5.4/plugins/jstree/dist/jstree.min.js"></script>  
362 -<!-- bootstrap-hover-dropDown -->  
363 -<script  
364 - src="/metronic_v4.5.4/plugins/bootstrap-hover-dropdown/bootstrap-hover-dropdown.min.js"></script>  
365 -<!-- jquery.validate 表单验证 -->  
366 -<script  
367 - src="/metronic_v4.5.4/plugins/jquery-validation/js/jquery.validate.min.js"></script>  
368 -<script  
369 - src="/metronic_v4.5.4/plugins/jquery-validation/js/localization/messages_zh.js"></script>  
370 -<!-- 向导式插件 -->  
371 -<script  
372 - src="/metronic_v4.5.4//plugins/bootstrap-wizard/jquery.bootstrap.wizard.min.js"></script>  
373 -<!-- iCheck 单选框和复选框 -->  
374 -<script src="/metronic_v4.5.4/plugins/icheck/icheck.min.js"></script>  
375 -<!-- select2 下拉框 -->  
376 -<script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js"></script>  
377 -<!-- MULTI SELECT 多选下拉框 -->  
378 -<script  
379 - src="/metronic_v4.5.4/plugins/jquery-multi-select/js/jquery.multi-select.js"></script>  
380 -<!-- editable.js -->  
381 -<script  
382 - src="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/js/bootstrap-editable.min.js"></script>  
383 -<!-- PJAX -->  
384 -<script src="/assets/plugins/jquery.pjax.js"></script>  
385 -<!-- layer 弹层 -->  
386 -<script src="/assets/plugins/layer-v2.4/layer/layer.js" data-exclude=1></script>  
387 -<!-- fileinput 上传 -->  
388 -<script src="/assets/plugins/fileinput/canvas-to-blob.min.js"></script>  
389 -<script src="/assets/plugins/fileinput/purify.min.js"></script>  
390 -<script src="/assets/plugins/fileinput/sortable.min.js"></script>  
391 -<script src="/assets/plugins/fileinput/fileinput.min.js"></script>  
392 -<script src="/assets/plugins/fileinput/fileinput_locale_zh.js"></script>  
393 -<!-- jquery.purl URL解析 -->  
394 -<script src="/assets/plugins/purl.js"></script>  
395 -<!-- jquery.serializejson JSON序列化插件 -->  
396 -<script src="/assets/plugins/jquery.serializejson.js"></script>  
397 -<!-- art-template 模版引擎 -->  
398 -<script src="/assets/plugins/template.js"></script>  
399 -<!-- jquery.pageinator 分页 -->  
400 -<script src="/assets/plugins/jqPaginator.min.js"></script>  
401 -<!-- moment.js 日期处理类库 -->  
402 -<script src="/assets/plugins/moment-with-locales.js"></script>  
403 -  
404 -<script src="/assets/plugins/pinyin.js"></script>  
405 -<!-- 日期控件 -->  
406 -<script  
407 - src="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/js/bootstrap-datetimepicker.min.js"></script>  
408 -<!-- 表格控件 -->  
409 -<script src="/metronic_v4.5.4/plugins/bootstrap-tagsinput/bootstrap-tagsinput.min.js"></script>  
410 -<!-- 统计图控件 -->  
411 -<!--<script src="/assets/global/getEchart.js"></script>  
412 -<script src="/assets/global/echarts.js"></script> -->  
413 -<script src="/assets/js/common.js"></script>  
414 -<script src="/assets/js/dictionary.js"></script>  
415 -<!-- tipso JS -->  
416 -<script src="/metronic_v4.5.4/plugins/tipso/js/tipso.js"></script>  
417 -<script data-exclude=1>  
418 - //初始打开的片段地址  
419 - var initFragment = "^_^initFragment^_^";  
420 - //静态文件目录  
421 - var dir = '/pages/';  
422 - //片段容器  
423 - var pjaxContainer = '#pjax-container'  
424 - , angJsContainer = '#route-container';  
425 -  
426 - $(document).ajaxError(function (event, jqxhr, settings, thrownError) {  
427 - if(jqxhr.status == 403){  
428 - layer.closeAll();  
429 - layer.alert(jqxhr.message?jqxhr.message:'访问被拒绝', {icon: 2, title: '操作失败'});  
430 - }  
431 - });  
432 -  
433 - $(function () {  
434 - $.ajax({  
435 - url: '/user/isWeakCipher',  
436 - type: 'POST',  
437 - async: false,  
438 - success: function (result,status,xhr) {  
439 - if (result.data == 1) {  
440 - $.get('/pages/permission/user/forceChangePWD.html', function (content) {  
441 - layer.open({  
442 - type: 1,  
443 - area: ['600px', '360px'],  
444 - content: content,  
445 - title: '修改密码',  
446 - shift: 5,  
447 - scrollbar: false,  
448 - closeBtn: 0,  
449 - success: function () {  
450 - }  
451 - });  
452 - });  
453 - }  
454 - }  
455 - });  
456 -  
457 - $.ajax({  
458 - url: '/user/isRealName',  
459 - type: 'POST',  
460 - async: false,  
461 - success: function (result,status,xhr) {  
462 - if (result.data == 0) {  
463 - $.get('/pages/permission/user/jobCode.html', function (content) {  
464 - layer.open({  
465 - type: 1,  
466 - area: ['600px', '360px'],  
467 - content: content,  
468 - title: '设置工号(后期统一登录平台接入)',  
469 - shift: 5,  
470 - scrollbar: false,  
471 - success: function () {  
472 - }  
473 - });  
474 - });  
475 - }  
476 - }  
477 - });  
478 -  
479 - $.get('/user/currentUser', function (user) {  
480 - $('#indexTopUName').text(user.userName);  
481 - });  
482 -  
483 - //带 data-pjax 的链接由pjax加载  
484 - $(document).pjax('a[data-pjax]', pjaxContainer);  
485 -  
486 - //pjax左菜单点击事件  
487 - $(document).on('click', '#leftMenuSidebar a[data-pjax]', function () {  
488 - setTitle(this);  
489 -  
490 - $('#leftMenuSidebar li.nav-item.active').removeClass('active');  
491 - $(this).parent().addClass('active');  
492 - showPjax();  
493 - });  
494 -  
495 - //angularjs左菜单点击事件  
496 - $(document).on('click', '#leftMenuSidebar a[data-angularjs]', function () {  
497 - setTitle(this);  
498 -  
499 - $('#leftMenuSidebar li.nav-item.active').removeClass('active');  
500 - $(this).parent().addClass('active');  
501 - showAngJs();  
502 - });  
503 -  
504 - //加载左菜单栏  
505 - $get('/module/findByCurrentUser', null,  
506 - function (ms) {  
507 - var treeArray = createTreeData(ms);  
508 - treeArray.sort(function (a, b) {  
509 - return a.createDate - b.createDate;  
510 - });  
511 - var menuHtml = template('menu_list_temp', {list: treeArray});  
512 - $('#leftMenuSidebar').html(menuHtml);  
513 -  
514 - //----------- 检查URL ----------------  
515 - var h = location.hash;  
516 - if (initFragment && initFragment != '') {  
517 - showPjax();  
518 - //普通片段  
519 - loadPage(initFragment);  
520 - //选中菜单  
521 - $.each($('#leftMenuSidebar a'), function (i, item) {  
522 - if (urlPattern($(item).attr('href'), initFragment)) {  
523 - activeLeftMenu(item);  
524 - }  
525 - });  
526 - } else if (h) {  
527 - //angularjs片段  
528 - showAngJs();  
529 - //选中菜单  
530 - $.each($('#leftMenuSidebar a'), function (i, item) {  
531 - if ($(item).attr('href') == h) {  
532 - activeLeftMenu(item);  
533 - }  
534 - });  
535 - }  
536 - else {  
537 - //加载主页  
538 - loadPage('/pages/home.html');  
539 - }  
540 - });  
541 -  
542 - //修改密码  
543 - $('#changePWD').on('click', function () {  
544 - $.get('/pages/permission/user/changePWD.html', function (content) {  
545 - layer.open({  
546 - type: 1,  
547 - area: ['600px', '360px'],  
548 - content: content,  
549 - title: '修改密码',  
550 - shift: 5,  
551 - scrollbar: false,  
552 - success: function () {  
553 - }  
554 - });  
555 - });  
556 - });  
557 - });  
558 -  
559 - //modal关闭时销毁dom  
560 - $(document).on('hidden.bs.modal', '.modal', function () {  
561 - $(this).remove();  
562 - });  
563 -  
564 - //pjax加载完成事件  
565 - $(document).on('pjax:success', function () {  
566 - var dicts = $(pjaxContainer).find('.nt-dictionary');  
567 - dictionaryUtils.transformDom(dicts);  
568 - });  
569 -  
570 - function loadPage(url) {  
571 - $.pjax({url: url, container: pjaxContainer})  
572 - }  
573 -  
574 - function urlPattern(a, b) {  
575 - var r;  
576 - try {  
577 - r = a.substring(0, a.lastIndexOf('/')) == b.substring(0, b.lastIndexOf('/'));  
578 - } catch (e) {  
579 - r = false;  
580 - }  
581 - return r;  
582 - }  
583 -  
584 - function showPjax() {  
585 - $(angJsContainer).removeClass('page-content active').hide();  
586 - $(pjaxContainer).addClass('page-content active');  
587 - }  
588 -  
589 - function showAngJs() {  
590 - $(pjaxContainer).html('').removeClass('page-content active').hide();  
591 - $(angJsContainer).addClass('page-content active');  
592 - }  
593 -  
594 - function activeLeftMenu(item) {  
595 - $(item).parent('.nav-item').addClass('active').parent('.sub-menu').show().parent().addClass('open');  
596 - setTitle(item);  
597 - }  
598 -  
599 - function setTitle(menuItem){  
600 - document.title = $('span.title', menuItem).text();  
601 - }  
602 -  
603 -</script>  
604 -<!-- d3 -->  
605 -<script src="/assets/js/d3.min.js" data-exclude=1></script>  
606 -<!-- webSocket JS -->  
607 -<script src="/assets/js/sockjs.min.js"></script>  
608 -  
609 -<!-- TODO:angularJS相关库 -->  
610 -  
611 -<!-- angularJS相关库 -->  
612 -<!-- 这个是基于angularjs 1.4.10修改的版本,主要是修改了history控制部分,用于兼容route和pjax的同时操作history的冲突 -->  
613 -<script src="/assets/js/angular.js" data-autocephaly=1></script>  
614 -<script src="/assets/bower_components/angular-i18n/angular-locale_zh-cn.js" data-autocephaly=1></script>  
615 -<script  
616 - src="/assets/bower_components/angular-resource/angular-resource.min.js"  
617 - data-exclude=1></script>  
618 -<script  
619 - src="/assets/bower_components/angular-sanitize/angular-sanitize.min.js"  
620 - data-exclude=1></script>  
621 -<script  
622 - src="/assets/bower_components/angular-animate/angular-animate.min.js"  
623 - data-exclude=1></script>  
624 -<script  
625 - src="/assets/bower_components/angular-touch/angular-touch.min.js"  
626 - data-exclude=1></script>  
627 -<script  
628 - src="/assets/bower_components/angular-ui-router/release/angular-ui-router.min.js"  
629 - data-exclude=1></script>  
630 -<script  
631 - src="/assets/bower_components/oclazyload/dist/ocLazyLoad.min.js"  
632 - data-exclude=1></script>  
633 -<script  
634 - src="/assets/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js"  
635 - data-exclude=1></script>  
636 -<!-- handsontable相关js -->  
637 -<script  
638 - src="/assets/bower_components/handsontable/dist/handsontable.full.js"></script>  
639 -<script  
640 - src="/assets/bower_components/ngHandsontable/dist/ngHandsontable.js"></script>  
641 -<!-- sweetalert相关js -->  
642 -<script src="/assets/bower_components/sweetalert/dist/sweetalert.min.js"></script>  
643 -<script src="/assets/bower_components/ng-sweet-alert/ng-sweet-alert.js"></script>  
644 -  
645 -<!-- schedule计划调度AngularJS模块主JS -->  
646 -<script src="/pages/scheduleApp/module/common/main.js" data-exclude=1></script>  
647 -<script  
648 - src="/pages/scheduleApp/module/common/prj-common-globalservice.js"  
649 - data-exclude=1></script>  
650 -<script src="/pages/scheduleApp/module/common/prj-common-filter.js"  
651 - data-exclude=1></script>  
652 -<script src="/pages/scheduleApp/module/common/prj-common-directive.js"  
653 - data-exclude=1></script>  
654 -<script  
655 - src="/pages/scheduleApp/module/common/prj-common-ui-route-state.js"  
656 - data-exclude=1></script>  
657 -  
658 -<!-- 地图相关 -->  
659 -<!-- 百度 -->  
660 -<script  
661 - src="//api.map.baidu.com/api?v=3.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"  
662 - data-exclude=1></script>  
663 -<script  
664 - src="//api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js"  
665 - data-exclude=1></script>  
666 -<script type="text/javascript"  
667 - src="//api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"  
668 - data-exclude=1></script>  
669 -<script type="text/javascript"  
670 - src="//api.map.baidu.com/library/RichMarker/1.2/src/RichMarker_min.js "  
671 - data-exclude=1></script>  
672 -<script src="/assets/js/baidu/TextIconOverlay.js" data-exclude=1></script>  
673 -<script src="/assets/js/baidu//MarkerClusterer.js" data-exclude=1></script>  
674 -<!-- 高德 -->  
675 -<script  
676 - src="//webapi.amap.com/maps?v=1.3&key=16cb1c5043847e09ef9edafdd77befda"  
677 - data-exclude=1></script>  
678 -<!-- echarts4 -->  
679 -<script src="/metronic_v4.5.4/plugins/echarts4/echarts.min.js"></script>  
680 -<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" merge="plugins"></script>  
681 -<!-- RSA加密 -->  
682 -<script src="/assets/plugins/jsencrypt.min.js"></script>  
683 -<script src="/assets/js/eventproxy.js"></script>  
684 -<!-- 线路路由信息操作 -->  
685 -<script src="/pages/base/stationroute/js/routes-operation.js"></script>  
686 -<script src="/pages/base/stationroute/js/routes-service.js"></script>  
687 -<script src="/assets/js/CoordinateConverter.js"></script>  
688 -</body> 1 +<!DOCTYPE html>
  2 +<html lang="zh">
  3 +<head>
  4 + <meta name="renderer" content="webkit" />
  5 + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  6 + <meta charset="UTF-8">
  7 + <title>调度系统</title>
  8 +
  9 + <meta http-equiv="Pragma" content="no-cache">
  10 + <meta http-equiv="Cache-control" content="no-cache">
  11 + <meta http-equiv="Cache" content="no-cache">
  12 +
  13 + <!-- Font Awesome 图标字体 -->
  14 + <link
  15 + href="/metronic_v4.5.4/plugins/font-awesome/css/font-awesome.min.css"
  16 + rel="stylesheet" type="text/css" />
  17 + <!-- Bootstrap style -->
  18 + <link href="/metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css"
  19 + rel="stylesheet" type="text/css" />
  20 + <!-- jsTree 数插件 -->
  21 + <link
  22 + href="/metronic_v4.5.4/plugins/jstree/dist/themes/default/style.min.css"
  23 + rel="stylesheet" type="text/css" />
  24 + <!-- MULTI-select 多选下拉框美化 -->
  25 + <link
  26 + href="/metronic_v4.5.4/plugins/jquery-multi-select/css/multi-select.css"
  27 + rel="stylesheet" type="text/css" />
  28 +
  29 + <!-- editable -->
  30 + <link
  31 + href="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/css/bootstrap-editable.css"
  32 + rel="stylesheet" type="text/css" />
  33 + <!-- METRONIC style -->
  34 + <link href="/metronic_v4.5.4/layout4/css/themes/light.min.css"
  35 + rel="stylesheet" type="text/css" id="style_color" />
  36 + <link href="/metronic_v4.5.4/css/components.css" rel="stylesheet"
  37 + type="text/css" />
  38 + <link href="/metronic_v4.5.4/css/plugins.css" rel="stylesheet"
  39 + type="text/css" />
  40 + <link href="/metronic_v4.5.4/layout4/css/layout.min.css"
  41 + rel="stylesheet" type="text/css" />
  42 + <link href="/metronic_v4.5.4/layout4/css/custom.min.css"
  43 + rel="stylesheet" type="text/css" />
  44 + <!-- select2 下拉框插件 -->
  45 + <link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css"
  46 + rel="stylesheet" type="text/css" />
  47 + <link
  48 + href="/metronic_v4.5.4/plugins/select2/css/select2-bootstrap.min.css"
  49 + rel="stylesheet" type="text/css" />
  50 + <!-- layer 弹层 插件 -->
  51 + <link href="/assets/plugins/layer-v2.4/layer/skin/layer.css"
  52 + rel="stylesheet" type="text/css" />
  53 + <!-- fileinput 上传 插件 -->
  54 + <link href="/assets/plugins/fileinput/css/fileinput.min.css"
  55 + rel="stylesheet" type="text/css" />
  56 + <!-- iCheck 单选框和复选框 -->
  57 + <link href="/metronic_v4.5.4/plugins/icheck/skins/all.css"
  58 + rel="stylesheet" type="text/css" />
  59 + <!-- 日期控件 -->
  60 + <link
  61 + href="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/css/bootstrap-datetimepicker.min.css"
  62 + rel="stylesheet" type="text/css" />
  63 + <!-- table 表格控件 -->
  64 + <!--<link rel="stylesheet"-->
  65 + <!--href="//api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css"-->
  66 + <!--type="text/css" />-->
  67 + <link href="/metronic_v4.5.4/plugins/bootstrap-tagsinput/bootstrap-tagsinput.css" rel="stylesheet" type="text/css"/>
  68 + <!-- handsontable样式 -->
  69 + <link rel="stylesheet"
  70 + href="/assets/bower_components/handsontable/dist/handsontable.full.css" />
  71 + <!-- sweetalert样式 -->
  72 + <link rel="stylesheet"
  73 + href="/assets/bower_components/sweetalert/dist/sweetalert.css" />
  74 + <!-- schedule计划调度AngularJS模块主css -->
  75 + <link rel="stylesheet" href="/pages/scheduleApp/module/common/main.css"
  76 + type="text/css" />
  77 + <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" merge="plugins"/>
  78 +
  79 + <!-- CSS动画 -->
  80 + <link
  81 + href="/metronic_v4.5.4/plugins/tipso/css/animate.css"
  82 + rel="stylesheet" type="text/css" />
  83 +
  84 + <!-- 提示工具样式 -->
  85 + <link
  86 + href="/metronic_v4.5.4/plugins/tipso/css/tipso.css"
  87 + rel="stylesheet" type="text/css" />
  88 +
  89 + <style type="text/css">
  90 + .searchForm {
  91 +
  92 + }
  93 +
  94 + .searchForm .form-group .control-label {
  95 + padding-right: 0px;
  96 + text-align: right;
  97 + margin-top: 7px;
  98 + }
  99 +
  100 + .searchForm .form-group>div {
  101 + padding-left: 10px;
  102 + padding-right: 0px;
  103 + }
  104 +
  105 + .searchForm .row>div {
  106 + padding-left: 0px;
  107 + padding-right: 0px;
  108 + padding: 5px 0 5px 0;
  109 + width: 270px;
  110 + display: inline-block;
  111 + }
  112 +
  113 + .searchForm .form-actions {
  114 +
  115 + }
  116 +
  117 + tr.row-active td {
  118 + border-bottom: 1px solid blue !important;
  119 + color: blue;
  120 + }
  121 +
  122 + .ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection
  123 + {
  124 + font-size: 14px;
  125 + }
  126 +
  127 + .ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection
  128 + {
  129 + padding: 6px 26px;
  130 + }
  131 +
  132 + .ms-container .ms-list {
  133 + height: 306px;
  134 + }
  135 +
  136 + .ms-container .ms-selectable,.ms-container .ms-selection {
  137 + width: 47%;
  138 + }
  139 +
  140 + .ms-container {
  141 + width: 470px;
  142 + margin: auto;
  143 + }
  144 +
  145 + .multi-custom-header-left {
  146 + text-align: center;
  147 + padding: 7px;
  148 + color: #3B3F51;
  149 + }
  150 +
  151 + .multi-custom-header-right {
  152 + text-align: center;
  153 + padding: 7px;
  154 + font-weight: bold;
  155 + color: #36C6D3;
  156 + }
  157 +
  158 + .mt-element-list .list-simple.mt-list-container ul>.mt-list-item>.list-item-content
  159 + {
  160 + padding: 0 55px 0 0px;
  161 + }
  162 +
  163 + .mt-element-list .list-simple.mt-list-container ul>.mt-list-item {
  164 + padding: 3.3px 0;
  165 + }
  166 +
  167 + #route-container {
  168 + display: none;
  169 + }
  170 +
  171 + .page-content.active {
  172 + display: block !important;
  173 + }
  174 +
  175 + .page-header.navbar .page-logo .logo-default {
  176 + margin: 0;
  177 + }
  178 +
  179 + .page-header.navbar .top-menu .navbar-nav>li.dropdown.open .dropdown-toggle
  180 + {
  181 + background-color: #284a99;
  182 + }
  183 +
  184 + .page-header.navbar .page-logo {
  185 + padding-right: 10px;
  186 + }
  187 +
  188 + .page-logo .logo-default.logo-default-text {
  189 + font-weight: 600;
  190 + color: white !important;
  191 + margin-top: 19px !important;
  192 + font-size: 24px;
  193 + text-decoration: none;
  194 + }
  195 +
  196 + .page-logo .logo-default.logo-default-text:HOVER {
  197 + color: #dedede !important;
  198 + }
  199 +
  200 + body,.page-content-wrapper,#pjax-container{
  201 + height: 100%;
  202 + }
  203 + html{
  204 + height: 90%;
  205 + }
  206 + .page-container{
  207 + height: 100%;
  208 + }
  209 + </style>
  210 +
  211 + <!-- ocLazyLoading载入文件的位置 -->
  212 + <link id="ng_load_plugins_before" />
  213 +
  214 +</head>
  215 +<body
  216 + class="page-container-bg-solid page-header-fixed page-sidebar-closed-hide-logo page-sidebar-fixed">
  217 +<div class="page-header navbar navbar-fixed-top"
  218 + style="background: linear-gradient(to bottom, #124e78, #125688);">
  219 + <div class="page-header-inner ">
  220 + <!-- LOGO -->
  221 + <div class="page-logo">
  222 + <a href="index.html" class="logo-default logo-default-text">
  223 + 峨眉公交调度系统 </a>
  224 + <div class="menu-toggler sidebar-toggler"></div>
  225 + </div>
  226 + <!-- END LOGO -->
  227 + <a href="javascript:;" class="menu-toggler responsive-toggler"
  228 + data-toggle="collapse" data-target=".navbar-collapse"> </a>
  229 + <div class="page-top">
  230 + <div class="top-menu">
  231 + <ul class="nav navbar-nav pull-right">
  232 + <!-- 信息通知区 -->
  233 + <li
  234 + class="dropdown dropdown-extended dropdown-notification dropdown-dark"
  235 + id="header_notification_bar"><a href="javascript:;"
  236 + class="dropdown-toggle" data-toggle="dropdown"
  237 + data-hover="dropdown" data-close-others="true"> <i
  238 + class="fa fa-bell"></i> <span class="badge badge-success">
  239 + 0 </span>
  240 + </a>
  241 + <ul class="dropdown-menu" style="max-width: 345px; width: 345px;">
  242 + <li class="external">
  243 + <h3>
  244 + 今日 <span class="bold">0 条</span> 通知
  245 + </h3> <a href="javascript:;">查看全部</a>
  246 + </li>
  247 + <li>
  248 + <ul class="dropdown-menu-list scroller" style="height: 250px;"
  249 + data-handle-color="#637283">
  250 + </ul>
  251 + </li>
  252 + </ul></li>
  253 + <li class="dropdown dropdown-user dropdown-dark"><a
  254 + href="javascript:;" class="dropdown-toggle"
  255 + data-toggle="dropdown" data-hover="dropdown"
  256 + data-close-others="true"> <span id="indexTopUName"
  257 + class="username username-hide-on-mobile"
  258 + style="vertical-align: middle;"> <i class="fa fa-user"></i></span>
  259 + </a>
  260 + <ul class="dropdown-menu dropdown-menu-default">
  261 + <li><a href="javascript:;"> <i class="fa fa-user"></i>
  262 + 我的信息
  263 + </a></li>
  264 + <li><a href="javascript:;" id="changePWD"> <i
  265 + class="fa fa-unlock-alt"></i> 修改密码
  266 + </a></li>
  267 + <li class="divider"></li>
  268 + <li><a href="javascript:;"> <i class="fa fa-lock"></i>
  269 + 锁屏
  270 + </a></li>
  271 + <li><a href="/logout"> <i class="fa fa-key"></i> 注销登陆
  272 + </a></li>
  273 + </ul></li>
  274 + </ul>
  275 + </div>
  276 + </div>
  277 + </div>
  278 +</div>
  279 +<div class="page-container">
  280 + <div class="page-sidebar-wrapper">
  281 + <div class="page-sidebar navbar-collapse collapse">
  282 + <ul class="page-sidebar-menu page-sidebar-menu-fixed"
  283 + data-keep-expanded="false" data-auto-scroll="true"
  284 + data-slide-speed="200" id="leftMenuSidebar">
  285 + </ul>
  286 + </div>
  287 + </div>
  288 + <div class="page-content-wrapper">
  289 + <div id="pjax-container" class="page-content"></div>
  290 +
  291 + <div id="route-container">
  292 + <div ng-app="ScheduleApp">
  293 + <div ng-controller="ScheduleAppController">
  294 +
  295 + <!-- loading widget -->
  296 + <div id="loadingWidget" class="flyover mask" loading-widget>
  297 + <div class="alert alert-info">
  298 + <strong>载入中......</strong>
  299 + </div>
  300 + </div>
  301 +
  302 + <div ui-view class="uv"></div>
  303 + </div>
  304 + </div>
  305 + </div>
  306 + </div>
  307 +</div>
  308 +
  309 +<script id="menu_list_temp" type="text/html">
  310 + {{each list as group i}}
  311 + <li class="heading">
  312 + <h3 class="uppercase">{{group.name}}</h3>
  313 + </li>
  314 + {{each group.children as dir j}}
  315 + <li class="nav-item">
  316 + <a href="javascript:;" class="nav-link nav-toggle ">
  317 + <i class="{{dir.icon}}"></i>
  318 + <span class="title">{{dir.name}}</span>
  319 + <span class="arrow"></span>
  320 + </a>
  321 + <ul class="sub-menu">
  322 + {{each dir.children as module s}}
  323 + <li class="nav-item ">
  324 + {{if module.container=="pjax-container"}}
  325 + <a href="/pages/{{module.path}}" class="nav-link " data-pjax>
  326 + <span class="title">{{module.name}}</span>
  327 + </a>
  328 + {{else}}
  329 + <a href="{{module.path}}" class="nav-link " data-angularjs>
  330 + <span class="title">{{module.name}}</span>
  331 + </a>
  332 + {{/if}}
  333 + </li>
  334 + {{/each}}
  335 + </ul>
  336 + </li>
  337 + {{/each}}
  338 + {{/each}}
  339 +
  340 +</script>
  341 +<script>
  342 + delete window.require;
  343 + delete window.exports;
  344 + delete window.module;
  345 +</script>
  346 +<!-- jQuery -->
  347 +<script src="/metronic_v4.5.4/plugins/jquery.min.js" data-exclude=1></script>
  348 +<!-- bootstrap -->
  349 +<script src="/metronic_v4.5.4/plugins/bootstrap/js/bootstrap.min.js"
  350 + data-exclude=1></script>
  351 +<script src="/pages/forms/statement/js/jquery.autocompleter.js"></script>
  352 +<script src="/pages/forms/statement/js/jquery.PrintArea.js"></script>
  353 +<!-- MTRONIC JS -->
  354 +<script src="/metronic_v4.5.4/scripts/app.min.js" data-exclude=1></script>
  355 +<script src="/metronic_v4.5.4/layout4/scripts/layout.min.js"
  356 + data-exclude=1></script>
  357 +<!-- 虚拟滚动条 -->
  358 +<script
  359 + src="/metronic_v4.5.4/plugins/jquery-slimscroll/jquery.slimscroll.min.js"></script>
  360 +<!-- jsTree 树插件 -->
  361 +<script src="/metronic_v4.5.4/plugins/jstree/dist/jstree.min.js"></script>
  362 +<!-- bootstrap-hover-dropDown -->
  363 +<script
  364 + src="/metronic_v4.5.4/plugins/bootstrap-hover-dropdown/bootstrap-hover-dropdown.min.js"></script>
  365 +<!-- jquery.validate 表单验证 -->
  366 +<script
  367 + src="/metronic_v4.5.4/plugins/jquery-validation/js/jquery.validate.min.js"></script>
  368 +<script
  369 + src="/metronic_v4.5.4/plugins/jquery-validation/js/localization/messages_zh.js"></script>
  370 +<!-- 向导式插件 -->
  371 +<script
  372 + src="/metronic_v4.5.4//plugins/bootstrap-wizard/jquery.bootstrap.wizard.min.js"></script>
  373 +<!-- iCheck 单选框和复选框 -->
  374 +<script src="/metronic_v4.5.4/plugins/icheck/icheck.min.js"></script>
  375 +<!-- select2 下拉框 -->
  376 +<script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js"></script>
  377 +<!-- MULTI SELECT 多选下拉框 -->
  378 +<script
  379 + src="/metronic_v4.5.4/plugins/jquery-multi-select/js/jquery.multi-select.js"></script>
  380 +<!-- editable.js -->
  381 +<script
  382 + src="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/js/bootstrap-editable.min.js"></script>
  383 +<!-- PJAX -->
  384 +<script src="/assets/plugins/jquery.pjax.js"></script>
  385 +<!-- layer 弹层 -->
  386 +<script src="/assets/plugins/layer-v2.4/layer/layer.js" data-exclude=1></script>
  387 +<!-- fileinput 上传 -->
  388 +<script src="/assets/plugins/fileinput/canvas-to-blob.min.js"></script>
  389 +<script src="/assets/plugins/fileinput/purify.min.js"></script>
  390 +<script src="/assets/plugins/fileinput/sortable.min.js"></script>
  391 +<script src="/assets/plugins/fileinput/fileinput.min.js"></script>
  392 +<script src="/assets/plugins/fileinput/fileinput_locale_zh.js"></script>
  393 +<!-- jquery.purl URL解析 -->
  394 +<script src="/assets/plugins/purl.js"></script>
  395 +<!-- jquery.serializejson JSON序列化插件 -->
  396 +<script src="/assets/plugins/jquery.serializejson.js"></script>
  397 +<!-- art-template 模版引擎 -->
  398 +<script src="/assets/plugins/template.js"></script>
  399 +<!-- jquery.pageinator 分页 -->
  400 +<script src="/assets/plugins/jqPaginator.min.js"></script>
  401 +<!-- moment.js 日期处理类库 -->
  402 +<script src="/assets/plugins/moment-with-locales.js"></script>
  403 +
  404 +<script src="/assets/plugins/pinyin.js"></script>
  405 +<!-- 日期控件 -->
  406 +<script
  407 + src="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/js/bootstrap-datetimepicker.min.js"></script>
  408 +<!-- 表格控件 -->
  409 +<script src="/metronic_v4.5.4/plugins/bootstrap-tagsinput/bootstrap-tagsinput.min.js"></script>
  410 +<!-- 统计图控件 -->
  411 +<!--<script src="/assets/global/getEchart.js"></script>
  412 +<script src="/assets/global/echarts.js"></script> -->
  413 +<script src="/assets/js/common.js"></script>
  414 +<script src="/assets/js/dictionary.js"></script>
  415 +<!-- tipso JS -->
  416 +<script src="/metronic_v4.5.4/plugins/tipso/js/tipso.js"></script>
  417 +<script data-exclude=1>
  418 + //初始打开的片段地址
  419 + var initFragment = "^_^initFragment^_^";
  420 + //静态文件目录
  421 + var dir = '/pages/';
  422 + //片段容器
  423 + var pjaxContainer = '#pjax-container'
  424 + , angJsContainer = '#route-container';
  425 +
  426 + $(document).ajaxError(function (event, jqxhr, settings, thrownError) {
  427 + if(jqxhr.status == 403){
  428 + layer.closeAll();
  429 + layer.alert(jqxhr.message?jqxhr.message:'访问被拒绝', {icon: 2, title: '操作失败'});
  430 + }
  431 + });
  432 +
  433 + $(function () {
  434 + $.ajax({
  435 + url: '/user/isWeakCipher',
  436 + type: 'POST',
  437 + async: false,
  438 + success: function (result,status,xhr) {
  439 + if (result.data == 1) {
  440 + $.get('/pages/permission/user/forceChangePWD.html', function (content) {
  441 + layer.open({
  442 + type: 1,
  443 + area: ['600px', '360px'],
  444 + content: content,
  445 + title: '修改密码',
  446 + shift: 5,
  447 + scrollbar: false,
  448 + closeBtn: 0,
  449 + success: function () {
  450 + }
  451 + });
  452 + });
  453 + }
  454 + }
  455 + });
  456 +
  457 + $.ajax({
  458 + url: '/user/isRealName',
  459 + type: 'POST',
  460 + async: false,
  461 + success: function (result,status,xhr) {
  462 + if (result.data == 0) {
  463 + $.get('/pages/permission/user/jobCode.html', function (content) {
  464 + layer.open({
  465 + type: 1,
  466 + area: ['600px', '360px'],
  467 + content: content,
  468 + title: '设置工号(后期统一登录平台接入)',
  469 + shift: 5,
  470 + scrollbar: false,
  471 + success: function () {
  472 + }
  473 + });
  474 + });
  475 + }
  476 + }
  477 + });
  478 +
  479 + $.get('/user/currentUser', function (user) {
  480 + $('#indexTopUName').text(user.userName);
  481 + });
  482 +
  483 + //带 data-pjax 的链接由pjax加载
  484 + $(document).pjax('a[data-pjax]', pjaxContainer);
  485 +
  486 + //pjax左菜单点击事件
  487 + $(document).on('click', '#leftMenuSidebar a[data-pjax]', function () {
  488 + setTitle(this);
  489 +
  490 + $('#leftMenuSidebar li.nav-item.active').removeClass('active');
  491 + $(this).parent().addClass('active');
  492 + showPjax();
  493 + });
  494 +
  495 + //angularjs左菜单点击事件
  496 + $(document).on('click', '#leftMenuSidebar a[data-angularjs]', function () {
  497 + setTitle(this);
  498 +
  499 + $('#leftMenuSidebar li.nav-item.active').removeClass('active');
  500 + $(this).parent().addClass('active');
  501 + showAngJs();
  502 + });
  503 +
  504 + //加载左菜单栏
  505 + $get('/module/findByCurrentUser', null,
  506 + function (ms) {
  507 + var treeArray = createTreeData(ms);
  508 + treeArray.sort(function (a, b) {
  509 + return a.createDate - b.createDate;
  510 + });
  511 + var menuHtml = template('menu_list_temp', {list: treeArray});
  512 + $('#leftMenuSidebar').html(menuHtml);
  513 +
  514 + //----------- 检查URL ----------------
  515 + var h = location.hash;
  516 + if (initFragment && initFragment != '') {
  517 + showPjax();
  518 + //普通片段
  519 + loadPage(initFragment);
  520 + //选中菜单
  521 + $.each($('#leftMenuSidebar a'), function (i, item) {
  522 + if (urlPattern($(item).attr('href'), initFragment)) {
  523 + activeLeftMenu(item);
  524 + }
  525 + });
  526 + } else if (h) {
  527 + //angularjs片段
  528 + showAngJs();
  529 + //选中菜单
  530 + $.each($('#leftMenuSidebar a'), function (i, item) {
  531 + if ($(item).attr('href') == h) {
  532 + activeLeftMenu(item);
  533 + }
  534 + });
  535 + }
  536 + else {
  537 + //加载主页
  538 + loadPage('/pages/home.html');
  539 + }
  540 + });
  541 +
  542 + //修改密码
  543 + $('#changePWD').on('click', function () {
  544 + $.get('/pages/permission/user/changePWD.html', function (content) {
  545 + layer.open({
  546 + type: 1,
  547 + area: ['600px', '360px'],
  548 + content: content,
  549 + title: '修改密码',
  550 + shift: 5,
  551 + scrollbar: false,
  552 + success: function () {
  553 + }
  554 + });
  555 + });
  556 + });
  557 + });
  558 +
  559 + //modal关闭时销毁dom
  560 + $(document).on('hidden.bs.modal', '.modal', function () {
  561 + $(this).remove();
  562 + });
  563 +
  564 + //pjax加载完成事件
  565 + $(document).on('pjax:success', function () {
  566 + var dicts = $(pjaxContainer).find('.nt-dictionary');
  567 + dictionaryUtils.transformDom(dicts);
  568 + });
  569 +
  570 + function loadPage(url) {
  571 + $.pjax({url: url, container: pjaxContainer})
  572 + }
  573 +
  574 + function urlPattern(a, b) {
  575 + var r;
  576 + try {
  577 + r = a.substring(0, a.lastIndexOf('/')) == b.substring(0, b.lastIndexOf('/'));
  578 + } catch (e) {
  579 + r = false;
  580 + }
  581 + return r;
  582 + }
  583 +
  584 + function showPjax() {
  585 + $(angJsContainer).removeClass('page-content active').hide();
  586 + $(pjaxContainer).addClass('page-content active');
  587 + }
  588 +
  589 + function showAngJs() {
  590 + $(pjaxContainer).html('').removeClass('page-content active').hide();
  591 + $(angJsContainer).addClass('page-content active');
  592 + }
  593 +
  594 + function activeLeftMenu(item) {
  595 + $(item).parent('.nav-item').addClass('active').parent('.sub-menu').show().parent().addClass('open');
  596 + setTitle(item);
  597 + }
  598 +
  599 + function setTitle(menuItem){
  600 + document.title = $('span.title', menuItem).text();
  601 + }
  602 +
  603 +</script>
  604 +<!-- d3 -->
  605 +<script src="/assets/js/d3.min.js" data-exclude=1></script>
  606 +<!-- webSocket JS -->
  607 +<script src="/assets/js/sockjs.min.js"></script>
  608 +
  609 +<!-- TODO:angularJS相关库 -->
  610 +
  611 +<!-- angularJS相关库 -->
  612 +<!-- 这个是基于angularjs 1.4.10修改的版本,主要是修改了history控制部分,用于兼容route和pjax的同时操作history的冲突 -->
  613 +<script src="/assets/js/angular.js" data-autocephaly=1></script>
  614 +<script src="/assets/bower_components/angular-i18n/angular-locale_zh-cn.js" data-autocephaly=1></script>
  615 +<script
  616 + src="/assets/bower_components/angular-resource/angular-resource.min.js"
  617 + data-exclude=1></script>
  618 +<script
  619 + src="/assets/bower_components/angular-sanitize/angular-sanitize.min.js"
  620 + data-exclude=1></script>
  621 +<script
  622 + src="/assets/bower_components/angular-animate/angular-animate.min.js"
  623 + data-exclude=1></script>
  624 +<script
  625 + src="/assets/bower_components/angular-touch/angular-touch.min.js"
  626 + data-exclude=1></script>
  627 +<script
  628 + src="/assets/bower_components/angular-ui-router/release/angular-ui-router.min.js"
  629 + data-exclude=1></script>
  630 +<script
  631 + src="/assets/bower_components/oclazyload/dist/ocLazyLoad.min.js"
  632 + data-exclude=1></script>
  633 +<script
  634 + src="/assets/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js"
  635 + data-exclude=1></script>
  636 +<!-- handsontable相关js -->
  637 +<script
  638 + src="/assets/bower_components/handsontable/dist/handsontable.full.js"></script>
  639 +<script
  640 + src="/assets/bower_components/ngHandsontable/dist/ngHandsontable.js"></script>
  641 +<!-- sweetalert相关js -->
  642 +<script src="/assets/bower_components/sweetalert/dist/sweetalert.min.js"></script>
  643 +<script src="/assets/bower_components/ng-sweet-alert/ng-sweet-alert.js"></script>
  644 +
  645 +<!-- schedule计划调度AngularJS模块主JS -->
  646 +<script src="/pages/scheduleApp/module/common/main.js" data-exclude=1></script>
  647 +<script
  648 + src="/pages/scheduleApp/module/common/prj-common-globalservice.js"
  649 + data-exclude=1></script>
  650 +<script src="/pages/scheduleApp/module/common/prj-common-filter.js"
  651 + data-exclude=1></script>
  652 +<script src="/pages/scheduleApp/module/common/prj-common-directive.js"
  653 + data-exclude=1></script>
  654 +<script
  655 + src="/pages/scheduleApp/module/common/prj-common-ui-route-state.js"
  656 + data-exclude=1></script>
  657 +
  658 +<!-- 地图相关 -->
  659 +<!-- 百度 -->
  660 +<script
  661 + src="//api.map.baidu.com/api?v=3.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"
  662 + data-exclude=1></script>
  663 +<script
  664 + src="//api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js"
  665 + data-exclude=1></script>
  666 +<script type="text/javascript"
  667 + src="//api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"
  668 + data-exclude=1></script>
  669 +<script type="text/javascript"
  670 + src="//api.map.baidu.com/library/RichMarker/1.2/src/RichMarker_min.js "
  671 + data-exclude=1></script>
  672 +<script src="/assets/js/baidu/TextIconOverlay.js" data-exclude=1></script>
  673 +<script src="/assets/js/baidu//MarkerClusterer.js" data-exclude=1></script>
  674 +<!-- 高德 -->
  675 +<script
  676 + src="//webapi.amap.com/maps?v=1.3&key=16cb1c5043847e09ef9edafdd77befda"
  677 + data-exclude=1></script>
  678 +<!-- echarts4 -->
  679 +<script src="/metronic_v4.5.4/plugins/echarts4/echarts.min.js"></script>
  680 +<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" merge="plugins"></script>
  681 +<!-- RSA加密 -->
  682 +<script src="/assets/plugins/jsencrypt.min.js"></script>
  683 +<script src="/assets/js/eventproxy.js"></script>
  684 +<!-- 线路路由信息操作 -->
  685 +<script src="/pages/base/stationroute/js/routes-operation.js"></script>
  686 +<script src="/pages/base/stationroute/js/routes-service.js"></script>
  687 +<script src="/assets/js/CoordinateConverter.js"></script>
  688 +</body>
689 </html> 689 </html>
690 \ No newline at end of file 690 \ No newline at end of file
src/main/resources/static/pages/control/line/index.html
1 -<link href="/pages/control/line/css/lineControl.css" rel="stylesheet" type="text/css" />  
2 -<link href="/metronic_v4.5.4/css/animate.min.css" rel="stylesheet" type="text/css" />  
3 -  
4 -<!-- 初始load界面 -->  
5 -<div class="load-anim" >  
6 - <div class="load-anim-list">  
7 - <div class="spinner"></div>  
8 - <!-- <div class="item load_resource">加载资源文件...</div> -->  
9 -<!-- <div class="item">校准客户端时间...</div>  
10 - <div class="item">加载GPS模块...</div>  
11 - <div class="item">加载班次信息...</div>  
12 - <div class="item">webSocket 连接...</div> -->  
13 - </div>  
14 -</div>  
15 -  
16 -<div class="portlet light portlet-fullscreen" style="transition: all .5s ease;padding: 0;" oncontextmenu=self.event.returnValue=false>  
17 -  
18 - <div class="portlet-title banner" >  
19 - <div class="caption col_hide_1280" style="color: #FFF;">  
20 - <i class="fa fa-life-ring" style="font-size: 22px;color: #FFF;"></i> <span  
21 - class="caption-subject bold" style="font-size: 24px;">浦东公交线路调度系统</span>  
22 - </div>  
23 - <div class="col_hide_1440" style="color: white;font-size: 18px;position: absolute;right: 25px;top: 75px;">  
24 - <span class="top_username"></span> <span class="operation_mode_text animated" ></span>  
25 - </div>  
26 - <div class="actions col_hide_1280" >  
27 - <div class="btn-group">  
28 -  
29 - <div class="btn-group">  
30 - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" >  
31 - <i class="fa fa-database"></i> &nbsp;基础数据  
32 - <i class="fa fa-angle-down"></i>  
33 - </button>  
34 - <ul class="dropdown-menu">  
35 - <li>  
36 - <a href="javascript:;" id=""> 车辆配置 </a>  
37 - </li>  
38 - <li>  
39 - <a href="javascript:;" id=""> 人员配置 </a>  
40 - </li>  
41 - </ul>  
42 - </div>  
43 -  
44 - <div class="btn-group">  
45 - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" >  
46 - <i class="fa fa-bus"></i> &nbsp;车载设备  
47 - <i class="fa fa-angle-down"></i>  
48 - </button>  
49 - <ul class="dropdown-menu">  
50 - <li>  
51 - <a href="javascript:;" id="deviceConfig"> 设备管理 </a>  
52 - </li>  
53 - <li>  
54 - <a href="javascript:;" id="deviceReport"> 设备上报记录 </a>  
55 - </li>  
56 - <li>  
57 - <a href="javascript:;" id="msgAndDirect"> 指令下发记录 </a>  
58 - </li>  
59 - </ul>  
60 - </div>  
61 -  
62 - <div class="btn-group">  
63 - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" >  
64 - <i class="fa fa-gavel"></i> 系统设置  
65 - <i class="fa fa-angle-down"></i>  
66 - </button>  
67 - <ul class="dropdown-menu">  
68 - <li>  
69 - <a href="javascript:;" id="ttsConfigure"> TTS 语音设置 </a>  
70 - </li>  
71 - <li>  
72 - <a href="javascript:;" id="updateLogLink"> 更新日志 </a>  
73 - </li>  
74 - </ul>  
75 - </div>  
76 -  
77 - <button id="exitBtn" type="button" class="btn btn-danger" style="margin-left: 8px;padding: 6.5px 9px !important;" >  
78 - <!-- <i class="fa fa-close" ></i> -->退出线路调度</button>  
79 - </div>  
80 - </div>  
81 - </div>  
82 - <div class="portlet-body" id="top-tabs-wrap" >  
83 - <ul class="nav nav-tabs top-nav" >  
84 - <li class="active">  
85 - <a href="#tab_home" data-toggle="tab" aria-expanded="false" style="padding: 10px 15px;">  
86 - <i class="fa fa-home"></i> 主页  
87 - </a>  
88 - </li>  
89 - <li class=""><a href="#tab_map" data-toggle="tab" style="padding: 10px 15px;"  
90 - aria-expanded="false"><i class="fa fa-map"></i> 地图 </a></li>  
91 - </ul>  
92 -  
93 - <div class="tab-content" >  
94 - <div class="tab-pane fade active in" id="tab_home" ></div>  
95 - <div class="tab-pane fade" id="tab_map" style="position: relative;"></div>  
96 -  
97 - <!-- <div class="tab-pane fade tab_line active in" id="tab_line" >  
98 -  
99 - </div> -->  
100 - </div>  
101 - </div>  
102 -<div id="tooltipShade" class="animated fadeIn"></div>  
103 -  
104 -<div id="menuWrap"></div>  
105 -<!-- 线路调度右键菜单 -->  
106 -<menu class="menu" id="rightMenu" style="display: none;">  
107 - <li class="menu-item submenu">  
108 - <button type="button" class="menu-btn" data-method="outgoAdjust">  
109 - <span class="menu-text">待发调整</span>  
110 - </button>  
111 - <menu class="menu">  
112 - <li class="menu-item">  
113 - <button type="button" class="menu-btn" data-method="outgoAdjust">  
114 - <span class="menu-text">基于班次</span>  
115 - </button>  
116 - </li>  
117 - <li class="menu-item">  
118 - <button type="button" class="menu-btn" data-method="outgoAdjustAll">  
119 - <span class="menu-text">基于车辆</span>  
120 - </button>  
121 - </li>  
122 - </menu>  
123 - </li>  
124 -  
125 -  
126 - <li class="menu-separator"></li>  
127 - <li class="menu-item" >  
128 - <button type="button" class="menu-btn" data-method="planDestroy">  
129 - <span class="menu-text">计划烂班</span>  
130 - </button>  
131 - </li>  
132 - <li class="menu-item" >  
133 - <button type="button" class="menu-btn" data-method="revokeDestroy">  
134 - <span class="menu-text">撤销烂班</span>  
135 - </button>  
136 - </li>  
137 - <li class="menu-item" >  
138 - <button type="button" class="menu-btn" data-method="realOutgoAdjust">  
139 - <span class="menu-text">实发调整</span>  
140 - </button>  
141 - </li>  
142 - <li class="menu-item" >  
143 - <button type="button" class="menu-btn" data-method="revokeRealOutgo">  
144 - <span class="menu-text">撤销实发</span>  
145 - </button>  
146 - </li>  
147 - <li class="menu-separator"></li>  
148 - <li class="menu-item" >  
149 - <button type="button" class="menu-btn" data-multi=1 data-method="spaceAdjust">  
150 - <span class="menu-text">间隔调整</span>  
151 - </button>  
152 - </li>  
153 - <!-- <li class="menu-item disabled" >  
154 - <button type="button" class="menu-btn">  
155 - <span class="menu-text">误点调整</span>  
156 - </button>  
157 - </li> -->  
158 - <li class="menu-item" >  
159 - <button type="button" class="menu-btn" data-method="schInfoFineTune">  
160 - <span class="menu-text">发车信息微调</span>  
161 - </button>  
162 - </li>  
163 - <li class="menu-separator"></li>  
164 - <li class="menu-item" >  
165 - <button type="button" class="menu-btn" data-method="childTask">  
166 - <i class="fa fa-plus"></i>  
167 - <span class="menu-text">临加/子任务</span>  
168 - </button>  
169 - </li>  
170 - <li class="menu-separator"></li>  
171 - <li class="menu-item" >  
172 - <button type="button" class="menu-btn" data-method="vehicAndPerAdjust">  
173 - <i class="fa fa-retweet"></i>  
174 - <span class="menu-text">调整车/人</span>  
175 - </button>  
176 - </li>  
177 - <li class="menu-separator"></li>  
178 - <li class="menu-item" >  
179 - <button type="button" class="menu-btn" data-method="directiveRepeat">  
180 - <i class="fa fa-bell-o"></i>  
181 - <span class="menu-text">指令重发</span>  
182 - </button>  
183 - </li>  
184 -</menu>  
185 -<!-- 主页右键菜单 -->  
186 -<menu class="menu" id="homeMenu" style="display: none;">  
187 - <li class="menu-item disabled" id="menu-linename">  
188 - <button type="button" class="menu-btn">  
189 - <span class="menu-text">--- <span class="menu-title-nbbm"></span> ---</span>  
190 - </button>  
191 - </li>  
192 - <li class="menu-item" >  
193 - <button type="button" class="menu-btn" data-method="sendPhrase">  
194 - <span class="menu-text">发送消息短语</span>  
195 - </button>  
196 - </li>  
197 - <li class="menu-separator"></li>  
198 - <li class="menu-item" >  
199 - <button type="button" class="menu-btn" data-method="showState">  
200 - <span class="menu-text">车辆状态查看</span>  
201 - </button>  
202 - </li>  
203 - <li class="menu-item submenu">  
204 - <button type="button" class="menu-btn">  
205 - <span class="menu-text">车辆状态切换</span>  
206 - </button>  
207 - <menu class="menu">  
208 - <li class="menu-item">  
209 - <button type="button" class="menu-btn" data-method="changeUp">  
210 - <span class="menu-text">上行营运</span>  
211 - </button>  
212 - </li>  
213 - <li class="menu-item">  
214 - <button type="button" class="menu-btn" data-method="changeDown">  
215 - <span class="menu-text">下行营运</span>  
216 - </button>  
217 - </li>  
218 - </menu>  
219 - </li>  
220 -</menu>  
221 -  
222 -<div class="ctm-note animated bounceInDown">  
223 - <div class="content"></div>  
224 -</div>  
225 -</div>  
226 -<div id="temps"></div>  
227 -  
228 -<div id="tooltip" style="display: none;">  
229 -</div>  
230 -  
231 -<script>  
232 -//JS文件加载计数,countDownLatch为0 时则加载完成  
233 -var countDownLatch = 13;  
234 -function countDown(name){  
235 - countDownLatch --;  
236 - if(!countDownLatch)  
237 - _main.start();  
238 -  
239 - console.log('countDown: ' + countDownLatch, 'file: ' + name);  
240 -}  
241 -</script>  
242 -<script src="/assets/js/eventproxy.js"></script>  
243 -  
244 -<script src="/pages/control/line/js/main.js"></script>  
245 -<script src="/pages/control/line/js/tooltip.js"></script>  
246 -<script src="/pages/control/line/js/drawSvg.js"></script>  
247 -<script src="/pages/control/line/js/data.js"></script>  
248 -<script src="/pages/control/line/js/rightMenu.js"></script>  
249 -<script src="/pages/control/line/js/homeMenu.js"></script>  
250 -<script src="/pages/control/line/js/alone.js"></script>  
251 -<script src="/pages/control/line/js/messenger.js"></script>  
252 -<script src="/pages/control/line/js/keyboardListen.js"></script>  
253 -<script src="/pages/control/line/js/toolbarEvent.js"></script>  
254 -<script src="/pages/control/line/js/speech.js" data-exclude=1></script>  
255 -<script src="/pages/control/line/js/home.js"></script>  
256 -  
257 -<script>  
258 -var updateLog = {  
259 - text: '<div class="updete_log"><p>1、过滤掉未加入调度配置的GPS信号。</p></div>'  
260 - ,title: '2016年9月13号更新日志'  
261 -}  
262 -  
263 -var lineCodes = '' //全部线路编码字符串,由data.js初始化  
264 - , lineMap = {} //编码和线路详细对照,由data.js初始化;  
265 - ,animationend = 'webkitAnimationEnd animationend';  
266 -moment.locale('zh-cn');  
267 -  
268 -var cUser  
269 - , storage = window.localStorage  
270 - , operationMode = storage.getItem('operationMode');  
271 -  
272 -//当前用户  
273 -$.get('/user/currentUser', function(user){  
274 - cUser = user;  
275 - $('.portlet-fullscreen .top_username').text(cUser.userName)  
276 - var t = operationMode == 0?',<abbr title="系统将对当前的提交请求进行拦截">监控模式</abbr> 在线'  
277 - :',主调模式 在线';  
278 - $('.portlet-fullscreen .operation_mode_text').html(t);  
279 -});  
280 -  
281 -//打个标记  
282 -storage.setItem('real_control_flag', 1);  
283 -  
284 -var reqCodeMap = {0xA1: '请求恢复运营', 0xA2: '申请调档', 0xA3: '出场请求', 0xA5: '进场请求', 0xA7: '加油请求', 0x50: '车辆故障', 0x70: '路阻报告', 0x60: '事故报告', 0x11: '扣证纠纷', 0x12 : '报警'};  
285 -  
286 -function _fadeOut($that){  
287 - $that.fadeOut('normal', function(){  
288 - $that.remove();  
289 - });  
290 -}  
291 -$(function() {  
292 - //主调和监控模式横幅颜色  
293 - if(operationMode == 0)  
294 - $('.portlet-fullscreen').addClass('monitor');  
295 - else  
296 - $('.portlet-fullscreen').addClass('main');  
297 -  
298 - //加载模板文件  
299 - getTemp('temps/home_tp.html');  
300 - getTemp('temps/tooltip_tp.html');  
301 - getTemp('temps/alone_tp.html');  
302 - getTemp('temps/child_task_case_tp.html');  
303 - getTemp('temps/messenger.html');  
304 -  
305 - function getTemp(url){  
306 - $.get(url, function(template){  
307 - $('#temps').append(template);  
308 - });  
309 - }  
310 -});  
311 -  
312 -//监控模式下拦截POST请求  
313 -function interceptPOST(e, xhr, t){  
314 - if(t && (t.method == 'POST' || t.type == 'POST')){  
315 - console.log(e, xhr, t);  
316 - xhr.abort();  
317 - layer.msg('监控模式!',{offset: 'ct', shift : 6});  
318 - }  
319 -}  
320 -  
321 -</script> 1 +<link href="/pages/control/line/css/lineControl.css" rel="stylesheet" type="text/css" />
  2 +<link href="/metronic_v4.5.4/css/animate.min.css" rel="stylesheet" type="text/css" />
  3 +
  4 +<!-- 初始load界面 -->
  5 +<div class="load-anim" >
  6 + <div class="load-anim-list">
  7 + <div class="spinner"></div>
  8 + <!-- <div class="item load_resource">加载资源文件...</div> -->
  9 +<!-- <div class="item">校准客户端时间...</div>
  10 + <div class="item">加载GPS模块...</div>
  11 + <div class="item">加载班次信息...</div>
  12 + <div class="item">webSocket 连接...</div> -->
  13 + </div>
  14 +</div>
  15 +
  16 +<div class="portlet light portlet-fullscreen" style="transition: all .5s ease;padding: 0;" oncontextmenu=self.event.returnValue=false>
  17 +
  18 + <div class="portlet-title banner" >
  19 + <div class="caption col_hide_1280" style="color: #FFF;">
  20 + <i class="fa fa-life-ring" style="font-size: 22px;color: #FFF;"></i> <span
  21 + class="caption-subject bold" style="font-size: 24px;">峨眉公交线路调度系统</span>
  22 + </div>
  23 + <div class="col_hide_1440" style="color: white;font-size: 18px;position: absolute;right: 25px;top: 75px;">
  24 + <span class="top_username"></span> <span class="operation_mode_text animated" ></span>
  25 + </div>
  26 + <div class="actions col_hide_1280" >
  27 + <div class="btn-group">
  28 +
  29 + <div class="btn-group">
  30 + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" >
  31 + <i class="fa fa-database"></i> &nbsp;基础数据
  32 + <i class="fa fa-angle-down"></i>
  33 + </button>
  34 + <ul class="dropdown-menu">
  35 + <li>
  36 + <a href="javascript:;" id=""> 车辆配置 </a>
  37 + </li>
  38 + <li>
  39 + <a href="javascript:;" id=""> 人员配置 </a>
  40 + </li>
  41 + </ul>
  42 + </div>
  43 +
  44 + <div class="btn-group">
  45 + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" >
  46 + <i class="fa fa-bus"></i> &nbsp;车载设备
  47 + <i class="fa fa-angle-down"></i>
  48 + </button>
  49 + <ul class="dropdown-menu">
  50 + <li>
  51 + <a href="javascript:;" id="deviceConfig"> 设备管理 </a>
  52 + </li>
  53 + <li>
  54 + <a href="javascript:;" id="deviceReport"> 设备上报记录 </a>
  55 + </li>
  56 + <li>
  57 + <a href="javascript:;" id="msgAndDirect"> 指令下发记录 </a>
  58 + </li>
  59 + </ul>
  60 + </div>
  61 +
  62 + <div class="btn-group">
  63 + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" >
  64 + <i class="fa fa-gavel"></i> 系统设置
  65 + <i class="fa fa-angle-down"></i>
  66 + </button>
  67 + <ul class="dropdown-menu">
  68 + <li>
  69 + <a href="javascript:;" id="ttsConfigure"> TTS 语音设置 </a>
  70 + </li>
  71 + <li>
  72 + <a href="javascript:;" id="updateLogLink"> 更新日志 </a>
  73 + </li>
  74 + </ul>
  75 + </div>
  76 +
  77 + <button id="exitBtn" type="button" class="btn btn-danger" style="margin-left: 8px;padding: 6.5px 9px !important;" >
  78 + <!-- <i class="fa fa-close" ></i> -->退出线路调度</button>
  79 + </div>
  80 + </div>
  81 + </div>
  82 + <div class="portlet-body" id="top-tabs-wrap" >
  83 + <ul class="nav nav-tabs top-nav" >
  84 + <li class="active">
  85 + <a href="#tab_home" data-toggle="tab" aria-expanded="false" style="padding: 10px 15px;">
  86 + <i class="fa fa-home"></i> 主页
  87 + </a>
  88 + </li>
  89 + <li class=""><a href="#tab_map" data-toggle="tab" style="padding: 10px 15px;"
  90 + aria-expanded="false"><i class="fa fa-map"></i> 地图 </a></li>
  91 + </ul>
  92 +
  93 + <div class="tab-content" >
  94 + <div class="tab-pane fade active in" id="tab_home" ></div>
  95 + <div class="tab-pane fade" id="tab_map" style="position: relative;"></div>
  96 +
  97 + <!-- <div class="tab-pane fade tab_line active in" id="tab_line" >
  98 +
  99 + </div> -->
  100 + </div>
  101 + </div>
  102 +<div id="tooltipShade" class="animated fadeIn"></div>
  103 +
  104 +<div id="menuWrap"></div>
  105 +<!-- 线路调度右键菜单 -->
  106 +<menu class="menu" id="rightMenu" style="display: none;">
  107 + <li class="menu-item submenu">
  108 + <button type="button" class="menu-btn" data-method="outgoAdjust">
  109 + <span class="menu-text">待发调整</span>
  110 + </button>
  111 + <menu class="menu">
  112 + <li class="menu-item">
  113 + <button type="button" class="menu-btn" data-method="outgoAdjust">
  114 + <span class="menu-text">基于班次</span>
  115 + </button>
  116 + </li>
  117 + <li class="menu-item">
  118 + <button type="button" class="menu-btn" data-method="outgoAdjustAll">
  119 + <span class="menu-text">基于车辆</span>
  120 + </button>
  121 + </li>
  122 + </menu>
  123 + </li>
  124 +
  125 +
  126 + <li class="menu-separator"></li>
  127 + <li class="menu-item" >
  128 + <button type="button" class="menu-btn" data-method="planDestroy">
  129 + <span class="menu-text">计划烂班</span>
  130 + </button>
  131 + </li>
  132 + <li class="menu-item" >
  133 + <button type="button" class="menu-btn" data-method="revokeDestroy">
  134 + <span class="menu-text">撤销烂班</span>
  135 + </button>
  136 + </li>
  137 + <li class="menu-item" >
  138 + <button type="button" class="menu-btn" data-method="realOutgoAdjust">
  139 + <span class="menu-text">实发调整</span>
  140 + </button>
  141 + </li>
  142 + <li class="menu-item" >
  143 + <button type="button" class="menu-btn" data-method="revokeRealOutgo">
  144 + <span class="menu-text">撤销实发</span>
  145 + </button>
  146 + </li>
  147 + <li class="menu-separator"></li>
  148 + <li class="menu-item" >
  149 + <button type="button" class="menu-btn" data-multi=1 data-method="spaceAdjust">
  150 + <span class="menu-text">间隔调整</span>
  151 + </button>
  152 + </li>
  153 + <!-- <li class="menu-item disabled" >
  154 + <button type="button" class="menu-btn">
  155 + <span class="menu-text">误点调整</span>
  156 + </button>
  157 + </li> -->
  158 + <li class="menu-item" >
  159 + <button type="button" class="menu-btn" data-method="schInfoFineTune">
  160 + <span class="menu-text">发车信息微调</span>
  161 + </button>
  162 + </li>
  163 + <li class="menu-separator"></li>
  164 + <li class="menu-item" >
  165 + <button type="button" class="menu-btn" data-method="childTask">
  166 + <i class="fa fa-plus"></i>
  167 + <span class="menu-text">临加/子任务</span>
  168 + </button>
  169 + </li>
  170 + <li class="menu-separator"></li>
  171 + <li class="menu-item" >
  172 + <button type="button" class="menu-btn" data-method="vehicAndPerAdjust">
  173 + <i class="fa fa-retweet"></i>
  174 + <span class="menu-text">调整车/人</span>
  175 + </button>
  176 + </li>
  177 + <li class="menu-separator"></li>
  178 + <li class="menu-item" >
  179 + <button type="button" class="menu-btn" data-method="directiveRepeat">
  180 + <i class="fa fa-bell-o"></i>
  181 + <span class="menu-text">指令重发</span>
  182 + </button>
  183 + </li>
  184 +</menu>
  185 +<!-- 主页右键菜单 -->
  186 +<menu class="menu" id="homeMenu" style="display: none;">
  187 + <li class="menu-item disabled" id="menu-linename">
  188 + <button type="button" class="menu-btn">
  189 + <span class="menu-text">--- <span class="menu-title-nbbm"></span> ---</span>
  190 + </button>
  191 + </li>
  192 + <li class="menu-item" >
  193 + <button type="button" class="menu-btn" data-method="sendPhrase">
  194 + <span class="menu-text">发送消息短语</span>
  195 + </button>
  196 + </li>
  197 + <li class="menu-separator"></li>
  198 + <li class="menu-item" >
  199 + <button type="button" class="menu-btn" data-method="showState">
  200 + <span class="menu-text">车辆状态查看</span>
  201 + </button>
  202 + </li>
  203 + <li class="menu-item submenu">
  204 + <button type="button" class="menu-btn">
  205 + <span class="menu-text">车辆状态切换</span>
  206 + </button>
  207 + <menu class="menu">
  208 + <li class="menu-item">
  209 + <button type="button" class="menu-btn" data-method="changeUp">
  210 + <span class="menu-text">上行营运</span>
  211 + </button>
  212 + </li>
  213 + <li class="menu-item">
  214 + <button type="button" class="menu-btn" data-method="changeDown">
  215 + <span class="menu-text">下行营运</span>
  216 + </button>
  217 + </li>
  218 + </menu>
  219 + </li>
  220 +</menu>
  221 +
  222 +<div class="ctm-note animated bounceInDown">
  223 + <div class="content"></div>
  224 +</div>
  225 +</div>
  226 +<div id="temps"></div>
  227 +
  228 +<div id="tooltip" style="display: none;">
  229 +</div>
  230 +
  231 +<script>
  232 +//JS文件加载计数,countDownLatch为0 时则加载完成
  233 +var countDownLatch = 13;
  234 +function countDown(name){
  235 + countDownLatch --;
  236 + if(!countDownLatch)
  237 + _main.start();
  238 +
  239 + console.log('countDown: ' + countDownLatch, 'file: ' + name);
  240 +}
  241 +</script>
  242 +<script src="/assets/js/eventproxy.js"></script>
  243 +
  244 +<script src="/pages/control/line/js/main.js"></script>
  245 +<script src="/pages/control/line/js/tooltip.js"></script>
  246 +<script src="/pages/control/line/js/drawSvg.js"></script>
  247 +<script src="/pages/control/line/js/data.js"></script>
  248 +<script src="/pages/control/line/js/rightMenu.js"></script>
  249 +<script src="/pages/control/line/js/homeMenu.js"></script>
  250 +<script src="/pages/control/line/js/alone.js"></script>
  251 +<script src="/pages/control/line/js/messenger.js"></script>
  252 +<script src="/pages/control/line/js/keyboardListen.js"></script>
  253 +<script src="/pages/control/line/js/toolbarEvent.js"></script>
  254 +<script src="/pages/control/line/js/speech.js" data-exclude=1></script>
  255 +<script src="/pages/control/line/js/home.js"></script>
  256 +
  257 +<script>
  258 +var updateLog = {
  259 + text: '<div class="updete_log"><p>1、过滤掉未加入调度配置的GPS信号。</p></div>'
  260 + ,title: '2016年9月13号更新日志'
  261 +}
  262 +
  263 +var lineCodes = '' //全部线路编码字符串,由data.js初始化
  264 + , lineMap = {} //编码和线路详细对照,由data.js初始化;
  265 + ,animationend = 'webkitAnimationEnd animationend';
  266 +moment.locale('zh-cn');
  267 +
  268 +var cUser
  269 + , storage = window.localStorage
  270 + , operationMode = storage.getItem('operationMode');
  271 +
  272 +//当前用户
  273 +$.get('/user/currentUser', function(user){
  274 + cUser = user;
  275 + $('.portlet-fullscreen .top_username').text(cUser.userName)
  276 + var t = operationMode == 0?',<abbr title="系统将对当前的提交请求进行拦截">监控模式</abbr> 在线'
  277 + :',主调模式 在线';
  278 + $('.portlet-fullscreen .operation_mode_text').html(t);
  279 +});
  280 +
  281 +//打个标记
  282 +storage.setItem('real_control_flag', 1);
  283 +
  284 +var reqCodeMap = {0xA1: '请求恢复运营', 0xA2: '申请调档', 0xA3: '出场请求', 0xA5: '进场请求', 0xA7: '加油请求', 0x50: '车辆故障', 0x70: '路阻报告', 0x60: '事故报告', 0x11: '扣证纠纷', 0x12 : '报警'};
  285 +
  286 +function _fadeOut($that){
  287 + $that.fadeOut('normal', function(){
  288 + $that.remove();
  289 + });
  290 +}
  291 +$(function() {
  292 + //主调和监控模式横幅颜色
  293 + if(operationMode == 0)
  294 + $('.portlet-fullscreen').addClass('monitor');
  295 + else
  296 + $('.portlet-fullscreen').addClass('main');
  297 +
  298 + //加载模板文件
  299 + getTemp('temps/home_tp.html');
  300 + getTemp('temps/tooltip_tp.html');
  301 + getTemp('temps/alone_tp.html');
  302 + getTemp('temps/child_task_case_tp.html');
  303 + getTemp('temps/messenger.html');
  304 +
  305 + function getTemp(url){
  306 + $.get(url, function(template){
  307 + $('#temps').append(template);
  308 + });
  309 + }
  310 +});
  311 +
  312 +//监控模式下拦截POST请求
  313 +function interceptPOST(e, xhr, t){
  314 + if(t && (t.method == 'POST' || t.type == 'POST')){
  315 + console.log(e, xhr, t);
  316 + xhr.abort();
  317 + layer.msg('监控模式!',{offset: 'ct', shift : 6});
  318 + }
  319 +}
  320 +
  321 +</script>
322 <script src="/pages/control/line/js/webSocketHandle.js"></script> 322 <script src="/pages/control/line/js/webSocketHandle.js"></script>
323 \ No newline at end of file 323 \ No newline at end of file
src/main/resources/static/pages/demo/demo.html
1 -<style>  
2 - .sidebar {/* 左侧导航目录*/  
3 - font-size: 18px;  
4 - width: 250px;  
5 - background-color: steelblue;  
6 - color: white;  
7 - padding-top: 20px;  
8 - box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1);  
9 - position: fixed;  
10 - height: 100%;  
11 - overflow-y: auto;  
12 - z-index: 1000;  
13 - }  
14 -  
15 - .sidebar a {  
16 - display: block;  
17 - padding: 10px 20px;  
18 - text-decoration: none;  
19 - color: white;  
20 - transition: background-color 0.3s;  
21 - }  
22 -  
23 - .sidebar h2:before {  
24 - content: '';  
25 - display: inline-block;  
26 - width: 52px;  
27 - height: 52px;  
28 - background: url('image/a.png') no-repeat center center;  
29 - background-size: contain;  
30 - margin-right: 5px;  
31 - vertical-align: middle;  
32 - }  
33 -  
34 - .sidebar a.nav-item:before {/*导航目录加图标*/  
35 - content: '';  
36 - display: inline-block;  
37 - width: 16px;  
38 - height: 16px;  
39 - background-repeat: no-repeat;  
40 - background-position: center;  
41 - background-size: contain;  
42 - margin-right: 8px;  
43 - vertical-align: middle;  
44 - }  
45 - .sidebar .submenu-content a:before { /* 新增规则,针对子菜单中的链接 */  
46 - content: '';  
47 - display: inline-block;  
48 - width: 16px;  
49 - height: 16px;  
50 - background-repeat: no-repeat;  
51 - background-position: center;  
52 - background-size: contain;  
53 - margin-right: 8px;  
54 - vertical-align: middle;  
55 - }  
56 - /* 确保每个特定图标的规则也适用于子菜单中的链接 */  
57 - .sidebar a.open-l2:before,  
58 - .sidebar .submenu-content a[href="#section2"]:before { /* 针对“线路标签”的图标 */  
59 - background-image: url('image/2.png');  
60 - }  
61 -  
62 - .sidebar a.open-l3:before,  
63 - .sidebar .submenu-content a[href="#section3"]:before { /* 针对“图例说明”的图标 */  
64 - background-image: url('image/3.png');  
65 - }  
66 -  
67 - .sidebar a.open-l4:before,  
68 - .sidebar .submenu-content a[href="#section4"]:before { /* 针对“班次显示方式”的图标 */  
69 - background-image: url('image/4.png');  
70 - }  
71 -  
72 - .sidebar a.open-l1:before {  
73 - background-image: url('image/1.png');  
74 - }  
75 -  
76 - .sidebar a.open-l2:before {  
77 - background-image: url('image/2.png');  
78 - }  
79 -  
80 - .sidebar a.open-l3:before {  
81 - background-image: url('image/3.png');  
82 - }  
83 -  
84 - .sidebar a.open-l4:before {  
85 - background-image: url('image/4.png');  
86 - }  
87 -  
88 - .sidebar a.open-l5:before {  
89 - background-image: url('image/5.png');  
90 - }  
91 -  
92 - .sidebar a.open-l6:before {  
93 - background-image: url('image/6.png');  
94 - }  
95 -  
96 - .sidebar a.open-l7:before {  
97 - background-image: url('image/7.png');  
98 - }  
99 -  
100 - .sidebar a.open-l8:before {  
101 - background-image: url('image/8.png');  
102 - }  
103 -  
104 - .sidebar a.open-l9:before {  
105 - background-image: url('image/9.png');  
106 - }  
107 -  
108 - .sidebar a.open-l10:before {  
109 - background-image: url('image/10.png');  
110 - }  
111 -  
112 - .sidebar a.open-l11:before {  
113 - background-image: url('image/11.png');  
114 - }  
115 -  
116 - .sidebar a:hover {  
117 - background-color: cornflowerblue;  
118 - }  
119 -  
120 - .content {  
121 - font-size: 16px;  
122 - margin-left: 270px;  
123 - padding-left: 20px;  
124 - max-width: calc(100% - 270px);  
125 - flex-grow: 1;  
126 - }  
127 -  
128 - /* 响应式设计,针对小屏幕 */  
129 - @media (max-width: 900px) {  
130 - .sidebar {  
131 - width: 60px;  
132 - }  
133 -  
134 - .content {  
135 - margin-left: 80px;  
136 - max-width: calc(100% - 80px);  
137 - }  
138 - }  
139 -  
140 -  
141 - .content-with-border { /*灰色边框*/  
142 - border: 2px solid #cccccc;  
143 - padding: 20px;  
144 - margin-top: 50px;  
145 - margin-left: 10px;  
146 - border-radius: 8px;  
147 - }  
148 -  
149 - .inline-button {  
150 - display: inline-block;  
151 - vertical-align: middle;  
152 - }  
153 -  
154 - .container {  
155 - max-width: 1200px;  
156 - margin: 20px auto;  
157 - padding: 20px;  
158 - background: #fff;  
159 - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);  
160 - }  
161 -  
162 - .indent {  
163 - text-indent: 2em;  
164 - word-wrap: break-word;  
165 - overflow-wrap: break-word;  
166 - white-space: normal;  
167 - }  
168 -  
169 - h1 {  
170 - font-weight: bold;  
171 - text-align: center;  
172 - color: #333;  
173 - }  
174 - h3 {  
175 - font-weight: bold;  
176 - margin-left:20px ;  
177 - color: #333;  
178 - }  
179 -  
180 -  
181 -  
182 - .video-item {  
183 - margin-bottom: 20px;  
184 - }  
185 -  
186 - .video-item h2 {  
187 - font-weight: bold;  
188 - color: #333333;  
189 - border-bottom: 1px solid #eeeeee;  
190 - padding-bottom: 10px;  
191 - }  
192 -  
193 - video {  
194 - width: 100%;  
195 - max-width: 720px;  
196 - }  
197 -  
198 - .video-container {  
199 - display: flex;  
200 - justify-content: center;  
201 - align-items: center;  
202 - margin-top: 20px;  
203 - position: relative;  
204 - width: 100%;  
205 - }  
206 -  
207 - .video-container video {  
208 - max-width: 720px;  
209 - transform: translateX(-1px);  
210 - transition: transform 0.3s ease;  
211 - }  
212 -  
213 - button {  
214 - padding: 5px 10px;  
215 - font-size: 14px;  
216 - color: #333333;  
217 - background-color: steelblue;  
218 - border: none;  
219 - border-radius: 5px;  
220 - cursor: pointer;  
221 - outline: none;  
222 - margin-left: 5px;  
223 - display: inline-block;  
224 - vertical-align: middle;  
225 - }  
226 - .submenu {  
227 - margin-top: 10px;  
228 - }  
229 -  
230 - .submenu-title {  
231 - display: block;  
232 - padding: 10px 20px;  
233 - text-decoration: none;  
234 - color: white;  
235 - background-color: steelblue;  
236 - transition: background-color 0.3s;  
237 - cursor: pointer;  
238 - }  
239 - .submenu-title:before {  
240 - content: '';  
241 - display: inline-block;  
242 - width: 16px;  
243 - height: 16px;  
244 - background-repeat: no-repeat;  
245 - background-position: center;  
246 - background-size: contain;  
247 - margin-right: 8px; /* 图标与文本之间的间距 */  
248 - vertical-align: middle; /* 确保图标垂直居中文本 */  
249 - background-image: url('image/1.png'); /* 图标路径 */  
250 - }  
251 - .submenu-title:hover {  
252 - background-color: steelblue;  
253 - }  
254 -  
255 - .submenu-content {  
256 - list-style-type: none;  
257 - padding-left: 20px;  
258 - background-color: steelblue;  
259 - }  
260 -  
261 - .submenu-content a {  
262 - display: block;  
263 - padding: 8px 20px;  
264 - text-decoration: none;  
265 - color: white;  
266 - transition: background-color 0.3s;  
267 - }  
268 -  
269 - .submenu-content a:hover {  
270 - background-color: cornflowerblue;  
271 - }  
272 -</style>  
273 -<div class="sidebar">  
274 - <!--h2 style="text-align: left; margin-bottom: 20px;">功能导航</h2-->  
275 - <a href="#section1" class="nav-item open-l1">打开线调</a><!--1-->  
276 - <a href="#section2" class="nav-item open-l8">核对当日计划排班</a><!--2-->  
277 - <div class="submenu">  
278 - <a href="#" class="submenu-title" >检查车载设备</a><!--3-->  
279 - <ul class="submenu-content" style="display:none;">  
280 - <li><a href="#section3-1" class="nav-item open-l2">检查车载设备情况</a></li>  
281 - <li><a href="#section3-2" class="nav-item open-l3">检查车载设备情况(续)</a></li>  
282 - </ul>  
283 - </div>  
284 -  
285 - <div class="submenu">  
286 - <a href="#" class="submenu-title" >配套说明</a><!--4-->  
287 - <ul class="submenu-content" style="display:none;">  
288 - <li><a href="#section4-1" class="nav-item open-l2">线路标签</a></li>  
289 - <li><a href="#section4-2" class="nav-item open-l3">图例说明</a></li>  
290 - <li><a href="#section4-3" class="nav-item open-l4">班次显示方式</a></li>  
291 - </ul>  
292 - </div>  
293 - <div class="submenu">  
294 - <a href="#" class="submenu-title" >营运班次操作</a><!--5-->  
295 - <ul class="submenu-content" style="display:none;">  
296 - <li><a href="#section5-1-1" class="nav-item open-l2">待发调整</a></li>  
297 - <li><a href="#section5-1-2" class="nav-item open-l3">误点调整</a></li>  
298 - <li><a href="#section5-2" class="nav-item open-l3">实发调整</a></li>  
299 - <li><a href="#section5-3" class="nav-item open-l4">发车信息微调及撤销实发</a></li>  
300 - </ul>  
301 - </div>  
302 - <a href="#section6" class="nav-item open-l6">烂班操作</a><!--6-->  
303 - <a href="#section7" class="nav-item open-l6">临加班次</a><!--7-->  
304 - <div class="submenu">  
305 - <a href="#" class="submenu-title" >子任务操作</a><!--8-->  
306 - <ul class="submenu-content" style="display:none;">  
307 - <li><a href="#section8-1" class="nav-item open-l2">新增子任务</a></li>  
308 - <li><a href="#section8-2" class="nav-item open-l3">修改与删除子任务</a></li>  
309 - </ul>  
310 - </div>  
311 - <a href="#section9" class="nav-item open-l6">调整人车和路牌对调</a><!--9-->  
312 - <a href="#section10" class="nav-item open-l6">指令重发</a><!--10-->  
313 - <a href="#section11" class="nav-item open-l6">批量调整修改</a><!--11-->  
314 - <div class="submenu">  
315 - <a href="#" class="submenu-title" >车载互动</a><!--12-->  
316 - <ul class="submenu-content" style="display:none;">  
317 - <li><a href="#section12-1" class="nav-item open-l2">发送消息</a></li>  
318 - <li><a href="#section12-2" class="nav-item open-l3">发送车载状态</a></li>  
319 - </ul>  
320 - </div>  
321 - <a href="#section13" class="nav-item open-l10">核对当日营运数据</a><!--13-->  
322 - <a href="#section14" class="nav-item open-l11">退出线调</a><!--14-->  
323 -</div>  
324 -  
325 -<div class="content">  
326 - <h1>浦东公交线路调度演示说明</h1>  
327 - <div class="content-with-border">  
328 -  
329 - <div class="video-item" id="section1">  
330 -  
331 - <h2>打开线调</h2>  
332 - <p class="indent">  
333 - 登录系统后,打开功能列表中的线调,选择需要的路线,上次登录成功的线路将默认显示在已选列表中。选择线路时,可选择多条线路进入线调,可通过在搜索框中检索或者在左侧筛选栏中筛选来选择线路。完成选择后,点击进入线路调度。</p>  
334 - <p class="indent">注意:线路主调默认勾选“主调模式”登录,非当班调度需取消“主调模式”勾选。</p>  
335 - <p class="indent">进入线路加载,线路加载成功,“进入线调”完成。  
336 - <button onclick="playVideo('video1')">点击播放演示视频</button>  
337 - </p>  
338 - <div class="video-container">  
339 - <video id="video1" controls style="display: none;">  
340 - <source src="Videos/1打开线调.mp4" type="video/mp4">  
341 - 您的浏览器不支持 video 标签。  
342 - </video>  
343 - </div>  
344 - </div>  
345 -  
346 - <div class="video-item" id="section2">  
347 - <h2>核对当日计划排班</h2>  
348 - <p class="indent">打开页面顶端“数据&统计”标签,选择“当日计划排班”功能,显示计划排班,在登录多条线路的情况下可点击标签页切换线路,请</p>  
349 - <p>仔细核对线路人员、路牌、车辆的对应关系,如与当天计划不一致,需及时修改调整。  
350 - <button onclick="playVideo('video2')">点击播放演示视频</button>  
351 - </p>  
352 -  
353 - <div class="video-container">  
354 - <video id="video2" controls style="display: none;">  
355 - <source src="Videos/2核对当日计划排班.mp4" type="video/mp4">  
356 - 您的浏览器不支持 video 标签。  
357 - </video>  
358 - </div>  
359 - </div>  
360 -  
361 -  
362 - <div class="video-item" id="section3-1">  
363 - <h2>检查车载设备</h2>  
364 - <h3>检查车载设备情况</h3>  
365 - <p class="indent">  
366 - 查看班次执行列表,关注即将出场的车辆,切换到“地图”标签,在搜索框中输入数字,在联想结果中选择需要查找的车号,查看车载最后报告时间是否与当前时间一致,来判定车载当前是否在线,车辆是否已做好发车准备。</p>  
367 - <p class="indent">  
368 - 切换回线路班次执行界面,关注信息框中的信息并及时对各种请求做出响应,车载信号正常,驾驶员规范行驶的前提下,系统会根据车载信号进出站自动计算班次的发出和到达时间,这类信息会倒计时后自动确认,并不需要人工干预。  
369 - <button onclick="playVideo('video3')">点击播放演示视频</button>  
370 - </p>  
371 -  
372 - <div class="video-container">  
373 - <video id="video3" controls style="display: none;">  
374 - <source src="Videos/3-1检查车载设备情况.mp4" type="video/mp4">  
375 - 您的浏览器不支持 video 标签。  
376 - </video>  
377 - </div>  
378 - </div>  
379 -  
380 - <div class="video-item" id="section3-2">  
381 - <h3>检查车载设备情况</h3>  
382 - <p class="indent">如果车辆情况异常,点击车载设备,选择设备管理,看车载是否在线、发送线路ID是否正确,如果当前时间有班次,但是车载离线,</p>  
383 - <p>查找车载离线原因,是调整车辆了还是车载设备损坏。  
384 - <button onclick="playVideo('video4')">点击播放演示视频</button>  
385 - </p>  
386 - <div class="video-container">  
387 - <video id="video4" controls style="display: none;">  
388 - <source src="Videos/3-2检查车载设备情况.mp4" type="video/mp4">  
389 - 您的浏览器不支持 video 标签。  
390 - </video>  
391 - </div>  
392 - </div>  
393 -  
394 - <div class="video-item" id="section4-1">  
395 - <h2>配套说明</h2>  
396 - <h3>线路标签</h3>  
397 - <p class="indent">  
398 - 线调标签每条线路名旁有数字及字母标识,线路名称后第一个数字代表当前线路信息框内未处理信息数量,遵循人对人,机对机原则;定位信号自动判定的班次执行由系统自动处理,驾驶员手动发送的各种请求需主调做出响应。</p>  
399 - <p class="indent">线路名称后的第二个数字代表该线路对照当前时间应发而未发的班次数量,当班调度需及时查询未发原因并对该班次进行处理。</p>  
400 - <p class="indent">线路名称后的最后一项代表本线路的大间隔等级。  
401 - <button onclick="playVideo('video5')">点击播放演示视频</button>  
402 - </p>  
403 -  
404 - <div class="video-container">  
405 - <video id="video5" controls style="display: none;">  
406 - <source src="Videos/4-1配套说明-线路标签.mp4" type="video/mp4">  
407 - 您的浏览器不支持 video 标签。  
408 - </video>  
409 - </div>  
410 - </div>  
411 -  
412 - <div class="video-item" id="section4-2">  
413 - <h3>图例说明</h3>  
414 - <p class="indent">在班次执行界面主页有图例说明,点击线路上行或者下行首站名称旁的“?”图标。</p>  
415 - <p class="indent">图例说明分为三个模块,分别是班次执行状态、车载信息状态及RFID,其中RFID为各线路首末站点安装设备,会捕捉该站点发出或途经车辆班次,辅助计算,该系统只做显示,不做进一步说明。  
416 - <button onclick="playVideo('video6')">点击播放演示视频</button>  
417 - </p>  
418 -  
419 - <div class="video-container">  
420 - <video id="video6" controls style="display: none;">  
421 - <source src="Videos/4-2配套说明-图例说明.mp4" type="video/mp4">  
422 - 您的浏览器不支持 video 标签。  
423 - </video>  
424 - </div>  
425 - </div>  
426 -  
427 - <div class="video-item" id="section4-3">  
428 - <h3>班次显示方式</h3>  
429 - <p class="indent">  
430 - 在图例“?”后另有两个图标,点击眼睛形状图标,会改变班次显示界面(单元格加边框),用户根据自己使用习惯来改变显示方式,点击二维码形状图标,“实到”字段会改变形态(显示与“应到”时间的误差对比),用户可根据自己使用习惯改变显示方式。  
431 - <button onclick="playVideo('video7')">点击播放演示视频</button>  
432 - </p>  
433 - <div class="video-container">  
434 - <video id="video7" controls style="display: none;">  
435 - <source src="Videos/4-3配套说明-班次显示方式.mp4" type="video/mp4">  
436 - 您的浏览器不支持 video 标签。  
437 - </video>  
438 - </div>  
439 - </div>  
440 -  
441 - <div class="video-item" id="section5-1-1">  
442 - <h2>营运班次操作</h2>  
443 - <h3>待发调整</h3>  
444 - <p class="indent">  
445 - 先确认登陆模式,查询只需监控模式,如箭头所指区域为灰色,需要修改班次为主调模式,如箭头所指区域为蓝色。</p>  
446 - <p class="indent">待发调整,选中需要调整的班次,点击鼠标右键,选择“待发调整“,比较常用的场景为调整待发时间,一般是因为前后班次烂班等原因,需要调整发车间隔,如在本车前一班次未到达的情况下调整之后的班次待发时间,上一班次完成时,信使播报剩余班次、下一班次发车时间时将会直接提示调整后的待发时间,如在本车前一班次已到达的情况下调整后一班次的待发时间,因车载已收到下一班次发车时间提示,建议选择”指令重发“将新的待发时间发送到车载上。</p>  
447 - <p class="indent">待发调整的其他应用场景为班次站点相关调整,有”直放“场景,到终点站,中途站不停靠。选择班次,选择直放后,直接保存,有”放站“场景,放站为直放到某一站点后,开始正常营运载客,选择班次,选择”放站“,再选择开始正常营运的站点后,保存班次,另一种场景为”两点间空驶“,”两点间空驶”不必行驶在线路预设路径,但求高效到达目的地,请根据线路实际运营情况来进行各项干预调整。  
448 - <button onclick="playVideo('video8')">点击播放演示视频</button>  
449 - </p>  
450 -  
451 - <div class="video-container">  
452 - <video id="video8" controls style="display: none;">  
453 - <source src="Videos/5-1-1营运班次操作未-待发调整.mp4" type="video/mp4">  
454 - 您的浏览器不支持 video 标签。  
455 - </video>  
456 - </div>  
457 - </div>  
458 -  
459 - <div class="video-item" id="section5-1-2">  
460 - <h3>误点调整</h3>  
461 - <p class="indent">  
462 - 误点调整的应用场景为:因路阻等原因,前一列班次将无法按照计划时间到达,且无法预估到达时间。  
463 - </p>  
464 - <p class="indent">操作方式如下:选中对应班次,点击鼠标右键调出菜单,选择“误点调整”,在弹出的对话框中输入“误点停靠时间“,然后点击”确认调整“,该操作的含有是:不管前一班次何时到达,前一班次到达时间加上”误点停靠时间“,即为下一班次待发时间,该操作可改善因班次误点造成的待发调整不及时情况。  
465 - <button onclick="playVideo('video9')">点击播放演示视频</button>  
466 - </p>  
467 -  
468 - <div class="video-container">  
469 - <video id="video9" controls style="display: none;">  
470 - <source src="Videos/5-1-2营运班次操作未-误点调整.mp4" type="video/mp4">  
471 - 您的浏览器不支持 video 标签。  
472 - </video>  
473 - </div>  
474 - </div>  
475 -  
476 - <div class="video-item" id="section5-2">  
477 - <h3>实发调整</h3>  
478 - <p class="indent">  
479 - 一般情况下,系统会根据车载信号自动计算班次的到离站,如发生车载掉线等情况影响班次自动判定,则需要人工干预辅助调整,选中班次,点击鼠标右键调出菜单选择”实发调整“,根据实际发车情况填入实发时间,在“调整说明”项下拉菜单中选择调整原因,在备注框中输入调整说明后,点击“保存”。  
480 - </p>  
481 - <p class="indent">如因车辆调整停车位置等情况重复出入电子围栏,造成班次误报实发情况,或者人工干预后发现调整错误,可选择“撤销实发”,请根据线路班次实际情况调整班次。  
482 - <button onclick="playVideo('video10')">点击播放演示视频</button>  
483 - </p>  
484 -  
485 - <div class="video-container">  
486 - <video id="video10" controls style="display: none;">  
487 - <source src="Videos/5-2营运班次操作正-实发调整.mp4" type="video/mp4">  
488 - 您的浏览器不支持 video 标签。  
489 - </video>  
490 - </div>  
491 - </div>  
492 -  
493 - <div class="video-item" id="section5-3">  
494 - <h3>发车信息微调及撤销实发</h3>  
495 - <p class="indent">  
496 - 发车信息微调一般适用场景为:班次到达时间因车载掉线等原因未自动计算,可双击班次打开“发车信息微调”窗口,输入到达时间,在调整说明框中输入调整原因后保存。  
497 - </p>  
498 - <p class="indent">如遇操作错误、或者班次误报等情况,也可撤销,选中班次后右击调出菜单,选择“撤销执行”,在弹出确认窗口选择“确认撤销执行”。请根据实际情况调整班次。  
499 - <button onclick="playVideo('video11')">点击播放演示视频</button>  
500 - </p>  
501 -  
502 - <div class="video-container">  
503 - <video id="video11" controls style="display: none;">  
504 - <source src="Videos/5-3营运班次操作已-发车信息微调及撤销实发.mp4" type="video/mp4">  
505 - 您的浏览器不支持 video 标签。  
506 - </video>  
507 - </div>  
508 - </div>  
509 -  
510 -  
511 - <div class="video-item" id="section6">  
512 - <h2>烂班操作</h2>  
513 - <p class="indent">  
514 - 计划班次无法完成的情况会进行烂班操作,常见场景:车辆故障,导致之后的班次都无法执行,操作方式为:选中班次,点击鼠标右键调出菜单,选中“计划烂班”,在“计划烂班”窗口中选中需要烂班的班次,在“调整说明”下拉列表中选择烂班原因后,点击“保存”。</p>  
515 - <p class="indent">如操作失误、或者故障车辆修复后重新投入营运,也可对烂班班次进行“撤销烂班”操作,选中班次,点击鼠标右键调出菜单,选择“撤销烂班”,在弹出的确认窗口选择“确认撤销”。请根据线路实际情况调整班次。  
516 - <button onclick="playVideo('video12')">点击播放演示视频</button>  
517 - </p>  
518 -  
519 - <div class="video-container">  
520 - <video id="video12" controls style="display: none;">  
521 - <source src="Videos/6烂班操作.mp4" type="video/mp4">  
522 - 您的浏览器不支持 video 标签。  
523 - </video>  
524 - </div>  
525 - </div>  
526 -  
527 - <div class="video-item" id="section7">  
528 - <h2>临加班次</h2>  
529 - <p class="indent">  
530 - 临加班次为计划外班次,一般适用于临时性运营增能,或计划外进出场等情况,临加功能在原有的基础上经过优化,目前可以进行无计划添加,计调相关人员无需再对包车等无固定营运班次线路进行虚拟配车及预排班。  
531 - </p>  
532 - <p class="indent">在页面空白出点击鼠标右键,调出“新增临加班次”功能,点击鼠标左键你打开,在对应框中输入车辆、路牌,出发及到达时间、驾驶员、里程等信息。临加班次本身为计划外班次,无需添加全程后做子任务,根据实际行驶情况选择班次类型、班次首末站点,检查有无遗漏字段,填写完整后点击“保存”,参照上述步骤,添加下行进场班次,也可根据实际情况选择预设场景(往返、场到场),如临加班次车辆、人员、备注等信息编辑错误可与常规班次一样使用“发车信息微调”调整。  
533 - </p>  
534 - <p class="indent">如涉及站点、计划时间、路牌等字段错误,建议删除该临加班次后重新添加,选出对应的路牌,右击调出菜单后选择“临加/子任务”,选中需要删除的临加班次,点击鼠标右键后选择删除。请根据实际情况编辑临加班次。  
535 - <button onclick="playVideo('video13')">点击播放演示视频</button>  
536 - </p>  
537 -  
538 - <div class="video-container">  
539 - <video id="video13" controls style="display: none;">  
540 - <source src="Videos/7临加班次.mp4" type="video/mp4">  
541 - 您的浏览器不支持 video 标签。  
542 - </video>  
543 - </div>  
544 - </div>  
545 -  
546 - <div class="video-item" id="section8-1">  
547 - <h2>子任务操作</h2>  
548 - <h3>新增子任务</h3>  
549 - <p class="indent">  
550 - 子任务的作用是对未完全完成的班次,其营运里程做出明细解释,最常用的场景为:班次营运到中途车辆故障,不能完成剩余里程。  
551 - </p>  
552 - <p class="indent">一、首先将主任务调整为完成状态(该班次执行营运里程不为0,主任务就不做烂班),选中班次,右键调出菜单,选择“新增子任务”,子任务功能中已预设多种场景,该案例无需选择,直接自定义添加子任务明细,在弹出的子任务窗口默认页面中逐个加入,计划班次已完成部分(选择终点站为已执行完成到达的站点,输入营运公里数);二、点击“+”号开始添加第二个子任务,计划班次未完成部分(选择起始站为已执行完成到达的站点,勾选“是否烂班”,输入烂班公里数)。三、点击“+”号开始添加第三个子任务,因故障需进场维修的空驶公里(选择班次类型为进场,起点为班次完成站点,终点为维修停车场),输入空驶公里数,添加各子任务备注后点击保存。  
553 - </p>  
554 - <p class="indent">注意,营运+烂班的合计数需与计划里程数保持一致,否则影响公里数统计(空驶公里不在此列)。请按线路实际班次执行此操作。  
555 - <button onclick="playVideo('video14')">点击播放演示视频</button>  
556 - </p>  
557 -  
558 - <div class="video-container">  
559 - <video id="video14" controls style="display: none;">  
560 - <source src="Videos/8-1子任务操作-新增子任务.mp4" type="video/mp4">  
561 - 您的浏览器不支持 video 标签。  
562 - </video>  
563 - </div>  
564 - </div>  
565 -  
566 - <div class="video-item" id="section8-2">  
567 - <h3>修改与删除子任务</h3>  
568 - <p class="indent">  
569 - 班次计发时间旁有数字,表明该班次有子任务,光标悬浮数字旁,可预览子任务明细,选中班次,右键点击“临加/子任务”功能,可对已添加的子任务进行编辑修改,选择相应的子任务对其进行修正后保存。  
570 - </p>  
571 - <p class="indent">也可删除错误子任务后重新添加,删除部分子任务或者修改子任务公里数后会造成营运公里统计与计划不一致,在箭头所示位置会出现统计提示,请核对后修改。请根据实际情况修改子任务。  
572 - <button onclick="playVideo('video15')">点击播放演示视频</button>  
573 - </p>  
574 -  
575 - <div class="video-container">  
576 - <video id="video15" controls style="display: none;">  
577 - <source src="Videos/8-2子任务操作-修改与删除子任务.mp4" type="video/mp4">  
578 - 您的浏览器不支持 video 标签。  
579 - </video>  
580 - </div>  
581 - </div>  
582 -  
583 - <div class="video-item" id="section9">  
584 - <h2>调整人车和路牌对调</h2>  
585 - <p class="indent">  
586 - 一般遇到驾驶员临时请假,车辆突发故障等情况,需要调整班次驾驶员、调用备车执行班次、调用备车执行班次,会使用到该功能。</p>  
587 - <p class="indent">选中需要调整的路牌的任意班次,鼠标右键调出菜单选择”调整人车“,选择需要调整人车的具体班次(一般已执行的不修改),调整人员时输入工号后在下拉框中选择工号/姓名组合,否则会出现只更新工号,未更新姓名的情况,调整车辆时请仔细核对车号,避免误操作相似车号,影响其他公司/分公司线路车辆运营。  
588 - </p>  
589 - <p class="indent">如果是线路内部人员/车辆临时调整,可使用”路牌对调“功能,选中任意班次,鼠标右键调出菜单,选择”路牌对调“,在窗口两侧选择需要更换的2个路牌及对应班次。在窗口低端,根据实际情况,选择需要”只调人“,”只调车“或”调人并调车“。  
590 - <button onclick="playVideo('video16')">点击播放演示视频</button>  
591 - </p>  
592 -  
593 - <div class="video-container">  
594 - <video id="video16" controls style="display: none;">  
595 - <source src="Videos/9调整人车和路牌对调.mp4" type="video/mp4">  
596 - 您的浏览器不支持 video 标签。  
597 - </video>  
598 - </div>  
599 - </div>  
600 -  
601 - <div class="video-item" id="section10">  
602 - <h2>指令重发</h2>  
603 - <p class="indent">  
604 - 注意:所有修改或者与车辆交互都需要主调模式,此视频仅为操作演示。  
605 - </p>  
606 - <p class="indent">指令重发功能一般适用于两个场景:1.在前班次已执行完成状态下修改将发车班次的待发,需”指令重发“。2.将新的计划发车时间发送到车载,前后班次间有分班、长时间间隔甚至有分班换人安排,需要在分班后首个班次发车前重发计划时间到车载来提醒驾驶员。  
607 - <button onclick="playVideo('video17')">点击播放演示视频</button>  
608 - </p>  
609 -  
610 - <div class="video-container">  
611 - <video id="video17" controls style="display: none;">  
612 - <source src="Videos/10指令重发.mp4" type="video/mp4">  
613 - 您的浏览器不支持 video 标签。  
614 - </video>  
615 - </div>  
616 - </div>  
617 -  
618 - <div class="video-item" id="section11">  
619 - <h2>批量调整修改</h2>  
620 - <p class="indent">批量调整能够快速进行多个班次的待发调整、间隔调整和误点调整,如果需要对多个班次待发时间进行调整,可点击左侧序号列表,</p>  
621 - <p>选择多个班次,右键菜单选择待发调整功能,进入批量待发调整页面。</p>  
622 - <p class="indent">间隔调整,当多个班次间隔过大或过小时,可使用批量间隔调整对班次进行均衡优化。</p>  
623 - <p class="indent">误点调整是在本班车晚点之后,进行误点调整,当车辆到站后,如果有晚点情况,对下一班次的待发时间进行调整,如果没有就不</p>  
624 - <p>会调整;当遇到大规模堵车或者异常天气导致多个班次晚点时,可使用批量误点调整,对多个班次设置车辆进站后的停靠站时间。  
625 - <button onclick="playVideo('video18')">点击播放演示视频</button>  
626 - </p>  
627 -  
628 - <div class="video-container">  
629 - <video id="video18" controls style="display: none;">  
630 - <source src="Videos/11批量调整修改.mp4" type="video/mp4">  
631 - 您的浏览器不支持 video 标签。  
632 - </video>  
633 - </div>  
634 - </div>  
635 -  
636 - <div class="video-item" id="section12-1">  
637 - <h2>车载互动</h2>  
638 - <h3>发送消息</h3>  
639 - <p class="indent">消息短语分群发和单发两种模式,单发消息短语一般适用于:乘客遗失物品在车辆上,调度”到离站查询“缩小查找范围后向驾驶员确认。  
640 - </p>  
641 - <p>操作方式为在主页车辆列表中选择对应车号,鼠标右键调出菜单,选择”发送消息短语“,在对话框中输入需要向驾驶员发送的语句,请检查输入文字,确认无误后点击”发送“,群发消息短语一般适用于通知,范围选择可自定义,操作方式为在主页车辆列表中选择任意车号,鼠标右键调出菜单,选择”群发消息短语“,可选择授权的所有线路车辆,或部分线路(部分车辆),在对话框右侧文本框中输入需要发送的语句,请检查输入文字,确认无误后点击”发送“。  
642 - <button onclick="playVideo('video19')">点击播放演示视频</button>  
643 - </p>  
644 -  
645 - <div class="video-container">  
646 - <video id="video19" controls style="display: none;">  
647 - <source src="Videos/12-1车载互动-发送消息.mp4" type="video/mp4">  
648 - 您的浏览器不支持 video 标签。  
649 - </video>  
650 - </div>  
651 - </div>  
652 -  
653 -  
654 -  
655 - <div class="video-item" id="section12-2">  
656 - <h3>发送车载状态</h3>  
657 - <p class="indent">当查看车辆状态有问题时使用发送车载状态对车辆运营方向进行改变,可以将车辆运营状态切换为上行非营运、下行非营运、上行</p>  
658 - <p>营运、下行营运。  
659 - <button onclick="playVideo('video20')">点击播放演示视频</button>  
660 - </p>  
661 - <div class="video-container">  
662 - <video id="video20" controls style="display: none;">  
663 - <source src="Videos/12-2车载互动-发送车载状态.mp4" type="video/mp4">  
664 - 您的浏览器不支持 video 标签。  
665 - </video>  
666 - </div>  
667 - </div>  
668 -  
669 -  
670 -  
671 - <div class="video-item" id="section13">  
672 - <h2>核对当日营运数据</h2>  
673 - <p class="indent">在线路调度中右上侧点击报表管理,选择其中的行车路单,选择查询,可查看特定人员的行车路单,退出点击右上角的叉号;仍在</p>  
674 - <p>报表管理中选择统计日报,可以查看线路的统计日报;在报表管理下选择调度日报,可查看特定线路当日调度日报;  
675 - <button onclick="playVideo('video21')">点击播放演示视频</button>  
676 - </p>  
677 - <div class="video-container">  
678 - <video id="video21" controls style="display: none;">  
679 - <source src="Videos/13核对当日营运数据.mp4" type="video/mp4">  
680 - 您的浏览器不支持 video 标签。  
681 - </video>  
682 - </div>  
683 - </div>  
684 -  
685 - <div class="video-item" id="section14">  
686 - <h2>退出线调</h2>  
687 - <p class="indent">全部检查无误后,点击右上角退出线调,再点击右上角图形标记,点击注销登录,即可退出线调系统。  
688 - <button onclick="playVideo('video22')">点击播放演示视频</button>  
689 - </p>  
690 - <div class="video-container">  
691 - <video id="video22" controls style="display: none;">  
692 - <source src="Videos/14退出线调.mp4" type="video/mp4">  
693 - 您的浏览器不支持 video 标签。  
694 - </video>  
695 - </div>  
696 - </div>  
697 - </div>  
698 -</div>  
699 -  
700 -<script>  
701 - function playVideo(videoId) {  
702 - var video = document.getElementById(videoId);  
703 - if (video.style.display === 'none') {  
704 - video.style.display = 'block';  
705 - video.play();  
706 - } else {  
707 - video.pause();  
708 - video.style.display = 'none';  
709 - }  
710 - }  
711 - (function(){  
712 - $('.submenu-title').on('click', function() {  
713 - var display = $(this).next().css('display');  
714 - $(this).next().css('display', display === 'none' ? 'block' : 'none');  
715 -  
716 - return false;  
717 - })  
718 -  
719 - $('.nav-item').on('click', function() {  
720 - var target = $($(this).attr('href'));  
721 - $('html, body').animate({scrollTop: target.offset().top - 100}, 1000);  
722 -  
723 - return false;  
724 - })  
725 - })(); 1 +<style>
  2 + .sidebar {/* 左侧导航目录*/
  3 + font-size: 18px;
  4 + width: 250px;
  5 + background-color: steelblue;
  6 + color: white;
  7 + padding-top: 20px;
  8 + box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1);
  9 + position: fixed;
  10 + height: 100%;
  11 + overflow-y: auto;
  12 + z-index: 1000;
  13 + }
  14 +
  15 + .sidebar a {
  16 + display: block;
  17 + padding: 10px 20px;
  18 + text-decoration: none;
  19 + color: white;
  20 + transition: background-color 0.3s;
  21 + }
  22 +
  23 + .sidebar h2:before {
  24 + content: '';
  25 + display: inline-block;
  26 + width: 52px;
  27 + height: 52px;
  28 + background: url('image/a.png') no-repeat center center;
  29 + background-size: contain;
  30 + margin-right: 5px;
  31 + vertical-align: middle;
  32 + }
  33 +
  34 + .sidebar a.nav-item:before {/*导航目录加图标*/
  35 + content: '';
  36 + display: inline-block;
  37 + width: 16px;
  38 + height: 16px;
  39 + background-repeat: no-repeat;
  40 + background-position: center;
  41 + background-size: contain;
  42 + margin-right: 8px;
  43 + vertical-align: middle;
  44 + }
  45 + .sidebar .submenu-content a:before { /* 新增规则,针对子菜单中的链接 */
  46 + content: '';
  47 + display: inline-block;
  48 + width: 16px;
  49 + height: 16px;
  50 + background-repeat: no-repeat;
  51 + background-position: center;
  52 + background-size: contain;
  53 + margin-right: 8px;
  54 + vertical-align: middle;
  55 + }
  56 + /* 确保每个特定图标的规则也适用于子菜单中的链接 */
  57 + .sidebar a.open-l2:before,
  58 + .sidebar .submenu-content a[href="#section2"]:before { /* 针对“线路标签”的图标 */
  59 + background-image: url('image/2.png');
  60 + }
  61 +
  62 + .sidebar a.open-l3:before,
  63 + .sidebar .submenu-content a[href="#section3"]:before { /* 针对“图例说明”的图标 */
  64 + background-image: url('image/3.png');
  65 + }
  66 +
  67 + .sidebar a.open-l4:before,
  68 + .sidebar .submenu-content a[href="#section4"]:before { /* 针对“班次显示方式”的图标 */
  69 + background-image: url('image/4.png');
  70 + }
  71 +
  72 + .sidebar a.open-l1:before {
  73 + background-image: url('image/1.png');
  74 + }
  75 +
  76 + .sidebar a.open-l2:before {
  77 + background-image: url('image/2.png');
  78 + }
  79 +
  80 + .sidebar a.open-l3:before {
  81 + background-image: url('image/3.png');
  82 + }
  83 +
  84 + .sidebar a.open-l4:before {
  85 + background-image: url('image/4.png');
  86 + }
  87 +
  88 + .sidebar a.open-l5:before {
  89 + background-image: url('image/5.png');
  90 + }
  91 +
  92 + .sidebar a.open-l6:before {
  93 + background-image: url('image/6.png');
  94 + }
  95 +
  96 + .sidebar a.open-l7:before {
  97 + background-image: url('image/7.png');
  98 + }
  99 +
  100 + .sidebar a.open-l8:before {
  101 + background-image: url('image/8.png');
  102 + }
  103 +
  104 + .sidebar a.open-l9:before {
  105 + background-image: url('image/9.png');
  106 + }
  107 +
  108 + .sidebar a.open-l10:before {
  109 + background-image: url('image/10.png');
  110 + }
  111 +
  112 + .sidebar a.open-l11:before {
  113 + background-image: url('image/11.png');
  114 + }
  115 +
  116 + .sidebar a:hover {
  117 + background-color: cornflowerblue;
  118 + }
  119 +
  120 + .content {
  121 + font-size: 16px;
  122 + margin-left: 270px;
  123 + padding-left: 20px;
  124 + max-width: calc(100% - 270px);
  125 + flex-grow: 1;
  126 + }
  127 +
  128 + /* 响应式设计,针对小屏幕 */
  129 + @media (max-width: 900px) {
  130 + .sidebar {
  131 + width: 60px;
  132 + }
  133 +
  134 + .content {
  135 + margin-left: 80px;
  136 + max-width: calc(100% - 80px);
  137 + }
  138 + }
  139 +
  140 +
  141 + .content-with-border { /*灰色边框*/
  142 + border: 2px solid #cccccc;
  143 + padding: 20px;
  144 + margin-top: 50px;
  145 + margin-left: 10px;
  146 + border-radius: 8px;
  147 + }
  148 +
  149 + .inline-button {
  150 + display: inline-block;
  151 + vertical-align: middle;
  152 + }
  153 +
  154 + .container {
  155 + max-width: 1200px;
  156 + margin: 20px auto;
  157 + padding: 20px;
  158 + background: #fff;
  159 + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  160 + }
  161 +
  162 + .indent {
  163 + text-indent: 2em;
  164 + word-wrap: break-word;
  165 + overflow-wrap: break-word;
  166 + white-space: normal;
  167 + }
  168 +
  169 + h1 {
  170 + font-weight: bold;
  171 + text-align: center;
  172 + color: #333;
  173 + }
  174 + h3 {
  175 + font-weight: bold;
  176 + margin-left:20px ;
  177 + color: #333;
  178 + }
  179 +
  180 +
  181 +
  182 + .video-item {
  183 + margin-bottom: 20px;
  184 + }
  185 +
  186 + .video-item h2 {
  187 + font-weight: bold;
  188 + color: #333333;
  189 + border-bottom: 1px solid #eeeeee;
  190 + padding-bottom: 10px;
  191 + }
  192 +
  193 + video {
  194 + width: 100%;
  195 + max-width: 720px;
  196 + }
  197 +
  198 + .video-container {
  199 + display: flex;
  200 + justify-content: center;
  201 + align-items: center;
  202 + margin-top: 20px;
  203 + position: relative;
  204 + width: 100%;
  205 + }
  206 +
  207 + .video-container video {
  208 + max-width: 720px;
  209 + transform: translateX(-1px);
  210 + transition: transform 0.3s ease;
  211 + }
  212 +
  213 + button {
  214 + padding: 5px 10px;
  215 + font-size: 14px;
  216 + color: #333333;
  217 + background-color: steelblue;
  218 + border: none;
  219 + border-radius: 5px;
  220 + cursor: pointer;
  221 + outline: none;
  222 + margin-left: 5px;
  223 + display: inline-block;
  224 + vertical-align: middle;
  225 + }
  226 + .submenu {
  227 + margin-top: 10px;
  228 + }
  229 +
  230 + .submenu-title {
  231 + display: block;
  232 + padding: 10px 20px;
  233 + text-decoration: none;
  234 + color: white;
  235 + background-color: steelblue;
  236 + transition: background-color 0.3s;
  237 + cursor: pointer;
  238 + }
  239 + .submenu-title:before {
  240 + content: '';
  241 + display: inline-block;
  242 + width: 16px;
  243 + height: 16px;
  244 + background-repeat: no-repeat;
  245 + background-position: center;
  246 + background-size: contain;
  247 + margin-right: 8px; /* 图标与文本之间的间距 */
  248 + vertical-align: middle; /* 确保图标垂直居中文本 */
  249 + background-image: url('image/1.png'); /* 图标路径 */
  250 + }
  251 + .submenu-title:hover {
  252 + background-color: steelblue;
  253 + }
  254 +
  255 + .submenu-content {
  256 + list-style-type: none;
  257 + padding-left: 20px;
  258 + background-color: steelblue;
  259 + }
  260 +
  261 + .submenu-content a {
  262 + display: block;
  263 + padding: 8px 20px;
  264 + text-decoration: none;
  265 + color: white;
  266 + transition: background-color 0.3s;
  267 + }
  268 +
  269 + .submenu-content a:hover {
  270 + background-color: cornflowerblue;
  271 + }
  272 +</style>
  273 +<div class="sidebar">
  274 + <!--h2 style="text-align: left; margin-bottom: 20px;">功能导航</h2-->
  275 + <a href="#section1" class="nav-item open-l1">打开线调</a><!--1-->
  276 + <a href="#section2" class="nav-item open-l8">核对当日计划排班</a><!--2-->
  277 + <div class="submenu">
  278 + <a href="#" class="submenu-title" >检查车载设备</a><!--3-->
  279 + <ul class="submenu-content" style="display:none;">
  280 + <li><a href="#section3-1" class="nav-item open-l2">检查车载设备情况</a></li>
  281 + <li><a href="#section3-2" class="nav-item open-l3">检查车载设备情况(续)</a></li>
  282 + </ul>
  283 + </div>
  284 +
  285 + <div class="submenu">
  286 + <a href="#" class="submenu-title" >配套说明</a><!--4-->
  287 + <ul class="submenu-content" style="display:none;">
  288 + <li><a href="#section4-1" class="nav-item open-l2">线路标签</a></li>
  289 + <li><a href="#section4-2" class="nav-item open-l3">图例说明</a></li>
  290 + <li><a href="#section4-3" class="nav-item open-l4">班次显示方式</a></li>
  291 + </ul>
  292 + </div>
  293 + <div class="submenu">
  294 + <a href="#" class="submenu-title" >营运班次操作</a><!--5-->
  295 + <ul class="submenu-content" style="display:none;">
  296 + <li><a href="#section5-1-1" class="nav-item open-l2">待发调整</a></li>
  297 + <li><a href="#section5-1-2" class="nav-item open-l3">误点调整</a></li>
  298 + <li><a href="#section5-2" class="nav-item open-l3">实发调整</a></li>
  299 + <li><a href="#section5-3" class="nav-item open-l4">发车信息微调及撤销实发</a></li>
  300 + </ul>
  301 + </div>
  302 + <a href="#section6" class="nav-item open-l6">烂班操作</a><!--6-->
  303 + <a href="#section7" class="nav-item open-l6">临加班次</a><!--7-->
  304 + <div class="submenu">
  305 + <a href="#" class="submenu-title" >子任务操作</a><!--8-->
  306 + <ul class="submenu-content" style="display:none;">
  307 + <li><a href="#section8-1" class="nav-item open-l2">新增子任务</a></li>
  308 + <li><a href="#section8-2" class="nav-item open-l3">修改与删除子任务</a></li>
  309 + </ul>
  310 + </div>
  311 + <a href="#section9" class="nav-item open-l6">调整人车和路牌对调</a><!--9-->
  312 + <a href="#section10" class="nav-item open-l6">指令重发</a><!--10-->
  313 + <a href="#section11" class="nav-item open-l6">批量调整修改</a><!--11-->
  314 + <div class="submenu">
  315 + <a href="#" class="submenu-title" >车载互动</a><!--12-->
  316 + <ul class="submenu-content" style="display:none;">
  317 + <li><a href="#section12-1" class="nav-item open-l2">发送消息</a></li>
  318 + <li><a href="#section12-2" class="nav-item open-l3">发送车载状态</a></li>
  319 + </ul>
  320 + </div>
  321 + <a href="#section13" class="nav-item open-l10">核对当日营运数据</a><!--13-->
  322 + <a href="#section14" class="nav-item open-l11">退出线调</a><!--14-->
  323 +</div>
  324 +
  325 +<div class="content">
  326 + <h1>峨眉公交线路调度演示说明</h1>
  327 + <div class="content-with-border">
  328 +
  329 + <div class="video-item" id="section1">
  330 +
  331 + <h2>打开线调</h2>
  332 + <p class="indent">
  333 + 登录系统后,打开功能列表中的线调,选择需要的路线,上次登录成功的线路将默认显示在已选列表中。选择线路时,可选择多条线路进入线调,可通过在搜索框中检索或者在左侧筛选栏中筛选来选择线路。完成选择后,点击进入线路调度。</p>
  334 + <p class="indent">注意:线路主调默认勾选“主调模式”登录,非当班调度需取消“主调模式”勾选。</p>
  335 + <p class="indent">进入线路加载,线路加载成功,“进入线调”完成。
  336 + <button onclick="playVideo('video1')">点击播放演示视频</button>
  337 + </p>
  338 + <div class="video-container">
  339 + <video id="video1" controls style="display: none;">
  340 + <source src="Videos/1打开线调.mp4" type="video/mp4">
  341 + 您的浏览器不支持 video 标签。
  342 + </video>
  343 + </div>
  344 + </div>
  345 +
  346 + <div class="video-item" id="section2">
  347 + <h2>核对当日计划排班</h2>
  348 + <p class="indent">打开页面顶端“数据&统计”标签,选择“当日计划排班”功能,显示计划排班,在登录多条线路的情况下可点击标签页切换线路,请</p>
  349 + <p>仔细核对线路人员、路牌、车辆的对应关系,如与当天计划不一致,需及时修改调整。
  350 + <button onclick="playVideo('video2')">点击播放演示视频</button>
  351 + </p>
  352 +
  353 + <div class="video-container">
  354 + <video id="video2" controls style="display: none;">
  355 + <source src="Videos/2核对当日计划排班.mp4" type="video/mp4">
  356 + 您的浏览器不支持 video 标签。
  357 + </video>
  358 + </div>
  359 + </div>
  360 +
  361 +
  362 + <div class="video-item" id="section3-1">
  363 + <h2>检查车载设备</h2>
  364 + <h3>检查车载设备情况</h3>
  365 + <p class="indent">
  366 + 查看班次执行列表,关注即将出场的车辆,切换到“地图”标签,在搜索框中输入数字,在联想结果中选择需要查找的车号,查看车载最后报告时间是否与当前时间一致,来判定车载当前是否在线,车辆是否已做好发车准备。</p>
  367 + <p class="indent">
  368 + 切换回线路班次执行界面,关注信息框中的信息并及时对各种请求做出响应,车载信号正常,驾驶员规范行驶的前提下,系统会根据车载信号进出站自动计算班次的发出和到达时间,这类信息会倒计时后自动确认,并不需要人工干预。
  369 + <button onclick="playVideo('video3')">点击播放演示视频</button>
  370 + </p>
  371 +
  372 + <div class="video-container">
  373 + <video id="video3" controls style="display: none;">
  374 + <source src="Videos/3-1检查车载设备情况.mp4" type="video/mp4">
  375 + 您的浏览器不支持 video 标签。
  376 + </video>
  377 + </div>
  378 + </div>
  379 +
  380 + <div class="video-item" id="section3-2">
  381 + <h3>检查车载设备情况</h3>
  382 + <p class="indent">如果车辆情况异常,点击车载设备,选择设备管理,看车载是否在线、发送线路ID是否正确,如果当前时间有班次,但是车载离线,</p>
  383 + <p>查找车载离线原因,是调整车辆了还是车载设备损坏。
  384 + <button onclick="playVideo('video4')">点击播放演示视频</button>
  385 + </p>
  386 + <div class="video-container">
  387 + <video id="video4" controls style="display: none;">
  388 + <source src="Videos/3-2检查车载设备情况.mp4" type="video/mp4">
  389 + 您的浏览器不支持 video 标签。
  390 + </video>
  391 + </div>
  392 + </div>
  393 +
  394 + <div class="video-item" id="section4-1">
  395 + <h2>配套说明</h2>
  396 + <h3>线路标签</h3>
  397 + <p class="indent">
  398 + 线调标签每条线路名旁有数字及字母标识,线路名称后第一个数字代表当前线路信息框内未处理信息数量,遵循人对人,机对机原则;定位信号自动判定的班次执行由系统自动处理,驾驶员手动发送的各种请求需主调做出响应。</p>
  399 + <p class="indent">线路名称后的第二个数字代表该线路对照当前时间应发而未发的班次数量,当班调度需及时查询未发原因并对该班次进行处理。</p>
  400 + <p class="indent">线路名称后的最后一项代表本线路的大间隔等级。
  401 + <button onclick="playVideo('video5')">点击播放演示视频</button>
  402 + </p>
  403 +
  404 + <div class="video-container">
  405 + <video id="video5" controls style="display: none;">
  406 + <source src="Videos/4-1配套说明-线路标签.mp4" type="video/mp4">
  407 + 您的浏览器不支持 video 标签。
  408 + </video>
  409 + </div>
  410 + </div>
  411 +
  412 + <div class="video-item" id="section4-2">
  413 + <h3>图例说明</h3>
  414 + <p class="indent">在班次执行界面主页有图例说明,点击线路上行或者下行首站名称旁的“?”图标。</p>
  415 + <p class="indent">图例说明分为三个模块,分别是班次执行状态、车载信息状态及RFID,其中RFID为各线路首末站点安装设备,会捕捉该站点发出或途经车辆班次,辅助计算,该系统只做显示,不做进一步说明。
  416 + <button onclick="playVideo('video6')">点击播放演示视频</button>
  417 + </p>
  418 +
  419 + <div class="video-container">
  420 + <video id="video6" controls style="display: none;">
  421 + <source src="Videos/4-2配套说明-图例说明.mp4" type="video/mp4">
  422 + 您的浏览器不支持 video 标签。
  423 + </video>
  424 + </div>
  425 + </div>
  426 +
  427 + <div class="video-item" id="section4-3">
  428 + <h3>班次显示方式</h3>
  429 + <p class="indent">
  430 + 在图例“?”后另有两个图标,点击眼睛形状图标,会改变班次显示界面(单元格加边框),用户根据自己使用习惯来改变显示方式,点击二维码形状图标,“实到”字段会改变形态(显示与“应到”时间的误差对比),用户可根据自己使用习惯改变显示方式。
  431 + <button onclick="playVideo('video7')">点击播放演示视频</button>
  432 + </p>
  433 + <div class="video-container">
  434 + <video id="video7" controls style="display: none;">
  435 + <source src="Videos/4-3配套说明-班次显示方式.mp4" type="video/mp4">
  436 + 您的浏览器不支持 video 标签。
  437 + </video>
  438 + </div>
  439 + </div>
  440 +
  441 + <div class="video-item" id="section5-1-1">
  442 + <h2>营运班次操作</h2>
  443 + <h3>待发调整</h3>
  444 + <p class="indent">
  445 + 先确认登陆模式,查询只需监控模式,如箭头所指区域为灰色,需要修改班次为主调模式,如箭头所指区域为蓝色。</p>
  446 + <p class="indent">待发调整,选中需要调整的班次,点击鼠标右键,选择“待发调整“,比较常用的场景为调整待发时间,一般是因为前后班次烂班等原因,需要调整发车间隔,如在本车前一班次未到达的情况下调整之后的班次待发时间,上一班次完成时,信使播报剩余班次、下一班次发车时间时将会直接提示调整后的待发时间,如在本车前一班次已到达的情况下调整后一班次的待发时间,因车载已收到下一班次发车时间提示,建议选择”指令重发“将新的待发时间发送到车载上。</p>
  447 + <p class="indent">待发调整的其他应用场景为班次站点相关调整,有”直放“场景,到终点站,中途站不停靠。选择班次,选择直放后,直接保存,有”放站“场景,放站为直放到某一站点后,开始正常营运载客,选择班次,选择”放站“,再选择开始正常营运的站点后,保存班次,另一种场景为”两点间空驶“,”两点间空驶”不必行驶在线路预设路径,但求高效到达目的地,请根据线路实际运营情况来进行各项干预调整。
  448 + <button onclick="playVideo('video8')">点击播放演示视频</button>
  449 + </p>
  450 +
  451 + <div class="video-container">
  452 + <video id="video8" controls style="display: none;">
  453 + <source src="Videos/5-1-1营运班次操作未-待发调整.mp4" type="video/mp4">
  454 + 您的浏览器不支持 video 标签。
  455 + </video>
  456 + </div>
  457 + </div>
  458 +
  459 + <div class="video-item" id="section5-1-2">
  460 + <h3>误点调整</h3>
  461 + <p class="indent">
  462 + 误点调整的应用场景为:因路阻等原因,前一列班次将无法按照计划时间到达,且无法预估到达时间。
  463 + </p>
  464 + <p class="indent">操作方式如下:选中对应班次,点击鼠标右键调出菜单,选择“误点调整”,在弹出的对话框中输入“误点停靠时间“,然后点击”确认调整“,该操作的含有是:不管前一班次何时到达,前一班次到达时间加上”误点停靠时间“,即为下一班次待发时间,该操作可改善因班次误点造成的待发调整不及时情况。
  465 + <button onclick="playVideo('video9')">点击播放演示视频</button>
  466 + </p>
  467 +
  468 + <div class="video-container">
  469 + <video id="video9" controls style="display: none;">
  470 + <source src="Videos/5-1-2营运班次操作未-误点调整.mp4" type="video/mp4">
  471 + 您的浏览器不支持 video 标签。
  472 + </video>
  473 + </div>
  474 + </div>
  475 +
  476 + <div class="video-item" id="section5-2">
  477 + <h3>实发调整</h3>
  478 + <p class="indent">
  479 + 一般情况下,系统会根据车载信号自动计算班次的到离站,如发生车载掉线等情况影响班次自动判定,则需要人工干预辅助调整,选中班次,点击鼠标右键调出菜单选择”实发调整“,根据实际发车情况填入实发时间,在“调整说明”项下拉菜单中选择调整原因,在备注框中输入调整说明后,点击“保存”。
  480 + </p>
  481 + <p class="indent">如因车辆调整停车位置等情况重复出入电子围栏,造成班次误报实发情况,或者人工干预后发现调整错误,可选择“撤销实发”,请根据线路班次实际情况调整班次。
  482 + <button onclick="playVideo('video10')">点击播放演示视频</button>
  483 + </p>
  484 +
  485 + <div class="video-container">
  486 + <video id="video10" controls style="display: none;">
  487 + <source src="Videos/5-2营运班次操作正-实发调整.mp4" type="video/mp4">
  488 + 您的浏览器不支持 video 标签。
  489 + </video>
  490 + </div>
  491 + </div>
  492 +
  493 + <div class="video-item" id="section5-3">
  494 + <h3>发车信息微调及撤销实发</h3>
  495 + <p class="indent">
  496 + 发车信息微调一般适用场景为:班次到达时间因车载掉线等原因未自动计算,可双击班次打开“发车信息微调”窗口,输入到达时间,在调整说明框中输入调整原因后保存。
  497 + </p>
  498 + <p class="indent">如遇操作错误、或者班次误报等情况,也可撤销,选中班次后右击调出菜单,选择“撤销执行”,在弹出确认窗口选择“确认撤销执行”。请根据实际情况调整班次。
  499 + <button onclick="playVideo('video11')">点击播放演示视频</button>
  500 + </p>
  501 +
  502 + <div class="video-container">
  503 + <video id="video11" controls style="display: none;">
  504 + <source src="Videos/5-3营运班次操作已-发车信息微调及撤销实发.mp4" type="video/mp4">
  505 + 您的浏览器不支持 video 标签。
  506 + </video>
  507 + </div>
  508 + </div>
  509 +
  510 +
  511 + <div class="video-item" id="section6">
  512 + <h2>烂班操作</h2>
  513 + <p class="indent">
  514 + 计划班次无法完成的情况会进行烂班操作,常见场景:车辆故障,导致之后的班次都无法执行,操作方式为:选中班次,点击鼠标右键调出菜单,选中“计划烂班”,在“计划烂班”窗口中选中需要烂班的班次,在“调整说明”下拉列表中选择烂班原因后,点击“保存”。</p>
  515 + <p class="indent">如操作失误、或者故障车辆修复后重新投入营运,也可对烂班班次进行“撤销烂班”操作,选中班次,点击鼠标右键调出菜单,选择“撤销烂班”,在弹出的确认窗口选择“确认撤销”。请根据线路实际情况调整班次。
  516 + <button onclick="playVideo('video12')">点击播放演示视频</button>
  517 + </p>
  518 +
  519 + <div class="video-container">
  520 + <video id="video12" controls style="display: none;">
  521 + <source src="Videos/6烂班操作.mp4" type="video/mp4">
  522 + 您的浏览器不支持 video 标签。
  523 + </video>
  524 + </div>
  525 + </div>
  526 +
  527 + <div class="video-item" id="section7">
  528 + <h2>临加班次</h2>
  529 + <p class="indent">
  530 + 临加班次为计划外班次,一般适用于临时性运营增能,或计划外进出场等情况,临加功能在原有的基础上经过优化,目前可以进行无计划添加,计调相关人员无需再对包车等无固定营运班次线路进行虚拟配车及预排班。
  531 + </p>
  532 + <p class="indent">在页面空白出点击鼠标右键,调出“新增临加班次”功能,点击鼠标左键你打开,在对应框中输入车辆、路牌,出发及到达时间、驾驶员、里程等信息。临加班次本身为计划外班次,无需添加全程后做子任务,根据实际行驶情况选择班次类型、班次首末站点,检查有无遗漏字段,填写完整后点击“保存”,参照上述步骤,添加下行进场班次,也可根据实际情况选择预设场景(往返、场到场),如临加班次车辆、人员、备注等信息编辑错误可与常规班次一样使用“发车信息微调”调整。
  533 + </p>
  534 + <p class="indent">如涉及站点、计划时间、路牌等字段错误,建议删除该临加班次后重新添加,选出对应的路牌,右击调出菜单后选择“临加/子任务”,选中需要删除的临加班次,点击鼠标右键后选择删除。请根据实际情况编辑临加班次。
  535 + <button onclick="playVideo('video13')">点击播放演示视频</button>
  536 + </p>
  537 +
  538 + <div class="video-container">
  539 + <video id="video13" controls style="display: none;">
  540 + <source src="Videos/7临加班次.mp4" type="video/mp4">
  541 + 您的浏览器不支持 video 标签。
  542 + </video>
  543 + </div>
  544 + </div>
  545 +
  546 + <div class="video-item" id="section8-1">
  547 + <h2>子任务操作</h2>
  548 + <h3>新增子任务</h3>
  549 + <p class="indent">
  550 + 子任务的作用是对未完全完成的班次,其营运里程做出明细解释,最常用的场景为:班次营运到中途车辆故障,不能完成剩余里程。
  551 + </p>
  552 + <p class="indent">一、首先将主任务调整为完成状态(该班次执行营运里程不为0,主任务就不做烂班),选中班次,右键调出菜单,选择“新增子任务”,子任务功能中已预设多种场景,该案例无需选择,直接自定义添加子任务明细,在弹出的子任务窗口默认页面中逐个加入,计划班次已完成部分(选择终点站为已执行完成到达的站点,输入营运公里数);二、点击“+”号开始添加第二个子任务,计划班次未完成部分(选择起始站为已执行完成到达的站点,勾选“是否烂班”,输入烂班公里数)。三、点击“+”号开始添加第三个子任务,因故障需进场维修的空驶公里(选择班次类型为进场,起点为班次完成站点,终点为维修停车场),输入空驶公里数,添加各子任务备注后点击保存。
  553 + </p>
  554 + <p class="indent">注意,营运+烂班的合计数需与计划里程数保持一致,否则影响公里数统计(空驶公里不在此列)。请按线路实际班次执行此操作。
  555 + <button onclick="playVideo('video14')">点击播放演示视频</button>
  556 + </p>
  557 +
  558 + <div class="video-container">
  559 + <video id="video14" controls style="display: none;">
  560 + <source src="Videos/8-1子任务操作-新增子任务.mp4" type="video/mp4">
  561 + 您的浏览器不支持 video 标签。
  562 + </video>
  563 + </div>
  564 + </div>
  565 +
  566 + <div class="video-item" id="section8-2">
  567 + <h3>修改与删除子任务</h3>
  568 + <p class="indent">
  569 + 班次计发时间旁有数字,表明该班次有子任务,光标悬浮数字旁,可预览子任务明细,选中班次,右键点击“临加/子任务”功能,可对已添加的子任务进行编辑修改,选择相应的子任务对其进行修正后保存。
  570 + </p>
  571 + <p class="indent">也可删除错误子任务后重新添加,删除部分子任务或者修改子任务公里数后会造成营运公里统计与计划不一致,在箭头所示位置会出现统计提示,请核对后修改。请根据实际情况修改子任务。
  572 + <button onclick="playVideo('video15')">点击播放演示视频</button>
  573 + </p>
  574 +
  575 + <div class="video-container">
  576 + <video id="video15" controls style="display: none;">
  577 + <source src="Videos/8-2子任务操作-修改与删除子任务.mp4" type="video/mp4">
  578 + 您的浏览器不支持 video 标签。
  579 + </video>
  580 + </div>
  581 + </div>
  582 +
  583 + <div class="video-item" id="section9">
  584 + <h2>调整人车和路牌对调</h2>
  585 + <p class="indent">
  586 + 一般遇到驾驶员临时请假,车辆突发故障等情况,需要调整班次驾驶员、调用备车执行班次、调用备车执行班次,会使用到该功能。</p>
  587 + <p class="indent">选中需要调整的路牌的任意班次,鼠标右键调出菜单选择”调整人车“,选择需要调整人车的具体班次(一般已执行的不修改),调整人员时输入工号后在下拉框中选择工号/姓名组合,否则会出现只更新工号,未更新姓名的情况,调整车辆时请仔细核对车号,避免误操作相似车号,影响其他公司/分公司线路车辆运营。
  588 + </p>
  589 + <p class="indent">如果是线路内部人员/车辆临时调整,可使用”路牌对调“功能,选中任意班次,鼠标右键调出菜单,选择”路牌对调“,在窗口两侧选择需要更换的2个路牌及对应班次。在窗口低端,根据实际情况,选择需要”只调人“,”只调车“或”调人并调车“。
  590 + <button onclick="playVideo('video16')">点击播放演示视频</button>
  591 + </p>
  592 +
  593 + <div class="video-container">
  594 + <video id="video16" controls style="display: none;">
  595 + <source src="Videos/9调整人车和路牌对调.mp4" type="video/mp4">
  596 + 您的浏览器不支持 video 标签。
  597 + </video>
  598 + </div>
  599 + </div>
  600 +
  601 + <div class="video-item" id="section10">
  602 + <h2>指令重发</h2>
  603 + <p class="indent">
  604 + 注意:所有修改或者与车辆交互都需要主调模式,此视频仅为操作演示。
  605 + </p>
  606 + <p class="indent">指令重发功能一般适用于两个场景:1.在前班次已执行完成状态下修改将发车班次的待发,需”指令重发“。2.将新的计划发车时间发送到车载,前后班次间有分班、长时间间隔甚至有分班换人安排,需要在分班后首个班次发车前重发计划时间到车载来提醒驾驶员。
  607 + <button onclick="playVideo('video17')">点击播放演示视频</button>
  608 + </p>
  609 +
  610 + <div class="video-container">
  611 + <video id="video17" controls style="display: none;">
  612 + <source src="Videos/10指令重发.mp4" type="video/mp4">
  613 + 您的浏览器不支持 video 标签。
  614 + </video>
  615 + </div>
  616 + </div>
  617 +
  618 + <div class="video-item" id="section11">
  619 + <h2>批量调整修改</h2>
  620 + <p class="indent">批量调整能够快速进行多个班次的待发调整、间隔调整和误点调整,如果需要对多个班次待发时间进行调整,可点击左侧序号列表,</p>
  621 + <p>选择多个班次,右键菜单选择待发调整功能,进入批量待发调整页面。</p>
  622 + <p class="indent">间隔调整,当多个班次间隔过大或过小时,可使用批量间隔调整对班次进行均衡优化。</p>
  623 + <p class="indent">误点调整是在本班车晚点之后,进行误点调整,当车辆到站后,如果有晚点情况,对下一班次的待发时间进行调整,如果没有就不</p>
  624 + <p>会调整;当遇到大规模堵车或者异常天气导致多个班次晚点时,可使用批量误点调整,对多个班次设置车辆进站后的停靠站时间。
  625 + <button onclick="playVideo('video18')">点击播放演示视频</button>
  626 + </p>
  627 +
  628 + <div class="video-container">
  629 + <video id="video18" controls style="display: none;">
  630 + <source src="Videos/11批量调整修改.mp4" type="video/mp4">
  631 + 您的浏览器不支持 video 标签。
  632 + </video>
  633 + </div>
  634 + </div>
  635 +
  636 + <div class="video-item" id="section12-1">
  637 + <h2>车载互动</h2>
  638 + <h3>发送消息</h3>
  639 + <p class="indent">消息短语分群发和单发两种模式,单发消息短语一般适用于:乘客遗失物品在车辆上,调度”到离站查询“缩小查找范围后向驾驶员确认。
  640 + </p>
  641 + <p>操作方式为在主页车辆列表中选择对应车号,鼠标右键调出菜单,选择”发送消息短语“,在对话框中输入需要向驾驶员发送的语句,请检查输入文字,确认无误后点击”发送“,群发消息短语一般适用于通知,范围选择可自定义,操作方式为在主页车辆列表中选择任意车号,鼠标右键调出菜单,选择”群发消息短语“,可选择授权的所有线路车辆,或部分线路(部分车辆),在对话框右侧文本框中输入需要发送的语句,请检查输入文字,确认无误后点击”发送“。
  642 + <button onclick="playVideo('video19')">点击播放演示视频</button>
  643 + </p>
  644 +
  645 + <div class="video-container">
  646 + <video id="video19" controls style="display: none;">
  647 + <source src="Videos/12-1车载互动-发送消息.mp4" type="video/mp4">
  648 + 您的浏览器不支持 video 标签。
  649 + </video>
  650 + </div>
  651 + </div>
  652 +
  653 +
  654 +
  655 + <div class="video-item" id="section12-2">
  656 + <h3>发送车载状态</h3>
  657 + <p class="indent">当查看车辆状态有问题时使用发送车载状态对车辆运营方向进行改变,可以将车辆运营状态切换为上行非营运、下行非营运、上行</p>
  658 + <p>营运、下行营运。
  659 + <button onclick="playVideo('video20')">点击播放演示视频</button>
  660 + </p>
  661 + <div class="video-container">
  662 + <video id="video20" controls style="display: none;">
  663 + <source src="Videos/12-2车载互动-发送车载状态.mp4" type="video/mp4">
  664 + 您的浏览器不支持 video 标签。
  665 + </video>
  666 + </div>
  667 + </div>
  668 +
  669 +
  670 +
  671 + <div class="video-item" id="section13">
  672 + <h2>核对当日营运数据</h2>
  673 + <p class="indent">在线路调度中右上侧点击报表管理,选择其中的行车路单,选择查询,可查看特定人员的行车路单,退出点击右上角的叉号;仍在</p>
  674 + <p>报表管理中选择统计日报,可以查看线路的统计日报;在报表管理下选择调度日报,可查看特定线路当日调度日报;
  675 + <button onclick="playVideo('video21')">点击播放演示视频</button>
  676 + </p>
  677 + <div class="video-container">
  678 + <video id="video21" controls style="display: none;">
  679 + <source src="Videos/13核对当日营运数据.mp4" type="video/mp4">
  680 + 您的浏览器不支持 video 标签。
  681 + </video>
  682 + </div>
  683 + </div>
  684 +
  685 + <div class="video-item" id="section14">
  686 + <h2>退出线调</h2>
  687 + <p class="indent">全部检查无误后,点击右上角退出线调,再点击右上角图形标记,点击注销登录,即可退出线调系统。
  688 + <button onclick="playVideo('video22')">点击播放演示视频</button>
  689 + </p>
  690 + <div class="video-container">
  691 + <video id="video22" controls style="display: none;">
  692 + <source src="Videos/14退出线调.mp4" type="video/mp4">
  693 + 您的浏览器不支持 video 标签。
  694 + </video>
  695 + </div>
  696 + </div>
  697 + </div>
  698 +</div>
  699 +
  700 +<script>
  701 + function playVideo(videoId) {
  702 + var video = document.getElementById(videoId);
  703 + if (video.style.display === 'none') {
  704 + video.style.display = 'block';
  705 + video.play();
  706 + } else {
  707 + video.pause();
  708 + video.style.display = 'none';
  709 + }
  710 + }
  711 + (function(){
  712 + $('.submenu-title').on('click', function() {
  713 + var display = $(this).next().css('display');
  714 + $(this).next().css('display', display === 'none' ? 'block' : 'none');
  715 +
  716 + return false;
  717 + })
  718 +
  719 + $('.nav-item').on('click', function() {
  720 + var target = $($(this).attr('href'));
  721 + $('html, body').animate({scrollTop: target.offset().top - 100}, 1000);
  722 +
  723 + return false;
  724 + })
  725 + })();
726 </script> 726 </script>
727 \ No newline at end of file 727 \ No newline at end of file