Commit d9a30fd7d18aee737ddf5b0871fa84baf1dede7f
1 parent
8e5d540b
1.
Showing
11 changed files
with
2240 additions
and
2224 deletions
Too many changes to show.
To preserve performance only 11 of 14 files are displayed.
pom.xml
| @@ -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<Budget, Integer> implemen | @@ -3185,7 +3185,7 @@ public class BudgetServiceImpl extends BaseServiceImpl<Budget, Integer> 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<Budget, Integer> implemen | @@ -3242,7 +3242,7 @@ public class BudgetServiceImpl extends BaseServiceImpl<Budget, Integer> 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> 基础数据 | ||
| 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> 车载设备 | ||
| 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> 基础数据 | ||
| 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> 车载设备 | ||
| 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 |