Commit e7c4fc40655715c382a399cc3d7e9c4bd92afc93
Merge branch 'jiading' of http://192.168.168.201:8888/panzhaov5/bsth_control.git into jiading
Showing
68 changed files
with
12503 additions
and
3 deletions
src/main/java/com/bsth/WebAppConfiguration.java
| @@ -73,7 +73,7 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS | @@ -73,7 +73,7 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS | ||
| 73 | @Override | 73 | @Override |
| 74 | public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { | 74 | public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { |
| 75 | //线调webSocket | 75 | //线调webSocket |
| 76 | - registry.addHandler(new RealControlSocketHandler(), "/sockjs/realcontrol").addInterceptors(new WebSocketHandshakeInterceptor()) | 76 | + registry.addHandler(new RealControlSocketHandler(), "/sockjs/realcontrol","/freeLogin/sockjs/realcontrol").addInterceptors(new WebSocketHandshakeInterceptor()) |
| 77 | .withSockJS(); | 77 | .withSockJS(); |
| 78 | } | 78 | } |
| 79 | 79 |
src/main/java/com/bsth/common/Constants.java
| @@ -20,6 +20,10 @@ public class Constants { | @@ -20,6 +20,10 @@ public class Constants { | ||
| 20 | public static final String METRONIC_URL = "/metronic_v4.5.4/**"; | 20 | public static final String METRONIC_URL = "/metronic_v4.5.4/**"; |
| 21 | public static final String LOGIN_FAILURE = "/user/loginFailure"; | 21 | public static final String LOGIN_FAILURE = "/user/loginFailure"; |
| 22 | public static final String CAPTCHA = "/captcha.jpg"; | 22 | public static final String CAPTCHA = "/captcha.jpg"; |
| 23 | + //免登录白名单 | ||
| 24 | + public static final String XD_PAGE = "/pages/control/lineallot_v3/**"; | ||
| 25 | + public static final String FREE_URL="/freeLogin/**"; | ||
| 26 | + public static final String FREE_XD_CHILD_PAGES = "/real_control_v3/**"; | ||
| 23 | 27 | ||
| 24 | //对外的营运数据接口 | 28 | //对外的营运数据接口 |
| 25 | public static final String SERVICE_INTERFACE = "/companyService/**"; | 29 | public static final String SERVICE_INTERFACE = "/companyService/**"; |
src/main/java/com/bsth/controller/realcontrol/FreeLoginController.java
0 → 100644
| 1 | +package com.bsth.controller.realcontrol; | ||
| 2 | + | ||
| 3 | +import com.bsth.data.BasicData; | ||
| 4 | +import com.bsth.data.Station2ParkBuffer; | ||
| 5 | +import com.bsth.data.gpsdata_v2.GpsRealData; | ||
| 6 | +import com.bsth.data.gpsdata_v2.entity.GpsEntity; | ||
| 7 | +import com.bsth.data.gpsdata_v2.handlers.overspeed.GpsOverspeed; | ||
| 8 | +import com.bsth.data.gpsdata_v2.handlers.overspeed.OverspeedProcess; | ||
| 9 | +import com.bsth.data.pinyin.PersionPinYin; | ||
| 10 | +import com.bsth.data.pinyin.PersionPinYinBuffer; | ||
| 11 | +import com.bsth.entity.Line; | ||
| 12 | +import com.bsth.entity.LineInformation; | ||
| 13 | +import com.bsth.entity.realcontrol.ScheduleRealInfo; | ||
| 14 | +import com.bsth.entity.realcontrol.StationToPark; | ||
| 15 | +import com.bsth.entity.sys.*; | ||
| 16 | +import com.bsth.repository.LineRepository; | ||
| 17 | +import com.bsth.repository.sys.SysUserRepository; | ||
| 18 | +import com.bsth.service.BusinessService; | ||
| 19 | +import com.bsth.service.LineInformationService; | ||
| 20 | +import com.bsth.service.LineService; | ||
| 21 | +import com.bsth.service.StationRouteService; | ||
| 22 | +import com.bsth.service.gps.GpsService; | ||
| 23 | +import com.bsth.service.realcontrol.LineConfigService; | ||
| 24 | +import com.bsth.service.realcontrol.RealMapService; | ||
| 25 | +import com.bsth.service.realcontrol.ScheduleRealInfoService; | ||
| 26 | +import com.bsth.service.sys.CompanyAuthorityService; | ||
| 27 | +import com.bsth.service.sys.DutyEmployeeService; | ||
| 28 | +import com.google.common.base.Splitter; | ||
| 29 | +import com.google.common.collect.ArrayListMultimap; | ||
| 30 | +import com.google.common.collect.BiMap; | ||
| 31 | +//import org.slf4j.Logger; | ||
| 32 | +//import org.slf4j.LoggerFactory; | ||
| 33 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 34 | +import org.springframework.web.bind.annotation.*; | ||
| 35 | +import org.springframework.web.servlet.ModelAndView; | ||
| 36 | + | ||
| 37 | +import javax.servlet.http.HttpServletResponse; | ||
| 38 | +import java.util.*; | ||
| 39 | + | ||
| 40 | +/** | ||
| 41 | + * Created by zhangxianzhou on 2019/5/14. | ||
| 42 | + * describe 用户免登录的线调页面 | ||
| 43 | + */ | ||
| 44 | +@RestController | ||
| 45 | +@RequestMapping("/freeLogin") | ||
| 46 | +public class FreeLoginController { | ||
| 47 | + //Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
| 48 | + @Autowired | ||
| 49 | + LineService lineService; | ||
| 50 | + @Autowired | ||
| 51 | + GpsRealData gpsRealData; | ||
| 52 | + | ||
| 53 | + @Autowired | ||
| 54 | + GpsService gpsService; | ||
| 55 | + | ||
| 56 | + @Autowired | ||
| 57 | + LineInformationService lineInformationService; | ||
| 58 | + | ||
| 59 | + @Autowired | ||
| 60 | + BusinessService businessService; | ||
| 61 | + @Autowired | ||
| 62 | + LineRepository lineRepository; | ||
| 63 | + @Autowired | ||
| 64 | + RealMapService realMapService; | ||
| 65 | + @Autowired | ||
| 66 | + LineConfigService lineConfigService; | ||
| 67 | + @Autowired | ||
| 68 | + StationRouteService stationRouteService; | ||
| 69 | + | ||
| 70 | + @Autowired | ||
| 71 | + PersionPinYinBuffer persionPinYinBuffer; | ||
| 72 | + | ||
| 73 | + @Autowired | ||
| 74 | + OverspeedProcess overspeedProcess; | ||
| 75 | + | ||
| 76 | + @Autowired | ||
| 77 | + ScheduleRealInfoService scheduleRealInfoService; | ||
| 78 | + | ||
| 79 | + /** | ||
| 80 | + * @return 免登录主页 | ||
| 81 | + */ | ||
| 82 | + @RequestMapping("/real_control/v2") | ||
| 83 | + public ModelAndView v2() { | ||
| 84 | + ModelAndView mv = new ModelAndView(); | ||
| 85 | + //免登录线调主页 | ||
| 86 | + mv.setViewName("/real_control_v3/main.html"); | ||
| 87 | + return mv; | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + /** | ||
| 91 | + * @param map 筛选条件 | ||
| 92 | + * @return 所有线路信息 | ||
| 93 | + */ | ||
| 94 | + @RequestMapping("/line/all") | ||
| 95 | + public Iterable list(@RequestParam Map<String, Object> map) { | ||
| 96 | + return lineService.list(map); | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + /** | ||
| 100 | + * @param codeArray 线路数组 | ||
| 101 | + * @return 检查线路 | ||
| 102 | + */ | ||
| 103 | + @RequestMapping("/lineConfig/check") | ||
| 104 | + public Map<String, Object> check(@RequestParam String[] codeArray) { | ||
| 105 | + return lineConfigService.check(codeArray); | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + /** | ||
| 109 | + * 初始化线路配置 | ||
| 110 | + * | ||
| 111 | + * @param lineCode 线路code | ||
| 112 | + * @return 1 | ||
| 113 | + */ | ||
| 114 | + @RequestMapping("/lineConfig/init/{lineCode}") | ||
| 115 | + public Integer init(@PathVariable("lineCode") String lineCode) throws Exception { | ||
| 116 | + return lineConfigService.init(lineCode); | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + /** | ||
| 120 | + * @return 线路权限 | ||
| 121 | + */ | ||
| 122 | + @RequestMapping("/realControAuthority/findByCurrentUser") | ||
| 123 | + public RealControAuthority findByCurrentUser() { | ||
| 124 | + List<Line> lines = lineRepository.findAllService(); | ||
| 125 | + StringBuffer sb = new StringBuffer(); | ||
| 126 | + if (!lines.isEmpty()) { | ||
| 127 | + for (int i = 0; i < lines.size(); i++) { | ||
| 128 | + if (i < lines.size() - 1) { | ||
| 129 | + sb.append(lines.get(i).getId()); | ||
| 130 | + sb.append(","); | ||
| 131 | + } else { | ||
| 132 | + sb.append(lines.get(i).getId()); | ||
| 133 | + } | ||
| 134 | + } | ||
| 135 | + } | ||
| 136 | + RealControAuthority realControAuthority = new RealControAuthority(); | ||
| 137 | + realControAuthority.setExcludeMenus(""); | ||
| 138 | + realControAuthority.setLineCodeStr(sb.toString()); | ||
| 139 | + realControAuthority.setUserId(1); | ||
| 140 | + realControAuthority.setPattern(1); | ||
| 141 | + return realControAuthority; | ||
| 142 | + } | ||
| 143 | + | ||
| 144 | + /** | ||
| 145 | + * @param map 筛选条件 | ||
| 146 | + * @return 企业信息 | ||
| 147 | + */ | ||
| 148 | + @RequestMapping("/business/all") | ||
| 149 | + public Iterable bussinessList(@RequestParam Map<String, Object> map) { | ||
| 150 | + return businessService.list(map); | ||
| 151 | + } | ||
| 152 | + | ||
| 153 | + /** | ||
| 154 | + * @param idx 线路id | ||
| 155 | + * @return 线路路由 | ||
| 156 | + */ | ||
| 157 | + @RequestMapping("/realMap/findRouteByLine") | ||
| 158 | + public Map<String, Object> findRouteByLine(@RequestParam String idx) { | ||
| 159 | + return realMapService.findRouteByLine(idx); | ||
| 160 | + } | ||
| 161 | + | ||
| 162 | + /** | ||
| 163 | + * 停车场 | ||
| 164 | + * | ||
| 165 | + * @return 停车场 | ||
| 166 | + */ | ||
| 167 | + @RequestMapping(value = "/realMap/carParkSpatialData") | ||
| 168 | + public Map<String, Object> carParkSpatialData() { | ||
| 169 | + return realMapService.carParkSpatialData(); | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + /** | ||
| 173 | + * 获取多个线路的路段信息(为前端越界计算提供数据) | ||
| 174 | + * | ||
| 175 | + * @param codeIdx 线路id | ||
| 176 | + * @return 线路的路段信息 | ||
| 177 | + */ | ||
| 178 | + @RequestMapping(value = "/realMap/multiSectionRoute") | ||
| 179 | + public Map<String, Object> multiSectionRoute(@RequestParam String codeIdx) { | ||
| 180 | + return realMapService.multiSectionRoute(codeIdx); | ||
| 181 | + } | ||
| 182 | + | ||
| 183 | + /** | ||
| 184 | + * 根据线路获取站点路由及空间数据 | ||
| 185 | + */ | ||
| 186 | + @RequestMapping(value = "/realMap/stationSpatialData") | ||
| 187 | + public Map<String, Object> stationSpatialData(@RequestParam String idx) { | ||
| 188 | + return realMapService.stationSpatialData(idx); | ||
| 189 | + } | ||
| 190 | + | ||
| 191 | + | ||
| 192 | + /** | ||
| 193 | + * @param lineIds 线路id | ||
| 194 | + * @return 多线路路由查询 | ||
| 195 | + */ | ||
| 196 | + @RequestMapping(value = "/stationroute/multiLine", method = RequestMethod.GET) | ||
| 197 | + public Map<String, Object> findByMultiLine(@RequestParam String lineIds) { | ||
| 198 | + return stationRouteService.findByMultiLine(lineIds); | ||
| 199 | + } | ||
| 200 | + | ||
| 201 | + /** | ||
| 202 | + * @return 线路编码和名称对照 | ||
| 203 | + */ | ||
| 204 | + @RequestMapping("/basic/lineCode2Name") | ||
| 205 | + public Map<String, String> findLineCodeMap() { | ||
| 206 | + return BasicData.lineCode2NameMap; | ||
| 207 | + } | ||
| 208 | + | ||
| 209 | + /** | ||
| 210 | + * @param idx 线路id | ||
| 211 | + * @return 场到站 | ||
| 212 | + */ | ||
| 213 | + @RequestMapping("/basic/station2ParkData") | ||
| 214 | + public Map<String, Collection<StationToPark>> findStation2ParkData(@RequestParam String idx) { | ||
| 215 | + List<String> lines = Splitter.on(",").splitToList(idx); | ||
| 216 | + ArrayListMultimap<String, StationToPark> rs = ArrayListMultimap.create(); | ||
| 217 | + | ||
| 218 | + for (String lineCode : lines) { | ||
| 219 | + rs.putAll(lineCode, Station2ParkBuffer.get(lineCode)); | ||
| 220 | + } | ||
| 221 | + return rs.asMap(); | ||
| 222 | + } | ||
| 223 | + | ||
| 224 | + /** | ||
| 225 | + * @return 设备号和车辆自编号 (K: 设备编码 ,V:车辆自编号) | ||
| 226 | + */ | ||
| 227 | + @RequestMapping("/basic/nbbm2deviceId") | ||
| 228 | + public Map<String, String> nbbm2deviceId() { | ||
| 229 | + return BasicData.deviceId2NbbmMap.inverse(); | ||
| 230 | + } | ||
| 231 | + | ||
| 232 | + /** | ||
| 233 | + * @return 人员拼音数据映射缓存 | ||
| 234 | + */ | ||
| 235 | + @RequestMapping(value = "/basic/all_personnel_py", method = RequestMethod.GET) | ||
| 236 | + public List<PersionPinYin> findAll_PY() { | ||
| 237 | + return persionPinYinBuffer.getAll(); | ||
| 238 | + } | ||
| 239 | + | ||
| 240 | + /** | ||
| 241 | + * @return 车辆 | ||
| 242 | + */ | ||
| 243 | + @RequestMapping("/basic/cars") | ||
| 244 | + public Iterable<String> findAllNbbm() { | ||
| 245 | + return BasicData.deviceId2NbbmMap.values(); | ||
| 246 | + } | ||
| 247 | + | ||
| 248 | + /** | ||
| 249 | + * 车辆自编号和车牌号对照 | ||
| 250 | + * | ||
| 251 | + * @return 车辆自编号和车牌号对照 | ||
| 252 | + */ | ||
| 253 | + @RequestMapping("/basic/nbbm2PlateNo") | ||
| 254 | + public Map<String, String> nbbm2PlateNo() { | ||
| 255 | + return BasicData.nbbmCompanyPlateMap; | ||
| 256 | + } | ||
| 257 | + | ||
| 258 | + /** | ||
| 259 | + * 获取车辆信息 | ||
| 260 | + * | ||
| 261 | + * @param idx 线路id | ||
| 262 | + * @return 获取车辆信息 | ||
| 263 | + */ | ||
| 264 | + @RequestMapping("/basic/ccInfo/lineArray") | ||
| 265 | + public List<Map<String, String>> ccInfoByLine(@RequestParam String idx) { | ||
| 266 | + List<String> liness = Splitter.on(",").splitToList(idx); | ||
| 267 | + List<Map<String, String>> rs = new ArrayList<>(); | ||
| 268 | + Set<String> ks = BasicData.nbbm2LineMap.keySet(); | ||
| 269 | + Map<String, String> map; | ||
| 270 | + BiMap<String, String> nbbm2deviceMap = BasicData.deviceId2NbbmMap.inverse(); | ||
| 271 | + Line line; | ||
| 272 | + for (String nbbm : ks) { | ||
| 273 | + line = BasicData.nbbm2LineMap.get(nbbm); | ||
| 274 | + if (liness.contains(line.getLineCode())) { | ||
| 275 | + map = new HashMap<>(); | ||
| 276 | + map.put("nbbm", nbbm); | ||
| 277 | + map.put("lineName", line.getName()); | ||
| 278 | + map.put("deviceId", nbbm2deviceMap.get(nbbm)); | ||
| 279 | + map.put("lineCode", line.getLineCode()); | ||
| 280 | + rs.add(map); | ||
| 281 | + } | ||
| 282 | + } | ||
| 283 | + return rs; | ||
| 284 | + } | ||
| 285 | + | ||
| 286 | + /** | ||
| 287 | + * @param lineCodes 线路编码 | ||
| 288 | + * @return 多条线路信息 | ||
| 289 | + */ | ||
| 290 | + @RequestMapping("/lineInformation/line/multi") | ||
| 291 | + public List<LineInformation> findByLine(@RequestParam String lineCodes) { | ||
| 292 | + return lineInformationService.findByLine(lineCodes); | ||
| 293 | + } | ||
| 294 | + | ||
| 295 | + /** | ||
| 296 | + * 主页SVG模拟图 | ||
| 297 | + * | ||
| 298 | + * @param idx 线路id | ||
| 299 | + * @return 主页SVG模拟图 | ||
| 300 | + */ | ||
| 301 | + @RequestMapping(value = "/realSchedule/svgAttr", method = RequestMethod.GET) | ||
| 302 | + public Map<String, Object> findSvgAttr(@RequestParam String idx) { | ||
| 303 | + return scheduleRealInfoService.findSvgAttr(idx); | ||
| 304 | + } | ||
| 305 | + | ||
| 306 | + /** | ||
| 307 | + * 获取班次 | ||
| 308 | + * | ||
| 309 | + * @param lines 线路id | ||
| 310 | + * @return 获取班次 | ||
| 311 | + */ | ||
| 312 | + @RequestMapping(value = "/realSchedule/lines") | ||
| 313 | + public Map<String, Collection<ScheduleRealInfo>> findByLines(@RequestParam String lines) { | ||
| 314 | + return scheduleRealInfoService.findByLines(lines); | ||
| 315 | + } | ||
| 316 | + | ||
| 317 | + /** | ||
| 318 | + * 线路编码获取GPS集合 | ||
| 319 | + * | ||
| 320 | + * @param lineCode 线路编码 | ||
| 321 | + * @return 线路编码获取GPS集合 | ||
| 322 | + */ | ||
| 323 | + @RequestMapping(value = "/gps/real/line/{lineCode}") | ||
| 324 | + public List<GpsEntity> findByLineCode(@PathVariable("lineCode") String lineCode) { | ||
| 325 | + return gpsRealData.getByLine(lineCode); | ||
| 326 | + } | ||
| 327 | + | ||
| 328 | + /** | ||
| 329 | + * @param lineCodes 线路编码 | ||
| 330 | + * @return 实时gps 超速信息 | ||
| 331 | + */ | ||
| 332 | + @RequestMapping(value = "/gps/real/line") | ||
| 333 | + public Map<String, Object> findByLineCodes(@RequestParam String lineCodes) { | ||
| 334 | + Map<String, Object> rs = new HashMap(); | ||
| 335 | + List<String> lineArray = Splitter.on(",").splitToList(lineCodes); | ||
| 336 | + //超速信息 | ||
| 337 | + List<GpsOverspeed> overspeedList = overspeedProcess.findByLines(lineArray); | ||
| 338 | + //实时gps | ||
| 339 | + List<GpsEntity> gpsList = gpsRealData.get(lineArray); | ||
| 340 | + rs.put("gpsList", gpsList); | ||
| 341 | + rs.put("overspeedList", overspeedList); | ||
| 342 | + return rs; | ||
| 343 | + } | ||
| 344 | + | ||
| 345 | + /** | ||
| 346 | + * 历史GPS查询 ,第三版轨迹回放用 | ||
| 347 | + * | ||
| 348 | + * @param nbbm 车辆编号 | ||
| 349 | + * @param st 开始时间 | ||
| 350 | + * @param et 结束时间 | ||
| 351 | + * @return 历史GPS查询 | ||
| 352 | + */ | ||
| 353 | + @RequestMapping(value = "/gps/history_v3/{nbbm}") | ||
| 354 | + public Map<String, Object> history_v3(@PathVariable("nbbm") String nbbm, @RequestParam long st, @RequestParam long et) { | ||
| 355 | + return gpsService.history_v3(nbbm, st, et); | ||
| 356 | + } | ||
| 357 | + | ||
| 358 | + /** | ||
| 359 | + * 轨迹导出 | ||
| 360 | + * | ||
| 361 | + * @param nbbm 车辆编号 | ||
| 362 | + * @param st 开始时间 | ||
| 363 | + * @param et 结束时间 | ||
| 364 | + */ | ||
| 365 | + @RequestMapping(value = "/gps/history_v3/excel/{nbbm}") | ||
| 366 | + public void trailExcel(@PathVariable("nbbm") String nbbm, @RequestParam long st, @RequestParam long et, HttpServletResponse resp) { | ||
| 367 | + gpsService.trailExcel(nbbm, st, et, resp); | ||
| 368 | + } | ||
| 369 | + | ||
| 370 | + /** | ||
| 371 | + * 轨迹异常数据导出 | ||
| 372 | + * | ||
| 373 | + * @param nbbm 车辆编号 | ||
| 374 | + * @param st 开始时间 | ||
| 375 | + * @param et 结束时间 | ||
| 376 | + */ | ||
| 377 | + @RequestMapping(value = "/gps/history_v3/excel_abnormal/{nbbm}") | ||
| 378 | + public void abnormalExcel(@PathVariable("nbbm") String nbbm, @RequestParam long st, @RequestParam long et, HttpServletResponse resp) { | ||
| 379 | + gpsService.abnormalExcel(nbbm, st, et, resp); | ||
| 380 | + } | ||
| 381 | + | ||
| 382 | + /** | ||
| 383 | + * 获取线路下所有车辆,包括实时设备 和 计划排班 | ||
| 384 | + * | ||
| 385 | + * @param lineCode 线路编码 | ||
| 386 | + * @return 获取线路下所有车辆,包括实时设备 和 计划排班 | ||
| 387 | + */ | ||
| 388 | + @RequestMapping(value = "/gps/allCarsByLine", method = RequestMethod.GET) | ||
| 389 | + public Map<String, Object> allCarsByLine(String lineCode) { | ||
| 390 | + return gpsService.allCarsByLine(lineCode); | ||
| 391 | + } | ||
| 392 | +} |
src/main/java/com/bsth/filter/BaseFilter.java
| @@ -17,7 +17,7 @@ public abstract class BaseFilter implements Filter { | @@ -17,7 +17,7 @@ public abstract class BaseFilter implements Filter { | ||
| 17 | * 白名单 | 17 | * 白名单 |
| 18 | */ | 18 | */ |
| 19 | private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA, Constants.SERVICE_INTERFACE, | 19 | private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA, Constants.SERVICE_INTERFACE, |
| 20 | - Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.XD_REAL_GPS, Constants.UP_RFID_URL, Constants.STATION_AND_SECTION_COUNT }; | 20 | + Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.XD_REAL_GPS, Constants.UP_RFID_URL, Constants.STATION_AND_SECTION_COUNT,Constants.XD_PAGE,Constants.FREE_URL,Constants.FREE_XD_CHILD_PAGES }; |
| 21 | 21 | ||
| 22 | @Override | 22 | @Override |
| 23 | public void destroy() { | 23 | public void destroy() { |
src/main/java/com/bsth/security/filter/LoginInterceptor.java
| @@ -33,7 +33,7 @@ public class LoginInterceptor implements Filter { | @@ -33,7 +33,7 @@ public class LoginInterceptor implements Filter { | ||
| 33 | * 相比于 BaseFilter,此处对线调GPS请求进行了拦截验证 | 33 | * 相比于 BaseFilter,此处对线调GPS请求进行了拦截验证 |
| 34 | */ | 34 | */ |
| 35 | private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA, Constants.SERVICE_INTERFACE, | 35 | private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA, Constants.SERVICE_INTERFACE, |
| 36 | - Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.UP_RFID_URL,Constants.STATION_AND_SECTION_COUNT }; | 36 | + Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.UP_RFID_URL,Constants.STATION_AND_SECTION_COUNT,Constants.XD_PAGE,Constants.FREE_URL,Constants.FREE_XD_CHILD_PAGES }; |
| 37 | 37 | ||
| 38 | 38 | ||
| 39 | @Override | 39 | @Override |
src/main/resources/static/pages/control/lineallot_v3/iframe_wrap.html
0 → 100644
| 1 | +<!-- 线路选择 --> | ||
| 2 | +<!DOCTYPE html> | ||
| 3 | +<html lang="zh"> | ||
| 4 | +<head> | ||
| 5 | + <meta name="renderer" content="webkit" /> | ||
| 6 | + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> | ||
| 7 | + <meta charset="UTF-8"> | ||
| 8 | + <title>调度系统</title> | ||
| 9 | + | ||
| 10 | + <meta http-equiv="Pragma" content="no-cache"> | ||
| 11 | + <meta http-equiv="Cache-control" content="no-cache"> | ||
| 12 | + <meta http-equiv="Cache" content="no-cache"> | ||
| 13 | + | ||
| 14 | + <!-- Font Awesome 图标字体 --> | ||
| 15 | + <link | ||
| 16 | + href="/metronic_v4.5.4/plugins/font-awesome/css/font-awesome.min.css" | ||
| 17 | + rel="stylesheet" type="text/css" /> | ||
| 18 | + <!-- Bootstrap style --> | ||
| 19 | + <link href="/metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css" | ||
| 20 | + rel="stylesheet" type="text/css" /> | ||
| 21 | + <!-- jsTree 数插件 --> | ||
| 22 | + <link | ||
| 23 | + href="/metronic_v4.5.4/plugins/jstree/dist/themes/default/style.min.css" | ||
| 24 | + rel="stylesheet" type="text/css" /> | ||
| 25 | + <!-- MULTI-select 多选下拉框美化 --> | ||
| 26 | + <link | ||
| 27 | + href="/metronic_v4.5.4/plugins/jquery-multi-select/css/multi-select.css" | ||
| 28 | + rel="stylesheet" type="text/css" /> | ||
| 29 | + | ||
| 30 | + <!-- editable --> | ||
| 31 | + <link | ||
| 32 | + href="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/css/bootstrap-editable.css" | ||
| 33 | + rel="stylesheet" type="text/css" /> | ||
| 34 | + <!-- METRONIC style --> | ||
| 35 | + <link href="/metronic_v4.5.4/layout4/css/themes/light.min.css" | ||
| 36 | + rel="stylesheet" type="text/css" id="style_color" /> | ||
| 37 | + <link href="/metronic_v4.5.4/css/components.css" rel="stylesheet" | ||
| 38 | + type="text/css" /> | ||
| 39 | + <link href="/metronic_v4.5.4/css/plugins.css" rel="stylesheet" | ||
| 40 | + type="text/css" /> | ||
| 41 | + <link href="/metronic_v4.5.4/layout4/css/layout.min.css" | ||
| 42 | + rel="stylesheet" type="text/css" /> | ||
| 43 | + <link href="/metronic_v4.5.4/layout4/css/custom.min.css" | ||
| 44 | + rel="stylesheet" type="text/css" /> | ||
| 45 | + <!-- select2 下拉框插件 --> | ||
| 46 | + <link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css" | ||
| 47 | + rel="stylesheet" type="text/css" /> | ||
| 48 | + <link | ||
| 49 | + href="/metronic_v4.5.4/plugins/select2/css/select2-bootstrap.min.css" | ||
| 50 | + rel="stylesheet" type="text/css" /> | ||
| 51 | + <!-- layer 弹层 插件 --> | ||
| 52 | + <link href="/assets/plugins/layer-v2.4/layer/skin/layer.css" | ||
| 53 | + rel="stylesheet" type="text/css" /> | ||
| 54 | + <!-- fileinput 上传 插件 --> | ||
| 55 | + <link href="/assets/plugins/fileinput/css/fileinput.min.css" | ||
| 56 | + rel="stylesheet" type="text/css" /> | ||
| 57 | + <!-- iCheck 单选框和复选框 --> | ||
| 58 | + <link href="/metronic_v4.5.4/plugins/icheck/skins/all.css" | ||
| 59 | + rel="stylesheet" type="text/css" /> | ||
| 60 | + <!-- 日期控件 --> | ||
| 61 | + <link | ||
| 62 | + href="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/css/bootstrap-datetimepicker.min.css" | ||
| 63 | + rel="stylesheet" type="text/css" /> | ||
| 64 | + <!-- table 表格控件 --> | ||
| 65 | + <!--<link rel="stylesheet"--> | ||
| 66 | + <!--href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css"--> | ||
| 67 | + <!--type="text/css" />--> | ||
| 68 | + <link href="/metronic_v4.5.4/plugins/bootstrap-tagsinput/bootstrap-tagsinput.css" rel="stylesheet" type="text/css"/> | ||
| 69 | + <!-- handsontable样式 --> | ||
| 70 | + <link rel="stylesheet" | ||
| 71 | + href="/assets/bower_components/handsontable/dist/handsontable.full.css" /> | ||
| 72 | + <!-- sweetalert样式 --> | ||
| 73 | + <link rel="stylesheet" | ||
| 74 | + href="/assets/bower_components/sweetalert/dist/sweetalert.css" /> | ||
| 75 | + <!-- schedule计划调度AngularJS模块主css --> | ||
| 76 | + <link rel="stylesheet" href="/pages/control/lineallot_v3/scheduleApp/module/common/main.css" | ||
| 77 | + type="text/css" /> | ||
| 78 | + <link rel="stylesheet" href="/real_control_v3/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" merge="plugins"/> | ||
| 79 | + | ||
| 80 | + <!-- CSS动画 --> | ||
| 81 | + <link | ||
| 82 | + href="/metronic_v4.5.4/plugins/tipso/css/animate.css" | ||
| 83 | + rel="stylesheet" type="text/css" /> | ||
| 84 | + | ||
| 85 | + <!-- 提示工具样式 --> | ||
| 86 | + <link | ||
| 87 | + href="/metronic_v4.5.4/plugins/tipso/css/tipso.css" | ||
| 88 | + rel="stylesheet" type="text/css" /> | ||
| 89 | + | ||
| 90 | + <style type="text/css"> | ||
| 91 | + .searchForm { | ||
| 92 | + | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + .searchForm .form-group .control-label { | ||
| 96 | + padding-right: 0px; | ||
| 97 | + text-align: right; | ||
| 98 | + margin-top: 7px; | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + .searchForm .form-group>div { | ||
| 102 | + padding-left: 10px; | ||
| 103 | + padding-right: 0px; | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + .searchForm .row>div { | ||
| 107 | + padding-left: 0px; | ||
| 108 | + padding-right: 0px; | ||
| 109 | + padding: 5px 0 5px 0; | ||
| 110 | + width: 270px; | ||
| 111 | + display: inline-block; | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + .searchForm .form-actions { | ||
| 115 | + | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + tr.row-active td { | ||
| 119 | + border-bottom: 1px solid blue !important; | ||
| 120 | + color: blue; | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + .ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection | ||
| 124 | + { | ||
| 125 | + font-size: 14px; | ||
| 126 | + } | ||
| 127 | + | ||
| 128 | + .ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection | ||
| 129 | + { | ||
| 130 | + padding: 6px 26px; | ||
| 131 | + } | ||
| 132 | + | ||
| 133 | + .ms-container .ms-list { | ||
| 134 | + height: 306px; | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + .ms-container .ms-selectable,.ms-container .ms-selection { | ||
| 138 | + width: 47%; | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + .ms-container { | ||
| 142 | + width: 470px; | ||
| 143 | + margin: auto; | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + .multi-custom-header-left { | ||
| 147 | + text-align: center; | ||
| 148 | + padding: 7px; | ||
| 149 | + color: #3B3F51; | ||
| 150 | + } | ||
| 151 | + | ||
| 152 | + .multi-custom-header-right { | ||
| 153 | + text-align: center; | ||
| 154 | + padding: 7px; | ||
| 155 | + font-weight: bold; | ||
| 156 | + color: #36C6D3; | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + .mt-element-list .list-simple.mt-list-container ul>.mt-list-item>.list-item-content | ||
| 160 | + { | ||
| 161 | + padding: 0 55px 0 0px; | ||
| 162 | + } | ||
| 163 | + | ||
| 164 | + .mt-element-list .list-simple.mt-list-container ul>.mt-list-item { | ||
| 165 | + padding: 3.3px 0; | ||
| 166 | + } | ||
| 167 | + | ||
| 168 | + #route-container { | ||
| 169 | + display: none; | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + .page-content.active { | ||
| 173 | + display: block !important; | ||
| 174 | + } | ||
| 175 | + | ||
| 176 | + .page-header.navbar .page-logo .logo-default { | ||
| 177 | + margin: 0; | ||
| 178 | + } | ||
| 179 | + | ||
| 180 | + .page-header.navbar .top-menu .navbar-nav>li.dropdown.open .dropdown-toggle | ||
| 181 | + { | ||
| 182 | + background-color: #284a99; | ||
| 183 | + } | ||
| 184 | + | ||
| 185 | + .page-header.navbar .page-logo { | ||
| 186 | + padding-right: 10px; | ||
| 187 | + } | ||
| 188 | + | ||
| 189 | + .page-logo .logo-default.logo-default-text { | ||
| 190 | + font-weight: 600; | ||
| 191 | + color: white !important; | ||
| 192 | + margin-top: 19px !important; | ||
| 193 | + font-size: 24px; | ||
| 194 | + text-decoration: none; | ||
| 195 | + } | ||
| 196 | + | ||
| 197 | + .page-logo .logo-default.logo-default-text:HOVER { | ||
| 198 | + color: #dedede !important; | ||
| 199 | + } | ||
| 200 | + | ||
| 201 | + body,.page-content-wrapper,#pjax-container{ | ||
| 202 | + height: 100%; | ||
| 203 | + } | ||
| 204 | + html{ | ||
| 205 | + height: 90%; | ||
| 206 | + } | ||
| 207 | + .page-container{ | ||
| 208 | + height: 100%; | ||
| 209 | + } | ||
| 210 | + </style> | ||
| 211 | + | ||
| 212 | + <!-- ocLazyLoading载入文件的位置 --> | ||
| 213 | + <link id="ng_load_plugins_before" /> | ||
| 214 | + | ||
| 215 | +</head> | ||
| 216 | +<body | ||
| 217 | + class="page-container-bg-solid page-header-fixed page-sidebar-closed-hide-logo page-sidebar-fixed"> | ||
| 218 | +<div class="page-header navbar navbar-fixed-top" | ||
| 219 | + style="background: linear-gradient(to bottom, #124e78, #125688);"> | ||
| 220 | + <div class="page-header-inner "> | ||
| 221 | + <!-- LOGO --> | ||
| 222 | + <div class="page-logo"> | ||
| 223 | + <a href="index.html" class="logo-default logo-default-text"> | ||
| 224 | + 嘉定公交调度系统 </a> | ||
| 225 | + <div class="menu-toggler sidebar-toggler"></div> | ||
| 226 | + </div> | ||
| 227 | + <!-- END LOGO --> | ||
| 228 | + <a href="javascript:;" class="menu-toggler responsive-toggler" | ||
| 229 | + data-toggle="collapse" data-target=".navbar-collapse"> </a> | ||
| 230 | + </div> | ||
| 231 | +</div> | ||
| 232 | +<div class="page-container"> | ||
| 233 | + <div class="page-sidebar-wrapper"> | ||
| 234 | + <div class="page-sidebar navbar-collapse collapse" > | ||
| 235 | + <div class="slimScrollDiv" style="position: relative; overflow: hidden; width: auto; height: 960px;"><ul class="page-sidebar-menu page-sidebar-menu-fixed" data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200" id="leftMenuSidebar" data-height="960" data-initialized="1" style="overflow: hidden; width: auto; height: 960px;"> | ||
| 236 | + <li class="heading"> | ||
| 237 | + <h3 class="uppercase">线路调度</h3> | ||
| 238 | + </li> | ||
| 239 | + | ||
| 240 | + <li class="nav-item open"> | ||
| 241 | + <a href="javascript:;" class="nav-link nav-toggle "> | ||
| 242 | + <i class="fa fa-life-ring"></i> | ||
| 243 | + <span class="title">线路调度管理</span> | ||
| 244 | + <span class="arrow"></span> | ||
| 245 | + </a> | ||
| 246 | + <ul class="sub-menu" style="display: block;"> | ||
| 247 | + | ||
| 248 | + <li class="nav-item active"> | ||
| 249 | + | ||
| 250 | + <a href="/pages//control/lineallot_v3/iframe_wrap.html" class="nav-link " data-pjax=""> | ||
| 251 | + <span class="title">线调</span> | ||
| 252 | + </a> | ||
| 253 | + | ||
| 254 | + </li> | ||
| 255 | + | ||
| 256 | + </ul> | ||
| 257 | + </li> | ||
| 258 | + | ||
| 259 | + </ul><div class="slimScrollBar" style="background: rgb(187, 187, 187); width: 7px; position: absolute; top: 0px; opacity: 0.4; display: none; border-radius: 7px; z-index: 99; right: 1px; height: 960px;"></div><div class="slimScrollRail" style="width: 7px; height: 100%; position: absolute; top: 0px; display: none; border-radius: 7px; background: rgb(234, 234, 234); opacity: 0.2; z-index: 90; right: 1px;"></div></div> | ||
| 260 | + </div> | ||
| 261 | + </div> | ||
| 262 | + <div class="page-content-wrapper"> | ||
| 263 | + <div id="pjax-container" class="page-content"> | ||
| 264 | + <iframe src="/pages/control/lineallot_v3/main.html?origin=real_control_iframe" frameborder="0" style="height: 100%;width: 100%;"></iframe> | ||
| 265 | + </div> | ||
| 266 | + | ||
| 267 | + <div id="route-container"> | ||
| 268 | + <div ng-app="ScheduleApp"> | ||
| 269 | + <div ng-controller="ScheduleAppController"> | ||
| 270 | + | ||
| 271 | + <!-- loading widget --> | ||
| 272 | + <div id="loadingWidget" class="flyover mask" loading-widget> | ||
| 273 | + <div class="alert alert-info"> | ||
| 274 | + <strong>载入中......</strong> | ||
| 275 | + </div> | ||
| 276 | + </div> | ||
| 277 | + | ||
| 278 | + <div ui-view class="uv"></div> | ||
| 279 | + </div> | ||
| 280 | + </div> | ||
| 281 | + </div> | ||
| 282 | + </div> | ||
| 283 | +</div> | ||
| 284 | + | ||
| 285 | +<script id="menu_list_temp" type="text/html"> | ||
| 286 | + {{each list as group i}} | ||
| 287 | + <li class="heading"> | ||
| 288 | + <h3 class="uppercase">{{group.name}}</h3> | ||
| 289 | + </li> | ||
| 290 | + {{each group.children as dir j}} | ||
| 291 | + <li class="nav-item"> | ||
| 292 | + <a href="javascript:;" class="nav-link nav-toggle "> | ||
| 293 | + <i class="{{dir.icon}}"></i> | ||
| 294 | + <span class="title">{{dir.name}}</span> | ||
| 295 | + <span class="arrow"></span> | ||
| 296 | + </a> | ||
| 297 | + <ul class="sub-menu"> | ||
| 298 | + {{each dir.children as module s}} | ||
| 299 | + <li class="nav-item "> | ||
| 300 | + {{if module.container=="pjax-container"}} | ||
| 301 | + <a href="/pages/{{module.path}}" class="nav-link " data-pjax> | ||
| 302 | + <span class="title">{{module.name}}</span> | ||
| 303 | + </a> | ||
| 304 | + {{else}} | ||
| 305 | + <a href="{{module.path}}" class="nav-link " data-angularjs> | ||
| 306 | + <span class="title">{{module.name}}</span> | ||
| 307 | + </a> | ||
| 308 | + {{/if}} | ||
| 309 | + </li> | ||
| 310 | + {{/each}} | ||
| 311 | + </ul> | ||
| 312 | + </li> | ||
| 313 | + {{/each}} | ||
| 314 | + {{/each}} | ||
| 315 | + | ||
| 316 | +</script> | ||
| 317 | +<script> | ||
| 318 | + delete window.require; | ||
| 319 | + delete window.exports; | ||
| 320 | + delete window.module; | ||
| 321 | +</script> | ||
| 322 | +<!-- jQuery --> | ||
| 323 | +<script src="/metronic_v4.5.4/plugins/jquery.min.js" data-exclude=1></script> | ||
| 324 | +<!-- bootstrap --> | ||
| 325 | +<script src="/metronic_v4.5.4/plugins/bootstrap/js/bootstrap.min.js" | ||
| 326 | + data-exclude=1></script> | ||
| 327 | +<script src="/pages/control/lineallot_v3/js/jquery.autocompleter.js"></script> | ||
| 328 | +<script src="/pages/control/lineallot_v3/js/jquery.PrintArea.js"></script> | ||
| 329 | +<!-- MTRONIC JS --> | ||
| 330 | +<script src="/metronic_v4.5.4/scripts/app.min.js" data-exclude=1></script> | ||
| 331 | +<script src="/metronic_v4.5.4/layout4/scripts/layout.min.js" | ||
| 332 | + data-exclude=1></script> | ||
| 333 | +<!-- 虚拟滚动条 --> | ||
| 334 | +<script | ||
| 335 | + src="/metronic_v4.5.4/plugins/jquery-slimscroll/jquery.slimscroll.min.js"></script> | ||
| 336 | +<!-- jsTree 树插件 --> | ||
| 337 | +<script src="/metronic_v4.5.4/plugins/jstree/dist/jstree.min.js"></script> | ||
| 338 | +<!-- bootstrap-hover-dropDown --> | ||
| 339 | +<script | ||
| 340 | + src="/metronic_v4.5.4/plugins/bootstrap-hover-dropdown/bootstrap-hover-dropdown.min.js"></script> | ||
| 341 | +<!-- jquery.validate 表单验证 --> | ||
| 342 | +<script | ||
| 343 | + src="/metronic_v4.5.4/plugins/jquery-validation/js/jquery.validate.min.js"></script> | ||
| 344 | +<script | ||
| 345 | + src="/metronic_v4.5.4/plugins/jquery-validation/js/localization/messages_zh.js"></script> | ||
| 346 | +<!-- 向导式插件 --> | ||
| 347 | +<script | ||
| 348 | + src="/metronic_v4.5.4//plugins/bootstrap-wizard/jquery.bootstrap.wizard.min.js"></script> | ||
| 349 | +<!-- iCheck 单选框和复选框 --> | ||
| 350 | +<script src="/metronic_v4.5.4/plugins/icheck/icheck.min.js"></script> | ||
| 351 | +<!-- select2 下拉框 --> | ||
| 352 | +<script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js"></script> | ||
| 353 | +<!-- MULTI SELECT 多选下拉框 --> | ||
| 354 | +<script | ||
| 355 | + src="/metronic_v4.5.4/plugins/jquery-multi-select/js/jquery.multi-select.js"></script> | ||
| 356 | +<!-- editable.js --> | ||
| 357 | +<script | ||
| 358 | + src="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/js/bootstrap-editable.min.js"></script> | ||
| 359 | +<!-- PJAX --> | ||
| 360 | +<script src="/assets/plugins/jquery.pjax.js"></script> | ||
| 361 | +<!-- layer 弹层 --> | ||
| 362 | +<script src="/assets/plugins/layer-v2.4/layer/layer.js" data-exclude=1></script> | ||
| 363 | +<!-- fileinput 上传 --> | ||
| 364 | +<script src="/assets/plugins/fileinput/canvas-to-blob.min.js"></script> | ||
| 365 | +<script src="/assets/plugins/fileinput/purify.min.js"></script> | ||
| 366 | +<script src="/assets/plugins/fileinput/sortable.min.js"></script> | ||
| 367 | +<script src="/assets/plugins/fileinput/fileinput.min.js"></script> | ||
| 368 | +<script src="/assets/plugins/fileinput/fileinput_locale_zh.js"></script> | ||
| 369 | +<!-- jquery.purl URL解析 --> | ||
| 370 | +<script src="/assets/plugins/purl.js"></script> | ||
| 371 | +<!-- jquery.serializejson JSON序列化插件 --> | ||
| 372 | +<script src="/assets/plugins/jquery.serializejson.js"></script> | ||
| 373 | +<!-- art-template 模版引擎 --> | ||
| 374 | +<script src="/assets/plugins/template.js"></script> | ||
| 375 | +<!-- jquery.pageinator 分页 --> | ||
| 376 | +<script src="/assets/plugins/jqPaginator.min.js"></script> | ||
| 377 | +<!-- moment.js 日期处理类库 --> | ||
| 378 | +<script src="/assets/plugins/moment-with-locales.js"></script> | ||
| 379 | + | ||
| 380 | +<script src="/assets/plugins/pinyin.js"></script> | ||
| 381 | +<!-- 日期控件 --> | ||
| 382 | +<script | ||
| 383 | + src="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/js/bootstrap-datetimepicker.min.js"></script> | ||
| 384 | +<!-- 表格控件 --> | ||
| 385 | +<script src="/metronic_v4.5.4/plugins/bootstrap-tagsinput/bootstrap-tagsinput.min.js"></script> | ||
| 386 | +<!-- 统计图控件 --> | ||
| 387 | +<!--<script src="/assets/global/getEchart.js"></script> | ||
| 388 | +<script src="/assets/global/echarts.js"></script> --> | ||
| 389 | +<script src="/assets/js/common.js"></script> | ||
| 390 | +<!--<script src="/assets/js/dictionary.js"></script>--> | ||
| 391 | +<!-- tipso JS --> | ||
| 392 | +<script src="/metronic_v4.5.4/plugins/tipso/js/tipso.js"></script> | ||
| 393 | +<script data-exclude=1> | ||
| 394 | + //初始打开的片段地址 | ||
| 395 | + var initFragment = "^_^initFragment^_^"; | ||
| 396 | + //静态文件目录 | ||
| 397 | + var dir = '/pages/'; | ||
| 398 | + //片段容器 | ||
| 399 | + var pjaxContainer = '#pjax-container' | ||
| 400 | + , angJsContainer = '#route-container'; | ||
| 401 | + | ||
| 402 | + $(document).ajaxError(function (event, jqxhr, settings, thrownError) { | ||
| 403 | + if(jqxhr.status == 403){ | ||
| 404 | + layer.closeAll(); | ||
| 405 | + layer.alert(jqxhr.message?jqxhr.message:'访问被拒绝', {icon: 2, title: '操作失败'}); | ||
| 406 | + } | ||
| 407 | + }); | ||
| 408 | + | ||
| 409 | + $(function () { | ||
| 410 | + | ||
| 411 | + | ||
| 412 | + //带 data-pjax 的链接由pjax加载 | ||
| 413 | + $(document).pjax('a[data-pjax]', pjaxContainer); | ||
| 414 | + | ||
| 415 | + //pjax左菜单点击事件 | ||
| 416 | + $(document).on('click', '#leftMenuSidebar a[data-pjax]', function () { | ||
| 417 | + setTitle(this); | ||
| 418 | + | ||
| 419 | + $('#leftMenuSidebar li.nav-item.active').removeClass('active'); | ||
| 420 | + $(this).parent().addClass('active'); | ||
| 421 | + showPjax(); | ||
| 422 | + }); | ||
| 423 | + | ||
| 424 | + //angularjs左菜单点击事件 | ||
| 425 | + $(document).on('click', '#leftMenuSidebar a[data-angularjs]', function () { | ||
| 426 | + setTitle(this); | ||
| 427 | + | ||
| 428 | + $('#leftMenuSidebar li.nav-item.active').removeClass('active'); | ||
| 429 | + $(this).parent().addClass('active'); | ||
| 430 | + showAngJs(); | ||
| 431 | + }); | ||
| 432 | + //修改密码 | ||
| 433 | + $('#changePWD').on('click', function () { | ||
| 434 | + $.get('/pages/permission/user/changePWD.html', function (content) { | ||
| 435 | + layer.open({ | ||
| 436 | + type: 1, | ||
| 437 | + area: ['600px', '360px'], | ||
| 438 | + content: content, | ||
| 439 | + title: '修改密码', | ||
| 440 | + shift: 5, | ||
| 441 | + scrollbar: false, | ||
| 442 | + success: function () { | ||
| 443 | + } | ||
| 444 | + }); | ||
| 445 | + }); | ||
| 446 | + }); | ||
| 447 | + }); | ||
| 448 | + | ||
| 449 | + //modal关闭时销毁dom | ||
| 450 | + $(document).on('hidden.bs.modal', '.modal', function () { | ||
| 451 | + $(this).remove(); | ||
| 452 | + }); | ||
| 453 | + | ||
| 454 | + //pjax加载完成事件 | ||
| 455 | + $(document).on('pjax:success', function () { | ||
| 456 | + var dicts = $(pjaxContainer).find('.nt-dictionary'); | ||
| 457 | + dictionaryUtils.transformDom(dicts); | ||
| 458 | + }); | ||
| 459 | + | ||
| 460 | + function loadPage(url) { | ||
| 461 | + $.pjax({url: url, container: pjaxContainer}) | ||
| 462 | + } | ||
| 463 | + | ||
| 464 | + function urlPattern(a, b) { | ||
| 465 | + var r; | ||
| 466 | + try { | ||
| 467 | + r = a.substring(0, a.lastIndexOf('/')) == b.substring(0, b.lastIndexOf('/')); | ||
| 468 | + } catch (e) { | ||
| 469 | + r = false; | ||
| 470 | + } | ||
| 471 | + return r; | ||
| 472 | + } | ||
| 473 | + | ||
| 474 | + function showPjax() { | ||
| 475 | + $(angJsContainer).removeClass('page-content active').hide(); | ||
| 476 | + $(pjaxContainer).addClass('page-content active'); | ||
| 477 | + } | ||
| 478 | + | ||
| 479 | + function showAngJs() { | ||
| 480 | + $(pjaxContainer).html('').removeClass('page-content active').hide(); | ||
| 481 | + $(angJsContainer).addClass('page-content active'); | ||
| 482 | + } | ||
| 483 | + | ||
| 484 | + function activeLeftMenu(item) { | ||
| 485 | + $(item).parent('.nav-item').addClass('active').parent('.sub-menu').show().parent().addClass('open'); | ||
| 486 | + setTitle(item); | ||
| 487 | + } | ||
| 488 | + | ||
| 489 | + function setTitle(menuItem){ | ||
| 490 | + document.title = $('span.title', menuItem).text(); | ||
| 491 | + } | ||
| 492 | + | ||
| 493 | +</script> | ||
| 494 | +<!-- d3 --> | ||
| 495 | +<script src="/assets/js/d3.min.js" data-exclude=1></script> | ||
| 496 | +<!-- webSocket JS --> | ||
| 497 | +<script src="/assets/js/sockjs.min.js"></script> | ||
| 498 | + | ||
| 499 | +<!-- TODO:angularJS相关库 --> | ||
| 500 | + | ||
| 501 | +<!-- angularJS相关库 --> | ||
| 502 | +<!-- 这个是基于angularjs 1.4.10修改的版本,主要是修改了history控制部分,用于兼容route和pjax的同时操作history的冲突 --> | ||
| 503 | +<script src="/assets/js/angular.js" data-autocephaly=1></script> | ||
| 504 | +<script src="/assets/bower_components/angular-i18n/angular-locale_zh-cn.js" data-autocephaly=1></script> | ||
| 505 | +<script | ||
| 506 | + src="/assets/bower_components/angular-resource/angular-resource.min.js" | ||
| 507 | + data-exclude=1></script> | ||
| 508 | +<script | ||
| 509 | + src="/assets/bower_components/angular-sanitize/angular-sanitize.min.js" | ||
| 510 | + data-exclude=1></script> | ||
| 511 | +<script | ||
| 512 | + src="/assets/bower_components/angular-animate/angular-animate.min.js" | ||
| 513 | + data-exclude=1></script> | ||
| 514 | +<script | ||
| 515 | + src="/assets/bower_components/angular-touch/angular-touch.min.js" | ||
| 516 | + data-exclude=1></script> | ||
| 517 | +<script | ||
| 518 | + src="/assets/bower_components/angular-ui-router/release/angular-ui-router.min.js" | ||
| 519 | + data-exclude=1></script> | ||
| 520 | +<script | ||
| 521 | + src="/assets/bower_components/oclazyload/dist/ocLazyLoad.min.js" | ||
| 522 | + data-exclude=1></script> | ||
| 523 | +<script | ||
| 524 | + src="/assets/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js" | ||
| 525 | + data-exclude=1></script> | ||
| 526 | +<!-- handsontable相关js --> | ||
| 527 | +<script | ||
| 528 | + src="/assets/bower_components/handsontable/dist/handsontable.full.js"></script> | ||
| 529 | +<script | ||
| 530 | + src="/assets/bower_components/ngHandsontable/dist/ngHandsontable.js"></script> | ||
| 531 | +<!-- sweetalert相关js --> | ||
| 532 | +<script src="/assets/bower_components/sweetalert/dist/sweetalert.min.js"></script> | ||
| 533 | +<script src="/assets/bower_components/ng-sweet-alert/ng-sweet-alert.js"></script> | ||
| 534 | + | ||
| 535 | +<!-- schedule计划调度AngularJS模块主JS --> | ||
| 536 | +<script src="/pages/control/lineallot_v3/scheduleApp/module/common/main.js" data-exclude=1></script> | ||
| 537 | +<script | ||
| 538 | + src="/pages/control/lineallot_v3/scheduleApp/module/common/prj-common-globalservice.js" | ||
| 539 | + data-exclude=1></script> | ||
| 540 | +<script src="/pages/control/lineallot_v3/scheduleApp/module/common/prj-common-filter.js" | ||
| 541 | + data-exclude=1></script> | ||
| 542 | +<script src="/pages/control/lineallot_v3/scheduleApp/module/common/prj-common-directive.js" | ||
| 543 | + data-exclude=1></script> | ||
| 544 | +<script | ||
| 545 | + src="/pages/control/lineallot_v3/scheduleApp/module/common/prj-common-ui-route-state.js" | ||
| 546 | + data-exclude=1></script> | ||
| 547 | + | ||
| 548 | +<!-- 地图相关 --> | ||
| 549 | +<!-- 百度 --> | ||
| 550 | +<script | ||
| 551 | + src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT" | ||
| 552 | + data-exclude=1></script> | ||
| 553 | +<script | ||
| 554 | + src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js" | ||
| 555 | + data-exclude=1></script> | ||
| 556 | +<script type="text/javascript" | ||
| 557 | + src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js" | ||
| 558 | + data-exclude=1></script> | ||
| 559 | +<script type="text/javascript" | ||
| 560 | + src="http://api.map.baidu.com/library/RichMarker/1.2/src/RichMarker_min.js " | ||
| 561 | + data-exclude=1></script> | ||
| 562 | +<script src="/assets/js/baidu/TextIconOverlay.js" data-exclude=1></script> | ||
| 563 | +<script src="/assets/js/baidu//MarkerClusterer.js" data-exclude=1></script> | ||
| 564 | +<!-- 高德 --> | ||
| 565 | +<script | ||
| 566 | + src="http://webapi.amap.com/maps?v=1.3&key=16cb1c5043847e09ef9edafdd77befda" | ||
| 567 | + data-exclude=1></script> | ||
| 568 | + | ||
| 569 | +<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" merge="plugins"></script> | ||
| 570 | + | ||
| 571 | +</body> | ||
| 572 | +</html> |
src/main/resources/static/pages/control/lineallot_v3/js/jquery.PrintArea.js
0 → 100644
| 1 | +/** | ||
| 2 | + * Version 2.4.0 Copyright (C) 2013 | ||
| 3 | + * Tested in IE 11, FF 28.0 and Chrome 33.0.1750.154 | ||
| 4 | + * No official support for other browsers, but will TRY to accommodate challenges in other browsers. | ||
| 5 | + * Example: | ||
| 6 | + * Print Button: <div id="print_button">Print</div> | ||
| 7 | + * Print Area : <div class="PrintArea" id="MyId" class="MyClass"> ... html ... </div> | ||
| 8 | + * Javascript : <script> | ||
| 9 | + * $("div#print_button").click(function(){ | ||
| 10 | + * $("div.PrintArea").printArea( [OPTIONS] ); | ||
| 11 | + * }); | ||
| 12 | + * </script> | ||
| 13 | + * options are passed as json (example: {mode: "popup", popClose: false}) | ||
| 14 | + * | ||
| 15 | + * {OPTIONS} | [type] | (default), values | Explanation | ||
| 16 | + * --------- | --------- | ---------------------- | ----------- | ||
| 17 | + * @mode | [string] | (iframe),popup | printable window is either iframe or browser popup | ||
| 18 | + * @popHt | [number] | (500) | popup window height | ||
| 19 | + * @popWd | [number] | (400) | popup window width | ||
| 20 | + * @popX | [number] | (500) | popup window screen X position | ||
| 21 | + * @popY | [number] | (500) | popup window screen Y position | ||
| 22 | + * @popTitle | [string] | ('') | popup window title element | ||
| 23 | + * @popClose | [boolean] | (false),true | popup window close after printing | ||
| 24 | + * @extraCss | [string] | ('') | comma separated list of extra css to include | ||
| 25 | + * @retainAttr | [string[]] | ["id","class","style"] | string array of attributes to retain for the containment area. (ie: id, style, class) | ||
| 26 | + * @standard | [string] | strict, loose, (html5) | Only for popup. For html 4.01, strict or loose document standard, or html 5 standard | ||
| 27 | + * @extraHead | [string] | ('') | comma separated list of extra elements to be appended to the head tag | ||
| 28 | + */ | ||
| 29 | +(function($) { | ||
| 30 | + var counter = 0; | ||
| 31 | + var modes = { iframe : "iframe", popup : "popup" }; | ||
| 32 | + var standards = { strict : "strict", loose : "loose", html5 : "html5" }; | ||
| 33 | + var defaults = { mode : modes.iframe, | ||
| 34 | + standard : standards.html5, | ||
| 35 | + popHt : 500, | ||
| 36 | + popWd : 400, | ||
| 37 | + popX : 200, | ||
| 38 | + popY : 200, | ||
| 39 | + popTitle : '', | ||
| 40 | + popClose : false, | ||
| 41 | + extraCss : '', | ||
| 42 | + extraHead : '', | ||
| 43 | + retainAttr : ["id","class","style"] }; | ||
| 44 | + | ||
| 45 | + var settings = {};//global settings | ||
| 46 | + | ||
| 47 | + $.fn.printArea = function( options ) | ||
| 48 | + { | ||
| 49 | + $.extend( settings, defaults, options ); | ||
| 50 | + | ||
| 51 | + counter++; | ||
| 52 | + var idPrefix = "printArea_"; | ||
| 53 | + $( "[id^=" + idPrefix + "]" ).remove(); | ||
| 54 | + | ||
| 55 | + settings.id = idPrefix + counter; | ||
| 56 | + | ||
| 57 | + var $printSource = $(this); | ||
| 58 | + | ||
| 59 | + var PrintAreaWindow = PrintArea.getPrintWindow(); | ||
| 60 | + | ||
| 61 | + PrintArea.write( PrintAreaWindow.doc, $printSource ); | ||
| 62 | + | ||
| 63 | + setTimeout( function () { PrintArea.print( PrintAreaWindow ); }, 1000 ); | ||
| 64 | + }; | ||
| 65 | + | ||
| 66 | + var PrintArea = { | ||
| 67 | + print : function( PAWindow ) { | ||
| 68 | + var paWindow = PAWindow.win; | ||
| 69 | + | ||
| 70 | + $(PAWindow.doc).ready(function(){ | ||
| 71 | + paWindow.focus(); | ||
| 72 | + paWindow.print(); | ||
| 73 | + | ||
| 74 | + if ( settings.mode == modes.popup && settings.popClose ) | ||
| 75 | + setTimeout(function() { paWindow.close(); }, 2000); | ||
| 76 | + }); | ||
| 77 | + }, | ||
| 78 | + write : function ( PADocument, $ele ) { | ||
| 79 | + PADocument.open(); | ||
| 80 | + PADocument.write( PrintArea.docType() + "<html>" + PrintArea.getHead() + PrintArea.getBody( $ele ) + "</html>" ); | ||
| 81 | + PADocument.close(); | ||
| 82 | + }, | ||
| 83 | + docType : function() { | ||
| 84 | + if ( settings.mode == modes.iframe ) return ""; | ||
| 85 | + | ||
| 86 | + if ( settings.standard == standards.html5 ) return "<!DOCTYPE html>"; | ||
| 87 | + | ||
| 88 | + var transitional = settings.standard == standards.loose ? " Transitional" : ""; | ||
| 89 | + var dtd = settings.standard == standards.loose ? "loose" : "strict"; | ||
| 90 | + | ||
| 91 | + return '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01' + transitional + '//EN" "http://www.w3.org/TR/html4/' + dtd + '.dtd">'; | ||
| 92 | + }, | ||
| 93 | + getHead : function() { | ||
| 94 | + var extraHead = ""; | ||
| 95 | + var links = ""; | ||
| 96 | + | ||
| 97 | + if ( settings.extraHead ) settings.extraHead.replace( /([^,]+)/g, function(m){ extraHead += m }); | ||
| 98 | + | ||
| 99 | + $(document).find("link") | ||
| 100 | + .filter(function(){ // Requirement: <link> element MUST have rel="stylesheet" to be considered in print document | ||
| 101 | + var relAttr = $(this).attr("rel"); | ||
| 102 | + return ($.type(relAttr) === 'undefined') == false && relAttr.toLowerCase() == 'stylesheet'; | ||
| 103 | + }) | ||
| 104 | + .filter(function(){ // Include if media is undefined, empty, print or all | ||
| 105 | + var mediaAttr = $(this).attr("media"); | ||
| 106 | + return $.type(mediaAttr) === 'undefined' || mediaAttr == "" || mediaAttr.toLowerCase() == 'print' || mediaAttr.toLowerCase() == 'all' | ||
| 107 | + }) | ||
| 108 | + .each(function(){ | ||
| 109 | + links += '<link type="text/css" rel="stylesheet" href="' + $(this).attr("href") + '" >'; | ||
| 110 | + }); | ||
| 111 | + if ( settings.extraCss ) settings.extraCss.replace( /([^,\s]+)/g, function(m){ links += '<link type="text/css" rel="stylesheet" href="' + m + '">' }); | ||
| 112 | + | ||
| 113 | + return "<head><title>" + settings.popTitle + "</title>" + extraHead + links + "</head>"; | ||
| 114 | + }, | ||
| 115 | + getBody : function ( elements ) { | ||
| 116 | + var htm = ""; | ||
| 117 | + var attrs = settings.retainAttr; | ||
| 118 | + elements.each(function() { | ||
| 119 | + var ele = PrintArea.getFormData( $(this) ); | ||
| 120 | + | ||
| 121 | + var attributes = "" | ||
| 122 | + for ( var x = 0; x < attrs.length; x++ ) | ||
| 123 | + { | ||
| 124 | + var eleAttr = $(ele).attr( attrs[x] ); | ||
| 125 | + if ( eleAttr ) attributes += (attributes.length > 0 ? " ":"") + attrs[x] + "='" + eleAttr + "'"; | ||
| 126 | + } | ||
| 127 | + | ||
| 128 | + htm += '<div ' + attributes + '>' + $(ele).html() + '</div>'; | ||
| 129 | + }); | ||
| 130 | + | ||
| 131 | + return "<body>" + htm + "</body>"; | ||
| 132 | + }, | ||
| 133 | + getFormData : function ( ele ) { | ||
| 134 | + var copy = ele.clone(); | ||
| 135 | + var copiedInputs = $("input,select,textarea", copy); | ||
| 136 | + $("input,select,textarea", ele).each(function( i ){ | ||
| 137 | + var typeInput = $(this).attr("type"); | ||
| 138 | + if ($.type(typeInput) === 'undefined') typeInput = $(this).is("select") ? "select" : $(this).is("textarea") ? "textarea" : ""; | ||
| 139 | + var copiedInput = copiedInputs.eq( i ); | ||
| 140 | + | ||
| 141 | + if ( typeInput == "radio" || typeInput == "checkbox" ) copiedInput.attr( "checked", $(this).is(":checked") ); | ||
| 142 | + else if ( typeInput == "text" ) copiedInput.attr( "value", $(this).val() ); | ||
| 143 | + else if ( typeInput == "select" ) | ||
| 144 | + $(this).find( "option" ).each( function( i ) { | ||
| 145 | + if ( $(this).is(":selected") ) $("option", copiedInput).eq( i ).attr( "selected", true ); | ||
| 146 | + }); | ||
| 147 | + else if ( typeInput == "textarea" ) copiedInput.text( $(this).val() ); | ||
| 148 | + }); | ||
| 149 | + return copy; | ||
| 150 | + }, | ||
| 151 | + getPrintWindow : function () { | ||
| 152 | + switch ( settings.mode ) | ||
| 153 | + { | ||
| 154 | + case modes.iframe : | ||
| 155 | + var f = new PrintArea.Iframe(); | ||
| 156 | + return { win : f.contentWindow || f, doc : f.doc }; | ||
| 157 | + case modes.popup : | ||
| 158 | + var p = new PrintArea.Popup(); | ||
| 159 | + return { win : p, doc : p.doc }; | ||
| 160 | + } | ||
| 161 | + }, | ||
| 162 | + Iframe : function () { | ||
| 163 | + var frameId = settings.id; | ||
| 164 | + var iframeStyle = 'border:0;position:absolute;width:0px;height:0px;right:0px;top:0px;'; | ||
| 165 | + var iframe; | ||
| 166 | + | ||
| 167 | + try | ||
| 168 | + { | ||
| 169 | + iframe = document.createElement('iframe'); | ||
| 170 | + document.body.appendChild(iframe); | ||
| 171 | + $(iframe).attr({ style: iframeStyle, id: frameId, src: "#" + new Date().getTime() }); | ||
| 172 | + iframe.doc = null; | ||
| 173 | + iframe.doc = iframe.contentDocument ? iframe.contentDocument : ( iframe.contentWindow ? iframe.contentWindow.document : iframe.document); | ||
| 174 | + } | ||
| 175 | + catch( e ) { throw e + ". iframes may not be supported in this browser."; } | ||
| 176 | + | ||
| 177 | + if ( iframe.doc == null ) throw "Cannot find document."; | ||
| 178 | + | ||
| 179 | + return iframe; | ||
| 180 | + }, | ||
| 181 | + Popup : function () { | ||
| 182 | + var windowAttr = "location=yes,statusbar=no,directories=no,menubar=no,titlebar=no,toolbar=no,dependent=no"; | ||
| 183 | + windowAttr += ",width=" + settings.popWd + ",height=" + settings.popHt; | ||
| 184 | + windowAttr += ",resizable=yes,screenX=" + settings.popX + ",screenY=" + settings.popY + ",personalbar=no,scrollbars=yes"; | ||
| 185 | + | ||
| 186 | + var newWin = window.open( "", "_blank", windowAttr ); | ||
| 187 | + | ||
| 188 | + newWin.doc = newWin.document; | ||
| 189 | + | ||
| 190 | + return newWin; | ||
| 191 | + } | ||
| 192 | + }; | ||
| 193 | +})(jQuery); | ||
| 0 | \ No newline at end of file | 194 | \ No newline at end of file |
src/main/resources/static/pages/control/lineallot_v3/js/jquery.autocompleter.js
0 → 100644
| 1 | +/* | ||
| 2 | + * Autocompleter v0.1.2 - 2014-05-20 | ||
| 3 | + * Simple, easy, customisable and with cache support. | ||
| 4 | + * http://github.com/ArtemFitiskin/jquery-autocompleter | ||
| 5 | + * | ||
| 6 | + * Copyright 2014 Artem Fitiskin; MIT Licensed | ||
| 7 | + */ | ||
| 8 | + | ||
| 9 | +;(function ($, window) { | ||
| 10 | + "use strict"; | ||
| 11 | + | ||
| 12 | + var guid = 0, | ||
| 13 | + ignoredKeyCode = [9, 13, 17, 19, 20, 27, 33, 34, 35, 36, 37, 39, 44, 92, 113, 114, 115, 118, 119, 120, 122, 123, 144, 145], | ||
| 14 | + allowOptions = ['source', 'empty', 'limit', 'cache', 'focusOpen', 'selectFirst', 'changeWhenSelect', 'highlightMatches', 'ignoredKeyCode', 'customLabel', 'customValue', 'template', 'combine', 'callback'], | ||
| 15 | + userAgent = (window.navigator.userAgent||window.navigator.vendor||window.opera), | ||
| 16 | + isFirefox = /Firefox/i.test(userAgent), | ||
| 17 | + isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(userAgent), | ||
| 18 | + isFirefoxMobile = (isFirefox && isMobile), | ||
| 19 | + $body = null, | ||
| 20 | + localStorageKey = 'autocompleterCache', | ||
| 21 | + supportLocalStorage = (function () { | ||
| 22 | + var supported = typeof window.localStorage !== 'undefined'; | ||
| 23 | + if (supported) { | ||
| 24 | + try { | ||
| 25 | + localStorage.setItem("autocompleter", "autocompleter"); | ||
| 26 | + localStorage.removeItem("autocompleter"); | ||
| 27 | + } catch (e) { | ||
| 28 | + supported = false; | ||
| 29 | + } | ||
| 30 | + } | ||
| 31 | + return supported; | ||
| 32 | + })(); | ||
| 33 | + | ||
| 34 | + /** | ||
| 35 | + * @options | ||
| 36 | + * @param source [(string|object)] <null> "URL to the server or a local object" | ||
| 37 | + * @param empty [boolean] <true> "Launch if value is empty" | ||
| 38 | + * @param limit [int] <10> "Number of results to be displayed" | ||
| 39 | + * @param customClass [array] <[]> "Array with custom classes for autocompleter element" | ||
| 40 | + * @param cache [boolean] <true> "Save xhr data to localStorage to avoid the repetition of requests" | ||
| 41 | + * @param focusOpen [boolean] <true> "Launch autocompleter when input gets focus" | ||
| 42 | + * @param hint [boolean] <false> "Add hint to input with first matched label, correct styles should be installed" | ||
| 43 | + * @param selectFirst [boolean] <false> "If set to true, first element in autocomplete list will be selected automatically, ignore if changeWhenSelect is on" | ||
| 44 | + * @param changeWhenSelect [boolean] <true> "Allows to change input value using arrow keys navigation in autocomplete list" | ||
| 45 | + * @param highlightMatches [boolean] <false> "This option defines <strong> tag wrap for matches in autocomplete results" | ||
| 46 | + * @param ignoredKeyCode [array] <[]> "Array with ignorable keycodes" | ||
| 47 | + * @param customLabel [boolean] <false> "The name of object's property which will be used as a label" | ||
| 48 | + * @param customValue [boolean] <false> "The name of object's property which will be used as a value" | ||
| 49 | + * @param template [(string|boolean)] <false> "Custom template for list items" | ||
| 50 | + * @param combine [function] <$.noop> "Returns an object which extends ajax data. Useful if you want to pass some additional server options" | ||
| 51 | + * @param callback [function] <$.noop> "Select value callback function. Arguments: value, index" | ||
| 52 | + */ | ||
| 53 | + var options = { | ||
| 54 | + source: null, | ||
| 55 | + empty: true, | ||
| 56 | + limit: 10, | ||
| 57 | + customClass: [], | ||
| 58 | + cache: true, | ||
| 59 | + focusOpen: true, | ||
| 60 | + hint: false, | ||
| 61 | + selectFirst: false, | ||
| 62 | + changeWhenSelect: true, | ||
| 63 | + highlightMatches: false, | ||
| 64 | + ignoredKeyCode: [], | ||
| 65 | + customLabel: false, | ||
| 66 | + customValue: false, | ||
| 67 | + template: false, | ||
| 68 | + combine: $.noop, | ||
| 69 | + callback: $.noop | ||
| 70 | + }; | ||
| 71 | + | ||
| 72 | + var publics = { | ||
| 73 | + | ||
| 74 | + /** | ||
| 75 | + * @method | ||
| 76 | + * @name defaults | ||
| 77 | + * @description Sets default plugin options | ||
| 78 | + * @param opts [object] <{}> "Options object" | ||
| 79 | + * @example $.autocompleter("defaults", opts); | ||
| 80 | + */ | ||
| 81 | + defaults: function (opts) { | ||
| 82 | + options = $.extend(options, opts || {}); | ||
| 83 | + return $(this); | ||
| 84 | + }, | ||
| 85 | + | ||
| 86 | + /** | ||
| 87 | + * @method | ||
| 88 | + * @name option | ||
| 89 | + * @description Open autocompleter list | ||
| 90 | + */ | ||
| 91 | + option: function (properties) { | ||
| 92 | + return $(this).each(function(i, input) { | ||
| 93 | + var data = $(input).next(".autocompleter").data("autocompleter"); | ||
| 94 | + | ||
| 95 | + for (var property in properties) { | ||
| 96 | + if ($.inArray(property, allowOptions) !== -1) { | ||
| 97 | + data[property] = properties[property]; | ||
| 98 | + } | ||
| 99 | + } | ||
| 100 | + }); | ||
| 101 | + }, | ||
| 102 | + | ||
| 103 | + /** | ||
| 104 | + * @method | ||
| 105 | + * @name open | ||
| 106 | + * @description Open autocompleter list | ||
| 107 | + */ | ||
| 108 | + open: function () { | ||
| 109 | + return $(this).each(function(i, input) { | ||
| 110 | + var data = $(input).next(".autocompleter").data("autocompleter"); | ||
| 111 | + | ||
| 112 | + if (data) { | ||
| 113 | + _open(null, data); | ||
| 114 | + } | ||
| 115 | + }); | ||
| 116 | + }, | ||
| 117 | + | ||
| 118 | + /** | ||
| 119 | + * @method | ||
| 120 | + * @name close | ||
| 121 | + * @description Close autocompleter list | ||
| 122 | + */ | ||
| 123 | + close: function () { | ||
| 124 | + return $(this).each(function(i, input) { | ||
| 125 | + var data = $(input).next(".autocompleter").data("autocompleter"); | ||
| 126 | + | ||
| 127 | + if (data) { | ||
| 128 | + _close(null, data); | ||
| 129 | + } | ||
| 130 | + }); | ||
| 131 | + }, | ||
| 132 | + | ||
| 133 | + /** | ||
| 134 | + * @method | ||
| 135 | + * @name clearCache | ||
| 136 | + * @description Remove localStorage cache | ||
| 137 | + */ | ||
| 138 | + clearCache: function () { | ||
| 139 | + _deleteCache(); | ||
| 140 | + }, | ||
| 141 | + | ||
| 142 | + /** | ||
| 143 | + * @method | ||
| 144 | + * @name destroy | ||
| 145 | + * @description Removes instance of plugin | ||
| 146 | + * @example $(".target").autocompleter("destroy"); | ||
| 147 | + */ | ||
| 148 | + destroy: function () { | ||
| 149 | + return $(this).each(function (i, input) { | ||
| 150 | + var data = $(input).next(".autocompleter").data("autocompleter"); | ||
| 151 | + | ||
| 152 | + if (data) { | ||
| 153 | + // Abort xhr | ||
| 154 | + if (data.jqxhr) { | ||
| 155 | + data.jqxhr.abort(); | ||
| 156 | + } | ||
| 157 | + | ||
| 158 | + // If has selected item & open - confirm it | ||
| 159 | + if (data.$autocompleter.hasClass("open")) { | ||
| 160 | + data.$autocompleter.find(".autocompleter-selected") | ||
| 161 | + .trigger("click.autocompleter"); | ||
| 162 | + } | ||
| 163 | + | ||
| 164 | + // Restore original autocomplete attr | ||
| 165 | + if(!data.originalAutocomplete) { | ||
| 166 | + data.$node.removeAttr("autocomplete"); | ||
| 167 | + } else { | ||
| 168 | + data.$node.attr("autocomplete", data.originalAutocomplete); | ||
| 169 | + } | ||
| 170 | + | ||
| 171 | + // Remove autocompleter & unbind events | ||
| 172 | + data.$node.off(".autocompleter") | ||
| 173 | + .removeClass("autocompleter-node"); | ||
| 174 | + data.$autocompleter.off(".autocompleter") | ||
| 175 | + .remove(); | ||
| 176 | + } | ||
| 177 | + }); | ||
| 178 | + } | ||
| 179 | + }; | ||
| 180 | + | ||
| 181 | + /** | ||
| 182 | + * @method private | ||
| 183 | + * @name _init | ||
| 184 | + * @description Initializes plugin | ||
| 185 | + * @param opts [object] "Initialization options" | ||
| 186 | + */ | ||
| 187 | + function _init(opts) { | ||
| 188 | + // Local options | ||
| 189 | + opts = $.extend({}, options, opts || {}); | ||
| 190 | + | ||
| 191 | + // Check for Body | ||
| 192 | + if ($body === null) { | ||
| 193 | + $body = $("body"); | ||
| 194 | + } | ||
| 195 | + | ||
| 196 | + // Apply to each element | ||
| 197 | + var $items = $(this); | ||
| 198 | + for (var i = 0, count = $items.length; i < count; i++) { | ||
| 199 | + _build($items.eq(i), opts); | ||
| 200 | + } | ||
| 201 | + | ||
| 202 | + return $items; | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + /** | ||
| 206 | + * @method private | ||
| 207 | + * @name _build | ||
| 208 | + * @description Builds each instance | ||
| 209 | + * @param $node [jQuery object] "Target jQuery object" | ||
| 210 | + * @param opts [object] <{}> "Options object" | ||
| 211 | + */ | ||
| 212 | + function _build($node, opts) { | ||
| 213 | + if (!$node.hasClass("autocompleter-node")) { | ||
| 214 | + // Extend options | ||
| 215 | + opts = $.extend({}, opts, $node.data("autocompleter-options")); | ||
| 216 | + | ||
| 217 | + var html = '<div class="autocompleter '+opts.customClass.join(' ')+'" id="autocompleter-'+(guid+1)+'">'; | ||
| 218 | + if (opts.hint) { | ||
| 219 | + html += '<div class="autocompleter-hint"></div>'; | ||
| 220 | + } | ||
| 221 | + html += '<ul class="autocompleter-list"></ul>'; | ||
| 222 | + html += '</div>'; | ||
| 223 | + | ||
| 224 | + $node.addClass("autocompleter-node") | ||
| 225 | + .after(html); | ||
| 226 | + | ||
| 227 | + var $autocompleter = $node.next(".autocompleter").eq(0); | ||
| 228 | + | ||
| 229 | + // Set autocomplete to off for warn overlay | ||
| 230 | + var originalAutocomplete = $node.attr("autocomplete"); | ||
| 231 | + $node.attr("autocomplete", "off"); | ||
| 232 | + | ||
| 233 | + // Store plugin data | ||
| 234 | + var data = $.extend({ | ||
| 235 | + $node: $node, | ||
| 236 | + $autocompleter: $autocompleter, | ||
| 237 | + $selected: null, | ||
| 238 | + $list: null, | ||
| 239 | + index: -1, | ||
| 240 | + hintText: false, | ||
| 241 | + source: false, | ||
| 242 | + jqxhr: false, | ||
| 243 | + response: null, | ||
| 244 | + focused: false, | ||
| 245 | + query: '', | ||
| 246 | + originalAutocomplete: originalAutocomplete, | ||
| 247 | + guid: guid++ | ||
| 248 | + }, opts); | ||
| 249 | + | ||
| 250 | + // Bind autocompleter events | ||
| 251 | + data.$autocompleter.on("mousedown.autocompleter", ".autocompleter-item", data, _select) | ||
| 252 | + .data("autocompleter", data); | ||
| 253 | + | ||
| 254 | + // Bind node events | ||
| 255 | + data.$node.on("keyup.autocompleter", data, _onKeyup) | ||
| 256 | + .on("keydown.autocompleter", data, _onKeydownHelper) | ||
| 257 | + .on("focus.autocompleter", data, _onFocus) | ||
| 258 | + .on("blur.autocompleter", data, _onBlur) | ||
| 259 | + .on("mousedown.autocompleter", data, _onMousedown); | ||
| 260 | + } | ||
| 261 | + } | ||
| 262 | + | ||
| 263 | + /** | ||
| 264 | + * @method private | ||
| 265 | + * @name _search | ||
| 266 | + * @description Local search function, return best collation | ||
| 267 | + * @param query [string] "Query string" | ||
| 268 | + * @param source [object] "Source data" | ||
| 269 | + * @param limit [integer] "Results length" | ||
| 270 | + */ | ||
| 271 | + function _search(query, source, limit) { | ||
| 272 | + var response = []; | ||
| 273 | + query = query.toUpperCase(); | ||
| 274 | + | ||
| 275 | + if (source.length) { | ||
| 276 | + for (var i = 0; i < 2; i++) { | ||
| 277 | + for (var item in source) { | ||
| 278 | + if (response.length < limit) { | ||
| 279 | + switch (i) { | ||
| 280 | + case 0: | ||
| 281 | + if (source[item].label.toUpperCase().search(query) === 0) { | ||
| 282 | + response.push(source[item]); | ||
| 283 | + delete source[item]; | ||
| 284 | + } | ||
| 285 | + break; | ||
| 286 | + | ||
| 287 | + case 1: | ||
| 288 | + if (source[item].label.toUpperCase().search(query) !== -1) { | ||
| 289 | + response.push(source[item]); | ||
| 290 | + delete source[item]; | ||
| 291 | + } | ||
| 292 | + break; | ||
| 293 | + } | ||
| 294 | + } | ||
| 295 | + } | ||
| 296 | + } | ||
| 297 | + } | ||
| 298 | + | ||
| 299 | + return response; | ||
| 300 | + } | ||
| 301 | + | ||
| 302 | + /** | ||
| 303 | + * @method private | ||
| 304 | + * @name _launch | ||
| 305 | + * @description Use source locally or create xhr | ||
| 306 | + * @param data [object] "Instance data" | ||
| 307 | + */ | ||
| 308 | + function _launch(data) { | ||
| 309 | + data.query = $.trim(data.$node.val()); | ||
| 310 | + | ||
| 311 | + if (!data.empty && data.query.length === 0) { | ||
| 312 | + _clear(data); | ||
| 313 | + return; | ||
| 314 | + } else { | ||
| 315 | + if (typeof data.source === 'object') { | ||
| 316 | + _clear(data); | ||
| 317 | + | ||
| 318 | + // Local search | ||
| 319 | + var search = _search(data.query, _clone(data.source), data.limit); | ||
| 320 | + if (search.length) { | ||
| 321 | + _response(search, data); | ||
| 322 | + } | ||
| 323 | + } else { | ||
| 324 | + if (data.jqxhr) { | ||
| 325 | + data.jqxhr.abort(); | ||
| 326 | + } | ||
| 327 | + | ||
| 328 | + var ajaxData = $.extend({ | ||
| 329 | + limit: data.limit, | ||
| 330 | + query: data.query | ||
| 331 | + }, data.combine()); | ||
| 332 | + | ||
| 333 | + data.jqxhr = $.ajax({ | ||
| 334 | + url: data.source, | ||
| 335 | + dataType: "json", | ||
| 336 | + data: ajaxData, | ||
| 337 | + beforeSend: function (xhr) { | ||
| 338 | + data.$autocompleter.addClass('autocompleter-ajax'); | ||
| 339 | + _clear(data); | ||
| 340 | + if (data.cache) { | ||
| 341 | + var stored = _getCache(this.url); | ||
| 342 | + if (stored) { | ||
| 343 | + xhr.abort(); | ||
| 344 | + _response(stored, data); | ||
| 345 | + } | ||
| 346 | + } | ||
| 347 | + } | ||
| 348 | + }) | ||
| 349 | + .done(function (response) { | ||
| 350 | + if (data.cache) { | ||
| 351 | + _setCache(this.url, response); | ||
| 352 | + } | ||
| 353 | + _response(response, data); | ||
| 354 | + }) | ||
| 355 | + .always(function () { | ||
| 356 | + data.$autocompleter.removeClass('autocompleter-ajax'); | ||
| 357 | + }); | ||
| 358 | + } | ||
| 359 | + } | ||
| 360 | + } | ||
| 361 | + | ||
| 362 | + /** | ||
| 363 | + * @method private | ||
| 364 | + * @name _clear | ||
| 365 | + * @param data [object] "Instance data" | ||
| 366 | + */ | ||
| 367 | + function _clear(data) { | ||
| 368 | + // Clear data | ||
| 369 | + data.response = null; | ||
| 370 | + data.$list = null; | ||
| 371 | + data.$selected = null; | ||
| 372 | + data.index = 0; | ||
| 373 | + data.$autocompleter.find(".autocompleter-list").empty(); | ||
| 374 | + data.$autocompleter.find('.autocompleter-hint').removeClass('autocompleter-hint-show').empty(); | ||
| 375 | + data.hintText = false; | ||
| 376 | + | ||
| 377 | + _close(null, data); | ||
| 378 | + } | ||
| 379 | + | ||
| 380 | + /** | ||
| 381 | + * @method private | ||
| 382 | + * @name _response | ||
| 383 | + * @description Main source response function | ||
| 384 | + * @param response [object] "Source data" | ||
| 385 | + * @param data [object] "Instance data" | ||
| 386 | + */ | ||
| 387 | + function _response(response, data) { | ||
| 388 | + _buildList(response, data); | ||
| 389 | + | ||
| 390 | + if (data.$autocompleter.hasClass('autocompleter-focus')) { | ||
| 391 | + _open(null, data); | ||
| 392 | + } | ||
| 393 | + } | ||
| 394 | + | ||
| 395 | + /** | ||
| 396 | + * @method private | ||
| 397 | + * @name _buildList | ||
| 398 | + * @description Generate autocompleter-list and update instance data by source | ||
| 399 | + * @param list [object] "Source data" | ||
| 400 | + * @param data [object] "Instance data" | ||
| 401 | + */ | ||
| 402 | + function _buildList(list, data) { | ||
| 403 | + var menu = ''; | ||
| 404 | + | ||
| 405 | + for (var item = 0, count = list.length; item < count; item++) { | ||
| 406 | + var classes = ["autocompleter-item"]; | ||
| 407 | + | ||
| 408 | + if (data.selectFirst && item === 0 && !data.changeWhenSelect) { | ||
| 409 | + classes.push("autocompleter-item-selected"); | ||
| 410 | + } | ||
| 411 | + | ||
| 412 | + var highlightReg = new RegExp(data.query, "gi"); | ||
| 413 | + var label = (data.customLabel && list[item][data.customLabel]) ? list[item][data.customLabel] : list[item].label; | ||
| 414 | + | ||
| 415 | + var clear = label; | ||
| 416 | + | ||
| 417 | + label = data.highlightMatches ? label.replace(highlightReg, "<strong>$&</strong>") : label; | ||
| 418 | + | ||
| 419 | + var value = (data.customValue && list[item][data.customValue]) ? list[item][data.customValue] : list[item].value; | ||
| 420 | + | ||
| 421 | + // Apply custom template | ||
| 422 | + if (data.template) { | ||
| 423 | + var template = data.template.replace(/({{ label }})/gi, label); | ||
| 424 | + | ||
| 425 | + for (var property in list[item]) { | ||
| 426 | + if (list[item].hasOwnProperty(property)) { | ||
| 427 | + var regex = new RegExp('{{ '+ property +' }}', 'gi'); | ||
| 428 | + template = template.replace(regex, list[item][property]); | ||
| 429 | + } | ||
| 430 | + } | ||
| 431 | + | ||
| 432 | + label = template; | ||
| 433 | + } | ||
| 434 | + | ||
| 435 | + if (value) { | ||
| 436 | + menu += '<li data-value="'+value+'" data-label="'+clear+'" class="'+classes.join(' ')+'">'+label+'</li>'; | ||
| 437 | + } else { | ||
| 438 | + menu += '<li data-label="'+clear+'" class="'+classes.join(' ')+'">'+label+'</li>'; | ||
| 439 | + } | ||
| 440 | + } | ||
| 441 | + | ||
| 442 | + // Set hint | ||
| 443 | + if (list.length && data.hint) { | ||
| 444 | + var hint = ( list[0].label.substr(0, data.query.length).toUpperCase() === data.query.toUpperCase() ) ? list[0].label : false; | ||
| 445 | + if (hint && (data.query !== list[0].label)) { | ||
| 446 | + var hintReg = new RegExp(data.query, "i"); | ||
| 447 | + var hintText = hint.replace(hintReg, "<span>"+data.query+"</span>"); | ||
| 448 | + data.$autocompleter.find('.autocompleter-hint').addClass('autocompleter-hint-show').html(hintText); | ||
| 449 | + data.hintText = hintText; | ||
| 450 | + } | ||
| 451 | + } | ||
| 452 | + | ||
| 453 | + // Update data | ||
| 454 | + data.response = list; | ||
| 455 | + data.$autocompleter.find(".autocompleter-list").html(menu); | ||
| 456 | + data.$selected = (data.$autocompleter.find(".autocompleter-item-selected").length) ? data.$autocompleter.find(".autocompleter-item-selected") : null; | ||
| 457 | + data.$list = (list.length) ? data.$autocompleter.find(".autocompleter-item") : null; | ||
| 458 | + data.index = data.$selected ? data.$list.index(data.$selected) : -1; | ||
| 459 | + data.$autocompleter.find(".autocompleter-item").each(function (i, j) { | ||
| 460 | + $(j).data(data.response[i]); | ||
| 461 | + }); | ||
| 462 | + } | ||
| 463 | + | ||
| 464 | + /** | ||
| 465 | + * @method private | ||
| 466 | + * @name _onKeyup | ||
| 467 | + * @description Keyup events in node, up/down autocompleter-list navigation, typing and enter button callbacks | ||
| 468 | + * @param e [object] "Event data" | ||
| 469 | + */ | ||
| 470 | + function _onKeyup(e) { | ||
| 471 | + var data = e.data; | ||
| 472 | + var code = e.keyCode ? e.keyCode : e.which; | ||
| 473 | + | ||
| 474 | + if ( (code === 40 || code === 38) && data.$autocompleter.hasClass('autocompleter-show') ) { | ||
| 475 | + // Arrows up & down | ||
| 476 | + var len = data.$list.length, | ||
| 477 | + next, | ||
| 478 | + prev; | ||
| 479 | + | ||
| 480 | + if (len) { | ||
| 481 | + // Determine new index | ||
| 482 | + if (len > 1) { | ||
| 483 | + if (data.index === len - 1) { | ||
| 484 | + next = data.changeWhenSelect ? -1 : 0; | ||
| 485 | + prev = data.index - 1; | ||
| 486 | + } else if (data.index === 0) { | ||
| 487 | + next = data.index + 1; | ||
| 488 | + prev = data.changeWhenSelect ? -1 : len - 1; | ||
| 489 | + } else if (data.index === -1) { | ||
| 490 | + next = 0; | ||
| 491 | + prev = len - 1; | ||
| 492 | + } else { | ||
| 493 | + next = data.index + 1; | ||
| 494 | + prev = data.index - 1; | ||
| 495 | + } | ||
| 496 | + } else if (data.index === -1) { | ||
| 497 | + next = 0; | ||
| 498 | + prev = 0; | ||
| 499 | + } else { | ||
| 500 | + prev = -1; | ||
| 501 | + next = -1; | ||
| 502 | + } | ||
| 503 | + data.index = (code === 40) ? next : prev; | ||
| 504 | + | ||
| 505 | + // Update HTML | ||
| 506 | + data.$list.removeClass("autocompleter-item-selected"); | ||
| 507 | + if (data.index !== -1) { | ||
| 508 | + data.$list.eq(data.index).addClass("autocompleter-item-selected"); | ||
| 509 | + } | ||
| 510 | + data.$selected = data.$autocompleter.find(".autocompleter-item-selected").length ? data.$autocompleter.find(".autocompleter-item-selected") : null; | ||
| 511 | + if (data.changeWhenSelect) { | ||
| 512 | + _setValue(data); | ||
| 513 | + } | ||
| 514 | + } | ||
| 515 | + } else if ($.inArray(code, ignoredKeyCode) === -1 && $.inArray(code, data.ignoredKeyCode) === -1) { | ||
| 516 | + // Typing | ||
| 517 | + _launch(data); | ||
| 518 | + } | ||
| 519 | + } | ||
| 520 | + | ||
| 521 | + /** | ||
| 522 | + * @method private | ||
| 523 | + * @name _onKeydownHelper | ||
| 524 | + * @description Keydown events in node, up/down for prevent cursor moving and right arrow for hint | ||
| 525 | + * @param e [object] "Event data" | ||
| 526 | + */ | ||
| 527 | + function _onKeydownHelper(e) { | ||
| 528 | + var code = e.keyCode ? e.keyCode : e.which; | ||
| 529 | + var data = e.data; | ||
| 530 | + | ||
| 531 | + if (code === 40 || code === 38 ) { | ||
| 532 | + e.preventDefault(); | ||
| 533 | + e.stopPropagation(); | ||
| 534 | + } else if (code === 39) { | ||
| 535 | + // Right arrow | ||
| 536 | + if (data.hint && data.hintText && data.$autocompleter.find('.autocompleter-hint').hasClass('autocompleter-hint-show')) { | ||
| 537 | + e.preventDefault(); | ||
| 538 | + e.stopPropagation(); | ||
| 539 | + | ||
| 540 | + var hintOrigin = data.$autocompleter.find(".autocompleter-item").length ? data.$autocompleter.find(".autocompleter-item").eq(0).attr('data-label') : false; | ||
| 541 | + if (hintOrigin) { | ||
| 542 | + data.query = hintOrigin; | ||
| 543 | + _setHint(data); | ||
| 544 | + } | ||
| 545 | + } | ||
| 546 | + } else if (code === 13) { | ||
| 547 | + // Enter | ||
| 548 | + if (data.$autocompleter.hasClass('autocompleter-show') && data.$selected) { | ||
| 549 | + _select(e); | ||
| 550 | + } | ||
| 551 | + } | ||
| 552 | + } | ||
| 553 | + | ||
| 554 | + /** | ||
| 555 | + * @method private | ||
| 556 | + * @name _onFocus | ||
| 557 | + * @description Handles instance focus | ||
| 558 | + * @param e [object] "Event data" | ||
| 559 | + * @param internal [boolean] "Called by plugin" | ||
| 560 | + */ | ||
| 561 | + function _onFocus(e, internal) { | ||
| 562 | + if (!internal) { | ||
| 563 | + var data = e.data; | ||
| 564 | + | ||
| 565 | + data.$autocompleter.addClass("autocompleter-focus"); | ||
| 566 | + | ||
| 567 | + if (!data.$node.prop("disabled") && !data.$autocompleter.hasClass('autocompleter-show')) { | ||
| 568 | + if (data.focusOpen) { | ||
| 569 | + _launch(data); | ||
| 570 | + data.focused = true; | ||
| 571 | + setTimeout(function () { | ||
| 572 | + data.focused = false; | ||
| 573 | + }, 500); | ||
| 574 | + } | ||
| 575 | + } | ||
| 576 | + } | ||
| 577 | + } | ||
| 578 | + | ||
| 579 | + /** | ||
| 580 | + * @method private | ||
| 581 | + * @name _onBlur | ||
| 582 | + * @description Handles instance blur | ||
| 583 | + * @param e [object] "Event data" | ||
| 584 | + * @param internal [boolean] "Called by plugin" | ||
| 585 | + */ | ||
| 586 | + function _onBlur(e, internal) { | ||
| 587 | + e.preventDefault(); | ||
| 588 | + e.stopPropagation(); | ||
| 589 | + | ||
| 590 | + var data = e.data; | ||
| 591 | + | ||
| 592 | + if (!internal) { | ||
| 593 | + data.$autocompleter.removeClass("autocompleter-focus"); | ||
| 594 | + _close(e); | ||
| 595 | + } | ||
| 596 | + } | ||
| 597 | + | ||
| 598 | + /** | ||
| 599 | + * @method private | ||
| 600 | + * @name _onMousedown | ||
| 601 | + * @description Handles mousedown to node | ||
| 602 | + * @param e [object] "Event data" | ||
| 603 | + */ | ||
| 604 | + function _onMousedown(e) { | ||
| 605 | + // Disable middle & right mouse click | ||
| 606 | + if (e.type === "mousedown" && $.inArray(e.which, [2, 3]) !== -1) { return; } | ||
| 607 | + | ||
| 608 | + var data = e.data; | ||
| 609 | + if (data.$list && !data.focused) { | ||
| 610 | + if (!data.$node.is(":disabled")) { | ||
| 611 | + if (isMobile && !isFirefoxMobile) { | ||
| 612 | + var el = data.$select[0]; | ||
| 613 | + if (window.document.createEvent) { // All | ||
| 614 | + var evt = window.document.createEvent("MouseEvents"); | ||
| 615 | + evt.initMouseEvent("mousedown", false, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); | ||
| 616 | + el.dispatchEvent(evt); | ||
| 617 | + } else if (el.fireEvent) { // IE | ||
| 618 | + el.fireEvent("onmousedown"); | ||
| 619 | + } | ||
| 620 | + } else { | ||
| 621 | + // Delegate intent | ||
| 622 | + if (data.$autocompleter.hasClass("autocompleter-closed")) { | ||
| 623 | + _open(e); | ||
| 624 | + } else if (data.$autocompleter.hasClass("autocompleter-show")) { | ||
| 625 | + _close(e); | ||
| 626 | + } | ||
| 627 | + } | ||
| 628 | + } | ||
| 629 | + } | ||
| 630 | + } | ||
| 631 | + | ||
| 632 | + /** | ||
| 633 | + * @method private | ||
| 634 | + * @name _open | ||
| 635 | + * @description Opens option set | ||
| 636 | + * @param e [object] "Event data" | ||
| 637 | + * @param instanceData [object] "Instance data" | ||
| 638 | + */ | ||
| 639 | + function _open(e, instanceData) { | ||
| 640 | + var data = e ? e.data : instanceData; | ||
| 641 | + | ||
| 642 | + if (!data.$node.prop("disabled") && !data.$autocompleter.hasClass("autocompleter-show") && data.$list && data.$list.length ) { | ||
| 643 | + data.$autocompleter.removeClass("autocompleter-closed").addClass("autocompleter-show"); | ||
| 644 | + $body.on("click.autocompleter-" + data.guid, ":not(.autocompleter-item)", data, _closeHelper); | ||
| 645 | + } | ||
| 646 | + } | ||
| 647 | + | ||
| 648 | + /** | ||
| 649 | + * @method private | ||
| 650 | + * @name _closeHelper | ||
| 651 | + * @description Determines if event target is outside instance before closing | ||
| 652 | + * @param e [object] "Event data" | ||
| 653 | + */ | ||
| 654 | + function _closeHelper(e) { | ||
| 655 | + if ( $(e.target).hasClass('autocompleter-node') ) { | ||
| 656 | + return; | ||
| 657 | + } | ||
| 658 | + | ||
| 659 | + if ($(e.currentTarget).parents(".autocompleter").length === 0) { | ||
| 660 | + _close(e); | ||
| 661 | + } | ||
| 662 | + } | ||
| 663 | + | ||
| 664 | + /** | ||
| 665 | + * @method private | ||
| 666 | + * @name _close | ||
| 667 | + * @description Closes option set | ||
| 668 | + * @param e [object] "Event data" | ||
| 669 | + * @param instanceData [object] "Instance data" | ||
| 670 | + */ | ||
| 671 | + function _close(e, instanceData) { | ||
| 672 | + var data = e ? e.data : instanceData; | ||
| 673 | + | ||
| 674 | + if (data.$autocompleter.hasClass("autocompleter-show")) { | ||
| 675 | + data.$autocompleter.removeClass("autocompleter-show").addClass("autocompleter-closed"); | ||
| 676 | + $body.off(".autocompleter-" + data.guid); | ||
| 677 | + } | ||
| 678 | + } | ||
| 679 | + | ||
| 680 | + /** | ||
| 681 | + * @method private | ||
| 682 | + * @name _select | ||
| 683 | + * @description Select item from .autocompleter-list | ||
| 684 | + * @param e [object] "Event data" | ||
| 685 | + */ | ||
| 686 | + function _select(e) { | ||
| 687 | + // Disable middle & right mouse click | ||
| 688 | + if (e.type === "mousedown" && $.inArray(e.which, [2, 3]) !== -1) { return; } | ||
| 689 | + | ||
| 690 | + var data = e.data; | ||
| 691 | + | ||
| 692 | + e.preventDefault(); | ||
| 693 | + e.stopPropagation(); | ||
| 694 | + | ||
| 695 | + if (e.type === "mousedown" && $(this).length) { | ||
| 696 | + data.$selected = $(this); | ||
| 697 | + data.index = data.$list.index(data.$selected); | ||
| 698 | + } | ||
| 699 | + | ||
| 700 | + if (!data.$node.prop("disabled")) { | ||
| 701 | + _close(e); | ||
| 702 | + _update(data); | ||
| 703 | + | ||
| 704 | + if (e.type === "click") { | ||
| 705 | + data.$node.trigger("focus", [true]); | ||
| 706 | + } | ||
| 707 | + } | ||
| 708 | + } | ||
| 709 | + | ||
| 710 | + /** | ||
| 711 | + * @method private | ||
| 712 | + * @name _setHint | ||
| 713 | + * @description Set autocompleter by hint | ||
| 714 | + * @param data [object] "Instance data" | ||
| 715 | + */ | ||
| 716 | + function _setHint(data) { | ||
| 717 | + _setValue(data); | ||
| 718 | + _handleChange(data); | ||
| 719 | + _launch(data); | ||
| 720 | + } | ||
| 721 | + | ||
| 722 | + /** | ||
| 723 | + * @method private | ||
| 724 | + * @name _setValue | ||
| 725 | + * @description Set value for native field | ||
| 726 | + * @param data [object] "Instance data" | ||
| 727 | + */ | ||
| 728 | + function _setValue(data) { | ||
| 729 | + if (data.$selected) { | ||
| 730 | + if (data.hintText && data.$autocompleter.find('.autocompleter-hint').hasClass('autocompleter-hint-show')) { | ||
| 731 | + data.$autocompleter.find('.autocompleter-hint').removeClass('autocompleter-hint-show'); | ||
| 732 | + } | ||
| 733 | + var value = data.$selected.attr('data-value') ? data.$selected.attr('data-value') : data.$selected.attr('data-label'); | ||
| 734 | + data.$node.val(value); | ||
| 735 | + } else { | ||
| 736 | + if (data.hintText && !data.$autocompleter.find('.autocompleter-hint').hasClass('autocompleter-hint-show')) { | ||
| 737 | + data.$autocompleter.find('.autocompleter-hint').addClass('autocompleter-hint-show'); | ||
| 738 | + } | ||
| 739 | + data.$node.val(data.query); | ||
| 740 | + } | ||
| 741 | + } | ||
| 742 | + | ||
| 743 | + /** | ||
| 744 | + * @method private | ||
| 745 | + * @name _update | ||
| 746 | + * @param data [object] "Instance data" | ||
| 747 | + */ | ||
| 748 | + function _update(data) { | ||
| 749 | + _setValue(data); | ||
| 750 | + _handleChange(data); | ||
| 751 | + _clear(data); | ||
| 752 | + } | ||
| 753 | + | ||
| 754 | + /** | ||
| 755 | + * @method private | ||
| 756 | + * @name _handleChange | ||
| 757 | + * @description Trigger node change event and call the callback function | ||
| 758 | + * @param data [object] "Instance data" | ||
| 759 | + */ | ||
| 760 | + function _handleChange(data) { | ||
| 761 | + data.callback.call(data.$autocompleter, data.$node.val(), data.index, data.response[data.index]); | ||
| 762 | + data.$node.trigger("change"); | ||
| 763 | + } | ||
| 764 | + | ||
| 765 | + /** | ||
| 766 | + * @method private | ||
| 767 | + * @name _getCache | ||
| 768 | + * @description Store AJAX response in plugin cache | ||
| 769 | + * @param url [string] "AJAX get query string" | ||
| 770 | + * @param data [object] "AJAX response data" | ||
| 771 | + */ | ||
| 772 | + function _setCache(url, data) { | ||
| 773 | + if (!supportLocalStorage) { return; } | ||
| 774 | + if (url && data) { | ||
| 775 | + cache[url] = { | ||
| 776 | + value: data | ||
| 777 | + }; | ||
| 778 | + | ||
| 779 | + // Proccess to localStorage | ||
| 780 | + try { | ||
| 781 | + localStorage.setItem(localStorageKey, JSON.stringify(cache)); | ||
| 782 | + } catch (e) { | ||
| 783 | + var code = e.code || e.number || e.message; | ||
| 784 | + if (code === 22) { | ||
| 785 | + _deleteCache(); | ||
| 786 | + } else { | ||
| 787 | + throw(e); | ||
| 788 | + } | ||
| 789 | + } | ||
| 790 | + } | ||
| 791 | + } | ||
| 792 | + | ||
| 793 | + /** | ||
| 794 | + * @method private | ||
| 795 | + * @name _getCache | ||
| 796 | + * @description Get cached data by url if exist | ||
| 797 | + * @param url [string] "AJAX get query string" | ||
| 798 | + */ | ||
| 799 | + function _getCache(url) { | ||
| 800 | + if (!url) { return; } | ||
| 801 | + var response = (cache[url] && cache[url].value) ? cache[url].value : false; | ||
| 802 | + return response; | ||
| 803 | + } | ||
| 804 | + | ||
| 805 | + /** | ||
| 806 | + * @method private | ||
| 807 | + * @name _loadCache | ||
| 808 | + * @description Load all plugin cache from localStorage | ||
| 809 | + */ | ||
| 810 | + function _loadCache() { | ||
| 811 | + if (!supportLocalStorage) { return; } | ||
| 812 | + var json = localStorage.getItem(localStorageKey) || '{}'; | ||
| 813 | + return JSON.parse(json); | ||
| 814 | + } | ||
| 815 | + | ||
| 816 | + /** | ||
| 817 | + * @method private | ||
| 818 | + * @name _deleteCache | ||
| 819 | + * @description Delete all plugin cache from localStorage | ||
| 820 | + */ | ||
| 821 | + function _deleteCache() { | ||
| 822 | + try { | ||
| 823 | + localStorage.removeItem(localStorageKey); | ||
| 824 | + cache = _loadCache(); | ||
| 825 | + } catch (e) { | ||
| 826 | + throw(e); | ||
| 827 | + } | ||
| 828 | + } | ||
| 829 | + | ||
| 830 | + /** | ||
| 831 | + * @method private | ||
| 832 | + * @name _clone | ||
| 833 | + * @description Clone JavaScript object | ||
| 834 | + */ | ||
| 835 | + function _clone(obj) { | ||
| 836 | + if (null === obj || "object" !== typeof obj) { | ||
| 837 | + return obj; | ||
| 838 | + } | ||
| 839 | + var copy = obj.constructor(); | ||
| 840 | + for (var attr in obj) { | ||
| 841 | + if (obj.hasOwnProperty(attr)) { | ||
| 842 | + copy[attr] = obj[attr]; | ||
| 843 | + } | ||
| 844 | + } | ||
| 845 | + return copy; | ||
| 846 | + } | ||
| 847 | + | ||
| 848 | + // Load cache | ||
| 849 | + var cache = _loadCache(); | ||
| 850 | + | ||
| 851 | + $.fn.autocompleter = function (method) { | ||
| 852 | + if (publics[method]) { | ||
| 853 | + return publics[method].apply(this, Array.prototype.slice.call(arguments, 1)); | ||
| 854 | + } else if (typeof method === 'object' || !method) { | ||
| 855 | + return _init.apply(this, arguments); | ||
| 856 | + } | ||
| 857 | + return this; | ||
| 858 | + }; | ||
| 859 | + | ||
| 860 | + $.autocompleter = function (method) { | ||
| 861 | + if (method === "defaults") { | ||
| 862 | + publics.defaults.apply(this, Array.prototype.slice.call(arguments, 1)); | ||
| 863 | + } else if (method === "clearCache") { | ||
| 864 | + publics.clearCache.apply(this, null); | ||
| 865 | + } | ||
| 866 | + }; | ||
| 867 | +})(jQuery, window); |
src/main/resources/static/pages/control/lineallot_v3/js/jquery.base64.js
0 → 100644
| 1 | +(function ($) { | ||
| 2 | + $.base64 = function (options) { | ||
| 3 | + var defaults = { | ||
| 4 | + data: "", | ||
| 5 | + type: 0, | ||
| 6 | + unicode: true | ||
| 7 | + }; | ||
| 8 | + var opts = $.extend(defaults, options); | ||
| 9 | + var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; | ||
| 10 | + UnicodeChr = function () { | ||
| 11 | + return '00A4,00A7,00A8,00B0,00B1,00B7,00D7,00E0,00E1,00E8,00E9,00EA,00EC,00ED,00F2,00F3,00F7,00F9,00FA,00FC,0101,0113,011B,012B,014D,016B,01CE,01D0,01D2,01D4,01D6,01D8,01DA,01DC,02C7,02C9,0391,0392,0393,0394,0395,0396,0397,0398,0399,039A,039B,039C,039D,039E,039F,03A0,03A1,03A3,03A4,03A5,03A6,03A7,03A8,03A9,03B1,03B2,03B3,03B4,03B5,03B6,03B7,03B8,03B9,03BA,03BB,03BC,03BD,03BE,03BF,03C0,03C1,03C3,03C4,03C5,03C6,03C7,03C8,03C9,0401,0410,0411,0412,0413,0414,0415,0416,0417,0418,0419,041A,041B,041C,041D,041E,041F,0420,0421,0422,0423,0424,0425,0426,0427,0428,0429,042A,042B,042C,042D,042E,042F,0430,0431,0432,0433,0434,0435,0436,0437,0438,0439,043A,043B,043C,043D,043E,043F,0440,0441,0442,0443,0444,0445,0446,0447,0448,0449,044A,044B,044C,044D,044E,044F,0451,2014,2016,2018,2019,201C,201D,2026,2030,2032,2033,203B,2103,2116,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,216A,216B,2190,2191,2192,2193,2208,220F,2211,221A,221D,221E,2220,2225,2227,2228,2229,222A,222B,222E,2234,2235,2236,2237,223D,2248,224C,2260,2261,2264,2265,226E,226F,2299,22A5,2312,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2474,2475,2476,2477,2478,2479,247A,247B,247C,247D,247E,247F,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,248A,248B,248C,248D,248E,248F,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,249A,249B,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,250A,250B,250C,250D,250E,250F,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,251A,251B,251C,251D,251E,251F,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,252A,252B,252C,252D,252E,252F,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,253A,253B,253C,253D,253E,253F,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,254A,254B,25A0,25A1,25B2,25B3,25C6,25C7,25CB,25CE,25CF,2605,2606,2640,2642,3000,3001,3002,3003,3005,3008,3009,300A,300B,300C,300D,300E,300F,3010,3011,3013,3014,3015,3016,3017,3041,3042,3043,3044,3045,3046,3047,3048,3049,304A,304B,304C,304D,304E,304F,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,305A,305B,305C,305D,305E,305F,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,306A,306B,306C,306D,306E,306F,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,307A,307B,307C,307D,307E,307F,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,308A,308B,308C,308D,308E,308F,3090,3091,3092,3093,30A1,30A2,30A3,30A4,30A5,30A6,30A7,30A8,30A9,30AA,30AB,30AC,30AD,30AE,30AF,30B0,30B1,30B2,30B3,30B4,30B5,30B6,30B7,30B8,30B9,30BA,30BB,30BC,30BD,30BE,30BF,30C0,30C1,30C2,30C3,30C4,30C5,30C6,30C7,30C8,30C9,30CA,30CB,30CC,30CD,30CE,30CF,30D0,30D1,30D2,30D3,30D4,30D5,30D6,30D7,30D8,30D9,30DA,30DB,30DC,30DD,30DE,30DF,30E0,30E1,30E2,30E3,30E4,30E5,30E6,30E7,30E8,30E9,30EA,30EB,30EC,30ED,30EE,30EF,30F0,30F1,30F2,30F3,30F4,30F5,30F6,3105,3106,3107,3108,3109,310A,310B,310C,310D,310E,310F,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,311A,311B,311C,311D,311E,311F,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,4E00,4E01,4E03,4E07,4E08,4E09,4E0A,4E0B,4E0C,4E0D,4E0E,4E10,4E11,4E13,4E14,4E15,4E16,4E18,4E19,4E1A,4E1B,4E1C,4E1D,4E1E,4E22,4E24,4E25,4E27,4E28,4E2A,4E2B,4E2C,4E2D,4E30,4E32,4E34,4E36,4E38,4E39,4E3A,4E3B,4E3D,4E3E,4E3F,4E43,4E45,4E47,4E48,4E49,4E4B,4E4C,4E4D,4E4E,4E4F,4E50,4E52,4E53,4E54,4E56,4E58,4E59,4E5C,4E5D,4E5E,4E5F,4E60,4E61,4E66,4E69,4E70,4E71,4E73,4E7E,4E86,4E88,4E89,4E8B,4E8C,4E8D,4E8E,4E8F,4E91,4E92,4E93,4E94,4E95,4E98,4E9A,4E9B,4E9F,4EA0,4EA1,4EA2,4EA4,4EA5,4EA6,4EA7,4EA8,4EA9,4EAB,4EAC,4EAD,4EAE,4EB2,4EB3,4EB5,4EBA,4EBB,4EBF,4EC0,4EC1,4EC2,4EC3,4EC4,4EC5,4EC6,4EC7,4EC9,4ECA,4ECB,4ECD,4ECE,4ED1,4ED3,4ED4,4ED5,4ED6,4ED7,4ED8,4ED9,4EDD,4EDE,4EDF,4EE1,4EE3,4EE4,4EE5,4EE8,4EEA,4EEB,4EEC,4EF0,4EF2,4EF3,4EF5,4EF6,4EF7,4EFB,4EFD,4EFF,4F01,4F09,4F0A,4F0D,4F0E,4F0F,4F10,4F11,4F17,4F18,4F19,4F1A,4F1B,4F1E,4F1F,4F20,4F22,4F24,4F25,4F26,4F27,4F2A,4F2B,4F2F,4F30,4F32,4F34,4F36,4F38,4F3A,4F3C,4F3D,4F43,4F46,4F4D,4F4E,4F4F,4F50,4F51,4F53,4F55,4F57,4F58,4F59,4F5A,4F5B,4F5C,4F5D,4F5E,4F5F,4F60,4F63,4F64,4F65,4F67,4F69,4F6C,4F6F,4F70,4F73,4F74,4F76,4F7B,4F7C,4F7E,4F7F,4F83,4F84,4F88,4F89,4F8B,4F8D,4F8F,4F91,4F94,4F97,4F9B,4F9D,4FA0,4FA3,4FA5,4FA6,4FA7,4FA8,4FA9,4FAA,4FAC,4FAE,4FAF,4FB5,4FBF,4FC3,4FC4,4FC5,4FCA,4FCE,4FCF,4FD0,4FD1,4FD7,4FD8,4FDA,4FDC,4FDD,4FDE,4FDF,4FE1,4FE3,4FE6,4FE8,4FE9,4FEA,4FED,4FEE,4FEF,4FF1,4FF3,4FF8,4FFA,4FFE,500C,500D,500F,5012,5014,5018,5019,501A,501C,501F,5021,5025,5026,5028,5029,502A,502C,502D,502E,503A,503C,503E,5043,5047,5048,504C,504E,504F,5055,505A,505C,5065,506C,5076,5077,507B,507E,507F,5080,5085,5088,508D,50A3,50A5,50A7,50A8,50A9,50AC,50B2,50BA,50BB,50CF,50D6,50DA,50E6,50E7,50EC,50ED,50EE,50F3,50F5,50FB,5106,5107,510B,5112,5121,513F,5140,5141,5143,5144,5145,5146,5148,5149,514B,514D,5151,5154,5155,5156,515A,515C,5162,5165,5168,516B,516C,516D,516E,5170,5171,5173,5174,5175,5176,5177,5178,5179,517B,517C,517D,5180,5181,5182,5185,5188,5189,518C,518D,5192,5195,5196,5197,5199,519B,519C,51A0,51A2,51A4,51A5,51AB,51AC,51AF,51B0,51B1,51B2,51B3,51B5,51B6,51B7,51BB,51BC,51BD,51C0,51C4,51C6,51C7,51C9,51CB,51CC,51CF,51D1,51DB,51DD,51E0,51E1,51E4,51EB,51ED,51EF,51F0,51F3,51F5,51F6,51F8,51F9,51FA,51FB,51FC,51FD,51FF,5200,5201,5202,5203,5206,5207,5208,520A,520D,520E,5211,5212,5216,5217,5218,5219,521A,521B,521D,5220,5224,5228,5229,522B,522D,522E,5230,5233,5236,5237,5238,5239,523A,523B,523D,523F,5240,5241,5242,5243,524A,524C,524D,5250,5251,5254,5256,525C,525E,5261,5265,5267,5269,526A,526F,5272,527D,527F,5281,5282,5288,5290,5293,529B,529D,529E,529F,52A0,52A1,52A2,52A3,52A8,52A9,52AA,52AB,52AC,52AD,52B1,52B2,52B3,52BE,52BF,52C3,52C7,52C9,52CB,52D0,52D2,52D6,52D8,52DF,52E4,52F0,52F9,52FA,52FE,52FF,5300,5305,5306,5308,530D,530F,5310,5315,5316,5317,5319,531A,531D,5320,5321,5323,5326,532A,532E,5339,533A,533B,533E,533F,5341,5343,5345,5347,5348,5349,534A,534E,534F,5351,5352,5353,5355,5356,5357,535A,535C,535E,535F,5360,5361,5362,5363,5364,5366,5367,5369,536B,536E,536F,5370,5371,5373,5374,5375,5377,5378,537A,537F,5382,5384,5385,5386,5389,538B,538C,538D,5395,5398,539A,539D,539F,53A2,53A3,53A5,53A6,53A8,53A9,53AE,53B6,53BB,53BF,53C1,53C2,53C8,53C9,53CA,53CB,53CC,53CD,53D1,53D4,53D6,53D7,53D8,53D9,53DB,53DF,53E0,53E3,53E4,53E5,53E6,53E8,53E9,53EA,53EB,53EC,53ED,53EE,53EF,53F0,53F1,53F2,53F3,53F5,53F6,53F7,53F8,53F9,53FB,53FC,53FD,5401,5403,5404,5406,5408,5409,540A,540C,540D,540E,540F,5410,5411,5412,5413,5415,5416,5417,541B,541D,541E,541F,5420,5421,5423,5426,5427,5428,5429,542B,542C,542D,542E,542F,5431,5432,5434,5435,5438,5439,543B,543C,543E,5440,5443,5446,5448,544A,544B,5450,5452,5453,5454,5455,5456,5457,5458,5459,545B,545C,5462,5464,5466,5468,5471,5472,5473,5475,5476,5477,5478,547B,547C,547D,5480,5482,5484,5486,548B,548C,548E,548F,5490,5492,5494,5495,5496,5499,549A,549B,549D,54A3,54A4,54A6,54A7,54A8,54A9,54AA,54AB,54AC,54AD,54AF,54B1,54B3,54B4,54B8,54BB,54BD,54BF,54C0,54C1,54C2,54C4,54C6,54C7,54C8,54C9,54CC,54CD,54CE,54CF,54D0,54D1,54D2,54D3,54D4,54D5,54D7,54D9,54DA,54DC,54DD,54DE,54DF,54E5,54E6,54E7,54E8,54E9,54EA,54ED,54EE,54F2,54F3,54FA,54FC,54FD,54FF,5501,5506,5507,5509,550F,5510,5511,5514,551B,5520,5522,5523,5524,5527,552A,552C,552E,552F,5530,5531,5533,5537,553C,553E,553F,5541,5543,5544,5546,5549,554A,5550,5555,5556,555C,5561,5564,5565,5566,5567,556A,556C,556D,556E,5575,5576,5577,5578,557B,557C,557E,5580,5581,5582,5583,5584,5587,5588,5589,558A,558B,558F,5591,5594,5598,5599,559C,559D,559F,55A7,55B1,55B3,55B5,55B7,55B9,55BB,55BD,55BE,55C4,55C5,55C9,55CC,55CD,55D1,55D2,55D3,55D4,55D6,55DC,55DD,55DF,55E1,55E3,55E4,55E5,55E6,55E8,55EA,55EB,55EC,55EF,55F2,55F3,55F5,55F7,55FD,55FE,5600,5601,5608,5609,560C,560E,560F,5618,561B,561E,561F,5623,5624,5627,562C,562D,5631,5632,5634,5636,5639,563B,563F,564C,564D,564E,5654,5657,5658,5659,565C,5662,5664,5668,5669,566A,566B,566C,5671,5676,567B,567C,5685,5686,568E,568F,5693,56A3,56AF,56B7,56BC,56CA,56D4,56D7,56DA,56DB,56DD,56DE,56DF,56E0,56E1,56E2,56E4,56EB,56ED,56F0,56F1,56F4,56F5,56F9,56FA,56FD,56FE,56FF,5703,5704,5706,5708,5709,570A,571C,571F,5723,5728,5729,572A,572C,572D,572E,572F,5730,5733,5739,573A,573B,573E,5740,5742,5747,574A,574C,574D,574E,574F,5750,5751,5757,575A,575B,575C,575D,575E,575F,5760,5761,5764,5766,5768,5769,576A,576B,576D,576F,5773,5776,5777,577B,577C,5782,5783,5784,5785,5786,578B,578C,5792,5793,579B,57A0,57A1,57A2,57A3,57A4,57A6,57A7,57A9,57AB,57AD,57AE,57B2,57B4,57B8,57C2,57C3,57CB,57CE,57CF,57D2,57D4,57D5,57D8,57D9,57DA,57DD,57DF,57E0,57E4,57ED,57EF,57F4,57F8,57F9,57FA,57FD,5800,5802,5806,5807,580B,580D,5811,5815,5819,581E,5820,5821,5824,582A,5830,5835,5844,584C,584D,5851,5854,5858,585E,5865,586B,586C,587E,5880,5881,5883,5885,5889,5892,5893,5899,589A,589E,589F,58A8,58A9,58BC,58C1,58C5,58D1,58D5,58E4,58EB,58EC,58EE,58F0,58F3,58F6,58F9,5902,5904,5907,590D,590F,5914,5915,5916,5919,591A,591C,591F,5924,5925,5927,5929,592A,592B,592D,592E,592F,5931,5934,5937,5938,5939,593A,593C,5941,5942,5944,5947,5948,5949,594B,594E,594F,5951,5954,5955,5956,5957,5958,595A,5960,5962,5965,5973,5974,5976,5978,5979,597D,5981,5982,5983,5984,5986,5987,5988,598A,598D,5992,5993,5996,5997,5999,599E,59A3,59A4,59A5,59A8,59A9,59AA,59AB,59AE,59AF,59B2,59B9,59BB,59BE,59C6,59CA,59CB,59D0,59D1,59D2,59D3,59D4,59D7,59D8,59DA,59DC,59DD,59E3,59E5,59E8,59EC,59F9,59FB,59FF,5A01,5A03,5A04,5A05,5A06,5A07,5A08,5A09,5A0C,5A11,5A13,5A18,5A1C,5A1F,5A20,5A23,5A25,5A29,5A31,5A32,5A34,5A36,5A3C,5A40,5A46,5A49,5A4A,5A55,5A5A,5A62,5A67,5A6A,5A74,5A75,5A76,5A77,5A7A,5A7F,5A92,5A9A,5A9B,5AAA,5AB2,5AB3,5AB5,5AB8,5ABE,5AC1,5AC2,5AC9,5ACC,5AD2,5AD4,5AD6,5AD8,5ADC,5AE0,5AE1,5AE3,5AE6,5AE9,5AEB,5AF1,5B09,5B16,5B17,5B32,5B34,5B37,5B40,5B50,5B51,5B53,5B54,5B55,5B57,5B58,5B59,5B5A,5B5B,5B5C,5B5D,5B5F,5B62,5B63,5B64,5B65,5B66,5B69,5B6A,5B6C,5B70,5B71,5B73,5B75,5B7A,5B7D,5B80,5B81,5B83,5B84,5B85,5B87,5B88,5B89,5B8B,5B8C,5B8F,5B93,5B95,5B97,5B98,5B99,5B9A,5B9B,5B9C,5B9D,5B9E,5BA0,5BA1,5BA2,5BA3,5BA4,5BA5,5BA6,5BAA,5BAB,5BB0,5BB3,5BB4,5BB5,5BB6,5BB8,5BB9,5BBD,5BBE,5BBF,5BC2,5BC4,5BC5,5BC6,5BC7,5BCC,5BD0,5BD2,5BD3,5BDD,5BDE,5BDF,5BE1,5BE4,5BE5,5BE8,5BEE,5BF0,5BF8,5BF9,5BFA,5BFB,5BFC,5BFF,5C01,5C04,5C06,5C09,5C0A,5C0F,5C11,5C14,5C15,5C16,5C18,5C1A,5C1C,5C1D,5C22,5C24,5C25,5C27,5C2C,5C31,5C34,5C38,5C39,5C3A,5C3B,5C3C,5C3D,5C3E,5C3F,5C40,5C41,5C42,5C45,5C48,5C49,5C4A,5C4B,5C4E,5C4F,5C50,5C51,5C55,5C59,5C5E,5C60,5C61,5C63,5C65,5C66,5C6E,5C6F,5C71,5C79,5C7A,5C7F,5C81,5C82,5C88,5C8C,5C8D,5C90,5C91,5C94,5C96,5C97,5C98,5C99,5C9A,5C9B,5C9C,5CA2,5CA3,5CA9,5CAB,5CAC,5CAD,5CB1,5CB3,5CB5,5CB7,5CB8,5CBD,5CBF,5CC1,5CC4,5CCB,5CD2,5CD9,5CE1,5CE4,5CE5,5CE6,5CE8,5CEA,5CED,5CF0,5CFB,5D02,5D03,5D06,5D07,5D0E,5D14,5D16,5D1B,5D1E,5D24,5D26,5D27,5D29,5D2D,5D2E,5D34,5D3D,5D3E,5D47,5D4A,5D4B,5D4C,5D58,5D5B,5D5D,5D69,5D6B,5D6C,5D6F,5D74,5D82,5D99,5D9D,5DB7,5DC5,5DCD,5DDB,5DDD,5DDE,5DE1,5DE2,5DE5,5DE6,5DE7,5DE8,5DE9,5DEB,5DEE,5DEF,5DF1,5DF2,5DF3,5DF4,5DF7,5DFD,5DFE,5E01,5E02,5E03,5E05,5E06,5E08,5E0C,5E0F,5E10,5E11,5E14,5E15,5E16,5E18,5E19,5E1A,5E1B,5E1C,5E1D,5E26,5E27,5E2D,5E2E,5E31,5E37,5E38,5E3B,5E3C,5E3D,5E42,5E44,5E45,5E4C,5E54,5E55,5E5B,5E5E,5E61,5E62,5E72,5E73,5E74,5E76,5E78,5E7A,5E7B,5E7C,5E7D,5E7F,5E80,5E84,5E86,5E87,5E8A,5E8B,5E8F,5E90,5E91,5E93,5E94,5E95,5E96,5E97,5E99,5E9A,5E9C,5E9E,5E9F,5EA0,5EA5,5EA6,5EA7,5EAD,5EB3,5EB5,5EB6,5EB7,5EB8,5EB9,5EBE,5EC9,5ECA,5ED1,5ED2,5ED3,5ED6,5EDB,5EE8,5EEA,5EF4,5EF6,5EF7,5EFA,5EFE,5EFF,5F00,5F01,5F02,5F03,5F04,5F08,5F0A,5F0B,5F0F,5F11,5F13,5F15,5F17,5F18,5F1B,5F1F,5F20,5F25,5F26,5F27,5F29,5F2A,5F2D,5F2F,5F31,5F39,5F3A,5F3C,5F40,5F50,5F52,5F53,5F55,5F56,5F57,5F58,5F5D,5F61,5F62,5F64,5F66,5F69,5F6A,5F6C,5F6D,5F70,5F71,5F73,5F77,5F79,5F7B,5F7C,5F80,5F81,5F82,5F84,5F85,5F87,5F88,5F89,5F8A,5F8B,5F8C,5F90,5F92,5F95,5F97,5F98,5F99,5F9C,5FA1,5FA8,5FAA,5FAD,5FAE,5FB5,5FB7,5FBC,5FBD,5FC3,5FC4,5FC5,5FC6,5FC9,5FCC,5FCD,5FCF,5FD0,5FD1,5FD2,5FD6,5FD7,5FD8,5FD9,5FDD,5FE0,5FE1,5FE4,5FE7,5FEA,5FEB,5FED,5FEE,5FF1,5FF5,5FF8,5FFB,5FFD,5FFE,5FFF,6000,6001,6002,6003,6004,6005,6006,600A,600D,600E,600F,6012,6014,6015,6016,6019,601B,601C,601D,6020,6021,6025,6026,6027,6028,6029,602A,602B,602F,6035,603B,603C,603F,6041,6042,6043,604B,604D,6050,6052,6055,6059,605A,605D,6062,6063,6064,6067,6068,6069,606A,606B,606C,606D,606F,6070,6073,6076,6078,6079,607A,607B,607C,607D,607F,6083,6084,6089,608C,608D,6092,6094,6096,609A,609B,609D,609F,60A0,60A3,60A6,60A8,60AB,60AC,60AD,60AF,60B1,60B2,60B4,60B8,60BB,60BC,60C5,60C6,60CA,60CB,60D1,60D5,60D8,60DA,60DC,60DD,60DF,60E0,60E6,60E7,60E8,60E9,60EB,60EC,60ED,60EE,60EF,60F0,60F3,60F4,60F6,60F9,60FA,6100,6101,6106,6108,6109,610D,610E,610F,6115,611A,611F,6120,6123,6124,6126,6127,612B,613F,6148,614A,614C,614E,6151,6155,615D,6162,6167,6168,6170,6175,6177,618B,618E,6194,619D,61A7,61A8,61A9,61AC,61B7,61BE,61C2,61C8,61CA,61CB,61D1,61D2,61D4,61E6,61F5,61FF,6206,6208,620A,620B,620C,620D,620E,620F,6210,6211,6212,6215,6216,6217,6218,621A,621B,621F,6221,6222,6224,6225,622A,622C,622E,6233,6234,6237,623D,623E,623F,6240,6241,6243,6247,6248,6249,624B,624C,624D,624E,6251,6252,6253,6254,6258,625B,6263,6266,6267,6269,626A,626B,626C,626D,626E,626F,6270,6273,6276,6279,627C,627E,627F,6280,6284,6289,628A,6291,6292,6293,6295,6296,6297,6298,629A,629B,629F,62A0,62A1,62A2,62A4,62A5,62A8,62AB,62AC,62B1,62B5,62B9,62BB,62BC,62BD,62BF,62C2,62C4,62C5,62C6,62C7,62C8,62C9,62CA,62CC,62CD,62CE,62D0,62D2,62D3,62D4,62D6,62D7,62D8,62D9,62DA,62DB,62DC,62DF,62E2,62E3,62E5,62E6,62E7,62E8,62E9,62EC,62ED,62EE,62EF,62F1,62F3,62F4,62F6,62F7,62FC,62FD,62FE,62FF,6301,6302,6307,6308,6309,630E,6311,6316,631A,631B,631D,631E,631F,6320,6321,6322,6323,6324,6325,6328,632A,632B,632F,6332,6339,633A,633D,6342,6343,6345,6346,6349,634B,634C,634D,634E,634F,6350,6355,635E,635F,6361,6362,6363,6367,6369,636D,636E,6371,6376,6377,637A,637B,6380,6382,6387,6388,6389,638A,638C,638E,638F,6390,6392,6396,6398,63A0,63A2,63A3,63A5,63A7,63A8,63A9,63AA,63AC,63AD,63AE,63B0,63B3,63B4,63B7,63B8,63BA,63BC,63BE,63C4,63C6,63C9,63CD,63CE,63CF,63D0,63D2,63D6,63DE,63E0,63E1,63E3,63E9,63EA,63ED,63F2,63F4,63F6,63F8,63FD,63FF,6400,6401,6402,6405,640B,640C,640F,6410,6413,6414,641B,641C,641E,6420,6421,6426,642A,642C,642D,6434,643A,643D,643F,6441,6444,6445,6446,6447,6448,644A,6452,6454,6458,645E,6467,6469,646D,6478,6479,647A,6482,6484,6485,6487,6491,6492,6495,6496,6499,649E,64A4,64A9,64AC,64AD,64AE,64B0,64B5,64B7,64B8,64BA,64BC,64C0,64C2,64C5,64CD,64CE,64D0,64D2,64D7,64D8,64DE,64E2,64E4,64E6,6500,6509,6512,6518,6525,652B,652E,652F,6534,6535,6536,6538,6539,653B,653E,653F,6545,6548,6549,654C,654F,6551,6555,6556,6559,655B,655D,655E,6562,6563,6566,656B,656C,6570,6572,6574,6577,6587,658B,658C,6590,6591,6593,6597,6599,659B,659C,659F,65A1,65A4,65A5,65A7,65A9,65AB,65AD,65AF,65B0,65B9,65BC,65BD,65C1,65C3,65C4,65C5,65C6,65CB,65CC,65CE,65CF,65D2,65D6,65D7,65E0,65E2,65E5,65E6,65E7,65E8,65E9,65EC,65ED,65EE,65EF,65F0,65F1,65F6,65F7,65FA,6600,6602,6603,6606,660A,660C,660E,660F,6613,6614,6615,6619,661D,661F,6620,6625,6627,6628,662D,662F,6631,6634,6635,6636,663C,663E,6641,6643,664B,664C,664F,6652,6653,6654,6655,6656,6657,665A,665F,6661,6664,6666,6668,666E,666F,6670,6674,6676,6677,667A,667E,6682,6684,6687,668C,6691,6696,6697,669D,66A7,66A8,66AE,66B4,66B9,66BE,66D9,66DB,66DC,66DD,66E6,66E9,66F0,66F2,66F3,66F4,66F7,66F9,66FC,66FE,66FF,6700,6708,6709,670A,670B,670D,6710,6714,6715,6717,671B,671D,671F,6726,6728,672A,672B,672C,672D,672F,6731,6734,6735,673A,673D,6740,6742,6743,6746,6748,6749,674C,674E,674F,6750,6751,6753,6756,675C,675E,675F,6760,6761,6765,6768,6769,676A,676D,676F,6770,6772,6773,6775,6777,677C,677E,677F,6781,6784,6787,6789,678B,6790,6795,6797,6798,679A,679C,679D,679E,67A2,67A3,67A5,67A7,67A8,67AA,67AB,67AD,67AF,67B0,67B3,67B5,67B6,67B7,67B8,67C1,67C3,67C4,67CF,67D0,67D1,67D2,67D3,67D4,67D8,67D9,67DA,67DC,67DD,67DE,67E0,67E2,67E5,67E9,67EC,67EF,67F0,67F1,67F3,67F4,67FD,67FF,6800,6805,6807,6808,6809,680A,680B,680C,680E,680F,6811,6813,6816,6817,681D,6821,6829,682A,6832,6833,6837,6838,6839,683C,683D,683E,6840,6841,6842,6843,6844,6845,6846,6848,6849,684A,684C,684E,6850,6851,6853,6854,6855,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,686B,6874,6876,6877,6881,6883,6885,6886,688F,6893,6897,68A2,68A6,68A7,68A8,68AD,68AF,68B0,68B3,68B5,68C0,68C2,68C9,68CB,68CD,68D2,68D5,68D8,68DA,68E0,68E3,68EE,68F0,68F1,68F5,68F9,68FA,68FC,6901,6905,690B,690D,690E,6910,6912,691F,6920,6924,692D,6930,6934,6939,693D,693F,6942,6954,6957,695A,695D,695E,6960,6963,6966,696B,696E,6971,6977,6978,6979,697C,6980,6982,6984,6986,6987,6988,6989,698D,6994,6995,6998,699B,699C,69A7,69A8,69AB,69AD,69B1,69B4,69B7,69BB,69C1,69CA,69CC,69CE,69D0,69D4,69DB,69DF,69E0,69ED,69F2,69FD,69FF,6A0A,6A17,6A18,6A1F,6A21,6A28,6A2A,6A2F,6A31,6A35,6A3D,6A3E,6A44,6A47,6A50,6A58,6A59,6A5B,6A61,6A65,6A71,6A79,6A7C,6A80,6A84,6A8E,6A90,6A91,6A97,6AA0,6AA9,6AAB,6AAC,6B20,6B21,6B22,6B23,6B24,6B27,6B32,6B37,6B39,6B3A,6B3E,6B43,6B46,6B47,6B49,6B4C,6B59,6B62,6B63,6B64,6B65,6B66,6B67,6B6A,6B79,6B7B,6B7C,6B81,6B82,6B83,6B84,6B86,6B87,6B89,6B8A,6B8B,6B8D,6B92,6B93,6B96,6B9A,6B9B,6BA1,6BAA,6BB3,6BB4,6BB5,6BB7,6BBF,6BC1,6BC2,6BC5,6BCB,6BCD,6BCF,6BD2,6BD3,6BD4,6BD5,6BD6,6BD7,6BD9,6BDB,6BE1,6BEA,6BEB,6BEF,6BF3,6BF5,6BF9,6BFD,6C05,6C06,6C07,6C0D,6C0F,6C10,6C11,6C13,6C14,6C15,6C16,6C18,6C19,6C1A,6C1B,6C1F,6C21,6C22,6C24,6C26,6C27,6C28,6C29,6C2A,6C2E,6C2F,6C30,6C32,6C34,6C35,6C38,6C3D,6C40,6C41,6C42,6C46,6C47,6C49,6C4A,6C50,6C54,6C55,6C57,6C5B,6C5C,6C5D,6C5E,6C5F,6C60,6C61,6C64,6C68,6C69,6C6A,6C70,6C72,6C74,6C76,6C79,6C7D,6C7E,6C81,6C82,6C83,6C85,6C86,6C88,6C89,6C8C,6C8F,6C90,6C93,6C94,6C99,6C9B,6C9F,6CA1,6CA3,6CA4,6CA5,6CA6,6CA7,6CA9,6CAA,6CAB,6CAD,6CAE,6CB1,6CB2,6CB3,6CB8,6CB9,6CBB,6CBC,6CBD,6CBE,6CBF,6CC4,6CC5,6CC9,6CCA,6CCC,6CD0,6CD3,6CD4,6CD5,6CD6,6CD7,6CDB,6CDE,6CE0,6CE1,6CE2,6CE3,6CE5,6CE8,6CEA,6CEB,6CEE,6CEF,6CF0,6CF1,6CF3,6CF5,6CF6,6CF7,6CF8,6CFA,6CFB,6CFC,6CFD,6CFE,6D01,6D04,6D07,6D0B,6D0C,6D0E,6D12,6D17,6D19,6D1A,6D1B,6D1E,6D25,6D27,6D2A,6D2B,6D2E,6D31,6D32,6D33,6D35,6D39,6D3B,6D3C,6D3D,6D3E,6D41,6D43,6D45,6D46,6D47,6D48,6D4A,6D4B,6D4D,6D4E,6D4F,6D51,6D52,6D53,6D54,6D59,6D5A,6D5C,6D5E,6D60,6D63,6D66,6D69,6D6A,6D6E,6D6F,6D74,6D77,6D78,6D7C,6D82,6D85,6D88,6D89,6D8C,6D8E,6D91,6D93,6D94,6D95,6D9B,6D9D,6D9E,6D9F,6DA0,6DA1,6DA3,6DA4,6DA6,6DA7,6DA8,6DA9,6DAA,6DAB,6DAE,6DAF,6DB2,6DB5,6DB8,6DBF,6DC0,6DC4,6DC5,6DC6,6DC7,6DCB,6DCC,6DD1,6DD6,6DD8,6DD9,6DDD,6DDE,6DE0,6DE1,6DE4,6DE6,6DEB,6DEC,6DEE,6DF1,6DF3,6DF7,6DF9,6DFB,6DFC,6E05,6E0A,6E0C,6E0D,6E0E,6E10,6E11,6E14,6E16,6E17,6E1A,6E1D,6E20,6E21,6E23,6E24,6E25,6E29,6E2B,6E2D,6E2F,6E32,6E34,6E38,6E3A,6E43,6E44,6E4D,6E4E,6E53,6E54,6E56,6E58,6E5B,6E5F,6E6B,6E6E,6E7E,6E7F,6E83,6E85,6E86,6E89,6E8F,6E90,6E98,6E9C,6E9F,6EA2,6EA5,6EA7,6EAA,6EAF,6EB1,6EB2,6EB4,6EB6,6EB7,6EBA,6EBB,6EBD,6EC1,6EC2,6EC7,6ECB,6ECF,6ED1,6ED3,6ED4,6ED5,6ED7,6EDA,6EDE,6EDF,6EE0,6EE1,6EE2,6EE4,6EE5,6EE6,6EE8,6EE9,6EF4,6EF9,6F02,6F06,6F09,6F0F,6F13,6F14,6F15,6F20,6F24,6F29,6F2A,6F2B,6F2D,6F2F,6F31,6F33,6F36,6F3E,6F46,6F47,6F4B,6F4D,6F58,6F5C,6F5E,6F62,6F66,6F6D,6F6E,6F72,6F74,6F78,6F7A,6F7C,6F84,6F88,6F89,6F8C,6F8D,6F8E,6F9C,6FA1,6FA7,6FB3,6FB6,6FB9,6FC0,6FC2,6FC9,6FD1,6FD2,6FDE,6FE0,6FE1,6FEE,6FEF,7011,701A,701B,7023,7035,7039,704C,704F,705E,706B,706C,706D,706F,7070,7075,7076,7078,707C,707E,707F,7080,7085,7089,708A,708E,7092,7094,7095,7096,7099,709C,709D,70AB,70AC,70AD,70AE,70AF,70B1,70B3,70B7,70B8,70B9,70BB,70BC,70BD,70C0,70C1,70C2,70C3,70C8,70CA,70D8,70D9,70DB,70DF,70E4,70E6,70E7,70E8,70E9,70EB,70EC,70ED,70EF,70F7,70F9,70FD,7109,710A,7110,7113,7115,7116,7118,7119,711A,7126,712F,7130,7131,7136,7145,714A,714C,714E,715C,715E,7164,7166,7167,7168,716E,7172,7173,7178,717A,717D,7184,718A,718F,7194,7198,7199,719F,71A0,71A8,71AC,71B3,71B5,71B9,71C3,71CE,71D4,71D5,71E0,71E5,71E7,71EE,71F9,7206,721D,7228,722A,722C,7230,7231,7235,7236,7237,7238,7239,723B,723D,723F,7247,7248,724C,724D,7252,7256,7259,725B,725D,725F,7261,7262,7266,7267,7269,726E,726F,7272,7275,7279,727A,727E,727F,7280,7281,7284,728A,728B,728D,728F,7292,729F,72AC,72AD,72AF,72B0,72B4,72B6,72B7,72B8,72B9,72C1,72C2,72C3,72C4,72C8,72CD,72CE,72D0,72D2,72D7,72D9,72DE,72E0,72E1,72E8,72E9,72EC,72ED,72EE,72EF,72F0,72F1,72F2,72F3,72F4,72F7,72F8,72FA,72FB,72FC,7301,7303,730A,730E,7313,7315,7316,7317,731B,731C,731D,731E,7321,7322,7325,7329,732A,732B,732C,732E,7331,7334,7337,7338,7339,733E,733F,734D,7350,7352,7357,7360,736C,736D,736F,737E,7384,7387,7389,738B,738E,7391,7396,739B,739F,73A2,73A9,73AB,73AE,73AF,73B0,73B2,73B3,73B7,73BA,73BB,73C0,73C2,73C8,73C9,73CA,73CD,73CF,73D0,73D1,73D9,73DE,73E0,73E5,73E7,73E9,73ED,73F2,7403,7405,7406,7409,740A,740F,7410,741A,741B,7422,7425,7426,7428,742A,742C,742E,7430,7433,7434,7435,7436,743C,7441,7455,7457,7459,745A,745B,745C,745E,745F,746D,7470,7476,7477,747E,7480,7481,7483,7487,748B,748E,7490,749C,749E,74A7,74A8,74A9,74BA,74D2,74DC,74DE,74E0,74E2,74E3,74E4,74E6,74EE,74EF,74F4,74F6,74F7,74FF,7504,750D,750F,7511,7513,7518,7519,751A,751C,751F,7525,7528,7529,752B,752C,752D,752F,7530,7531,7532,7533,7535,7537,7538,753A,753B,753E,7540,7545,7548,754B,754C,754E,754F,7554,7559,755A,755B,755C,7565,7566,756A,7572,7574,7578,7579,757F,7583,7586,758B,758F,7591,7592,7594,7596,7597,7599,759A,759D,759F,75A0,75A1,75A3,75A4,75A5,75AB,75AC,75AE,75AF,75B0,75B1,75B2,75B3,75B4,75B5,75B8,75B9,75BC,75BD,75BE,75C2,75C3,75C4,75C5,75C7,75C8,75C9,75CA,75CD,75D2,75D4,75D5,75D6,75D8,75DB,75DE,75E2,75E3,75E4,75E6,75E7,75E8,75EA,75EB,75F0,75F1,75F4,75F9,75FC,75FF,7600,7601,7603,7605,760A,760C,7610,7615,7617,7618,7619,761B,761F,7620,7622,7624,7625,7626,7629,762A,762B,762D,7630,7633,7634,7635,7638,763C,763E,763F,7640,7643,764C,764D,7654,7656,765C,765E,7663,766B,766F,7678,767B,767D,767E,7682,7684,7686,7687,7688,768B,768E,7691,7693,7696,7699,76A4,76AE,76B1,76B2,76B4,76BF,76C2,76C5,76C6,76C8,76CA,76CD,76CE,76CF,76D0,76D1,76D2,76D4,76D6,76D7,76D8,76DB,76DF,76E5,76EE,76EF,76F1,76F2,76F4,76F8,76F9,76FC,76FE,7701,7704,7707,7708,7709,770B,770D,7719,771A,771F,7720,7722,7726,7728,7729,772D,772F,7735,7736,7737,7738,773A,773C,7740,7741,7743,7747,7750,7751,775A,775B,7761,7762,7763,7765,7766,7768,776B,776C,7779,777D,777E,777F,7780,7784,7785,778C,778D,778E,7791,7792,779F,77A0,77A2,77A5,77A7,77A9,77AA,77AC,77B0,77B3,77B5,77BB,77BD,77BF,77CD,77D7,77DB,77DC,77E2,77E3,77E5,77E7,77E9,77EB,77EC,77ED,77EE,77F3,77F6,77F8,77FD,77FE,77FF,7800,7801,7802,7809,780C,780D,7811,7812,7814,7816,7817,7818,781A,781C,781D,781F,7823,7825,7826,7827,7829,782C,782D,7830,7834,7837,7838,7839,783A,783B,783C,783E,7840,7845,7847,784C,784E,7850,7852,7855,7856,7857,785D,786A,786B,786C,786D,786E,7877,787C,7887,7889,788C,788D,788E,7891,7893,7897,7898,789A,789B,789C,789F,78A1,78A3,78A5,78A7,78B0,78B1,78B2,78B3,78B4,78B9,78BE,78C1,78C5,78C9,78CA,78CB,78D0,78D4,78D5,78D9,78E8,78EC,78F2,78F4,78F7,78FA,7901,7905,7913,791E,7924,7934,793A,793B,793C,793E,7940,7941,7946,7948,7949,7953,7956,7957,795A,795B,795C,795D,795E,795F,7960,7962,7965,7967,7968,796D,796F,7977,7978,797A,7980,7981,7984,7985,798A,798F,799A,79A7,79B3,79B9,79BA,79BB,79BD,79BE,79C0,79C1,79C3,79C6,79C9,79CB,79CD,79D1,79D2,79D5,79D8,79DF,79E3,79E4,79E6,79E7,79E9,79EB,79ED,79EF,79F0,79F8,79FB,79FD,7A00,7A02,7A03,7A06,7A0B,7A0D,7A0E,7A14,7A17,7A1A,7A1E,7A20,7A23,7A33,7A37,7A39,7A3B,7A3C,7A3D,7A3F,7A46,7A51,7A57,7A70,7A74,7A76,7A77,7A78,7A79,7A7A,7A7F,7A80,7A81,7A83,7A84,7A86,7A88,7A8D,7A91,7A92,7A95,7A96,7A97,7A98,7A9C,7A9D,7A9F,7AA0,7AA5,7AA6,7AA8,7AAC,7AAD,7AB3,7ABF,7ACB,7AD6,7AD9,7ADE,7ADF,7AE0,7AE3,7AE5,7AE6,7AED,7AEF,7AF9,7AFA,7AFD,7AFF,7B03,7B04,7B06,7B08,7B0A,7B0B,7B0F,7B11,7B14,7B15,7B19,7B1B,7B1E,7B20,7B24,7B25,7B26,7B28,7B2A,7B2B,7B2C,7B2E,7B31,7B33,7B38,7B3A,7B3C,7B3E,7B45,7B47,7B49,7B4B,7B4C,7B4F,7B50,7B51,7B52,7B54,7B56,7B58,7B5A,7B5B,7B5D,7B60,7B62,7B6E,7B71,7B72,7B75,7B77,7B79,7B7B,7B7E,7B80,7B85,7B8D,7B90,7B94,7B95,7B97,7B9C,7B9D,7BA1,7BA2,7BA6,7BA7,7BA8,7BA9,7BAA,7BAB,7BAC,7BAD,7BB1,7BB4,7BB8,7BC1,7BC6,7BC7,7BCC,7BD1,7BD3,7BD9,7BDA,7BDD,7BE1,7BE5,7BE6,7BEA,7BEE,7BF1,7BF7,7BFC,7BFE,7C07,7C0B,7C0C,7C0F,7C16,7C1F,7C26,7C27,7C2A,7C38,7C3F,7C40,7C41,7C4D,7C73,7C74,7C7B,7C7C,7C7D,7C89,7C91,7C92,7C95,7C97,7C98,7C9C,7C9D,7C9E,7C9F,7CA2,7CA4,7CA5,7CAA,7CAE,7CB1,7CB2,7CB3,7CB9,7CBC,7CBD,7CBE,7CC1,7CC5,7CC7,7CC8,7CCA,7CCC,7CCD,7CD5,7CD6,7CD7,7CD9,7CDC,7CDF,7CE0,7CE8,7CEF,7CF8,7CFB,7D0A,7D20,7D22,7D27,7D2B,7D2F,7D6E,7D77,7DA6,7DAE,7E3B,7E41,7E47,7E82,7E9B,7E9F,7EA0,7EA1,7EA2,7EA3,7EA4,7EA5,7EA6,7EA7,7EA8,7EA9,7EAA,7EAB,7EAC,7EAD,7EAF,7EB0,7EB1,7EB2,7EB3,7EB5,7EB6,7EB7,7EB8,7EB9,7EBA,7EBD,7EBE,7EBF,7EC0,7EC1,7EC2,7EC3,7EC4,7EC5,7EC6,7EC7,7EC8,7EC9,7ECA,7ECB,7ECC,7ECD,7ECE,7ECF,7ED0,7ED1,7ED2,7ED3,7ED4,7ED5,7ED7,7ED8,7ED9,7EDA,7EDB,7EDC,7EDD,7EDE,7EDF,7EE0,7EE1,7EE2,7EE3,7EE5,7EE6,7EE7,7EE8,7EE9,7EEA,7EEB,7EED,7EEE,7EEF,7EF0,7EF1,7EF2,7EF3,7EF4,7EF5,7EF6,7EF7,7EF8,7EFA,7EFB,7EFC,7EFD,7EFE,7EFF,7F00,7F01,7F02,7F03,7F04,7F05,7F06,7F07,7F08,7F09,7F0B,7F0C,7F0D,7F0E,7F0F,7F11,7F12,7F13,7F14,7F15,7F16,7F17,7F18,7F19,7F1A,7F1B,7F1C,7F1D,7F1F,7F20,7F21,7F22,7F23,7F24,7F25,7F26,7F27,7F28,7F29,7F2A,7F2B,7F2C,7F2D,7F2E,7F2F,7F30,7F31,7F32,7F33,7F34,7F35,7F36,7F38,7F3A,7F42,7F44,7F45,7F50,7F51,7F54,7F55,7F57,7F58,7F5A,7F5F,7F61,7F62,7F68,7F69,7F6A,7F6E,7F71,7F72,7F74,7F79,7F7E,7F81,7F8A,7F8C,7F8E,7F94,7F9A,7F9D,7F9E,7F9F,7FA1,7FA4,7FA7,7FAF,7FB0,7FB2,7FB8,7FB9,7FBC,7FBD,7FBF,7FC1,7FC5,7FCA,7FCC,7FCE,7FD4,7FD5,7FD8,7FDF,7FE0,7FE1,7FE5,7FE6,7FE9,7FEE,7FF0,7FF1,7FF3,7FFB,7FFC,8000,8001,8003,8004,8005,8006,800B,800C,800D,8010,8012,8014,8015,8016,8017,8018,8019,801C,8020,8022,8025,8026,8027,8028,8029,802A,8031,8033,8035,8036,8037,8038,803B,803D,803F,8042,8043,8046,804A,804B,804C,804D,8052,8054,8058,805A,8069,806A,8071,807F,8080,8083,8084,8086,8087,8089,808B,808C,8093,8096,8098,809A,809B,809C,809D,809F,80A0,80A1,80A2,80A4,80A5,80A9,80AA,80AB,80AD,80AE,80AF,80B1,80B2,80B4,80B7,80BA,80BC,80BD,80BE,80BF,80C0,80C1,80C2,80C3,80C4,80C6,80CC,80CD,80CE,80D6,80D7,80D9,80DA,80DB,80DC,80DD,80DE,80E1,80E4,80E5,80E7,80E8,80E9,80EA,80EB,80EC,80ED,80EF,80F0,80F1,80F2,80F3,80F4,80F6,80F8,80FA,80FC,80FD,8102,8106,8109,810A,810D,810E,810F,8110,8111,8112,8113,8114,8116,8118,811A,811E,812C,812F,8131,8132,8136,8138,813E,8146,8148,814A,814B,814C,8150,8151,8153,8154,8155,8159,815A,8160,8165,8167,8169,816D,816E,8170,8171,8174,8179,817A,817B,817C,817D,817E,817F,8180,8182,8188,818A,818F,8191,8198,819B,819C,819D,81A3,81A6,81A8,81AA,81B3,81BA,81BB,81C0,81C1,81C2,81C3,81C6,81CA,81CC,81E3,81E7,81EA,81EC,81ED,81F3,81F4,81FB,81FC,81FE,8200,8201,8202,8204,8205,8206,820C,820D,8210,8212,8214,821B,821C,821E,821F,8221,8222,8223,8228,822A,822B,822C,822D,822F,8230,8231,8233,8234,8235,8236,8237,8238,8239,823B,823E,8244,8247,8249,824B,824F,8258,825A,825F,8268,826E,826F,8270,8272,8273,8274,8279,827A,827D,827E,827F,8282,8284,8288,828A,828B,828D,828E,828F,8291,8292,8297,8298,8299,829C,829D,829F,82A1,82A4,82A5,82A6,82A8,82A9,82AA,82AB,82AC,82AD,82AE,82AF,82B0,82B1,82B3,82B4,82B7,82B8,82B9,82BD,82BE,82C1,82C4,82C7,82C8,82CA,82CB,82CC,82CD,82CE,82CF,82D1,82D2,82D3,82D4,82D5,82D7,82D8,82DB,82DC,82DE,82DF,82E0,82E1,82E3,82E4,82E5,82E6,82EB,82EF,82F1,82F4,82F7,82F9,82FB,8301,8302,8303,8304,8305,8306,8307,8308,8309,830C,830E,830F,8311,8314,8315,8317,831A,831B,831C,8327,8328,832B,832C,832D,832F,8331,8333,8334,8335,8336,8338,8339,833A,833C,8340,8343,8346,8347,8349,834F,8350,8351,8352,8354,835A,835B,835C,835E,835F,8360,8361,8363,8364,8365,8366,8367,8368,8369,836A,836B,836C,836D,836E,836F,8377,8378,837B,837C,837D,8385,8386,8389,838E,8392,8393,8398,839B,839C,839E,83A0,83A8,83A9,83AA,83AB,83B0,83B1,83B2,83B3,83B4,83B6,83B7,83B8,83B9,83BA,83BC,83BD,83C0,83C1,83C5,83C7,83CA,83CC,83CF,83D4,83D6,83D8,83DC,83DD,83DF,83E0,83E1,83E5,83E9,83EA,83F0,83F1,83F2,83F8,83F9,83FD,8401,8403,8404,8406,840B,840C,840D,840E,840F,8411,8418,841C,841D,8424,8425,8426,8427,8428,8431,8438,843C,843D,8446,8451,8457,8459,845A,845B,845C,8461,8463,8469,846B,846C,846D,8471,8473,8475,8476,8478,847A,8482,8487,8488,8489,848B,848C,848E,8497,8499,849C,84A1,84AF,84B2,84B4,84B8,84B9,84BA,84BD,84BF,84C1,84C4,84C9,84CA,84CD,84D0,84D1,84D3,84D6,84DD,84DF,84E0,84E3,84E5,84E6,84EC,84F0,84FC,84FF,850C,8511,8513,8517,851A,851F,8521,852B,852C,8537,8538,8539,853A,853B,853C,853D,8543,8548,8549,854A,8556,8559,855E,8564,8568,8572,8574,8579,857A,857B,857E,8584,8585,8587,858F,859B,859C,85A4,85A8,85AA,85AE,85AF,85B0,85B7,85B9,85C1,85C9,85CF,85D0,85D3,85D5,85DC,85E4,85E9,85FB,85FF,8605,8611,8616,8627,8629,8638,863C,864D,864E,864F,8650,8651,8654,865A,865E,8662,866B,866C,866E,8671,8679,867A,867B,867C,867D,867E,867F,8680,8681,8682,868A,868B,868C,868D,8693,8695,869C,869D,86A3,86A4,86A7,86A8,86A9,86AA,86AC,86AF,86B0,86B1,86B4,86B5,86B6,86BA,86C0,86C4,86C6,86C7,86C9,86CA,86CB,86CE,86CF,86D0,86D1,86D4,86D8,86D9,86DB,86DE,86DF,86E4,86E9,86ED,86EE,86F0,86F1,86F2,86F3,86F4,86F8,86F9,86FE,8700,8702,8703,8707,8708,8709,870A,870D,8712,8713,8715,8717,8718,871A,871C,871E,8721,8722,8723,8725,8729,872E,8731,8734,8737,873B,873E,873F,8747,8748,8749,874C,874E,8753,8757,8759,8760,8763,8764,8765,876E,8770,8774,8776,877B,877C,877D,877E,8782,8783,8785,8788,878B,878D,8793,8797,879F,87A8,87AB,87AC,87AD,87AF,87B3,87B5,87BA,87BD,87C0,87C6,87CA,87CB,87D1,87D2,87D3,87DB,87E0,87E5,87EA,87EE,87F9,87FE,8803,880A,8813,8815,8816,881B,8821,8822,8832,8839,883C,8840,8844,8845,884C,884D,8854,8857,8859,8861,8862,8863,8864,8865,8868,8869,886B,886C,886E,8870,8872,8877,887D,887E,887F,8881,8882,8884,8885,8888,888B,888D,8892,8896,889C,88A2,88A4,88AB,88AD,88B1,88B7,88BC,88C1,88C2,88C5,88C6,88C9,88CE,88D2,88D4,88D5,88D8,88D9,88DF,88E2,88E3,88E4,88E5,88E8,88F0,88F1,88F3,88F4,88F8,88F9,88FC,88FE,8902,890A,8910,8912,8913,8919,891A,891B,8921,8925,892A,892B,8930,8934,8936,8941,8944,895E,895F,8966,897B,897F,8981,8983,8986,89C1,89C2,89C4,89C5,89C6,89C7,89C8,89C9,89CA,89CB,89CC,89CE,89CF,89D0,89D1,89D2,89D6,89DA,89DC,89DE,89E3,89E5,89E6,89EB,89EF,89F3,8A00,8A07,8A3E,8A48,8A79,8A89,8A8A,8A93,8B07,8B26,8B66,8B6C,8BA0,8BA1,8BA2,8BA3,8BA4,8BA5,8BA6,8BA7,8BA8,8BA9,8BAA,8BAB,8BAD,8BAE,8BAF,8BB0,8BB2,8BB3,8BB4,8BB5,8BB6,8BB7,8BB8,8BB9,8BBA,8BBC,8BBD,8BBE,8BBF,8BC0,8BC1,8BC2,8BC3,8BC4,8BC5,8BC6,8BC8,8BC9,8BCA,8BCB,8BCC,8BCD,8BCE,8BCF,8BD1,8BD2,8BD3,8BD4,8BD5,8BD6,8BD7,8BD8,8BD9,8BDA,8BDB,8BDC,8BDD,8BDE,8BDF,8BE0,8BE1,8BE2,8BE3,8BE4,8BE5,8BE6,8BE7,8BE8,8BE9,8BEB,8BEC,8BED,8BEE,8BEF,8BF0,8BF1,8BF2,8BF3,8BF4,8BF5,8BF6,8BF7,8BF8,8BF9,8BFA,8BFB,8BFC,8BFD,8BFE,8BFF,8C00,8C01,8C02,8C03,8C04,8C05,8C06,8C07,8C08,8C0A,8C0B,8C0C,8C0D,8C0E,8C0F,8C10,8C11,8C12,8C13,8C14,8C15,8C16,8C17,8C18,8C19,8C1A,8C1B,8C1C,8C1D,8C1F,8C20,8C21,8C22,8C23,8C24,8C25,8C26,8C27,8C28,8C29,8C2A,8C2B,8C2C,8C2D,8C2E,8C2F,8C30,8C31,8C32,8C33,8C34,8C35,8C36,8C37,8C41,8C46,8C47,8C49,8C4C,8C55,8C5A,8C61,8C62,8C6A,8C6B,8C73,8C78,8C79,8C7A,8C82,8C85,8C89,8C8A,8C8C,8C94,8C98,8D1D,8D1E,8D1F,8D21,8D22,8D23,8D24,8D25,8D26,8D27,8D28,8D29,8D2A,8D2B,8D2C,8D2D,8D2E,8D2F,8D30,8D31,8D32,8D33,8D34,8D35,8D36,8D37,8D38,8D39,8D3A,8D3B,8D3C,8D3D,8D3E,8D3F,8D40,8D41,8D42,8D43,8D44,8D45,8D46,8D47,8D48,8D49,8D4A,8D4B,8D4C,8D4D,8D4E,8D4F,8D50,8D53,8D54,8D55,8D56,8D58,8D59,8D5A,8D5B,8D5C,8D5D,8D5E,8D60,8D61,8D62,8D63,8D64,8D66,8D67,8D6B,8D6D,8D70,8D73,8D74,8D75,8D76,8D77,8D81,8D84,8D85,8D8A,8D8B,8D91,8D94,8D9F,8DA3,8DB1,8DB3,8DB4,8DB5,8DB8,8DBA,8DBC,8DBE,8DBF,8DC3,8DC4,8DC6,8DCB,8DCC,8DCE,8DCF,8DD1,8DD6,8DD7,8DDA,8DDB,8DDD,8DDE,8DDF,8DE3,8DE4,8DE8,8DEA,8DEB,8DEC,8DEF,8DF3,8DF5,8DF7,8DF8,8DF9,8DFA,8DFB,8DFD,8E05,8E09,8E0A,8E0C,8E0F,8E14,8E1D,8E1E,8E1F,8E22,8E23,8E29,8E2A,8E2C,8E2E,8E2F,8E31,8E35,8E39,8E3A,8E3D,8E40,8E41,8E42,8E44,8E47,8E48,8E49,8E4A,8E4B,8E51,8E52,8E59,8E66,8E69,8E6C,8E6D,8E6F,8E70,8E72,8E74,8E76,8E7C,8E7F,8E81,8E85,8E87,8E8F,8E90,8E94,8E9C,8E9E,8EAB,8EAC,8EAF,8EB2,8EBA,8ECE,8F66,8F67,8F68,8F69,8F6B,8F6C,8F6D,8F6E,8F6F,8F70,8F71,8F72,8F73,8F74,8F75,8F76,8F77,8F78,8F79,8F7A,8F7B,8F7C,8F7D,8F7E,8F7F,8F81,8F82,8F83,8F84,8F85,8F86,8F87,8F88,8F89,8F8A,8F8B,8F8D,8F8E,8F8F,8F90,8F91,8F93,8F94,8F95,8F96,8F97,8F98,8F99,8F9A,8F9B,8F9C,8F9E,8F9F,8FA3,8FA8,8FA9,8FAB,8FB0,8FB1,8FB6,8FB9,8FBD,8FBE,8FC1,8FC2,8FC4,8FC5,8FC7,8FC8,8FCE,8FD0,8FD1,8FD3,8FD4,8FD5,8FD8,8FD9,8FDB,8FDC,8FDD,8FDE,8FDF,8FE2,8FE4,8FE5,8FE6,8FE8,8FE9,8FEA,8FEB,8FED,8FEE,8FF0,8FF3,8FF7,8FF8,8FF9,8FFD,9000,9001,9002,9003,9004,9005,9006,9009,900A,900B,900D,900F,9010,9011,9012,9014,9016,9017,901A,901B,901D,901E,901F,9020,9021,9022,9026,902D,902E,902F,9035,9036,9038,903B,903C,903E,9041,9042,9044,9047,904D,904F,9050,9051,9052,9053,9057,9058,905B,9062,9063,9065,9068,906D,906E,9074,9075,907D,907F,9080,9082,9083,9088,908B,9091,9093,9095,9097,9099,909B,909D,90A1,90A2,90A3,90A6,90AA,90AC,90AE,90AF,90B0,90B1,90B3,90B4,90B5,90B6,90B8,90B9,90BA,90BB,90BE,90C1,90C4,90C5,90C7,90CA,90CE,90CF,90D0,90D1,90D3,90D7,90DB,90DC,90DD,90E1,90E2,90E6,90E7,90E8,90EB,90ED,90EF,90F4,90F8,90FD,90FE,9102,9104,9119,911E,9122,9123,912F,9131,9139,9143,9146,9149,914A,914B,914C,914D,914E,914F,9150,9152,9157,915A,915D,915E,9161,9162,9163,9164,9165,9169,916A,916C,916E,916F,9170,9171,9172,9174,9175,9176,9177,9178,9179,917D,917E,917F,9185,9187,9189,918B,918C,918D,9190,9191,9192,919A,919B,91A2,91A3,91AA,91AD,91AE,91AF,91B4,91B5,91BA,91C7,91C9,91CA,91CC,91CD,91CE,91CF,91D1,91DC,9274,928E,92AE,92C8,933E,936A,938F,93CA,93D6,943E,946B,9485,9486,9487,9488,9489,948A,948B,948C,948D,948E,948F,9490,9492,9493,9494,9495,9497,9499,949A,949B,949C,949D,949E,949F,94A0,94A1,94A2,94A3,94A4,94A5,94A6,94A7,94A8,94A9,94AA,94AB,94AC,94AD,94AE,94AF,94B0,94B1,94B2,94B3,94B4,94B5,94B6,94B7,94B8,94B9,94BA,94BB,94BC,94BD,94BE,94BF,94C0,94C1,94C2,94C3,94C4,94C5,94C6,94C8,94C9,94CA,94CB,94CC,94CD,94CE,94D0,94D1,94D2,94D5,94D6,94D7,94D8,94D9,94DB,94DC,94DD,94DE,94DF,94E0,94E1,94E2,94E3,94E4,94E5,94E7,94E8,94E9,94EA,94EB,94EC,94ED,94EE,94EF,94F0,94F1,94F2,94F3,94F4,94F5,94F6,94F7,94F8,94F9,94FA,94FC,94FD,94FE,94FF,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,950A,950B,950C,950D,950E,950F,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,951A,951B,951D,951E,951F,9521,9522,9523,9524,9525,9526,9528,9529,952A,952B,952C,952D,952E,952F,9530,9531,9532,9534,9535,9536,9537,9538,9539,953A,953B,953C,953E,953F,9540,9541,9542,9544,9545,9546,9547,9549,954A,954C,954D,954E,954F,9550,9551,9552,9553,9554,9556,9557,9558,9559,955B,955C,955D,955E,955F,9561,9562,9563,9564,9565,9566,9567,9568,9569,956A,956B,956C,956D,956F,9570,9571,9572,9573,9576,957F,95E8,95E9,95EA,95EB,95ED,95EE,95EF,95F0,95F1,95F2,95F3,95F4,95F5,95F6,95F7,95F8,95F9,95FA,95FB,95FC,95FD,95FE,9600,9601,9602,9603,9604,9605,9606,9608,9609,960A,960B,960C,960D,960E,960F,9610,9611,9612,9614,9615,9616,9617,9619,961A,961C,961D,961F,9621,9622,962A,962E,9631,9632,9633,9634,9635,9636,963B,963C,963D,963F,9640,9642,9644,9645,9646,9647,9648,9649,964B,964C,964D,9650,9654,9655,965B,965F,9661,9662,9664,9667,9668,9669,966A,966C,9672,9674,9675,9676,9677,9685,9686,9688,968B,968D,968F,9690,9694,9697,9698,9699,969C,96A7,96B0,96B3,96B6,96B9,96BC,96BD,96BE,96C0,96C1,96C4,96C5,96C6,96C7,96C9,96CC,96CD,96CE,96CF,96D2,96D5,96E0,96E8,96E9,96EA,96EF,96F3,96F6,96F7,96F9,96FE,9700,9701,9704,9706,9707,9708,9709,970D,970E,970F,9713,9716,971C,971E,972A,972D,9730,9732,9738,9739,973E,9752,9753,9756,9759,975B,975E,9760,9761,9762,9765,9769,9773,9774,9776,977C,9785,978B,978D,9791,9792,9794,9798,97A0,97A3,97AB,97AD,97AF,97B2,97B4,97E6,97E7,97E9,97EA,97EB,97EC,97ED,97F3,97F5,97F6,9875,9876,9877,9878,9879,987A,987B,987C,987D,987E,987F,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,988A,988C,988D,988F,9890,9891,9893,9894,9896,9897,9898,989A,989B,989C,989D,989E,989F,98A0,98A1,98A2,98A4,98A5,98A6,98A7,98CE,98D1,98D2,98D3,98D5,98D8,98D9,98DA,98DE,98DF,98E7,98E8,990D,9910,992E,9954,9955,9963,9965,9967,9968,9969,996A,996B,996C,996D,996E,996F,9970,9971,9972,9974,9975,9976,9977,997A,997C,997D,997F,9980,9981,9984,9985,9986,9987,9988,998A,998B,998D,998F,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,99A5,99A8,9A6C,9A6D,9A6E,9A6F,9A70,9A71,9A73,9A74,9A75,9A76,9A77,9A78,9A79,9A7A,9A7B,9A7C,9A7D,9A7E,9A7F,9A80,9A81,9A82,9A84,9A85,9A86,9A87,9A88,9A8A,9A8B,9A8C,9A8F,9A90,9A91,9A92,9A93,9A96,9A97,9A98,9A9A,9A9B,9A9C,9A9D,9A9E,9A9F,9AA0,9AA1,9AA2,9AA3,9AA4,9AA5,9AA7,9AA8,9AB0,9AB1,9AB6,9AB7,9AB8,9ABA,9ABC,9AC0,9AC1,9AC2,9AC5,9ACB,9ACC,9AD1,9AD3,9AD8,9ADF,9AE1,9AE6,9AEB,9AED,9AEF,9AF9,9AFB,9B03,9B08,9B0F,9B13,9B1F,9B23,9B2F,9B32,9B3B,9B3C,9B41,9B42,9B43,9B44,9B45,9B47,9B48,9B49,9B4D,9B4F,9B51,9B54,9C7C,9C7F,9C81,9C82,9C85,9C86,9C87,9C88,9C8B,9C8D,9C8E,9C90,9C91,9C92,9C94,9C95,9C9A,9C9B,9C9C,9C9E,9C9F,9CA0,9CA1,9CA2,9CA3,9CA4,9CA5,9CA6,9CA7,9CA8,9CA9,9CAB,9CAD,9CAE,9CB0,9CB1,9CB2,9CB3,9CB4,9CB5,9CB6,9CB7,9CB8,9CBA,9CBB,9CBC,9CBD,9CC3,9CC4,9CC5,9CC6,9CC7,9CCA,9CCB,9CCC,9CCD,9CCE,9CCF,9CD0,9CD3,9CD4,9CD5,9CD6,9CD7,9CD8,9CD9,9CDC,9CDD,9CDE,9CDF,9CE2,9E1F,9E20,9E21,9E22,9E23,9E25,9E26,9E28,9E29,9E2A,9E2B,9E2C,9E2D,9E2F,9E31,9E32,9E33,9E35,9E36,9E37,9E38,9E39,9E3A,9E3D,9E3E,9E3F,9E41,9E42,9E43,9E44,9E45,9E46,9E47,9E48,9E49,9E4A,9E4B,9E4C,9E4E,9E4F,9E51,9E55,9E57,9E58,9E5A,9E5B,9E5C,9E5E,9E63,9E64,9E66,9E67,9E68,9E69,9E6A,9E6B,9E6C,9E6D,9E70,9E71,9E73,9E7E,9E7F,9E82,9E87,9E88,9E8B,9E92,9E93,9E9D,9E9F,9EA6,9EB4,9EB8,9EBB,9EBD,9EBE,9EC4,9EC9,9ECD,9ECE,9ECF,9ED1,9ED4,9ED8,9EDB,9EDC,9EDD,9EDF,9EE0,9EE2,9EE5,9EE7,9EE9,9EEA,9EEF,9EF9,9EFB,9EFC,9EFE,9F0B,9F0D,9F0E,9F10,9F13,9F17,9F19,9F20,9F22,9F2C,9F2F,9F37,9F39,9F3B,9F3D,9F3E,9F44,9F50,9F51,9F7F,9F80,9F83,9F84,9F85,9F86,9F87,9F88,9F89,9F8A,9F8B,9F8C,9F99,9F9A,9F9B,9F9F,9FA0,FF01,FF02,FF03,FF04,FF05,FF06,FF07,FF08,FF09,FF0A,FF0B,FF0C,FF0D,FF0E,FF0F,FF10,FF11,FF12,FF13,FF14,FF15,FF16,FF17,FF18,FF19,FF1A,FF1B,FF1C,FF1D,FF1E,FF1F,FF20,FF21,FF22,FF23,FF24,FF25,FF26,FF27,FF28,FF29,FF2A,FF2B,FF2C,FF2D,FF2E,FF2F,FF30,FF31,FF32,FF33,FF34,FF35,FF36,FF37,FF38,FF39,FF3A,FF3B,FF3C,FF3D,FF3E,FF3F,FF40,FF41,FF42,FF43,FF44,FF45,FF46,FF47,FF48,FF49,FF4A,FF4B,FF4C,FF4D,FF4E,FF4F,FF50,FF51,FF52,FF53,FF54,FF55,FF56,FF57,FF58,FF59,FF5A,FF5B,FF5C,FF5D,FF5E,FFE0,FFE1,FFE3,FFE5'; | ||
| 12 | + } | ||
| 13 | + AnsicodeChr = function () { | ||
| 14 | + return 'A1E8,A1EC,A1A7,A1E3,A1C0,A1A4,A1C1,A8A4,A8A2,A8A8,A8A6,A8BA,A8AC,A8AA,A8B0,A8AE,A1C2,A8B4,A8B2,A8B9,A8A1,A8A5,A8A7,A8A9,A8AD,A8B1,A8A3,A8AB,A8AF,A8B3,A8B5,A8B6,A8B7,A8B8,A1A6,A1A5,A6A1,A6A2,A6A3,A6A4,A6A5,A6A6,A6A7,A6A8,A6A9,A6AA,A6AB,A6AC,A6AD,A6AE,A6AF,A6B0,A6B1,A6B2,A6B3,A6B4,A6B5,A6B6,A6B7,A6B8,A6C1,A6C2,A6C3,A6C4,A6C5,A6C6,A6C7,A6C8,A6C9,A6CA,A6CB,A6CC,A6CD,A6CE,A6CF,A6D0,A6D1,A6D2,A6D3,A6D4,A6D5,A6D6,A6D7,A6D8,A7A7,A7A1,A7A2,A7A3,A7A4,A7A5,A7A6,A7A8,A7A9,A7AA,A7AB,A7AC,A7AD,A7AE,A7AF,A7B0,A7B1,A7B2,A7B3,A7B4,A7B5,A7B6,A7B7,A7B8,A7B9,A7BA,A7BB,A7BC,A7BD,A7BE,A7BF,A7C0,A7C1,A7D1,A7D2,A7D3,A7D4,A7D5,A7D6,A7D8,A7D9,A7DA,A7DB,A7DC,A7DD,A7DE,A7DF,A7E0,A7E1,A7E2,A7E3,A7E4,A7E5,A7E6,A7E7,A7E8,A7E9,A7EA,A7EB,A7EC,A7ED,A7EE,A7EF,A7F0,A7F1,A7D7,A1AA,A1AC,A1AE,A1AF,A1B0,A1B1,A1AD,A1EB,A1E4,A1E5,A1F9,A1E6,A1ED,A2F1,A2F2,A2F3,A2F4,A2F5,A2F6,A2F7,A2F8,A2F9,A2FA,A2FB,A2FC,A1FB,A1FC,A1FA,A1FD,A1CA,A1C7,A1C6,A1CC,A1D8,A1DE,A1CF,A1CE,A1C4,A1C5,A1C9,A1C8,A1D2,A1D3,A1E0,A1DF,A1C3,A1CB,A1D7,A1D6,A1D5,A1D9,A1D4,A1DC,A1DD,A1DA,A1DB,A1D1,A1CD,A1D0,A2D9,A2DA,A2DB,A2DC,A2DD,A2DE,A2DF,A2E0,A2E1,A2E2,A2C5,A2C6,A2C7,A2C8,A2C9,A2CA,A2CB,A2CC,A2CD,A2CE,A2CF,A2D0,A2D1,A2D2,A2D3,A2D4,A2D5,A2D6,A2D7,A2D8,A2B1,A2B2,A2B3,A2B4,A2B5,A2B6,A2B7,A2B8,A2B9,A2BA,A2BB,A2BC,A2BD,A2BE,A2BF,A2C0,A2C1,A2C2,A2C3,A2C4,A9A4,A9A5,A9A6,A9A7,A9A8,A9A9,A9AA,A9AB,A9AC,A9AD,A9AE,A9AF,A9B0,A9B1,A9B2,A9B3,A9B4,A9B5,A9B6,A9B7,A9B8,A9B9,A9BA,A9BB,A9BC,A9BD,A9BE,A9BF,A9C0,A9C1,A9C2,A9C3,A9C4,A9C5,A9C6,A9C7,A9C8,A9C9,A9CA,A9CB,A9CC,A9CD,A9CE,A9CF,A9D0,A9D1,A9D2,A9D3,A9D4,A9D5,A9D6,A9D7,A9D8,A9D9,A9DA,A9DB,A9DC,A9DD,A9DE,A9DF,A9E0,A9E1,A9E2,A9E3,A9E4,A9E5,A9E6,A9E7,A9E8,A9E9,A9EA,A9EB,A9EC,A9ED,A9EE,A9EF,A1F6,A1F5,A1F8,A1F7,A1F4,A1F3,A1F0,A1F2,A1F1,A1EF,A1EE,A1E2,A1E1,A1A1,A1A2,A1A3,A1A8,A1A9,A1B4,A1B5,A1B6,A1B7,A1B8,A1B9,A1BA,A1BB,A1BE,A1BF,A1FE,A1B2,A1B3,A1BC,A1BD,A4A1,A4A2,A4A3,A4A4,A4A5,A4A6,A4A7,A4A8,A4A9,A4AA,A4AB,A4AC,A4AD,A4AE,A4AF,A4B0,A4B1,A4B2,A4B3,A4B4,A4B5,A4B6,A4B7,A4B8,A4B9,A4BA,A4BB,A4BC,A4BD,A4BE,A4BF,A4C0,A4C1,A4C2,A4C3,A4C4,A4C5,A4C6,A4C7,A4C8,A4C9,A4CA,A4CB,A4CC,A4CD,A4CE,A4CF,A4D0,A4D1,A4D2,A4D3,A4D4,A4D5,A4D6,A4D7,A4D8,A4D9,A4DA,A4DB,A4DC,A4DD,A4DE,A4DF,A4E0,A4E1,A4E2,A4E3,A4E4,A4E5,A4E6,A4E7,A4E8,A4E9,A4EA,A4EB,A4EC,A4ED,A4EE,A4EF,A4F0,A4F1,A4F2,A4F3,A5A1,A5A2,A5A3,A5A4,A5A5,A5A6,A5A7,A5A8,A5A9,A5AA,A5AB,A5AC,A5AD,A5AE,A5AF,A5B0,A5B1,A5B2,A5B3,A5B4,A5B5,A5B6,A5B7,A5B8,A5B9,A5BA,A5BB,A5BC,A5BD,A5BE,A5BF,A5C0,A5C1,A5C2,A5C3,A5C4,A5C5,A5C6,A5C7,A5C8,A5C9,A5CA,A5CB,A5CC,A5CD,A5CE,A5CF,A5D0,A5D1,A5D2,A5D3,A5D4,A5D5,A5D6,A5D7,A5D8,A5D9,A5DA,A5DB,A5DC,A5DD,A5DE,A5DF,A5E0,A5E1,A5E2,A5E3,A5E4,A5E5,A5E6,A5E7,A5E8,A5E9,A5EA,A5EB,A5EC,A5ED,A5EE,A5EF,A5F0,A5F1,A5F2,A5F3,A5F4,A5F5,A5F6,A8C5,A8C6,A8C7,A8C8,A8C9,A8CA,A8CB,A8CC,A8CD,A8CE,A8CF,A8D0,A8D1,A8D2,A8D3,A8D4,A8D5,A8D6,A8D7,A8D8,A8D9,A8DA,A8DB,A8DC,A8DD,A8DE,A8DF,A8E0,A8E1,A8E2,A8E3,A8E4,A8E5,A8E6,A8E7,A8E8,A8E9,A2E5,A2E6,A2E7,A2E8,A2E9,A2EA,A2EB,A2EC,A2ED,A2EE,D2BB,B6A1,C6DF,CDF2,D5C9,C8FD,C9CF,CFC2,D8A2,B2BB,D3EB,D8A4,B3F3,D7A8,C7D2,D8A7,CAC0,C7F0,B1FB,D2B5,B4D4,B6AB,CBBF,D8A9,B6AA,C1BD,D1CF,C9A5,D8AD,B8F6,D1BE,E3DC,D6D0,B7E1,B4AE,C1D9,D8BC,CDE8,B5A4,CEAA,D6F7,C0F6,BED9,D8AF,C4CB,BEC3,D8B1,C3B4,D2E5,D6AE,CEDA,D5A7,BAF5,B7A6,C0D6,C6B9,C5D2,C7C7,B9D4,B3CB,D2D2,D8BF,BEC5,C6F2,D2B2,CFB0,CFE7,CAE9,D8C0,C2F2,C2D2,C8E9,C7AC,C1CB,D3E8,D5F9,CAC2,B6FE,D8A1,D3DA,BFF7,D4C6,BBA5,D8C1,CEE5,BEAE,D8A8,D1C7,D0A9,D8BD,D9EF,CDF6,BFBA,BDBB,BAA5,D2E0,B2FA,BAE0,C4B6,CFED,BEA9,CDA4,C1C1,C7D7,D9F1,D9F4,C8CB,D8E9,D2DA,CAB2,C8CA,D8EC,D8EA,D8C6,BDF6,C6CD,B3F0,D8EB,BDF1,BDE9,C8D4,B4D3,C2D8,B2D6,D7D0,CACB,CBFB,D5CC,B8B6,CFC9,D9DA,D8F0,C7AA,D8EE,B4FA,C1EE,D2D4,D8ED,D2C7,D8EF,C3C7,D1F6,D6D9,D8F2,D8F5,BCFE,BCDB,C8CE,B7DD,B7C2,C6F3,D8F8,D2C1,CEE9,BCBF,B7FC,B7A5,D0DD,D6DA,D3C5,BBEF,BBE1,D8F1,C9A1,CEB0,B4AB,D8F3,C9CB,D8F6,C2D7,D8F7,CEB1,D8F9,B2AE,B9C0,D9A3,B0E9,C1E6,C9EC,CBC5,CBC6,D9A4,B5E8,B5AB,CEBB,B5CD,D7A1,D7F4,D3D3,CCE5,BACE,D9A2,D9DC,D3E0,D8FD,B7F0,D7F7,D8FE,D8FA,D9A1,C4E3,D3B6,D8F4,D9DD,D8FB,C5E5,C0D0,D1F0,B0DB,BCD1,D9A6,D9A5,D9AC,D9AE,D9AB,CAB9,D9A9,D6B6,B3DE,D9A8,C0FD,CACC,D9AA,D9A7,D9B0,B6B1,B9A9,D2C0,CFC0,C2C2,BDC4,D5EC,B2E0,C7C8,BFEB,D9AD,D9AF,CEEA,BAEE,C7D6,B1E3,B4D9,B6ED,D9B4,BFA1,D9DE,C7CE,C0FE,D9B8,CBD7,B7FD,D9B5,D9B7,B1A3,D3E1,D9B9,D0C5,D9B6,D9B1,D9B2,C1A9,D9B3,BCF3,D0DE,B8A9,BEE3,D9BD,D9BA,B0B3,D9C2,D9C4,B1B6,D9BF,B5B9,BEF3,CCC8,BAF2,D2D0,D9C3,BDE8,B3AB,D9C5,BEEB,D9C6,D9BB,C4DF,D9BE,D9C1,D9C0,D5AE,D6B5,C7E3,D9C8,BCD9,D9CA,D9BC,D9CB,C6AB,D9C9,D7F6,CDA3,BDA1,D9CC,C5BC,CDB5,D9CD,D9C7,B3A5,BFFE,B8B5,C0FC,B0F8,B4F6,D9CE,D9CF,B4A2,D9D0,B4DF,B0C1,D9D1,C9B5,CFF1,D9D2,C1C5,D9D6,C9AE,D9D5,D9D4,D9D7,CBDB,BDA9,C6A7,D9D3,D9D8,D9D9,C8E5,C0DC,B6F9,D8A3,D4CA,D4AA,D0D6,B3E4,D5D7,CFC8,B9E2,BFCB,C3E2,B6D2,CDC3,D9EE,D9F0,B5B3,B6B5,BEA4,C8EB,C8AB,B0CB,B9AB,C1F9,D9E2,C0BC,B9B2,B9D8,D0CB,B1F8,C6E4,BEDF,B5E4,D7C8,D1F8,BCE6,CADE,BCBD,D9E6,D8E7,C4DA,B8D4,C8BD,B2E1,D4D9,C3B0,C3E1,DAA2,C8DF,D0B4,BEFC,C5A9,B9DA,DAA3,D4A9,DAA4,D9FB,B6AC,B7EB,B1F9,D9FC,B3E5,BEF6,BFF6,D2B1,C0E4,B6B3,D9FE,D9FD,BEBB,C6E0,D7BC,DAA1,C1B9,B5F2,C1E8,BCF5,B4D5,C1DD,C4FD,BCB8,B7B2,B7EF,D9EC,C6BE,BFAD,BBCB,B5CA,DBC9,D0D7,CDB9,B0BC,B3F6,BBF7,DBCA,BAAF,D4E4,B5B6,B5F3,D8D6,C8D0,B7D6,C7D0,D8D7,BFAF,DBBB,D8D8,D0CC,BBAE,EBBE,C1D0,C1F5,D4F2,B8D5,B4B4,B3F5,C9BE,C5D0,C5D9,C0FB,B1F0,D8D9,B9CE,B5BD,D8DA,D6C6,CBA2,C8AF,C9B2,B4CC,BFCC,B9F4,D8DB,D8DC,B6E7,BCC1,CCEA,CFF7,D8DD,C7B0,B9D0,BDA3,CCDE,C6CA,D8E0,D8DE,D8DF,B0FE,BEE7,CAA3,BCF4,B8B1,B8EE,D8E2,BDCB,D8E4,D8E3,C5FC,D8E5,D8E6,C1A6,C8B0,B0EC,B9A6,BCD3,CEF1,DBBD,C1D3,B6AF,D6FA,C5AC,BDD9,DBBE,DBBF,C0F8,BEA2,C0CD,DBC0,CAC6,B2AA,D3C2,C3E3,D1AB,DBC2,C0D5,DBC3,BFB1,C4BC,C7DA,DBC4,D9E8,C9D7,B9B4,CEF0,D4C8,B0FC,B4D2,D0D9,D9E9,DECB,D9EB,D8B0,BBAF,B1B1,B3D7,D8CE,D4D1,BDB3,BFEF,CFBB,D8D0,B7CB,D8D1,C6A5,C7F8,D2BD,D8D2,C4E4,CAAE,C7A7,D8A6,C9FD,CEE7,BBDC,B0EB,BBAA,D0AD,B1B0,D7E4,D7BF,B5A5,C2F4,C4CF,B2A9,B2B7,B1E5,DFB2,D5BC,BFA8,C2AC,D8D5,C2B1,D8D4,CED4,DAE0,CEC0,D8B4,C3AE,D3A1,CEA3,BCB4,C8B4,C2D1,BEED,D0B6,DAE1,C7E4,B3A7,B6F2,CCFC,C0FA,C0F7,D1B9,D1E1,D8C7,B2DE,C0E5,BAF1,D8C8,D4AD,CFE1,D8C9,D8CA,CFC3,B3F8,BEC7,D8CB,DBCC,C8A5,CFD8,C8FE,B2CE,D3D6,B2E6,BCB0,D3D1,CBAB,B7B4,B7A2,CAE5,C8A1,CADC,B1E4,D0F0,C5D1,DBC5,B5FE,BFDA,B9C5,BEE4,C1ED,DFB6,DFB5,D6BB,BDD0,D5D9,B0C8,B6A3,BFC9,CCA8,DFB3,CAB7,D3D2,D8CF,D2B6,BAC5,CBBE,CCBE,DFB7,B5F0,DFB4,D3F5,B3D4,B8F7,DFBA,BACF,BCAA,B5F5,CDAC,C3FB,BAF3,C0F4,CDC2,CFF2,DFB8,CFC5,C2C0,DFB9,C2F0,BEFD,C1DF,CDCC,D2F7,B7CD,DFC1,DFC4,B7F1,B0C9,B6D6,B7D4,BAAC,CCFD,BFD4,CBB1,C6F4,D6A8,DFC5,CEE2,B3B3,CEFC,B4B5,CEC7,BAF0,CEE1,D1BD,DFC0,B4F4,B3CA,B8E6,DFBB,C4C5,DFBC,DFBD,DFBE,C5BB,DFBF,DFC2,D4B1,DFC3,C7BA,CED8,C4D8,DFCA,DFCF,D6DC,DFC9,DFDA,CEB6,BAC7,DFCE,DFC8,C5DE,C9EB,BAF4,C3FC,BED7,DFC6,DFCD,C5D8,D5A6,BACD,BECC,D3BD,B8C0,D6E4,DFC7,B9BE,BFA7,C1FC,DFCB,DFCC,DFD0,DFDB,DFE5,DFD7,DFD6,D7C9,DFE3,DFE4,E5EB,D2A7,DFD2,BFA9,D4DB,BFC8,DFD4,CFCC,DFDD,D1CA,DFDE,B0A7,C6B7,DFD3,BAE5,B6DF,CDDB,B9FE,D4D5,DFDF,CFEC,B0A5,DFE7,DFD1,D1C6,DFD5,DFD8,DFD9,DFDC,BBA9,DFE0,DFE1,DFE2,DFE6,DFE8,D3B4,B8E7,C5B6,DFEA,C9DA,C1A8,C4C4,BFDE,CFF8,D5DC,DFEE,B2B8,BADF,DFEC,DBC1,D1E4,CBF4,B4BD,B0A6,DFF1,CCC6,DFF2,DFED,DFE9,DFEB,DFEF,DFF0,BBBD,DFF3,DFF4,BBA3,CADB,CEA8,E0A7,B3AA,E0A6,E0A1,DFFE,CDD9,DFFC,DFFA,BFD0,D7C4,C9CC,DFF8,B0A1,DFFD,DFFB,E0A2,E0A8,B7C8,C6A1,C9B6,C0B2,DFF5,C5BE,D8C4,DFF9,C4F6,E0A3,E0A4,E0A5,D0A5,E0B4,CCE4,E0B1,BFA6,E0AF,CEB9,E0AB,C9C6,C0AE,E0AE,BAED,BAB0,E0A9,DFF6,E0B3,E0B8,B4AD,E0B9,CFB2,BAC8,E0B0,D0FA,E0AC,D4FB,DFF7,C5E7,E0AD,D3F7,E0B6,E0B7,E0C4,D0E1,E0BC,E0C9,E0CA,E0BE,E0AA,C9A4,E0C1,E0B2,CAC8,E0C3,E0B5,CECB,CBC3,E0CD,E0C6,E0C2,E0CB,E0BA,E0BF,E0C0,E0C5,E0C7,E0C8,E0CC,E0BB,CBD4,E0D5,E0D6,E0D2,E0D0,BCCE,E0D1,B8C2,D8C5,D0EA,C2EF,E0CF,E0BD,E0D4,E0D3,E0D7,E0DC,E0D8,D6F6,B3B0,D7EC,CBBB,E0DA,CEFB,BAD9,E0E1,E0DD,D2AD,E0E2,E0DB,E0D9,E0DF,E0E0,E0DE,E0E4,C6F7,D8AC,D4EB,E0E6,CAC9,E0E5,B8C1,E0E7,E0E8,E0E9,E0E3,BABF,CCE7,E0EA,CFF9,E0EB,C8C2,BDC0,C4D2,E0EC,E0ED,C7F4,CBC4,E0EE,BBD8,D8B6,D2F2,E0EF,CDC5,B6DA,E0F1,D4B0,C0A7,B4D1,CEA7,E0F0,E0F2,B9CC,B9FA,CDBC,E0F3,C6D4,E0F4,D4B2,C8A6,E0F6,E0F5,E0F7,CDC1,CAA5,D4DA,DBD7,DBD9,DBD8,B9E7,DBDC,DBDD,B5D8,DBDA,DBDB,B3A1,DBDF,BBF8,D6B7,DBE0,BEF9,B7BB,DBD0,CCAE,BFB2,BBB5,D7F8,BFD3,BFE9,BCE1,CCB3,DBDE,B0D3,CEEB,B7D8,D7B9,C6C2,C0A4,CCB9,DBE7,DBE1,C6BA,DBE3,DBE8,C5F7,DBEA,DBE9,BFC0,DBE6,DBE5,B4B9,C0AC,C2A2,DBE2,DBE4,D0CD,DBED,C0DD,DBF2,B6E2,DBF3,DBD2,B9B8,D4AB,DBEC,BFD1,DBF0,DBD1,B5E6,DBEB,BFE5,DBEE,DBF1,DBF9,B9A1,B0A3,C2F1,B3C7,DBEF,DBF8,C6D2,DBF4,DBF5,DBF7,DBF6,DBFE,D3F2,B2BA,DBFD,DCA4,DBFB,DBFA,DBFC,C5E0,BBF9,DCA3,DCA5,CCC3,B6D1,DDC0,DCA1,DCA2,C7B5,B6E9,DCA7,DCA6,DCA9,B1A4,B5CC,BFB0,D1DF,B6C2,DCA8,CBFA,EBF3,CBDC,CBFE,CCC1,C8FB,DCAA,CCEE,DCAB,DBD3,DCAF,DCAC,BEB3,CAFB,DCAD,C9CA,C4B9,C7BD,DCAE,D4F6,D0E6,C4AB,B6D5,DBD4,B1DA,DBD5,DBD6,BABE,C8C0,CABF,C8C9,D7B3,C9F9,BFC7,BAF8,D2BC,E2BA,B4A6,B1B8,B8B4,CFC4,D9E7,CFA6,CDE2,D9ED,B6E0,D2B9,B9BB,E2B9,E2B7,B4F3,CCEC,CCAB,B7F2,D8B2,D1EB,BABB,CAA7,CDB7,D2C4,BFE4,BCD0,B6E1,DEC5,DEC6,DBBC,D1D9,C6E6,C4CE,B7EE,B7DC,BFFC,D7E0,C6F5,B1BC,DEC8,BDB1,CCD7,DECA,DEC9,B5EC,C9DD,B0C2,C5AE,C5AB,C4CC,BCE9,CBFD,BAC3,E5F9,C8E7,E5FA,CDFD,D7B1,B8BE,C2E8,C8D1,E5FB,B6CA,BCCB,D1FD,E6A1,C3EE,E6A4,E5FE,E6A5,CDD7,B7C1,E5FC,E5FD,E6A3,C4DD,E6A8,E6A7,C3C3,C6DE,E6AA,C4B7,E6A2,CABC,BDE3,B9C3,E6A6,D0D5,CEAF,E6A9,E6B0,D2A6,BDAA,E6AD,E6AF,C0D1,D2CC,BCA7,E6B1,D2F6,D7CB,CDFE,CDDE,C2A6,E6AB,E6AC,BDBF,E6AE,E6B3,E6B2,E6B6,E6B8,C4EF,C4C8,BEEA,C9EF,E6B7,B6F0,C3E4,D3E9,E6B4,E6B5,C8A2,E6BD,E6B9,C6C5,CDF1,E6BB,E6BC,BBE9,E6BE,E6BA,C0B7,D3A4,E6BF,C9F4,E6C3,E6C4,D0F6,C3BD,C3C4,E6C2,E6C1,E6C7,CFB1,EBF4,E6CA,E6C5,BCDE,C9A9,BCB5,CFD3,E6C8,E6C9,E6CE,E6D0,E6D1,E6CB,B5D5,E6CC,E6CF,C4DB,E6C6,E6CD,E6D2,E6D4,E6D3,E6D5,D9F8,E6D6,E6D7,D7D3,E6DD,E6DE,BFD7,D4D0,D7D6,B4E6,CBEF,E6DA,D8C3,D7CE,D0A2,C3CF,E6DF,BCBE,B9C2,E6DB,D1A7,BAA2,C2CF,D8AB,CAEB,E5EE,E6DC,B7F5,C8E6,C4F5,E5B2,C4FE,CBFC,E5B3,D5AC,D3EE,CAD8,B0B2,CBCE,CDEA,BAEA,E5B5,E5B4,D7DA,B9D9,D6E6,B6A8,CDF0,D2CB,B1A6,CAB5,B3E8,C9F3,BFCD,D0FB,CAD2,E5B6,BBC2,CFDC,B9AC,D4D7,BAA6,D1E7,CFFC,BCD2,E5B7,C8DD,BFED,B1F6,CBDE,BCC5,BCC4,D2FA,C3DC,BFDC,B8BB,C3C2,BAAE,D4A2,C7DE,C4AF,B2EC,B9D1,E5BB,C1C8,D5AF,E5BC,E5BE,B4E7,B6D4,CBC2,D1B0,B5BC,CAD9,B7E2,C9E4,BDAB,CEBE,D7F0,D0A1,C9D9,B6FB,E6D8,BCE2,B3BE,C9D0,E6D9,B3A2,DECC,D3C8,DECD,D2A2,DECE,BECD,DECF,CAAC,D2FC,B3DF,E5EA,C4E1,BEA1,CEB2,C4F2,BED6,C6A8,B2E3,BED3,C7FC,CCEB,BDEC,CEDD,CABA,C6C1,E5EC,D0BC,D5B9,E5ED,CAF4,CDC0,C2C5,E5EF,C2C4,E5F0,E5F8,CDCD,C9BD,D2D9,E1A8,D3EC,CBEA,C6F1,E1AC,E1A7,E1A9,E1AA,E1AF,B2ED,E1AB,B8DA,E1AD,E1AE,E1B0,B5BA,E1B1,E1B3,E1B8,D1D2,E1B6,E1B5,C1EB,E1B7,D4C0,E1B2,E1BA,B0B6,E1B4,BFF9,E1B9,E1BB,E1BE,E1BC,D6C5,CFBF,E1BD,E1BF,C2CD,B6EB,D3F8,C7CD,B7E5,BEFE,E1C0,E1C1,E1C7,B3E7,C6E9,B4DE,D1C2,E1C8,E1C6,E1C5,E1C3,E1C2,B1C0,D5B8,E1C4,E1CB,E1CC,E1CA,EFFA,E1D3,E1D2,C7B6,E1C9,E1CE,E1D0,E1D4,E1D1,E1CD,E1CF,E1D5,E1D6,E1D7,E1D8,E1DA,E1DB,CEA1,E7DD,B4A8,D6DD,D1B2,B3B2,B9A4,D7F3,C7C9,BEDE,B9AE,CED7,B2EE,DBCF,BCBA,D2D1,CBC8,B0CD,CFEF,D9E3,BDED,B1D2,CAD0,B2BC,CBA7,B7AB,CAA6,CFA3,E0F8,D5CA,E0FB,E0FA,C5C1,CCFB,C1B1,E0F9,D6E3,B2AF,D6C4,B5DB,B4F8,D6A1,CFAF,B0EF,E0FC,E1A1,B3A3,E0FD,E0FE,C3B1,C3DD,E1A2,B7F9,BBCF,E1A3,C4BB,E1A4,E1A5,E1A6,B4B1,B8C9,C6BD,C4EA,B2A2,D0D2,E7DB,BBC3,D3D7,D3C4,B9E3,E2CF,D7AF,C7EC,B1D3,B4B2,E2D1,D0F2,C2AE,E2D0,BFE2,D3A6,B5D7,E2D2,B5EA,C3ED,B8FD,B8AE,C5D3,B7CF,E2D4,E2D3,B6C8,D7F9,CDA5,E2D8,E2D6,CAFC,BFB5,D3B9,E2D5,E2D7,C1AE,C0C8,E2DB,E2DA,C0AA,C1CE,E2DC,E2DD,E2DE,DBC8,D1D3,CDA2,BDA8,DEC3,D8A5,BFAA,DBCD,D2EC,C6FA,C5AA,DEC4,B1D7,DFAE,CABD,DFB1,B9AD,D2FD,B8A5,BAEB,B3DA,B5DC,D5C5,C3D6,CFD2,BBA1,E5F3,E5F2,E5F4,CDE4,C8F5,B5AF,C7BF,E5F6,ECB0,E5E6,B9E9,B5B1,C2BC,E5E8,E5E7,E5E9,D2CD,E1EA,D0CE,CDAE,D1E5,B2CA,B1EB,B1F2,C5ED,D5C3,D3B0,E1DC,E1DD,D2DB,B3B9,B1CB,CDF9,D5F7,E1DE,BEB6,B4FD,E1DF,BADC,E1E0,BBB2,C2C9,E1E1,D0EC,CDBD,E1E2,B5C3,C5C7,E1E3,E1E4,D3F9,E1E5,D1AD,E1E6,CEA2,E1E7,B5C2,E1E8,BBD5,D0C4,E2E0,B1D8,D2E4,E2E1,BCC9,C8CC,E2E3,ECFE,ECFD,DFAF,E2E2,D6BE,CDFC,C3A6,E3C3,D6D2,E2E7,E2E8,D3C7,E2EC,BFEC,E2ED,E2E5,B3C0,C4EE,E2EE,D0C3,BAF6,E2E9,B7DE,BBB3,CCAC,CBCB,E2E4,E2E6,E2EA,E2EB,E2F7,E2F4,D4F5,E2F3,C5AD,D5FA,C5C2,B2C0,E2EF,E2F2,C1AF,CBBC,B5A1,E2F9,BCB1,E2F1,D0D4,D4B9,E2F5,B9D6,E2F6,C7D3,E2F0,D7DC,EDA1,E2F8,EDA5,E2FE,CAD1,C1B5,BBD0,BFD6,BAE3,CBA1,EDA6,EDA3,EDA2,BBD6,EDA7,D0F4,EDA4,BADE,B6F7,E3A1,B6B2,CCF1,B9A7,CFA2,C7A1,BFD2,B6F1,E2FA,E2FB,E2FD,E2FC,C4D5,E3A2,D3C1,E3A7,C7C4,CFA4,E3A9,BAB7,E3A8,BBDA,E3A3,E3A4,E3AA,E3A6,CEF2,D3C6,BBBC,D4C3,C4FA,EDA8,D0FC,E3A5,C3F5,E3AD,B1AF,E3B2,BCC2,E3AC,B5BF,C7E9,E3B0,BEAA,CDEF,BBF3,CCE8,E3AF,E3B1,CFA7,E3AE,CEA9,BBDD,B5EB,BEE5,B2D2,B3CD,B1B9,E3AB,B2D1,B5AC,B9DF,B6E8,CFEB,E3B7,BBCC,C8C7,D0CA,E3B8,B3EE,EDA9,D3FA,D3E4,EDAA,E3B9,D2E2,E3B5,D3DE,B8D0,E3B3,E3B6,B7DF,E3B4,C0A2,E3BA,D4B8,B4C8,E3BB,BBC5,C9F7,C9E5,C4BD,EDAB,C2FD,BBDB,BFAE,CEBF,E3BC,BFB6,B1EF,D4F7,E3BE,EDAD,E3BF,BAA9,EDAC,E3BD,E3C0,BAB6,B6AE,D0B8,B0C3,EDAE,EDAF,C0C1,E3C1,C5B3,E3C2,DCB2,EDB0,B8EA,CEEC,EAA7,D0E7,CAF9,C8D6,CFB7,B3C9,CED2,BDE4,E3DE,BBF2,EAA8,D5BD,C6DD,EAA9,EAAA,EAAC,EAAB,EAAE,EAAD,BDD8,EAAF,C2BE,B4C1,B4F7,BBA7,ECE6,ECE5,B7BF,CBF9,B1E2,ECE7,C9C8,ECE8,ECE9,CAD6,DED0,B2C5,D4FA,C6CB,B0C7,B4F2,C8D3,CDD0,BFB8,BFDB,C7A4,D6B4,C0A9,DED1,C9A8,D1EF,C5A4,B0E7,B3B6,C8C5,B0E2,B7F6,C5FA,B6F3,D5D2,B3D0,BCBC,B3AD,BEF1,B0D1,D2D6,CAE3,D7A5,CDB6,B6B6,BFB9,D5DB,B8A7,C5D7,DED2,BFD9,C2D5,C7C0,BBA4,B1A8,C5EA,C5FB,CCA7,B1A7,B5D6,C4A8,DED3,D1BA,B3E9,C3F2,B7F7,D6F4,B5A3,B2F0,C4B4,C4E9,C0AD,DED4,B0E8,C5C4,C1E0,B9D5,BEDC,CDD8,B0CE,CDCF,DED6,BED0,D7BE,DED5,D5D0,B0DD,C4E2,C2A3,BCF0,D3B5,C0B9,C5A1,B2A6,D4F1,C0A8,CAC3,DED7,D5FC,B9B0,C8AD,CBA9,DED9,BFBD,C6B4,D7A7,CAB0,C4C3,B3D6,B9D2,D6B8,EAFC,B0B4,BFE6,CCF4,CDDA,D6BF,C2CE,CECE,CCA2,D0AE,C4D3,B5B2,DED8,D5F5,BCB7,BBD3,B0A4,C5B2,B4EC,D5F1,EAFD,DEDA,CDA6,CDEC,CEE6,DEDC,CDB1,C0A6,D7BD,DEDB,B0C6,BAB4,C9D3,C4F3,BEE8,B2B6,C0CC,CBF0,BCF1,BBBB,B5B7,C5F5,DEE6,DEE3,BEDD,DEDF,B4B7,BDDD,DEE0,C4ED,CFC6,B5E0,B6DE,CADA,B5F4,DEE5,D5C6,DEE1,CCCD,C6FE,C5C5,D2B4,BEF2,C2D3,CCBD,B3B8,BDD3,BFD8,CDC6,D1DA,B4EB,DEE4,DEDD,DEE7,EAFE,C2B0,DEE2,D6C0,B5A7,B2F4,DEE8,DEF2,DEED,DEF1,C8E0,D7E1,DEEF,C3E8,CCE1,B2E5,D2BE,DEEE,DEEB,CED5,B4A7,BFAB,BEBE,BDD2,DEE9,D4AE,DEDE,DEEA,C0BF,DEEC,B2F3,B8E9,C2A7,BDC1,DEF5,DEF8,B2AB,B4A4,B4EA,C9A6,DEF6,CBD1,B8E3,DEF7,DEFA,DEF9,CCC2,B0E1,B4EE,E5BA,D0AF,B2EB,EBA1,DEF4,C9E3,DEF3,B0DA,D2A1,B1F7,CCAF,DEF0,CBA4,D5AA,DEFB,B4DD,C4A6,DEFD,C3FE,C4A1,DFA1,C1CC,DEFC,BEEF,C6B2,B3C5,C8F6,CBBA,DEFE,DFA4,D7B2,B3B7,C1C3,C7CB,B2A5,B4E9,D7AB,C4EC,DFA2,DFA3,DFA5,BAB3,DFA6,C0DE,C9C3,B2D9,C7E6,DFA7,C7DC,DFA8,EBA2,CBD3,DFAA,DFA9,B2C1,C5CA,DFAB,D4DC,C8C1,DFAC,BEF0,DFAD,D6A7,EAB7,EBB6,CAD5,D8FC,B8C4,B9A5,B7C5,D5FE,B9CA,D0A7,F4CD,B5D0,C3F4,BEC8,EBB7,B0BD,BDCC,C1B2,B1D6,B3A8,B8D2,C9A2,B6D8,EBB8,BEB4,CAFD,C7C3,D5FB,B7F3,CEC4,D5AB,B1F3,ECB3,B0DF,ECB5,B6B7,C1CF,F5FA,D0B1,D5E5,CED3,BDEF,B3E2,B8AB,D5B6,EDBD,B6CF,CBB9,D0C2,B7BD,ECB6,CAA9,C5D4,ECB9,ECB8,C2C3,ECB7,D0FD,ECBA,ECBB,D7E5,ECBC,ECBD,C6EC,CEDE,BCC8,C8D5,B5A9,BEC9,D6BC,D4E7,D1AE,D0F1,EAB8,EAB9,EABA,BAB5,CAB1,BFF5,CDFA,EAC0,B0BA,EABE,C0A5,EABB,B2FD,C3F7,BBE8,D2D7,CEF4,EABF,EABC,EAC3,D0C7,D3B3,B4BA,C3C1,D7F2,D5D1,CAC7,EAC5,EAC4,EAC7,EAC6,D6E7,CFD4,EACB,BBCE,BDFA,C9CE,EACC,C9B9,CFFE,EACA,D4CE,EACD,EACF,CDED,EAC9,EACE,CEEE,BBDE,B3BF,C6D5,BEB0,CEFA,C7E7,BEA7,EAD0,D6C7,C1C0,D4DD,EAD1,CFBE,EAD2,CAEE,C5AF,B0B5,EAD4,EAD3,F4DF,C4BA,B1A9,E5DF,EAD5,CAEF,EAD6,EAD7,C6D8,EAD8,EAD9,D4BB,C7FA,D2B7,B8FC,EAC2,B2DC,C2FC,D4F8,CCE6,D7EE,D4C2,D3D0,EBC3,C5F3,B7FE,EBD4,CBB7,EBDE,C0CA,CDFB,B3AF,C6DA,EBFC,C4BE,CEB4,C4A9,B1BE,D4FD,CAF5,D6EC,C6D3,B6E4,BBFA,D0E0,C9B1,D4D3,C8A8,B8CB,E8BE,C9BC,E8BB,C0EE,D0D3,B2C4,B4E5,E8BC,D5C8,B6C5,E8BD,CAF8,B8DC,CCF5,C0B4,D1EE,E8BF,E8C2,BABC,B1AD,BDDC,EABD,E8C3,E8C6,E8CB,E8CC,CBC9,B0E5,BCAB,B9B9,E8C1,CDF7,E8CA,CEF6,D5ED,C1D6,E8C4,C3B6,B9FB,D6A6,E8C8,CAE0,D4E6,E8C0,E8C5,E8C7,C7B9,B7E3,E8C9,BFDD,E8D2,E8D7,E8D5,BCDC,BCCF,E8DB,E8DE,E8DA,B1FA,B0D8,C4B3,B8CC,C6E2,C8BE,C8E1,E8CF,E8D4,E8D6,B9F1,E8D8,D7F5,C4FB,E8DC,B2E9,E8D1,BCED,BFC2,E8CD,D6F9,C1F8,B2F1,E8DF,CAC1,E8D9,D5A4,B1EA,D5BB,E8CE,E8D0,B6B0,E8D3,E8DD,C0B8,CAF7,CBA8,C6DC,C0F5,E8E9,D0A3,E8F2,D6EA,E8E0,E8E1,D1F9,BACB,B8F9,B8F1,D4D4,E8EF,E8EE,E8EC,B9F0,CCD2,E8E6,CEA6,BFF2,B0B8,E8F1,E8F0,D7C0,E8E4,CDA9,C9A3,BBB8,BDDB,E8EA,E8E2,E8E3,E8E5,B5B5,E8E7,C7C5,E8EB,E8ED,BDB0,D7AE,E8F8,E8F5,CDB0,E8F6,C1BA,E8E8,C3B7,B0F0,E8F4,E8F7,B9A3,C9D2,C3CE,CEE0,C0E6,CBF3,CCDD,D0B5,CAE1,E8F3,BCEC,E8F9,C3DE,C6E5,B9F7,B0F4,D7D8,BCAC,C5EF,CCC4,E9A6,C9AD,E9A2,C0E2,BFC3,E8FE,B9D7,E8FB,E9A4,D2CE,E9A3,D6B2,D7B5,E9A7,BDB7,E8FC,E8FD,E9A1,CDD6,D2AC,E9B2,E9A9,B4AA,B4BB,E9AB,D0A8,E9A5,B3FE,E9AC,C0E3,E9AA,E9B9,E9B8,E9AE,E8FA,E9A8,BFAC,E9B1,E9BA,C2A5,E9AF,B8C5,E9AD,D3DC,E9B4,E9B5,E9B7,E9C7,C0C6,E9C5,E9B0,E9BB,B0F1,E9BC,D5A5,E9BE,E9BF,E9C1,C1F1,C8B6,E9BD,E9C2,E9C3,E9B3,E9B6,BBB1,E9C0,BCF7,E9C4,E9C6,E9CA,E9CE,B2DB,E9C8,B7AE,E9CB,E9CC,D5C1,C4A3,E9D8,BAE1,E9C9,D3A3,E9D4,E9D7,E9D0,E9CF,C7C1,E9D2,E9D9,B3C8,E9D3,CFF0,E9CD,B3F7,E9D6,E9DA,CCB4,CFAD,E9D5,E9DC,E9DB,E9DE,E9D1,E9DD,E9DF,C3CA,C7B7,B4CE,BBB6,D0C0,ECA3,C5B7,D3FB,ECA4,ECA5,C6DB,BFEE,ECA6,ECA7,D0AA,C7B8,B8E8,ECA8,D6B9,D5FD,B4CB,B2BD,CEE4,C6E7,CDE1,B4F5,CBC0,BCDF,E9E2,E9E3,D1EA,E9E5,B4F9,E9E4,D1B3,CAE2,B2D0,E9E8,E9E6,E9E7,D6B3,E9E9,E9EA,E9EB,E9EC,ECAF,C5B9,B6CE,D2F3,B5EE,BBD9,ECB1,D2E3,CEE3,C4B8,C3BF,B6BE,D8B9,B1C8,B1CF,B1D1,C5FE,B1D0,C3AB,D5B1,EBA4,BAC1,CCBA,EBA5,EBA7,EBA8,EBA6,EBA9,EBAB,EBAA,EBAC,CACF,D8B5,C3F1,C3A5,C6F8,EBAD,C4CA,EBAE,EBAF,EBB0,B7D5,B7FA,EBB1,C7E2,EBB3,BAA4,D1F5,B0B1,EBB2,EBB4,B5AA,C2C8,C7E8,EBB5,CBAE,E3DF,D3C0,D9DB,CDA1,D6AD,C7F3,D9E0,BBE3,BABA,E3E2,CFAB,E3E0,C9C7,BAB9,D1B4,E3E1,C8EA,B9AF,BDAD,B3D8,CEDB,CCC0,E3E8,E3E9,CDF4,CCAD,BCB3,E3EA,E3EB,D0DA,C6FB,B7DA,C7DF,D2CA,CED6,E3E4,E3EC,C9F2,B3C1,E3E7,C6E3,E3E5,EDB3,E3E6,C9B3,C5E6,B9B5,C3BB,E3E3,C5BD,C1A4,C2D9,B2D7,E3ED,BBA6,C4AD,E3F0,BEDA,E3FB,E3F5,BAD3,B7D0,D3CD,D6CE,D5D3,B9C1,D5B4,D1D8,D0B9,C7F6,C8AA,B2B4,C3DA,E3EE,E3FC,E3EF,B7A8,E3F7,E3F4,B7BA,C5A2,E3F6,C5DD,B2A8,C6FC,C4E0,D7A2,C0E1,E3F9,E3FA,E3FD,CCA9,E3F3,D3BE,B1C3,EDB4,E3F1,E3F2,E3F8,D0BA,C6C3,D4F3,E3FE,BDE0,E4A7,E4A6,D1F3,E4A3,E4A9,C8F7,CFB4,E4A8,E4AE,C2E5,B6B4,BDF2,E4A2,BAE9,E4AA,E4AC,B6FD,D6DE,E4B2,E4AD,E4A1,BBEE,CDDD,C7A2,C5C9,C1F7,E4A4,C7B3,BDAC,BDBD,E4A5,D7C7,B2E2,E4AB,BCC3,E4AF,BBEB,E4B0,C5A8,E4B1,D5E3,BFA3,E4BA,E4B7,E4BB,E4BD,C6D6,BAC6,C0CB,B8A1,E4B4,D4A1,BAA3,BDFE,E4BC,CDBF,C4F9,CFFB,C9E6,D3BF,CFD1,E4B3,E4B8,E4B9,CCE9,CCCE,C0D4,E4B5,C1B0,E4B6,CED0,BBC1,B5D3,C8F3,BDA7,D5C7,C9AC,B8A2,E4CA,E4CC,D1C4,D2BA,BAAD,BAD4,E4C3,B5ED,D7CD,E4C0,CFFD,E4BF,C1DC,CCCA,CAE7,C4D7,CCD4,E4C8,E4C7,E4C1,E4C4,B5AD,D3D9,E4C6,D2F9,B4E3,BBB4,C9EE,B4BE,BBEC,D1CD,CCED,EDB5,C7E5,D4A8,E4CB,D7D5,E4C2,BDA5,E4C5,D3E6,E4C9,C9F8,E4BE,D3E5,C7FE,B6C9,D4FC,B2B3,E4D7,CEC2,E4CD,CEBC,B8DB,E4D6,BFCA,D3CE,C3EC,C5C8,E4D8,CDC4,E4CF,E4D4,E4D5,BAFE,CFE6,D5BF,E4D2,E4D0,E4CE,CDE5,CAAA,C0A3,BDA6,E4D3,B8C8,E4E7,D4B4,E4DB,C1EF,E4E9,D2E7,E4DF,E4E0,CFAA,CBDD,E4DA,E4D1,E4E5,C8DC,E4E3,C4E7,E4E2,E4E1,B3FC,E4E8,B5E1,D7CC,E4E6,BBAC,D7D2,CCCF,EBF8,E4E4,B9F6,D6CD,E4D9,E4DC,C2FA,E4DE,C2CB,C0C4,C2D0,B1F5,CCB2,B5CE,E4EF,C6AF,C6E1,E4F5,C2A9,C0EC,D1DD,E4EE,C4AE,E4ED,E4F6,E4F4,C2FE,E4DD,E4F0,CAFE,D5C4,E4F1,D1FA,E4EB,E4EC,E4F2,CEAB,C5CB,C7B1,C2BA,E4EA,C1CA,CCB6,B3B1,E4FB,E4F3,E4FA,E4FD,E4FC,B3CE,B3BA,E4F7,E4F9,E4F8,C5EC,C0BD,D4E8,E5A2,B0C4,E5A4,E5A3,BCA4,E5A5,E5A1,E4FE,B1F4,E5A8,E5A9,E5A6,E5A7,E5AA,C6D9,E5AB,E5AD,E5AC,E5AF,E5AE,B9E0,E5B0,E5B1,BBF0,ECE1,C3F0,B5C6,BBD2,C1E9,D4EE,BEC4,D7C6,D4D6,B2D3,ECBE,EAC1,C2AF,B4B6,D1D7,B3B4,C8B2,BFBB,ECC0,D6CB,ECBF,ECC1,ECC5,BEE6,CCBF,C5DA,BEBC,ECC6,B1FE,ECC4,D5A8,B5E3,ECC2,C1B6,B3E3,ECC3,CBB8,C0C3,CCFE,C1D2,ECC8,BAE6,C0D3,D6F2,D1CC,BFBE,B7B3,C9D5,ECC7,BBE2,CCCC,BDFD,C8C8,CFA9,CDE9,C5EB,B7E9,D1C9,BAB8,ECC9,ECCA,BBC0,ECCB,ECE2,B1BA,B7D9,BDB9,ECCC,D1E6,ECCD,C8BB,ECD1,ECD3,BBCD,BCE5,ECCF,C9B7,C3BA,ECE3,D5D5,ECD0,D6F3,ECD2,ECCE,ECD4,ECD5,C9BF,CFA8,D0DC,D1AC,C8DB,ECD6,CEF5,CAEC,ECDA,ECD9,B0BE,ECD7,ECD8,ECE4,C8BC,C1C7,ECDC,D1E0,ECDB,D4EF,ECDD,DBC6,ECDE,B1AC,ECDF,ECE0,D7A6,C5C0,EBBC,B0AE,BEF4,B8B8,D2AF,B0D6,B5F9,D8B3,CBAC,E3DD,C6AC,B0E6,C5C6,EBB9,EBBA,EBBB,D1C0,C5A3,EAF2,C4B2,C4B5,C0CE,EAF3,C4C1,CEEF,EAF0,EAF4,C9FC,C7A3,CCD8,CEFE,EAF5,EAF6,CFAC,C0E7,EAF7,B6BF,EAF8,EAF9,EAFA,EAFB,EAF1,C8AE,E1EB,B7B8,E1EC,E1ED,D7B4,E1EE,E1EF,D3CC,E1F1,BFF1,E1F0,B5D2,B1B7,E1F3,E1F2,BAFC,E1F4,B9B7,BED1,C4FC,BADD,BDC6,E1F5,E1F7,B6C0,CFC1,CAA8,E1F6,D5F8,D3FC,E1F8,E1FC,E1F9,E1FA,C0EA,E1FE,E2A1,C0C7,E1FB,E1FD,E2A5,C1D4,E2A3,E2A8,B2FE,E2A2,C3CD,B2C2,E2A7,E2A6,E2A4,E2A9,E2AB,D0C9,D6ED,C3A8,E2AC,CFD7,E2AE,BAEF,E9E0,E2AD,E2AA,BBAB,D4B3,E2B0,E2AF,E9E1,E2B1,E2B2,E2B3,CCA1,E2B4,E2B5,D0FE,C2CA,D3F1,CDF5,E7E0,E7E1,BEC1,C2EA,E7E4,E7E3,CDE6,C3B5,E7E2,BBB7,CFD6,C1E1,E7E9,E7E8,E7F4,B2A3,E7EA,E7E6,E7EC,E7EB,C9BA,D5E4,E7E5,B7A9,E7E7,E7EE,E7F3,D6E9,E7ED,E7F2,E7F1,B0E0,E7F5,C7F2,C0C5,C0ED,C1F0,E7F0,E7F6,CBF6,E8A2,E8A1,D7C1,E7FA,E7F9,E7FB,E7F7,E7FE,E7FD,E7FC,C1D5,C7D9,C5FD,C5C3,C7ED,E8A3,E8A6,E8A5,E8A7,BAF7,E7F8,E8A4,C8F0,C9AA,E8A9,B9E5,D1FE,E8A8,E8AA,E8AD,E8AE,C1A7,E8AF,E8B0,E8AC,E8B4,E8AB,E8B1,E8B5,E8B2,E8B3,E8B7,E8B6,B9CF,F0AC,F0AD,C6B0,B0EA,C8BF,CDDF,CECD,EAB1,EAB2,C6BF,B4C9,EAB3,D5E7,DDF9,EAB4,EAB5,EAB6,B8CA,DFB0,C9F5,CCF0,C9FA,C9FB,D3C3,CBA6,B8A6,F0AE,B1C2,E5B8,CCEF,D3C9,BCD7,C9EA,B5E7,C4D0,B5E9,EEAE,BBAD,E7DE,EEAF,B3A9,EEB2,EEB1,BDE7,EEB0,CEB7,C5CF,C1F4,DBCE,EEB3,D0F3,C2D4,C6E8,B7AC,EEB4,B3EB,BBFB,EEB5,E7DC,EEB6,BDAE,F1E2,CAE8,D2C9,F0DA,F0DB,F0DC,C1C6,B8ED,BECE,F0DE,C5B1,F0DD,D1F1,F0E0,B0CC,BDEA,D2DF,F0DF,B4AF,B7E8,F0E6,F0E5,C6A3,F0E1,F0E2,B4C3,F0E3,D5EE,CCDB,BED2,BCB2,F0E8,F0E7,F0E4,B2A1,D6A2,D3B8,BEB7,C8AC,F0EA,D1F7,D6CC,BADB,F0E9,B6BB,CDB4,C6A6,C1A1,F0EB,F0EE,F0ED,F0F0,F0EC,BBBE,F0EF,CCB5,F0F2,B3D5,B1D4,F0F3,F0F4,F0F6,B4E1,F0F1,F0F7,F0FA,F0F8,F0F5,F0FD,F0F9,F0FC,F0FE,F1A1,CEC1,F1A4,F1A3,C1F6,F0FB,CADD,B4F1,B1F1,CCB1,F1A6,F1A7,F1AC,D5CE,F1A9,C8B3,F1A2,F1AB,F1A8,F1A5,F1AA,B0A9,F1AD,F1AF,F1B1,F1B0,F1AE,D1A2,F1B2,F1B3,B9EF,B5C7,B0D7,B0D9,D4ED,B5C4,BDD4,BBCA,F0A7,B8DE,F0A8,B0A8,F0A9,CDEE,F0AA,F0AB,C6A4,D6E5,F1E4,F1E5,C3F3,D3DB,D6D1,C5E8,D3AF,D2E6,EEC1,B0BB,D5B5,D1CE,BCE0,BAD0,BFF8,B8C7,B5C1,C5CC,CAA2,C3CB,EEC2,C4BF,B6A2,EDEC,C3A4,D6B1,CFE0,EDEF,C5CE,B6DC,CAA1,EDED,EDF0,EDF1,C3BC,BFB4,EDEE,EDF4,EDF2,D5E6,C3DF,EDF3,EDF6,D5A3,D1A3,EDF5,C3D0,EDF7,BFF4,BEEC,EDF8,CCF7,D1DB,D7C5,D5F6,EDFC,EDFB,EDF9,EDFA,EDFD,BEA6,CBAF,EEA1,B6BD,EEA2,C4C0,EDFE,BDDE,B2C7,B6C3,EEA5,D8BA,EEA3,EEA6,C3E9,B3F2,EEA7,EEA4,CFB9,EEA8,C2F7,EEA9,EEAA,DEAB,C6B3,C7C6,D6F5,B5C9,CBB2,EEAB,CDAB,EEAC,D5B0,EEAD,F6C4,DBC7,B4A3,C3AC,F1E6,CAB8,D2D3,D6AA,EFF2,BED8,BDC3,EFF3,B6CC,B0AB,CAAF,EDB6,EDB7,CEF9,B7AF,BFF3,EDB8,C2EB,C9B0,EDB9,C6F6,BFB3,EDBC,C5F8,D1D0,D7A9,EDBA,EDBB,D1E2,EDBF,EDC0,EDC4,EDC8,EDC6,EDCE,D5E8,EDC9,EDC7,EDBE,C5E9,C6C6,C9E9,D4D2,EDC1,EDC2,EDC3,EDC5,C0F9,B4A1,B9E8,EDD0,EDD1,EDCA,EDCF,CEF8,CBB6,EDCC,EDCD,CFF5,EDD2,C1F2,D3B2,EDCB,C8B7,BCEF,C5F0,EDD6,B5EF,C2B5,B0AD,CBE9,B1AE,EDD4,CDEB,B5E2,EDD5,EDD3,EDD7,B5FA,EDD8,EDD9,EDDC,B1CC,C5F6,BCEE,EDDA,CCBC,B2EA,EDDB,C4EB,B4C5,B0F5,EDDF,C0DA,B4E8,C5CD,EDDD,BFC4,EDDE,C4A5,EDE0,EDE1,EDE3,C1D7,BBC7,BDB8,EDE2,EDE4,EDE6,EDE5,EDE7,CABE,ECEA,C0F1,C9E7,ECEB,C6EE,ECEC,C6ED,ECED,ECF0,D7E6,ECF3,ECF1,ECEE,ECEF,D7A3,C9F1,CBEE,ECF4,ECF2,CFE9,ECF6,C6B1,BCC0,ECF5,B5BB,BBF6,ECF7,D9F7,BDFB,C2BB,ECF8,ECF9,B8A3,ECFA,ECFB,ECFC,D3ED,D8AE,C0EB,C7DD,BACC,D0E3,CBBD,CDBA,B8D1,B1FC,C7EF,D6D6,BFC6,C3EB,EFF5,C3D8,D7E2,EFF7,B3D3,C7D8,D1ED,D6C8,EFF8,EFF6,BBFD,B3C6,BDD5,D2C6,BBE0,CFA1,EFFC,EFFB,EFF9,B3CC,C9D4,CBB0,EFFE,B0DE,D6C9,EFFD,B3ED,F6D5,CEC8,F0A2,F0A1,B5BE,BCDA,BBFC,B8E5,C4C2,F0A3,CBEB,F0A6,D1A8,BEBF,C7EE,F1B6,F1B7,BFD5,B4A9,F1B8,CDBB,C7D4,D5AD,F1B9,F1BA,C7CF,D2A4,D6CF,F1BB,BDD1,B4B0,BEBD,B4DC,CED1,BFDF,F1BD,BFFA,F1BC,F1BF,F1BE,F1C0,F1C1,C1FE,C1A2,CAFA,D5BE,BEBA,BEB9,D5C2,BFA2,CDAF,F1B5,BDDF,B6CB,D6F1,F3C3,F3C4,B8CD,F3C6,F3C7,B0CA,F3C5,F3C9,CBF1,F3CB,D0A6,B1CA,F3C8,F3CF,B5D1,F3D7,F3D2,F3D4,F3D3,B7FB,B1BF,F3CE,F3CA,B5DA,F3D0,F3D1,F3D5,F3CD,BCE3,C1FD,F3D6,F3DA,F3CC,B5C8,BDEE,F3DC,B7A4,BFF0,D6FE,CDB2,B4F0,B2DF,F3D8,F3D9,C9B8,F3DD,F3DE,F3E1,F3DF,F3E3,F3E2,F3DB,BFEA,B3EF,F3E0,C7A9,BCF2,F3EB,B9BF,F3E4,B2AD,BBFE,CBE3,F3ED,F3E9,B9DC,F3EE,F3E5,F3E6,F3EA,C2E1,F3EC,F3EF,F3E8,BCFD,CFE4,F3F0,F3E7,F3F2,D7AD,C6AA,F3F3,F3F1,C2A8,B8DD,F3F5,F3F4,B4DB,F3F6,F3F7,F3F8,C0BA,C0E9,C5F1,F3FB,F3FA,B4D8,F3FE,F3F9,F3FC,F3FD,F4A1,F4A3,BBC9,F4A2,F4A4,B2BE,F4A6,F4A5,BCAE,C3D7,D9E1,C0E0,F4CC,D7D1,B7DB,F4CE,C1A3,C6C9,B4D6,D5B3,F4D0,F4CF,F4D1,CBDA,F4D2,D4C1,D6E0,B7E0,C1B8,C1BB,F4D3,BEAC,B4E2,F4D4,F4D5,BEAB,F4D6,F4DB,F4D7,F4DA,BAFD,F4D8,F4D9,B8E2,CCC7,F4DC,B2DA,C3D3,D4E3,BFB7,F4DD,C5B4,F4E9,CFB5,CEC9,CBD8,CBF7,BDF4,D7CF,C0DB,D0F5,F4EA,F4EB,F4EC,F7E3,B7B1,F4ED,D7EB,F4EE,E6F9,BEC0,E6FA,BAEC,E6FB,CFCB,E6FC,D4BC,BCB6,E6FD,E6FE,BCCD,C8D2,CEB3,E7A1,B4BF,E7A2,C9B4,B8D9,C4C9,D7DD,C2DA,B7D7,D6BD,CEC6,B7C4,C5A6,E7A3,CFDF,E7A4,E7A5,E7A6,C1B7,D7E9,C9F0,CFB8,D6AF,D6D5,E7A7,B0ED,E7A8,E7A9,C9DC,D2EF,BEAD,E7AA,B0F3,C8DE,BDE1,E7AB,C8C6,E7AC,BBE6,B8F8,D1A4,E7AD,C2E7,BEF8,BDCA,CDB3,E7AE,E7AF,BEEE,D0E5,CBE7,CCD0,BCCC,E7B0,BCA8,D0F7,E7B1,D0F8,E7B2,E7B3,B4C2,E7B4,E7B5,C9FE,CEAC,C3E0,E7B7,B1C1,B3F1,E7B8,E7B9,D7DB,D5C0,E7BA,C2CC,D7BA,E7BB,E7BC,E7BD,BCEA,C3E5,C0C2,E7BE,E7BF,BCA9,E7C0,E7C1,E7B6,B6D0,E7C2,E7C3,E7C4,BBBA,B5DE,C2C6,B1E0,E7C5,D4B5,E7C6,B8BF,E7C8,E7C7,B7EC,E7C9,B2F8,E7CA,E7CB,E7CC,E7CD,E7CE,E7CF,E7D0,D3A7,CBF5,E7D1,E7D2,E7D3,E7D4,C9C9,E7D5,E7D6,E7D7,E7D8,E7D9,BDC9,E7DA,F3BE,B8D7,C8B1,F3BF,F3C0,F3C1,B9DE,CDF8,D8E8,BAB1,C2DE,EEB7,B7A3,EEB9,EEB8,B0D5,EEBB,D5D6,D7EF,D6C3,EEBD,CAF0,EEBC,EEBE,EEC0,EEBF,D1F2,C7BC,C3C0,B8E1,C1E7,F4C6,D0DF,F4C7,CFDB,C8BA,F4C8,F4C9,F4CA,F4CB,D9FA,B8FE,E5F1,D3F0,F4E0,CECC,B3E1,F1B4,D2EE,F4E1,CFE8,F4E2,C7CC,B5D4,B4E4,F4E4,F4E3,F4E5,F4E6,F4E7,BAB2,B0BF,F4E8,B7AD,D2ED,D2AB,C0CF,BFBC,EBA3,D5DF,EAC8,F1F3,B6F8,CBA3,C4CD,F1E7,F1E8,B8FB,F1E9,BAC4,D4C5,B0D2,F1EA,F1EB,F1EC,F1ED,F1EE,F1EF,F1F1,F1F0,C5D5,F1F2,B6FA,F1F4,D2AE,DEC7,CBCA,B3DC,B5A2,B9A2,C4F4,F1F5,F1F6,C1C4,C1FB,D6B0,F1F7,F1F8,C1AA,C6B8,BEDB,F1F9,B4CF,F1FA,EDB2,EDB1,CBE0,D2DE,CBC1,D5D8,C8E2,C0DF,BCA1,EBC1,D0A4,D6E2,B6C7,B8D8,EBC0,B8CE,EBBF,B3A6,B9C9,D6AB,B7F4,B7CA,BCE7,B7BE,EBC6,EBC7,B0B9,BFCF,EBC5,D3FD,EBC8,EBC9,B7CE,EBC2,EBC4,C9F6,D6D7,D5CD,D0B2,EBCF,CEB8,EBD0,B5A8,B1B3,EBD2,CCA5,C5D6,EBD3,EBD1,C5DF,EBCE,CAA4,EBD5,B0FB,BAFA,D8B7,F1E3,EBCA,EBCB,EBCC,EBCD,EBD6,E6C0,EBD9,BFE8,D2C8,EBD7,EBDC,B8EC,EBD8,BDBA,D0D8,B0B7,EBDD,C4DC,D6AC,B4E0,C2F6,BCB9,EBDA,EBDB,D4E0,C6EA,C4D4,EBDF,C5A7,D9F5,B2B1,EBE4,BDC5,EBE2,EBE3,B8AC,CDD1,EBE5,EBE1,C1B3,C6A2,CCF3,EBE6,C0B0,D2B8,EBE7,B8AF,B8AD,EBE8,C7BB,CDF3,EBEA,EBEB,EBED,D0C8,EBF2,EBEE,EBF1,C8F9,D1FC,EBEC,EBE9,B8B9,CFD9,C4E5,EBEF,EBF0,CCDA,CDC8,B0F2,EBF6,EBF5,B2B2,B8E0,EBF7,B1EC,CCC5,C4A4,CFA5,EBF9,ECA2,C5F2,EBFA,C9C5,E2DF,EBFE,CDCE,ECA1,B1DB,D3B7,D2DC,EBFD,EBFB,B3BC,EAB0,D7D4,F4AB,B3F4,D6C1,D6C2,D5E9,BECA,F4A7,D2A8,F4A8,F4A9,F4AA,BECB,D3DF,C9E0,C9E1,F3C2,CAE6,CCF2,E2B6,CBB4,CEE8,D6DB,F4AD,F4AE,F4AF,F4B2,BABD,F4B3,B0E3,F4B0,F4B1,BDA2,B2D5,F4B6,F4B7,B6E6,B2B0,CFCF,F4B4,B4AC,F4B5,F4B8,F4B9,CDA7,F4BA,F4BB,F4BC,CBD2,F4BD,F4BE,F4BF,F4DE,C1BC,BCE8,C9AB,D1DE,E5F5,DCB3,D2D5,DCB4,B0AC,DCB5,BDDA,DCB9,D8C2,DCB7,D3F3,C9D6,DCBA,DCB6,DCBB,C3A2,DCBC,DCC5,DCBD,CEDF,D6A5,DCCF,DCCD,DCD2,BDE6,C2AB,DCB8,DCCB,DCCE,DCBE,B7D2,B0C5,DCC7,D0BE,DCC1,BBA8,B7BC,DCCC,DCC6,DCBF,C7DB,D1BF,DCC0,DCCA,DCD0,CEAD,DCC2,DCC3,DCC8,DCC9,B2D4,DCD1,CBD5,D4B7,DCDB,DCDF,CCA6,DCE6,C3E7,DCDC,BFC1,DCD9,B0FA,B9B6,DCE5,DCD3,DCC4,DCD6,C8F4,BFE0,C9BB,B1BD,D3A2,DCDA,DCD5,C6BB,DCDE,D7C2,C3AF,B7B6,C7D1,C3A9,DCE2,DCD8,DCEB,DCD4,DCDD,BEA5,DCD7,DCE0,DCE3,DCE4,DCF8,DCE1,DDA2,DCE7,BCEB,B4C4,C3A3,B2E7,DCFA,DCF2,DCEF,DCFC,DCEE,D2F0,B2E8,C8D7,C8E3,DCFB,DCED,DCF7,DCF5,BEA3,DCF4,B2DD,DCF3,BCF6,DCE8,BBC4,C0F3,BCD4,DCE9,DCEA,DCF1,DCF6,DCF9,B5B4,C8D9,BBE7,DCFE,DCFD,D3AB,DDA1,DDA3,DDA5,D2F1,DDA4,DDA6,DDA7,D2A9,BAC9,DDA9,DDB6,DDB1,DDB4,DDB0,C6CE,C0F2,C9AF,DCEC,DDAE,DDB7,DCF0,DDAF,DDB8,DDAC,DDB9,DDB3,DDAD,C4AA,DDA8,C0B3,C1AB,DDAA,DDAB,DDB2,BBF1,DDB5,D3A8,DDBA,DDBB,C3A7,DDD2,DDBC,DDD1,B9BD,BED5,BEFA,BACA,DDCA,DDC5,DDBF,B2CB,DDC3,DDCB,B2A4,DDD5,DDBE,C6D0,DDD0,DDD4,C1E2,B7C6,DDCE,DDCF,DDC4,DDBD,DDCD,CCD1,DDC9,DDC2,C3C8,C6BC,CEAE,DDCC,DDC8,DDC1,DDC6,C2DC,D3A9,D3AA,DDD3,CFF4,C8F8,DDE6,DDC7,DDE0,C2E4,DDE1,DDD7,D6F8,DDD9,DDD8,B8F0,DDD6,C6CF,B6AD,DDE2,BAF9,D4E1,DDE7,B4D0,DDDA,BFFB,DDE3,DDDF,DDDD,B5D9,DDDB,DDDC,DDDE,BDAF,DDE4,DDE5,DDF5,C3C9,CBE2,DDF2,D8E1,C6D1,DDF4,D5F4,DDF3,DDF0,DDEC,DDEF,DDE8,D0EE,C8D8,DDEE,DDE9,DDEA,CBF2,DDED,B1CD,C0B6,BCBB,DDF1,DDF7,DDF6,DDEB,C5EE,DDFB,DEA4,DEA3,DDF8,C3EF,C2FB,D5E1,CEB5,DDFD,B2CC,C4E8,CADF,C7BE,DDFA,DDFC,DDFE,DEA2,B0AA,B1CE,DEAC,DEA6,BDB6,C8EF,DEA1,DEA5,DEA9,DEA8,DEA7,DEAD,D4CC,DEB3,DEAA,DEAE,C0D9,B1A1,DEB6,DEB1,DEB2,D1A6,DEB5,DEAF,DEB0,D0BD,DEB4,CAED,DEB9,DEB8,DEB7,DEBB,BDE5,B2D8,C3EA,DEBA,C5BA,DEBC,CCD9,B7AA,D4E5,DEBD,DEBF,C4A2,DEC1,DEBE,DEC0,D5BA,DEC2,F2AE,BBA2,C2B2,C5B0,C2C7,F2AF,D0E9,D3DD,EBBD,B3E6,F2B0,F2B1,CAAD,BAE7,F2B3,F2B5,F2B4,CBE4,CFBA,F2B2,CAB4,D2CF,C2EC,CEC3,F2B8,B0F6,F2B7,F2BE,B2CF,D1C1,F2BA,F2BC,D4E9,F2BB,F2B6,F2BF,F2BD,F2B9,F2C7,F2C4,F2C6,F2CA,F2C2,F2C0,F2C5,D6FB,F2C1,C7F9,C9DF,F2C8,B9C6,B5B0,F2C3,F2C9,F2D0,F2D6,BBD7,F2D5,CDDC,D6EB,F2D2,F2D4,B8F2,F2CB,F2CE,C2F9,D5DD,F2CC,F2CD,F2CF,F2D3,F2D9,D3BC,B6EA,CAF1,B7E4,F2D7,F2D8,F2DA,F2DD,F2DB,F2DC,D1D1,F2D1,CDC9,CECF,D6A9,F2E3,C3DB,F2E0,C0AF,F2EC,F2DE,F2E1,F2E8,F2E2,F2E7,F2E6,F2E9,F2DF,F2E4,F2EA,D3AC,F2E5,B2F5,F2F2,D0AB,F2F5,BBC8,F2F9,F2F0,F2F6,F2F8,F2FA,F2F3,F2F1,BAFB,B5FB,F2EF,F2F7,F2ED,F2EE,F2EB,F3A6,F3A3,F3A2,F2F4,C8DA,F2FB,F3A5,C3F8,F2FD,F3A7,F3A9,F3A4,F2FC,F3AB,F3AA,C2DD,F3AE,F3B0,F3A1,F3B1,F3AC,F3AF,F2FE,F3AD,F3B2,F3B4,F3A8,F3B3,F3B5,D0B7,F3B8,D9F9,F3B9,F3B7,C8E4,F3B6,F3BA,F3BB,B4C0,EEC3,F3BC,F3BD,D1AA,F4AC,D0C6,D0D0,D1DC,CFCE,BDD6,D1C3,BAE2,E1E9,D2C2,F1C2,B2B9,B1ED,F1C3,C9C0,B3C4,D9F2,CBA5,F1C4,D6D4,F1C5,F4C0,F1C6,D4AC,F1C7,B0C0,F4C1,F4C2,B4FC,C5DB,CCBB,D0E4,CDE0,F1C8,D9F3,B1BB,CFAE,B8A4,F1CA,F1CB,B2C3,C1D1,D7B0,F1C9,F1CC,F1CE,D9F6,D2E1,D4A3,F4C3,C8B9,F4C4,F1CD,F1CF,BFE3,F1D0,F1D4,F1D6,F1D1,C9D1,C5E1,C2E3,B9FC,F1D3,F1D5,B9D3,F1DB,BAD6,B0FD,F1D9,F1D8,F1D2,F1DA,F1D7,C8EC,CDCA,F1DD,E5BD,F1DC,F1DE,F1DF,CFE5,F4C5,BDF3,F1E0,F1E1,CEF7,D2AA,F1FB,B8B2,BCFB,B9DB,B9E6,C3D9,CAD3,EAE8,C0C0,BEF5,EAE9,EAEA,EAEB,EAEC,EAED,EAEE,EAEF,BDC7,F5FB,F5FD,F5FE,F5FC,BDE2,F6A1,B4A5,F6A2,F6A3,ECB2,D1D4,D9EA,F6A4,EEBA,D5B2,D3FE,CCDC,CAC4,E5C0,F6A5,BEAF,C6A9,DAA5,BCC6,B6A9,B8BC,C8CF,BCA5,DAA6,DAA7,CCD6,C8C3,DAA8,C6FD,D1B5,D2E9,D1B6,BCC7,BDB2,BBE4,DAA9,DAAA,D1C8,DAAB,D0ED,B6EF,C2DB,CBCF,B7ED,C9E8,B7C3,BEF7,D6A4,DAAC,DAAD,C6C0,D7E7,CAB6,D5A9,CBDF,D5EF,DAAE,D6DF,B4CA,DAB0,DAAF,D2EB,DAB1,DAB2,DAB3,CAD4,DAB4,CAAB,DAB5,DAB6,B3CF,D6EF,DAB7,BBB0,B5AE,DAB8,DAB9,B9EE,D1AF,D2E8,DABA,B8C3,CFEA,B2EF,DABB,DABC,BDEB,CEDC,D3EF,DABD,CEF3,DABE,D3D5,BBE5,DABF,CBB5,CBD0,DAC0,C7EB,D6EE,DAC1,C5B5,B6C1,DAC2,B7CC,BFCE,DAC3,DAC4,CBAD,DAC5,B5F7,DAC6,C1C2,D7BB,DAC7,CCB8,D2EA,C4B1,DAC8,B5FD,BBD1,DAC9,D0B3,DACA,DACB,CEBD,DACC,DACD,DACE,B2F7,DAD1,DACF,D1E8,DAD0,C3D5,DAD2,DAD3,DAD4,DAD5,D0BB,D2A5,B0F9,DAD6,C7AB,DAD7,BDF7,C3A1,DAD8,DAD9,C3FD,CCB7,DADA,DADB,C0BE,C6D7,DADC,DADD,C7B4,DADE,DADF,B9C8,BBED,B6B9,F4F8,F4F9,CDE3,F5B9,EBE0,CFF3,BBBF,BAC0,D4A5,E1D9,F5F4,B1AA,B2F2,F5F5,F5F7,BAD1,F5F6,C3B2,F5F9,F5F8,B1B4,D5EA,B8BA,B9B1,B2C6,D4F0,CFCD,B0DC,D5CB,BBF5,D6CA,B7B7,CCB0,C6B6,B1E1,B9BA,D6FC,B9E1,B7A1,BCFA,EADA,EADB,CCF9,B9F3,EADC,B4FB,C3B3,B7D1,BAD8,EADD,D4F4,EADE,BCD6,BBDF,EADF,C1DE,C2B8,D4DF,D7CA,EAE0,EAE1,EAE4,EAE2,EAE3,C9DE,B8B3,B6C4,EAE5,CAEA,C9CD,B4CD,E2D9,C5E2,EAE6,C0B5,D7B8,EAE7,D7AC,C8FC,D8D3,D8CD,D4DE,D4F9,C9C4,D3AE,B8D3,B3E0,C9E2,F4F6,BAD5,F4F7,D7DF,F4F1,B8B0,D5D4,B8CF,C6F0,B3C3,F4F2,B3AC,D4BD,C7F7,F4F4,F4F3,CCCB,C8A4,F4F5,D7E3,C5BF,F5C0,F5BB,F5C3,F5C2,D6BA,F5C1,D4BE,F5C4,F5CC,B0CF,B5F8,F5C9,F5CA,C5DC,F5C5,F5C6,F5C7,F5CB,BEE0,F5C8,B8FA,F5D0,F5D3,BFE7,B9F2,F5BC,F5CD,C2B7,CCF8,BCF9,F5CE,F5CF,F5D1,B6E5,F5D2,F5D5,F5BD,F5D4,D3BB,B3EC,CCA4,F5D6,F5D7,BEE1,F5D8,CCDF,F5DB,B2C8,D7D9,F5D9,F5DA,F5DC,F5E2,F5E0,F5DF,F5DD,F5E1,F5DE,F5E4,F5E5,CCE3,E5BF,B5B8,F5E3,F5E8,CCA3,F5E6,F5E7,F5BE,B1C4,F5BF,B5C5,B2E4,F5EC,F5E9,B6D7,F5ED,F5EA,F5EB,B4DA,D4EA,F5EE,B3F9,F5EF,F5F1,F5F0,F5F2,F5F3,C9ED,B9AA,C7FB,B6E3,CCC9,EAA6,B3B5,D4FE,B9EC,D0F9,E9ED,D7AA,E9EE,C2D6,C8ED,BAE4,E9EF,E9F0,E9F1,D6E1,E9F2,E9F3,E9F5,E9F4,E9F6,E9F7,C7E1,E9F8,D4D8,E9F9,BDCE,E9FA,E9FB,BDCF,E9FC,B8A8,C1BE,E9FD,B1B2,BBD4,B9F5,E9FE,EAA1,EAA2,EAA3,B7F8,BCAD,CAE4,E0CE,D4AF,CFBD,D5B7,EAA4,D5DE,EAA5,D0C1,B9BC,B4C7,B1D9,C0B1,B1E6,B1E7,B1E8,B3BD,C8E8,E5C1,B1DF,C1C9,B4EF,C7A8,D3D8,C6F9,D1B8,B9FD,C2F5,D3AD,D4CB,BDFC,E5C2,B7B5,E5C3,BBB9,D5E2,BDF8,D4B6,CEA5,C1AC,B3D9,CCF6,E5C6,E5C4,E5C8,E5CA,E5C7,B5CF,C6C8,B5FC,E5C5,CAF6,E5C9,C3D4,B1C5,BCA3,D7B7,CDCB,CBCD,CACA,CCD3,E5CC,E5CB,C4E6,D1A1,D1B7,E5CD,E5D0,CDB8,D6F0,E5CF,B5DD,CDBE,E5D1,B6BA,CDA8,B9E4,CAC5,B3D1,CBD9,D4EC,E5D2,B7EA,E5CE,E5D5,B4FE,E5D6,E5D3,E5D4,D2DD,C2DF,B1C6,D3E2,B6DD,CBEC,E5D7,D3F6,B1E9,B6F4,E5DA,E5D8,E5D9,B5C0,D2C5,E5DC,E5DE,E5DD,C7B2,D2A3,E5DB,D4E2,D5DA,E5E0,D7F1,E5E1,B1DC,D1FB,E5E2,E5E4,E5E3,E5E5,D2D8,B5CB,E7DF,DAF5,DAF8,DAF6,DAF7,DAFA,D0CF,C4C7,B0EE,D0B0,DAF9,D3CA,BAAA,DBA2,C7F1,DAFC,DAFB,C9DB,DAFD,DBA1,D7DE,DAFE,C1DA,DBA5,D3F4,DBA7,DBA4,DBA8,BDBC,C0C9,DBA3,DBA6,D6A3,DBA9,DBAD,DBAE,DBAC,BAC2,BFA4,DBAB,DBAA,D4C7,B2BF,DBAF,B9F9,DBB0,B3BB,B5A6,B6BC,DBB1,B6F5,DBB2,B1C9,DBB4,DBB3,DBB5,DBB7,DBB6,DBB8,DBB9,DBBA,D3CF,F4FA,C7F5,D7C3,C5E4,F4FC,F4FD,F4FB,BEC6,D0EF,B7D3,D4CD,CCAA,F5A2,F5A1,BAA8,F4FE,CBD6,F5A4,C0D2,B3EA,CDAA,F5A5,F5A3,BDB4,F5A8,F5A9,BDCD,C3B8,BFE1,CBE1,F5AA,F5A6,F5A7,C4F0,F5AC,B4BC,D7ED,B4D7,F5AB,F5AE,F5AD,F5AF,D0D1,C3D1,C8A9,F5B0,F5B1,F5B2,F5B3,F5B4,F5B5,F5B7,F5B6,F5B8,B2C9,D3D4,CACD,C0EF,D6D8,D2B0,C1BF,BDF0,B8AA,BCF8,F6C6,F6C7,F6C8,F6C9,F6CA,F6CC,F6CB,F7E9,F6CD,F6CE,EEC4,EEC5,EEC6,D5EB,B6A4,EEC8,EEC7,EEC9,EECA,C7A5,EECB,EECC,B7B0,B5F6,EECD,EECF,EECE,B8C6,EED0,EED1,EED2,B6DB,B3AE,D6D3,C4C6,B1B5,B8D6,EED3,EED4,D4BF,C7D5,BEFB,CED9,B9B3,EED6,EED5,EED8,EED7,C5A5,EED9,EEDA,C7AE,EEDB,C7AF,EEDC,B2A7,EEDD,EEDE,EEDF,EEE0,EEE1,D7EA,EEE2,EEE3,BCD8,EEE4,D3CB,CCFA,B2AC,C1E5,EEE5,C7A6,C3AD,EEE6,EEE7,EEE8,EEE9,EEEA,EEEB,EEEC,EEED,EEEE,EEEF,EEF0,EEF1,EEF2,EEF4,EEF3,EEF5,CDAD,C2C1,EEF6,EEF7,EEF8,D5A1,EEF9,CFB3,EEFA,EEFB,EEFC,EEFD,EFA1,EEFE,EFA2,B8F5,C3FA,EFA3,EFA4,BDC2,D2BF,B2F9,EFA5,EFA6,EFA7,D2F8,EFA8,D6FD,EFA9,C6CC,EFAA,EFAB,C1B4,EFAC,CFFA,CBF8,EFAE,EFAD,B3FA,B9F8,EFAF,EFB0,D0E2,EFB1,EFB2,B7E6,D0BF,EFB3,EFB4,EFB5,C8F1,CCE0,EFB6,EFB7,EFB8,EFB9,EFBA,D5E0,EFBB,B4ED,C3AA,EFBC,EFBD,EFBE,EFBF,CEFD,EFC0,C2E0,B4B8,D7B6,BDF5,CFC7,EFC3,EFC1,EFC2,EFC4,B6A7,BCFC,BEE2,C3CC,EFC5,EFC6,EFC7,EFCF,EFC8,EFC9,EFCA,C7C2,EFF1,B6CD,EFCB,EFCC,EFCD,B6C6,C3BE,EFCE,EFD0,EFD1,EFD2,D5F2,EFD3,C4F7,EFD4,C4F8,EFD5,EFD6,B8E4,B0F7,EFD7,EFD8,EFD9,EFDA,EFDB,EFDC,EFDD,EFDE,BEB5,EFE1,EFDF,EFE0,EFE2,EFE3,C1CD,EFE4,EFE5,EFE6,EFE7,EFE8,EFE9,EFEA,EFEB,EFEC,C0D8,EFED,C1AD,EFEE,EFEF,EFF0,CFE2,B3A4,C3C5,E3C5,C9C1,E3C6,B1D5,CECA,B4B3,C8F2,E3C7,CFD0,E3C8,BCE4,E3C9,E3CA,C3C6,D5A2,C4D6,B9EB,CEC5,E3CB,C3F6,E3CC,B7A7,B8F3,BAD2,E3CD,E3CE,D4C4,E3CF,E3D0,D1CB,E3D1,E3D2,E3D3,E3D4,D1D6,E3D5,B2FB,C0BB,E3D6,C0AB,E3D7,E3D8,E3D9,E3DA,E3DB,B8B7,DAE2,B6D3,DAE4,DAE3,DAE6,C8EE,DAE5,B7C0,D1F4,D2F5,D5F3,BDD7,D7E8,DAE8,DAE7,B0A2,CDD3,DAE9,B8BD,BCCA,C2BD,C2A4,B3C2,DAEA,C2AA,C4B0,BDB5,CFDE,DAEB,C9C2,B1DD,DAEC,B6B8,D4BA,B3FD,DAED,D4C9,CFD5,C5E3,DAEE,DAEF,DAF0,C1EA,CCD5,CFDD,D3E7,C2A1,DAF1,CBE5,DAF2,CBE6,D2FE,B8F4,DAF3,B0AF,CFB6,D5CF,CBED,DAF4,E3C4,C1A5,F6BF,F6C0,F6C1,C4D1,C8B8,D1E3,D0DB,D1C5,BCAF,B9CD,EFF4,B4C6,D3BA,F6C2,B3FB,F6C3,B5F1,F6C5,D3EA,F6A7,D1A9,F6A9,F6A8,C1E3,C0D7,B1A2,CEED,D0E8,F6AB,CFF6,F6AA,D5F0,F6AC,C3B9,BBF4,F6AE,F6AD,C4DE,C1D8,CBAA,CFBC,F6AF,F6B0,F6B1,C2B6,B0D4,C5F9,F6B2,C7E0,F6A6,BEB8,BEB2,B5E5,B7C7,BFBF,C3D2,C3E6,D8CC,B8EF,BDF9,D1A5,B0D0,F7B0,F7B1,D0AC,B0B0,F7B2,F7B3,F7B4,C7CA,BECF,F7B7,F7B6,B1DE,F7B5,F7B8,F7B9,CEA4,C8CD,BAAB,E8B8,E8B9,E8BA,BEC2,D2F4,D4CF,C9D8,D2B3,B6A5,C7EA,F1FC,CFEE,CBB3,D0EB,E7EF,CDE7,B9CB,B6D9,F1FD,B0E4,CBCC,F1FE,D4A4,C2AD,C1EC,C6C4,BEB1,F2A1,BCD5,F2A2,F2A3,F2A4,D2C3,C6B5,CDC7,F2A5,D3B1,BFC5,CCE2,F2A6,F2A7,D1D5,B6EE,F2A8,F2A9,B5DF,F2AA,F2AB,B2FC,F2AC,F2AD,C8A7,B7E7,ECA9,ECAA,ECAB,ECAC,C6AE,ECAD,ECAE,B7C9,CAB3,E2B8,F7CF,F7D0,B2CD,F7D1,F7D3,F7D2,E2BB,BCA2,E2BC,E2BD,E2BE,E2BF,E2C0,E2C1,B7B9,D2FB,BDA4,CACE,B1A5,CBC7,E2C2,B6FC,C8C4,E2C3,BDC8,B1FD,E2C4,B6F6,E2C5,C4D9,E2C6,CFDA,B9DD,E2C7,C0A1,E2C8,B2F6,E2C9,C1F3,E2CA,E2CB,C2F8,E2CC,E2CD,E2CE,CAD7,D8B8,D9E5,CFE3,F0A5,DCB0,C2ED,D4A6,CDD4,D1B1,B3DB,C7FD,B2B5,C2BF,E6E0,CABB,E6E1,E6E2,BED4,E6E3,D7A4,CDD5,E6E5,BCDD,E6E4,E6E6,E6E7,C2EE,BDBE,E6E8,C2E6,BAA7,E6E9,E6EA,B3D2,D1E9,BFA5,E6EB,C6EF,E6EC,E6ED,E6EE,C6AD,E6EF,C9A7,E6F0,E6F1,E6F2,E5B9,E6F3,E6F4,C2E2,E6F5,E6F6,D6E8,E6F7,E6F8,B9C7,F7BB,F7BA,F7BE,F7BC,BAA1,F7BF,F7C0,F7C2,F7C1,F7C4,F7C3,F7C5,F7C6,F7C7,CBE8,B8DF,F7D4,F7D5,F7D6,F7D8,F7DA,F7D7,F7DB,F7D9,D7D7,F7DC,F7DD,F7DE,F7DF,F7E0,DBCB,D8AA,E5F7,B9ED,BFFD,BBEA,F7C9,C6C7,F7C8,F7CA,F7CC,F7CB,F7CD,CEBA,F7CE,C4A7,D3E3,F6CF,C2B3,F6D0,F6D1,F6D2,F6D3,F6D4,F6D6,B1AB,F6D7,F6D8,F6D9,F6DA,F6DB,F6DC,F6DD,F6DE,CFCA,F6DF,F6E0,F6E1,F6E2,F6E3,F6E4,C0F0,F6E5,F6E6,F6E7,F6E8,F6E9,F6EA,F6EB,F6EC,F6ED,F6EE,F6EF,F6F0,F6F1,F6F2,F6F3,F6F4,BEA8,F6F5,F6F6,F6F7,F6F8,C8FA,F6F9,F6FA,F6FB,F6FC,F6FD,F6FE,F7A1,F7A2,F7A3,F7A4,F7A5,F7A6,F7A7,F7A8,B1EE,F7A9,F7AA,F7AB,F7AC,F7AD,C1DB,F7AE,F7AF,C4F1,F0AF,BCA6,F0B0,C3F9,C5B8,D1BB,F0B1,F0B2,F0B3,F0B4,F0B5,D1BC,D1EC,F0B7,F0B6,D4A7,CDD2,F0B8,F0BA,F0B9,F0BB,F0BC,B8EB,F0BD,BAE8,F0BE,F0BF,BEE9,F0C0,B6EC,F0C1,F0C2,F0C3,F0C4,C8B5,F0C5,F0C6,F0C7,C5F4,F0C8,F0C9,F0CA,F7BD,F0CB,F0CC,F0CD,F0CE,F0CF,BAD7,F0D0,F0D1,F0D2,F0D3,F0D4,F0D5,F0D6,F0D8,D3A5,F0D7,F0D9,F5BA,C2B9,F7E4,F7E5,F7E6,F7E7,F7E8,C2B4,F7EA,F7EB,C2F3,F4F0,F4EF,C2E9,F7E1,F7E2,BBC6,D9E4,CAF2,C0E8,F0A4,BADA,C7AD,C4AC,F7EC,F7ED,F7EE,F7F0,F7EF,F7F1,F7F4,F7F3,F7F2,F7F5,F7F6,EDE9,EDEA,EDEB,F6BC,F6BD,F6BE,B6A6,D8BE,B9C4,D8BB,DCB1,CAF3,F7F7,F7F8,F7F9,F7FB,F7FA,B1C7,F7FC,F7FD,F7FE,C6EB,ECB4,B3DD,F6B3,F6B4,C1E4,F6B5,F6B6,F6B7,F6B8,F6B9,F6BA,C8A3,F6BB,C1FA,B9A8,EDE8,B9EA,D9DF,A3A1,A3A2,A3A3,A1E7,A3A5,A3A6,A3A7,A3A8,A3A9,A3AA,A3AB,A3AC,A3AD,A3AE,A3AF,A3B0,A3B1,A3B2,A3B3,A3B4,A3B5,A3B6,A3B7,A3B8,A3B9,A3BA,A3BB,A3BC,A3BD,A3BE,A3BF,A3C0,A3C1,A3C2,A3C3,A3C4,A3C5,A3C6,A3C7,A3C8,A3C9,A3CA,A3CB,A3CC,A3CD,A3CE,A3CF,A3D0,A3D1,A3D2,A3D3,A3D4,A3D5,A3D6,A3D7,A3D8,A3D9,A3DA,A3DB,A3DC,A3DD,A3DE,A3DF,A3E0,A3E1,A3E2,A3E3,A3E4,A3E5,A3E6,A3E7,A3E8,A3E9,A3EA,A3EB,A3EC,A3ED,A3EE,A3EF,A3F0,A3F1,A3F2,A3F3,A3F4,A3F5,A3F6,A3F7,A3F8,A3F9,A3FA,A3FB,A3FC,A3FD,A1AB,A1E9,A1EA,A3FE,A3A4'; | ||
| 15 | + } | ||
| 16 | + UnicodeToAnsi = function (chrCode) { | ||
| 17 | + var chrHex = chrCode.toString(16); | ||
| 18 | + chrHex = "000" + chrHex.toUpperCase(); | ||
| 19 | + chrHex = chrHex.substr(chrHex.length - 4); | ||
| 20 | + var i = UnicodeChr().indexOf(chrHex); | ||
| 21 | + if (i != -1) { | ||
| 22 | + chrHex = AnsicodeChr().substr(i, 4); | ||
| 23 | + } | ||
| 24 | + return parseInt(chrHex, 16) | ||
| 25 | + } | ||
| 26 | + AnsiToUnicode = function (chrCode) { | ||
| 27 | + var chrHex = chrCode.toString(16); | ||
| 28 | + chrHex = "000" + chrHex.toUpperCase(); | ||
| 29 | + chrHex = chrHex.substr(chrHex.length - 4); | ||
| 30 | + var i = AnsicodeChr().indexOf(chrHex); | ||
| 31 | + if (i != -1) { | ||
| 32 | + chrHex = UnicodeChr().substr(i, 4); | ||
| 33 | + } | ||
| 34 | + return parseInt(chrHex, 16) | ||
| 35 | + } | ||
| 36 | + strUnicode2Ansi = function (asContents) { | ||
| 37 | + var len1 = asContents.length; | ||
| 38 | + var temp = ""; | ||
| 39 | + for (var i = 0; i < len1; i++) { | ||
| 40 | + var varasc = asContents.charCodeAt(i); | ||
| 41 | + if (varasc < 0) | ||
| 42 | + varasc += 65536; | ||
| 43 | + if (varasc > 127) | ||
| 44 | + varasc = UnicodeToAnsi(varasc); | ||
| 45 | + if (varasc > 255) { | ||
| 46 | + var varlow = varasc & 65280; | ||
| 47 | + varlow = varlow >> 8; | ||
| 48 | + var varhigh = varasc & 255; | ||
| 49 | + temp += String.fromCharCode(varlow) + String.fromCharCode(varhigh); | ||
| 50 | + } | ||
| 51 | + else { | ||
| 52 | + temp += String.fromCharCode(varasc); | ||
| 53 | + } | ||
| 54 | + } | ||
| 55 | + return temp; | ||
| 56 | + } | ||
| 57 | + strAnsi2Unicode = function (asContents) { | ||
| 58 | + var len1 = asContents.length; | ||
| 59 | + var temp = ""; | ||
| 60 | + var chrcode; | ||
| 61 | + for (var i = 0; i < len1; i++) { | ||
| 62 | + var varasc = asContents.charCodeAt(i); | ||
| 63 | + if (varasc > 127) { | ||
| 64 | + chrcode = AnsiToUnicode((varasc << 8) + asContents.charCodeAt(++i)); | ||
| 65 | + } | ||
| 66 | + else { | ||
| 67 | + chrcode = varasc; | ||
| 68 | + } | ||
| 69 | + temp += String.fromCharCode(chrcode); | ||
| 70 | + } | ||
| 71 | + return temp; | ||
| 72 | + } | ||
| 73 | + encode64 = function (input) { | ||
| 74 | + var output = ""; | ||
| 75 | + var chr1, chr2, chr3 = ""; | ||
| 76 | + var enc1, enc2, enc3, enc4 = ""; | ||
| 77 | + var i = 0; | ||
| 78 | + do { | ||
| 79 | + chr1 = input.charCodeAt(i++); | ||
| 80 | + chr2 = input.charCodeAt(i++); | ||
| 81 | + chr3 = input.charCodeAt(i++); | ||
| 82 | + enc1 = chr1 >> 2; | ||
| 83 | + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); | ||
| 84 | + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); | ||
| 85 | + enc4 = chr3 & 63; | ||
| 86 | + if (isNaN(chr2)) { | ||
| 87 | + enc3 = enc4 = 64; | ||
| 88 | + } else if (isNaN(chr3)) { | ||
| 89 | + enc4 = 64; | ||
| 90 | + } | ||
| 91 | + output = output + | ||
| 92 | + keyStr.charAt(enc1) + | ||
| 93 | + keyStr.charAt(enc2) + | ||
| 94 | + keyStr.charAt(enc3) + | ||
| 95 | + keyStr.charAt(enc4); | ||
| 96 | + chr1 = chr2 = chr3 = ""; | ||
| 97 | + enc1 = enc2 = enc3 = enc4 = ""; | ||
| 98 | + } while (i < input.length); | ||
| 99 | + return output; | ||
| 100 | + } | ||
| 101 | + decode64 = function (input) { | ||
| 102 | + var output = ""; | ||
| 103 | + var chr1, chr2, chr3 = ""; | ||
| 104 | + var enc1, enc2, enc3, enc4 = ""; | ||
| 105 | + var i = 0; | ||
| 106 | + if (input.length % 4 != 0) { | ||
| 107 | + return ""; | ||
| 108 | + } | ||
| 109 | + var base64test = /[^A-Za-z0-9/+///=]/g; | ||
| 110 | + if (base64test.exec(input)) { | ||
| 111 | + return ""; | ||
| 112 | + } | ||
| 113 | + do { | ||
| 114 | + enc1 = keyStr.indexOf(input.charAt(i++)); | ||
| 115 | + enc2 = keyStr.indexOf(input.charAt(i++)); | ||
| 116 | + enc3 = keyStr.indexOf(input.charAt(i++)); | ||
| 117 | + enc4 = keyStr.indexOf(input.charAt(i++)); | ||
| 118 | + chr1 = (enc1 << 2) | (enc2 >> 4); | ||
| 119 | + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); | ||
| 120 | + chr3 = ((enc3 & 3) << 6) | enc4; | ||
| 121 | + output = output + String.fromCharCode(chr1); | ||
| 122 | + if (enc3 != 64) { | ||
| 123 | + output += String.fromCharCode(chr2); | ||
| 124 | + } | ||
| 125 | + if (enc4 != 64) { | ||
| 126 | + output += String.fromCharCode(chr3); | ||
| 127 | + } | ||
| 128 | + chr1 = chr2 = chr3 = ""; | ||
| 129 | + enc1 = enc2 = enc3 = enc4 = ""; | ||
| 130 | + } while (i < input.length); | ||
| 131 | + return output; | ||
| 132 | + } | ||
| 133 | + if (opts.data == "") { | ||
| 134 | + return false; | ||
| 135 | + } else { | ||
| 136 | + if (opts.type == 0) { | ||
| 137 | + if (opts.unicode == true) { | ||
| 138 | + return encode64(strUnicode2Ansi(opts.data)); | ||
| 139 | + } else { | ||
| 140 | + return encode64(opts.data); | ||
| 141 | + } | ||
| 142 | + } else { | ||
| 143 | + if (opts.unicode == true) { | ||
| 144 | + return strAnsi2Unicode(decode64(opts.data)); | ||
| 145 | + } else { | ||
| 146 | + return decode64(opts.data); | ||
| 147 | + } | ||
| 148 | + } | ||
| 149 | + } | ||
| 150 | + } | ||
| 151 | +})(jQuery); | ||
| 0 | \ No newline at end of file | 152 | \ No newline at end of file |
src/main/resources/static/pages/control/lineallot_v3/js/jquery.table2excel.min.js
0 → 100644
| 1 | +/* | ||
| 2 | + * jQuery table2excel - v1.1.1 | ||
| 3 | + * jQuery plugin to export an .xls file in browser from an HTML table | ||
| 4 | + * https://github.com/rainabba/jquery-table2excel | ||
| 5 | + * | ||
| 6 | + * Made by rainabba | ||
| 7 | + * Under MIT License | ||
| 8 | + */ | ||
| 9 | +!function(a,b,c,d){function e(b,c){this.element=b,this.settings=a.extend({},k,c),this._defaults=k,this._name=j,this.init()}function f(a){return a.filename?a.filename:"table2excel"}function g(a){var b=/(\s+alt\s*=\s*"([^"]*)"|\s+alt\s*=\s*'([^']*)')/i;return a.replace(/<img[^>]*>/gi,function(a){var c=b.exec(a);return null!==c&&c.length>=2?c[2]:""})}function h(a){return a.replace(/<a[^>]*>|<\/a>/gi,"")}function i(a){var b=/(\s+value\s*=\s*"([^"]*)"|\s+value\s*=\s*'([^']*)')/i;return a.replace(/<input[^>]*>|<\/input>/gi,function(a){var c=b.exec(a);return null!==c&&c.length>=2?c[2]:""})}var j="table2excel",k={exclude:".noExl",name:"Table2Excel",filename:"table2excel",fileext:".xls",exclude_img:!0,exclude_links:!0,exclude_inputs:!0};e.prototype={init:function(){var b=this;b.template={head:'<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8"><head>\x3c!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets>',sheet:{head:"<x:ExcelWorksheet><x:Name>",tail:"</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>"},mid:"</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--\x3e</head><body>",table:{head:"<table>",tail:"</table>"},foot:"</body></html>"},b.tableRows=[],a(b.element).each(function(c,d){var e="";a(d).find("tr").not(b.settings.exclude).each(function(c,d){e+="<tr>",a(d).find("td,th").not(b.settings.exclude).each(function(c,d){var f={rows:a(this).attr("rowspan"),cols:a(this).attr("colspan"),flag:a(d).find(b.settings.exclude)};f.flag.length>0?e+="<td> </td>":f.rows&f.cols?e+="<td>"+a(d).html()+"</td>":(e+="<td",f.rows>0&&(e+=" rowspan='"+f.rows+"' "),f.cols>0&&(e+=" colspan='"+f.cols+"' "),e+="/>"+a(d).html()+"</td>")}),e+="</tr>",console.log(e)}),b.settings.exclude_img&&(e=g(e)),b.settings.exclude_links&&(e=h(e)),b.settings.exclude_inputs&&(e=i(e)),b.tableRows.push(e)}),b.tableToExcel(b.tableRows,b.settings.name,b.settings.sheetName)},tableToExcel:function(d,e,g){var h,i,j,k=this,l="";if(k.format=function(a,b){return a.replace(/{(\w+)}/g,function(a,c){return b[c]})},g=void 0===g?"Sheet":g,k.ctx={worksheet:e||"Worksheet",table:d,sheetName:g},l=k.template.head,a.isArray(d))for(h in d)l+=k.template.sheet.head+g+h+k.template.sheet.tail;if(l+=k.template.mid,a.isArray(d))for(h in d)l+=k.template.table.head+"{table"+h+"}"+k.template.table.tail;l+=k.template.foot;for(h in d)k.ctx["table"+h]=d[h];if(delete k.ctx.table,!c.documentMode){var m=new Blob([k.format(l,k.ctx)],{type:"application/vnd.ms-excel"});b.URL=b.URL||b.webkitURL,i=b.URL.createObjectURL(m),j=c.createElement("a"),j.download=f(k.settings),j.href=i,c.body.appendChild(j),j.click(),c.body.removeChild(j)}else if("undefined"!=typeof Blob){l=k.format(l,k.ctx),l=[l];var n=new Blob(l,{type:"text/html"});b.navigator.msSaveBlob(n,f(k.settings))}else txtArea1.document.open("text/html","replace"),txtArea1.document.write(k.format(l,k.ctx)),txtArea1.document.close(),txtArea1.focus(),sa=txtArea1.document.execCommand("SaveAs",!0,f(k.settings));return!0}},a.fn[j]=function(b){var c=this;return c.each(function(){a.data(c,"plugin_"+j)||a.data(c,"plugin_"+j,new e(this,b))}),c}}(jQuery,window,document); | ||
| 0 | \ No newline at end of file | 10 | \ No newline at end of file |
src/main/resources/static/pages/control/lineallot_v3/js/tableExport.js
0 → 100644
| 1 | +// 此函数引用自: http://www.alloyteam.com/2014/01/use-js-file-download/ | ||
| 2 | +function downloadFile(fileName, content){ | ||
| 3 | + var aLink = document.createElement('a'); | ||
| 4 | + var blob = new Blob([content]); | ||
| 5 | + var evt = document.createEvent("HTMLEvents"); | ||
| 6 | + evt.initEvent("click", false, false);//initEvent 不加后两个参数在FF下会报错, 感谢 Barret Lee 的反馈 | ||
| 7 | + aLink.download = fileName; | ||
| 8 | + aLink.href = URL.createObjectURL(blob); | ||
| 9 | + aLink.dispatchEvent(evt); | ||
| 10 | +} | ||
| 11 | + | ||
| 12 | + | ||
| 13 | +(function($){ | ||
| 14 | + $.fn.extend({ | ||
| 15 | + tableExport: function(options) { | ||
| 16 | + var defaults = { | ||
| 17 | + separator: ',', | ||
| 18 | + ignoreColumn: [], | ||
| 19 | + tableName:'yourTableName', | ||
| 20 | + type:'csv', | ||
| 21 | + pdfFontSize:14, | ||
| 22 | + pdfLeftMargin:20, | ||
| 23 | + escape:'true', | ||
| 24 | + htmlContent:'false', | ||
| 25 | + consoleLog:'false' | ||
| 26 | + }; | ||
| 27 | + | ||
| 28 | + var options = $.extend(defaults, options); | ||
| 29 | + var el = this; | ||
| 30 | + | ||
| 31 | + if(defaults.type == 'csv' || defaults.type == 'txt'){ | ||
| 32 | + | ||
| 33 | + // Header | ||
| 34 | + var tdData =""; | ||
| 35 | + $(el).find('thead').find('tr').each(function() { | ||
| 36 | + tdData += "\n"; | ||
| 37 | + $(this).filter(':visible').find('th').each(function(index,data) { | ||
| 38 | + if ($(this).css('display') != 'none'){ | ||
| 39 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 40 | + tdData += '"' + parseString($(this)) + '"' + defaults.separator; | ||
| 41 | + } | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + }); | ||
| 45 | + tdData = $.trim(tdData); | ||
| 46 | + tdData = $.trim(tdData).substring(0, tdData.length -1); | ||
| 47 | + }); | ||
| 48 | + | ||
| 49 | + // Row vs Column | ||
| 50 | + $(el).find('tbody').find('tr').each(function() { | ||
| 51 | + tdData += "\n"; | ||
| 52 | + $(this).filter(':visible').find('td').each(function(index,data) { | ||
| 53 | + if ($(this).css('display') != 'none'){ | ||
| 54 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 55 | + tdData += '"'+ parseString($(this)) + '"'+ defaults.separator; | ||
| 56 | + } | ||
| 57 | + } | ||
| 58 | + }); | ||
| 59 | + //tdData = $.trim(tdData); | ||
| 60 | + tdData = $.trim(tdData).substring(0, tdData.length -1); | ||
| 61 | + }); | ||
| 62 | + | ||
| 63 | + //output | ||
| 64 | + if(defaults.consoleLog == 'true'){ | ||
| 65 | + console.log(tdData); | ||
| 66 | + } | ||
| 67 | + var base64data = "base64," + $.base64({ data: tdData, type: 0 }); | ||
| 68 | + //window.open('data:application/'+defaults.type+';filename=exportData;' + base64data); | ||
| 69 | + downloadFile(defaults.filename + '.' + defaults.type, tdData); | ||
| 70 | + }else if(defaults.type == 'sql'){ | ||
| 71 | + | ||
| 72 | + // Header | ||
| 73 | + var tdData ="INSERT INTO `"+defaults.tableName+"` ("; | ||
| 74 | + $(el).find('thead').find('tr').each(function() { | ||
| 75 | + | ||
| 76 | + $(this).filter(':visible').find('th').each(function(index,data) { | ||
| 77 | + if ($(this).css('display') != 'none'){ | ||
| 78 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 79 | + tdData += '`' + parseString($(this)) + '`,' ; | ||
| 80 | + } | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + }); | ||
| 84 | + tdData = $.trim(tdData); | ||
| 85 | + tdData = $.trim(tdData).substring(0, tdData.length -1); | ||
| 86 | + }); | ||
| 87 | + tdData += ") VALUES "; | ||
| 88 | + // Row vs Column | ||
| 89 | + $(el).find('tbody').find('tr').each(function() { | ||
| 90 | + tdData += "("; | ||
| 91 | + $(this).filter(':visible').find('td').each(function(index,data) { | ||
| 92 | + if ($(this).css('display') != 'none'){ | ||
| 93 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 94 | + tdData += '"'+ parseString($(this)) + '",'; | ||
| 95 | + } | ||
| 96 | + } | ||
| 97 | + }); | ||
| 98 | + | ||
| 99 | + tdData = $.trim(tdData).substring(0, tdData.length -1); | ||
| 100 | + tdData += "),"; | ||
| 101 | + }); | ||
| 102 | + tdData = $.trim(tdData).substring(0, tdData.length -1); | ||
| 103 | + tdData += ";"; | ||
| 104 | + | ||
| 105 | + //output | ||
| 106 | + //console.log(tdData); | ||
| 107 | + | ||
| 108 | + if(defaults.consoleLog == 'true'){ | ||
| 109 | + console.log(tdData); | ||
| 110 | + } | ||
| 111 | + | ||
| 112 | + var base64data = "base64," + $.base64.encode(tdData); | ||
| 113 | + window.open('data:application/sql;filename=exportData;' + base64data); | ||
| 114 | + | ||
| 115 | + | ||
| 116 | + }else if(defaults.type == 'json'){ | ||
| 117 | + | ||
| 118 | + var jsonHeaderArray = []; | ||
| 119 | + $(el).find('thead').find('tr').each(function() { | ||
| 120 | + var tdData =""; | ||
| 121 | + var jsonArrayTd = []; | ||
| 122 | + | ||
| 123 | + $(this).filter(':visible').find('th').each(function(index,data) { | ||
| 124 | + if ($(this).css('display') != 'none'){ | ||
| 125 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 126 | + jsonArrayTd.push(parseString($(this))); | ||
| 127 | + } | ||
| 128 | + } | ||
| 129 | + }); | ||
| 130 | + jsonHeaderArray.push(jsonArrayTd); | ||
| 131 | + | ||
| 132 | + }); | ||
| 133 | + | ||
| 134 | + var jsonArray = []; | ||
| 135 | + $(el).find('tbody').find('tr').each(function() { | ||
| 136 | + var tdData =""; | ||
| 137 | + var jsonArrayTd = []; | ||
| 138 | + | ||
| 139 | + $(this).filter(':visible').find('td').each(function(index,data) { | ||
| 140 | + if ($(this).css('display') != 'none'){ | ||
| 141 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 142 | + jsonArrayTd.push(parseString($(this))); | ||
| 143 | + } | ||
| 144 | + } | ||
| 145 | + }); | ||
| 146 | + jsonArray.push(jsonArrayTd); | ||
| 147 | + | ||
| 148 | + }); | ||
| 149 | + | ||
| 150 | + var jsonExportArray =[]; | ||
| 151 | + jsonExportArray.push({header:jsonHeaderArray,data:jsonArray}); | ||
| 152 | + | ||
| 153 | + //Return as JSON | ||
| 154 | + //console.log(JSON.stringify(jsonExportArray)); | ||
| 155 | + | ||
| 156 | + //Return as Array | ||
| 157 | + //console.log(jsonExportArray); | ||
| 158 | + if(defaults.consoleLog == 'true'){ | ||
| 159 | + console.log(JSON.stringify(jsonExportArray)); | ||
| 160 | + } | ||
| 161 | + var base64data = "base64," + $.base64.encode(JSON.stringify(jsonExportArray)); | ||
| 162 | + window.open('data:application/json;filename=exportData;' + base64data); | ||
| 163 | + }else if(defaults.type == 'xml'){ | ||
| 164 | + | ||
| 165 | + var xml = '<?xml version="1.0" encoding="utf-8"?>'; | ||
| 166 | + xml += '<tabledata><fields>'; | ||
| 167 | + // Header | ||
| 168 | + $(el).find('thead').find('tr').each(function() { | ||
| 169 | + $(this).filter(':visible').find('th').each(function(index,data) { | ||
| 170 | + if ($(this).css('display') != 'none'){ | ||
| 171 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 172 | + xml += "<field>" + parseString($(this)) + "</field>"; | ||
| 173 | + } | ||
| 174 | + } | ||
| 175 | + }); | ||
| 176 | + }); | ||
| 177 | + xml += '</fields><data>'; | ||
| 178 | + | ||
| 179 | + // Row Vs Column | ||
| 180 | + var rowCount=1; | ||
| 181 | + $(el).find('tbody').find('tr').each(function() { | ||
| 182 | + xml += '<row id="'+rowCount+'">'; | ||
| 183 | + var colCount=0; | ||
| 184 | + $(this).filter(':visible').find('td').each(function(index,data) { | ||
| 185 | + if ($(this).css('display') != 'none'){ | ||
| 186 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 187 | + xml += "<column-"+colCount+">"+parseString($(this))+"</column-"+colCount+">"; | ||
| 188 | + } | ||
| 189 | + } | ||
| 190 | + colCount++; | ||
| 191 | + }); | ||
| 192 | + rowCount++; | ||
| 193 | + xml += '</row>'; | ||
| 194 | + }); | ||
| 195 | + xml += '</data></tabledata>' | ||
| 196 | + | ||
| 197 | + if(defaults.consoleLog == 'true'){ | ||
| 198 | + console.log(xml); | ||
| 199 | + } | ||
| 200 | + | ||
| 201 | + var base64data = "base64," + $.base64.encode(xml); | ||
| 202 | + window.open('data:application/xml;filename=exportData;' + base64data); | ||
| 203 | + }else if(defaults.type == 'excel' || defaults.type == 'doc'|| defaults.type == 'powerpoint' ){ | ||
| 204 | + //console.log($(this).html()); | ||
| 205 | + var excel="<table>"; | ||
| 206 | + // Header | ||
| 207 | + $(el).find('thead').find('tr').each(function() { | ||
| 208 | + excel += "<tr>"; | ||
| 209 | + $(this).filter(':visible').find('th').each(function(index,data) { | ||
| 210 | + if ($(this).css('display') != 'none'){ | ||
| 211 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 212 | + excel += "<td>" + parseString($(this))+ "</td>"; | ||
| 213 | + } | ||
| 214 | + } | ||
| 215 | + }); | ||
| 216 | + excel += '</tr>'; | ||
| 217 | + | ||
| 218 | + }); | ||
| 219 | + | ||
| 220 | + | ||
| 221 | + // Row Vs Column | ||
| 222 | + var rowCount=1; | ||
| 223 | + $(el).find('tbody').find('tr').each(function() { | ||
| 224 | + excel += "<tr>"; | ||
| 225 | + var colCount=0; | ||
| 226 | + $(this).filter(':visible').find('td').each(function(index,data) { | ||
| 227 | + if ($(this).css('display') != 'none'){ | ||
| 228 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 229 | + excel += "<td>"+parseString($(this))+"</td>"; | ||
| 230 | + } | ||
| 231 | + } | ||
| 232 | + colCount++; | ||
| 233 | + }); | ||
| 234 | + rowCount++; | ||
| 235 | + excel += '</tr>'; | ||
| 236 | + }); | ||
| 237 | + excel += '</table>' | ||
| 238 | + | ||
| 239 | + if(defaults.consoleLog == 'true'){ | ||
| 240 | + console.log(excel); | ||
| 241 | + } | ||
| 242 | + | ||
| 243 | + var excelFile = "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:"+defaults.type+"' xmlns='http://www.w3.org/TR/REC-html40'>"; | ||
| 244 | + excelFile += "<head>"; | ||
| 245 | + excelFile += "<!--[if gte mso 9]>"; | ||
| 246 | + excelFile += "<xml>"; | ||
| 247 | + excelFile += "<x:ExcelWorkbook>"; | ||
| 248 | + excelFile += "<x:ExcelWorksheets>"; | ||
| 249 | + excelFile += "<x:ExcelWorksheet>"; | ||
| 250 | + excelFile += "<x:Name>"; | ||
| 251 | + excelFile += "{worksheet}"; | ||
| 252 | + excelFile += "</x:Name>"; | ||
| 253 | + excelFile += "<x:WorksheetOptions>"; | ||
| 254 | + excelFile += "<x:DisplayGridlines/>"; | ||
| 255 | + excelFile += "</x:WorksheetOptions>"; | ||
| 256 | + excelFile += "</x:ExcelWorksheet>"; | ||
| 257 | + excelFile += "</x:ExcelWorksheets>"; | ||
| 258 | + excelFile += "</x:ExcelWorkbook>"; | ||
| 259 | + excelFile += "</xml>"; | ||
| 260 | + excelFile += "<![endif]-->"; | ||
| 261 | + excelFile += "</head>"; | ||
| 262 | + excelFile += "<body>"; | ||
| 263 | + excelFile += excel; | ||
| 264 | + excelFile += "</body>"; | ||
| 265 | + excelFile += "</html>"; | ||
| 266 | + var base64data = "base64," + $.base64({ data: excelFile, type: 0 }); | ||
| 267 | + | ||
| 268 | + if(defaults.type == "doc") { | ||
| 269 | + window.open('data:application/msword;filename=exportData.'+defaults.type+';' + base64data); | ||
| 270 | + } | ||
| 271 | + else { | ||
| 272 | + window.open('data:application/vnd.ms-'+defaults.type+';filename=exportData.'+defaults.type+';' + base64data); | ||
| 273 | + } | ||
| 274 | + }else if(defaults.type == 'png'){ | ||
| 275 | + html2canvas($(el), { | ||
| 276 | + onrendered: function(canvas) { | ||
| 277 | + var img = canvas.toDataURL("image/png"); | ||
| 278 | + window.open(img); | ||
| 279 | + | ||
| 280 | + | ||
| 281 | + } | ||
| 282 | + }); | ||
| 283 | + }else if(defaults.type == 'pdf'){ | ||
| 284 | + | ||
| 285 | + var doc = new jsPDF('p','pt', 'a4', true); | ||
| 286 | + doc.setFontSize(defaults.pdfFontSize); | ||
| 287 | + | ||
| 288 | + // Header | ||
| 289 | + var startColPosition=defaults.pdfLeftMargin; | ||
| 290 | + $(el).find('thead').find('tr').each(function() { | ||
| 291 | + $(this).filter(':visible').find('th').each(function(index,data) { | ||
| 292 | + if ($(this).css('display') != 'none'){ | ||
| 293 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 294 | + var colPosition = startColPosition+ (index * 50); | ||
| 295 | + doc.text(colPosition,20, parseString($(this))); | ||
| 296 | + } | ||
| 297 | + } | ||
| 298 | + }); | ||
| 299 | + }); | ||
| 300 | + | ||
| 301 | + | ||
| 302 | + // Row Vs Column | ||
| 303 | + var startRowPosition = 20; var page =1;var rowPosition=0; | ||
| 304 | + $(el).find('tbody').find('tr').each(function(index,data) { | ||
| 305 | + rowCalc = index+1; | ||
| 306 | + | ||
| 307 | + if (rowCalc % 26 == 0){ | ||
| 308 | + doc.addPage(); | ||
| 309 | + page++; | ||
| 310 | + startRowPosition=startRowPosition+10; | ||
| 311 | + } | ||
| 312 | + rowPosition=(startRowPosition + (rowCalc * 10)) - ((page -1) * 280); | ||
| 313 | + | ||
| 314 | + $(this).filter(':visible').find('td').each(function(index,data) { | ||
| 315 | + if ($(this).css('display') != 'none'){ | ||
| 316 | + if(defaults.ignoreColumn.indexOf(index) == -1){ | ||
| 317 | + var colPosition = startColPosition+ (index * 50); | ||
| 318 | + doc.text(colPosition,rowPosition, parseString($(this))); | ||
| 319 | + } | ||
| 320 | + } | ||
| 321 | + | ||
| 322 | + }); | ||
| 323 | + | ||
| 324 | + }); | ||
| 325 | + | ||
| 326 | + // Output as Data URI | ||
| 327 | + doc.output('datauri'); | ||
| 328 | + | ||
| 329 | + } | ||
| 330 | + | ||
| 331 | + | ||
| 332 | + function parseString(data){ | ||
| 333 | + | ||
| 334 | + if(defaults.htmlContent == 'true'){ | ||
| 335 | + content_data = data.html().trim(); | ||
| 336 | + }else{ | ||
| 337 | + content_data = data.text().trim(); | ||
| 338 | + } | ||
| 339 | + | ||
| 340 | + if(defaults.escape == 'true'){ | ||
| 341 | + content_data = escape(content_data); | ||
| 342 | + } | ||
| 343 | + | ||
| 344 | + | ||
| 345 | + | ||
| 346 | + return content_data; | ||
| 347 | + } | ||
| 348 | + | ||
| 349 | + } | ||
| 350 | + }); | ||
| 351 | +})(jQuery); | ||
| 0 | \ No newline at end of file | 352 | \ No newline at end of file |
src/main/resources/static/pages/control/lineallot_v3/main.html
0 → 100644
| 1 | +<!DOCTYPE html> | ||
| 2 | +<html lang="zh-cn"> | ||
| 3 | + | ||
| 4 | +<head> | ||
| 5 | + <meta charset="UTF-8"> | ||
| 6 | + <link rel="stylesheet" href="/assets/plugins/uk3.0/uikit.min.css"/> | ||
| 7 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css"/> | ||
| 8 | + <!-- flatpickr --> | ||
| 9 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.css"> | ||
| 10 | + <style> | ||
| 11 | + html, body { | ||
| 12 | + height: 100%; | ||
| 13 | + } | ||
| 14 | + | ||
| 15 | + .ct_page { | ||
| 16 | + padding: 25px 15px; | ||
| 17 | + height: 100%; | ||
| 18 | + height: calc(100% - 65px); | ||
| 19 | + } | ||
| 20 | + | ||
| 21 | + .ct_cont { | ||
| 22 | + height: calc(100% - 41px); | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + .ct_cont > div > div.uk-card { | ||
| 26 | + height: 99%; | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + .loading { | ||
| 30 | + height: 100%; | ||
| 31 | + text-align: center; | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + .loading .uk-spinner { | ||
| 35 | + margin-top: 200px; | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + .loading circle { | ||
| 39 | + stroke: red; | ||
| 40 | + } | ||
| 41 | + | ||
| 42 | + .ps-container > .ps-scrollbar-x-rail, .ps-container > .ps-scrollbar-y-rail { | ||
| 43 | + opacity: 0.6 !important; | ||
| 44 | + padding: 0 !important; | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + .line_list_all_wrap { | ||
| 48 | + height: 200px; | ||
| 49 | + overflow: auto; | ||
| 50 | + position: relative; | ||
| 51 | + -webkit-user-select:none; | ||
| 52 | + -moz-user-select:none; | ||
| 53 | + -ms-user-select:none; | ||
| 54 | + user-select:none; | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + .line_list_all_wrap > .item { | ||
| 58 | + background: #fff; | ||
| 59 | + color: #666; | ||
| 60 | + box-shadow: 0px 3px 12px rgba(0, 0, 0, 0.08); | ||
| 61 | + padding: 7px 12px; | ||
| 62 | + border: 1px solid #ececec; | ||
| 63 | + display: inline-block; | ||
| 64 | + margin: 5px; | ||
| 65 | + min-width: 70px; | ||
| 66 | + text-align: center; | ||
| 67 | + cursor: default; | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + .line_list_all_wrap > .item.active{ | ||
| 71 | + background: #ffe9a5; | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + .checked_list { | ||
| 75 | + padding-left: 4px; | ||
| 76 | + -webkit-user-select:none; | ||
| 77 | + -moz-user-select:none; | ||
| 78 | + -ms-user-select:none; | ||
| 79 | + user-select:none; | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + .checked_list > .item { | ||
| 83 | + color: #fbfbfb; | ||
| 84 | + box-shadow: 0px 3px 12px rgba(50, 197, 210, 0.3); | ||
| 85 | + padding: 7px 12px; | ||
| 86 | + border: 1px solid #ececec; | ||
| 87 | + display: inline-block; | ||
| 88 | + margin: 5px 2px; | ||
| 89 | + min-width: 70px; | ||
| 90 | + text-align: center; | ||
| 91 | + background: #32C5D2; | ||
| 92 | + cursor: move; | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + .company_search_wrap { | ||
| 96 | + width: 610px; | ||
| 97 | + margin-left: 6px; | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + .company_search_wrap select { | ||
| 101 | + display: inline-block; | ||
| 102 | + width: 128px; | ||
| 103 | + margin-right: 12px; | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + .uk-card { | ||
| 107 | + border: 1px solid #eeeeee; | ||
| 108 | + } | ||
| 109 | + | ||
| 110 | + .footer_tools_card { | ||
| 111 | + margin-top: 20px; | ||
| 112 | + padding: 20px 40px; | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + .footer_tools_card label { | ||
| 116 | + vertical-align: bottom; | ||
| 117 | + display: inline-block; | ||
| 118 | + font-size: 13px; | ||
| 119 | + margin-left: 13px; | ||
| 120 | + margin-bottom: 3px !important; | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + .uk-button-default{ | ||
| 124 | + background: #e0e0e0 !important; | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + .line_list_all_wrap > .item.destroy{ | ||
| 128 | + color: #f64242; | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + .checked_list > .item.destroy{ | ||
| 132 | + background: #ff5c5c; | ||
| 133 | + } | ||
| 134 | + </style> | ||
| 135 | +</head> | ||
| 136 | + | ||
| 137 | +<body> | ||
| 138 | +<div class="loading"> | ||
| 139 | + <div uk-spinner></div> | ||
| 140 | +</div> | ||
| 141 | +<div class="ct_page" style="display: none;"> | ||
| 142 | + <h2 class="uk-heading-line uk-heading-bullet"><span>线调 <h5 style="display: inline-block;">-选择线路</h5></span></h2> | ||
| 143 | + <div class="ct_cont"> | ||
| 144 | + <div class="allot_wrap uk-flex-center" uk-grid> | ||
| 145 | + <div class="uk-card uk-card-hover uk-card-body uk-width-2-3@m" | ||
| 146 | + style="padding-top: 20px;padding-bottom: 20px;"> | ||
| 147 | + <div class="company_search_wrap"> | ||
| 148 | + <select class="uk-select company_search_select"></select> | ||
| 149 | + <select class="uk-select fgs_search_select" disabled> | ||
| 150 | + <option value="">分公司搜索</option> | ||
| 151 | + </select> | ||
| 152 | + <div class="uk-inline"> | ||
| 153 | + <span class="uk-form-icon uk-form-icon-flip" uk-icon="icon: search"></span> | ||
| 154 | + <input class="uk-input line_search_input" style="width: 310px;" placeholder="搜索线路"> | ||
| 155 | + </div> | ||
| 156 | + </div> | ||
| 157 | + <hr> | ||
| 158 | + <div class="line_list_all_wrap"></div> | ||
| 159 | + <hr> | ||
| 160 | + <div class="checked_list" uk-sortable> </div> | ||
| 161 | + </div> | ||
| 162 | + | ||
| 163 | + <div class="uk-card uk-card-hover uk-card-body uk-width-2-3@m footer_tools_card"> | ||
| 164 | + <button class="uk-button uk-button-default uk-button-large" style="font-size: 16px" id="go_to_real_system_btn"><i | ||
| 165 | + uk-icon=" icon: sign-in" style="margin-right: 5px;" ></i>进入线路调度 | ||
| 166 | + </button> | ||
| 167 | + <label style="display: none" class="pattern_type_label"><input class="uk-checkbox" type="checkbox" style="display: none" > 主调模式登录</label> | ||
| 168 | + <label class="new_window_open_label" title="可能会被浏览器阻止新建窗口" uk-tooltip><input class="uk-checkbox" type="checkbox"> 新窗口打开</label> | ||
| 169 | + </div> | ||
| 170 | + | ||
| 171 | + <div class="uk-alert-warning uk-width-2-3@m " uk-alert> | ||
| 172 | + <p>注意!!! 相关“设备调试人员”和“测试人员”不要以主调模式进入线调。</p> | ||
| 173 | + </div> | ||
| 174 | + </div> | ||
| 175 | + </div> | ||
| 176 | +</div> | ||
| 177 | + | ||
| 178 | +<script id="line_list_items_temp" type="text/html"> | ||
| 179 | + {{each list as obj i}} | ||
| 180 | + <span class="item {{obj.destroy==1?'destroy':''}}" data-id="{{obj.lineCode}}" data-gsbm="{{obj.company}}_{{obj.brancheCompany}}">{{obj.name}}</span> | ||
| 181 | + {{/each}} | ||
| 182 | +</script> | ||
| 183 | + | ||
| 184 | +<script src="/metronic_v4.5.4/plugins/jquery.min.js"></script> | ||
| 185 | +<script src="/assets/plugins/uk3.0/uikit.min.js"></script> | ||
| 186 | +<script src="/assets/plugins/uk3.0/uikit-icons.min.js"></script> | ||
| 187 | +<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js"></script> | ||
| 188 | +<!-- EventProxy --> | ||
| 189 | +<script src="/assets/js/eventproxy.js"></script> | ||
| 190 | +<!-- art-template 模版引擎 --> | ||
| 191 | +<script src="/assets/plugins/template.js"></script> | ||
| 192 | +<script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script> | ||
| 193 | +<script src="/assets/plugins/pinyin.js"></script> | ||
| 194 | +<script> | ||
| 195 | + var allMapps = {};//线路搜索映射 | ||
| 196 | + var companyData = {}; | ||
| 197 | + var codeMapps={}; //线路编码映射 | ||
| 198 | + //滚动条 | ||
| 199 | + $('.line_list_all_wrap').perfectScrollbar(); | ||
| 200 | + | ||
| 201 | + var ep = EventProxy.create('all_lines', 'user_author', 'company_data', function (allLines, userAuthor, company_data) { | ||
| 202 | + //按用户权限过滤线路 | ||
| 203 | + var authArray = userAuthor.lineCodeStr.split(','), | ||
| 204 | + newArray = []; | ||
| 205 | + $.each(allLines, function () { | ||
| 206 | + if (this.lineCode && authArray.indexOf(this.lineCode) != -1) { | ||
| 207 | + newArray.push(this); | ||
| 208 | + codeMapps[this.lineCode] = this; | ||
| 209 | + } | ||
| 210 | + }); | ||
| 211 | + //排序 | ||
| 212 | + newArray.sort(function (a, b) { | ||
| 213 | + return a.name.localeCompare(b.name); | ||
| 214 | + }); | ||
| 215 | + //创建线路搜索映射 | ||
| 216 | + createLineSearchMapps(newArray); | ||
| 217 | + | ||
| 218 | + var htmlStr = template('line_list_items_temp', {list: newArray}); | ||
| 219 | + $('.line_list_all_wrap').html(htmlStr); | ||
| 220 | + | ||
| 221 | + //过滤公司编码数据 | ||
| 222 | + filter_company_data.filter(newArray, convert_buss_data(company_data)); | ||
| 223 | + initCompanySelect(); | ||
| 224 | + //更新滚动条高度 | ||
| 225 | + setTimeout(function () { | ||
| 226 | + $('.line_list_all_wrap').perfectScrollbar('update'); | ||
| 227 | + }, 1000); | ||
| 228 | + | ||
| 229 | + //登录模式 | ||
| 230 | + changePattern(userAuthor.pattern); | ||
| 231 | + if(!userAuthor.pattern) | ||
| 232 | + $('.pattern_type_label').hide().find('input')[0].checked=false; | ||
| 233 | + else | ||
| 234 | + $('input','.pattern_type_label')[0].checked=true; | ||
| 235 | + | ||
| 236 | + $('.loading').remove(); | ||
| 237 | + $('.ct_page').show(); | ||
| 238 | + | ||
| 239 | + //默认选中上次记录 | ||
| 240 | + var lineControlItems = window.localStorage.getItem('lineControlItems'); | ||
| 241 | + if (lineControlItems) { | ||
| 242 | + var array = JSON.parse(lineControlItems); | ||
| 243 | + $.each(array, function (i, line) { | ||
| 244 | + $('.item[data-id='+line.lineCode+']','.line_list_all_wrap').trigger('click'); | ||
| 245 | + }); | ||
| 246 | + } | ||
| 247 | + }); | ||
| 248 | + | ||
| 249 | + $('.pattern_type_label').on('click', function () { | ||
| 250 | + var checked = $('input',this)[0].checked; | ||
| 251 | + changePattern(checked); | ||
| 252 | + }); | ||
| 253 | + | ||
| 254 | + function changePattern(status) { | ||
| 255 | + var btn = $('#go_to_real_system_btn'), | ||
| 256 | + def='uk-button-default', | ||
| 257 | + prim='uk-button-primary'; | ||
| 258 | + if(status){ | ||
| 259 | + btn.removeClass(def).addClass(prim); | ||
| 260 | + } | ||
| 261 | + else{ | ||
| 262 | + btn.removeClass(prim).addClass(def); | ||
| 263 | + } | ||
| 264 | + } | ||
| 265 | + | ||
| 266 | + /** | ||
| 267 | + * 查询所有线路 | ||
| 268 | + */ | ||
| 269 | + $.get('/freeLogin/line/all', {remove_ne: 1}, function (list) { | ||
| 270 | + ep.emit('all_lines', list); | ||
| 271 | + }); | ||
| 272 | + | ||
| 273 | + /**用户分配的线路*/ | ||
| 274 | + $.get('/freeLogin/realControAuthority/findByCurrentUser', function (t) { | ||
| 275 | + ep.emit('user_author', t); | ||
| 276 | + }); | ||
| 277 | + | ||
| 278 | + /** 查询公司编码 */ | ||
| 279 | + $.get('/freeLogin/business/all', function (rs) { | ||
| 280 | + ep.emit('company_data', rs); | ||
| 281 | + }); | ||
| 282 | + | ||
| 283 | + //点击选择线路 | ||
| 284 | + $('.line_list_all_wrap').on('click', 'span.item', function () { | ||
| 285 | + var lineCode = $(this).data('id'), | ||
| 286 | + name = $(this).text(); | ||
| 287 | + if ($(this).hasClass('active')) { | ||
| 288 | + $(this).removeClass('active'); | ||
| 289 | + | ||
| 290 | + $('.item[data-id='+lineCode+']','.checked_list').remove(); | ||
| 291 | + } | ||
| 292 | + else { | ||
| 293 | + $(this).addClass('active'); | ||
| 294 | + var span = $('<span data-id="'+lineCode+'" class="item uk-card uk-card-default uk-animation-slide-bottom '+($(this).hasClass('destroy')?"destroy":"")+'">'+name+'</span>') | ||
| 295 | + .one('webkitAnimationEnd', function () { | ||
| 296 | + $(this).removeClass('uk-animation-slide-bottom'); | ||
| 297 | + }); | ||
| 298 | + $('.checked_list').append(span); | ||
| 299 | + } | ||
| 300 | + }); | ||
| 301 | + | ||
| 302 | + $('.checked_list').on('click', '.item', function () { | ||
| 303 | + var lineCode = $(this).data('id'); | ||
| 304 | + $('.item[data-id='+lineCode+']','.line_list_all_wrap').removeClass('active'); | ||
| 305 | + $(this).remove(); | ||
| 306 | + }); | ||
| 307 | + | ||
| 308 | + /** | ||
| 309 | + * 搜索线路 | ||
| 310 | + */ | ||
| 311 | + function search_line_list() { | ||
| 312 | + var comp = $('select.company_search_select').val(), | ||
| 313 | + fgs = $('select.fgs_search_select').val(), | ||
| 314 | + gsbm = comp + '_' + fgs; | ||
| 315 | + | ||
| 316 | + if(gsbm=='_') | ||
| 317 | + gsbm=null; | ||
| 318 | + var allDoms = $('.line_list_all_wrap span.item'); | ||
| 319 | + //线路 | ||
| 320 | + var lineCodeArray = []; | ||
| 321 | + var t = $('.line_search_input').val(); | ||
| 322 | + if(t){ | ||
| 323 | + t = t.toUpperCase(); | ||
| 324 | + for(var m in allMapps){ | ||
| 325 | + if(m.indexOf(t)!=-1) | ||
| 326 | + lineCodeArray.push(allMapps[m]); | ||
| 327 | + } | ||
| 328 | + } | ||
| 329 | + | ||
| 330 | + //搜索 | ||
| 331 | + var show_elems = []; | ||
| 332 | + for (var i=0, dom; dom = allDoms[i++];) { | ||
| 333 | + if(gsbm && $(dom).data('gsbm').indexOf(gsbm)==-1) | ||
| 334 | + continue; | ||
| 335 | + | ||
| 336 | + if(t && lineCodeArray.indexOf($(dom).data('id')+'') == -1) | ||
| 337 | + continue; | ||
| 338 | + | ||
| 339 | + show_elems.push($(dom)); | ||
| 340 | + } | ||
| 341 | + | ||
| 342 | + //show | ||
| 343 | + allDoms.hide(); | ||
| 344 | + for(var j=0,$dom;$dom=show_elems[j++];) | ||
| 345 | + $dom.show(); | ||
| 346 | + } | ||
| 347 | + | ||
| 348 | + function createLineSearchMapps(list) { | ||
| 349 | + allMapps = {}; | ||
| 350 | + var name, code; | ||
| 351 | + for (var i = 0, line; line = list[i++];) { | ||
| 352 | + name = line.name; | ||
| 353 | + code = line.lineCode; | ||
| 354 | + //拼音映射 | ||
| 355 | + allMapps[pinyin.getCamelChars(name)] = code; | ||
| 356 | + allMapps[pinyin.getFullChars(name).toUpperCase()] = code; | ||
| 357 | + //中文映射 | ||
| 358 | + allMapps[name] = code; | ||
| 359 | + } | ||
| 360 | + } | ||
| 361 | + | ||
| 362 | + | ||
| 363 | + //构建公司级联下拉框 | ||
| 364 | + function initCompanySelect() { | ||
| 365 | + var opts = '<option value="">公司搜索</option>'; | ||
| 366 | + for (var k in companyData) { | ||
| 367 | + opts += '<option value="' + k + '">' + companyData[k].name + '</option>'; | ||
| 368 | + } | ||
| 369 | + $('select.company_search_select').html(opts); | ||
| 370 | + } | ||
| 371 | + | ||
| 372 | + //公司切换 | ||
| 373 | + $('select.company_search_select').on('change', function () { | ||
| 374 | + var opts = '<option value="">分公司搜索</option>', | ||
| 375 | + t = $(this).val(), | ||
| 376 | + fgsSelect = $('select.fgs_search_select'); | ||
| 377 | + if (!t) { | ||
| 378 | + fgsSelect.html(opts).attr('disabled', 'disabled'); | ||
| 379 | + } | ||
| 380 | + else{ | ||
| 381 | + var array = companyData[t].childs; | ||
| 382 | + for (var i = 0, fgs; fgs = array[i++];) { | ||
| 383 | + opts += '<option value="' + fgs.businessCode + '">' + fgs.businessName + '</option>'; | ||
| 384 | + } | ||
| 385 | + | ||
| 386 | + fgsSelect.html(opts).removeAttr('disabled'); | ||
| 387 | + } | ||
| 388 | + search_line_list(); | ||
| 389 | + }); | ||
| 390 | + | ||
| 391 | + //分公司切换 | ||
| 392 | + $('select.fgs_search_select').on('change', search_line_list); | ||
| 393 | + | ||
| 394 | + //线路文本框输入 | ||
| 395 | + var flag; | ||
| 396 | + $('.line_search_input').on('input', function () { | ||
| 397 | + if(flag) | ||
| 398 | + return; | ||
| 399 | + flag = true; | ||
| 400 | + setTimeout(function () { | ||
| 401 | + //延迟 | ||
| 402 | + search_line_list(); | ||
| 403 | + flag = false; | ||
| 404 | + }, 200); | ||
| 405 | + }); | ||
| 406 | + | ||
| 407 | + function convert_buss_data(rs) { | ||
| 408 | + var baseCode; | ||
| 409 | + //找到跟节点 | ||
| 410 | + $.each(rs, function () { | ||
| 411 | + if (this.upCode == 0) { | ||
| 412 | + baseCode = this.businessCode; | ||
| 413 | + return false; | ||
| 414 | + } | ||
| 415 | + }); | ||
| 416 | + if (!baseCode)return; | ||
| 417 | + //提取二级节点 | ||
| 418 | + var secondMap = {}; | ||
| 419 | + $.each(rs, function () { | ||
| 420 | + if (this.upCode == baseCode) | ||
| 421 | + secondMap[this.businessCode] = {name: this.businessName, childs: []}; | ||
| 422 | + }); | ||
| 423 | + //分公司节点 | ||
| 424 | + $.each(rs, function () { | ||
| 425 | + if (secondMap[this.upCode]) | ||
| 426 | + secondMap[this.upCode].childs.push(this); | ||
| 427 | + }); | ||
| 428 | + //排序 | ||
| 429 | + for (var sid in secondMap) | ||
| 430 | + secondMap[sid].childs.sort(naturalSort); | ||
| 431 | + return secondMap; | ||
| 432 | + } | ||
| 433 | + | ||
| 434 | + var naturalSort = function (a, b) { | ||
| 435 | + return a.businessName.localeCompare(b.businessName); | ||
| 436 | + }; | ||
| 437 | + | ||
| 438 | + /** | ||
| 439 | + * 根据用户线路权限过滤公司编码数据 | ||
| 440 | + */ | ||
| 441 | + var filter_company_data = (function () { | ||
| 442 | + var filter = function (lineArray, data) { | ||
| 443 | + companyData = {}; | ||
| 444 | + var com, fCom; | ||
| 445 | + $.each(lineArray, function () { | ||
| 446 | + com = this.company; | ||
| 447 | + fCom = this.brancheCompany; | ||
| 448 | + if (!companyData[com]) { | ||
| 449 | + companyData[com] = {name: data[com].name, childs: []}; | ||
| 450 | + } | ||
| 451 | + | ||
| 452 | + if (!get(fCom, companyData[com].childs)) { | ||
| 453 | + companyData[com].childs.push(get(fCom, data[com].childs)); | ||
| 454 | + } | ||
| 455 | + }); | ||
| 456 | + }; | ||
| 457 | + | ||
| 458 | + function get(fgsCode, fgsArray) { | ||
| 459 | + for (var i = 0, fgs; fgs = fgsArray[i++];) { | ||
| 460 | + if (fgs.businessCode == fgsCode) | ||
| 461 | + return fgs; | ||
| 462 | + } | ||
| 463 | + return null; | ||
| 464 | + } | ||
| 465 | + | ||
| 466 | + return { | ||
| 467 | + filter: filter | ||
| 468 | + } | ||
| 469 | + })(); | ||
| 470 | + var storage = window.localStorage; | ||
| 471 | + $('#go_to_real_system_btn').on('click', go_to_xd_sys); | ||
| 472 | + /** | ||
| 473 | + * 进入线调 | ||
| 474 | + */ | ||
| 475 | + function go_to_xd_sys() { | ||
| 476 | + var items = $('.checked_list .item'); | ||
| 477 | + if(items.length==0) | ||
| 478 | + return UIkit.notification({message: '你还没有选择线路!', pos: 'bottom-center', status: 'danger'}); | ||
| 479 | + $(this).attr('disabled', 'disabled'); | ||
| 480 | + | ||
| 481 | + show_btn_load(this, '更新缓存数据...'); | ||
| 482 | + (function () { | ||
| 483 | + var ls_line_data = []; | ||
| 484 | + $.each(items, function () { | ||
| 485 | + ls_line_data.push(codeMapps[$(this).data('id')]); | ||
| 486 | + }); | ||
| 487 | + //将线路基础信息写入localStorage | ||
| 488 | + storage.setItem('lineControlItems', JSON.stringify(ls_line_data)); | ||
| 489 | + //监控模式还是主调模式 | ||
| 490 | + storage.setItem('operationMode', $('.pattern_type_label>input')[0].checked?1:0); | ||
| 491 | + | ||
| 492 | + //进入线调 | ||
| 493 | + var eq = EventProxy.create('cache_route', 'check_line_config', function () { | ||
| 494 | + var newWinOpen = $('input','.new_window_open_label')[0].checked; | ||
| 495 | + if(!newWinOpen) | ||
| 496 | + top.window.location.href = "/freeLogin/real_control/v2"; | ||
| 497 | + else{ | ||
| 498 | + window.open("/freeLogin/real_control/v2"); | ||
| 499 | + $('#go_to_real_system_btn').html('已经尝试打开新窗口,如看不到,可能被浏览器阻止了'); | ||
| 500 | + } | ||
| 501 | + }); | ||
| 502 | + | ||
| 503 | + //拼接线路编码 | ||
| 504 | + var idx=''; | ||
| 505 | + $.each(ls_line_data, function () { | ||
| 506 | + idx+=(this.lineCode + ','); | ||
| 507 | + }); | ||
| 508 | + //缓存路由 | ||
| 509 | + idx=idx.substr(0, idx.length - 1); | ||
| 510 | + $.get('/freeLogin/realMap/findRouteByLine', {idx: idx}, function (rs) { | ||
| 511 | + if (rs) { | ||
| 512 | + for(var lineCode in rs) | ||
| 513 | + storage.setItem(lineCode + '_route', JSON.stringify(rs[lineCode])); | ||
| 514 | + | ||
| 515 | + eq.emit('cache_route'); | ||
| 516 | + } | ||
| 517 | + }); | ||
| 518 | + | ||
| 519 | + //检查线路配置 | ||
| 520 | + checkLineConfig(ls_line_data, function (rs) { | ||
| 521 | + if (rs.status == 0) | ||
| 522 | + eq.emit('check_line_config'); | ||
| 523 | + else if (rs.status == 1){ | ||
| 524 | + initLineConfig(rs.not, function () { | ||
| 525 | + eq.emit('check_line_config'); | ||
| 526 | + }); | ||
| 527 | + } | ||
| 528 | + }) | ||
| 529 | + })(); | ||
| 530 | + } | ||
| 531 | + | ||
| 532 | + function checkLineConfig(lsData, cb) { | ||
| 533 | + var lineCodeArray = []; | ||
| 534 | + $.each(lsData, function () { | ||
| 535 | + lineCodeArray.push(this.lineCode); | ||
| 536 | + }); | ||
| 537 | + | ||
| 538 | + $.ajax({ | ||
| 539 | + url: '/freeLogin/lineConfig/check', | ||
| 540 | + traditional: true, | ||
| 541 | + data: {codeArray: lineCodeArray}, | ||
| 542 | + method: 'POST', | ||
| 543 | + success: cb | ||
| 544 | + }); | ||
| 545 | + } | ||
| 546 | + | ||
| 547 | + function initLineConfig(arr, cb) { | ||
| 548 | + var i = 0; | ||
| 549 | + (function () { | ||
| 550 | + if (i >= arr.length) { | ||
| 551 | + cb && cb(); | ||
| 552 | + return; | ||
| 553 | + } | ||
| 554 | + var f = arguments.callee | ||
| 555 | + , lineCode = arr[i]; | ||
| 556 | + | ||
| 557 | + //showLoad('初始化' + lineIds[lineCode] + '配置信息...'); | ||
| 558 | + $.post('/freeLogin/lineConfig/init/' + lineCode, function (rs) { | ||
| 559 | + if (rs == 1) { | ||
| 560 | + i++; | ||
| 561 | + f(); | ||
| 562 | + } | ||
| 563 | + }); | ||
| 564 | + })(); | ||
| 565 | + } | ||
| 566 | + | ||
| 567 | + /** | ||
| 568 | + * 按钮转菊花 | ||
| 569 | + */ | ||
| 570 | + function show_btn_load(btn, msg) { | ||
| 571 | + $(btn).html('<div uk-spinner></div> ' + msg); | ||
| 572 | + } | ||
| 573 | +</script> | ||
| 574 | +</body> | ||
| 575 | +</html> | ||
| 0 | \ No newline at end of file | 576 | \ No newline at end of file |
src/main/resources/static/real_control_v3/alone_page/home/alone_data_basic.js
0 → 100644
| 1 | +/* 基础数据管理模块 */ | ||
| 2 | + | ||
| 3 | +var gb_data_basic = (function () { | ||
| 4 | + | ||
| 5 | + var stationRoutes, lineCode2NameAll, lineInformations, nbbm2deviceMap, device2nbbmMap, allPersonnel, svgAttrs; | ||
| 6 | + var ep = EventProxy.create("stationRoutes", "lineCode2Name", "lineInformations", "nbbm2deviceId", "all_personnel", "svg_attrs" | ||
| 7 | + , function (routes, code2Name, informations, nbbm2device, all_personnel, svgAttrMap) { | ||
| 8 | + stationRoutes = routes; | ||
| 9 | + lineCode2NameAll = code2Name; | ||
| 10 | + lineInformations = informations; | ||
| 11 | + nbbm2deviceMap = nbbm2device; | ||
| 12 | + device2nbbmMap = gb_common.inverse(nbbm2deviceMap); | ||
| 13 | + allPersonnel = all_personnel; | ||
| 14 | + svgAttrs = svgAttrMap; | ||
| 15 | + | ||
| 16 | + res_load_ep.emitLater('data-basic'); | ||
| 17 | + }); | ||
| 18 | + | ||
| 19 | + var storage = window.localStorage; | ||
| 20 | + //激活的线路 | ||
| 21 | + var activeLines = JSON.parse(storage.getItem('lineControlItems')); | ||
| 22 | + //lineCode to line object | ||
| 23 | + var codeToLine = {}; | ||
| 24 | + //lineCode idx string | ||
| 25 | + var line_idx = (function () { | ||
| 26 | + var str = ''; | ||
| 27 | + for (var i = 0, item; item = activeLines[i++];) { | ||
| 28 | + str += (',' + item.lineCode); | ||
| 29 | + codeToLine[item.lineCode] = item; | ||
| 30 | + } | ||
| 31 | + return str.substr(1); | ||
| 32 | + })(); | ||
| 33 | + | ||
| 34 | + //站点路由 | ||
| 35 | + gb_common.$get('/stationroute/multiLine', {lineIds: line_idx}, function (rs) { | ||
| 36 | + var list = rs.list;//JSON.parse(rs.list); | ||
| 37 | + var routeData = gb_common.groupBy(list, 'lineCode'); | ||
| 38 | + //排序 | ||
| 39 | + for (var lineCode in routeData) { | ||
| 40 | + routeData[lineCode].sort(stationRouteSort); | ||
| 41 | + } | ||
| 42 | + ep.emit('stationRoutes', routeData); | ||
| 43 | + }); | ||
| 44 | + | ||
| 45 | + //线路标准信息 | ||
| 46 | + /*gb_common.$get('/lineInformation/line/multi', {lineCodes: line_idx}, function (rs) { | ||
| 47 | + var informations = {}; | ||
| 48 | + $.each(rs, function () { | ||
| 49 | + informations[this.line.lineCode] = this; | ||
| 50 | + delete this['line']; | ||
| 51 | + }); | ||
| 52 | + ep.emit('lineInformations', informations); | ||
| 53 | + });*/ | ||
| 54 | + ep.emit('lineInformations', {}); | ||
| 55 | + | ||
| 56 | + //人员信息 | ||
| 57 | + ep.emit('all_personnel', {}); | ||
| 58 | + /*loadAllPersonnel(function (data) { | ||
| 59 | + ep.emit('all_personnel', data); | ||
| 60 | + }); | ||
| 61 | + function loadAllPersonnel(cb) { | ||
| 62 | + $.get('/personnel/all_py', function (rs) { | ||
| 63 | + //转换成自动补全组件需要的数据 | ||
| 64 | + var data = [], code; | ||
| 65 | + for(var i =0, p; p = rs[i++];){ | ||
| 66 | + code = p['workId'].indexOf('-')!=-1?p['workId'].split('-')[1]:p['workId']; | ||
| 67 | + data.push({ | ||
| 68 | + value: code + '/' + p.name, | ||
| 69 | + fullChars: p.fullChars.toUpperCase(), | ||
| 70 | + camelChars: p.camelChars.toUpperCase() | ||
| 71 | + }); | ||
| 72 | + } | ||
| 73 | + cb && cb(data); | ||
| 74 | + }); | ||
| 75 | + }*/ | ||
| 76 | + | ||
| 77 | + var carparks = {}; | ||
| 78 | + //停车场数据 | ||
| 79 | +/* gb_common.$get('/realMap/carParkSpatialData', {}, function (rs) { | ||
| 80 | + rs.list.sort(function (a, b) { | ||
| 81 | + return a.parkName.localeCompare(b.parkName); | ||
| 82 | + }); | ||
| 83 | + $.each(rs.list, function () { | ||
| 84 | + carparks[this.parkCode] = this; | ||
| 85 | + }); | ||
| 86 | + });*/ | ||
| 87 | + | ||
| 88 | + //车辆数据 | ||
| 89 | + var carsArray; | ||
| 90 | + /*$.get('/basic/cars?t=' + Math.random(), function (rs) { | ||
| 91 | + carsArray = rs; | ||
| 92 | + });*/ | ||
| 93 | + | ||
| 94 | + var getCarparkByCode = function (code) { | ||
| 95 | + return carparks[code]; | ||
| 96 | + }; | ||
| 97 | + | ||
| 98 | + //line code to name | ||
| 99 | + $.get('/freeLogin/basic/lineCode2Name', function (rs) { | ||
| 100 | + ep.emit('lineCode2Name', rs); | ||
| 101 | + }); | ||
| 102 | + | ||
| 103 | + //nbbm to device id | ||
| 104 | + $.get('freeLogin/basic/nbbm2deviceId', function (rs) { | ||
| 105 | + ep.emit('nbbm2deviceId', rs); | ||
| 106 | + }); | ||
| 107 | + //nbbm to 车牌号 | ||
| 108 | + var nbbm2PlateMap; | ||
| 109 | + $.get('/freeLogin/basic/nbbm2PlateNo', function (rs) { | ||
| 110 | + nbbm2PlateMap = rs; | ||
| 111 | + }); | ||
| 112 | + | ||
| 113 | + //模拟图属性数据 | ||
| 114 | + gb_common.$get('/freeLogin/realSchedule/svgAttr', {idx: line_idx}, function (rs) { | ||
| 115 | + var data = {}; | ||
| 116 | + $.each(rs.list, function () { | ||
| 117 | + this.hideStations = JSON.parse(this.hideStations); | ||
| 118 | + this.nicknames = JSON.parse(this.nicknames); | ||
| 119 | + data[this.lineCode] = this; | ||
| 120 | + }); | ||
| 121 | + ep.emit('svg_attrs', data); | ||
| 122 | + }); | ||
| 123 | + | ||
| 124 | + //站点和停车场历时、公里对照数据 | ||
| 125 | + var stat_park_data; | ||
| 126 | + /*var load_stat_park_data = function () { | ||
| 127 | + $.get('/basic/station2ParkData?t='+Math.random(), {idx: line_idx}, function (rs) { | ||
| 128 | + stat_park_data = rs; | ||
| 129 | + }); | ||
| 130 | + } | ||
| 131 | + load_stat_park_data();*/ | ||
| 132 | + | ||
| 133 | + function findLineByCodes(codeArr) { | ||
| 134 | + var rs = []; | ||
| 135 | + $.each(codeArr, function () { | ||
| 136 | + rs.push(codeToLine[this]); | ||
| 137 | + }); | ||
| 138 | + return rs; | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + var findCodeByLinename = function (name) { | ||
| 142 | + for (var code in lineCode2NameAll) { | ||
| 143 | + if (name == lineCode2NameAll[code]) | ||
| 144 | + return code; | ||
| 145 | + } | ||
| 146 | + | ||
| 147 | + return null; | ||
| 148 | + }; | ||
| 149 | + | ||
| 150 | + var getLineInformation = function (lineCode) { | ||
| 151 | + return lineInformations[lineCode]; | ||
| 152 | + }; | ||
| 153 | + | ||
| 154 | + var stationRouteSort = function (a, b) { | ||
| 155 | + return a.stationRouteCode - b.stationRouteCode; | ||
| 156 | + }; | ||
| 157 | + | ||
| 158 | + /** | ||
| 159 | + * 常用的备注补全列表 | ||
| 160 | + */ | ||
| 161 | + var remarksArray = ['保养', '故障', '肇事', '加油', '维修', '援外', '路阻' | ||
| 162 | + , '故障(离合器坏)', '故障,(方向盘坏)', '故障(排挡坏)', '故障(门坏)', '故障(雨刮器坏)','故障(刹车坏)', '故障(气打不上)' | ||
| 163 | + ,'故障(整车无电)', '故障(故障灯常亮)', '故障(警报灯亮)', '故障(玻璃坏)', '故障(反光镜坏)', '故障(发电机坏)', '故障(漏防冻液)' | ||
| 164 | + , '故障(漏水)','故障(轮胎坏)', '故障(无动力)', '故障(喷机油)', '故障(水温高)', '保养(一级保养)' | ||
| 165 | + , '保养(二级保养)', '保养(三级保养)', '换车出场', '临加进场', '临加出场']; | ||
| 166 | + var remarksMapps = []; | ||
| 167 | + $.each(remarksArray, function (i, t) { | ||
| 168 | + remarksMapps.push({ | ||
| 169 | + value: t, | ||
| 170 | + fullChars: pinyin.getFullChars(t).toUpperCase(), | ||
| 171 | + camelChars: pinyin.getCamelChars(t) | ||
| 172 | + }); | ||
| 173 | + }); | ||
| 174 | + | ||
| 175 | + //文件载入完毕 | ||
| 176 | + res_load_ep.emitLater('load_data_basic'); | ||
| 177 | + | ||
| 178 | + return { | ||
| 179 | + activeLines: activeLines, | ||
| 180 | + line_idx: line_idx, | ||
| 181 | + codeToLine: codeToLine, | ||
| 182 | + nbbm2deviceMap: function () { | ||
| 183 | + return nbbm2deviceMap; | ||
| 184 | + }, | ||
| 185 | + device2nbbmMap: function () { | ||
| 186 | + return device2nbbmMap; | ||
| 187 | + }, | ||
| 188 | + getLineInformation: getLineInformation, | ||
| 189 | + allInformations: function () { | ||
| 190 | + return lineInformations; | ||
| 191 | + }, | ||
| 192 | + stationRoutes: function (lineCode) { | ||
| 193 | + return stationRoutes[lineCode] | ||
| 194 | + }, | ||
| 195 | + findLineByCodes: findLineByCodes, | ||
| 196 | + lineCode2NameAll: function () { | ||
| 197 | + return lineCode2NameAll | ||
| 198 | + }, | ||
| 199 | + allPersonnel: function () { | ||
| 200 | + return allPersonnel; | ||
| 201 | + }, | ||
| 202 | + findCodeByLinename: findCodeByLinename, | ||
| 203 | + getCarparkByCode: getCarparkByCode, | ||
| 204 | + getSvgAttr: function (lineCode) { | ||
| 205 | + return svgAttrs[lineCode]; | ||
| 206 | + }, | ||
| 207 | + setSvgAttr: function (attr) { | ||
| 208 | + attr.hideStations = JSON.parse(attr.hideStations); | ||
| 209 | + attr.nicknames = JSON.parse(attr.nicknames); | ||
| 210 | + svgAttrs[attr.lineCode] = attr; | ||
| 211 | + }, | ||
| 212 | + //是否是环线 | ||
| 213 | + isLoopLine: function (lineCode) { | ||
| 214 | + var data = gb_common.groupBy(stationRoutes[lineCode], 'directions'); | ||
| 215 | + //下行只有2个站点 | ||
| 216 | + var len = data[0].length; | ||
| 217 | + if (len > 0 && data[1].length == 2) { | ||
| 218 | + var first = data[0][0], | ||
| 219 | + end = data[0][len - 1]; | ||
| 220 | + | ||
| 221 | + /*if(first.stationName != end.stationName) | ||
| 222 | + return false;*/ | ||
| 223 | + | ||
| 224 | + var fPoint = {latitude: first.station.gLaty, longitude: first.station.gLonx} | ||
| 225 | + , ePoint = {latitude: end.station.gLaty, longitude: end.station.gLonx}; | ||
| 226 | + | ||
| 227 | + //并且上行起终点距离200米内 | ||
| 228 | + if (geolib.getDistance(fPoint, ePoint) < 200) { | ||
| 229 | + return true; | ||
| 230 | + } | ||
| 231 | + } | ||
| 232 | + | ||
| 233 | + return false; | ||
| 234 | + }, | ||
| 235 | + //刷新员工信息 | ||
| 236 | + refreshAllPersonnel: function (cb) { | ||
| 237 | + loadAllPersonnel(function (data) { | ||
| 238 | + allPersonnel = data; | ||
| 239 | + cb && cb(); | ||
| 240 | + }); | ||
| 241 | + }, | ||
| 242 | + nbbm2PlateMap: function () { | ||
| 243 | + return nbbm2PlateMap; | ||
| 244 | + }, | ||
| 245 | + carsArray: function () { | ||
| 246 | + return carsArray; | ||
| 247 | + }, | ||
| 248 | + simpleParksArray: function () { | ||
| 249 | + var map = {}; | ||
| 250 | + for(var code in carparks) | ||
| 251 | + map[code] = carparks[code].parkName; | ||
| 252 | + return map; | ||
| 253 | + }, | ||
| 254 | + remarksMapps: function () { | ||
| 255 | + return remarksMapps; | ||
| 256 | + }, | ||
| 257 | + get_stat_park_data: function () { | ||
| 258 | + return stat_park_data; | ||
| 259 | + }, | ||
| 260 | + reload_stat_park_data: function () { | ||
| 261 | + load_stat_park_data(); | ||
| 262 | + } | ||
| 263 | + }; | ||
| 264 | +})(); |
src/main/resources/static/real_control_v3/alone_page/home/alone_data_gps.js
0 → 100644
| 1 | +/* gps 数据管理模块 */ | ||
| 2 | + | ||
| 3 | +var gb_data_gps = (function () { | ||
| 4 | + | ||
| 5 | + //fixed time refresh delay | ||
| 6 | + var delay = 1000 * 7; | ||
| 7 | + //deviceId ——> gps | ||
| 8 | + var realData = {}; | ||
| 9 | + //refresh after callback | ||
| 10 | + var refreshEventCallbacks = []; | ||
| 11 | + //register callback function | ||
| 12 | + var registerCallback = function (cb) { | ||
| 13 | + if (cb) | ||
| 14 | + refreshEventCallbacks.push(cb); | ||
| 15 | + }; | ||
| 16 | + | ||
| 17 | + var refresh = function (cb) { | ||
| 18 | + $.ajax({ | ||
| 19 | + url: '/freeLogin/gps/real/line', | ||
| 20 | + data: {lineCodes: gb_data_basic.line_idx}, | ||
| 21 | + dataType: 'json', | ||
| 22 | + success: function (rs) { | ||
| 23 | + //用定时的gps来检测session断开 | ||
| 24 | + if(rs.status && rs.status==407){ | ||
| 25 | + location.href = '/login.html'; | ||
| 26 | + return; | ||
| 27 | + } | ||
| 28 | + refreshData(rs); | ||
| 29 | + cb(); | ||
| 30 | + }, | ||
| 31 | + error: function (xr, t) { | ||
| 32 | + notify_err('刷新GPS失败,稍后重试' + t); | ||
| 33 | + cb(); | ||
| 34 | + } | ||
| 35 | + }); | ||
| 36 | + }; | ||
| 37 | + | ||
| 38 | + var refreshData = function (rs) { | ||
| 39 | + var old, addArr = [], | ||
| 40 | + upArr = [], | ||
| 41 | + upDownChange = []; | ||
| 42 | + | ||
| 43 | + var schArray; | ||
| 44 | + $.each(rs.gpsList, function () { | ||
| 45 | + old = realData[this.deviceId]; | ||
| 46 | + if (old) { | ||
| 47 | + if (this.timestamp > old.timestamp) { | ||
| 48 | + if (old.upDown != this.upDown) | ||
| 49 | + upDownChange.push(this); | ||
| 50 | + else | ||
| 51 | + upArr.push(this); | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + } else | ||
| 55 | + addArr.push(this); | ||
| 56 | + | ||
| 57 | + //班次信息 | ||
| 58 | + /*if (this.schId) { | ||
| 59 | + schArray = gb_schedule_table.findScheduleByLine(this.lineId); | ||
| 60 | + if (schArray) | ||
| 61 | + this.sch = schArray[this.schId]; | ||
| 62 | + }*/ | ||
| 63 | + | ||
| 64 | + //时间格式化 | ||
| 65 | + this.dateStr = moment(this.timestamp).format('YYYY-MM-DD HH:mm:ss'); | ||
| 66 | + realData[this.deviceId] = this; | ||
| 67 | + }); | ||
| 68 | + | ||
| 69 | + //console.log('add array size: ' + addArr.length, 'up array size: ' + upArr.length); | ||
| 70 | + //CCCallFuncN | ||
| 71 | + $.each(refreshEventCallbacks, function (i, cb) { | ||
| 72 | + cb(addArr, upArr, upDownChange); | ||
| 73 | + }); | ||
| 74 | + | ||
| 75 | + }; | ||
| 76 | + | ||
| 77 | + var startFixedTime; | ||
| 78 | + var fixedTimeRefresh = function () { | ||
| 79 | + if (startFixedTime) | ||
| 80 | + return; | ||
| 81 | + startFixedTime = true; | ||
| 82 | + | ||
| 83 | + (function () { | ||
| 84 | + var f = arguments.callee; | ||
| 85 | + refresh(function () { | ||
| 86 | + setTimeout(f, delay); | ||
| 87 | + }); | ||
| 88 | + })(); | ||
| 89 | + }; | ||
| 90 | + | ||
| 91 | + var gpsByLineCode = function (lineCode) { | ||
| 92 | + var rs = []; | ||
| 93 | + for (var device in realData) { | ||
| 94 | + if (realData[device].lineId == lineCode) | ||
| 95 | + rs.push(realData[device]); | ||
| 96 | + } | ||
| 97 | + return rs; | ||
| 98 | + }; | ||
| 99 | + | ||
| 100 | + var findOne = function (deviceId) { | ||
| 101 | + return realData[deviceId]; | ||
| 102 | + }; | ||
| 103 | + | ||
| 104 | + var findGpsByNbbm = function (nbbm) { | ||
| 105 | + return realData[gb_data_basic.nbbm2deviceMap()[nbbm]]; | ||
| 106 | + }; | ||
| 107 | + | ||
| 108 | + /** | ||
| 109 | + * 设备掉线事件 | ||
| 110 | + */ | ||
| 111 | + var deviceOffline = function (gps) { | ||
| 112 | + $.each(offlineCallbacks, function (i, cb) { | ||
| 113 | + cb(gps); | ||
| 114 | + }); | ||
| 115 | + }; | ||
| 116 | + | ||
| 117 | + //注册掉线事件回调函数 | ||
| 118 | + var offlineCallbacks = []; | ||
| 119 | + var registerOfflineCb = function (cb) { | ||
| 120 | + if (cb) | ||
| 121 | + offlineCallbacks.push(cb); | ||
| 122 | + }; | ||
| 123 | + | ||
| 124 | + return { | ||
| 125 | + fixedTimeRefresh: fixedTimeRefresh, | ||
| 126 | + registerCallback: registerCallback, | ||
| 127 | + allGps: realData, | ||
| 128 | + gpsByLineCode: gpsByLineCode, | ||
| 129 | + findOne: findOne, | ||
| 130 | + findGpsByNbbm: findGpsByNbbm, | ||
| 131 | + deviceOffline: deviceOffline, | ||
| 132 | + registerOfflineCb: registerOfflineCb | ||
| 133 | + }; | ||
| 134 | +})(); |
src/main/resources/static/real_control_v3/alone_page/home/home_wrap.html
0 → 100644
| 1 | +<!DOCTYPE html> | ||
| 2 | +<html lang="zh-cn"> | ||
| 3 | + | ||
| 4 | +<head> | ||
| 5 | + <meta charset="UTF-8"> | ||
| 6 | + <title>主页模拟图</title> | ||
| 7 | + <!-- uikit core style--> | ||
| 8 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/css/uikit.gradient.min.css" /> | ||
| 9 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/notify.gradient.min.css" merge="plugins"/> | ||
| 10 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/tooltip.gradient.min.css" merge="plugins"/> | ||
| 11 | + <link rel="stylesheet" | ||
| 12 | + href="/real_control_v2/assets/plugins/uikit-2.27.1/components/autocomplete.gradient.min.css" merge="plugins"/> | ||
| 13 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/sticky.gradient.min.css" merge="plugins"/> | ||
| 14 | + | ||
| 15 | + <!-- main style --> | ||
| 16 | + <link rel="stylesheet" href="/real_control_v2/css/main.css" /> | ||
| 17 | + <!-- home style --> | ||
| 18 | + <link rel="stylesheet" href="/real_control_v2/css/home.css" merge="custom_style"/> | ||
| 19 | + | ||
| 20 | + <!-- custom table --> | ||
| 21 | + <link rel="stylesheet" href="/real_control_v2/css/ct_table.css" merge="custom_style"/> | ||
| 22 | + <!-- jquery contextMenu style --> | ||
| 23 | + <link rel="stylesheet" href="/real_control_v2/assets/css/jquery.contextMenu.min.css" merge="plugins"/> | ||
| 24 | + <!-- formvalidation style --> | ||
| 25 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/formvalidation/formValidation.min.css" merge="plugins"/> | ||
| 26 | + <!-- js tree --> | ||
| 27 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/jstree/default/style.css" merge="plugins"/> | ||
| 28 | + <!-- tooltip css--> | ||
| 29 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/qtip/jquery.qtip.min.css" merge="plugins"/> | ||
| 30 | + <link rel="stylesheet" href="/real_control_v2/css/pace.css" merge="plugins"/> | ||
| 31 | + | ||
| 32 | + <link rel="stylesheet" href="/real_control_v2/css/modal_extend.css" merge="custom_style"/> | ||
| 33 | + <!-- perfect-scrollbar style --> | ||
| 34 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" merge="plugins"/> | ||
| 35 | + <!-- layer 3.0.3 --> | ||
| 36 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/layer3.0.3/skin/default/layer.css" merge="plugins"/> | ||
| 37 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/layer3.0.3/skin/moon/style.css" merge="plugins"/> | ||
| 38 | + | ||
| 39 | + | ||
| 40 | + <style> | ||
| 41 | + .main-container{ | ||
| 42 | + height: 100% !important; | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + #main-tab-content{ | ||
| 46 | + padding: 0 !important; | ||
| 47 | + list-style: none; | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + .home-panel{ | ||
| 51 | + | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + #home-main-content{ | ||
| 55 | + padding: 0 !important; | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + #main-tab-content>.home-panel>#home-main-content{ | ||
| 59 | + overflow: inherit !important; | ||
| 60 | + } | ||
| 61 | + </style> | ||
| 62 | +</head> | ||
| 63 | + | ||
| 64 | +<body> | ||
| 65 | +<!--<div class="main-container" style="height: 100%;"> | ||
| 66 | +</div>--> | ||
| 67 | +<div class="main-container"> | ||
| 68 | + <ul id="main-tab-content"> | ||
| 69 | + <li class="home-panel"></li> | ||
| 70 | + </ul> | ||
| 71 | +</div> | ||
| 72 | + | ||
| 73 | + | ||
| 74 | +<!-- 地图相关 --> | ||
| 75 | +<script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"></script> | ||
| 76 | +<script src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js"></script> | ||
| 77 | +<script src="/assets/js/baidu//MarkerClusterer.js" merge="plugins"></script> | ||
| 78 | +<script src="/assets/js/TransGPS.js" merge="plugins"></script> | ||
| 79 | +<!-- jquery --> | ||
| 80 | +<script src="/real_control_v2/assets/js/jquery.min.js"></script> | ||
| 81 | +<!-- jquery actual --> | ||
| 82 | +<script src="/real_control_v2/assets/js/jquery.actual.min.js" merge="plugins"></script> | ||
| 83 | +<!-- jquery.serializejson JSON序列化插件 --> | ||
| 84 | +<script src="/assets/plugins/jquery.serializejson.js" merge="plugins"></script> | ||
| 85 | +<!-- moment.js 日期处理类库 --> | ||
| 86 | +<script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script> | ||
| 87 | +<script src="/real_control_v2/assets/plugins/moment/zh-cn.js"></script> | ||
| 88 | + | ||
| 89 | +<!-- flatpickr --> | ||
| 90 | +<script src="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.js" merge="plugins"></script> | ||
| 91 | +<script src="/real_control_v2/assets/plugins/flatpickr/l10n/zh.js" merge="plugins"></script> | ||
| 92 | + | ||
| 93 | +<!-- perfect-scrollbar --> | ||
| 94 | +<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" merge="plugins"></script> | ||
| 95 | +<!-- common js --> | ||
| 96 | +<script src="/real_control_v2/js/common.js"></script> | ||
| 97 | +<!-- art-template 模版引擎 --> | ||
| 98 | +<script src="/assets/plugins/template.js" merge="plugins"></script> | ||
| 99 | +<!-- d3 --> | ||
| 100 | +<script src="/assets/js/d3.min.js"></script> | ||
| 101 | +<!-- EventProxy --> | ||
| 102 | +<script src="/assets/js/eventproxy.js"></script> | ||
| 103 | +<!-- Geolib --> | ||
| 104 | +<script src="/real_control_v2/geolib/geolib.js" merge="plugins"></script> | ||
| 105 | + | ||
| 106 | +<script> | ||
| 107 | + | ||
| 108 | + | ||
| 109 | + var res_load_ep = EventProxy.create('load_home_layout', 'load_home_line_panel', 'load_data_basic', 'data-basic', function () { | ||
| 110 | + //加载主页 | ||
| 111 | + gb_home_layout.layout(function () { | ||
| 112 | + gb_home_line_panel.init(function () { | ||
| 113 | + //gps自刷新 | ||
| 114 | + gb_data_gps.fixedTimeRefresh(); | ||
| 115 | + | ||
| 116 | + $('.uk-icon-send-o.home_alone_page').remove(); | ||
| 117 | + }); | ||
| 118 | + }); | ||
| 119 | + }); | ||
| 120 | + | ||
| 121 | + function connectArr(arr, separator, transFun) { | ||
| 122 | + var rs = ''; | ||
| 123 | + $.each(arr, function (i, item) { | ||
| 124 | + if (transFun) | ||
| 125 | + item = transFun(item); | ||
| 126 | + rs += (separator + item); | ||
| 127 | + }); | ||
| 128 | + return rs.substr(separator.length); | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + var isArray = function (obj) { | ||
| 132 | + return Object.prototype.toString.call(obj) === '[object Array]'; | ||
| 133 | + }; | ||
| 134 | + | ||
| 135 | + var gb_form_validation_opts = { | ||
| 136 | + framework: 'uikit', | ||
| 137 | + locale: 'zh_CN', | ||
| 138 | + icon: { | ||
| 139 | + valid: 'uk-icon-check', | ||
| 140 | + invalid: 'uk-icon-times', | ||
| 141 | + validating: 'uk-icon-refresh' | ||
| 142 | + } | ||
| 143 | + }; | ||
| 144 | + | ||
| 145 | +</script> | ||
| 146 | + | ||
| 147 | +<!-- uikit core --> | ||
| 148 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/uikit.min.js" merge="uikit_js"></script> | ||
| 149 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/notify.min.js" merge="uikit_js"></script> | ||
| 150 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/pagination.min.js" merge="uikit_js"></script> | ||
| 151 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/tooltip.min.js" merge="uikit_js"></script> | ||
| 152 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/sticky.min.js" merge="uikit_js"></script> | ||
| 153 | + | ||
| 154 | + | ||
| 155 | +<!-- jquery contextMenu --> | ||
| 156 | +<script src="/real_control_v2/assets/js/jquery.contextMenu.min.js" merge="plugins"></script> | ||
| 157 | +<script src="/real_control_v2/assets/js/jquery.ui.position.min.js" merge="plugins"></script> | ||
| 158 | +<!-- formvalidation- --> | ||
| 159 | +<script src="/real_control_v2/assets/plugins/formvalidation/formValidation.min.js" merge="plugins"></script> | ||
| 160 | +<script src="/real_control_v2/assets/plugins/formvalidation/zh_CN.js" merge="plugins"></script> | ||
| 161 | +<script src="/real_control_v2/assets/plugins/formvalidation/uikit.min.js" merge="plugins"></script> | ||
| 162 | +<!-- js tree --> | ||
| 163 | +<script src="/real_control_v2/assets/plugins/jstree/jstree.min.js" merge="plugins"></script> | ||
| 164 | +<!-- simple pinyin --> | ||
| 165 | +<script src="/assets/plugins/pinyin.js" merge="plugins"></script> | ||
| 166 | +<!-- qtip --> | ||
| 167 | +<script src="/real_control_v2/assets/plugins/qtip/jquery.qtip.min.js" merge="plugins"></script> | ||
| 168 | +<!-- layer 3.0.3 --> | ||
| 169 | +<script src="/real_control_v2/assets/plugins/layer3.0.3/layer.js" merge="plugins"></script> | ||
| 170 | + | ||
| 171 | +<!-- 数据 --> | ||
| 172 | +<script src="/real_control_v3/alone_page/home/alone_data_basic.js" merge="custom_js"></script> | ||
| 173 | +<script src="/real_control_v3/alone_page/home/alone_data_gps.js" merge="custom_js"></script> | ||
| 174 | +<script src="/real_control_v3/js/data/gps_abnormal.js" merge="custom_js"></script> | ||
| 175 | +<!-- 线路模拟图 --> | ||
| 176 | +<script src="/real_control_v2/js/utils/svg_chart.js" merge="custom_js"></script> | ||
| 177 | +<script src="/real_control_v2/js/utils/svg_data_convert.js" merge="custom_js"></script> | ||
| 178 | +<script src="/real_control_v2/js/utils/svg_chart_tooltip.js" merge="custom_js"></script> | ||
| 179 | +<script src="/real_control_v2/js/utils/svg_chart_map.js" merge="custom_js"></script> | ||
| 180 | + | ||
| 181 | +<!-- custom table js --> | ||
| 182 | +<script src="/real_control_v2/js/utils/ct_table.js" merge="custom_js"></script> | ||
| 183 | +<!-- home js --> | ||
| 184 | +<script src="/real_control_v3/js/home/layout.js" merge="custom_js"></script> | ||
| 185 | +<script src="/real_control_v2/js/home/line_panel.js" merge="custom_js"></script> | ||
| 186 | +<!--<script src="/real_control_v2/js/home/context_menu.js" merge="custom_js"></script>--> | ||
| 187 | + | ||
| 188 | + | ||
| 189 | +<!-- 模态框扩展 --> | ||
| 190 | +<script src="/real_control_v/js/modal_extend.js" merge="custom_js"></script> | ||
| 191 | + | ||
| 192 | +</body> | ||
| 193 | + | ||
| 194 | +</html> |
src/main/resources/static/real_control_v3/alone_page/map/alone_data_basic.js
0 → 100644
| 1 | +/* 基础数据管理模块 */ | ||
| 2 | + | ||
| 3 | +var gb_data_basic = (function () { | ||
| 4 | + | ||
| 5 | + var stationRoutes, lineCode2NameAll, lineInformations, nbbm2deviceMap, device2nbbmMap, allPersonnel, svgAttrs; | ||
| 6 | + var ep = EventProxy.create("stationRoutes", "lineCode2Name", "lineInformations", "nbbm2deviceId", "all_personnel", "svg_attrs" | ||
| 7 | + , function (routes, code2Name, informations, nbbm2device, all_personnel, svgAttrMap) { | ||
| 8 | + stationRoutes = routes; | ||
| 9 | + lineCode2NameAll = code2Name; | ||
| 10 | + lineInformations = informations; | ||
| 11 | + nbbm2deviceMap = nbbm2device; | ||
| 12 | + device2nbbmMap = gb_common.inverse(nbbm2deviceMap); | ||
| 13 | + allPersonnel = all_personnel; | ||
| 14 | + svgAttrs = svgAttrMap; | ||
| 15 | + | ||
| 16 | + res_load_ep.emitLater('data-basic'); | ||
| 17 | + }); | ||
| 18 | + | ||
| 19 | + var storage = window.localStorage; | ||
| 20 | + //激活的线路 | ||
| 21 | + var activeLines = JSON.parse(storage.getItem('lineControlItems')); | ||
| 22 | + //lineCode to line object | ||
| 23 | + var codeToLine = {}; | ||
| 24 | + //lineCode idx string | ||
| 25 | + var line_idx = (function () { | ||
| 26 | + var str = ''; | ||
| 27 | + for (var i = 0, item; item = activeLines[i++];) { | ||
| 28 | + str += (',' + item.lineCode); | ||
| 29 | + codeToLine[item.lineCode] = item; | ||
| 30 | + } | ||
| 31 | + return str.substr(1); | ||
| 32 | + })(); | ||
| 33 | + | ||
| 34 | + //站点路由 | ||
| 35 | + gb_common.$get('/stationroute/multiLine', {lineIds: line_idx}, function (rs) { | ||
| 36 | + var list = rs.list;//JSON.parse(rs.list); | ||
| 37 | + var routeData = gb_common.groupBy(list, 'lineCode'); | ||
| 38 | + //排序 | ||
| 39 | + for (var lineCode in routeData) { | ||
| 40 | + routeData[lineCode].sort(stationRouteSort); | ||
| 41 | + } | ||
| 42 | + ep.emit('stationRoutes', routeData); | ||
| 43 | + }); | ||
| 44 | + | ||
| 45 | + //线路标准信息 | ||
| 46 | + gb_common.$get('/freeLogin/lineInformation/line/multi', {lineCodes: line_idx}, function (rs) { | ||
| 47 | + var informations = {}; | ||
| 48 | + $.each(rs, function () { | ||
| 49 | + informations[this.line.lineCode] = this; | ||
| 50 | + delete this['line']; | ||
| 51 | + }); | ||
| 52 | + ep.emit('lineInformations', informations); | ||
| 53 | + }); | ||
| 54 | + | ||
| 55 | + //人员信息 | ||
| 56 | + loadAllPersonnel(function (data) { | ||
| 57 | + ep.emit('all_personnel', data); | ||
| 58 | + }); | ||
| 59 | + function loadAllPersonnel(cb) { | ||
| 60 | + $.get('/freeLogin/basic/all_personnel_py', function (rs) { | ||
| 61 | + //转换成自动补全组件需要的数据 | ||
| 62 | + var data = [], code; | ||
| 63 | + for(var i =0, p; p = rs[i++];){ | ||
| 64 | + code = p['workId'].indexOf('-')!=-1?p['workId'].split('-')[1]:p['workId']; | ||
| 65 | + data.push({ | ||
| 66 | + value: code + '/' + p.name, | ||
| 67 | + fullChars: p.fullChars.toUpperCase(), | ||
| 68 | + camelChars: p.camelChars.toUpperCase() | ||
| 69 | + }); | ||
| 70 | + } | ||
| 71 | + cb && cb(data); | ||
| 72 | + }); | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + var carparks = {}; | ||
| 76 | + //停车场数据 | ||
| 77 | + gb_common.$get('/freeLogin/realMap/carParkSpatialData', {}, function (rs) { | ||
| 78 | + rs.list.sort(function (a, b) { | ||
| 79 | + return a.parkName.localeCompare(b.parkName); | ||
| 80 | + }); | ||
| 81 | + $.each(rs.list, function () { | ||
| 82 | + carparks[this.parkCode] = this; | ||
| 83 | + }); | ||
| 84 | + }); | ||
| 85 | + | ||
| 86 | + //车辆数据 | ||
| 87 | + var carsArray; | ||
| 88 | + $.get('/freeLogin/basic/cars?t=' + Math.random(), function (rs) { | ||
| 89 | + carsArray = rs; | ||
| 90 | + }); | ||
| 91 | + | ||
| 92 | + var getCarparkByCode = function (code) { | ||
| 93 | + return carparks[code]; | ||
| 94 | + }; | ||
| 95 | + | ||
| 96 | + //line code to name | ||
| 97 | + $.get('/freeLogin/basic/lineCode2Name', function (rs) { | ||
| 98 | + ep.emit('lineCode2Name', rs); | ||
| 99 | + }); | ||
| 100 | + | ||
| 101 | + //nbbm to device id | ||
| 102 | + $.get('/freeLogin/basic/nbbm2deviceId', function (rs) { | ||
| 103 | + ep.emit('nbbm2deviceId', rs); | ||
| 104 | + }); | ||
| 105 | + //nbbm to 车牌号 | ||
| 106 | + var nbbm2PlateMap; | ||
| 107 | + $.get('/freeLogin/basic/nbbm2PlateNo', function (rs) { | ||
| 108 | + nbbm2PlateMap = rs; | ||
| 109 | + }); | ||
| 110 | + | ||
| 111 | + //模拟图属性数据 | ||
| 112 | + gb_common.$get('/freeLogin/realSchedule/svgAttr', {idx: line_idx}, function (rs) { | ||
| 113 | + var data = {}; | ||
| 114 | + $.each(rs.list, function () { | ||
| 115 | + this.hideStations = JSON.parse(this.hideStations); | ||
| 116 | + this.nicknames = JSON.parse(this.nicknames); | ||
| 117 | + data[this.lineCode] = this; | ||
| 118 | + }); | ||
| 119 | + ep.emit('svg_attrs', data); | ||
| 120 | + }); | ||
| 121 | + | ||
| 122 | + //站点和停车场历时、公里对照数据 | ||
| 123 | + var stat_park_data; | ||
| 124 | + var load_stat_park_data = function () { | ||
| 125 | + $.get('/freeLogin/basic/station2ParkData?t='+Math.random(), {idx: line_idx}, function (rs) { | ||
| 126 | + stat_park_data = rs; | ||
| 127 | + }); | ||
| 128 | + } | ||
| 129 | + load_stat_park_data(); | ||
| 130 | + | ||
| 131 | + function findLineByCodes(codeArr) { | ||
| 132 | + var rs = []; | ||
| 133 | + $.each(codeArr, function () { | ||
| 134 | + rs.push(codeToLine[this]); | ||
| 135 | + }); | ||
| 136 | + return rs; | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | + var findCodeByLinename = function (name) { | ||
| 140 | + for (var code in lineCode2NameAll) { | ||
| 141 | + if (name == lineCode2NameAll[code]) | ||
| 142 | + return code; | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + return null; | ||
| 146 | + }; | ||
| 147 | + | ||
| 148 | + var getLineInformation = function (lineCode) { | ||
| 149 | + return lineInformations[lineCode]; | ||
| 150 | + }; | ||
| 151 | + | ||
| 152 | + var stationRouteSort = function (a, b) { | ||
| 153 | + return a.stationRouteCode - b.stationRouteCode; | ||
| 154 | + }; | ||
| 155 | + | ||
| 156 | + return { | ||
| 157 | + activeLines: activeLines, | ||
| 158 | + line_idx: line_idx, | ||
| 159 | + codeToLine: codeToLine, | ||
| 160 | + nbbm2deviceMap: function () { | ||
| 161 | + return nbbm2deviceMap; | ||
| 162 | + }, | ||
| 163 | + device2nbbmMap: function () { | ||
| 164 | + return device2nbbmMap; | ||
| 165 | + }, | ||
| 166 | + getLineInformation: getLineInformation, | ||
| 167 | + allInformations: function () { | ||
| 168 | + return lineInformations; | ||
| 169 | + }, | ||
| 170 | + stationRoutes: function (lineCode) { | ||
| 171 | + return stationRoutes[lineCode] | ||
| 172 | + }, | ||
| 173 | + findLineByCodes: findLineByCodes, | ||
| 174 | + lineCode2NameAll: function () { | ||
| 175 | + return lineCode2NameAll | ||
| 176 | + }, | ||
| 177 | + allPersonnel: function () { | ||
| 178 | + return allPersonnel; | ||
| 179 | + }, | ||
| 180 | + findCodeByLinename: findCodeByLinename, | ||
| 181 | + getCarparkByCode: getCarparkByCode, | ||
| 182 | + getSvgAttr: function (lineCode) { | ||
| 183 | + return svgAttrs[lineCode]; | ||
| 184 | + }, | ||
| 185 | + setSvgAttr: function (attr) { | ||
| 186 | + attr.hideStations = JSON.parse(attr.hideStations); | ||
| 187 | + attr.nicknames = JSON.parse(attr.nicknames); | ||
| 188 | + svgAttrs[attr.lineCode] = attr; | ||
| 189 | + }, | ||
| 190 | + //是否是环线 | ||
| 191 | + isLoopLine: function (lineCode) { | ||
| 192 | + var data = gb_common.groupBy(stationRoutes[lineCode], 'directions'); | ||
| 193 | + //下行只有2个站点 | ||
| 194 | + var len = data[0].length; | ||
| 195 | + if (len > 0 && data[1].length == 2) { | ||
| 196 | + var first = data[0][0], | ||
| 197 | + end = data[0][len - 1]; | ||
| 198 | + | ||
| 199 | + /*if(first.stationName != end.stationName) | ||
| 200 | + return false;*/ | ||
| 201 | + | ||
| 202 | + var fPoint = {latitude: first.station.gLaty, longitude: first.station.gLonx} | ||
| 203 | + , ePoint = {latitude: end.station.gLaty, longitude: end.station.gLonx}; | ||
| 204 | + | ||
| 205 | + //并且上行起终点距离200米内 | ||
| 206 | + if (geolib.getDistance(fPoint, ePoint) < 200) { | ||
| 207 | + return true; | ||
| 208 | + } | ||
| 209 | + } | ||
| 210 | + | ||
| 211 | + return false; | ||
| 212 | + }, | ||
| 213 | + //刷新员工信息 | ||
| 214 | + refreshAllPersonnel: function (cb) { | ||
| 215 | + loadAllPersonnel(function (data) { | ||
| 216 | + allPersonnel = data; | ||
| 217 | + cb && cb(); | ||
| 218 | + }); | ||
| 219 | + }, | ||
| 220 | + nbbm2PlateMap: function () { | ||
| 221 | + return nbbm2PlateMap; | ||
| 222 | + }, | ||
| 223 | + carsArray: function () { | ||
| 224 | + return carsArray; | ||
| 225 | + }, | ||
| 226 | + simpleParksArray: function () { | ||
| 227 | + var map = {}; | ||
| 228 | + for(var code in carparks) | ||
| 229 | + map[code] = carparks[code].parkName; | ||
| 230 | + return map; | ||
| 231 | + }, | ||
| 232 | + remarksMapps: function () { | ||
| 233 | + return remarksMapps; | ||
| 234 | + }, | ||
| 235 | + get_stat_park_data: function () { | ||
| 236 | + return stat_park_data; | ||
| 237 | + }, | ||
| 238 | + reload_stat_park_data: function () { | ||
| 239 | + load_stat_park_data(); | ||
| 240 | + } | ||
| 241 | + }; | ||
| 242 | +})(); |
src/main/resources/static/real_control_v3/alone_page/map/alone_data_gps.js
0 → 100644
| 1 | +/* gps 数据管理模块 */ | ||
| 2 | + | ||
| 3 | +var gb_data_gps = (function () { | ||
| 4 | + | ||
| 5 | + //fixed time refresh delay | ||
| 6 | + var delay = 1000 * 7; | ||
| 7 | + //deviceId ——> gps | ||
| 8 | + var realData = {}; | ||
| 9 | + //refresh after callback | ||
| 10 | + var refreshEventCallbacks = []; | ||
| 11 | + //register callback function | ||
| 12 | + var registerCallback = function (cb) { | ||
| 13 | + if (cb) | ||
| 14 | + refreshEventCallbacks.push(cb); | ||
| 15 | + }; | ||
| 16 | + | ||
| 17 | + var refresh = function (cb) { | ||
| 18 | + $.ajax({ | ||
| 19 | + url: '/freeLogin/gps/real/line', | ||
| 20 | + data: {lineCodes: gb_data_basic.line_idx}, | ||
| 21 | + dataType: 'json', | ||
| 22 | + success: function (rs) { | ||
| 23 | + //用定时的gps来检测session断开 | ||
| 24 | + if(rs.status && rs.status==407){ | ||
| 25 | + location.href = '/login.html'; | ||
| 26 | + return; | ||
| 27 | + } | ||
| 28 | + refreshData(rs); | ||
| 29 | + cb(); | ||
| 30 | + }, | ||
| 31 | + error: function (xr, t) { | ||
| 32 | + notify_err('刷新GPS失败,稍后重试' + t); | ||
| 33 | + cb(); | ||
| 34 | + } | ||
| 35 | + }); | ||
| 36 | + }; | ||
| 37 | + | ||
| 38 | + var refreshData = function (rs) { | ||
| 39 | + var old, addArr = [], | ||
| 40 | + upArr = [], | ||
| 41 | + upDownChange = []; | ||
| 42 | + | ||
| 43 | + var schArray; | ||
| 44 | + $.each(rs.gpsList, function () { | ||
| 45 | + old = realData[this.deviceId]; | ||
| 46 | + if (old) { | ||
| 47 | + if (this.timestamp > old.timestamp) { | ||
| 48 | + if (old.upDown != this.upDown) | ||
| 49 | + upDownChange.push(this); | ||
| 50 | + else | ||
| 51 | + upArr.push(this); | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + } else | ||
| 55 | + addArr.push(this); | ||
| 56 | + | ||
| 57 | + //班次信息 | ||
| 58 | + /*if (this.schId) { | ||
| 59 | + //schArray = gb_schedule_table.findScheduleByLine(this.lineId); | ||
| 60 | + ///if (schArray) | ||
| 61 | + // this.sch = schArray[this.schId]; | ||
| 62 | + }*/ | ||
| 63 | + | ||
| 64 | + //时间格式化 | ||
| 65 | + this.dateStr = moment(this.timestamp).format('YYYY-MM-DD HH:mm:ss'); | ||
| 66 | + realData[this.deviceId] = this; | ||
| 67 | + }); | ||
| 68 | + | ||
| 69 | + //console.log('add array size: ' + addArr.length, 'up array size: ' + upArr.length); | ||
| 70 | + //CCCallFuncN | ||
| 71 | + $.each(refreshEventCallbacks, function (i, cb) { | ||
| 72 | + cb(addArr, upArr, upDownChange, rs.overspeedList); | ||
| 73 | + }); | ||
| 74 | + | ||
| 75 | + //超速数据回调 | ||
| 76 | + //console.log('超速,,,', rs.overspeedList); | ||
| 77 | + | ||
| 78 | + }; | ||
| 79 | + | ||
| 80 | + var startFixedTime; | ||
| 81 | + var fixedTimeRefresh = function () { | ||
| 82 | + if (startFixedTime) | ||
| 83 | + return; | ||
| 84 | + startFixedTime = true; | ||
| 85 | + | ||
| 86 | + (function () { | ||
| 87 | + var f = arguments.callee; | ||
| 88 | + refresh(function () { | ||
| 89 | + setTimeout(f, delay); | ||
| 90 | + }); | ||
| 91 | + })(); | ||
| 92 | + }; | ||
| 93 | + | ||
| 94 | + var gpsByLineCode = function (lineCode) { | ||
| 95 | + var rs = []; | ||
| 96 | + for (var device in realData) { | ||
| 97 | + if (realData[device].lineId == lineCode) | ||
| 98 | + rs.push(realData[device]); | ||
| 99 | + } | ||
| 100 | + return rs; | ||
| 101 | + }; | ||
| 102 | + | ||
| 103 | + var findOne = function (deviceId) { | ||
| 104 | + return realData[deviceId]; | ||
| 105 | + }; | ||
| 106 | + | ||
| 107 | + var findGpsByNbbm = function (nbbm) { | ||
| 108 | + return realData[gb_data_basic.nbbm2deviceMap()[nbbm]]; | ||
| 109 | + }; | ||
| 110 | + | ||
| 111 | + /** | ||
| 112 | + * 设备掉线事件 | ||
| 113 | + */ | ||
| 114 | + var deviceOffline = function (gps) { | ||
| 115 | + $.each(offlineCallbacks, function (i, cb) { | ||
| 116 | + cb(gps); | ||
| 117 | + }); | ||
| 118 | + }; | ||
| 119 | + | ||
| 120 | + //注册掉线事件回调函数 | ||
| 121 | + var offlineCallbacks = []; | ||
| 122 | + var registerOfflineCb = function (cb) { | ||
| 123 | + if (cb) | ||
| 124 | + offlineCallbacks.push(cb); | ||
| 125 | + }; | ||
| 126 | + | ||
| 127 | + return { | ||
| 128 | + fixedTimeRefresh: fixedTimeRefresh, | ||
| 129 | + registerCallback: registerCallback, | ||
| 130 | + allGps: realData, | ||
| 131 | + gpsByLineCode: gpsByLineCode, | ||
| 132 | + findOne: findOne, | ||
| 133 | + findGpsByNbbm: findGpsByNbbm, | ||
| 134 | + deviceOffline: deviceOffline, | ||
| 135 | + registerOfflineCb: registerOfflineCb | ||
| 136 | + }; | ||
| 137 | +})(); |
src/main/resources/static/real_control_v3/alone_page/map/alone_wrap.html
0 → 100644
| 1 | +<!DOCTYPE html> | ||
| 2 | +<html lang="zh-cn"> | ||
| 3 | + | ||
| 4 | +<head> | ||
| 5 | + <meta charset="UTF-8"> | ||
| 6 | + <title>地图监控 v2.0</title> | ||
| 7 | + <!-- uikit core style--> | ||
| 8 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/css/uikit.gradient.min.css"/> | ||
| 9 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/notify.gradient.min.css" | ||
| 10 | + merge="plugins"/> | ||
| 11 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/tooltip.gradient.min.css" | ||
| 12 | + merge="plugins"/> | ||
| 13 | + <link rel="stylesheet" | ||
| 14 | + href="/real_control_v2/assets/plugins/uikit-2.27.1/components/autocomplete.gradient.min.css" merge="plugins"/> | ||
| 15 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/accordion.gradient.min.css" | ||
| 16 | + merge="plugins"/> | ||
| 17 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/slidenav.gradient.min.css" | ||
| 18 | + merge="plugins"/> | ||
| 19 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/sticky.gradient.min.css" | ||
| 20 | + merge="plugins"/> | ||
| 21 | + | ||
| 22 | + <!-- main style --> | ||
| 23 | + <link rel="stylesheet" href="/real_control_v2/css/main.css"/> | ||
| 24 | + <!-- north style --> | ||
| 25 | + <link rel="stylesheet" href="/real_control_v2/css/north.css" merge="custom_style"/> | ||
| 26 | + <!-- home style --> | ||
| 27 | + <link rel="stylesheet" href="/real_control_v2/css/home.css" merge="custom_style"/> | ||
| 28 | + | ||
| 29 | + <!-- js tree --> | ||
| 30 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/jstree/default/style.css" merge="plugins"/> | ||
| 31 | + | ||
| 32 | + <link rel="stylesheet" href="/real_control_v2/css/modal_extend.css" merge="custom_style"/> | ||
| 33 | + <!-- perfect-scrollbar style --> | ||
| 34 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" | ||
| 35 | + merge="plugins"/> | ||
| 36 | + <!-- layer 3.0.3 --> | ||
| 37 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/layer3.0.3/skin/default/layer.css" merge="plugins"/> | ||
| 38 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/layer3.0.3/skin/moon/style.css" merge="plugins"/> | ||
| 39 | + | ||
| 40 | + <!-- flatpickr --> | ||
| 41 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.css" merge="plugins"/> | ||
| 42 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/flatpickr/themes/airbnb.css" merge="plugins"/> | ||
| 43 | + | ||
| 44 | + <link rel="stylesheet" href="/real_control_v2/css/ct_table.css" merge="custom_style"/> | ||
| 45 | + | ||
| 46 | + <style> | ||
| 47 | + .main-container .map-panel{ | ||
| 48 | + position: absolute; | ||
| 49 | + top:0; | ||
| 50 | + left: 0; | ||
| 51 | + width: 20px; | ||
| 52 | + z-index: 999; | ||
| 53 | + height: 20px; | ||
| 54 | + } | ||
| 55 | + </style> | ||
| 56 | +</head> | ||
| 57 | + | ||
| 58 | +<body> | ||
| 59 | +<div class="main-container" style="height: 100%;"> | ||
| 60 | + <span style="position: absolute;left: calc(50% - 35px);top: calc(45% - 35px);">加载中...</span> | ||
| 61 | +</div> | ||
| 62 | +<!-- 地图相关 --> | ||
| 63 | +<script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"></script> | ||
| 64 | +<script src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js"></script> | ||
| 65 | +<script src="/assets/js/baidu//MarkerClusterer.js" merge="plugins"></script> | ||
| 66 | +<script src="/assets/js/TransGPS.js" merge="plugins"></script> | ||
| 67 | +<!-- 高德 --> | ||
| 68 | +<script src="http://webapi.amap.com/maps?v=1.3&key=16cb1c5043847e09ef9edafdd77befda"></script> | ||
| 69 | +<!-- jquery --> | ||
| 70 | +<script src="/real_control_v2/assets/js/jquery.min.js"></script> | ||
| 71 | +<!-- jquery actual --> | ||
| 72 | +<script src="/real_control_v2/assets/js/jquery.actual.min.js" merge="plugins"></script> | ||
| 73 | +<!-- moment.js 日期处理类库 --> | ||
| 74 | +<script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script> | ||
| 75 | +<script src="/real_control_v2/assets/plugins/moment/zh-cn.js"></script> | ||
| 76 | + | ||
| 77 | +<!-- flatpickr --> | ||
| 78 | +<script src="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.js" merge="plugins"></script> | ||
| 79 | +<script src="/real_control_v2/assets/plugins/flatpickr/l10n/zh.js" merge="plugins"></script> | ||
| 80 | + | ||
| 81 | +<!-- perfect-scrollbar --> | ||
| 82 | +<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" merge="plugins"></script> | ||
| 83 | +<!-- common js --> | ||
| 84 | +<script src="/real_control_v2/js/common.js"></script> | ||
| 85 | +<!-- art-template 模版引擎 --> | ||
| 86 | +<script src="/assets/plugins/template.js" merge="plugins"></script> | ||
| 87 | +<!-- d3 --> | ||
| 88 | +<script src="/assets/js/d3.min.js"></script> | ||
| 89 | +<!-- EventProxy --> | ||
| 90 | +<script src="/assets/js/eventproxy.js"></script> | ||
| 91 | +<!-- uikit core --> | ||
| 92 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/uikit.min.js" merge="uikit_js"></script> | ||
| 93 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/notify.min.js" merge="uikit_js"></script> | ||
| 94 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/tooltip.min.js" merge="uikit_js"></script> | ||
| 95 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/autocomplete.min.js" merge="uikit_js"></script> | ||
| 96 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/accordion.min.js" merge="uikit_js"></script> | ||
| 97 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/sticky.min.js" merge="uikit_js"></script> | ||
| 98 | + | ||
| 99 | +<!-- js tree --> | ||
| 100 | +<script src="/real_control_v2/assets/plugins/jstree/jstree.min.js" merge="plugins"></script> | ||
| 101 | +<!-- layer 3.0.3 --> | ||
| 102 | +<script src="/real_control_v2/assets/plugins/layer3.0.3/layer.js" merge="plugins"></script> | ||
| 103 | + | ||
| 104 | +<!-- 模态框扩展 --> | ||
| 105 | +<script src="/real_control_v2/js/modal_extend.js" merge="custom_js"></script> | ||
| 106 | + | ||
| 107 | +<script src="/real_control_v3/alone_page/map/alone_data_basic.js" merge="custom_js"></script> | ||
| 108 | +<script src="/real_control_v3/alone_page/map/alone_data_gps.js" merge="custom_js"></script> | ||
| 109 | +<script src="/real_control_v2/js/utils/ct_table.js" merge="custom_js"></script> | ||
| 110 | +<!-- jquery.serializejson JSON序列化插件 --> | ||
| 111 | +<script src="/assets/plugins/jquery.serializejson.js" merge="uikit_js"></script> | ||
| 112 | + | ||
| 113 | +<script src="/assets/plugins/pinyin.js" merge="plugins"></script> | ||
| 114 | +</body> | ||
| 115 | +<script> | ||
| 116 | + gb_data_gps.fixedTimeRefresh(); | ||
| 117 | + var res_load_ep = EventProxy.create('data-basic', function () { | ||
| 118 | + | ||
| 119 | + //嵌入地图页面 | ||
| 120 | + $('.main-container').load('/real_control_v3/mapmonitor/real.html', function () { | ||
| 121 | + $('.map-system-msg.flex-left').remove(); | ||
| 122 | + | ||
| 123 | + $(this).append('<span class="map-panel"></span>');//判断里有JS判定这个容器是否显示 | ||
| 124 | + }); | ||
| 125 | + }); | ||
| 126 | + | ||
| 127 | + var isArray = function (obj) { | ||
| 128 | + return Object.prototype.toString.call(obj) === '[object Array]'; | ||
| 129 | + }; | ||
| 130 | +</script> | ||
| 131 | +</html> |
src/main/resources/static/real_control_v3/fragments/home/c0_a3.html
0 → 100644
| 1 | +<div class="uk-modal" id="home-c0a3-modal"> | ||
| 2 | + <div class="uk-modal-dialog"> | ||
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | ||
| 4 | + <div class="uk-modal-header"> | ||
| 5 | + <h2>B-91071 设备参数</h2></div> | ||
| 6 | + | ||
| 7 | + <div class="modal-loading"> | ||
| 8 | + <div class="uk-modal-spinner"></div> | ||
| 9 | + <div class="text">正在下发指令...</div> | ||
| 10 | + </div> | ||
| 11 | + | ||
| 12 | + | ||
| 13 | + <div id="c0a3_detail_panel" style="display: none;"> | ||
| 14 | + <table class="uk-table uk-table-striped uk-table-hover"> | ||
| 15 | + <tr> | ||
| 16 | + <th>设备编号:</th> | ||
| 17 | + <td>559L0018</td> | ||
| 18 | + </tr> | ||
| 19 | + <tr> | ||
| 20 | + <th>网关IP地址:</th> | ||
| 21 | + <td>222.68.12.48</td> | ||
| 22 | + </tr> | ||
| 23 | + <tr> | ||
| 24 | + <th>网关端口:</th> | ||
| 25 | + <td>30020</td> | ||
| 26 | + </tr> | ||
| 27 | + <tr> | ||
| 28 | + <th>定时定距上报模式:</th> | ||
| 29 | + <td>0</td> | ||
| 30 | + </tr> | ||
| 31 | + <tr> | ||
| 32 | + <th>定时上报时间间隔:</th> | ||
| 33 | + <td>0</td> | ||
| 34 | + </tr> | ||
| 35 | + <tr> | ||
| 36 | + <th>定距上报距离间隔:</th> | ||
| 37 | + <td>0</td> | ||
| 38 | + </tr> | ||
| 39 | + <tr> | ||
| 40 | + <th>非线路状态超速阀门:</th> | ||
| 41 | + <td>0</td> | ||
| 42 | + </tr> | ||
| 43 | + <tr> | ||
| 44 | + <th>预警阀门:</th> | ||
| 45 | + <td>0</td> | ||
| 46 | + </tr> | ||
| 47 | + <tr> | ||
| 48 | + <th>pos机IP地址:</th> | ||
| 49 | + <td>192.168.2.52</td> | ||
| 50 | + </tr> | ||
| 51 | + <tr> | ||
| 52 | + <th>pos机端口:</th> | ||
| 53 | + <td>8090</td> | ||
| 54 | + </tr> | ||
| 55 | + <tr> | ||
| 56 | + <th>延迟机关时间:</th> | ||
| 57 | + <td>0</td> | ||
| 58 | + </tr> | ||
| 59 | + <tr> | ||
| 60 | + <th>中门视频切换到码表界面速度阀门:</th> | ||
| 61 | + <td>0</td> | ||
| 62 | + </tr> | ||
| 63 | + <tr> | ||
| 64 | + <th>码表界面切换到中门视频速度阀门:</th> | ||
| 65 | + <td>0</td> | ||
| 66 | + </tr> | ||
| 67 | + <tr> | ||
| 68 | + <th>对比度:</th> | ||
| 69 | + <td>0</td> | ||
| 70 | + </tr> | ||
| 71 | + <tr> | ||
| 72 | + <th>亮度:</th> | ||
| 73 | + <td>0</td> | ||
| 74 | + </tr> | ||
| 75 | + <tr> | ||
| 76 | + <th>饱和度:</th> | ||
| 77 | + <td>0</td> | ||
| 78 | + </tr> | ||
| 79 | + </table> | ||
| 80 | + </div> | ||
| 81 | + </div> | ||
| 82 | + <script> | ||
| 83 | + (function() { | ||
| 84 | + var modal = '#home-c0a3-modal'; | ||
| 85 | + $(modal).on('init', function(e, data) { | ||
| 86 | + e.stopPropagation(); | ||
| 87 | + console.log('data', data); | ||
| 88 | + $.post('/directive/c0a4', {nbbm: data.nbbm}); | ||
| 89 | + | ||
| 90 | + setTimeout(function() { | ||
| 91 | + $('.modal-loading .text', modal).text('等待设备响应数据...'); | ||
| 92 | + }, 1500); | ||
| 93 | + | ||
| 94 | + setTimeout(function() { | ||
| 95 | + //$('.modal-loading .text', modal).text('等待设备响应数据...'); | ||
| 96 | + $('.modal-loading', modal).remove(); | ||
| 97 | + | ||
| 98 | + $('#c0a3_detail_panel').show(); | ||
| 99 | + }, 4500); | ||
| 100 | + }); | ||
| 101 | + })(); | ||
| 102 | + </script> | ||
| 103 | +</div> |
src/main/resources/static/real_control_v3/fragments/home/context_menu.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <!-- send phrase--> | ||
| 3 | + <script id="home-send-phrase-temp" type="text/html"> | ||
| 4 | + <div class="uk-modal" id="send-phrase-modal"> | ||
| 5 | + <div class="uk-modal-dialog"> | ||
| 6 | + | ||
| 7 | + <a href="" class="uk-modal-close uk-close"></a> | ||
| 8 | + <div class="uk-modal-header"> | ||
| 9 | + <h2>向 {{nbbm}} 发送消息短语</h2></div> | ||
| 10 | + <form class="uk-form"> | ||
| 11 | + <input type="hidden" value="{{nbbm}}" name="nbbm" /> | ||
| 12 | + <div class="uk-form-row"> | ||
| 13 | + <select style="width: 170px;" class="common_phrase_sel"> | ||
| 14 | + </select> | ||
| 15 | + <div class="tools" > | ||
| 16 | + <span data-uk-tooltip title="添加到常用短语" class="add_frequent_phrases"> | ||
| 17 | + <i class="uk-icon-plus"></i> | ||
| 18 | + </span> | ||
| 19 | + <span data-uk-tooltip title="删除这条常用短语" class="minus_frequent_phrases"> | ||
| 20 | + <i class="uk-icon-minus"></i> | ||
| 21 | + </span> | ||
| 22 | + </div> | ||
| 23 | + </div> | ||
| 24 | + <div class="uk-form-row"> | ||
| 25 | + <textarea cols="30" rows="5" name="text" data-fv-notempty data-fv-stringlength="true" data-fv-stringlength-max="50" placeholder="输入短语,不要超过50 个字符" style="margin: 0px; width: 100%; height: 110px;"></textarea> | ||
| 26 | + </div> | ||
| 27 | + <div class="uk-modal-footer uk-text-right"> | ||
| 28 | + <button type="button" class="uk-button uk-modal-close">取消</button> | ||
| 29 | + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-send"></i> 发送</button> | ||
| 30 | + </div> | ||
| 31 | + </form> | ||
| 32 | + </div> | ||
| 33 | + </div> | ||
| 34 | + </script> | ||
| 35 | + | ||
| 36 | + <script id="home-send-phrase-multi-temp" type="text/html"> | ||
| 37 | + <div class="uk-modal" id="send-phrase-multi-modal"> | ||
| 38 | + <div class="uk-modal-dialog" style="width: 730px;"> | ||
| 39 | + <a href="" class="uk-modal-close uk-close"></a> | ||
| 40 | + <div class="uk-modal-header"> | ||
| 41 | + <h2>群发消息短语</h2></div> | ||
| 42 | + | ||
| 43 | + <div class="uk-grid ct-modal-body send-multi-grid"> | ||
| 44 | + <div class="uk-width-2-6"> | ||
| 45 | + <div class="device-tree"></div> | ||
| 46 | + </div> | ||
| 47 | + <div class="uk-width-4-6" style="border-left: 1px solid #dddddd;"> | ||
| 48 | + <form class="uk-form fixed-tool"> | ||
| 49 | + <div class="uk-form-row"> | ||
| 50 | + <select style="width: 170px;" class="common_phrase_sel"> | ||
| 51 | + </select> | ||
| 52 | + <div class="tools" > | ||
| 53 | + <span data-uk-tooltip title="添加到常用短语" class="add_frequent_phrases"> | ||
| 54 | + <i class="uk-icon-plus"></i> | ||
| 55 | + </span> | ||
| 56 | + <span data-uk-tooltip title="删除这条常用短语" class="minus_frequent_phrases"> | ||
| 57 | + <i class="uk-icon-minus"></i> | ||
| 58 | + </span> | ||
| 59 | + </div> | ||
| 60 | + </div> | ||
| 61 | + <br /> | ||
| 62 | + <div class="uk-form-row"> | ||
| 63 | + <textarea cols="30" rows="5" name="text" data-fv-notempty data-fv-stringlength="true" data-fv-stringlength-max="50" placeholder="输入短语,不要超过50 个字符" style="margin: 0px; width: 100%; height: 110px;"></textarea> | ||
| 64 | + </div> | ||
| 65 | + <div class="uk-modal-footer uk-text-right"> | ||
| 66 | + <button type="button" class="uk-button uk-modal-close">取消</button> | ||
| 67 | + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-send"></i> 发送</button> | ||
| 68 | + </div> | ||
| 69 | + </form> | ||
| 70 | + </div> | ||
| 71 | + </div> | ||
| 72 | + </div> | ||
| 73 | + </div> | ||
| 74 | + </script> | ||
| 75 | + | ||
| 76 | + | ||
| 77 | + <script id="show-multi-send-anim-temp" type="text/html"> | ||
| 78 | + <div class="uk-modal" id="show-multi-send-modal"> | ||
| 79 | + <div class="uk-modal-dialog" > | ||
| 80 | + <a href="" class="uk-modal-close uk-close"></a> | ||
| 81 | + <h2 class="modal-title"><i class="uk-icon-spinner uk-icon-spin"></i> 正在发送...</h2> | ||
| 82 | + <div class="uk-panel uk-panel-box">{{text}}</div> | ||
| 83 | + <ul class="uk-list uk-list-line"> | ||
| 84 | + {{each array as nbbm i}} | ||
| 85 | + <li data-nbbm="{{nbbm}}"> | ||
| 86 | + <span class="text-lg">{{nbbm}}</span> | ||
| 87 | + <span class="text-grey wait-send">等待推送</span> | ||
| 88 | + </li> | ||
| 89 | + {{/each}} | ||
| 90 | + </ul> | ||
| 91 | + </div> | ||
| 92 | + </div> | ||
| 93 | + </script> | ||
| 94 | + | ||
| 95 | + <script id="line-change-modal-temp" type="text/html"> | ||
| 96 | + <div class="uk-modal" id="line-change-modal"> | ||
| 97 | + <div class="uk-modal-dialog"> | ||
| 98 | + <a href="" class="uk-modal-close uk-close"></a> | ||
| 99 | + | ||
| 100 | + <form class="uk-form fv-form"> | ||
| 101 | + <input type="hidden" name="nbbm" value="{{nbbm}}" /> | ||
| 102 | + <fieldset data-uk-margin> | ||
| 103 | + <strong style="color: red;font-size: 16px;">{{nbbm}}</strong> 切换至线路 | ||
| 104 | + | ||
| 105 | + <div class="uk-autocomplete uk-form" id="uk-autocomplete-line"> | ||
| 106 | + <input type="text" placeholder="搜索线路" name="line" /> | ||
| 107 | + </div> | ||
| 108 | + | ||
| 109 | + <label style="margin-left: 15px;font-size: 12px;color: grey;"> | ||
| 110 | + <input type="checkbox" style="vertical-align: middle" checked disabled> 强制刷新线路文件! | ||
| 111 | + </label> | ||
| 112 | + </fieldset> | ||
| 113 | + | ||
| 114 | + <div class="uk-modal-footer uk-text-right"> | ||
| 115 | + <button type="button" class="uk-button uk-modal-close">取消</button> | ||
| 116 | + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-send"></i> 发送</button> | ||
| 117 | + </div> | ||
| 118 | + </form> | ||
| 119 | + </div> | ||
| 120 | + </div> | ||
| 121 | +</script> | ||
| 122 | +</div> |
src/main/resources/static/real_control_v3/fragments/home/layout.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <!-- home tab template --> | ||
| 3 | + <script id="home-layout-tab-temp" type="text/html"> | ||
| 4 | + <ul id="home-main-content" class="uk-switcher"> | ||
| 5 | + {{each tabs as t i}} | ||
| 6 | + <li {{if i==0}}class="uk-active"{{/if}} >{{t}}</li> | ||
| 7 | + {{/each}} | ||
| 8 | + </ul> | ||
| 9 | + | ||
| 10 | + <div class="home-panel-footer"> | ||
| 11 | + <ul class="uk-subnav uk-subnav-pill" data-uk-switcher="{connect:'#home-main-content', swiping: false}"> | ||
| 12 | + {{each tabs as t i}} | ||
| 13 | + <li {{if i==0}}class="uk-active"{{/if}}><a> {{t}}</a></li> | ||
| 14 | + {{/each}} | ||
| 15 | + </ul> | ||
| 16 | + <div class="home-rb-explain-icon "> | ||
| 17 | + <a href="/real_control_v2/alone_page/home/home_wrap.html" target="_blank"> | ||
| 18 | + <i class="uk-icon-send-o home_alone_page uk-icon-hover" ></i> | ||
| 19 | + </a> | ||
| 20 | + | ||
| 21 | + <i class="uk-icon-question-circle uk-icon-hover"></i> | ||
| 22 | + </div> | ||
| 23 | + </div> | ||
| 24 | + </script> | ||
| 25 | + | ||
| 26 | + <!-- home line template --> | ||
| 27 | + <script id="home-layout-line-temp" type="text/html"> | ||
| 28 | + {{each list as line i}} | ||
| 29 | + <div class="uk-grid home-line-card" data-line-code="{{line.lineCode}}"> | ||
| 30 | + <div class="uk-width-medium-1-5 data-wrap up" id="home_{{line.lineCode}}_0"></div> | ||
| 31 | + <div class="uk-width-medium-3-5 svg-chart-wrap"> | ||
| 32 | + <div class="home-svg-edit-icon" data-line-code="{{line.lineCode}}"></div> | ||
| 33 | + <div class="top-center-big-text"> | ||
| 34 | + {{line.name}} | ||
| 35 | + </div> | ||
| 36 | + </div> | ||
| 37 | + <div class="uk-width-medium-1-5 data-wrap down" id="home_{{line.lineCode}}_1"></div> | ||
| 38 | + </div> | ||
| 39 | + {{/each}} | ||
| 40 | + </script> | ||
| 41 | + | ||
| 42 | + <script id="home-rb-explain-help-temp" type="text/html"> | ||
| 43 | + <ul class="uk-list"> | ||
| 44 | + <li>场外车辆,距离线路超过100米即为越界</li> | ||
| 45 | + <li>超速以线路标准限速为准,为空则默认60</li> | ||
| 46 | + <li>有任务时,连续2分钟无信号即为掉线</li> | ||
| 47 | + <li>无任务时,连续10分钟无信号则已离线</li> | ||
| 48 | + </ul> | ||
| 49 | + </script> | ||
| 50 | +</div> |
src/main/resources/static/real_control_v3/fragments/home/line_panel.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <script id="home-gps-table-temp" type="text/html"> | ||
| 3 | + <div class="data-title"> | ||
| 4 | + <span class="data-title-text">发往{{title}} ( <span class="no-badge">0</span> )</span> | ||
| 5 | + </div> | ||
| 6 | + <div class="data-body"> | ||
| 7 | + <div class="ct_table_wrap"> | ||
| 8 | + <div class="ct_table home-gps-table"> | ||
| 9 | + <div class="ct_table_head"> | ||
| 10 | + <dl> | ||
| 11 | + <dt>车辆编码</dt> | ||
| 12 | + <dt>路牌</dt> | ||
| 13 | + <dt>速度</dt> | ||
| 14 | + <dt>终点</dt> | ||
| 15 | + <dt>状态</dt> | ||
| 16 | + <dt>当前站点</dt> | ||
| 17 | + <dt>终点站</dt> | ||
| 18 | + <dt>计划到达</dt> | ||
| 19 | + <dt>驾驶员</dt> | ||
| 20 | + </dl> | ||
| 21 | + </div> | ||
| 22 | + <div class="ct_table_body"></div> | ||
| 23 | + </div> | ||
| 24 | + </div> | ||
| 25 | + </div> | ||
| 26 | + </script> | ||
| 27 | + | ||
| 28 | + <script id="home-gps-tbody-temp" type="text/html"> | ||
| 29 | + <dl id="home_gps_{{deviceId}}" data-device-id="{{deviceId}}" {{if abnormalStatus=='offline'}}class="offline"{{/if}}> | ||
| 30 | + <dd title="{{nbbm}}"><a>{{nbbm}}</a></dd> | ||
| 31 | + <dd></dd> | ||
| 32 | + <dd>{{speed>99?'..':speed}}</dd> | ||
| 33 | + <dd>{{expectStopTime}}</dd> | ||
| 34 | + <dd> | ||
| 35 | + {{if abnormalStatus != null}} | ||
| 36 | + {{if abnormalStatus == 'outBounds'}} | ||
| 37 | + <span class="signal-state-outbounds">越界</span> | ||
| 38 | + {{else if abnormalStatus == 'overspeed'}} | ||
| 39 | + <span class="signal-state-speed-limit">超速</span> | ||
| 40 | + {{/if}} | ||
| 41 | + {{/if}} | ||
| 42 | + | ||
| 43 | + {{if instation == 2}} | ||
| 44 | + <i class="uk-icon-product-hunt carpark-icon"></i> | ||
| 45 | + {{/if}} | ||
| 46 | + </dd> | ||
| 47 | + <dd title="{{stationName}}">{{stationName}}</dd> | ||
| 48 | + <dd></dd> | ||
| 49 | + <dd></dd> | ||
| 50 | + <dd></dd> | ||
| 51 | + </dl> | ||
| 52 | + </script> | ||
| 53 | + | ||
| 54 | + <script id="home-gps-abnormal-temp" type="text/html"> | ||
| 55 | + {{if abnormalStatus != null}} | ||
| 56 | + {{if abnormalStatus == 'outBounds'}} | ||
| 57 | + <span class="signal-state-outbounds">越界</span> | ||
| 58 | + {{else if abnormalStatus == 'overspeed'}} | ||
| 59 | + <span class="signal-state-speed-limit">超速</span> | ||
| 60 | + {{/if}} | ||
| 61 | + {{/if}} | ||
| 62 | + | ||
| 63 | + {{if instation == 2}} | ||
| 64 | + <i class="uk-icon-product-hunt carpark-icon"></i> | ||
| 65 | + {{/if}} | ||
| 66 | + </script> | ||
| 67 | +</div> |
src/main/resources/static/real_control_v3/fragments/home/svg_edit.html
0 → 100644
| 1 | +<div class="uk-modal" id="home-svg-edit-modal"> | ||
| 2 | + <div class="uk-modal-dialog" style="width: 930px;"> | ||
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | ||
| 4 | + <div class="uk-modal-header"> | ||
| 5 | + <h2>主页模拟图数据编辑</h2></div> | ||
| 6 | + | ||
| 7 | + <div class="svg-edit-panel-wrap station-list-wrap"> | ||
| 8 | + <span class="title-badge">站点缩略</span> | ||
| 9 | + </div> | ||
| 10 | + | ||
| 11 | + | ||
| 12 | + <div class="svg-edit-panel-wrap" style="margin-left: 25px;"> | ||
| 13 | + <span class="title-badge">站点重命名</span> | ||
| 14 | + <div style="height: 100%;"> | ||
| 15 | + <div style="height: calc(100% - 25px);overflow: auto;"> | ||
| 16 | + <form class="uk-form rename-list-form"> | ||
| 17 | + </form> | ||
| 18 | + </div> | ||
| 19 | + | ||
| 20 | + <div class="rename-tools" style="height: 21px;"> | ||
| 21 | + <a class="uk-icon-small uk-icon-hover uk-icon-plus add"></a> | ||
| 22 | + <a class="uk-icon-small uk-icon-hover uk-icon-minus minus"></a> | ||
| 23 | + </div> | ||
| 24 | + </div> | ||
| 25 | + </div> | ||
| 26 | + | ||
| 27 | + | ||
| 28 | + <div class="uk-modal-footer uk-text-right"> | ||
| 29 | + <button type="button" class="uk-button uk-modal-close">取消</button> | ||
| 30 | + <button type="button" class="uk-button uk-button-primary submitBtn"><i class="uk-icon-check"></i> 保存 | ||
| 31 | + </button> | ||
| 32 | + </div> | ||
| 33 | + </div> | ||
| 34 | + | ||
| 35 | + <script id="svg-edit-station-list-temp" type="text/html"> | ||
| 36 | + <div class="station-list up"> | ||
| 37 | + {{each list[0] as s i}} | ||
| 38 | + <div class="station-item" data-code="{{s.stationCode}}">{{s.stationName}}</div> | ||
| 39 | + {{/each}} | ||
| 40 | + </div> | ||
| 41 | + | ||
| 42 | + <div class="station-list down" style="margin-left: 8px;"> | ||
| 43 | + {{each list[1] as s i}} | ||
| 44 | + <div class="station-item" data-code="{{s.stationCode}}">{{s.stationName}}</div> | ||
| 45 | + {{/each}} | ||
| 46 | + </div> | ||
| 47 | + </script> | ||
| 48 | + | ||
| 49 | + <script id="svg-edit-rename-item-temp" type="text/html"> | ||
| 50 | + <div class="rename-item-panel"> | ||
| 51 | + <input type="checkbox"> | ||
| 52 | + <select name="renames[{{no}}][name]"> | ||
| 53 | + {{each names as n i}} | ||
| 54 | + <option value="{{n}}">{{n}}</option> | ||
| 55 | + {{/each}} | ||
| 56 | + </select> | ||
| 57 | + <i class="uk-icon-arrows-h"></i> | ||
| 58 | + <input type="text" value="{{names[0]}}" name="renames[{{no}}][nickname]"> | ||
| 59 | + </div> | ||
| 60 | + </script> | ||
| 61 | + | ||
| 62 | + <script> | ||
| 63 | + (function () { | ||
| 64 | + var modal = '#home-svg-edit-modal', | ||
| 65 | + lineCode, names = [], no = 0; | ||
| 66 | + | ||
| 67 | + $(modal).on('init', function (e, data) { | ||
| 68 | + e.stopPropagation(); | ||
| 69 | + lineCode = data.lineCode; | ||
| 70 | + var allStationList = gb_data_basic.stationRoutes(lineCode); | ||
| 71 | + //站点路由 | ||
| 72 | + var routeArray = gb_common.groupBy(allStationList, 'directions'); | ||
| 73 | + //下行倒序 | ||
| 74 | + routeArray[1].sort(function (a, b) { | ||
| 75 | + return b.stationRouteCode - a.stationRouteCode; | ||
| 76 | + }); | ||
| 77 | + $('.station-list-wrap', modal).append(template('svg-edit-station-list-temp', {list: routeArray})); | ||
| 78 | + | ||
| 79 | + $('.station-item', modal).on('click', function () { | ||
| 80 | + if ($(this).hasClass('disable')) { | ||
| 81 | + $(this).removeClass('disable'); | ||
| 82 | + } | ||
| 83 | + else | ||
| 84 | + $(this).addClass('disable'); | ||
| 85 | + }); | ||
| 86 | + | ||
| 87 | + //上下行所有的站点名称 | ||
| 88 | + var nameMap = {}; | ||
| 89 | + $.each(allStationList, function () { | ||
| 90 | + nameMap[this.stationName] = 1; | ||
| 91 | + }); | ||
| 92 | + names = gb_common.get_keys(nameMap).sort(function (a, b) { | ||
| 93 | + return a.localeCompare(b); | ||
| 94 | + }); | ||
| 95 | + | ||
| 96 | + //获取配置信息 | ||
| 97 | + var svgAttr = gb_data_basic.getSvgAttr(lineCode); | ||
| 98 | + if(svgAttr){ | ||
| 99 | + var hideStations = svgAttr.hideStations; | ||
| 100 | + //disable | ||
| 101 | + $('.station-list-wrap .station-item', modal).each(function () { | ||
| 102 | + var code = $(this).data('code'); | ||
| 103 | + if (hideStations.indexOf(code) != -1) { | ||
| 104 | + $(this).addClass('disable'); | ||
| 105 | + } | ||
| 106 | + }); | ||
| 107 | + //rename items | ||
| 108 | + var nicknames = svgAttr.nicknames; | ||
| 109 | + for (var n in nicknames) { | ||
| 110 | + addRenameItem(function ($e) { | ||
| 111 | + $e.find('select').val(n); | ||
| 112 | + $e.find('input[type=text]').val(nicknames[n]); | ||
| 113 | + }); | ||
| 114 | + } | ||
| 115 | + } | ||
| 116 | + }); | ||
| 117 | + | ||
| 118 | + var addRenameItem = function (cb) { | ||
| 119 | + var htmlStr = template('svg-edit-rename-item-temp', {names: names, no: no}); | ||
| 120 | + var $e = $(htmlStr); | ||
| 121 | + $('.rename-list-form', modal).append($e); | ||
| 122 | + no++; | ||
| 123 | + cb && cb($e); | ||
| 124 | + }; | ||
| 125 | + | ||
| 126 | + //add rename item | ||
| 127 | + $('.rename-tools .add', modal).on('click', function () { | ||
| 128 | + addRenameItem(); | ||
| 129 | + }); | ||
| 130 | + | ||
| 131 | + //remove rename item | ||
| 132 | + $('.rename-tools .minus', modal).on('click', function () { | ||
| 133 | + $('.rename-item-panel.active', modal).remove(); | ||
| 134 | + }); | ||
| 135 | + | ||
| 136 | + //check | ||
| 137 | + $(modal).on('click', '.rename-item-panel input[type=checkbox]', function () { | ||
| 138 | + if ($(this)[0].checked) { | ||
| 139 | + $(this).parent().addClass('active'); | ||
| 140 | + } | ||
| 141 | + else { | ||
| 142 | + $(this).parent().removeClass('active'); | ||
| 143 | + } | ||
| 144 | + }); | ||
| 145 | + | ||
| 146 | + //select | ||
| 147 | + $(modal).on('change', '.rename-item-panel select', function () { | ||
| 148 | + $(this).nextAll('input').val($(this).val()); | ||
| 149 | + }); | ||
| 150 | + | ||
| 151 | + | ||
| 152 | + //提交 | ||
| 153 | + $(modal).on('click', '.submitBtn', function () { | ||
| 154 | + //重命名数据 | ||
| 155 | + var tempData = $('.rename-list-form', modal).serializeJSON().renames; | ||
| 156 | + var renameData = {}; | ||
| 157 | + $.each(gb_common.get_vals(tempData), function () { | ||
| 158 | + if (!$.trim(this.nickname) || this.name == this.nickname) | ||
| 159 | + return true; | ||
| 160 | + renameData[this.name] = this.nickname; | ||
| 161 | + }); | ||
| 162 | + | ||
| 163 | + //被禁选的站点 | ||
| 164 | + var disableStation = []; | ||
| 165 | + $('.station-list-wrap .station-item.disable', modal).each(function () { | ||
| 166 | + disableStation.push($(this).data('code')); | ||
| 167 | + }); | ||
| 168 | + | ||
| 169 | + var data = { | ||
| 170 | + lineCode: lineCode, | ||
| 171 | + hideStations: disableStation, | ||
| 172 | + nicknames: renameData | ||
| 173 | + }; | ||
| 174 | + | ||
| 175 | + gb_common.$post('/freeLogin/realSchedule/svgAttr', {jsonStr: JSON.stringify(data)}, function (rs) { | ||
| 176 | + if (rs.t) { | ||
| 177 | + gb_data_basic.setSvgAttr(rs.t); | ||
| 178 | + //重新绘制模拟图 | ||
| 179 | + var lineCode = rs.t.lineCode; | ||
| 180 | + //主页 | ||
| 181 | + var wrap = $('#home-main-content .home-line-card[data-line-code='+lineCode+'] .svg-chart-wrap'); | ||
| 182 | + wrap.find('svg.line-chart').remove(); | ||
| 183 | + gb_svg_chart.draw_line(lineCode, wrap, true); | ||
| 184 | + //电子路单界面 | ||
| 185 | + wrap = $('#main-tab-content .line_schedule[data-id='+lineCode+'] .footer-chart .svg-wrap'); | ||
| 186 | + wrap.find('svg.line-chart').remove(); | ||
| 187 | + gb_svg_chart.draw_line(lineCode, wrap, true); | ||
| 188 | + UIkit.modal(modal).hide(); | ||
| 189 | + } | ||
| 190 | + }); | ||
| 191 | + }); | ||
| 192 | + })(); | ||
| 193 | + </script> | ||
| 194 | +</div> |
src/main/resources/static/real_control_v3/fragments/home/tooltip.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <script id="tooltip_gps_temp" type="text/html"> | ||
| 3 | + <div class="tooltip" data-id="{{deviceId}}"> | ||
| 4 | + <div class="tooltip-container"> | ||
| 5 | + | ||
| 6 | + <div class="cont-text-panel home_svg_tips"> | ||
| 7 | + <div class="title"> | ||
| 8 | + <a href="javascript:;" data-for="station" class="tip_modal"> | ||
| 9 | + {{nbbm}} | ||
| 10 | + {{if abnormalStatus == 'outBounds'}} | ||
| 11 | + <span class="abnormal-text">越界</span> | ||
| 12 | + {{else if abnormalStatus == 'overspeed'}} | ||
| 13 | + <span class="abnormal-text">超速</span> | ||
| 14 | + {{else if abnormalStatus == 'gps-offline'}} | ||
| 15 | + <span class="abnormal-text">GPS掉线</span> | ||
| 16 | + {{else if abnormalStatus == 'offline'}} | ||
| 17 | + <span class="abnormal-text">已离线</span> | ||
| 18 | + {{/if}} | ||
| 19 | + </a> | ||
| 20 | + </div> | ||
| 21 | + <div> | ||
| 22 | + <span class="field">车牌号:</span>{{plateNo}} | ||
| 23 | + </div> | ||
| 24 | + <div title="{{stationName}}"> | ||
| 25 | + <span class="field">站点:</span>{{stationName}} | ||
| 26 | + </div> | ||
| 27 | + <!-- <div> | ||
| 28 | + {{lineName}} -{{if upDown==0}}上行{{else}}下行{{/if}} | ||
| 29 | + </div> --> | ||
| 30 | + <div> | ||
| 31 | + <span class="field">设备:</span>{{deviceId}} | ||
| 32 | + </div> | ||
| 33 | + <!--<div> | ||
| 34 | + <span class="field">坐标:</span>{{lon}} {{lat}} | ||
| 35 | + </div>--> | ||
| 36 | + {{if sch!=null}} | ||
| 37 | + <div> | ||
| 38 | + <span class="field">驾驶员:</span>{{sch.jGh}}/{{sch.jName}} | ||
| 39 | + </div> | ||
| 40 | + {{if sch.sGh!=null && sch.sGh!=""}} | ||
| 41 | + <div> | ||
| 42 | + <span class="field">售票员:</span>{{sch.sGh}}/{{sch.sName}} | ||
| 43 | + </div> | ||
| 44 | + {{/if}} | ||
| 45 | + {{/if}} | ||
| 46 | + <div> | ||
| 47 | + <span class="field">速度:</span>{{speed>99?'..':speed}}</div> | ||
| 48 | + <div> | ||
| 49 | + <span class="field">时间:</span>{{dateStr}}</div> | ||
| 50 | + {{if expectStopTime!=null}} | ||
| 51 | + <div> | ||
| 52 | + 预计 {{expectStopTime}} 分钟到达终点</div> | ||
| 53 | + {{/if}} | ||
| 54 | + </div> | ||
| 55 | + | ||
| 56 | + <div class="tip_map_wrap"></div> | ||
| 57 | + </div> | ||
| 58 | + </div> | ||
| 59 | + </script> | ||
| 60 | + | ||
| 61 | + <script id="tooltip_multi_gps_temp" type="text/html"> | ||
| 62 | + <div class="multi-tooltip-wrap"> | ||
| 63 | + {{each list as gps i}} | ||
| 64 | + <div class="tooltip multi-tooltip" > | ||
| 65 | + <div class="tooltip-container"> | ||
| 66 | + <div class="title"> | ||
| 67 | + <a href="javascript:;" data-for="station" class="tip_modal"> | ||
| 68 | + {{gps.nbbm}} | ||
| 69 | + </a> | ||
| 70 | + </div> | ||
| 71 | + <div> | ||
| 72 | + <span class="field">车牌号:</span>{{gps.plateNo}} | ||
| 73 | + </div> | ||
| 74 | + <div> | ||
| 75 | + <span class="field">站点:</span>{{gps.stationName}} | ||
| 76 | + </div> | ||
| 77 | + <div> | ||
| 78 | + <span class="field">设备:</span>{{gps.deviceId}} | ||
| 79 | + </div> | ||
| 80 | + <div style="color: #747272;"> | ||
| 81 | + {{gps.dateStr}} | ||
| 82 | + </div> | ||
| 83 | + </div> | ||
| 84 | + </div> | ||
| 85 | + {{/each}} | ||
| 86 | + </div> | ||
| 87 | + <div class="tip_map_wrap multi"></div> | ||
| 88 | + </script> | ||
| 89 | + | ||
| 90 | + | ||
| 91 | + <script id="tooltip_multi_gps_cont_temp" type="text/html"> | ||
| 92 | + <div class="tooltip-container"> | ||
| 93 | + <div class="title"> | ||
| 94 | + <a href="javascript:;" data-for="station" class="tip_modal"> | ||
| 95 | + {{nbbm}} | ||
| 96 | + </a> | ||
| 97 | + </div> | ||
| 98 | + <div> | ||
| 99 | + <span class="field">站点:</span>{{stationName}} | ||
| 100 | + </div> | ||
| 101 | + <div> | ||
| 102 | + <span class="field">设备:</span>{{deviceId}} | ||
| 103 | + </div> | ||
| 104 | + <div style="color: #747272;"> | ||
| 105 | + {{gps.dateStr}} | ||
| 106 | + </div> | ||
| 107 | + </div> | ||
| 108 | + </script> | ||
| 109 | +</div> |
src/main/resources/static/real_control_v3/fragments/line_schedule/badge_tooltip.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <script id="sch-table-task-tootip-temp" type="text/html"> | ||
| 3 | + <div class="tl-tip-panel"> | ||
| 4 | + <div class="tip_task_list"> | ||
| 5 | + <dl> | ||
| 6 | + <dt>操作</dt> | ||
| 7 | + <dt>类型</dt> | ||
| 8 | + <dt>里程</dt> | ||
| 9 | + <dt>起点</dt> | ||
| 10 | + <dt>终点</dt> | ||
| 11 | + <dt>备注</dt> | ||
| 12 | + </dl> | ||
| 13 | + {{each tasks as t i}} | ||
| 14 | + <dl class="{{t.mileageType}} {{if t.destroy}}destroy{{/if}} {{if t.type1=='临加'}}temp_add{{/if}}"> | ||
| 15 | + <dd><a data-line="{{sch.xlBm}}" data-id="{{t.id}}" data-schid="{{sch.id}}" class="tip_task_edit_link">编辑</a></dd> | ||
| 16 | + <dd> | ||
| 17 | + {{if t.mileageType=="service"}} | ||
| 18 | + 营运 | ||
| 19 | + {{else if t.mileageType=="empty"}} | ||
| 20 | + 空驶 | ||
| 21 | + {{/if}} | ||
| 22 | + {{if t.destroy}} | ||
| 23 | + <span>(烂班)</span> | ||
| 24 | + {{else if t.type2==2}} | ||
| 25 | + <span>(进场)</span> | ||
| 26 | + {{else if t.type2==3}} | ||
| 27 | + <span>(出场)</span> | ||
| 28 | + {{else if t.type1=='临加'}} | ||
| 29 | + <span>(临加)</span> | ||
| 30 | + {{/if}} | ||
| 31 | + </dd> | ||
| 32 | + <dd> | ||
| 33 | + {{t.mileage}} | ||
| 34 | + </dd> | ||
| 35 | + <dd title="{{t.startStationName}}">{{t.startStationName}}</dd> | ||
| 36 | + <dd title="{{t.endStationName}}">{{t.endStationName}}</dd> | ||
| 37 | + <dd title="{{t.remarks}}">{{t.remarks}}</dd> | ||
| 38 | + </dl> | ||
| 39 | + {{/each}} | ||
| 40 | + <dl class="tip_task_count_dl {{if sch.c_t_mileage_status==-1}}c_task_error{{/if}}" > | ||
| 41 | + <dd><i class="uk-icon-plus badge_tip_add_icon" data-line="{{sch.xlBm}}" data-schid="{{sch.id}}"></i></dd> | ||
| 42 | + <dd> | ||
| 43 | + <span>计划:{{sch.jhlcOrig}}</span> | ||
| 44 | + <span>营运+烂班:{{serviceCount}}</span> | ||
| 45 | + <span>空驶:{{emptyCount}}</span> | ||
| 46 | + </dd> | ||
| 47 | + </dl> | ||
| 48 | + </div> | ||
| 49 | + </div> | ||
| 50 | + </script> | ||
| 51 | + | ||
| 52 | + | ||
| 53 | + <script id="sch-table-region-tootip-temp" type="text/html"> | ||
| 54 | + <div class="tl-tip-panel"> | ||
| 55 | + <div style="font-size: 13px;"> | ||
| 56 | + 由 {{qdzName}} 发往 {{zdzName}} | ||
| 57 | + </div> | ||
| 58 | + </div> | ||
| 59 | + </script> | ||
| 60 | + | ||
| 61 | + <script id="sch-table-out-tootip-temp" type="text/html"> | ||
| 62 | + <div class="tl-tip-panel"> | ||
| 63 | + <div style="font-size: 13px;"> | ||
| 64 | + {{qdzName}} 出场至 {{zdzName}} | ||
| 65 | + </div> | ||
| 66 | + </div> | ||
| 67 | + </script> | ||
| 68 | + | ||
| 69 | + <script id="sch-table-in-tootip-temp" type="text/html"> | ||
| 70 | + <div class="tl-tip-panel"> | ||
| 71 | + <div style="font-size: 13px;"> | ||
| 72 | + 进 {{zdzName}} | ||
| 73 | + </div> | ||
| 74 | + </div> | ||
| 75 | + </script> | ||
| 76 | + | ||
| 77 | + <script id="sch-table-ldks-tootip-temp" type="text/html"> | ||
| 78 | + <div class="tl-tip-panel"> | ||
| 79 | + <div style="font-size: 13px;"> | ||
| 80 | + {{qdzName}} 空驶至 {{zdzName}} | ||
| 81 | + </div> | ||
| 82 | + </div> | ||
| 83 | + </script> | ||
| 84 | +</div> |
src/main/resources/static/real_control_v3/fragments/line_schedule/car_info_all.html
0 → 100644
| 1 | +<div class="uk-modal ct_move_modal" id="sch_car_info_all-modal"> | ||
| 2 | + <div class="uk-modal-dialog" style="width: 1080px;"> | ||
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | ||
| 4 | + | ||
| 5 | + <div class="uk-modal-header"> | ||
| 6 | + <h2><span class="line_name_span"></span> -全部车辆</h2></div> | ||
| 7 | + | ||
| 8 | + <table class="uk-table uk-table-hover" style="table-layout: fixed;"> | ||
| 9 | + <thead> | ||
| 10 | + <tr> | ||
| 11 | + <th style="width: 10%;">车辆</th> | ||
| 12 | + <th style="width: 10%;">设备号</th> | ||
| 13 | + <th style="width: 16%;">位置</th> | ||
| 14 | + <th style="width: 14%;">车载线路编码</th> | ||
| 15 | + <th style="width: 13%;">当前执行任务</th> | ||
| 16 | + <th style="width: 7%;">状态</th> | ||
| 17 | + <th style="width: 19%">最后gps时间</th> | ||
| 18 | + <th>请求出场</th> | ||
| 19 | + </tr> | ||
| 20 | + </thead> | ||
| 21 | + <tbody> | ||
| 22 | + </tbody> | ||
| 23 | + </table> | ||
| 24 | + </div> | ||
| 25 | + | ||
| 26 | + <script id="sch_car_info_all-temp" type="text/html"> | ||
| 27 | + {{each list as obj i}} | ||
| 28 | + <tr data-nbbm="{{obj.nbbm}}"> | ||
| 29 | + <td>{{obj.nbbm}}</td> | ||
| 30 | + <td>{{obj.device}}</td> | ||
| 31 | + <td>{{obj.loc}}</td> | ||
| 32 | + <td>{{obj.lineCodeRealStr}}</td> | ||
| 33 | + <td><a class="exec_sch_link" data-id="{{obj.schId}}">{{obj.exec}}</a></td> | ||
| 34 | + <td><a class="{{if obj.status!='在线'}}grey_link{{/if}}">{{obj.status}}</a></td> | ||
| 35 | + <td class="{{if obj.status!='在线'}}grey_link{{/if}}"> | ||
| 36 | + {{obj.timeStr}} | ||
| 37 | + | ||
| 38 | + {{if obj.formNow!=null}} | ||
| 39 | + <small>({{obj.formNow}})</small> | ||
| 40 | + {{/if}} | ||
| 41 | + </td> | ||
| 42 | + <td>{{obj.qqccTimeStr}}</td> | ||
| 43 | + </tr> | ||
| 44 | + {{/each}} | ||
| 45 | + </script> | ||
| 46 | + <script> | ||
| 47 | + (function () { | ||
| 48 | + var modal = '#sch_car_info_all-modal', lineCode, nbbm; | ||
| 49 | + | ||
| 50 | + $(modal).on('init', function(e, data) { | ||
| 51 | + e.stopPropagation(); | ||
| 52 | + lineCode = data.lineCode; | ||
| 53 | + nbbm = data.nbbm; | ||
| 54 | + | ||
| 55 | + $('.line_name_span', modal).html(gb_data_basic.lineCode2NameAll()[lineCode]); | ||
| 56 | + jsDoQuery(function () { | ||
| 57 | + var $cell = $('tr[data-nbbm='+nbbm+']', modal); | ||
| 58 | + //定位到行 | ||
| 59 | + $(modal).animate({ | ||
| 60 | + scrollTop: $cell.offset().top - $(modal).offset().top + $(modal).scrollTop() | ||
| 61 | + }, 500, function () { | ||
| 62 | + $cell.addClass('ct_active'); | ||
| 63 | + }); | ||
| 64 | + timer = setTimeout(fixedRefreshData, t + 500); | ||
| 65 | + }); | ||
| 66 | + }); | ||
| 67 | + | ||
| 68 | + var timer, t = 12*1000; | ||
| 69 | + var fixedRefreshData = function () { | ||
| 70 | + (function () { | ||
| 71 | + var f = arguments.callee; | ||
| 72 | + jsDoQuery(function () { | ||
| 73 | + timer = setTimeout(f, t); | ||
| 74 | + }); | ||
| 75 | + })(); | ||
| 76 | + }; | ||
| 77 | + | ||
| 78 | + $(modal).on('hide.uk.modal', function () { | ||
| 79 | + clearTimeout(timer); | ||
| 80 | + timer = null; | ||
| 81 | + }); | ||
| 82 | + | ||
| 83 | + var jsDoQuery = function (cb) { | ||
| 84 | + gb_common.$get('/freeLogin/gps/allCarsByLine', {lineCode: lineCode}, function (rs) { | ||
| 85 | + $.each(rs.list, function () { | ||
| 86 | + if(this['lineCodeReal']) | ||
| 87 | + this['lineCodeRealStr'] = this['lineCodeReal'] + '/' + gb_data_basic.lineCode2NameAll()[this['lineCodeReal']]; | ||
| 88 | + else | ||
| 89 | + this['lineCodeRealStr'] = ''; | ||
| 90 | + if(this['gpsTs']){ | ||
| 91 | + this['timeStr'] = moment(this['gpsTs']).format('MM/DD HH:mm:ss'); | ||
| 92 | + this['formNow'] = moment(this['gpsTs']).fromNow(); | ||
| 93 | + } | ||
| 94 | + if(this['qqcc']) | ||
| 95 | + this['qqccTimeStr'] = moment(this['qqcc']).format('HH:mm'); | ||
| 96 | + }); | ||
| 97 | + | ||
| 98 | + rs.list.sort(function (a, b) { | ||
| 99 | + if(!a.nbbm) | ||
| 100 | + return -1; | ||
| 101 | + if(!b.nbbm) | ||
| 102 | + return 1; | ||
| 103 | + return a.nbbm.localeCompare(b.nbbm); | ||
| 104 | + }); | ||
| 105 | + var htmlStr = template('sch_car_info_all-temp', {list: rs.list}); | ||
| 106 | + | ||
| 107 | + $('table>tbody', modal).html(htmlStr); | ||
| 108 | + | ||
| 109 | + cb && cb(); | ||
| 110 | + }); | ||
| 111 | + }; | ||
| 112 | + | ||
| 113 | + $(modal).on('click', 'a.exec_sch_link', function () { | ||
| 114 | + var id = $(this).data('id'); | ||
| 115 | + if(!id) | ||
| 116 | + return; | ||
| 117 | + gb_schedule_table.scroToDl({id: id, xlBm:lineCode}); | ||
| 118 | + }); | ||
| 119 | + })(); | ||
| 120 | + </script> | ||
| 121 | +</div> | ||
| 0 | \ No newline at end of file | 122 | \ No newline at end of file |
src/main/resources/static/real_control_v3/fragments/line_schedule/layout.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <!-- line schedule tab body layout template --> | ||
| 3 | + <script id="cont-line-layout-temp" type="text/html"> | ||
| 4 | + <div class="uk-grid top-container"> | ||
| 5 | + <div class="uk-width-5-6 uk-grid schedule-wrap"> | ||
| 6 | + <div class="uk-width-1-2"> | ||
| 7 | + <div class="card-panel"></div> | ||
| 8 | + </div> | ||
| 9 | + | ||
| 10 | + <div class="uk-width-1-2"> | ||
| 11 | + <div class="card-panel"></div> | ||
| 12 | + </div> | ||
| 13 | + </div> | ||
| 14 | + <div class="uk-width-1-6" style="height: calc(100% - 1px);position: relative;"> | ||
| 15 | + <div class="card-panel sys-mailbox" style="overflow: auto;"> | ||
| 16 | + </div> | ||
| 17 | + <div class="mileage_elec_panel"> | ||
| 18 | + </div> | ||
| 19 | + </div> | ||
| 20 | + </div> | ||
| 21 | + | ||
| 22 | + <div class="footer-chart"> | ||
| 23 | + <div class="card-panel"> | ||
| 24 | + <div class="svg-wrap"></div> | ||
| 25 | + </div> | ||
| 26 | + </div> | ||
| 27 | + </script> | ||
| 28 | + | ||
| 29 | + <script id="sch-table-top-help-temp" type="text/html"> | ||
| 30 | + <div class="tl-tip-panel"> | ||
| 31 | + <div class="ct_title"> | ||
| 32 | + 图例 | ||
| 33 | + </div> | ||
| 34 | + <div style="display: inline-block;width: calc(100% - 50px)"> | ||
| 35 | + <span class="tl-wd">误点</span> | ||
| 36 | + <span class="tl-zzzx">正在执行</span> | ||
| 37 | + <span class="tl-qrlb"></span> | ||
| 38 | + <span class="tl-yzx">已执行</span> | ||
| 39 | + <span class="tl-xxfc">消息发出</span> | ||
| 40 | + <span class="tl-xxsd">消息收到</span> | ||
| 41 | + <span class="tl-xxrd">消息阅读</span> | ||
| 42 | + </div> | ||
| 43 | + </div> | ||
| 44 | + </script> | ||
| 45 | +</div> |
src/main/resources/static/real_control_v3/fragments/line_schedule/sch_table.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <script id="line-schedule-table-temp" type="text/html"> | ||
| 3 | + <div class="schedule-wrap {{if dir==0}}up{{else}}down{{/if}}"> | ||
| 4 | + <h3 class="header-title"> | ||
| 5 | + {{if dir==0}} | ||
| 6 | + {{line.startStationName}} | ||
| 7 | + {{else}} | ||
| 8 | + {{line.endStationName}} | ||
| 9 | + {{/if}} | ||
| 10 | + <i class="uk-icon-question-circle uk-icon-hover"></i> | ||
| 11 | + <div class="fixed_legend"> | ||
| 12 | + <div> | ||
| 13 | + <span class="tl-xxfc">消息发出</span> | ||
| 14 | + <span class="tl-xxsd">消息收到</span> | ||
| 15 | + <span class="tl-xxrd">消息阅读</span> | ||
| 16 | + | ||
| 17 | + <span class="tl-wd">误点</span> | ||
| 18 | + <span class="tl-zzzx">正在执行</span> | ||
| 19 | + <span class="tl-qrlb"></span> | ||
| 20 | + <span class="tl-yzx">已执行</span> | ||
| 21 | + <a> | ||
| 22 | + <i class="uk-icon-angle-double-up fixed_legend_close"></i> | ||
| 23 | + </a> | ||
| 24 | + </div> | ||
| 25 | + </div> | ||
| 26 | + <i class="uk-icon-eye uk-icon-hover ct_eye_icon"></i> | ||
| 27 | + <div class="search_sch_panel"> | ||
| 28 | + <form class="uk-form" onsubmit="javascript:return false;"> | ||
| 29 | + <div class="uk-autocomplete sch-search-autocom"> | ||
| 30 | + <div class="uk-form-icon"> | ||
| 31 | + <i class="uk-icon-search"></i> | ||
| 32 | + <input type="text" placeholder="搜索"> | ||
| 33 | + <i class="cancel uk-icon-times-circle" data-uk-tooltip="{pos:'right'}" title="取消过滤"></i> | ||
| 34 | + </div> | ||
| 35 | + </div> | ||
| 36 | + </form> | ||
| 37 | + </div> | ||
| 38 | + </h3> | ||
| 39 | + <div class="schedule-body"> | ||
| 40 | + <div class="ct_table_wrap"> | ||
| 41 | + <div class="ct_table line-schedule-table"> | ||
| 42 | + <div class="ct_table_head"> | ||
| 43 | + <dl> | ||
| 44 | + <dt>序号</dt> | ||
| 45 | + <dt>路牌</dt> | ||
| 46 | + <dt>车辆</dt> | ||
| 47 | + <dt>应到</dt> | ||
| 48 | + <dt>实到</dt> | ||
| 49 | + <dt sort-field>计发</dt> | ||
| 50 | + <dt sort-field>待发</dt> | ||
| 51 | + <dt>实发</dt> | ||
| 52 | + <dt>原因</dt> | ||
| 53 | + </dl> | ||
| 54 | + </div> | ||
| 55 | + <div class="ct_table_body"> | ||
| 56 | + {{each list as sch i}} | ||
| 57 | + <dl data-id="{{sch.id}}"> | ||
| 58 | + <dd class="seq_no">{{i + 1}}</dd> | ||
| 59 | + <dd class="lpName"><a>{{sch.lpName}}</a></dd> | ||
| 60 | + <dd data-nbbm="{{sch.clZbh}}" | ||
| 61 | + class="{{if sch.directiveState == 60}}tl-xxfc{{else if sch.directiveState == 100}}tl-xxsd{{else if sch.directiveState == 200}}tl-xxrd{{/if}}"> | ||
| 62 | + {{sch.clZbh}} | ||
| 63 | + </dd> | ||
| 64 | + <dd>{{sch.qdzArrDatejh}}</dd> | ||
| 65 | + <dd>{{sch.qdzArrDatesj}}</dd> | ||
| 66 | + <dd data-sort-val={{sch.fcsjT}}> | ||
| 67 | + {{sch.fcsj}} | ||
| 68 | + {{if sch.bcType == "out"}} | ||
| 69 | + <span class="uk-badge uk-badge-success out">出场</span> | ||
| 70 | + {{else if sch.bcType == "in"}} | ||
| 71 | + <span class="uk-badge uk-badge-warning in">进场</span> | ||
| 72 | + {{else if sch.bcType == "venting"}} | ||
| 73 | + <span class="uk-badge uk-badge-danger">直放</span> | ||
| 74 | + {{else if sch.bcType == "major"}} | ||
| 75 | + <span class="uk-badge uk-badge-danger">放站</span> | ||
| 76 | + {{else if sch.bcType == "region"}} | ||
| 77 | + <span class="uk-badge sch_region">区间</span> | ||
| 78 | + {{else if sch.bcType == "ldks"}} | ||
| 79 | + <span class="uk-badge sch_ldks">空驶</span> | ||
| 80 | + {{/if}} | ||
| 81 | + {{if sch.sflj}} | ||
| 82 | + <span class="uk-badge uk-badge-danger">临加</span> | ||
| 83 | + {{/if}} | ||
| 84 | + {{if sch.cTasks.length > 0}} | ||
| 85 | + <span class="uk-badge uk-badge-notification c_task {{if sch.c_t_mileage_status==-1}}c_task_mileage_error{{/if}}">{{sch.cTasks.length}}</span> | ||
| 86 | + {{/if}} | ||
| 87 | + </dd> | ||
| 88 | + <dd data-sort-val={{sch.dfsjT}} dbclick-val="{{sch.dfsj}}"> | ||
| 89 | + {{sch.dfsj}} | ||
| 90 | + {{if sch.late2}} | ||
| 91 | + <span class="late-badge">?+{{sch.lateMinute}}</span> | ||
| 92 | + {{/if}} | ||
| 93 | + </dd> | ||
| 94 | + <dd data-uk-observe class=" | ||
| 95 | + {{if sch.status==-1}} | ||
| 96 | + tl-qrlb | ||
| 97 | + {{else if sch.status==2}} | ||
| 98 | + tl-yzx | ||
| 99 | + {{else if sch.status==1}} | ||
| 100 | + tl-zzzx | ||
| 101 | + {{else if sch.status == 0 && sch.late}} | ||
| 102 | + tl-wd | ||
| 103 | + {{/if}} fcsjActualCell"> | ||
| 104 | + {{sch.fcsjActual}}<span class="fcsj-diff">{{sch.fcsj_diff}}</span> | ||
| 105 | + </dd> | ||
| 106 | + <dd data-uk-observe> | ||
| 107 | + <span title="{{sch.remarks}}" | ||
| 108 | + data-uk-tooltip="{pos:'top-left'}">{{sch.remarks}}</span> | ||
| 109 | + </dd> | ||
| 110 | + </dl> | ||
| 111 | + {{/each}} | ||
| 112 | + </div> | ||
| 113 | + </div> | ||
| 114 | + </div> | ||
| 115 | + </div> | ||
| 116 | + </div> | ||
| 117 | + </script> | ||
| 118 | + | ||
| 119 | + <script id="line-schedule-fcsj-temp" type="text/html"> | ||
| 120 | + <dd data-sort-val={{fcsjT}}> | ||
| 121 | + {{fcsj}} | ||
| 122 | + {{if bcType == "out"}} | ||
| 123 | + <span class="uk-badge uk-badge-success out">出场</span> | ||
| 124 | + {{else if bcType == "in"}} | ||
| 125 | + <span class="uk-badge uk-badge-warning in">进场</span> | ||
| 126 | + {{else if bcType == "venting"}} | ||
| 127 | + <span class="uk-badge uk-badge-danger">直放</span> | ||
| 128 | + {{else if bcType == "major"}} | ||
| 129 | + <span class="uk-badge uk-badge-danger">放站</span> | ||
| 130 | + {{else if bcType == "region"}} | ||
| 131 | + <span class="uk-badge sch_region">区间</span> | ||
| 132 | + {{else if bcType == "ldks"}} | ||
| 133 | + <span class="uk-badge sch_ldks">空驶</span> | ||
| 134 | + {{/if}} | ||
| 135 | + {{if sflj}} | ||
| 136 | + <span class="uk-badge uk-badge-danger">临加</span> | ||
| 137 | + {{/if}} | ||
| 138 | + {{if cTasks.length > 0}} | ||
| 139 | + <span class="uk-badge uk-badge-notification c_task {{if c_t_mileage_status==-1}}c_task_mileage_error{{/if}}">{{cTasks.length}}</span> | ||
| 140 | + {{/if}} | ||
| 141 | + </dd> | ||
| 142 | + </script> | ||
| 143 | + | ||
| 144 | + <script id="line-schedule-sfsj-temp" type="text/html"> | ||
| 145 | + <dd data-uk-observe class=" | ||
| 146 | + {{if status==-1}} | ||
| 147 | + tl-qrlb | ||
| 148 | + {{else if status==2}} | ||
| 149 | + tl-yzx | ||
| 150 | + {{else if status==1}} | ||
| 151 | + tl-zzzx | ||
| 152 | + {{else if status == 0 && late}} | ||
| 153 | + tl-wd | ||
| 154 | + {{/if}} fcsjActualCell"> | ||
| 155 | + {{fcsjActual}}<span class="fcsj-diff">{{fcsj_diff}}</span> | ||
| 156 | + </dd> | ||
| 157 | + </script> | ||
| 158 | + | ||
| 159 | + <script id="line-schedule-nbbm-temp" type="text/html"> | ||
| 160 | + <dd data-nbbm="{{clZbh}}" | ||
| 161 | + class="{{if directiveState == 60}}tl-xxfc{{else if directiveState == 100}}tl-xxsd{{else if directiveState == 200}}tl-xxrd{{/if}}"> | ||
| 162 | + {{clZbh}} | ||
| 163 | + </dd> | ||
| 164 | + </script> | ||
| 165 | + | ||
| 166 | + <script id="sfsj_sch-detail-temp" type="text/html"> | ||
| 167 | + <ul class="sfsj-sch-detail"> | ||
| 168 | + <li><span>路牌:</span>{{lpName}}</li> | ||
| 169 | + <li><span>车辆:</span>{{clZbh}}</li> | ||
| 170 | + <li><span>计发:</span>{{fcsj}}</li> | ||
| 171 | + <li><span>实发:</span>{{fcsjActual}}</li> | ||
| 172 | + <li><span>计达:</span>{{zdsj}}</li> | ||
| 173 | + <li><span>实达:</span>{{zdsjActual}}</li> | ||
| 174 | + <li><span>驾驶员:</span>{{jGh}}/{{jName}}</li> | ||
| 175 | + <li><span>售票员:</span>{{sGh}}/{{sName}}</li> | ||
| 176 | + <li><span>终点站:</span>{{zdzName}}</li> | ||
| 177 | + </ul> | ||
| 178 | + </script> | ||
| 179 | + | ||
| 180 | + <script id="last-sch-sunken-temp" type="text/html"> | ||
| 181 | + <div class="last-sch-sunken"> | ||
| 182 | + <span class="_badge">{{zdsj}}/{{zdsjActual}}</span> | ||
| 183 | + </div> | ||
| 184 | + </script> | ||
| 185 | + | ||
| 186 | + <script id="sch-lp-mileage-tip-temp" type="text/html"> | ||
| 187 | + {{each data as obj i}} | ||
| 188 | + {{if i > 0}}<hr>{{/if}} | ||
| 189 | + | ||
| 190 | + <h5 class="_title"> <span class="lp_name">{{lpName}}</span> <a>{{obj.key}}</a></h5> | ||
| 191 | + <div class="LD_item"> | ||
| 192 | + <span>营运:<a>{{obj.serviceMileage}}</a></span> | ||
| 193 | + <span>烂班:<a>{{obj.destroyMileage}}</a></span> | ||
| 194 | + <span>空驶:<a>{{obj.emptyMileage}}</a></span> | ||
| 195 | + </div> | ||
| 196 | + {{/each}} | ||
| 197 | + </script> | ||
| 198 | +</div> |
src/main/resources/static/real_control_v3/fragments/line_schedule/sys_mailbox.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <script id="sys-note-80-temp" type="text/html"> | ||
| 3 | + <div class="uk-width-medium-1-1 sys-note-80 sys-mail-item" data-id={{id}} data-schid="{{schId}}"> | ||
| 4 | + <div class="uk-panel uk-panel-box uk-panel-box-primary"> | ||
| 5 | + <h4 class="uk-panel-title">{{data.nbbm}} {{text}}</h4> | ||
| 6 | + <code>{{dateStr}}</code> | ||
| 7 | + <div class="uk-button-group"> | ||
| 8 | + <button class="uk-button uk-button-mini uk-button-primary">同意</button> | ||
| 9 | + <button class="uk-button uk-button-mini reject">不同意</button> | ||
| 10 | + <a class="edit_link" data-id="{{schId}}" data-line="{{data.lineId}}" >编辑</a> | ||
| 11 | + </div> | ||
| 12 | + </div> | ||
| 13 | + </div> | ||
| 14 | + </script> | ||
| 15 | + | ||
| 16 | + <script id="sys-note-42-temp" type="text/html"> | ||
| 17 | + <div class="uk-width-medium-1-1 sys-note-42 sys-mail-item" id="{{domId}}" data-id="{{t.id}}"> | ||
| 18 | + <div class="uk-panel uk-panel-box uk-panel-box-secondary"> | ||
| 19 | + <h5 class="title"> | ||
| 20 | + {{t.fcsjActual}} {{t.clZbh}} 已由 {{t.qdzName}} 发出,执行班次 {{t.dfsj}} | ||
| 21 | + </h5> | ||
| 22 | + <code>{{t.fcsjActual}}</code> | ||
| 23 | + <div class="uk-button-group"> | ||
| 24 | + <a class="uk-button uk-button-mini uk-button-primary" data-line="{{t.xlBm}}">确定</a> | ||
| 25 | + <a class="cancel_link" data-id="{{t.id}}" data-line="{{t.xlBm}}"><i class="uk-icon-remove"></i> 撤销</a> | ||
| 26 | + </div> | ||
| 27 | + </div> | ||
| 28 | + </script> | ||
| 29 | + | ||
| 30 | + <script id="sys-note-42_1-temp" type="text/html"> | ||
| 31 | + <div class="uk-width-medium-1-1 sys-note-42 sys-mail-item" id="{{domId}}" data-id="{{t.id}}"> | ||
| 32 | + <div class="uk-panel uk-panel-box uk-panel-box-secondary"> | ||
| 33 | + <h5 class="title"> | ||
| 34 | + {{t.zdsjActual}} {{t.clZbh}} 到达 {{t.zdzName}};已完成 {{finish}} 个班次; | ||
| 35 | + {{if nt != null}} | ||
| 36 | + 下一发车时间 {{nt.dfsj}};由{{nt.qdzName}} 发往 {{nt.zdzName}};应到{{nt.zdsj}} | ||
| 37 | + {{else}} | ||
| 38 | + 已完成当日所有班次。 | ||
| 39 | + {{/if}} | ||
| 40 | + </h5> | ||
| 41 | + <code>{{t.zdsjActual}}</code> | ||
| 42 | + <div class="uk-button-group"> | ||
| 43 | + <a class="uk-button uk-button-mini uk-button-primary" data-line="{{t.xlBm}}">确定</a> | ||
| 44 | + <a class="edit_link" data-type="1" data-id="{{t.id}}" data-line="{{t.xlBm}}">编辑</a> | ||
| 45 | + <a class="cancel_link" data-type="1" data-id="{{t.id}}" data-line="{{t.xlBm}}"><i class="uk-icon-remove"></i> 撤销</a> | ||
| 46 | + </div> | ||
| 47 | + </div> | ||
| 48 | + </div> | ||
| 49 | + </script> | ||
| 50 | +</div> |
src/main/resources/static/real_control_v3/fragments/north/tabs.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <script id="north-tabs-temp" type="text/html"> | ||
| 3 | + <ul class="uk-tab" data-uk-switcher="{connect:'#main-tab-content', swiping: false}" > | ||
| 4 | + <li class="uk-active" ><a>主页</a></li> | ||
| 5 | + <li id="north_tabs_map_btn"><a>地图</a></li> | ||
| 6 | + {{each list as line i}} | ||
| 7 | + <li class="tab-line {{line.destroy==1?'destroy':''}}" data-code="{{line.lineCode}}"><a>{{line.name}}(<span id="badge_untreated_num_{{line.lineCode}}">0</span>, <span id="badge_yfwf_num_{{line.lineCode}}">0</span>)</a></li> | ||
| 8 | + {{/each}} | ||
| 9 | + </ul> | ||
| 10 | + </script> | ||
| 11 | + | ||
| 12 | + <script id="north-tab-content-temp" type="text/html"> | ||
| 13 | + <ul id="main-tab-content" class="uk-switcher uk-margin " > | ||
| 14 | + <li class="uk-active home-panel">主页</li> | ||
| 15 | + <li class="map-panel">地图未渲染</li> | ||
| 16 | + {{each list as line i}} | ||
| 17 | + <li class="line_schedule" data-id="{{line.lineCode}}">{{line.name}} 未渲染</li> | ||
| 18 | + {{/each}} | ||
| 19 | + </ul> | ||
| 20 | + </script> | ||
| 21 | +</div> |
src/main/resources/static/real_control_v3/fragments/north/toolbar.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <script id="north-toolbar-temp" type="text/html"> | ||
| 3 | + <div class="uk-margin" id="north_toolbar_panel"> | ||
| 4 | + <nav class="uk-navbar"> | ||
| 5 | + <!--<a class="uk-navbar-brand" id="navbar_user_detail_link" title="点击切换账号">--> | ||
| 6 | + <!--<span><i class="uk-icon-user"></i> <span id="north_toolbar_user">{{user.userName}}</span></span><i class="uk-icon-ellipsis-v"></i>--> | ||
| 7 | + <!--</a>--> | ||
| 8 | + <ul class="uk-navbar-nav"> | ||
| 9 | + {{each list as obj i}} | ||
| 10 | + <li class="uk-parent " data-uk-dropdown="{{if obj.columns}}{pos:'top-right'}{{/if}}" aria-haspopup="true" aria-expanded="false"> | ||
| 11 | + <a>{{obj.text}} <i class="uk-icon-caret-down"></i></a> | ||
| 12 | + {{if obj.children != null}} | ||
| 13 | + <div class="uk-dropdown uk-dropdown-navbar uk-dropdown-bottom" style="top: 40px; left: 0px;"> | ||
| 14 | + <ul class="uk-nav uk-nav-navbar uk-dropdown-close"> | ||
| 15 | + {{each obj.children as c j}} | ||
| 16 | + {{if c.header}} | ||
| 17 | + <li class="uk-nav-header">{{c.text}}</li> | ||
| 18 | + | ||
| 19 | + {{else if c.divider}} | ||
| 20 | + <li class="uk-nav-divider"></li> | ||
| 21 | + {{else}} | ||
| 22 | + <li class="event"><a data-event="{{c.event}}">{{c.text}}</a></li> | ||
| 23 | + {{/if}} | ||
| 24 | + {{/each}} | ||
| 25 | + </ul> | ||
| 26 | + </div> | ||
| 27 | + {{else if obj.columns}} | ||
| 28 | + <div class="uk-dropdown {{obj.clazz}}"> | ||
| 29 | + <div class="uk-grid uk-dropdown-grid"> | ||
| 30 | + {{each obj.grid as cls s}} | ||
| 31 | + <div class="{{obj.cls_class}}"> | ||
| 32 | + <ul class="uk-nav uk-nav-dropdown uk-panel uk-dropdown-close"> | ||
| 33 | + {{each cls as c z}} | ||
| 34 | + {{if c.header}} | ||
| 35 | + <li class="uk-nav-header">{{c.text}}</li> | ||
| 36 | + | ||
| 37 | + {{else if c.divider}} | ||
| 38 | + <li class="uk-nav-divider"></li> | ||
| 39 | + {{else}} | ||
| 40 | + <li class="event"> | ||
| 41 | + <a data-event="{{c.event}}"> | ||
| 42 | + {{if c.icon != null}} | ||
| 43 | + <i class="{{c.icon}}"></i> | ||
| 44 | + {{/if}} | ||
| 45 | + {{c.text}}</a> | ||
| 46 | + </li> | ||
| 47 | + {{/if}} | ||
| 48 | + {{/each}} | ||
| 49 | + </ul> | ||
| 50 | + </div> | ||
| 51 | + {{/each}} | ||
| 52 | + </div> | ||
| 53 | + </div> | ||
| 54 | + {{/if}} | ||
| 55 | + </li> | ||
| 56 | + {{/each}} | ||
| 57 | + </ul> | ||
| 58 | + <a class="uk-navbar-brand op-beijingtime-time" > | ||
| 59 | + <span></span> | ||
| 60 | + </a> | ||
| 61 | + <div class="uk-navbar-content uk-navbar-flip uk-hidden-small" style="padding-left: 0;"> | ||
| 62 | + <div class="uk-button-group"> | ||
| 63 | + <button class="uk-button uk-button-danger exit-system">退出线调</button> | ||
| 64 | + </div> | ||
| 65 | + </div> | ||
| 66 | + </nav> | ||
| 67 | + </div> | ||
| 68 | + </script> | ||
| 69 | + | ||
| 70 | + <script id="north-toolbar-electron-temp" type="text/html"> | ||
| 71 | + <div class="uk-margin" id="north_toolbar_panel"> | ||
| 72 | + <nav class="uk-navbar"> | ||
| 73 | + <a class="uk-navbar-brand" > | ||
| 74 | + <span><i class="uk-icon-user"></i> <span id="north_toolbar_user">{{user.userName}}</span>,在线</span><i class="uk-icon-ellipsis-v"></i> | ||
| 75 | + </a> | ||
| 76 | + <ul class="uk-navbar-nav"> | ||
| 77 | + {{each list as obj i}} | ||
| 78 | + <li class="uk-parent " data-uk-dropdown="{{if obj.columns}}{pos:'top-right'}{{/if}}" aria-haspopup="true" aria-expanded="false"> | ||
| 79 | + <a>{{obj.text}} <i class="uk-icon-caret-down"></i></a> | ||
| 80 | + {{if obj.children != null}} | ||
| 81 | + <div class="uk-dropdown uk-dropdown-navbar uk-dropdown-bottom" style="top: 40px; left: 0px;"> | ||
| 82 | + <ul class="uk-nav uk-nav-navbar uk-dropdown-close"> | ||
| 83 | + {{each obj.children as c j}} | ||
| 84 | + {{if c.header}} | ||
| 85 | + <li class="uk-nav-header">{{c.text}}</li> | ||
| 86 | + | ||
| 87 | + {{else if c.divider}} | ||
| 88 | + <li class="uk-nav-divider"></li> | ||
| 89 | + {{else}} | ||
| 90 | + <li class="event"><a data-event="{{c.event}}">{{c.text}}</a></li> | ||
| 91 | + {{/if}} | ||
| 92 | + {{/each}} | ||
| 93 | + </ul> | ||
| 94 | + </div> | ||
| 95 | + {{else if obj.columns}} | ||
| 96 | + <div class="uk-dropdown {{obj.clazz}}"> | ||
| 97 | + <div class="uk-grid uk-dropdown-grid"> | ||
| 98 | + {{each obj.grid as cls s}} | ||
| 99 | + <div class="{{obj.cls_class}}"> | ||
| 100 | + <ul class="uk-nav uk-nav-dropdown uk-panel uk-dropdown-close"> | ||
| 101 | + {{each cls as c z}} | ||
| 102 | + {{if c.header}} | ||
| 103 | + <li class="uk-nav-header">{{c.text}}</li> | ||
| 104 | + | ||
| 105 | + {{else if c.divider}} | ||
| 106 | + <li class="uk-nav-divider"></li> | ||
| 107 | + {{else}} | ||
| 108 | + <li class="event"> | ||
| 109 | + <a data-event="{{c.event}}"> | ||
| 110 | + {{if c.icon != null}} | ||
| 111 | + <i class="{{c.icon}}"></i> | ||
| 112 | + {{/if}} | ||
| 113 | + {{c.text}}</a> | ||
| 114 | + </li> | ||
| 115 | + {{/if}} | ||
| 116 | + {{/each}} | ||
| 117 | + </ul> | ||
| 118 | + </div> | ||
| 119 | + {{/each}} | ||
| 120 | + </div> | ||
| 121 | + </div> | ||
| 122 | + {{/if}} | ||
| 123 | + </li> | ||
| 124 | + {{/each}} | ||
| 125 | + </ul> | ||
| 126 | + <div class="uk-navbar-content uk-navbar-flip uk-hidden-small" style="padding-left: 0;"> | ||
| 127 | + <div class="icon-item" id="mnavbarIconBtnMIN" data-uk-tooltip="{pos:'bottom'}" title="最小化"> | ||
| 128 | + <img src="/real_control_v2/assets/imgs/icon/minus.png"> | ||
| 129 | + </div> | ||
| 130 | + | ||
| 131 | + <div class="icon-item" id="mnavbarIconBtnCLOSE" data-uk-tooltip="{pos:'bottom'}" title="退出系统"> | ||
| 132 | + <img src="/real_control_v2/assets/imgs/icon/remove.png"> | ||
| 133 | + </div> | ||
| 134 | + </div> | ||
| 135 | + </nav> | ||
| 136 | + </div> | ||
| 137 | + </script> | ||
| 138 | +</div> |
src/main/resources/static/real_control_v3/js/data/data_basic.js
0 → 100644
| 1 | +/* 基础数据管理模块 */ | ||
| 2 | + | ||
| 3 | +var gb_data_basic = (function () { | ||
| 4 | + | ||
| 5 | + var stationRoutes, lineCode2NameAll, lineInformations, nbbm2deviceMap, device2nbbmMap, allPersonnel, svgAttrs; | ||
| 6 | + var ep = EventProxy.create("stationRoutes", "lineCode2Name", "lineInformations", "nbbm2deviceId", "all_personnel", "svg_attrs" | ||
| 7 | + , function (routes, code2Name, informations, nbbm2device, all_personnel, svgAttrMap) { | ||
| 8 | + stationRoutes = routes; | ||
| 9 | + lineCode2NameAll = code2Name; | ||
| 10 | + lineInformations = informations; | ||
| 11 | + nbbm2deviceMap = nbbm2device; | ||
| 12 | + device2nbbmMap = gb_common.inverse(nbbm2deviceMap); | ||
| 13 | + allPersonnel = all_personnel; | ||
| 14 | + svgAttrs = svgAttrMap; | ||
| 15 | + gb_main_ep.emitLater('data-basic'); | ||
| 16 | + }); | ||
| 17 | + | ||
| 18 | + var storage = window.localStorage; | ||
| 19 | + //激活的线路 | ||
| 20 | + var activeLines = JSON.parse(storage.getItem('lineControlItems')); | ||
| 21 | + //lineCode to line object | ||
| 22 | + var codeToLine = {}; | ||
| 23 | + //lineCode idx string | ||
| 24 | + var line_idx = (function () { | ||
| 25 | + if(!activeLines){ | ||
| 26 | + var modal = UIkit.modal.blockUI("请选择线路"); | ||
| 27 | + window.location.href = '/pages/control/lineallot_v3/iframe_wrap.html'; | ||
| 28 | + } | ||
| 29 | + var str = ''; | ||
| 30 | + for (var i = 0, item; item = activeLines[i++];) { | ||
| 31 | + str += (',' + item.lineCode); | ||
| 32 | + codeToLine[item.lineCode] = item; | ||
| 33 | + } | ||
| 34 | + return str.substr(1); | ||
| 35 | + })(); | ||
| 36 | + | ||
| 37 | + //站点路由 | ||
| 38 | + gb_common.$get('/freeLogin/stationroute/multiLine', {lineIds: line_idx}, function (rs) { | ||
| 39 | + var list = rs.list;//JSON.parse(rs.list); | ||
| 40 | + var routeData = gb_common.groupBy(list, 'lineCode'); | ||
| 41 | + //排序 | ||
| 42 | + for (var lineCode in routeData) { | ||
| 43 | + routeData[lineCode].sort(stationRouteSort); | ||
| 44 | + } | ||
| 45 | + ep.emit('stationRoutes', routeData); | ||
| 46 | + }); | ||
| 47 | + | ||
| 48 | + //线路标准信息 | ||
| 49 | + gb_common.$get('/freeLogin/lineInformation/line/multi', {lineCodes: line_idx}, function (rs) { | ||
| 50 | + var informations = {}; | ||
| 51 | + $.each(rs, function () { | ||
| 52 | + informations[this.line.lineCode] = this; | ||
| 53 | + delete this['line']; | ||
| 54 | + }); | ||
| 55 | + ep.emit('lineInformations', informations); | ||
| 56 | + }); | ||
| 57 | + | ||
| 58 | + //人员信息 | ||
| 59 | + loadAllPersonnel(function (data) { | ||
| 60 | + ep.emit('all_personnel', data); | ||
| 61 | + }); | ||
| 62 | + function loadAllPersonnel(cb) { | ||
| 63 | + $.get('/freeLogin/basic/all_personnel_py', function (rs) { | ||
| 64 | + //转换成自动补全组件需要的数据 | ||
| 65 | + var data = [], code; | ||
| 66 | + for(var i =0, p; p = rs[i++];){ | ||
| 67 | + code = p['workId'].indexOf('-')!=-1?p['workId'].split('-')[1]:p['workId']; | ||
| 68 | + data.push({ | ||
| 69 | + value: code + '/' + p.name, | ||
| 70 | + fullChars: p.fullChars.toUpperCase(), | ||
| 71 | + camelChars: p.camelChars.toUpperCase() | ||
| 72 | + }); | ||
| 73 | + } | ||
| 74 | + cb && cb(data); | ||
| 75 | + }); | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + var carparks = {}; | ||
| 79 | + //停车场数据 | ||
| 80 | + gb_common.$get('/freeLogin/realMap/carParkSpatialData', {}, function (rs) { | ||
| 81 | + rs.list.sort(function (a, b) { | ||
| 82 | + return a.parkName.localeCompare(b.parkName); | ||
| 83 | + }); | ||
| 84 | + $.each(rs.list, function () { | ||
| 85 | + carparks[this.parkCode] = this; | ||
| 86 | + }); | ||
| 87 | + }); | ||
| 88 | + | ||
| 89 | + //车辆数据 | ||
| 90 | + var carsArray; | ||
| 91 | + $.get('/freeLogin/basic/cars?t=' + Math.random(), function (rs) { | ||
| 92 | + carsArray = rs; | ||
| 93 | + }); | ||
| 94 | + | ||
| 95 | + var getCarparkByCode = function (code) { | ||
| 96 | + return carparks[code]; | ||
| 97 | + }; | ||
| 98 | + | ||
| 99 | + //line code to name | ||
| 100 | + $.get('/freeLogin/basic/lineCode2Name', function (rs) { | ||
| 101 | + ep.emit('lineCode2Name', rs); | ||
| 102 | + }); | ||
| 103 | + | ||
| 104 | + //nbbm to device id | ||
| 105 | + $.get('/freeLogin/basic/nbbm2deviceId', function (rs) { | ||
| 106 | + ep.emit('nbbm2deviceId', rs); | ||
| 107 | + }); | ||
| 108 | + //nbbm to 车牌号 | ||
| 109 | + var nbbm2PlateMap; | ||
| 110 | + $.get('/freeLogin/basic/nbbm2PlateNo', function (rs) { | ||
| 111 | + nbbm2PlateMap = rs; | ||
| 112 | + }); | ||
| 113 | + | ||
| 114 | + //模拟图属性数据 | ||
| 115 | + gb_common.$get('/freeLogin/realSchedule/svgAttr', {idx: line_idx}, function (rs) { | ||
| 116 | + var data = {}; | ||
| 117 | + $.each(rs.list, function () { | ||
| 118 | + this.hideStations = JSON.parse(this.hideStations); | ||
| 119 | + this.nicknames = JSON.parse(this.nicknames); | ||
| 120 | + data[this.lineCode] = this; | ||
| 121 | + }); | ||
| 122 | + ep.emit('svg_attrs', data); | ||
| 123 | + }); | ||
| 124 | + | ||
| 125 | + //站点和停车场历时、公里对照数据 | ||
| 126 | + var stat_park_data; | ||
| 127 | + var load_stat_park_data = function () { | ||
| 128 | + $.get('/freeLogin/basic/station2ParkData?t='+Math.random(), {idx: line_idx}, function (rs) { | ||
| 129 | + stat_park_data = rs; | ||
| 130 | + }); | ||
| 131 | + } | ||
| 132 | + load_stat_park_data(); | ||
| 133 | + | ||
| 134 | + function findLineByCodes(codeArr) { | ||
| 135 | + var rs = []; | ||
| 136 | + $.each(codeArr, function () { | ||
| 137 | + rs.push(codeToLine[this]); | ||
| 138 | + }); | ||
| 139 | + return rs; | ||
| 140 | + } | ||
| 141 | + | ||
| 142 | + var findCodeByLinename = function (name) { | ||
| 143 | + for (var code in lineCode2NameAll) { | ||
| 144 | + if (name == lineCode2NameAll[code]) | ||
| 145 | + return code; | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + return null; | ||
| 149 | + }; | ||
| 150 | + | ||
| 151 | + var getLineInformation = function (lineCode) { | ||
| 152 | + return lineInformations[lineCode]; | ||
| 153 | + }; | ||
| 154 | + | ||
| 155 | + var stationRouteSort = function (a, b) { | ||
| 156 | + return a.stationRouteCode - b.stationRouteCode; | ||
| 157 | + }; | ||
| 158 | + | ||
| 159 | + /** | ||
| 160 | + * 常用的备注补全列表 | ||
| 161 | + */ | ||
| 162 | + var remarksArray = ['保养', '故障', '肇事', '加油', '维修', '援外', '路阻' | ||
| 163 | + , '故障(离合器坏)', '故障,(方向盘坏)', '故障(排挡坏)', '故障(门坏)', '故障(雨刮器坏)','故障(刹车坏)', '故障(气打不上)' | ||
| 164 | + ,'故障(整车无电)', '故障(故障灯常亮)', '故障(警报灯亮)', '故障(玻璃坏)', '故障(反光镜坏)', '故障(发电机坏)', '故障(漏防冻液)' | ||
| 165 | + , '故障(漏水)','故障(轮胎坏)', '故障(无动力)', '故障(喷机油)', '故障(水温高)', '保养(一级保养)' | ||
| 166 | + , '保养(二级保养)', '保养(三级保养)', '换车出场', '临加进场', '临加出场']; | ||
| 167 | + var remarksMapps = []; | ||
| 168 | + $.each(remarksArray, function (i, t) { | ||
| 169 | + remarksMapps.push({ | ||
| 170 | + value: t, | ||
| 171 | + fullChars: pinyin.getFullChars(t).toUpperCase(), | ||
| 172 | + camelChars: pinyin.getCamelChars(t) | ||
| 173 | + }); | ||
| 174 | + }); | ||
| 175 | + | ||
| 176 | + //文件载入完毕 | ||
| 177 | + res_load_ep.emitLater('load_data_basic'); | ||
| 178 | + | ||
| 179 | + return { | ||
| 180 | + activeLines: activeLines, | ||
| 181 | + line_idx: line_idx, | ||
| 182 | + codeToLine: codeToLine, | ||
| 183 | + nbbm2deviceMap: function () { | ||
| 184 | + return nbbm2deviceMap; | ||
| 185 | + }, | ||
| 186 | + device2nbbmMap: function () { | ||
| 187 | + return device2nbbmMap; | ||
| 188 | + }, | ||
| 189 | + getLineInformation: getLineInformation, | ||
| 190 | + allInformations: function () { | ||
| 191 | + return lineInformations; | ||
| 192 | + }, | ||
| 193 | + stationRoutes: function (lineCode) { | ||
| 194 | + return stationRoutes[lineCode] | ||
| 195 | + }, | ||
| 196 | + findLineByCodes: findLineByCodes, | ||
| 197 | + lineCode2NameAll: function () { | ||
| 198 | + return lineCode2NameAll | ||
| 199 | + }, | ||
| 200 | + allPersonnel: function () { | ||
| 201 | + return allPersonnel; | ||
| 202 | + }, | ||
| 203 | + findCodeByLinename: findCodeByLinename, | ||
| 204 | + getCarparkByCode: getCarparkByCode, | ||
| 205 | + getSvgAttr: function (lineCode) { | ||
| 206 | + return svgAttrs[lineCode]; | ||
| 207 | + }, | ||
| 208 | + setSvgAttr: function (attr) { | ||
| 209 | + attr.hideStations = JSON.parse(attr.hideStations); | ||
| 210 | + attr.nicknames = JSON.parse(attr.nicknames); | ||
| 211 | + svgAttrs[attr.lineCode] = attr; | ||
| 212 | + }, | ||
| 213 | + //是否是环线 | ||
| 214 | + isLoopLine: function (lineCode) { | ||
| 215 | + if(!stationRoutes[lineCode]) | ||
| 216 | + return false; | ||
| 217 | + var data = gb_common.groupBy(stationRoutes[lineCode], 'directions'); | ||
| 218 | + //下行只有2个站点 | ||
| 219 | + var len = data[0].length; | ||
| 220 | + if (len > 0 && data[1].length == 2) { | ||
| 221 | + var first = data[0][0], | ||
| 222 | + end = data[0][len - 1]; | ||
| 223 | + | ||
| 224 | + /*if(first.stationName != end.stationName) | ||
| 225 | + return false;*/ | ||
| 226 | + | ||
| 227 | + var fPoint = {latitude: first.station.gLaty, longitude: first.station.gLonx} | ||
| 228 | + , ePoint = {latitude: end.station.gLaty, longitude: end.station.gLonx}; | ||
| 229 | + | ||
| 230 | + //并且上行起终点距离200米内 | ||
| 231 | + if (geolib.getDistance(fPoint, ePoint) < 200) { | ||
| 232 | + return true; | ||
| 233 | + } | ||
| 234 | + } | ||
| 235 | + | ||
| 236 | + return false; | ||
| 237 | + }, | ||
| 238 | + //刷新员工信息 | ||
| 239 | + refreshAllPersonnel: function (cb) { | ||
| 240 | + loadAllPersonnel(function (data) { | ||
| 241 | + allPersonnel = data; | ||
| 242 | + cb && cb(); | ||
| 243 | + }); | ||
| 244 | + }, | ||
| 245 | + nbbm2PlateMap: function () { | ||
| 246 | + return nbbm2PlateMap; | ||
| 247 | + }, | ||
| 248 | + carsArray: function () { | ||
| 249 | + return carsArray; | ||
| 250 | + }, | ||
| 251 | + simpleParksArray: function () { | ||
| 252 | + var map = {}; | ||
| 253 | + for(var code in carparks) | ||
| 254 | + map[code] = carparks[code].parkName; | ||
| 255 | + return map; | ||
| 256 | + }, | ||
| 257 | + remarksMapps: function () { | ||
| 258 | + return remarksMapps; | ||
| 259 | + }, | ||
| 260 | + get_stat_park_data: function () { | ||
| 261 | + return stat_park_data; | ||
| 262 | + }, | ||
| 263 | + reload_stat_park_data: function () { | ||
| 264 | + load_stat_park_data(); | ||
| 265 | + } | ||
| 266 | + }; | ||
| 267 | +})(); |
src/main/resources/static/real_control_v3/js/data/data_gps.js
0 → 100644
| 1 | +/* gps 数据管理模块 */ | ||
| 2 | + | ||
| 3 | +var gb_data_gps = (function () { | ||
| 4 | + | ||
| 5 | + //fixed time refresh delay | ||
| 6 | + var delay = 1000 * 7; | ||
| 7 | + //deviceId ——> gps | ||
| 8 | + var realData = {}; | ||
| 9 | + //refresh after callback | ||
| 10 | + var refreshEventCallbacks = []; | ||
| 11 | + //register callback function | ||
| 12 | + var registerCallback = function (cb) { | ||
| 13 | + if (cb) | ||
| 14 | + refreshEventCallbacks.push(cb); | ||
| 15 | + }; | ||
| 16 | + | ||
| 17 | + var refresh = function (cb) { | ||
| 18 | + $.ajax({ | ||
| 19 | + url: '/freeLogin/gps/real/line', | ||
| 20 | + data: {lineCodes: gb_data_basic.line_idx}, | ||
| 21 | + dataType: 'json', | ||
| 22 | + success: function (rs) { | ||
| 23 | + //用定时的gps来检测session断开 | ||
| 24 | + if(rs.status && rs.status==407){ | ||
| 25 | + location.href = '/login.html'; | ||
| 26 | + return; | ||
| 27 | + } | ||
| 28 | + refreshData(rs); | ||
| 29 | + cb(); | ||
| 30 | + }, | ||
| 31 | + error: function (xr, t) { | ||
| 32 | + notify_err('刷新GPS失败,稍后重试' + t); | ||
| 33 | + cb(); | ||
| 34 | + } | ||
| 35 | + }); | ||
| 36 | + }; | ||
| 37 | + | ||
| 38 | + var refreshData = function (rs) { | ||
| 39 | + var old, addArr = [], | ||
| 40 | + upArr = [], | ||
| 41 | + upDownChange = []; | ||
| 42 | + | ||
| 43 | + var schArray; | ||
| 44 | + $.each(rs.gpsList, function () { | ||
| 45 | + old = realData[this.deviceId]; | ||
| 46 | + if (old) { | ||
| 47 | + if (this.timestamp > old.timestamp) { | ||
| 48 | + if (old.upDown != this.upDown) | ||
| 49 | + upDownChange.push(this); | ||
| 50 | + else | ||
| 51 | + upArr.push(this); | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + } else | ||
| 55 | + addArr.push(this); | ||
| 56 | + | ||
| 57 | + //班次信息 | ||
| 58 | + if (this.schId) { | ||
| 59 | + schArray = gb_schedule_table.findScheduleByLine(this.lineId); | ||
| 60 | + if (schArray) | ||
| 61 | + this.sch = schArray[this.schId]; | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + //时间格式化 | ||
| 65 | + this.dateStr = moment(this.timestamp).format('YYYY-MM-DD HH:mm:ss'); | ||
| 66 | + realData[this.deviceId] = this; | ||
| 67 | + }); | ||
| 68 | + | ||
| 69 | + //console.log('add array size: ' + addArr.length, 'up array size: ' + upArr.length); | ||
| 70 | + //CCCallFuncN | ||
| 71 | + $.each(refreshEventCallbacks, function (i, cb) { | ||
| 72 | + cb(addArr, upArr, upDownChange, rs.overspeedList); | ||
| 73 | + }); | ||
| 74 | + | ||
| 75 | + //超速数据回调 | ||
| 76 | + //console.log('超速,,,', rs.overspeedList); | ||
| 77 | + | ||
| 78 | + }; | ||
| 79 | + | ||
| 80 | + var startFixedTime; | ||
| 81 | + var fixedTimeRefresh = function () { | ||
| 82 | + if (startFixedTime) | ||
| 83 | + return; | ||
| 84 | + startFixedTime = true; | ||
| 85 | + | ||
| 86 | + (function () { | ||
| 87 | + var f = arguments.callee; | ||
| 88 | + refresh(function () { | ||
| 89 | + setTimeout(f, delay); | ||
| 90 | + }); | ||
| 91 | + })(); | ||
| 92 | + }; | ||
| 93 | + | ||
| 94 | + var gpsByLineCode = function (lineCode) { | ||
| 95 | + var rs = []; | ||
| 96 | + for (var device in realData) { | ||
| 97 | + if (realData[device].lineId == lineCode) | ||
| 98 | + rs.push(realData[device]); | ||
| 99 | + } | ||
| 100 | + return rs; | ||
| 101 | + }; | ||
| 102 | + | ||
| 103 | + var findOne = function (deviceId) { | ||
| 104 | + return realData[deviceId]; | ||
| 105 | + }; | ||
| 106 | + | ||
| 107 | + var findGpsByNbbm = function (nbbm) { | ||
| 108 | + return realData[gb_data_basic.nbbm2deviceMap()[nbbm]]; | ||
| 109 | + }; | ||
| 110 | + | ||
| 111 | + /** | ||
| 112 | + * 设备掉线事件 | ||
| 113 | + */ | ||
| 114 | + var deviceOffline = function (gps) { | ||
| 115 | + $.each(offlineCallbacks, function (i, cb) { | ||
| 116 | + cb(gps); | ||
| 117 | + }); | ||
| 118 | + }; | ||
| 119 | + | ||
| 120 | + //注册掉线事件回调函数 | ||
| 121 | + var offlineCallbacks = []; | ||
| 122 | + var registerOfflineCb = function (cb) { | ||
| 123 | + if (cb) | ||
| 124 | + offlineCallbacks.push(cb); | ||
| 125 | + }; | ||
| 126 | + | ||
| 127 | + return { | ||
| 128 | + fixedTimeRefresh: fixedTimeRefresh, | ||
| 129 | + registerCallback: registerCallback, | ||
| 130 | + allGps: realData, | ||
| 131 | + gpsByLineCode: gpsByLineCode, | ||
| 132 | + findOne: findOne, | ||
| 133 | + findGpsByNbbm: findGpsByNbbm, | ||
| 134 | + deviceOffline: deviceOffline, | ||
| 135 | + registerOfflineCb: registerOfflineCb | ||
| 136 | + }; | ||
| 137 | +})(); |
src/main/resources/static/real_control_v3/js/data/data_line_config.js
0 → 100644
| 1 | +/** | ||
| 2 | + * 线路配置信息 | ||
| 3 | + * @type {{}} | ||
| 4 | + */ | ||
| 5 | +var gb_data_line_config = (function () { | ||
| 6 | + | ||
| 7 | + var lineConfigMap; | ||
| 8 | + | ||
| 9 | + var storage = window.localStorage; | ||
| 10 | + var activeLines = JSON.parse(storage.getItem('lineControlItems')); | ||
| 11 | + var line_idx = (function () { | ||
| 12 | + var str = ''; | ||
| 13 | + for (var i = 0, item; item = activeLines[i++];) { | ||
| 14 | + str += (',' + item.lineCode); | ||
| 15 | + } | ||
| 16 | + return str.substr(1); | ||
| 17 | + })(); | ||
| 18 | + | ||
| 19 | + gb_common.$get('/freeLogin/lineConfig/findByIdx', {idx: line_idx}, function (rs) { | ||
| 20 | + lineConfigMap = {}; | ||
| 21 | + $.each(rs.list, function () { | ||
| 22 | + lineConfigMap[this.line.lineCode] = this; | ||
| 23 | + }); | ||
| 24 | + | ||
| 25 | + console.log('lineConfigMap', lineConfigMap); | ||
| 26 | + }); | ||
| 27 | + | ||
| 28 | + return { | ||
| 29 | + get: function (lineCode) { | ||
| 30 | + return lineConfigMap[lineCode]; | ||
| 31 | + } | ||
| 32 | + }; | ||
| 33 | +})(); | ||
| 0 | \ No newline at end of file | 34 | \ No newline at end of file |
src/main/resources/static/real_control_v3/js/data/gps_abnormal.js
0 → 100644
| 1 | +/** gps 信号异常状态,无效 | 越界 | 超速 | ||
| 2 | + * | ||
| 3 | + * | ||
| 4 | + * ########### 这个文件被废弃 ############## | ||
| 5 | + * | ||
| 6 | + * 前端计算略微有点卡顿, 交由后端计算 | ||
| 7 | + * */ | ||
| 8 | + | ||
| 9 | +var gb_gps_abnormal = (function () { | ||
| 10 | + | ||
| 11 | + //按线路分组的路段数据 | ||
| 12 | + var allRoads; | ||
| 13 | + | ||
| 14 | + //gps无效 | ||
| 15 | + var gpsInvalid = function (gps) { | ||
| 16 | + return gps.lat == 0 || gps.lon == 0; | ||
| 17 | + }; | ||
| 18 | + | ||
| 19 | + //越界 | ||
| 20 | + var threshold = 120; | ||
| 21 | + var gpsOutOfBounds = function (gps) { | ||
| 22 | + //进场班次不管 | ||
| 23 | + if (gps.sch && gps.sch.bcType == 'in') | ||
| 24 | + return; | ||
| 25 | + | ||
| 26 | + var roads = allRoads[gps.lineId + '_' + gps.upDown]; | ||
| 27 | + if (!roads) | ||
| 28 | + return; | ||
| 29 | + | ||
| 30 | + //最短距离 | ||
| 31 | + var min, distance; | ||
| 32 | + $.each(roads, function () { | ||
| 33 | + distance = minDistanceFromRoad(this.pos, gps); | ||
| 34 | + if (!min || min > distance) | ||
| 35 | + min = distance; | ||
| 36 | + }); | ||
| 37 | + | ||
| 38 | + //越界阈值 120米 | ||
| 39 | + if (min > threshold) { | ||
| 40 | + gps.abnormal = 'outBounds'; | ||
| 41 | + gps.outBoundsDistance = min; | ||
| 42 | + return true; | ||
| 43 | + } | ||
| 44 | + }; | ||
| 45 | + | ||
| 46 | + | ||
| 47 | + //线路限速数据 | ||
| 48 | + var lineSpeedLimit = {}; | ||
| 49 | + //超速 | ||
| 50 | + var overspeed = function (gps) { | ||
| 51 | + | ||
| 52 | + }; | ||
| 53 | + | ||
| 54 | + /** | ||
| 55 | + * 初始化数据 | ||
| 56 | + */ | ||
| 57 | + var initData = function () { | ||
| 58 | + //获取线路路段数据 | ||
| 59 | + gb_common.$get('/freeLogin/realMap/multiSectionRoute', {codeIdx: gb_data_basic.line_idx}, function (rs) { | ||
| 60 | + var list = []; | ||
| 61 | + $.each(rs.section, function () { | ||
| 62 | + list.push({ | ||
| 63 | + line: this['LINE_CODE'], | ||
| 64 | + updown: this['DIRECTIONS'], | ||
| 65 | + pos: parseCoords(this['GSECTION_VECTOR']), | ||
| 66 | + route_code: this['SECTIONROUTE_CODE'], | ||
| 67 | + code: this['SECTION_CODE'], | ||
| 68 | + name: this['SECTION_NAME'] | ||
| 69 | + }); | ||
| 70 | + }); | ||
| 71 | + //按线路_走向 分组数据 | ||
| 72 | + allRoads = groupByLineAndUpdown(list); | ||
| 73 | + }); | ||
| 74 | + | ||
| 75 | + //线路限速数据 | ||
| 76 | + var infos = gb_data_basic.allInformations(); | ||
| 77 | + for (var lineCode in infos) { | ||
| 78 | + lineSpeedLimit[lineCode] = infos[lineCode].speedLimit == null ? 70 : infos[lineCode].speedLimit; | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + console.log('lineSpeedLimit', lineSpeedLimit); | ||
| 82 | + }; | ||
| 83 | + | ||
| 84 | + function minDistanceFromRoad(pos, gps) { | ||
| 85 | + var distance, min; | ||
| 86 | + var len = pos.length - 1; | ||
| 87 | + for (var i = 0; i < len; i++) { | ||
| 88 | + distance = geolib.getDistanceFromLine({ | ||
| 89 | + latitude: gps.lat, | ||
| 90 | + longitude: gps.lon | ||
| 91 | + }, pos[i], pos[i + 1]); | ||
| 92 | + | ||
| 93 | + if (!min || min > distance) | ||
| 94 | + min = distance; | ||
| 95 | + | ||
| 96 | + if (distance <= threshold) | ||
| 97 | + return threshold; | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + return min; | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + function groupByLineAndUpdown(list) { | ||
| 104 | + var rs = {}, | ||
| 105 | + key; | ||
| 106 | + $.each(list, function () { | ||
| 107 | + key = this.line + '_' + this.updown; | ||
| 108 | + if (!rs[key]) | ||
| 109 | + rs[key] = []; | ||
| 110 | + | ||
| 111 | + rs[key].push(this); | ||
| 112 | + }); | ||
| 113 | + | ||
| 114 | + return rs; | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + function parseCoords(str) { | ||
| 118 | + var array = str.substr(11, str.length - 2).split(','), rs = [], temps; | ||
| 119 | + $.each(array, function (i, coords) { | ||
| 120 | + temps = coords.split(' '); | ||
| 121 | + rs.push({ | ||
| 122 | + latitude: parseFloat(temps[1]), | ||
| 123 | + longitude: parseFloat(temps[0]) | ||
| 124 | + }); | ||
| 125 | + }); | ||
| 126 | + | ||
| 127 | + return rs; | ||
| 128 | + } | ||
| 129 | + | ||
| 130 | + return { | ||
| 131 | + initData: initData, | ||
| 132 | + check: function (gps) { | ||
| 133 | + if (!allRoads || gps.instation == 2) { | ||
| 134 | + return; | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + //越界判定 | ||
| 138 | + gpsOutOfBounds(gps); | ||
| 139 | + } | ||
| 140 | + } | ||
| 141 | +})(); | ||
| 0 | \ No newline at end of file | 142 | \ No newline at end of file |
src/main/resources/static/real_control_v3/js/data/json/north_toolbar.json
0 → 100644
src/main/resources/static/real_control_v3/js/forms/wrap.html
0 → 100644
| 1 | +<html> | ||
| 2 | +<head> | ||
| 3 | + <!-- Bootstrap style --> | ||
| 4 | + <link href="/metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css"/> | ||
| 5 | + <!-- METRONIC style --> | ||
| 6 | + <link href="/metronic_v4.5.4/layout4/css/themes/light.min.css" rel="stylesheet" type="text/css" id="style_color"/> | ||
| 7 | + <link href="/metronic_v4.5.4/css/components.css" rel="stylesheet" type="text/css"/> | ||
| 8 | + <link href="/metronic_v4.5.4/css/plugins.css" rel="stylesheet" type="text/css"/> | ||
| 9 | + <link href="/metronic_v4.5.4/layout4/css/layout.min.css" rel="stylesheet" type="text/css"/> | ||
| 10 | + <!-- select2 下拉框插件 --> | ||
| 11 | + <link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css" rel="stylesheet" type="text/css"/> | ||
| 12 | + <link href="/metronic_v4.5.4/plugins/select2/css/select2-bootstrap.min.css" rel="stylesheet" type="text/css"/> | ||
| 13 | + <!-- iCheck 单选框和复选框 --> | ||
| 14 | + <link href="/metronic_v4.5.4/plugins/icheck/skins/all.css" rel="stylesheet" type="text/css"/> | ||
| 15 | + <!-- 日期控件 --> | ||
| 16 | + <link href="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/css/bootstrap-datetimepicker.min.css" | ||
| 17 | + rel="stylesheet" type="text/css"/> | ||
| 18 | + <!-- layer 弹层 插件 --> | ||
| 19 | + <link href="/assets/plugins/layer-v2.4/layer/skin/layer.css" | ||
| 20 | + rel="stylesheet" type="text/css" /> | ||
| 21 | + | ||
| 22 | + <!-- jQuery --> | ||
| 23 | + <script src="/metronic_v4.5.4/plugins/jquery.min.js"></script> | ||
| 24 | + <script src="/assets/plugins/pinyin.js"></script> | ||
| 25 | + <!-- select2 下拉框 --> | ||
| 26 | + <script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js"></script> | ||
| 27 | + <!-- moment.js 日期处理类库 --> | ||
| 28 | + <script src="/assets/plugins/moment-with-locales.js"></script> | ||
| 29 | + <!-- 日期控件 --> | ||
| 30 | + <script src="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/js/bootstrap-datetimepicker.min.js"></script> | ||
| 31 | + <!-- art-template 模版引擎 --> | ||
| 32 | + <script src="/assets/plugins/template.js"></script> | ||
| 33 | + <script src="/pages/forms/statement/js/jquery.PrintArea.js"></script> | ||
| 34 | + <!-- layer 弹层 --> | ||
| 35 | + <script src="/assets/plugins/layer-v2.4/layer/layer.js" ></script> | ||
| 36 | + | ||
| 37 | + <style> | ||
| 38 | + body{ | ||
| 39 | + background: #fff; | ||
| 40 | + } | ||
| 41 | + .form-page-content>.page-head{ | ||
| 42 | + display: none !important; | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + .form-page-content .portlet{ | ||
| 46 | + margin-bottom: 0px !important; | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + .row{ | ||
| 50 | + margin-left: 0 !important; | ||
| 51 | + margin-right: 0 !important; | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + .row .col-md-12{ | ||
| 55 | + padding-left: 0 !important; | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + .portlet{ | ||
| 59 | + padding-top: 0 !important; | ||
| 60 | + padding-left: 0 !important; | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + .form-page-content .portlet>.portlet-title{ | ||
| 64 | + position: fixed; | ||
| 65 | + width: 100%; | ||
| 66 | + background: #ffffff; | ||
| 67 | + z-index: 9; | ||
| 68 | + padding-top: 12px; | ||
| 69 | + margin-top: -2px; | ||
| 70 | + box-shadow: 0px 4px 2px 0 rgba(225, 225, 225, 0.2), 0px 4px 9px 0 rgba(139, 135, 135, 0.19); | ||
| 71 | + border-bottom: 1px solid #dbdbdb; | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + .form-page-content .portlet.light .portlet-body{ | ||
| 75 | + padding-top: 8px; | ||
| 76 | + margin-top: 55px; | ||
| 77 | + } | ||
| 78 | + </style> | ||
| 79 | +</head> | ||
| 80 | +<body> | ||
| 81 | + | ||
| 82 | +<div class="form-page-content"> | ||
| 83 | +</div> | ||
| 84 | + | ||
| 85 | +<script> | ||
| 86 | + (function () { | ||
| 87 | + var storage = window.localStorage; | ||
| 88 | + var key = 'real_control_form_embed_pageUrl'; | ||
| 89 | + //加载表单片段 | ||
| 90 | + var pageUrl = storage.getItem(key); | ||
| 91 | + if (!pageUrl) { | ||
| 92 | + alert('失败,缺少片段路径!'); | ||
| 93 | + return; | ||
| 94 | + } | ||
| 95 | + storage.removeItem(key); | ||
| 96 | + $('.form-page-content').load(pageUrl, function () { | ||
| 97 | + //限制日期 | ||
| 98 | + var d = moment(top.gb_second_timer.now()), | ||
| 99 | + f='YYYY-MM-DD'; | ||
| 100 | + //ed=d.format(f), | ||
| 101 | + //sd=d.subtract(3, 'days').format(f); | ||
| 102 | + | ||
| 103 | + try{ | ||
| 104 | + $('#date', '.form-page-content').data('DateTimePicker') | ||
| 105 | + .defaultDate(d.format(f)); | ||
| 106 | + //.maxDate(ed).minDate(sd); | ||
| 107 | + }catch (e){ | ||
| 108 | + console.log(e); | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + if($("#ddrbBody").length > 0){ | ||
| 112 | + $("#ddrbBody").height("620px"); | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + //去掉公司和分公司选项 | ||
| 116 | + var company = $('select[name=company]', '.form-page-content'); | ||
| 117 | + var subCompany = $('select[name=subCompany]', '.form-page-content'); | ||
| 118 | + if(company.length > 0){ | ||
| 119 | + company.parent().remove(); | ||
| 120 | + } | ||
| 121 | + if(subCompany.length > 0){ | ||
| 122 | + subCompany.parent().remove(); | ||
| 123 | + } | ||
| 124 | + | ||
| 125 | + //重新构造线路下拉框 | ||
| 126 | + //var lineSelect = $('select[name=line]', '.form-page-content'); | ||
| 127 | + //lineSelect.select2('destory').html(''); | ||
| 128 | + //initPinYinSelect2(lineSelect); | ||
| 129 | + }); | ||
| 130 | + | ||
| 131 | + //iframe 自适应高度 | ||
| 132 | +/* var iframeHeight; | ||
| 133 | + var ifm = top.document.getElementById("formFragmentModalIframe"); | ||
| 134 | + | ||
| 135 | + function changeFrameHeight() { | ||
| 136 | + iframeHeight = $('.form-page-content').height() | ||
| 137 | + ifm.height = iframeHeight + 'px'; | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | + document.body.onload = function () { | ||
| 141 | + setTimeout(changeFrameHeight, 500); | ||
| 142 | + }; | ||
| 143 | + //定时重置iframe高度,在片段内容不可控的情况下。 这是目前能想到的最好办法了 | ||
| 144 | + window.setInterval(function () { | ||
| 145 | + var h = $('.form-page-content').height(); | ||
| 146 | + if (iframeHeight != h) | ||
| 147 | + ifm.height = h + 'px'; | ||
| 148 | + }, 600);*/ | ||
| 149 | + | ||
| 150 | + })(); | ||
| 151 | + | ||
| 152 | + function initPinYinSelect2(selector, data, cb) { | ||
| 153 | + //过滤线路选择框数据 | ||
| 154 | + /*if(selector === '#line'){ | ||
| 155 | + var idx = ',' + top.gb_data_basic.line_idx + ','; | ||
| 156 | + var newData = []; | ||
| 157 | + $.each(data, function () { | ||
| 158 | + if(idx.indexOf(',' + this.id + ',') != -1) | ||
| 159 | + newData.push(this); | ||
| 160 | + }); | ||
| 161 | + data = newData; | ||
| 162 | + }*/ | ||
| 163 | + | ||
| 164 | + if(selector === '#line'){ | ||
| 165 | + //写死线路下拉框 | ||
| 166 | + data = []; | ||
| 167 | + $.each(top.gb_data_basic.activeLines, function () { | ||
| 168 | + data.push({ | ||
| 169 | + id: this.lineCode, | ||
| 170 | + text: this.name | ||
| 171 | + }); | ||
| 172 | + }); | ||
| 173 | + } | ||
| 174 | + $.each(data, function () { | ||
| 175 | + this.fullChars = pinyin.getFullChars(this.text).toUpperCase(); | ||
| 176 | + this.camelChars = pinyin.getCamelChars(this.text); | ||
| 177 | + }); | ||
| 178 | + | ||
| 179 | + $.fn.select2.amd.require(['select2/compat/matcher'], function (oldMatcher) { | ||
| 180 | + $(selector).select2({ | ||
| 181 | + data: data, | ||
| 182 | + matcher: oldMatcher(function (term, text, item) { | ||
| 183 | + if (!item.id) | ||
| 184 | + return; | ||
| 185 | + var upTerm = term.toUpperCase(); | ||
| 186 | + if (item.fullChars.indexOf(upTerm) != -1 | ||
| 187 | + || item.camelChars.indexOf(upTerm) != -1) | ||
| 188 | + return true; | ||
| 189 | + | ||
| 190 | + return text.indexOf(term) != -1; | ||
| 191 | + }) | ||
| 192 | + }); | ||
| 193 | + | ||
| 194 | + cb && cb($(selector)); | ||
| 195 | + | ||
| 196 | + if(selector === '#line') { | ||
| 197 | + setTimeout(function () { | ||
| 198 | + $('#line', '.form-page-content').trigger('change'); | ||
| 199 | + }, 500); | ||
| 200 | + } | ||
| 201 | + }); | ||
| 202 | + | ||
| 203 | + return $(selector); | ||
| 204 | + } | ||
| 205 | + | ||
| 206 | + var $get = top.gb_common.$get; | ||
| 207 | + var $post = top.gb_common.$post; | ||
| 208 | +</script> | ||
| 209 | +</body> | ||
| 210 | +</html> | ||
| 0 | \ No newline at end of file | 211 | \ No newline at end of file |
src/main/resources/static/real_control_v3/js/home/layout.js
0 → 100644
| 1 | +/* home js */ | ||
| 2 | + | ||
| 3 | +var gb_home_layout = (function () { | ||
| 4 | + | ||
| 5 | + var temps; | ||
| 6 | + | ||
| 7 | + var layout = function (cb) { | ||
| 8 | + //footer line name tabs | ||
| 9 | + var codeArray = gb_data_basic.line_idx.split(','), | ||
| 10 | + tabsArray = [], | ||
| 11 | + len = codeArray.length; | ||
| 12 | + for (var i = 0; i < len;) { | ||
| 13 | + tabsArray.push(connectArr(codeArray.slice(i, i += 3), ',', function (item) { | ||
| 14 | + return gb_data_basic.codeToLine[item].name; | ||
| 15 | + })); | ||
| 16 | + } | ||
| 17 | + //load template | ||
| 18 | + $.get('/real_control_v3/fragments/home/layout.html', function (dom) { | ||
| 19 | + temps = gb_common.compileTempByDom(dom); | ||
| 20 | + | ||
| 21 | + var htmlStr = temps['home-layout-tab-temp']({ | ||
| 22 | + tabs: tabsArray | ||
| 23 | + }); | ||
| 24 | + $('#main-tab-content li.home-panel').html(htmlStr); | ||
| 25 | + | ||
| 26 | + //render line panel | ||
| 27 | + var i = 0, | ||
| 28 | + data, renderFun = temps['home-layout-line-temp']; | ||
| 29 | + $('ul#home-main-content li').each(function () { | ||
| 30 | + data = gb_data_basic.findLineByCodes(codeArray.slice(i, i += 3)); | ||
| 31 | + | ||
| 32 | + $(this).html(renderFun({list: data})); | ||
| 33 | + if (i > len) | ||
| 34 | + return false; | ||
| 35 | + }); | ||
| 36 | + | ||
| 37 | + initRbDxplain(); | ||
| 38 | + cb && cb(); | ||
| 39 | + }); | ||
| 40 | + }; | ||
| 41 | + | ||
| 42 | + //右下角说明icon | ||
| 43 | + function initRbDxplain() { | ||
| 44 | + $(document).on('mouseenter', '.home-rb-explain-icon>.uk-icon-question-circle', function() { | ||
| 45 | + $(this).qtip({ | ||
| 46 | + show: { | ||
| 47 | + ready: true, | ||
| 48 | + delay: 0 | ||
| 49 | + }, | ||
| 50 | + content: { | ||
| 51 | + text: function() { | ||
| 52 | + return temps['home-rb-explain-help-temp']({}); | ||
| 53 | + } | ||
| 54 | + }, | ||
| 55 | + position: { | ||
| 56 | + viewport: $(window) | ||
| 57 | + }, | ||
| 58 | + style: { | ||
| 59 | + classes: 'qtip-jtools qtip-home-rb' | ||
| 60 | + }, | ||
| 61 | + hide: { | ||
| 62 | + fixed: true, | ||
| 63 | + delay: 300 | ||
| 64 | + }, | ||
| 65 | + events: { | ||
| 66 | + hidden: function(event, api) { | ||
| 67 | + //destroy dom | ||
| 68 | + $(this).qtip('destroy', true); | ||
| 69 | + } | ||
| 70 | + } | ||
| 71 | + }); | ||
| 72 | + }); | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + //click svg edit icon | ||
| 76 | + $(document).on('click', '.home-svg-edit-icon', function () { | ||
| 77 | + open_modal('/real_control_v3/fragments/home/svg_edit.html', {lineCode: $(this).data('line-code')}); | ||
| 78 | + }); | ||
| 79 | + | ||
| 80 | + //tab 切换事件 | ||
| 81 | + $(document).on('show.uk.switcher', '.home-panel-footer>ul.uk-subnav' , function (event, area) { | ||
| 82 | + gb_svg_chart.refreshByVisible(); | ||
| 83 | + }); | ||
| 84 | + | ||
| 85 | + //文件载入完毕 | ||
| 86 | + res_load_ep.emitLater('load_home_layout'); | ||
| 87 | + | ||
| 88 | + return { | ||
| 89 | + layout: layout | ||
| 90 | + }; | ||
| 91 | +})(); |
src/main/resources/static/real_control_v3/js/line_schedule/dbclick.js
0 → 100644
| 1 | +/** schedule table double click event */ | ||
| 2 | +var gb_schedule_table_dbclick = (function() { | ||
| 3 | + | ||
| 4 | + //待发调整 | ||
| 5 | + var dftzHandler = function(input) { | ||
| 6 | + var val = $(input).val(), | ||
| 7 | + $dd = $(input).parent(), | ||
| 8 | + id = $(input).parents('dl').data('id'); | ||
| 9 | + | ||
| 10 | + if (val == '' || $dd.attr('dbclick-val') == val) { | ||
| 11 | + var lineCode = $(input).parents('li.line_schedule').data('id'); | ||
| 12 | + var sch = gb_schedule_table.findScheduleByLine(lineCode)[id]; | ||
| 13 | + var dfHtmlStr = $dd.attr('dbclick-val') + (sch.late2?'<span class="late-badge">?+'+sch.lateMinute+'</span>':''); | ||
| 14 | + $dd.html(dfHtmlStr); | ||
| 15 | + return; | ||
| 16 | + } | ||
| 17 | + else { | ||
| 18 | + gb_common.$post('/realSchedule/outgoAdjust', { | ||
| 19 | + id: id, | ||
| 20 | + dfsj: val, | ||
| 21 | + remarks: '', | ||
| 22 | + opType: '0' | ||
| 23 | + }, function(rs) { | ||
| 24 | + if(rs.flag && rs.flag==4008){ | ||
| 25 | + notify_err('已发出的班次不能调整待发'); | ||
| 26 | + gb_schedule_table.updateSchedule(rs.t); | ||
| 27 | + return; | ||
| 28 | + } | ||
| 29 | + gb_schedule_table.updateSchedule(rs.ts); | ||
| 30 | + notify_succ('待发调整成功!'); | ||
| 31 | + //重新计算应发未发 | ||
| 32 | + gb_schedule_table.calc_yfwf_num(rs.ts[0].xlBm); | ||
| 33 | + }); | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + var dbclick_opts = { | ||
| 38 | + 'dfsj': { | ||
| 39 | + inputType: 'time', | ||
| 40 | + submit: dftzHandler | ||
| 41 | + } | ||
| 42 | + }; | ||
| 43 | + | ||
| 44 | + //var input = ; | ||
| 45 | + var init = function(tbody) { | ||
| 46 | + //console.log('gb_schedule_table_dbclick.init...'); | ||
| 47 | + $('.line-schedule-table .ct_table_body dd[dbclick]').dblclick(function() { | ||
| 48 | + //console.log('dblclick...') | ||
| 49 | + var val = $(this).attr('dbclick-val'), | ||
| 50 | + type = $(this).attr('dbclick-type'); | ||
| 51 | + | ||
| 52 | + $(this).html('<input required opts_type="' + type + '" type="' + dbclick_opts[type].inputType + '" class="db-input" value="' + val + '">'); | ||
| 53 | + | ||
| 54 | + //console.log($('input', this)); | ||
| 55 | + var $input = $('input', this); | ||
| 56 | + $input.focus().on('keyup', inputKeyup) | ||
| 57 | + .on('blur', function() { | ||
| 58 | + dbclick_opts[type].submit($input); | ||
| 59 | + }); | ||
| 60 | + }); | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + var inputKeyup = function(e) { | ||
| 64 | + if (e && e.keyCode == 13) { | ||
| 65 | + var type = $(this).attr('opts_type'); | ||
| 66 | + dbclick_opts[type].submit(this); | ||
| 67 | + } | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + $.contextMenu({ | ||
| 71 | + selector: '.line_schedule .ct_table_body input.db-input', | ||
| 72 | + className: 'schedule-ct-menu-input', | ||
| 73 | + callback: function(key, options) { | ||
| 74 | + //callbackHandler[key] && callbackHandler[key](); | ||
| 75 | + //if(key == 'cancel') | ||
| 76 | + }, | ||
| 77 | + items: { | ||
| 78 | + 'cancel': { | ||
| 79 | + name: '取消', | ||
| 80 | + icon: "delete" | ||
| 81 | + } | ||
| 82 | + } | ||
| 83 | + }); | ||
| 84 | + | ||
| 85 | + var sfsjCellClick = function (elem) { | ||
| 86 | + // elem.dblclick(function () { | ||
| 87 | + // | ||
| 88 | + // var id = $(this).parent().data('id'), | ||
| 89 | + // lineCode = $(this).parents('li.line_schedule').data('id'); | ||
| 90 | + // | ||
| 91 | + // var sch = gb_schedule_table.findScheduleByLine(lineCode)[id]; | ||
| 92 | + // gb_schedule_context_menu.fcxxwt(sch); | ||
| 93 | + // }); | ||
| 94 | + }; | ||
| 95 | + | ||
| 96 | + var carCellClick = function (elem) { | ||
| 97 | + elem.dblclick(function () { | ||
| 98 | + var nbbm = $(this).data('nbbm'); | ||
| 99 | + var lineCode = $('.north-tabs>ul>li.tab-line.uk-active').data('code'); | ||
| 100 | + | ||
| 101 | + open_modal('/real_control_v3/fragments/line_schedule/car_info_all.html', {nbbm:nbbm,lineCode:lineCode}); | ||
| 102 | + }); | ||
| 103 | + }; | ||
| 104 | + | ||
| 105 | + return { | ||
| 106 | + init: init, | ||
| 107 | + sfsjCellClick:sfsjCellClick, | ||
| 108 | + carCellClick: carCellClick | ||
| 109 | + }; | ||
| 110 | +})(); |
src/main/resources/static/real_control_v3/js/line_schedule/layout.js
0 → 100644
| 1 | +/** 单线路调度 布局 */ | ||
| 2 | +var gb_line_layout = (function() { | ||
| 3 | + | ||
| 4 | + var temps; | ||
| 5 | + | ||
| 6 | + var layout = function(cb) { | ||
| 7 | + $.get('/real_control_v3/fragments/line_schedule/layout.html', function(dom) { | ||
| 8 | + temps = gb_common.compileTempByDom(dom); | ||
| 9 | + | ||
| 10 | + var htmlStr = temps['cont-line-layout-temp']({}); | ||
| 11 | + | ||
| 12 | + $('#main-tab-content .line_schedule').each(function(){ | ||
| 13 | + $(this).html(htmlStr); | ||
| 14 | + | ||
| 15 | + var lineCode=$(this).data('id') | ||
| 16 | + ,svgWrap=$('.footer-chart .svg-wrap', this); | ||
| 17 | + gb_svg_chart.draw_line(lineCode, svgWrap, true); | ||
| 18 | + }); | ||
| 19 | + | ||
| 20 | + cb && cb(); | ||
| 21 | + }); | ||
| 22 | + }; | ||
| 23 | + | ||
| 24 | + //图例icon tootip | ||
| 25 | + $(document).on('mouseenter', '.schedule-wrap .header-title i.uk-icon-question-circle', function() { | ||
| 26 | + $(this).qtip({ | ||
| 27 | + show: { | ||
| 28 | + ready: true, | ||
| 29 | + delay: 300 | ||
| 30 | + }, | ||
| 31 | + content: { | ||
| 32 | + text: function() { | ||
| 33 | + return temps['sch-table-top-help-temp']({}); | ||
| 34 | + } | ||
| 35 | + }, | ||
| 36 | + position: { | ||
| 37 | + viewport: $(window) | ||
| 38 | + }, | ||
| 39 | + style: { | ||
| 40 | + classes: 'qtip-light qtip-rounded qtip-shadow sch-tl-tip' | ||
| 41 | + }, | ||
| 42 | + hide: { | ||
| 43 | + fixed: true, | ||
| 44 | + delay: 300 | ||
| 45 | + }, | ||
| 46 | + events: { | ||
| 47 | + hidden: function(event, api) { | ||
| 48 | + //destroy dom | ||
| 49 | + $(this).qtip('destroy', true); | ||
| 50 | + } | ||
| 51 | + } | ||
| 52 | + }); | ||
| 53 | + }); | ||
| 54 | + | ||
| 55 | + return { | ||
| 56 | + layout: layout | ||
| 57 | + }; | ||
| 58 | +})(); |
src/main/resources/static/real_control_v3/js/line_schedule/sch_table.js
0 → 100644
| 1 | +/** schedule table */ | ||
| 2 | + | ||
| 3 | +var gb_schedule_table = (function () { | ||
| 4 | + | ||
| 5 | + var temps; | ||
| 6 | + //线路分组的班次数据 | ||
| 7 | + var line2Schedule = {}; | ||
| 8 | + //车辆应发未发车辆数 | ||
| 9 | + var car_yfwf_map = {}; | ||
| 10 | + | ||
| 11 | + var bcTypeOrderMap = { | ||
| 12 | + 'out':0, | ||
| 13 | + 'normal':1, | ||
| 14 | + 'region':2, | ||
| 15 | + 'major':3, | ||
| 16 | + 'venting':4, | ||
| 17 | + 'ldks':5, | ||
| 18 | + 'in':6 | ||
| 19 | + }; | ||
| 20 | + var typeOrder = function (type) { | ||
| 21 | + return bcTypeOrderMap[type]?bcTypeOrderMap[type]:0; | ||
| 22 | + }; | ||
| 23 | + var schedule_sort = function (s1, s2) { | ||
| 24 | + var diff = s1['fcsjT'] - s2['fcsjT']; | ||
| 25 | + return diff!=0?diff:typeOrder(s1['bcType'])-typeOrder(s2['bcType']); | ||
| 26 | + }; | ||
| 27 | + | ||
| 28 | + var show = function (cb) { | ||
| 29 | + //从服务器获取班次数据 | ||
| 30 | + $.get('/freeLogin/realSchedule/lines', { | ||
| 31 | + lines: gb_data_basic.line_idx | ||
| 32 | + }, function (rs) { | ||
| 33 | + for (var lineCode in rs) { | ||
| 34 | + line2Schedule[lineCode] = {}; | ||
| 35 | + | ||
| 36 | + //排序 | ||
| 37 | + rs[lineCode].sort(schedule_sort); | ||
| 38 | + //calc shift | ||
| 39 | + $.each(rs[lineCode], function () { | ||
| 40 | + if(this.status==-1) | ||
| 41 | + clearActualTime(this); | ||
| 42 | + calc_sch_real_shift(this); | ||
| 43 | + line2Schedule[lineCode][this.id] = this; | ||
| 44 | + //子任务公里是否与计划平 | ||
| 45 | + this.c_t_mileage_status = calcCTaskMileageStatus(this); | ||
| 46 | + }); | ||
| 47 | + //计算应发未发 | ||
| 48 | + calc_yfwf_num(lineCode); | ||
| 49 | + } | ||
| 50 | + ep.emit('data', rs); | ||
| 51 | + }); | ||
| 52 | + | ||
| 53 | + //加载班次表格渲染模板 | ||
| 54 | + $.get('/real_control_v3/fragments/line_schedule/sch_table.html', function (dom) { | ||
| 55 | + ep.emit('temp', gb_common.compileTempByDom(dom, { | ||
| 56 | + compress: true | ||
| 57 | + })); | ||
| 58 | + }); | ||
| 59 | + | ||
| 60 | + var ep = EventProxy.create("data", "temp", function (data, temp) { | ||
| 61 | + temps = temp; | ||
| 62 | + var lineCode, dirData, htmlStr; | ||
| 63 | + $('#main-tab-content .line_schedule').each(function () { | ||
| 64 | + lineCode = $(this).data('id'); | ||
| 65 | + if (arrayIsNull(data[lineCode])) | ||
| 66 | + return true; | ||
| 67 | + dirData = gb_common.groupBy(data[lineCode], 'xlDir'); | ||
| 68 | + for (var upDown in dirData) { | ||
| 69 | + htmlStr = temps['line-schedule-table-temp']({ | ||
| 70 | + dir: upDown, | ||
| 71 | + line: gb_data_basic.codeToLine[lineCode], | ||
| 72 | + list: dirData[upDown] | ||
| 73 | + }); | ||
| 74 | + | ||
| 75 | + $('.schedule-wrap .card-panel:eq(' + upDown + ')', this) | ||
| 76 | + .html(htmlStr); | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + //标记路牌最后一个班次 | ||
| 80 | + markerLastByLine(lineCode); | ||
| 81 | + //初始化图例相关,dbclick 不能代理事件 | ||
| 82 | + //gb_sch_legend.init(this); | ||
| 83 | + }); | ||
| 84 | + //初始化图例 | ||
| 85 | + gb_sch_legend.init(); | ||
| 86 | + var content = $('.line_schedule .ct_table_wrap'); | ||
| 87 | + //初始化滚动条 | ||
| 88 | + content.perfectScrollbar({suppressScrollX: true}); | ||
| 89 | + //fixed table head | ||
| 90 | + gb_ct_table.fixedHead(content); | ||
| 91 | + //enable sort | ||
| 92 | + gb_ct_table.enableSort($('.ct_table', content), reset_seq_no, gb_schedule_table_dbclick.init); | ||
| 93 | + //dbclick event | ||
| 94 | + gb_schedule_table_dbclick.init(); | ||
| 95 | + //双击实发 | ||
| 96 | + //gb_schedule_table_dbclick.sfsjCellClick($('dd.fcsjActualCell')); | ||
| 97 | + //双击车辆 | ||
| 98 | + gb_schedule_table_dbclick.carCellClick($('.ct_table_body dd[data-nbbm]')); | ||
| 99 | + //搜索框初始化 | ||
| 100 | + gb_sch_search.init(); | ||
| 101 | + | ||
| 102 | + //监听gps车辆信息 | ||
| 103 | + gb_data_gps.registerCallback(renderCarRemark); | ||
| 104 | + cb && cb(); | ||
| 105 | + }); | ||
| 106 | + }; | ||
| 107 | + | ||
| 108 | + var renderCarRemark = function () { | ||
| 109 | + try{ | ||
| 110 | + var $activeTab = $('.north-tabs>ul>li.tab-line.uk-active');//.data('code'); | ||
| 111 | + if($activeTab.length==0) | ||
| 112 | + return; | ||
| 113 | + var lineCode = $activeTab.data('code'); | ||
| 114 | + var array = gb_common.get_vals(line2Schedule[lineCode]); | ||
| 115 | + var nbbms = {}; | ||
| 116 | + for(var i=0,sch;sch=array[i++];){ | ||
| 117 | + nbbms[sch.clZbh]=1; | ||
| 118 | + } | ||
| 119 | + | ||
| 120 | + var $activeWrap = $('#main-tab-content .line_schedule.uk-active .schedule-wrap .schedule-body'); | ||
| 121 | + var gps, e; | ||
| 122 | + for(var nbbm in nbbms){ | ||
| 123 | + gps = gb_data_gps.findGpsByNbbm(nbbm); | ||
| 124 | + e = $('.ct_table_body dl>dd[data-nbbm='+nbbm+']', $activeWrap); | ||
| 125 | + $('i', e).remove(); | ||
| 126 | + | ||
| 127 | + if(gps && gps['planCode']!=lineCode && gps.remark) | ||
| 128 | + $(e).append('<i class="uk-icon-exclamation-circle" data-uk-tooltip title="'+gps.remark+'"></i>'); | ||
| 129 | + } | ||
| 130 | + }catch (e){ | ||
| 131 | + console.log(e); | ||
| 132 | + } | ||
| 133 | + }; | ||
| 134 | + | ||
| 135 | + /** | ||
| 136 | + * 计算子任务公里是否和计划平 | ||
| 137 | + * @param sch | ||
| 138 | + */ | ||
| 139 | + var calcCTaskMileageStatus = function (sch) { | ||
| 140 | + if(!sch.cTasks || sch.cTasks.length==0) | ||
| 141 | + return 0; | ||
| 142 | + var sum = 0; | ||
| 143 | + $.each(sch.cTasks, function () { | ||
| 144 | + if (this.mileageType == 'service') { | ||
| 145 | + sum = gb_common.accAdd(sum, this.mileage); | ||
| 146 | + } | ||
| 147 | + }); | ||
| 148 | + | ||
| 149 | + if (sum != sch.jhlcOrig) { | ||
| 150 | + return -1; | ||
| 151 | + } | ||
| 152 | + return 0; | ||
| 153 | + }; | ||
| 154 | + | ||
| 155 | + | ||
| 156 | + //重置序号 | ||
| 157 | + var reset_seq_no = function (dls) { | ||
| 158 | + dls.each(function (i, dl) { | ||
| 159 | + $('dd:eq(0)', dl).text(i + 1); | ||
| 160 | + }); | ||
| 161 | + }; | ||
| 162 | + | ||
| 163 | + //计算实发时间差值 | ||
| 164 | + var calc_sch_real_shift = function (sch) { | ||
| 165 | + if (sch['fcsjActualTime']){ | ||
| 166 | + var diff = sch['fcsjActualTime'] - sch['dfsjT'], fcsj_diff; | ||
| 167 | + fcsj_diff = parseInt(diff / 60000, 10); | ||
| 168 | + if(diff % 60000 != 0){ | ||
| 169 | + /*if(fcsj_diff > 0) | ||
| 170 | + fcsj_diff ++; | ||
| 171 | + else */if(fcsj_diff < 0) | ||
| 172 | + fcsj_diff --; | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + if(fcsj_diff > 0) | ||
| 176 | + sch.fcsj_diff = '( +' + fcsj_diff + ' )'; | ||
| 177 | + else if (fcsj_diff < 0) | ||
| 178 | + sch.fcsj_diff = '( ' + fcsj_diff + ' )'; | ||
| 179 | + else | ||
| 180 | + sch.fcsj_diff = ''; | ||
| 181 | + } | ||
| 182 | + }; | ||
| 183 | + | ||
| 184 | + | ||
| 185 | + | ||
| 186 | + function arrayIsNull(array) { | ||
| 187 | + return !array || array.length == 0; | ||
| 188 | + } | ||
| 189 | + | ||
| 190 | + var findScheduleByLine = function (lineCode) { | ||
| 191 | + return line2Schedule[lineCode]; | ||
| 192 | + }; | ||
| 193 | + | ||
| 194 | + //新增一个班次,附带更新的班次 | ||
| 195 | + var insertSchedule = function (sch, upArr) { | ||
| 196 | + var xls = {}; | ||
| 197 | + xls[sch.xlBm] = 1; | ||
| 198 | + line2Schedule[sch.xlBm][sch.id] = sch; | ||
| 199 | + //update | ||
| 200 | + if (isArray(upArr)) { | ||
| 201 | + $.each(upArr, function () { | ||
| 202 | + line2Schedule[this.xlBm][this.id] = this; | ||
| 203 | + xls[this.xlBm] = 1; | ||
| 204 | + }); | ||
| 205 | + } | ||
| 206 | + | ||
| 207 | + //重新渲染表格 | ||
| 208 | + for(var xlBm in xls){ | ||
| 209 | + reRenderTable(sch.xlBm); | ||
| 210 | + } | ||
| 211 | + //定位到新添加的班次 | ||
| 212 | + scroToDl(sch); | ||
| 213 | + }; | ||
| 214 | + | ||
| 215 | + /** | ||
| 216 | + * 重新渲染表格 | ||
| 217 | + */ | ||
| 218 | + var reRenderTable = function (lineCode) { | ||
| 219 | + var data = gb_common.get_vals(line2Schedule[lineCode]).sort(schedule_sort), | ||
| 220 | + dirData = gb_common.groupBy(data, 'xlDir'), | ||
| 221 | + tabCont = $('li.line_schedule[data-id=' + lineCode + ']'), | ||
| 222 | + htmlStr; | ||
| 223 | + | ||
| 224 | + if($.isEmptyObject(dirData)){ | ||
| 225 | + $('.schedule-wrap .card-panel', tabCont).html(''); | ||
| 226 | + } | ||
| 227 | + else { | ||
| 228 | + for (var upDown in dirData) { | ||
| 229 | + htmlStr = temps['line-schedule-table-temp']({ | ||
| 230 | + dir: upDown, | ||
| 231 | + line: gb_data_basic.codeToLine[lineCode], | ||
| 232 | + list: dirData[upDown] | ||
| 233 | + }); | ||
| 234 | + $('.schedule-wrap .card-panel:eq(' + upDown + ')', tabCont).html(htmlStr); | ||
| 235 | + } | ||
| 236 | + //图例相关 | ||
| 237 | + gb_sch_legend.init(tabCont); | ||
| 238 | + //标记末班 | ||
| 239 | + markerLastByLine(lineCode); | ||
| 240 | + //计算应发未发 | ||
| 241 | + calc_yfwf_num(lineCode); | ||
| 242 | + //重新固定表头 | ||
| 243 | + gb_ct_table.fixedHead($('.schedule-wrap .ct_table_wrap', tabCont)); | ||
| 244 | + | ||
| 245 | + //重新初始化排序 | ||
| 246 | + gb_ct_table.enableSort($('.ct_table', tabCont), reset_seq_no, gb_schedule_table_dbclick.init); | ||
| 247 | + //重新初始化双击待发调整 | ||
| 248 | + gb_schedule_table_dbclick.init(); | ||
| 249 | + //重新初始化双击实发发车信息微调 | ||
| 250 | + gb_schedule_table_dbclick.sfsjCellClick($('dd.fcsjActualCell', tabCont)); | ||
| 251 | + //重新初始化双击车辆 | ||
| 252 | + gb_schedule_table_dbclick.carCellClick($('.ct_table_body dd[data-nbbm]')); | ||
| 253 | + //滚动条 | ||
| 254 | + $('.schedule-wrap .ct_table_wrap', tabCont).perfectScrollbar({suppressScrollX: true}); | ||
| 255 | + | ||
| 256 | + //搜索模板初始化 | ||
| 257 | + gb_sch_search.init(); | ||
| 258 | + } | ||
| 259 | + }; | ||
| 260 | + | ||
| 261 | + | ||
| 262 | + /** | ||
| 263 | + * 重新从服务器加载数据,并刷新表格 | ||
| 264 | + * @param lineCode | ||
| 265 | + */ | ||
| 266 | + var reLoadAndRefresh = function (lineCode) { | ||
| 267 | + $.get('/freeLogin/realSchedule/lines', { | ||
| 268 | + lines: lineCode + ',' | ||
| 269 | + }, function (rs) { | ||
| 270 | + if(!rs || $.isEmptyObject(rs)){ | ||
| 271 | + line2Schedule[lineCode] = {}; | ||
| 272 | + } | ||
| 273 | + else{ | ||
| 274 | + //排序 | ||
| 275 | + rs[lineCode].sort(schedule_sort); | ||
| 276 | + line2Schedule[lineCode] = {}; | ||
| 277 | + //calc shift | ||
| 278 | + $.each(rs[lineCode], function () { | ||
| 279 | + calc_sch_real_shift(this); | ||
| 280 | + line2Schedule[lineCode][this.id] = this; | ||
| 281 | + }); | ||
| 282 | + } | ||
| 283 | + //计算应发未发 | ||
| 284 | + calc_yfwf_num(lineCode); | ||
| 285 | + //重新渲染 | ||
| 286 | + reRenderTable(lineCode); | ||
| 287 | + }); | ||
| 288 | + }; | ||
| 289 | + | ||
| 290 | + //删除一个班次 | ||
| 291 | + var deheteSchedule = function (sch) { | ||
| 292 | + sch = line2Schedule[sch.xlBm][sch.id]; | ||
| 293 | + if (sch) { | ||
| 294 | + var dl = $('li.line_schedule[data-id=' + sch.xlBm + '] .ct_table_body dl[data-id=' + sch.id + ']'), | ||
| 295 | + dls = dl.parent().find('dl'); | ||
| 296 | + delete line2Schedule[sch.xlBm][sch.id]; | ||
| 297 | + dl.remove(); | ||
| 298 | + reset_seq_no(dls); | ||
| 299 | + calc_yfwf_num(sch.xlBm); | ||
| 300 | + } | ||
| 301 | + }; | ||
| 302 | + | ||
| 303 | + /** | ||
| 304 | + * 更新班次 | ||
| 305 | + * @param schArr | ||
| 306 | + */ | ||
| 307 | + var updateSchedule = function (schArr) { | ||
| 308 | + | ||
| 309 | + if (!isArray(schArr)) | ||
| 310 | + schArr = [schArr]; | ||
| 311 | + | ||
| 312 | + //var tMaps = {}; | ||
| 313 | + $.each(schArr, function () { | ||
| 314 | + try { | ||
| 315 | + if(this.status==-1) | ||
| 316 | + clearActualTime(this); | ||
| 317 | + //子任务公里是否与计划平 | ||
| 318 | + this.c_t_mileage_status = calcCTaskMileageStatus(this); | ||
| 319 | + line2Schedule[this.xlBm][this.id] = this; | ||
| 320 | + updateDom(this); | ||
| 321 | + }catch(e){} | ||
| 322 | + }); | ||
| 323 | + | ||
| 324 | + /* //重新标记末班 | ||
| 325 | + var ts=[]; | ||
| 326 | + for(var k in tMaps){ | ||
| 327 | + ts = k.split('_'); | ||
| 328 | + markerLastByNbbm(ts[0], ts[1]); | ||
| 329 | + }*/ | ||
| 330 | + }; | ||
| 331 | + | ||
| 332 | + | ||
| 333 | + /** | ||
| 334 | + * 更新班次 -只更新数据,不更新dom | ||
| 335 | + * @param schArr | ||
| 336 | + */ | ||
| 337 | + var updateData = function (schArr) { | ||
| 338 | + if (!isArray(schArr)) | ||
| 339 | + schArr = [schArr]; | ||
| 340 | + $.each(schArr, function () { | ||
| 341 | + if(this.status==-1) | ||
| 342 | + clearActualTime(this); | ||
| 343 | + line2Schedule[this.xlBm][this.id] = this; | ||
| 344 | + }); | ||
| 345 | + }; | ||
| 346 | + | ||
| 347 | + //update dom | ||
| 348 | + var updateDom = function (sch) { | ||
| 349 | + if (!sch) return; | ||
| 350 | + var dl = $('li.line_schedule[data-id=' + sch.xlBm + '] .ct_table_body dl[data-id=' + sch.id + ']'); | ||
| 351 | + var dds = $('dd', dl); | ||
| 352 | + $(dds[1]).find('a').text(sch.lpName); | ||
| 353 | + | ||
| 354 | + //车辆自编号 | ||
| 355 | + var $newDds2 = $(temps['line-schedule-nbbm-temp'](sch)); | ||
| 356 | + $(dds[2]).replaceWith($newDds2); | ||
| 357 | + //车辆双击 | ||
| 358 | + gb_schedule_table_dbclick.carCellClick($newDds2); | ||
| 359 | + $(dds[3]).text(sch.qdzArrDatejh ? sch.qdzArrDatejh : ''); | ||
| 360 | + $(dds[4]).text(sch.qdzArrDatesj ? sch.qdzArrDatesj : ''); | ||
| 361 | + | ||
| 362 | + //计发时间 | ||
| 363 | + $(dds[5]).replaceWith(temps['line-schedule-fcsj-temp'](sch)); | ||
| 364 | + //待发时间 | ||
| 365 | + var dfHtmlStr = sch.dfsj + (sch.late2?'<span class="late-badge">?+'+sch.lateMinute+'</span>':''); | ||
| 366 | + $(dds[6]).attr('data-sort-val', sch.dfsjT).html(dfHtmlStr); | ||
| 367 | + | ||
| 368 | + //实发时间 | ||
| 369 | + calc_sch_real_shift(sch); | ||
| 370 | + var sfsjDd = $(temps['line-schedule-sfsj-temp'](sch)); | ||
| 371 | + //双击 | ||
| 372 | + gb_schedule_table_dbclick.sfsjCellClick(sfsjDd); | ||
| 373 | + $(dds[7]).replaceWith(sfsjDd); | ||
| 374 | + if (sch.remarks) | ||
| 375 | + $(dds[8]).html('<span title="' + sch.remarks + '" data-uk-tooltip="{pos:\'top-left\'}">' + sch.remarks + '</span>'); | ||
| 376 | + else | ||
| 377 | + $(dds[8]).html(''); | ||
| 378 | + | ||
| 379 | + //信号状态标记 | ||
| 380 | + gb_signal_state.marker_sch(sch); | ||
| 381 | + //班次是车辆的最后一班 | ||
| 382 | + if (dl.hasClass('dl-last-sch')) | ||
| 383 | + markerLastSch([sch]); | ||
| 384 | + | ||
| 385 | + renderCarRemark(); | ||
| 386 | + }; | ||
| 387 | + | ||
| 388 | + //单击实发单元格显示详细信息 | ||
| 389 | + $(document).on('click', 'dd.fcsjActualCell', function () { | ||
| 390 | + var that = this; | ||
| 391 | + $(that).qtip({ | ||
| 392 | + show: true, | ||
| 393 | + content: { | ||
| 394 | + text: function (e) { | ||
| 395 | + var lineCode = $(that).parents('li.line_schedule').data('id') | ||
| 396 | + , id = $(that).parents('dl').data('id') | ||
| 397 | + , sch = line2Schedule[lineCode][id]; | ||
| 398 | + return temps['sfsj_sch-detail-temp'](sch); | ||
| 399 | + } | ||
| 400 | + } | ||
| 401 | + , style: { | ||
| 402 | + classes: 'qtip-dark qtip-rounded qtip-shadow' | ||
| 403 | + }, | ||
| 404 | + hide: { | ||
| 405 | + fixed: true, | ||
| 406 | + delay: 300 | ||
| 407 | + }, | ||
| 408 | + position: { | ||
| 409 | + target: that, | ||
| 410 | + my: 'center left', | ||
| 411 | + at: 'center right' | ||
| 412 | + }, | ||
| 413 | + events: { | ||
| 414 | + hidden: function (event, api) { | ||
| 415 | + $(this).qtip('destroy', true); | ||
| 416 | + } | ||
| 417 | + } | ||
| 418 | + }); | ||
| 419 | + }); | ||
| 420 | + | ||
| 421 | + //拖拽选中... | ||
| 422 | + var seq_nos = '.line-schedule-table .ct_table_body>dl>dd.seq_no'; | ||
| 423 | + var drag_strat; | ||
| 424 | + $(document).on('mousedown', seq_nos, function (e) { | ||
| 425 | + if (e.button != 0) return; | ||
| 426 | + var dl = $(this).parent(); | ||
| 427 | + if (dl.hasClass('drag-active')) | ||
| 428 | + dl.removeClass('drag-active'); | ||
| 429 | + else | ||
| 430 | + dl.addClass('drag-active'); | ||
| 431 | + | ||
| 432 | + drag_strat = parseInt($(this).text()) - 1; | ||
| 433 | + }).on('mouseup', function () { | ||
| 434 | + drag_strat = null; | ||
| 435 | + }).on('mouseover', seq_nos, function () { | ||
| 436 | + if (drag_strat != null) { | ||
| 437 | + var e = parseInt($(this).text()), | ||
| 438 | + dls = $(this).parents('.ct_table_body').find('dl'); | ||
| 439 | + | ||
| 440 | + reset_drag_active_all(this); | ||
| 441 | + //向上选中 | ||
| 442 | + if (e <= drag_strat) { | ||
| 443 | + for (var i = drag_strat; i > e - 2; i--) | ||
| 444 | + $(dls[i]).addClass('drag-active'); | ||
| 445 | + } | ||
| 446 | + //向下选中 | ||
| 447 | + else { | ||
| 448 | + for (var j = drag_strat; j < e; j++) | ||
| 449 | + $(dls[j]).addClass('drag-active'); | ||
| 450 | + } | ||
| 451 | + } | ||
| 452 | + }).on('click', seq_nos, function () { | ||
| 453 | + reset_relevance_active(this); | ||
| 454 | + }); | ||
| 455 | + //非seq_no 单元格点击 | ||
| 456 | + $(document).on('click', '.line-schedule-table .ct_table_body dl dd[class!=seq_no][class!=lpName]', function () { | ||
| 457 | + reset_drag_active_all(this); | ||
| 458 | + //选中相关班次 | ||
| 459 | + var id = $(this).parent().data('id'), | ||
| 460 | + contWrap = $(this).parents('li.line_schedule'), | ||
| 461 | + lineCode = contWrap.data('id'), | ||
| 462 | + sch = line2Schedule[lineCode][id], | ||
| 463 | + schArr = gb_common.get_vals(line2Schedule[lineCode]).filter(function (item) { | ||
| 464 | + return item.clZbh == sch.clZbh; | ||
| 465 | + }).sort(schedule_sort), | ||
| 466 | + nextSch, tempDL; | ||
| 467 | + | ||
| 468 | + getDl(sch).addClass('intimity'); | ||
| 469 | + $.each(schArr, function (i) { | ||
| 470 | + tempDL = $('dl[data-id=' + this.id + ']', contWrap); | ||
| 471 | + tempDL.addClass('relevance-active'); | ||
| 472 | + if (i < schArr.length - 1 && this.id == id) { | ||
| 473 | + nextSch = schArr[i + 1]; | ||
| 474 | + } | ||
| 475 | + }); | ||
| 476 | + | ||
| 477 | + if (nextSch) { | ||
| 478 | + $('dl[data-id=' + nextSch.id + ']', contWrap).addClass('intimity'); | ||
| 479 | + /*if (nextSch.xlDir == sch.xlDir) | ||
| 480 | + return;*/ | ||
| 481 | + //滚动到下一个班次 | ||
| 482 | + if(nextSch.xlDir != sch.xlDir) | ||
| 483 | + scroToDl(nextSch); | ||
| 484 | + | ||
| 485 | + } | ||
| 486 | + | ||
| 487 | + //如果有打开轨迹回放 | ||
| 488 | + if($('.layui-layer.play_back-layer').is(':visible')){ | ||
| 489 | + gb_map_play_back.setParam(sch); | ||
| 490 | + } | ||
| 491 | + }); | ||
| 492 | + | ||
| 493 | + //路牌点击 | ||
| 494 | + $(document).on('click', '.line-schedule-table .ct_table_body dl dd[class=lpName]', function () { | ||
| 495 | + reset_drag_active_all(this); | ||
| 496 | + //选中路牌下相关班次 | ||
| 497 | + var id = $(this).parent().data('id'), | ||
| 498 | + contWrap = $(this).parents('li.line_schedule'), | ||
| 499 | + lineCode = contWrap.data('id'), | ||
| 500 | + sch = line2Schedule[lineCode][id], | ||
| 501 | + schArr = gb_common.get_vals(line2Schedule[lineCode]).filter(function (item) { | ||
| 502 | + return item.lpName == sch.lpName; | ||
| 503 | + }).sort(schedule_sort); | ||
| 504 | + $.each(schArr, function (i) { | ||
| 505 | + $('dl[data-id=' + this.id + ']', contWrap).addClass('relevance-active intimity'); | ||
| 506 | + }); | ||
| 507 | + | ||
| 508 | + //notify_succ('高亮路牌 ' + sch.lpName); | ||
| 509 | + showLpMileageTip(lineCode, sch.lpName, schArr); | ||
| 510 | + }); | ||
| 511 | + | ||
| 512 | + var showLpMileageTipBySch = function (sch) { | ||
| 513 | + if(!$('.mileage_elec_panel', $('.line_schedule[data-id='+sch.xlBm+']')).is(':visible')) | ||
| 514 | + return; | ||
| 515 | + | ||
| 516 | + var schArr = gb_common.get_vals(line2Schedule[sch.xlBm]).filter(function (item) { | ||
| 517 | + return item.lpName == sch.lpName; | ||
| 518 | + }).sort(schedule_sort); | ||
| 519 | + | ||
| 520 | + showLpMileageTip(sch.xlBm, sch.lpName, schArr); | ||
| 521 | + }; | ||
| 522 | + /** | ||
| 523 | + * 弹出路牌公里统计tip | ||
| 524 | + * @param lineCode | ||
| 525 | + * @param lpName | ||
| 526 | + * @param array | ||
| 527 | + */ | ||
| 528 | + var showLpMileageTip = function (lineCode, lpName, array) { | ||
| 529 | + var wrap = $('.line_schedule[data-id='+lineCode+']'); | ||
| 530 | + //按驾驶员&车辆分组统计 | ||
| 531 | + var data=mileageTipGroupData(array); | ||
| 532 | + //统计公里 | ||
| 533 | + var list=[]; | ||
| 534 | + for(var key in data){ | ||
| 535 | + list.push({ | ||
| 536 | + key : key, | ||
| 537 | + serviceMileage: gb_sch_mileage_count.serviceMileage(data[key]), | ||
| 538 | + destroyMileage: gb_sch_mileage_count.destroyMileage(data[key]), | ||
| 539 | + emptyMileage: gb_sch_mileage_count.emptyMileage(data[key]) | ||
| 540 | + }) | ||
| 541 | + } | ||
| 542 | + var htmlStr = temps['sch-lp-mileage-tip-temp']({data: list, lpName:lpName}); | ||
| 543 | + $('.mileage_elec_panel', wrap).html(htmlStr).addClass('uk-animation-slide-bottom').show() | ||
| 544 | + .one('animationEnd', function () { | ||
| 545 | + $(this).removeClass('uk-animation-slide-bottom'); | ||
| 546 | + }); | ||
| 547 | + }; | ||
| 548 | + | ||
| 549 | + /** | ||
| 550 | + * 分组数据,处理子任务里的中途换车 | ||
| 551 | + * @param array | ||
| 552 | + */ | ||
| 553 | + var mileageTipGroupData = function (arr) { | ||
| 554 | + var list = JSON.parse(JSON.stringify(arr)); | ||
| 555 | + var cts; | ||
| 556 | + var zthcArray=[]; | ||
| 557 | + var sch; | ||
| 558 | + for(var i=0,len=list.length;i<len;i++){ | ||
| 559 | + sch = list[i]; | ||
| 560 | + cts = sch['cTasks']; | ||
| 561 | + if(!cts || cts.length==0) | ||
| 562 | + continue; | ||
| 563 | + | ||
| 564 | + sch['cTasks'] = []; | ||
| 565 | + //有子任务 | ||
| 566 | + for(var j=0,ct;ct=cts[j++];){ | ||
| 567 | + if(!ct.nbbm || ct.nbbm==sch.clZbh){ | ||
| 568 | + sch['cTasks'].push(ct); | ||
| 569 | + continue; | ||
| 570 | + } | ||
| 571 | + | ||
| 572 | + zthcArray.push(cloneByCTask(sch, ct)); | ||
| 573 | + } | ||
| 574 | + } | ||
| 575 | + | ||
| 576 | + if(zthcArray.length > 0) | ||
| 577 | + list = list.concat(zthcArray); | ||
| 578 | + | ||
| 579 | + var data={},key; | ||
| 580 | + for(var i=0,len=list.length;i<len;i++){ | ||
| 581 | + key = list[i].clZbh+'/'+list[i].jGh+'('+list[i].jName+')'; | ||
| 582 | + if(!data[key]) | ||
| 583 | + data[key] = []; | ||
| 584 | + data[key].push(list[i]); | ||
| 585 | + } | ||
| 586 | + return data; | ||
| 587 | + }; | ||
| 588 | + | ||
| 589 | + var cloneByCTask = function (sch, ct) { | ||
| 590 | + var newObj = JSON.parse(JSON.stringify(sch)); | ||
| 591 | + newObj['cTasks']=[]; | ||
| 592 | + newObj.clZbh = ct.nbbm; | ||
| 593 | + newObj.fcsjActual = ct.startDate; | ||
| 594 | + newObj.zdsjActual = ct.endDate; | ||
| 595 | + newObj.jhlc = ct.mileage; | ||
| 596 | + newObj.jhlcOrig = ct.mileage; | ||
| 597 | + | ||
| 598 | + if(ct.type2=='1') | ||
| 599 | + newObj.bcType='normal'; | ||
| 600 | + else if(ct.type2=='2'){ | ||
| 601 | + newObj.bcType='in'; | ||
| 602 | + }else if(ct.type2=='3') | ||
| 603 | + newObj.bcType='out'; | ||
| 604 | + | ||
| 605 | + return newObj; | ||
| 606 | + }; | ||
| 607 | + | ||
| 608 | + //头部点击去掉选中光标 | ||
| 609 | + $(document).on('click', '.header-title', function () { | ||
| 610 | + reset_drag_active_all(this); | ||
| 611 | + }); | ||
| 612 | + | ||
| 613 | + var scroToDl = function (sch) { | ||
| 614 | + var dl = getDl(sch), | ||
| 615 | + cont = dl.parents('.ct_table_wrap'), | ||
| 616 | + diff = cont.height() / 2; | ||
| 617 | + cont.animate({ | ||
| 618 | + scrollTop: dl.offset().top - cont.offset().top + cont.scrollTop() - diff | ||
| 619 | + }, 500); | ||
| 620 | + | ||
| 621 | + return dl; | ||
| 622 | + }; | ||
| 623 | + | ||
| 624 | + var getDl = function (sch) { | ||
| 625 | + return $('dl[data-id=' + sch.id + ']', $('.line_schedule[data-id=' + sch.xlBm + ']')); | ||
| 626 | + }; | ||
| 627 | + | ||
| 628 | + var reset_drag_active_all = function (dd) { | ||
| 629 | + $(dd).parents('.schedule-wrap').find('dl.drag-active').removeClass('drag-active'); | ||
| 630 | + reset_relevance_active(dd); | ||
| 631 | + | ||
| 632 | + $('.mileage_elec_panel', $(dd).parents('.top-container')).hide().remove('uk-animation-slide-bottom'); | ||
| 633 | + }; | ||
| 634 | + | ||
| 635 | + var reset_relevance_active = function (dd) { | ||
| 636 | + $(dd).parents('.uk-grid.schedule-wrap').find('.relevance-active').removeClass('relevance-active intimity'); | ||
| 637 | + }; | ||
| 638 | + | ||
| 639 | + | ||
| 640 | + //计算应发未发数量 car_yfwf_map | ||
| 641 | + var calc_yfwf_num = function (lineCode) { | ||
| 642 | + | ||
| 643 | + var schArr = gb_common.get_vals(line2Schedule[lineCode]).sort(schedule_sort), | ||
| 644 | + yfwf_num = 0, | ||
| 645 | + t = new Date().valueOf(); | ||
| 646 | + | ||
| 647 | + var carYfwfMap = {}, nbbm; | ||
| 648 | + $.each(schArr, function () { | ||
| 649 | + /*if (this.dfsjT > t) | ||
| 650 | + return false;*/ | ||
| 651 | + | ||
| 652 | + if (this.dfsjT < t && | ||
| 653 | + this.fcsjActual == null && this.fcsjActualTime == null && this.status != -1) { | ||
| 654 | + yfwf_num++; | ||
| 655 | + nbbm = this.clZbh; | ||
| 656 | + if (carYfwfMap[nbbm]) | ||
| 657 | + carYfwfMap[nbbm]++; | ||
| 658 | + else | ||
| 659 | + carYfwfMap[nbbm] = 1; | ||
| 660 | + } | ||
| 661 | + }); | ||
| 662 | + car_yfwf_map[lineCode] = carYfwfMap; | ||
| 663 | + | ||
| 664 | + $('#badge_yfwf_num_' + lineCode).text(yfwf_num); | ||
| 665 | + }; | ||
| 666 | + | ||
| 667 | + //标记终点时间 -线路 | ||
| 668 | + var markerLastByLine = function (lineCode) { | ||
| 669 | + var data = gb_common.groupBy(gb_common.get_vals(line2Schedule[lineCode]).filter(schDestroyFilter), 'lpName'); | ||
| 670 | + | ||
| 671 | + var array, lastSch, dl; | ||
| 672 | + for (var nbbm in data) { | ||
| 673 | + array = data[nbbm].sort(schedule_sort); | ||
| 674 | + markerLastSch(array); | ||
| 675 | + } | ||
| 676 | + }; | ||
| 677 | + | ||
| 678 | + //标记终点时间 -车辆 | ||
| 679 | + var markerLastByNbbm = function (lineCode, nbbm) { | ||
| 680 | + var array = gb_common.get_vals(line2Schedule[lineCode]).filter(function (a) { | ||
| 681 | + return a.clZbh == nbbm && a.status != -1; | ||
| 682 | + }).sort(schedule_sort); | ||
| 683 | + | ||
| 684 | + removeMarkers(lineCode, array); | ||
| 685 | + markerLastSch(array); | ||
| 686 | + }; | ||
| 687 | + | ||
| 688 | + var markerLastSch = function (array) { | ||
| 689 | + var lastSch = array[array.length - 1]; | ||
| 690 | + | ||
| 691 | + if (!lastSch.jhlc) | ||
| 692 | + return; | ||
| 693 | + | ||
| 694 | + var dl = getDl(lastSch); | ||
| 695 | + dl.addClass('dl-last-sch'); | ||
| 696 | + | ||
| 697 | + $('dd.fcsjActualCell', dl).append(temps['last-sch-sunken-temp'](lastSch)); | ||
| 698 | + }; | ||
| 699 | + | ||
| 700 | + //清除线路下指定班次的 末班标记 | ||
| 701 | + var removeMarkers = function (lineCode, array) { | ||
| 702 | + var idx = []; | ||
| 703 | + $.each(array, function () { | ||
| 704 | + idx.push(this.id); | ||
| 705 | + }); | ||
| 706 | + | ||
| 707 | + $('dl.dl-last-sch', 'li.line_schedule[data-id=' + lineCode + ']').each(function () { | ||
| 708 | + if ($(this).hasClass('dl-last-sch') && idx.indexOf($(this).data('id'))) { | ||
| 709 | + $(this).removeClass('dl-last-sch').find('.last-sch-sunken').remove(); | ||
| 710 | + } | ||
| 711 | + }); | ||
| 712 | + }; | ||
| 713 | + | ||
| 714 | + var schDestroyFilter = function (a) { | ||
| 715 | + return a.status != -1; | ||
| 716 | + }; | ||
| 717 | + | ||
| 718 | + /* 下一个班次 */ | ||
| 719 | + var getNextSch = function (sch) { | ||
| 720 | + var array = gb_common.get_vals(line2Schedule[sch.xlBm]).filter(function (a) { | ||
| 721 | + return a.clZbh == sch.clZbh; | ||
| 722 | + }).sort(schedule_sort); | ||
| 723 | + | ||
| 724 | + for (var i = 0, item; item = array[i++];) { | ||
| 725 | + if (array[i].id == sch.id) { | ||
| 726 | + return i < array.length ? array[i + 1] : null; | ||
| 727 | + } | ||
| 728 | + } | ||
| 729 | + }; | ||
| 730 | + | ||
| 731 | + /* 下一个班次普通班次 */ | ||
| 732 | + var getNextNormalSch = function (sch) { | ||
| 733 | + | ||
| 734 | + var array = gb_common.get_vals(line2Schedule[sch.xlBm]).filter(function (a) { | ||
| 735 | + return a.clZbh == sch.clZbh && a.bcType=='normal'; | ||
| 736 | + }).sort(schedule_sort); | ||
| 737 | + | ||
| 738 | + for (var i = 0; i < array.length; i++) { | ||
| 739 | + if (array[i].id == sch.id) { | ||
| 740 | + return i < array.length ? array[i + 1] : null; | ||
| 741 | + } | ||
| 742 | + } | ||
| 743 | + }; | ||
| 744 | + | ||
| 745 | + /** 添加备注信息 */ | ||
| 746 | + var addRemarks = function (list, remarks) { | ||
| 747 | + //if(!list || list) | ||
| 748 | + var i = 0, sch; | ||
| 749 | + | ||
| 750 | + (function () { | ||
| 751 | + var f = arguments.callee; | ||
| 752 | + if(i >= list.length){ | ||
| 753 | + return; | ||
| 754 | + } | ||
| 755 | + sch = list[i]; | ||
| 756 | + gb_common.$post('/realSchedule/addRemarks', {id: sch.id, remarks: remarks}, function (rs) { | ||
| 757 | + if(rs.t){ | ||
| 758 | + sch = rs.t; | ||
| 759 | + line2Schedule[sch.xlBm][sch.id] = sch; | ||
| 760 | + updateDom(sch); | ||
| 761 | + i++; | ||
| 762 | + f(); | ||
| 763 | + } | ||
| 764 | + }); | ||
| 765 | + })(); | ||
| 766 | + }; | ||
| 767 | + | ||
| 768 | + /** | ||
| 769 | + * 显示误点停靠时间标记 | ||
| 770 | + * @param id | ||
| 771 | + * @param minute | ||
| 772 | + */ | ||
| 773 | + var showLateBadge = function (lineCode, id, minute) { | ||
| 774 | + var dfCell = cancelLateBadge(lineCode, id); | ||
| 775 | + $(dfCell).append('<span class="late-badge">?+5</span>'); | ||
| 776 | + }; | ||
| 777 | + | ||
| 778 | + /** | ||
| 779 | + * 取消误点标记 | ||
| 780 | + * @param lineCode | ||
| 781 | + * @param id | ||
| 782 | + */ | ||
| 783 | + var cancelLateBadge = function (lineCode, id) { | ||
| 784 | + var $dl = getDl({id: id, xlBm: lineCode}); | ||
| 785 | + var dfCell = $dl.find('dd')[6]; | ||
| 786 | + $('.late-badge',dfCell).remove(); | ||
| 787 | + return dfCell; | ||
| 788 | + }; | ||
| 789 | + | ||
| 790 | + | ||
| 791 | + /** | ||
| 792 | + * 刷新页面的所有线路班次 | ||
| 793 | + */ | ||
| 794 | + var refreshAll = function () { | ||
| 795 | + show(); | ||
| 796 | + }; | ||
| 797 | + | ||
| 798 | + /** | ||
| 799 | + * 获取线路下营运的车辆 | ||
| 800 | + */ | ||
| 801 | + var findNbbmByLineCode = function (lineCode) { | ||
| 802 | + try{ | ||
| 803 | + return gb_common.get_keys(gb_common.extractNbbm(gb_common.get_vals(line2Schedule[lineCode]))); | ||
| 804 | + }catch (e){ | ||
| 805 | + return []; | ||
| 806 | + } | ||
| 807 | + }; | ||
| 808 | + | ||
| 809 | + var clearActualTime = function (sch) { | ||
| 810 | + try{ | ||
| 811 | + sch.fcsjActual=null; | ||
| 812 | + sch.fcsjActualTime=null; | ||
| 813 | + sch.zdsjActual=null; | ||
| 814 | + sch.zdsjActualTime=null; | ||
| 815 | + }catch (e){ | ||
| 816 | + console.log(e); | ||
| 817 | + } | ||
| 818 | + }; | ||
| 819 | + | ||
| 820 | + return { | ||
| 821 | + show: show, | ||
| 822 | + findScheduleByLine: findScheduleByLine, | ||
| 823 | + updateSchedule: updateSchedule, | ||
| 824 | + updateData: updateData, | ||
| 825 | + deheteSchedule: deheteSchedule, | ||
| 826 | + insertSchedule: insertSchedule, | ||
| 827 | + schedule_sort: schedule_sort, | ||
| 828 | + calc_yfwf_num: calc_yfwf_num, | ||
| 829 | + car_yfwf_map: function (lineCode) { | ||
| 830 | + return car_yfwf_map[lineCode]; | ||
| 831 | + }, | ||
| 832 | + scroToDl: scroToDl, | ||
| 833 | + reset_drag_active_all: reset_drag_active_all, | ||
| 834 | + getDl: getDl, | ||
| 835 | + getNextSch: getNextSch, | ||
| 836 | + addRemarks: addRemarks, | ||
| 837 | + reLoadAndRefresh: reLoadAndRefresh, | ||
| 838 | + showLateBadge: showLateBadge, | ||
| 839 | + cancelLateBadge: cancelLateBadge, | ||
| 840 | + refreshAll: refreshAll, | ||
| 841 | + getNextNormalSch: getNextNormalSch, | ||
| 842 | + findNbbmByLineCode:findNbbmByLineCode, | ||
| 843 | + showLpMileageTipBySch: showLpMileageTipBySch, | ||
| 844 | + renderCarRemark: renderCarRemark | ||
| 845 | + }; | ||
| 846 | +})(); |
src/main/resources/static/real_control_v3/js/main.js
0 → 100644
| 1 | +/* main js */ | ||
| 2 | +var gb_main_ep = new EventProxy(), | ||
| 3 | + res_load_ep = EventProxy.create('load_data_basic', 'load_tab', 'load_home_layout', 'load_home_line_panel', function () { | ||
| 4 | + var eq = gb_main_ep; | ||
| 5 | + // basic data end | ||
| 6 | + eq.once('data-basic', g_emit('tab')); | ||
| 7 | + // tabs | ||
| 8 | + eq.once('tab', function () { | ||
| 9 | + gb_tabs.init( | ||
| 10 | + g_emit('home-layout') | ||
| 11 | + ); | ||
| 12 | + }); | ||
| 13 | + //home layout | ||
| 14 | + eq.once('home-layout', function () { | ||
| 15 | + gb_home_layout.layout( | ||
| 16 | + g_emit('home-line-panel') | ||
| 17 | + ); | ||
| 18 | + }); | ||
| 19 | + //home line panel | ||
| 20 | + eq.once('home-line-panel', function () { | ||
| 21 | + gb_home_line_panel.init(g_emit('gps-time-refresh')); | ||
| 22 | + }); | ||
| 23 | + | ||
| 24 | + //start fixed time refresh gps | ||
| 25 | + eq.once('gps-time-refresh', function () { | ||
| 26 | + gb_data_gps.fixedTimeRefresh(); | ||
| 27 | + g_emit('line-schedule-layout')(); | ||
| 28 | + }); | ||
| 29 | + | ||
| 30 | + //line schedule layout | ||
| 31 | + eq.once('line-schedule-layout', function () { | ||
| 32 | + gb_line_layout.layout(g_emit('render-sch-table')); | ||
| 33 | + }); | ||
| 34 | + | ||
| 35 | + //render schedule table | ||
| 36 | + eq.once('render-sch-table', function () { | ||
| 37 | + gb_schedule_table.show(function () { | ||
| 38 | + //加载信号状态 | ||
| 39 | + gb_signal_state.init(); | ||
| 40 | + }); | ||
| 41 | + | ||
| 42 | + //初始化gps异常判定 | ||
| 43 | + gb_gps_abnormal.initData(); | ||
| 44 | + | ||
| 45 | + setTimeout(function () { | ||
| 46 | + //嵌入地图页面 | ||
| 47 | + $('li.map-panel', '#main-tab-content').load('/real_control_v3/mapmonitor/real.html'); | ||
| 48 | + }, 1000); | ||
| 49 | + //弹出更新说明 | ||
| 50 | + //showUpdateDescription(); | ||
| 51 | + }); | ||
| 52 | + | ||
| 53 | + function g_emit(id) { | ||
| 54 | + console.log('g_emit [' + id + ']'); | ||
| 55 | + return function () { | ||
| 56 | + console.log('eq.emitLater(' + id + ')'); | ||
| 57 | + return eq.emitLater(id); | ||
| 58 | + }; | ||
| 59 | + } | ||
| 60 | + }); | ||
| 61 | + | ||
| 62 | +$(document).on('click', '.ct-bottom-drawer-close', function () { | ||
| 63 | + $(this).parents('.ct-bottom-drawer').removeClass('open'); | ||
| 64 | +}); | ||
| 65 | + | ||
| 66 | +function connectArr(arr, separator, transFun) { | ||
| 67 | + var rs = ''; | ||
| 68 | + $.each(arr, function (i, item) { | ||
| 69 | + if (transFun) | ||
| 70 | + item = transFun(item); | ||
| 71 | + rs += (separator + item); | ||
| 72 | + }); | ||
| 73 | + return rs.substr(separator.length); | ||
| 74 | +} | ||
| 75 | + | ||
| 76 | +var gb_form_validation_opts = { | ||
| 77 | + framework: 'uikit', | ||
| 78 | + locale: 'zh_CN', | ||
| 79 | + icon: { | ||
| 80 | + valid: 'uk-icon-check', | ||
| 81 | + invalid: 'uk-icon-times', | ||
| 82 | + validating: 'uk-icon-refresh' | ||
| 83 | + } | ||
| 84 | +}; | ||
| 85 | + | ||
| 86 | + | ||
| 87 | +var notify_wait = function (t) { | ||
| 88 | + UIkit.notify("<i class='uk-icon-spinner uk-icon-spin'></i> " + t, { | ||
| 89 | + status: 'info' | ||
| 90 | + }); | ||
| 91 | +}; | ||
| 92 | + | ||
| 93 | +var notify_succ = function (t) { | ||
| 94 | + UIkit.notify("<i class='uk-icon-check'></i> " + t, { | ||
| 95 | + status: 'success' | ||
| 96 | + }); | ||
| 97 | +}; | ||
| 98 | + | ||
| 99 | +var notify_err = function (t) { | ||
| 100 | + UIkit.notify("<i class='uk-icon-times'></i> " + t, { | ||
| 101 | + status: 'danger' | ||
| 102 | + }); | ||
| 103 | +}; | ||
| 104 | + | ||
| 105 | +var alt_confirm = function (content, succ, okBtn, noCenter) { | ||
| 106 | + var modalEl = UIkit.modal.confirm(content, function () { | ||
| 107 | + succ && succ(); | ||
| 108 | + modalEl.hide(); | ||
| 109 | + }, { | ||
| 110 | + labels: { | ||
| 111 | + Ok: okBtn, | ||
| 112 | + Cancel: '取消' | ||
| 113 | + } | ||
| 114 | + , center: !noCenter | ||
| 115 | + }); | ||
| 116 | +}; | ||
| 117 | + | ||
| 118 | +var show_wait_modal = function (text) { | ||
| 119 | + var modalHtml = | ||
| 120 | + '<div class="uk-modal" id="gb_wait_modal">' + | ||
| 121 | + ' <div class="uk-modal-dialog">' + | ||
| 122 | + ' <div class="uk-modal-spinner"></div>' + | ||
| 123 | + ' <div class="wait-modal-text">' + text + '</div>' + | ||
| 124 | + ' </div>' + | ||
| 125 | + '</div>'; | ||
| 126 | + | ||
| 127 | + $(document.body).append(modalHtml); | ||
| 128 | + return UIkit.modal('#gb_wait_modal', { | ||
| 129 | + bgclose: false, | ||
| 130 | + modal: false | ||
| 131 | + }).show(); | ||
| 132 | +}; | ||
| 133 | + | ||
| 134 | +var hide_wait_modal = function () { | ||
| 135 | + UIkit.modal('#gb_wait_modal').hide(); | ||
| 136 | +}; | ||
| 137 | + | ||
| 138 | + | ||
| 139 | +var isArray = function (obj) { | ||
| 140 | + return Object.prototype.toString.call(obj) === '[object Array]'; | ||
| 141 | +}; | ||
| 142 | + | ||
| 143 | +var notify_err_form = function (t, form) { | ||
| 144 | + $('.uk-alert-danger', form).remove(); | ||
| 145 | + $('.uk-modal-footer', form).before('<div class="uk-alert uk-alert-danger" data-uk-alert="">' + | ||
| 146 | + '<a href="" class="uk-alert-close uk-close"></a>' + | ||
| 147 | + '<p>' + t + '</p>' + | ||
| 148 | + '</div>'); | ||
| 149 | + | ||
| 150 | + enable_submit_btn(form); | ||
| 151 | +}; | ||
| 152 | + | ||
| 153 | +var enable_submit_btn = function (form) { | ||
| 154 | + var subBtn = $('button[type=submit]', form); | ||
| 155 | + if (subBtn) { | ||
| 156 | + subBtn.removeClass('disabled').removeAttr('disabled'); | ||
| 157 | + } | ||
| 158 | +}; | ||
| 159 | + | ||
| 160 | +var disabled_submit_btn = function (form) { | ||
| 161 | + var subBtn = $('button[type=submit]', form); | ||
| 162 | + if (subBtn) { | ||
| 163 | + subBtn.addClass('disabled').attr('disabled', 'disabled'); | ||
| 164 | + } | ||
| 165 | +}; | ||
| 166 | + | ||
| 167 | + | ||
| 168 | +function showUpdateDescription() { | ||
| 169 | + //更新说明 | ||
| 170 | + var updateDescription = { | ||
| 171 | + date: '2017-11-25_中午', | ||
| 172 | + text: '<h5>1、修复这个版本的一个问题,这个问题导致首站和第二站重叠的时候无法发车。</h5><h5>2、修复455路因 昌邑路民生路 和 昌邑路苗圃路 站点顺序颠倒引发的上下行跳动问题。</h5><h5>3、放宽对中途站的检测机制,如果仍然有线路出现上下行乱跳的问题,及时上报管理员。</h5>' | ||
| 173 | + }; | ||
| 174 | + | ||
| 175 | + var storage = window.localStorage | ||
| 176 | + , key = 'update_' + updateDescription.date; | ||
| 177 | + var text = storage.getItem(key); | ||
| 178 | + if (!text) { | ||
| 179 | + var modal = '<div class="uk-modal" id="update-description-modal">' + | ||
| 180 | + ' <div class="uk-modal-dialog">' + | ||
| 181 | + ' <a class="uk-modal-close uk-close"></a>' + | ||
| 182 | + ' <div class="uk-modal-header">' + | ||
| 183 | + ' <h2>' + updateDescription.date + ' 更新说明</h2></div>' + updateDescription.text + | ||
| 184 | + ' </div>'; | ||
| 185 | + | ||
| 186 | + show_modal('#update-description-modal', modal); | ||
| 187 | + storage.setItem(key, updateDescription.text); | ||
| 188 | + } | ||
| 189 | +} | ||
| 0 | \ No newline at end of file | 190 | \ No newline at end of file |
src/main/resources/static/real_control_v3/js/north/toolbar.js
0 → 100644
| 1 | +/* main.html north toolbar js */ | ||
| 2 | + | ||
| 3 | +var gb_northToolbar = (function () { | ||
| 4 | + | ||
| 5 | + var modal_opts = {center: true, bgclose: false}; | ||
| 6 | + var currentUser; | ||
| 7 | + | ||
| 8 | + var init = function () { | ||
| 9 | + $.get('/real_control_v3/fragments/north/toolbar.html', function (temp) { | ||
| 10 | + ep.emit("template", temp); | ||
| 11 | + }); | ||
| 12 | + | ||
| 13 | + $.get('/real_control_v3/js/data/json/north_toolbar.json', function (data) { | ||
| 14 | + ep.emit("data", data); | ||
| 15 | + }); | ||
| 16 | + | ||
| 17 | + //查询线调权限信息 | ||
| 18 | + $.get('/freeLogin/realControAuthority/findByCurrentUser', {userId: 0}, function (rs) { | ||
| 19 | + ep.emit("xd_auth", rs); | ||
| 20 | + }); | ||
| 21 | + | ||
| 22 | + var xd_auth;//线调权限 | ||
| 23 | + var ep = EventProxy.create("template", "data", 'xd_auth', function (temp, data, auth) { | ||
| 24 | + var tempId = '#north-toolbar-temp'; | ||
| 25 | + xd_auth = auth; | ||
| 26 | + currentUser = {}; | ||
| 27 | + var t = $(tempId, temp).html() | ||
| 28 | + , htmlStr = template.render(t)({list: data, user: currentUser}); | ||
| 29 | + $('.north .north-toolbar').html(htmlStr); | ||
| 30 | + | ||
| 31 | + //exit | ||
| 32 | + $('.north .north-toolbar .exit-system').on('click', function () { | ||
| 33 | + //关闭websocket 连接 | ||
| 34 | + gb_sch_websocket.sock().close(1000, '退出线调'); | ||
| 35 | + window.location.href = '/pages/control/lineallot_v3/iframe_wrap.html'; | ||
| 36 | + }); | ||
| 37 | + | ||
| 38 | + //过滤菜单 | ||
| 39 | + var excludes=[]; | ||
| 40 | + if(xd_auth.excludeMenus) | ||
| 41 | + excludes=xd_auth.excludeMenus.split(','); | ||
| 42 | + if(excludes.length>0){ | ||
| 43 | + $('li.event', '#north_toolbar_panel').each(function () { | ||
| 44 | + if(excludes.indexOf($('a', this).data('event'))!=-1) | ||
| 45 | + $(this).remove(); | ||
| 46 | + }); | ||
| 47 | + } | ||
| 48 | + }); | ||
| 49 | + }; | ||
| 50 | + | ||
| 51 | + init(); | ||
| 52 | + $(document).on('click', '#north_toolbar_panel li.event a', function () { | ||
| 53 | + var event = $(this).data('event'); | ||
| 54 | + handler[event] && handler[event](); | ||
| 55 | + }); | ||
| 56 | + | ||
| 57 | + //electron环境 | ||
| 58 | + if(isElectron){ | ||
| 59 | + tempId = '#north-toolbar-electron-temp'; | ||
| 60 | + //最小化 | ||
| 61 | + $(document).on('click', '#mnavbarIconBtnMIN', function () { | ||
| 62 | + ipcMain.send('webPageMainWindowMinimize'); | ||
| 63 | + }); | ||
| 64 | + //关闭 | ||
| 65 | + $(document).on('click', '#mnavbarIconBtnCLOSE', function () { | ||
| 66 | + ipcMain.send('webPageMainWindowClose'); | ||
| 67 | + }); | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + var handler = { | ||
| 71 | + gps_play_back: function () { | ||
| 72 | + gb_map_play_back.initParams(); | ||
| 73 | + } | ||
| 74 | + }; | ||
| 75 | + | ||
| 76 | + return { | ||
| 77 | + user: function () { | ||
| 78 | + return currentUser; | ||
| 79 | + }, | ||
| 80 | + init: init | ||
| 81 | + } | ||
| 82 | +})(); |
src/main/resources/static/real_control_v3/js/utils/dispatch_pattern.js
0 → 100644
| 1 | +/** 调度模式 */ | ||
| 2 | + | ||
| 3 | +//主调和监控模式 | ||
| 4 | +var operationMode = window.localStorage.getItem('operationMode'); | ||
| 5 | +var gb_dp_initHttpIntercept = function () { | ||
| 6 | + $(document).off('ajaxSend', interceptPOST); | ||
| 7 | + $('body>.north').removeClass('monitor main'); | ||
| 8 | + if (operationMode == 0) { | ||
| 9 | + $('body>.north').addClass('monitor'); | ||
| 10 | + $(document).on('ajaxSend', interceptPOST); | ||
| 11 | + } | ||
| 12 | + else | ||
| 13 | + $('body>.north').addClass('main'); | ||
| 14 | + | ||
| 15 | +}; | ||
| 16 | + | ||
| 17 | +gb_dp_initHttpIntercept(); | ||
| 18 | +//gb_delay_write_log(); | ||
| 19 | + | ||
| 20 | +//拦截POST请求 | ||
| 21 | +function interceptPOST(e, xhr, t) { | ||
| 22 | + if (t && (t.method == 'POST' || t.type == 'POST')) { | ||
| 23 | + xhr.abort(); | ||
| 24 | + notify_err('监控模式!'); | ||
| 25 | + } | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +//全局 ajaxError 事件 | ||
| 29 | +$(document).ajaxError(function (event, jqxhr) { | ||
| 30 | + if (jqxhr.status == 403) { | ||
| 31 | + UIkit.modal.alert('<span style="color: red;">访问被拒绝,你没有这个权限!</span>', {labels: {Ok: '确定'}}); | ||
| 32 | + } | ||
| 33 | +}); |
src/main/resources/static/real_control_v3/js/websocket/sch_websocket.js
0 → 100644
| 1 | +var gb_sch_websocket = (function () { | ||
| 2 | + | ||
| 3 | + var temps; | ||
| 4 | + $.get('/real_control_v3/fragments/line_schedule/sys_mailbox.html', function (dom) { | ||
| 5 | + temps = gb_common.compileTempByDom(dom); | ||
| 6 | + }); | ||
| 7 | + | ||
| 8 | + var schSock = null; | ||
| 9 | + var recInterval = null; | ||
| 10 | + var reConnSpace = 1500;//重连间隔 | ||
| 11 | + var reConnCount; //重连次数 | ||
| 12 | + var maxReConn = 6; //最多重连次数 | ||
| 13 | + var new_conn = function () { | ||
| 14 | + schSock = new SockJS('/freeLogin/sockjs/realcontrol'); | ||
| 15 | + schSock.onopen = function (e) { | ||
| 16 | + if(reConnCount && reConnCount > 1){ | ||
| 17 | + gb_schedule_table.refreshAll(); | ||
| 18 | + console.log('重新连接,刷新班次'); | ||
| 19 | + } | ||
| 20 | + reConnCount = 1; | ||
| 21 | + clearInterval(recInterval); | ||
| 22 | + console.log('webSocket[realcontrol] onopen'); | ||
| 23 | + $('body>.north').removeClass('scok-colse'); | ||
| 24 | + setTimeout(regListen, 500); | ||
| 25 | + }; | ||
| 26 | + | ||
| 27 | + //接收消息 | ||
| 28 | + schSock.onmessage = function (e) { | ||
| 29 | + try { | ||
| 30 | + var jsonMsg = $.parseJSON(e.data); | ||
| 31 | + msgHandle[jsonMsg.fn](jsonMsg); | ||
| 32 | + } catch (e) { | ||
| 33 | + console.log(e, e.data); | ||
| 34 | + } | ||
| 35 | + }; | ||
| 36 | + | ||
| 37 | + //断开 | ||
| 38 | + schSock.onclose = function (e) { | ||
| 39 | + console.log('和服务器连接断开....', e); | ||
| 40 | + $('body>.north').addClass('scok-colse'); | ||
| 41 | + //1.5秒后重新连接 | ||
| 42 | + recInterval = setTimeout(function () { | ||
| 43 | + reConnCount++; | ||
| 44 | + if(reConnCount > maxReConn){ | ||
| 45 | + $('body>.north').addClass('re_conn_error'); | ||
| 46 | + clearInterval(recInterval); | ||
| 47 | + return; | ||
| 48 | + } | ||
| 49 | + new_conn(); | ||
| 50 | + }, reConnSpace * reConnCount); | ||
| 51 | + }; | ||
| 52 | + }; | ||
| 53 | + | ||
| 54 | + //初始化websocket连接 | ||
| 55 | + new_conn(); | ||
| 56 | + | ||
| 57 | + function regListen() { | ||
| 58 | + //注册线路监听 | ||
| 59 | + var data = { | ||
| 60 | + operCode: 'register_line', | ||
| 61 | + idx: gb_data_basic.line_idx | ||
| 62 | + }; | ||
| 63 | + schSock.send(JSON.stringify(data)); | ||
| 64 | + console.log('regListen....', data); | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + /** | ||
| 68 | + * 计算未处理消息 | ||
| 69 | + */ | ||
| 70 | + var calcUntreated = function (lineCode) { | ||
| 71 | + var size = $('li.line_schedule[data-id=' + lineCode + '] .sys-mailbox .sys-mail-item').length; | ||
| 72 | + $('#badge_untreated_num_' + lineCode).text(size); | ||
| 73 | + }; | ||
| 74 | + | ||
| 75 | + var calcUntreatedAll = function () { | ||
| 76 | + $('#main-tab-content li.line_schedule').each(function () { | ||
| 77 | + calcUntreated($(this).data('id')); | ||
| 78 | + }); | ||
| 79 | + }; | ||
| 80 | + | ||
| 81 | + | ||
| 82 | + //80协议上报 | ||
| 83 | + var report80 = function (msg) { | ||
| 84 | + msg.dateStr = moment(msg.timestamp).format('HH:mm'); | ||
| 85 | + msg.text = gb_common.reqCode80[msg.data.requestCode]; | ||
| 86 | + if (!msg.text) | ||
| 87 | + msg.text = '(未知的请求码 ' + msg.data.requestCode + ')'; | ||
| 88 | + | ||
| 89 | + var $item = $(temps['sys-note-80-temp'](msg)); | ||
| 90 | + findMailBox(msg.data.lineId).prepend($item); | ||
| 91 | + //tts | ||
| 92 | + var ttsMsg = $item.find('.uk-panel-title').text(); | ||
| 93 | + gb_tts.speak(ttsMsg, msg.data.lineId); | ||
| 94 | + | ||
| 95 | + calcUntreated(msg.data.lineId); | ||
| 96 | + }; | ||
| 97 | + | ||
| 98 | + var safeDriv = function (msg) { | ||
| 99 | + gb_safe_driv.pop(msg.t); | ||
| 100 | + }; | ||
| 101 | + | ||
| 102 | + /** | ||
| 103 | + * 自动误点调整 | ||
| 104 | + * @param msg | ||
| 105 | + */ | ||
| 106 | + var autoWdtz = function (msg) { | ||
| 107 | + var schId = msg.id; | ||
| 108 | + var minute = msg.minute; | ||
| 109 | + var lineCode = msg.lineCode; | ||
| 110 | + gb_schedule_table.showLateBadge(lineCode, schId, minute); | ||
| 111 | + if(msg['cancelId']){ | ||
| 112 | + gb_schedule_table.cancelLateBadge(lineCode, msg['cancelId']); | ||
| 113 | + } | ||
| 114 | + }; | ||
| 115 | + | ||
| 116 | + var waitRemoves = []; | ||
| 117 | + //车辆发出 | ||
| 118 | + var faChe = function (msg) { | ||
| 119 | + gb_schedule_table.updateSchedule(msg.t); | ||
| 120 | + msg.domId = 'fache_' + msg.t.id + '_' + parseInt(Math.random() * 10000); | ||
| 121 | + | ||
| 122 | + var $item = $(temps['sys-note-42-temp'](msg)); | ||
| 123 | + findMailBox(msg.t.xlBm).prepend($item); | ||
| 124 | + waitRemoves.push({ | ||
| 125 | + t: currentSecond(), | ||
| 126 | + dom: msg.domId | ||
| 127 | + }); | ||
| 128 | + | ||
| 129 | + //tts | ||
| 130 | + var ttsMsg = $item.find('.title').text(); | ||
| 131 | + gb_tts.speak(ttsMsg, msg.t.xlBm); | ||
| 132 | + gb_schedule_table.calc_yfwf_num(msg.t.xlBm); | ||
| 133 | + | ||
| 134 | + calcUntreated(msg.t.xlBm); | ||
| 135 | + }; | ||
| 136 | + | ||
| 137 | + //到达终点 | ||
| 138 | + var zhongDian = function (msg) { | ||
| 139 | + gb_schedule_table.updateSchedule(msg.t); | ||
| 140 | + gb_schedule_table.updateSchedule(msg.nt); | ||
| 141 | + msg.domId = 'zhongDian_' + msg.t.id + '_' + parseInt(Math.random() * 10000); | ||
| 142 | + | ||
| 143 | + var $item = $(temps['sys-note-42_1-temp'](msg)); | ||
| 144 | + findMailBox(msg.t.xlBm).prepend($item); | ||
| 145 | + waitRemoves.push({ | ||
| 146 | + t: currentSecond(), | ||
| 147 | + dom: msg.domId | ||
| 148 | + }); | ||
| 149 | + //tts | ||
| 150 | + var ttsMsg = $item.find('.title').text(); | ||
| 151 | + gb_tts.speak(ttsMsg, msg.t.xlBm); | ||
| 152 | + | ||
| 153 | + calcUntreated(msg.t.xlBm); | ||
| 154 | + //更新路牌公里统计面板 | ||
| 155 | + gb_schedule_table.showLpMileageTipBySch(msg.t); | ||
| 156 | + }; | ||
| 157 | + | ||
| 158 | + //服务器通知刷新班次 | ||
| 159 | + var refreshSch = function (msg) { | ||
| 160 | + gb_schedule_table.updateSchedule(msg.ts); | ||
| 161 | + /*//重新计算应发未发 | ||
| 162 | + var idx={}; | ||
| 163 | + $.each(msg.ts, function(i, t){ | ||
| 164 | + if(idx[t.xlBm]) | ||
| 165 | + return true; | ||
| 166 | + gb_schedule_table.calc_yfwf_num(t.xlBm); | ||
| 167 | + idx[t.xlBm]=1; | ||
| 168 | + });*/ | ||
| 169 | + }; | ||
| 170 | + | ||
| 171 | + //80消息确认 | ||
| 172 | + var d80Confirm = function (msg) { | ||
| 173 | + $('.sys-mailbox .sys-note-80[data-id=' + msg.id + ']').remove(); | ||
| 174 | + //重新计算未读消息 | ||
| 175 | + calcUntreated(msg.lineId); | ||
| 176 | + //重新计算应发未发 | ||
| 177 | + gb_schedule_table.calc_yfwf_num(msg.lineId); | ||
| 178 | + }; | ||
| 179 | + | ||
| 180 | + //指令状态改变 | ||
| 181 | + var directiveStatus = function (msg) { | ||
| 182 | + gb_schedule_table.updateSchedule(msg.t); | ||
| 183 | + }; | ||
| 184 | + | ||
| 185 | + //班次信号状态 | ||
| 186 | + var signalState = function (msg) { | ||
| 187 | + gb_signal_state.put(msg.data); | ||
| 188 | + }; | ||
| 189 | + | ||
| 190 | + var msgHandle = { | ||
| 191 | + report80: report80, | ||
| 192 | + faChe: faChe, | ||
| 193 | + zhongDian: zhongDian, | ||
| 194 | + refreshSch: refreshSch, | ||
| 195 | + d80Confirm: d80Confirm, | ||
| 196 | + directive: directiveStatus, | ||
| 197 | + signal_state: signalState, | ||
| 198 | + deviceOffline: deviceOffline, | ||
| 199 | + safeDriv: safeDriv, | ||
| 200 | + auto_wdtz: autoWdtz | ||
| 201 | + }; | ||
| 202 | + | ||
| 203 | + function currentSecond() { | ||
| 204 | + return Date.parse(new Date()) / 1000; | ||
| 205 | + } | ||
| 206 | + | ||
| 207 | + var mailBoxs = {}; | ||
| 208 | + | ||
| 209 | + function findMailBox(lineCode) { | ||
| 210 | + if (mailBoxs[lineCode]) | ||
| 211 | + return mailBoxs[lineCode]; | ||
| 212 | + | ||
| 213 | + var mbox = $('li.line_schedule[data-id=' + lineCode + ']').find('div.sys-mailbox'); | ||
| 214 | + mailBoxs[lineCode] = mbox; | ||
| 215 | + return mbox; | ||
| 216 | + } | ||
| 217 | + | ||
| 218 | + | ||
| 219 | + //42确定 | ||
| 220 | + $(document).on('click', '.sys-mailbox .sys-note-42 .uk-button-primary', function (e) { | ||
| 221 | + e.stopPropagation(); | ||
| 222 | + $(this).parents('.sys-note-42').remove(); | ||
| 223 | + var size = $(this).parents('.sys-mailbox').find('.sys-mail-item').length | ||
| 224 | + , lineCode = $(this).data('line'); | ||
| 225 | + | ||
| 226 | + $('#badge_untreated_num_' + lineCode).text(size); | ||
| 227 | + }); | ||
| 228 | + | ||
| 229 | + //42消息点击 | ||
| 230 | + $(document).on('click', '.sys-mailbox .sys-note-42', function () { | ||
| 231 | + var lineCode = $(this).parents('li.line_schedule').data('id') | ||
| 232 | + , id = $(this).data('id'); | ||
| 233 | + var sch = gb_schedule_table.findScheduleByLine(lineCode)[id]; | ||
| 234 | + var dl = gb_schedule_table.scroToDl(sch); | ||
| 235 | + //高亮 | ||
| 236 | + gb_schedule_table.reset_drag_active_all(dl); | ||
| 237 | + dl.addClass('relevance-active intimity').find('dd:eq(5)').trigger('click'); | ||
| 238 | + }); | ||
| 239 | + | ||
| 240 | + //80消息点击 | ||
| 241 | + $(document).on('click', '.sys-mailbox .sys-note-80', function () { | ||
| 242 | + var lineCode = $(this).parents('li.line_schedule').data('id') | ||
| 243 | + , id = $(this).data('schid'); | ||
| 244 | + var sch = gb_schedule_table.findScheduleByLine(lineCode)[id]; | ||
| 245 | + var dl = gb_schedule_table.scroToDl(sch); | ||
| 246 | + //高亮 | ||
| 247 | + gb_schedule_table.reset_drag_active_all(dl); | ||
| 248 | + dl.addClass('relevance-active intimity').find('dd:eq(5)').trigger('click'); | ||
| 249 | + }); | ||
| 250 | + | ||
| 251 | + //80同意 | ||
| 252 | + $(document).on('click', '.sys-mailbox .sys-note-80 .uk-button-primary', function (e) { | ||
| 253 | + e.stopPropagation(); | ||
| 254 | + $(this).attr('disabled', 'disabled'); | ||
| 255 | + var panel = $(this).parents('.sys-note-80') | ||
| 256 | + , id = panel.data('id'); | ||
| 257 | + | ||
| 258 | + reply80({id: id, reply: 0}); | ||
| 259 | + return false; | ||
| 260 | + }); | ||
| 261 | + | ||
| 262 | + //80不同意 | ||
| 263 | + $(document).on('click', '.sys-mailbox .sys-note-80 .uk-button.reject', function (e) { | ||
| 264 | + e.stopPropagation(); | ||
| 265 | + $(this).attr('disabled', 'disabled'); | ||
| 266 | + var panel = $(this).parents('.sys-note-80') | ||
| 267 | + , id = panel.data('id'); | ||
| 268 | + | ||
| 269 | + reply80({id: id, reply: -1}); | ||
| 270 | + return false; | ||
| 271 | + }); | ||
| 272 | + | ||
| 273 | + var reply80 = function (data, cb) { | ||
| 274 | + gb_common.$post('/directive/reply80', data, function (rs) { | ||
| 275 | + if (rs.msg) | ||
| 276 | + notify_succ(rs.msg); | ||
| 277 | + cb && cb(); | ||
| 278 | + }); | ||
| 279 | + }; | ||
| 280 | + | ||
| 281 | + | ||
| 282 | + //定时到离站信使清理掉 | ||
| 283 | + !function () { | ||
| 284 | + var f = arguments.callee, | ||
| 285 | + ct = Date.parse(new Date()) / 1000, | ||
| 286 | + item, elem; | ||
| 287 | + try { | ||
| 288 | + for (var i = 0; i < 1000; i++) { | ||
| 289 | + if (waitRemoves.length == 0) | ||
| 290 | + break; | ||
| 291 | + item = waitRemoves[0]; | ||
| 292 | + if (ct - item.t >= 30) { | ||
| 293 | + waitRemoves.shift(); | ||
| 294 | + elem = $('#' + item.dom); | ||
| 295 | + if (elem) | ||
| 296 | + elem.remove(); | ||
| 297 | + } | ||
| 298 | + } | ||
| 299 | + } catch (e) { | ||
| 300 | + console.log(e); | ||
| 301 | + } | ||
| 302 | + | ||
| 303 | + //计算未读消息 | ||
| 304 | + calcUntreatedAll(); | ||
| 305 | + setTimeout(f, 5000); | ||
| 306 | + }(); | ||
| 307 | + | ||
| 308 | + /** | ||
| 309 | + * 设备掉线 | ||
| 310 | + * @param msg | ||
| 311 | + */ | ||
| 312 | + function deviceOffline(msg) { | ||
| 313 | + gb_data_gps.deviceOffline(msg.gps); | ||
| 314 | + } | ||
| 315 | + | ||
| 316 | + /** | ||
| 317 | + * 信号撤销 | ||
| 318 | + */ | ||
| 319 | + $(document).on('click','.sys-note-42 .cancel_link', function () { | ||
| 320 | + var id = $(this).data('id'), | ||
| 321 | + lineCode = $(this).data('line'); | ||
| 322 | + | ||
| 323 | + var sch = gb_schedule_table.findScheduleByLine(lineCode)[id]; | ||
| 324 | + if(!sch) | ||
| 325 | + return; | ||
| 326 | + | ||
| 327 | + var confirmBtn = $(this).parent().find('.uk-button-primary'); | ||
| 328 | + var type = $(this).data('type'); | ||
| 329 | + var fun = type==1?gb_schedule_context_menu.cxzx:gb_schedule_context_menu.cxsf; | ||
| 330 | + | ||
| 331 | + fun(sch, function () { | ||
| 332 | + confirmBtn.trigger('click'); | ||
| 333 | + }); | ||
| 334 | + }); | ||
| 335 | + | ||
| 336 | + /** | ||
| 337 | + * 到站信号修改 | ||
| 338 | + */ | ||
| 339 | + $(document).on('click', '.sys-note-42 .edit_link', function () { | ||
| 340 | + var id = $(this).data('id'), | ||
| 341 | + lineCode = $(this).data('line'); | ||
| 342 | + | ||
| 343 | + var sch = gb_schedule_table.findScheduleByLine(lineCode)[id]; | ||
| 344 | + if(!sch) | ||
| 345 | + return; | ||
| 346 | + | ||
| 347 | + var nextSch = gb_schedule_table.getNextSch(sch); | ||
| 348 | + gb_schedule_context_menu.dftz(nextSch); | ||
| 349 | + }); | ||
| 350 | + | ||
| 351 | + /** | ||
| 352 | + * 信使 sys-note-80 编辑 | ||
| 353 | + */ | ||
| 354 | + $(document).on('click', '.sys-note-80 .edit_link', function () { | ||
| 355 | + var id = $(this).data('id'), | ||
| 356 | + lineCode = $(this).data('line'); | ||
| 357 | + | ||
| 358 | + var sch = gb_schedule_table.findScheduleByLine(lineCode)[id]; | ||
| 359 | + if(!sch) | ||
| 360 | + return; | ||
| 361 | + | ||
| 362 | + gb_schedule_context_menu.fcxxwt(sch); | ||
| 363 | + }); | ||
| 364 | + | ||
| 365 | + return { | ||
| 366 | + sock: function () { | ||
| 367 | + return schSock; | ||
| 368 | + } | ||
| 369 | + }; | ||
| 370 | +})(); |
src/main/resources/static/real_control_v3/main.html
0 → 100644
| 1 | +<!DOCTYPE html> | ||
| 2 | +<html lang="zh-cn"> | ||
| 3 | + | ||
| 4 | +<head> | ||
| 5 | + <meta charset="UTF-8"> | ||
| 6 | + <title>线路调度 v2.0</title> | ||
| 7 | + <!-- uikit core style--> | ||
| 8 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/css/uikit.gradient.min.css" /> | ||
| 9 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/notify.gradient.min.css" merge="plugins"/> | ||
| 10 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/tooltip.gradient.min.css" merge="plugins"/> | ||
| 11 | + <link rel="stylesheet" | ||
| 12 | + href="/real_control_v2/assets/plugins/uikit-2.27.1/components/autocomplete.gradient.min.css" merge="plugins"/> | ||
| 13 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/accordion.gradient.min.css" merge="plugins"/> | ||
| 14 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/slidenav.gradient.min.css" merge="plugins"/> | ||
| 15 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/sticky.gradient.min.css" merge="plugins"/> | ||
| 16 | + | ||
| 17 | + <!-- main style --> | ||
| 18 | + <link rel="stylesheet" href="/real_control_v2/css/main.css" /> | ||
| 19 | + <!-- north style --> | ||
| 20 | + <link rel="stylesheet" href="/real_control_v2/css/north.css" merge="custom_style"/> | ||
| 21 | + <!-- home style --> | ||
| 22 | + <link rel="stylesheet" href="/real_control_v2/css/home.css" merge="custom_style"/> | ||
| 23 | + <!-- line style --> | ||
| 24 | + <link rel="stylesheet" href="/real_control_v2/css/line_schedule.css" merge="custom_style"/> | ||
| 25 | + <link rel="stylesheet" href="/real_control_v2/css/line_schedule_table.css" merge="custom_style"/> | ||
| 26 | + | ||
| 27 | + <link rel="stylesheet" href="/real_control_v2/css/sch_autocomp_result.css" merge="custom_style"/> | ||
| 28 | + <!-- custom table --> | ||
| 29 | + <link rel="stylesheet" href="/real_control_v2/css/ct_table.css" merge="custom_style"/> | ||
| 30 | + <!-- jquery contextMenu style --> | ||
| 31 | + <link rel="stylesheet" href="/real_control_v2/assets/css/jquery.contextMenu.min.css" merge="plugins"/> | ||
| 32 | + <!-- formvalidation style --> | ||
| 33 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/formvalidation/formValidation.min.css" merge="plugins"/> | ||
| 34 | + <!-- js tree --> | ||
| 35 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/jstree/default/style.css" merge="plugins"/> | ||
| 36 | + <!-- tooltip css--> | ||
| 37 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/qtip/jquery.qtip.min.css" merge="plugins"/> | ||
| 38 | + <link rel="stylesheet" href="/real_control_v2/css/pace.css" merge="plugins"/> | ||
| 39 | + | ||
| 40 | + <link rel="stylesheet" href="/real_control_v2/css/modal_extend.css" merge="custom_style"/> | ||
| 41 | + <!-- perfect-scrollbar style --> | ||
| 42 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" merge="plugins"/> | ||
| 43 | + <!-- layer 3.0.3 --> | ||
| 44 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/layer3.0.3/skin/default/layer.css" merge="plugins"/> | ||
| 45 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/layer3.0.3/skin/moon/style.css" merge="plugins"/> | ||
| 46 | + | ||
| 47 | + <!-- flatpickr --> | ||
| 48 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.css" merge="plugins"> | ||
| 49 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/flatpickr/themes/airbnb.css" merge="plugins"> | ||
| 50 | +</head> | ||
| 51 | + | ||
| 52 | +<body> | ||
| 53 | +<div class="north uk-width-1-1 uk-panel-box"> | ||
| 54 | + <div class="uk-grid uk-grid-match"> | ||
| 55 | + <div class="uk-width-4-10"> | ||
| 56 | + <div class="uk-panel"> | ||
| 57 | + <h2 class="north-logo"> | ||
| 58 | + <i class="uk-icon-life-ring"></i> 嘉定公交线路调度 | ||
| 59 | + </h2> | ||
| 60 | + </div> | ||
| 61 | + </div> | ||
| 62 | + <div class="uk-width-6-10"> | ||
| 63 | + <div class="uk-panel uk-width north-toolbar"></div> | ||
| 64 | + </div> | ||
| 65 | + </div> | ||
| 66 | + <div class="north-tabs"></div> | ||
| 67 | +</div> | ||
| 68 | + | ||
| 69 | +<div class="main-container"> | ||
| 70 | + <div class="load-panel"> | ||
| 71 | + <i class="uk-icon-spinner uk-icon-spin"></i> | ||
| 72 | + 正在加载数据 | ||
| 73 | + </div> | ||
| 74 | +</div> | ||
| 75 | + | ||
| 76 | +<script> | ||
| 77 | +/* var gb_beforeunload_fun = function (e) { | ||
| 78 | + var confirmationMessage = "\o/"; | ||
| 79 | + (e || window.event).returnValue = confirmationMessage; | ||
| 80 | + return confirmationMessage; | ||
| 81 | + } | ||
| 82 | + window.addEventListener("beforeunload", gb_beforeunload_fun);*/ | ||
| 83 | + | ||
| 84 | + delete window.exports; | ||
| 85 | + delete window.module; | ||
| 86 | + | ||
| 87 | + var ipcMain; | ||
| 88 | + //是否处于electron环境下 | ||
| 89 | + var isElectron = (function () { | ||
| 90 | + try { | ||
| 91 | + if (process.versions.electron) | ||
| 92 | + return true; | ||
| 93 | + else | ||
| 94 | + return false; | ||
| 95 | + } | ||
| 96 | + catch (e) { | ||
| 97 | + return false; | ||
| 98 | + } | ||
| 99 | + })(); | ||
| 100 | + | ||
| 101 | + if (isElectron) { | ||
| 102 | + var link = document.createElement("link"); | ||
| 103 | + link.type = "text/css"; | ||
| 104 | + link.rel = "stylesheet"; | ||
| 105 | + link.href = "/real_control_v2/css/electron.css"; | ||
| 106 | + document.getElementsByTagName("head")[0].appendChild(link); | ||
| 107 | + | ||
| 108 | + ipcMain = require('electron').ipcRenderer; | ||
| 109 | + } | ||
| 110 | +</script> | ||
| 111 | + | ||
| 112 | +<!-- 地图相关 --> | ||
| 113 | +<script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"></script> | ||
| 114 | +<script src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js"></script> | ||
| 115 | +<script src="/assets/js/baidu//MarkerClusterer.js" merge="plugins"></script> | ||
| 116 | +<script src="/assets/js/TransGPS.js" merge="plugins"></script> | ||
| 117 | +<!-- 高德 --> | ||
| 118 | +<script src="http://webapi.amap.com/maps?v=1.3&key=16cb1c5043847e09ef9edafdd77befda"></script> | ||
| 119 | +<!-- jquery --> | ||
| 120 | +<script src="/real_control_v2/assets/js/jquery.min.js"></script> | ||
| 121 | +<!-- jquery actual --> | ||
| 122 | +<script src="/real_control_v2/assets/js/jquery.actual.min.js" merge="plugins"></script> | ||
| 123 | +<!-- jquery.serializejson JSON序列化插件 --> | ||
| 124 | +<script src="/assets/plugins/jquery.serializejson.js" merge="plugins"></script> | ||
| 125 | +<!-- moment.js 日期处理类库 --> | ||
| 126 | +<script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script> | ||
| 127 | +<script src="/real_control_v2/assets/plugins/moment/zh-cn.js"></script> | ||
| 128 | + | ||
| 129 | +<!-- flatpickr --> | ||
| 130 | +<script src="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.js" merge="plugins"></script> | ||
| 131 | +<script src="/real_control_v2/assets/plugins/flatpickr/l10n/zh.js" merge="plugins"></script> | ||
| 132 | + | ||
| 133 | +<!-- perfect-scrollbar --> | ||
| 134 | +<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" merge="plugins"></script> | ||
| 135 | +<!-- common js --> | ||
| 136 | +<script src="/real_control_v2/js/common.js"></script> | ||
| 137 | +<!-- art-template 模版引擎 --> | ||
| 138 | +<script src="/assets/plugins/template.js" merge="plugins"></script> | ||
| 139 | +<!-- d3 --> | ||
| 140 | +<script src="/assets/js/d3.min.js"></script> | ||
| 141 | +<!-- EventProxy --> | ||
| 142 | +<script src="/assets/js/eventproxy.js"></script> | ||
| 143 | +<!-- main js --> | ||
| 144 | +<script src="/real_control_v3/js/main.js"></script> | ||
| 145 | +<!-- uikit core --> | ||
| 146 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/uikit.min.js" merge="uikit_js"></script> | ||
| 147 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/notify.min.js" merge="uikit_js"></script> | ||
| 148 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/pagination.min.js" merge="uikit_js"></script> | ||
| 149 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/tooltip.min.js" merge="uikit_js"></script> | ||
| 150 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/autocomplete.min.js" merge="uikit_js"></script> | ||
| 151 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/accordion.min.js" merge="uikit_js"></script> | ||
| 152 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/timepicker.min.js" merge="uikit_js"></script> | ||
| 153 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/lightbox.min.js" merge="uikit_js"></script> | ||
| 154 | +<script src="/real_control_v2/assets/plugins/uikit-2.27.1/components/sticky.min.js" merge="uikit_js"></script> | ||
| 155 | + | ||
| 156 | + | ||
| 157 | +<!-- jquery contextMenu --> | ||
| 158 | +<script src="/real_control_v2/assets/js/jquery.contextMenu.min.js" merge="plugins"></script> | ||
| 159 | +<script src="/real_control_v2/assets/js/jquery.ui.position.min.js" merge="plugins"></script> | ||
| 160 | +<!-- formvalidation- --> | ||
| 161 | +<script src="/real_control_v2/assets/plugins/formvalidation/formValidation.min.js" merge="plugins"></script> | ||
| 162 | +<script src="/real_control_v2/assets/plugins/formvalidation/zh_CN.js" merge="plugins"></script> | ||
| 163 | +<script src="/real_control_v2/assets/plugins/formvalidation/uikit.min.js" merge="plugins"></script> | ||
| 164 | +<!-- js tree --> | ||
| 165 | +<script src="/real_control_v2/assets/plugins/jstree/jstree.min.js" merge="plugins"></script> | ||
| 166 | +<!-- simple pinyin --> | ||
| 167 | +<script src="/assets/plugins/pinyin.js" merge="plugins"></script> | ||
| 168 | +<!-- qtip --> | ||
| 169 | +<script src="/real_control_v2/assets/plugins/qtip/jquery.qtip.min.js" merge="plugins"></script> | ||
| 170 | +<!-- layer 3.0.3 --> | ||
| 171 | +<script src="/real_control_v2/assets/plugins/layer3.0.3/layer.js" merge="plugins"></script> | ||
| 172 | + | ||
| 173 | +<!-- 数据 --> | ||
| 174 | +<script src="/real_control_v3/js/data/data_basic.js" merge="custom_js"></script> | ||
| 175 | +<script src="/real_control_v3/js/data/data_gps.js" merge="custom_js"></script> | ||
| 176 | +<script src="/real_control_v3/js/data/gps_abnormal.js" merge="custom_js"></script> | ||
| 177 | +<!-- 线路模拟图 --> | ||
| 178 | +<script src="/real_control_v2/js/utils/svg_chart.js" merge="custom_js"></script> | ||
| 179 | +<script src="/real_control_v2/js/utils/svg_data_convert.js" merge="custom_js"></script> | ||
| 180 | +<script src="/real_control_v2/js/utils/svg_chart_tooltip.js" merge="custom_js"></script> | ||
| 181 | +<script src="/real_control_v2/js/utils/svg_chart_map.js" merge="custom_js"></script> | ||
| 182 | + | ||
| 183 | +<!-- custom table js --> | ||
| 184 | +<script src="/real_control_v2/js/utils/ct_table.js" merge="custom_js"></script> | ||
| 185 | +<!-- north js --> | ||
| 186 | +<script src="/real_control_v3/js/north/toolbar.js" merge="custom_js"></script> | ||
| 187 | +<script src="/real_control_v2/js/north/tabs.js" merge="custom_js"></script> | ||
| 188 | +<script src="/real_control_v2/js/north/second_timer.js" merge="custom_js"></script> | ||
| 189 | +<!-- home js --> | ||
| 190 | +<script src="/real_control_v3/js/home/layout.js" merge="custom_js"></script> | ||
| 191 | +<script src="/real_control_v2/js/home/line_panel.js" merge="custom_js"></script> | ||
| 192 | +<!--<script src="/real_control_v2/js/home/context_menu.js" merge="custom_js"></script>--> | ||
| 193 | +<!-- line schedule js --> | ||
| 194 | +<script src="/real_control_v2/js/line_schedule/legend.js" merge="custom_js"></script> | ||
| 195 | +<script src="/real_control_v3/js/line_schedule/layout.js" merge="custom_js"></script> | ||
| 196 | +<script src="/real_control_v3/js/line_schedule/sch_table.js" merge="custom_js"></script> | ||
| 197 | +<!--<script src="/real_control_v3/js/line_schedule/context_menu.js" merge="custom_js"></script>--> | ||
| 198 | +<script src="/real_control_v3/js/line_schedule/dbclick.js" merge="custom_js"></script> | ||
| 199 | +<script src="/real_control_v2/js/line_schedule/search.js" merge="custom_js"></script> | ||
| 200 | +<script src="/real_control_v2/js/line_schedule/badge_tooltip.js" merge="custom_js"></script> | ||
| 201 | +<script src="/real_control_v2/js/line_schedule/mileage_count.js" merge="custom_js"></script> | ||
| 202 | + | ||
| 203 | + | ||
| 204 | +<!-- websocket --> | ||
| 205 | +<script src="/real_control_v2/assets/plugins/sockjs-client/sockjs.min.js"></script> | ||
| 206 | +<script src="/real_control_v3/js/websocket/sch_websocket.js" merge="custom_js"></script> | ||
| 207 | +<!-- tts --> | ||
| 208 | +<script src="/real_control_v2/js/utils/tts.js" merge="custom_js"></script> | ||
| 209 | + | ||
| 210 | +<!-- echart --> | ||
| 211 | +<script src="/real_control_v2/assets/echarts-3/echarts.js" merge="plugins"></script> | ||
| 212 | +<!-- Geolib --> | ||
| 213 | +<script src="/real_control_v2/geolib/geolib.js" merge="plugins"></script> | ||
| 214 | + | ||
| 215 | +<script src="/real_control_v2/js/signal_state/signal_state.js" merge="custom_js"></script> | ||
| 216 | +<script src="/real_control_v3/js/utils/dispatch_pattern.js" merge="custom_js"></script> | ||
| 217 | + | ||
| 218 | +<!-- 处理表单片段嵌入问题 --> | ||
| 219 | +<script src="/real_control_v2/js/forms/form_embed.js" merge="custom_js"></script> | ||
| 220 | +<!-- 模态框扩展 --> | ||
| 221 | +<script src="/real_control_v2/js/modal_extend.js" merge="custom_js"></script> | ||
| 222 | + | ||
| 223 | +<!-- #### 安全驾驶 start ### --> | ||
| 224 | +<div class="safe_driv_pop_wrap" ></div> | ||
| 225 | +<script id="safe_driv_item-temp" type="text/html"> | ||
| 226 | + <div class="safe_driv_pop uk-animation-slide-bottom" data-nbbm="{{clzbh}}" data-type="{{yczltype}}" data-title="{{clzbh}} {{timeStr}} {{ycztText}}" data-url="{{url}}"> | ||
| 227 | + <div> | ||
| 228 | + <span class="title">异常 {{clzbh}}</span> | ||
| 229 | + <span class="text"> {{timeStr}} 出现违规驾驶({{ycztText}})</span> | ||
| 230 | + <span class="desc">--安全驾驶监管平台</span> | ||
| 231 | + </div> | ||
| 232 | + </div> | ||
| 233 | +</script> | ||
| 234 | + | ||
| 235 | +</body> | ||
| 236 | + | ||
| 237 | +</html> |
src/main/resources/static/real_control_v3/mapmonitor/fragments/map_config.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <script id="map-config-form-temp" type="text/html"> | ||
| 3 | + <form class="uk-form uk-form-stacked"> | ||
| 4 | + <div class="uk-form-row"> | ||
| 5 | + <span class="uk-form-label">图层</span> | ||
| 6 | + <div class="uk-form-controls"> | ||
| 7 | + <label><input type="radio" value="baidu" name="map_type" {{if map_type=='baidu'}}checked{{/if}}> 百度</label> | ||
| 8 | + <label><input type="radio" value="gaode" name="map_type" {{if map_type=='gaode'}}checked{{/if}}> 高德</label> | ||
| 9 | + <label><input type="checkbox" name="traffic" {{if traffic}}checked{{/if}}> 实时路况</label> | ||
| 10 | + </div> | ||
| 11 | + </div> | ||
| 12 | + | ||
| 13 | + <div class="uk-form-row"> | ||
| 14 | + <span class="uk-form-label">空间数据</span> | ||
| 15 | + <div class="uk-form-controls"> | ||
| 16 | + <label><input type="checkbox" name="spatial_data_station" {{if spatialData.station}}checked{{/if}}> 站点</label> | ||
| 17 | + <label><input type="checkbox" name="spatial_electronicFence" {{if spatialData.electronicFence}}checked{{/if}}> 电子围栏</label> | ||
| 18 | + <label><input type="checkbox" name="spatial_data_carPark" {{if spatialData.carPark}}checked{{/if}}> 停车场</label> | ||
| 19 | + </div> | ||
| 20 | + </div> | ||
| 21 | + | ||
| 22 | + <div class="uk-form-row"> | ||
| 23 | + <span class="uk-form-label">车辆图标</span> | ||
| 24 | + <div class="uk-form-controls"> | ||
| 25 | + <label><input name="carIcon_angle" type="checkbox" {{if carIcon.angle}}checked{{/if}}> 标示角度</label> | ||
| 26 | + <!--<label><input class="disabled" disabled type="checkbox" {{if carIcon.converge}}checked{{/if}}> 聚合</label>--> | ||
| 27 | + </div> | ||
| 28 | + </div> | ||
| 29 | + <div class="uk-form-row"> | ||
| 30 | + <span class="uk-form-label">异常警报</span> | ||
| 31 | + <div class="uk-form-controls"> | ||
| 32 | + <label><input type="checkbox" {{if abnormalPrint.speeding}}checked{{/if}}> 超速</label> | ||
| 33 | + <label><input type="checkbox" {{if abnormalPrint.outBounds}}checked{{/if}}> 越界</label> | ||
| 34 | + <label><input type="checkbox" {{if abnormalPrint.largeMargin}}checked{{/if}}> 大间隔</label> | ||
| 35 | + </div> | ||
| 36 | + </div> | ||
| 37 | + <div class="uk-form-row"> | ||
| 38 | + <span class="uk-form-label">车辆颜色</span> | ||
| 39 | + <div class="uk-form-controls"> | ||
| 40 | + <div class="color_block"> | ||
| 41 | + 上行 | ||
| 42 | + <div class="sp-placeholder"> | ||
| 43 | + <div class="sp-placeholder-color" data-name="carIcon.color.up" style="background: {{carIcon.color.up}}"></div> | ||
| 44 | + </div> | ||
| 45 | + </div> | ||
| 46 | + | ||
| 47 | + <div class="color_block"> | ||
| 48 | + 下行 | ||
| 49 | + <div class="sp-placeholder"> | ||
| 50 | + <div class="sp-placeholder-color" data-name="carIcon.color.down" style="background: {{carIcon.color.down}}"></div> | ||
| 51 | + </div> | ||
| 52 | + </div> | ||
| 53 | + | ||
| 54 | + <div class="color_block"> | ||
| 55 | + 非营运 | ||
| 56 | + <div class="sp-placeholder"> | ||
| 57 | + <div class="sp-placeholder-color" data-name="carIcon.color.nonOperation" style="background: {{carIcon.color.nonOperation}}"></div> | ||
| 58 | + </div> | ||
| 59 | + </div> | ||
| 60 | + </div> | ||
| 61 | + </div> | ||
| 62 | + | ||
| 63 | + <div class="uk-form-row"> | ||
| 64 | + <span class="uk-form-label">路段颜色</span> | ||
| 65 | + <div class="uk-form-controls"> | ||
| 66 | + <div class="color_block"> | ||
| 67 | + 上行 | ||
| 68 | + <div class="sp-placeholder"> | ||
| 69 | + <div class="sp-placeholder-color" data-name="section.color.up" style="background: {{section.color.up}}"></div> | ||
| 70 | + </div> | ||
| 71 | + </div> | ||
| 72 | + | ||
| 73 | + <div class="color_block"> | ||
| 74 | + 下行 | ||
| 75 | + <div class="sp-placeholder"> | ||
| 76 | + <div class="sp-placeholder-color" data-name="section.color.down" style="background: {{section.color.down}}"></div> | ||
| 77 | + </div> | ||
| 78 | + </div> | ||
| 79 | + </div> | ||
| 80 | + </div> | ||
| 81 | + </form> | ||
| 82 | + </script> | ||
| 83 | +</div> | ||
| 84 | +<!-- 1111 --> | ||
| 0 | \ No newline at end of file | 85 | \ No newline at end of file |
src/main/resources/static/real_control_v3/mapmonitor/fragments/map_infowindow.html
0 → 100644
| 1 | +<div> | ||
| 2 | + <script id="map-win-gps-detail-temp" type="text/html"> | ||
| 3 | + <div class="gps_info_win" style="width: 200px;"> | ||
| 4 | + <h4>{{nbbm}}</h4> | ||
| 5 | + <h5> | ||
| 6 | + {{lineName}} | ||
| 7 | + </h5> | ||
| 8 | + <h5> | ||
| 9 | + {{if stationName!=null}} | ||
| 10 | + {{stationName}} 站 | ||
| 11 | + {{else}} | ||
| 12 | + 未知站点 | ||
| 13 | + {{/if}} | ||
| 14 | + </h5> | ||
| 15 | + <p>设备状态: | ||
| 16 | + {{if valid==1}} | ||
| 17 | + invalid(-1 | ||
| 18 | + {{else if abnormalStatus=='outBounds'}} | ||
| 19 | + 越界 | ||
| 20 | + {{else if abnormalStatus=='overspeed'}} | ||
| 21 | + 超速 | ||
| 22 | + {{else if abnormalStatus=='gps-offline'}} | ||
| 23 | + GPS掉线 | ||
| 24 | + {{else if abnormalStatus=='offline'}} | ||
| 25 | + 离线 | ||
| 26 | + {{else}} | ||
| 27 | + . | ||
| 28 | + {{/if}} | ||
| 29 | + </p> | ||
| 30 | + <p>设备号:{{deviceId}}</p> | ||
| 31 | + <p>速度:{{speed>99?'..':speed}}</p> | ||
| 32 | + <p>角度:{{direction}}</p> | ||
| 33 | + <p>经度:{{lon}}</p> | ||
| 34 | + <p>纬度:{{lat}}</p> | ||
| 35 | + | ||
| 36 | + <p class="date-str">{{dateStr}}</p> | ||
| 37 | + <hr> | ||
| 38 | + {{if expectStopTime!=null}} | ||
| 39 | + <a href="javascript:;" style="color: #07D;margin-right: 7px;">预计 {{expectStopTime}} 分钟到达终点</a> | ||
| 40 | + {{/if}} | ||
| 41 | + <a href="javascript:;" style="float: left;" onclick="javascript:window.open('http://180.166.5.82:9005/transport_server/dvr_monitor1.jsp?userid=4&deviceid={{deviceId}}');">DVR</a> | ||
| 42 | + <a href="javascript:;" style="float: right;" onclick="javascript:gb_map_play_back.initParams('{{deviceId}}', '{{nbbm}}');">轨迹回放</a> | ||
| 43 | + </div> | ||
| 44 | + </script> | ||
| 45 | + | ||
| 46 | + <script id="map-win-station-detail-temp" type="text/html"> | ||
| 47 | + <div class="gps_info_win"> | ||
| 48 | + <h4>{{stationName}}</h4> | ||
| 49 | + <p>站点编码: {{stationCode}}</p> | ||
| 50 | + <p>站点类型: | ||
| 51 | + {{if stationMark=='B'}} | ||
| 52 | + 起点站 | ||
| 53 | + {{else if stationMark=='E'}} | ||
| 54 | + 终点站 | ||
| 55 | + {{else if stationMark=='Z'}} | ||
| 56 | + 中途站 | ||
| 57 | + {{/if}} | ||
| 58 | + </p> | ||
| 59 | + <p> | ||
| 60 | + 经度: {{lon}} | ||
| 61 | + </p> | ||
| 62 | + <p>纬度: {{lat}}</p> | ||
| 63 | + {{if distances > 0}} | ||
| 64 | + <p>到站距离: {{distances}} 公里</p> | ||
| 65 | + {{/if}} | ||
| 66 | + <p> | ||
| 67 | + 电子围栏类型: | ||
| 68 | + {{if shapesType=='r'}} | ||
| 69 | + 圆形 | ||
| 70 | + {{else if shapesType=='d'}} | ||
| 71 | + 多边形 | ||
| 72 | + {{/if}} | ||
| 73 | + </p> | ||
| 74 | + <p> | ||
| 75 | + {{if shapesType=='r'}} | ||
| 76 | + 半径:{{radius}} | ||
| 77 | + {{else if shapesType=='d'}} | ||
| 78 | + 面积:{{_polygonArea}} 平方米 | ||
| 79 | + {{/if}} | ||
| 80 | + </p> | ||
| 81 | + </div> | ||
| 82 | + </script> | ||
| 83 | + | ||
| 84 | + <script id="map-win-carpark-detail-temp" type="text/html"> | ||
| 85 | + <div class="gps_info_win"> | ||
| 86 | + <h4>{{parkName}}</h4> | ||
| 87 | + <p>停车场编码: {{parkCode}}</p> | ||
| 88 | + <p>面积:{{area}}</p> | ||
| 89 | + <p> | ||
| 90 | + {{if shapesType=='r'}} | ||
| 91 | + 电子围栏半径:{{radius}} | ||
| 92 | + {{else if shapesType=='d'}} | ||
| 93 | + 电子围栏面积:{{_polygonArea}} 平方米 | ||
| 94 | + {{/if}} | ||
| 95 | + </p> | ||
| 96 | + </div> | ||
| 97 | + </script> | ||
| 98 | +</div> | ||
| 0 | \ No newline at end of file | 99 | \ No newline at end of file |
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback/before_form.html
0 → 100644
| 1 | +<div class="uk-alert uk-alert-success">开始~结束时间最大间隔24小时</div> | ||
| 2 | +<div style="width: 68%;margin: auto;" id="playback_before_form"> | ||
| 3 | + <form class="uk-form uk-form-horizontal" style="margin-bottom: 0 !important;"> | ||
| 4 | + <div class="uk-grid"> | ||
| 5 | + <div class="uk-width-1-1"> | ||
| 6 | + <div class="uk-form-row"> | ||
| 7 | + <label class="uk-form-label">车辆编码</label> | ||
| 8 | + <div class="uk-form-controls"> | ||
| 9 | + <div class="uk-autocomplete uk-form autocomplete-nbbm"> | ||
| 10 | + <input name="nbbm" required/> | ||
| 11 | + </div> | ||
| 12 | + </div> | ||
| 13 | + </div> | ||
| 14 | + </div> | ||
| 15 | + </div> | ||
| 16 | + <div class="uk-grid"> | ||
| 17 | + <div class="uk-width-2-3"> | ||
| 18 | + <div class="uk-form-row"> | ||
| 19 | + <label class="uk-form-label">开始时间</label> | ||
| 20 | + <div class="uk-form-controls"> | ||
| 21 | + <input name="sDate" type="date" required/> | ||
| 22 | + </div> | ||
| 23 | + </div> | ||
| 24 | + </div> | ||
| 25 | + <div class="uk-width-1-3" style="padding-left: 15px;"> | ||
| 26 | + <div class="uk-form-row"> | ||
| 27 | + <div class="uk-form-controls" style="margin-left: 0;"> | ||
| 28 | + <input name="sTime" type="time" required/> | ||
| 29 | + </div> | ||
| 30 | + </div> | ||
| 31 | + </div> | ||
| 32 | + </div> | ||
| 33 | + <div class="uk-grid"> | ||
| 34 | + <div class="uk-width-2-3"> | ||
| 35 | + <div class="uk-form-row"> | ||
| 36 | + <label class="uk-form-label">结束时间</label> | ||
| 37 | + <div class="uk-form-controls"> | ||
| 38 | + <input name="eDate" type="date" required/> | ||
| 39 | + </div> | ||
| 40 | + </div> | ||
| 41 | + </div> | ||
| 42 | + <div class="uk-width-1-3" style="padding-left: 15px;"> | ||
| 43 | + <div class="uk-form-row"> | ||
| 44 | + <div class="uk-form-controls" style="margin-left: 0;"> | ||
| 45 | + <input name="eTime" type="time" required/> | ||
| 46 | + </div> | ||
| 47 | + </div> | ||
| 48 | + </div> | ||
| 49 | + </div> | ||
| 50 | + | ||
| 51 | + <div style="text-align: center;margin-top: 25px;"> | ||
| 52 | + <button class="uk-button uk-button-large uk-button-primary" type="submit"><i | ||
| 53 | + class="uk-icon-play-circle"> </i> 开始回放 | ||
| 54 | + </button> | ||
| 55 | + </div> | ||
| 56 | + <i class="uk-icon-spinner uk-icon-spin" | ||
| 57 | + style="font-size: 18px;color: rgb(213, 31, 31);position: absolute;bottom: 25px;left: calc(50% + 70px);display: none;"></i> | ||
| 58 | + </form> | ||
| 59 | + | ||
| 60 | + <script> | ||
| 61 | + (function () { | ||
| 62 | + $('#playback_before_form').on('init_form', function (e, data) { | ||
| 63 | + //车辆 autocomplete | ||
| 64 | + $.get('/freeLogin/basic/cars', function (rs) { | ||
| 65 | + gb_common.carAutocomplete($('#playback_before_form .autocomplete-nbbm'), rs); | ||
| 66 | + }); | ||
| 67 | + | ||
| 68 | + if (data.nbbm) | ||
| 69 | + $('[name=nbbm]', this).val(data.nbbm); | ||
| 70 | + //默认时间 | ||
| 71 | + var m = moment() | ||
| 72 | + , rq = 'YYYY-MM-DD', sj = 'HH:mm'; | ||
| 73 | + $('[name=eDate]', this).val(m.format(rq)); | ||
| 74 | + $('[name=eTime]', this).val(m.format('HH:mm')); | ||
| 75 | + $('[name=sDate]', this).val(m.subtract(2, 'hour').format(rq)); | ||
| 76 | + $('[name=sTime]', this).val(m.format(sj)); | ||
| 77 | + }); | ||
| 78 | + | ||
| 79 | + var ONE_DAY = 1000 * 60 * 60 * 24; | ||
| 80 | + var f = $('form', '#playback_before_form').formValidation({ | ||
| 81 | + framework: 'uikit', | ||
| 82 | + locale: 'zh_CN' | ||
| 83 | + }); | ||
| 84 | + f.on('success.form.fv', function (e) { | ||
| 85 | + e.preventDefault(); | ||
| 86 | + disabledBtn(); | ||
| 87 | + var data = $(this).serializeJSON(); | ||
| 88 | + | ||
| 89 | + //校验时间间隔 | ||
| 90 | + var fs = 'YYYY-MM-DDHH:mm'; | ||
| 91 | + var st = moment(data.sDate + data.sTime, fs).format('X'); | ||
| 92 | + var et = moment(data.eDate + data.eTime, fs).format('X'); | ||
| 93 | + | ||
| 94 | + if (et < st) | ||
| 95 | + return abortSubmit('结束时间小于开始时间???'); | ||
| 96 | + else if ((et - st) > ONE_DAY) | ||
| 97 | + return abortSubmit('时间间隔不能超过24小时!'); | ||
| 98 | + else if (et == st) | ||
| 99 | + return abortSubmit('一点时间间隔都不给???'); | ||
| 100 | + | ||
| 101 | + $('#playback_before_form i.uk-icon-spinner').show(); | ||
| 102 | + $.ajax({ | ||
| 103 | + url: '/gps/gpsHistory/multiple', | ||
| 104 | + traditional: true, | ||
| 105 | + data: {nbbmArray: [data.nbbm], st: st, et: et}, | ||
| 106 | + success: function (rs) { | ||
| 107 | + if (!rs || rs.length == 0) | ||
| 108 | + return abortSubmit('失败,服务器没有返回轨迹数据!'); | ||
| 109 | + | ||
| 110 | + //排序 | ||
| 111 | + rs.sort(function (a, b) { | ||
| 112 | + return a.timestamp - b.timestamp; | ||
| 113 | + }); | ||
| 114 | + //格式化时间 | ||
| 115 | + $.each(rs, function () { | ||
| 116 | + var mom = moment(this.timestamp); | ||
| 117 | + this.timeStr = mom.format('HH:mm.ss'); | ||
| 118 | + this.timeStr2 = mom.format('YYYY-MM-DD HH:mm.ss'); | ||
| 119 | + }); | ||
| 120 | + | ||
| 121 | + //获取路段信息 | ||
| 122 | + if (!rs[0] || !rs[0].lineId) | ||
| 123 | + return notify_err('首个点位无效....'); | ||
| 124 | + | ||
| 125 | + jsQueryRoads(rs[0].lineId, function (roads) { | ||
| 126 | + //gps关联到路段 | ||
| 127 | + matchRoad(rs, roads); | ||
| 128 | + | ||
| 129 | + var f = $('#playback_before_form'); | ||
| 130 | + var fileName = $('[name=nbbm]', f).val() + '轨迹数据' | ||
| 131 | + + $('[name=sDate]', f).val() + $('[name=sTime]', f).val() + '至' | ||
| 132 | + + $('[name=eDate]', f).val() + $('[name=eTime]', f).val() + '.xls'; | ||
| 133 | + | ||
| 134 | + $('#playback_before_form').parents('.uk-modal').trigger('show_play_body', { | ||
| 135 | + gpsList: rs, | ||
| 136 | + roads: roads, | ||
| 137 | + lineCode: rs[0].lineId, | ||
| 138 | + fileName: fileName.replace(new RegExp(/-/g),'').replace(new RegExp(/:/g),'') | ||
| 139 | + }); | ||
| 140 | + }); | ||
| 141 | + } | ||
| 142 | + }); | ||
| 143 | + }); | ||
| 144 | + | ||
| 145 | + function abortSubmit(t) { | ||
| 146 | + $('#playback_before_form i.uk-icon-spinner').hide(); | ||
| 147 | + notify_err(t); | ||
| 148 | + $('form button[type=submit]', '#playback_before_form').removeClass('disabled').removeAttr('disabled'); | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + function disabledBtn() { | ||
| 152 | + $('form button[type=submit]', '#playback_before_form').addClass('disabled').attr('disabled', 'disabled'); | ||
| 153 | + } | ||
| 154 | + | ||
| 155 | + function jsQueryRoads(lineCode, cb) { | ||
| 156 | + gb_common.$get('/gps/findRoadSpeed', {lineCode: lineCode}, function (rs) { | ||
| 157 | + //处理路段坐标集合 | ||
| 158 | + var roads = rs.roads; | ||
| 159 | + var cds, coordArray, array; | ||
| 160 | + | ||
| 161 | + for (var i = 0, road; road = roads[i++];) { | ||
| 162 | + cds = road['GROAD_VECTOR']; | ||
| 163 | + cds = cds.substring(11, cds.length - 1); | ||
| 164 | + coordArray = cds.split(','); | ||
| 165 | + | ||
| 166 | + array = []; | ||
| 167 | + | ||
| 168 | + for (var j = 0, cd; cd = coordArray[j++];) { | ||
| 169 | + var cdArray = cd.split(' '); | ||
| 170 | + | ||
| 171 | + //wgs84 to baidu | ||
| 172 | + var bdCd = TransGPS.wgsToBD(parseFloat(cdArray[1]), parseFloat(cdArray[0])); | ||
| 173 | + array.push({ | ||
| 174 | + longitude: bdCd.lng, | ||
| 175 | + latitude: bdCd.lat | ||
| 176 | + }); | ||
| 177 | + } | ||
| 178 | + road.coords = array; | ||
| 179 | + } | ||
| 180 | + cb && cb(roads); | ||
| 181 | + }); | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + | ||
| 185 | + function matchRoad(gpsArray, roads) { | ||
| 186 | + var rs; | ||
| 187 | + $.each(gpsArray, function () { | ||
| 188 | + rs = gpsMatchRoad(this, roads); | ||
| 189 | + this.road = rs.road; | ||
| 190 | + this.minDistance = rs.min; | ||
| 191 | + }); | ||
| 192 | + } | ||
| 193 | + | ||
| 194 | + function gpsMatchRoad(gps, roads) { | ||
| 195 | + var point = {latitude: gps.bd_lat, longitude: gps.bd_lon}; | ||
| 196 | + | ||
| 197 | + var min, road; | ||
| 198 | + $.each(roads, function () { | ||
| 199 | + | ||
| 200 | + var len = this.coords.length; | ||
| 201 | + for (var i = 0; i < len - 1; i++) { | ||
| 202 | + //点到线的距离 | ||
| 203 | + var distance = geolib.getDistanceFromLine(point, this.coords[i], this.coords[i + 1]); | ||
| 204 | + if (min > distance || min == null) { | ||
| 205 | + min = distance; | ||
| 206 | + road = this; | ||
| 207 | + } | ||
| 208 | + } | ||
| 209 | + }); | ||
| 210 | + | ||
| 211 | + return {road: road, min: min}; | ||
| 212 | + } | ||
| 213 | + })(); | ||
| 214 | + </script> | ||
| 215 | +</div> | ||
| 0 | \ No newline at end of file | 216 | \ No newline at end of file |
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback/main.html
0 → 100644
| 1 | +<div class="uk-modal ct-form-modal" id="map-playback-modal"> | ||
| 2 | + <div class="uk-modal-dialog" style="position: relative !important;margin: 50px auto !important;left: 0px !important;top: 0px !important;"> | ||
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | ||
| 4 | + <h1>轨迹回放</h1> | ||
| 5 | + <div class="pb_modal_body"></div> | ||
| 6 | + </div> | ||
| 7 | + <script> | ||
| 8 | + (function () { | ||
| 9 | + var modal = '#map-playback-modal'; | ||
| 10 | + | ||
| 11 | + $(modal).on('show_form', function (e, data) { | ||
| 12 | + $('.pb_modal_body', modal).load('/real_control_v2/mapmonitor/fragments/playback/before_form.html', function () { | ||
| 13 | + $('#playback_before_form', modal).trigger('init_form', data); | ||
| 14 | + }); | ||
| 15 | + }); | ||
| 16 | + | ||
| 17 | + //show播放界面 | ||
| 18 | + $(modal).on('show_play_body', function (e, data) { | ||
| 19 | + $('.pb_modal_body', modal).empty(); | ||
| 20 | + $('.uk-modal-dialog', modal).addClass('play-back-run-modal').one('transitionend', function () { | ||
| 21 | + //最小宽度 | ||
| 22 | + $(this).css('min-width', '1280px'); | ||
| 23 | + }); | ||
| 24 | + $('.pb_modal_body', modal).load('/real_control_v2/mapmonitor/fragments/playback/run.html', function () { | ||
| 25 | + $('#playback_run_body', modal).trigger('init', data); | ||
| 26 | + }); | ||
| 27 | + }); | ||
| 28 | + })(); | ||
| 29 | + </script> | ||
| 30 | +</div> |
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback/run.html
0 → 100644
| 1 | +<div id="playback_run_body"> | ||
| 2 | + <div class="map_wrap"></div> | ||
| 3 | + <!-- 日志输出 --> | ||
| 4 | + <div class="pb_log_panel uk-animation-slide-left" style="overflow-y: auto;"> | ||
| 5 | + <div class="ct_table" style="height: calc(100% - 30px);"> | ||
| 6 | + <div class="ct_table_head"> | ||
| 7 | + <dl> | ||
| 8 | + <dt>时间</dt> | ||
| 9 | + <dt>速度</dt> | ||
| 10 | + <dt>路段</dt> | ||
| 11 | + <dt>状态</dt> | ||
| 12 | + </dl> | ||
| 13 | + </div> | ||
| 14 | + <div class="ct_table_body"> | ||
| 15 | + </div> | ||
| 16 | + </div> | ||
| 17 | + </div> | ||
| 18 | + | ||
| 19 | + <!-- 进出站输出 --> | ||
| 20 | + <div class="pb_inout_station_panel uk-animation-slide-left" style="overflow-y: auto;"> | ||
| 21 | + <div class="ct_table" style="height: calc(100% - 30px);"> | ||
| 22 | + <div class="ct_table_head"> | ||
| 23 | + <dl> | ||
| 24 | + <dt>时间</dt> | ||
| 25 | + <dt>站点</dt> | ||
| 26 | + <dt>动作</dt> | ||
| 27 | + </dl> | ||
| 28 | + </div> | ||
| 29 | + <div class="ct_table_body"> | ||
| 30 | + </div> | ||
| 31 | + </div> | ||
| 32 | + </div> | ||
| 33 | + <div class="pb_footer_tools uk-animation-slide-bottom" onselectstart="return false;" style="-moz-user-select:none;"> | ||
| 34 | + <span class="ui-slider-tip">08:30.50</span> | ||
| 35 | + <div class="uk-progress uk-progress-small uk-progress-success uk-progress-striped"> | ||
| 36 | + <div class="uk-progress-bar" style="width: 0;"></div> | ||
| 37 | + </div> | ||
| 38 | + | ||
| 39 | + <div class="pb_tools_icon"> | ||
| 40 | + <div class="uk-button-group"> | ||
| 41 | + <a class="uk-button play-btn" data-type="play"><i class="uk-icon-play"></i> <span class="text">播放</span></a> | ||
| 42 | + </div> | ||
| 43 | + </div> | ||
| 44 | + | ||
| 45 | + <div class="pb_tools_icon"> | ||
| 46 | + <div class="uk-button-dropdown" data-uk-dropdown="{mode:'hover', pos:'top-left'}"> | ||
| 47 | + <button class="uk-button" id="speedIconBtn"><i class="uk-icon-close"> </i> <span class="text">1</span> <i class="uk-icon-caret-down"></i></button> | ||
| 48 | + <div class="uk-dropdown uk-dropdown-bottom uk-dropdown-small" | ||
| 49 | + style="top: 30px; left: 0px;min-width: auto;"> | ||
| 50 | + <ul class="uk-nav uk-nav-dropdown pb_dropdown_tool play_speed_list uk-dropdown-close"> | ||
| 51 | + <li><a data-value="30" href="javascript:;">1秒30帧</a></li> | ||
| 52 | + <li><a data-value="20" href="javascript:;">1秒20帧</a></li> | ||
| 53 | + <li><a data-value="10" href="javascript:;">1秒10帧</a></li> | ||
| 54 | + <li><a data-value="7" href="javascript:;">1秒7帧</a></li> | ||
| 55 | + <li><a data-value="5" href="javascript:;">1秒5帧</a></li> | ||
| 56 | + <li><a data-value="1" href="javascript:;">1秒1帧</a></li> | ||
| 57 | + </ul> | ||
| 58 | + </div> | ||
| 59 | + </div> | ||
| 60 | + </div> | ||
| 61 | + | ||
| 62 | + <div class="pb_tools_icon"> | ||
| 63 | + <button class="uk-button" disabled><i class="uk-icon-map-signs"></i> 电子围栏 <i class="uk-icon-caret-down"></i> </button> | ||
| 64 | + </div> | ||
| 65 | + | ||
| 66 | + <div class="pb_tools_icon"> | ||
| 67 | + <a class="uk-button" id="exportExcelBtn" data-uk-tooltip title="导出轨迹"><i | ||
| 68 | + class="uk-icon-file-excel-o"></i></a> | ||
| 69 | + </div> | ||
| 70 | + </div> | ||
| 71 | + | ||
| 72 | + <script> | ||
| 73 | + (function () { | ||
| 74 | + | ||
| 75 | + var logTemp = template.compile('{{each list as gps i}}<dl data-code="{{gps.road.ROAD_CODE}}">' + | ||
| 76 | + '<dd>{{gps.timeStr}}</dd>' + | ||
| 77 | + '<dd>{{gps.speed}}</dd>' + | ||
| 78 | + '<dd>{{gps.road.ROAD_NAME}}</dd><dd>正常</dd></dl>{{/each}}'); | ||
| 79 | + | ||
| 80 | + | ||
| 81 | + var _body = '#playback_run_body' | ||
| 82 | + , map, gpsArray, roads, marker, width, trailArray = [], trailPolyline; | ||
| 83 | + | ||
| 84 | + var upRoutePos = [], downRoutePos = []; | ||
| 85 | + var storage = window.localStorage; | ||
| 86 | + var lineCode; | ||
| 87 | + | ||
| 88 | + //进度条 | ||
| 89 | + var progress = $('.pb_footer_tools .uk-progress', _body); | ||
| 90 | + var bar = $('.uk-progress-bar', progress); | ||
| 91 | + var step; | ||
| 92 | + var prsTip = $('.ui-slider-tip', _body); | ||
| 93 | + progress.mousemove(function (e) { | ||
| 94 | + var x = e.offsetX; | ||
| 95 | + var i = parseInt(x / step); | ||
| 96 | + var time = moment(gpsArray[i].timestamp).format('HH:mm.ss'); | ||
| 97 | + | ||
| 98 | + prsTip.text(time).css('left', x - 11).css('visibility', 'visible'); | ||
| 99 | + }).mouseout(function () { | ||
| 100 | + prsTip.css('visibility', 'hidden') | ||
| 101 | + }).on('click', function (e) { | ||
| 102 | + var x = e.offsetX; | ||
| 103 | + goto(parseInt(x / step)); | ||
| 104 | + }); | ||
| 105 | + | ||
| 106 | + $(_body).on('init', function (e, data) { | ||
| 107 | + roads = data.roads; | ||
| 108 | + lineCode = data.lineCode; | ||
| 109 | + | ||
| 110 | + setTimeout(function () { | ||
| 111 | + initMap(data.gpsList); | ||
| 112 | + len = gpsArray.length; | ||
| 113 | + step = progress.width() / gpsArray.length; | ||
| 114 | + }, 600); | ||
| 115 | + | ||
| 116 | + //导出的文件名 | ||
| 117 | + $('#exportExcelBtn').attr('download', data.fileName); | ||
| 118 | + }); | ||
| 119 | + | ||
| 120 | + $('.pb_tools_icon a.uk-button', _body).on('click', function () { | ||
| 121 | + var type = $(this).attr('data-type'); | ||
| 122 | + switch (type) { | ||
| 123 | + case 'play': | ||
| 124 | + play(); | ||
| 125 | + break; | ||
| 126 | + case 'pause': | ||
| 127 | + pause(); | ||
| 128 | + break; | ||
| 129 | + /*case 'fast_forward': | ||
| 130 | + goto(index + 10); | ||
| 131 | + break; | ||
| 132 | + case 'rewind': | ||
| 133 | + goto(index - 10); | ||
| 134 | + break; | ||
| 135 | + case 'stop': | ||
| 136 | + pause(); | ||
| 137 | + break;*/ | ||
| 138 | + } | ||
| 139 | + }); | ||
| 140 | + | ||
| 141 | + //导出excel | ||
| 142 | + $('#exportExcelBtn', _body).on('click', function () { | ||
| 143 | + var base64Str = gb_map_play_back.listToExcel(gpsArray); | ||
| 144 | + $(this).attr('href', base64Str); | ||
| 145 | + }); | ||
| 146 | + | ||
| 147 | + function goto(ei) { | ||
| 148 | + if (ei < 0 || ei >= len) | ||
| 149 | + return; | ||
| 150 | + | ||
| 151 | + bar.css('width', ei * step); | ||
| 152 | + var gps = gpsArray[ei]; | ||
| 153 | + //重新定位marker | ||
| 154 | + try { | ||
| 155 | + drawLine(gps.direction); | ||
| 156 | + } catch (e) { | ||
| 157 | + console.log(e); | ||
| 158 | + } | ||
| 159 | + var point = new BMap.Point(gps.bd_lon, gps.bd_lat); | ||
| 160 | + marker.setPosition(point); | ||
| 161 | + marker.setIcon(new BMap.Icon(gb_map_imap.createCarIconRotation(gps, width), new BMap.Size(width, 75))); | ||
| 162 | + | ||
| 163 | + //重新填充轨迹线,更新日志面板 | ||
| 164 | + trailArray = []; | ||
| 165 | + var logs = []; | ||
| 166 | + for (var i = 0; i <= ei; i++) { | ||
| 167 | + trailArray.push(new BMap.Point(gpsArray[i].bd_lon, gpsArray[i].bd_lat)); | ||
| 168 | + try { | ||
| 169 | + if (i > 0 && logs[logs.length - 1].road.ROAD_CODE == gpsArray[i].road.ROAD_CODE) | ||
| 170 | + logs.pop(); | ||
| 171 | + } | ||
| 172 | + catch (e) { | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + if (gpsArray[i].road) | ||
| 176 | + logs.push(gpsArray[i]); | ||
| 177 | + } | ||
| 178 | + trailPolyline.setPath(trailArray); | ||
| 179 | + | ||
| 180 | + index = ei; | ||
| 181 | + map.panTo(marker.getPosition()); | ||
| 182 | + //更新日志面板 | ||
| 183 | + logPanel.empty().html(logTemp({list: logs})); | ||
| 184 | + logWrap.scrollTop(logWrap[0].scrollHeight); | ||
| 185 | + | ||
| 186 | + //重新填充进出站数据 | ||
| 187 | + $('.pb_inout_station_panel .ct_table_body', _body).html(''); | ||
| 188 | + for (var i = 0; i <= ei; i++) { | ||
| 189 | + inoutStationWrite(gpsArray[i]); | ||
| 190 | + } | ||
| 191 | + inoutWrap.scrollTop(inoutWrap[0].scrollHeight); | ||
| 192 | + } | ||
| 193 | + | ||
| 194 | + //播放 | ||
| 195 | + function play() { | ||
| 196 | + $('.play-btn', _body) | ||
| 197 | + .attr('data-type', 'pause') | ||
| 198 | + .find('i') | ||
| 199 | + .removeClass('uk-icon-play') | ||
| 200 | + .addClass('uk-icon-pause') | ||
| 201 | + .next().text('暂停'); | ||
| 202 | + pauseFlag = false; | ||
| 203 | + progress.addClass('uk-active'); | ||
| 204 | + run(); | ||
| 205 | + | ||
| 206 | + //定时居中 | ||
| 207 | + fixedToCenter(); | ||
| 208 | + } | ||
| 209 | + | ||
| 210 | + var toCenterTimer; | ||
| 211 | + var markerIsVisible; | ||
| 212 | + function fixedToCenter() { | ||
| 213 | + toCenterTimer = setInterval(function () { | ||
| 214 | + var markerIsVisible = BMapLib.GeoUtils.isPointInRect(marker.point,map.getBounds()); | ||
| 215 | + if(!markerIsVisible) | ||
| 216 | + map.panTo(marker.getPosition()); | ||
| 217 | + }, 400); | ||
| 218 | + } | ||
| 219 | + | ||
| 220 | + //暂停 | ||
| 221 | + var pauseFlag; | ||
| 222 | + | ||
| 223 | + function pause() { | ||
| 224 | + $('.play-btn', _body) | ||
| 225 | + .attr('data-type', 'play') | ||
| 226 | + .find('i') | ||
| 227 | + .removeClass('uk-icon-pause') | ||
| 228 | + .addClass('uk-icon-play') | ||
| 229 | + .next().text('播放'); | ||
| 230 | + pauseFlag = true; | ||
| 231 | + progress.removeClass('uk-active'); | ||
| 232 | + clearInterval(toCenterTimer); | ||
| 233 | + } | ||
| 234 | + | ||
| 235 | + var index = 1; | ||
| 236 | + var len; | ||
| 237 | + var defaultRunSpeed = 1000; | ||
| 238 | + var runSpeed = defaultRunSpeed; | ||
| 239 | + function run() { | ||
| 240 | + //暂停 | ||
| 241 | + if (pauseFlag) { | ||
| 242 | + pauseFlag = false; | ||
| 243 | + return | ||
| 244 | + } | ||
| 245 | + //结束 | ||
| 246 | + if (index >= len) { | ||
| 247 | + bar.css('width', '100%'); | ||
| 248 | + pause(); | ||
| 249 | + return; | ||
| 250 | + } | ||
| 251 | + | ||
| 252 | + //marker 移动 | ||
| 253 | + var gps = gpsArray[index]; | ||
| 254 | + | ||
| 255 | + //线路走向 | ||
| 256 | + if (gps.direction != gpsArray[index - 1].direction || index == 1) | ||
| 257 | + drawLine(gps.direction); | ||
| 258 | + | ||
| 259 | + var point = new BMap.Point(gps.bd_lon, gps.bd_lat); | ||
| 260 | + marker.setPosition(point); | ||
| 261 | + marker.setIcon(new BMap.Icon(gb_map_imap.createCarIconRotation(gps, width), new BMap.Size(width, 75))); | ||
| 262 | + | ||
| 263 | + //轨迹线 | ||
| 264 | + trailArray.push(point); | ||
| 265 | + trailPolyline.setPath(trailArray); | ||
| 266 | + | ||
| 267 | + //进度条 | ||
| 268 | + bar.css('width', step * index); | ||
| 269 | + | ||
| 270 | + //日志输出 | ||
| 271 | + logWrite(gps, gpsArray[index - 1]); | ||
| 272 | + //到离站输出 | ||
| 273 | + inoutStationWrite(gps); | ||
| 274 | + | ||
| 275 | + index++; | ||
| 276 | + setTimeout(run, runSpeed); | ||
| 277 | + } | ||
| 278 | + | ||
| 279 | + //初始化地图 | ||
| 280 | + function initMap(data) { | ||
| 281 | + gpsArray = data; | ||
| 282 | + var firstPoint = new BMap.Point(data[0].bd_lon, data[0].bd_lat); | ||
| 283 | + map = new BMap.Map($('.map_wrap', _body)[0]); | ||
| 284 | + map.centerAndZoom(firstPoint, 17); | ||
| 285 | + map.enableScrollWheelZoom(); | ||
| 286 | + | ||
| 287 | + //创建车辆marker | ||
| 288 | + marker = new BMap.Marker(firstPoint); | ||
| 289 | + width = gb_map_imap.calcGpsMarkerWidth(data[0].nbbm); | ||
| 290 | + //渲染icon | ||
| 291 | + marker.setIcon(new BMap.Icon(gb_map_imap.createCarIconRotation(data[0], width), new BMap.Size(width, 75))); | ||
| 292 | + marker.disableMassClear(); | ||
| 293 | + map.addOverlay(marker); | ||
| 294 | + | ||
| 295 | + //线路图层 数据 | ||
| 296 | + var routeCache = JSON.parse(storage.getItem(lineCode + '_route')); | ||
| 297 | + upRoutePos = initRoutePosData(routeCache.up_bd); | ||
| 298 | + downRoutePos = initRoutePosData(routeCache.down_bd); | ||
| 299 | + | ||
| 300 | + trailArray.push(firstPoint); | ||
| 301 | + drawTrailLine(); | ||
| 302 | + //输出第一个点 | ||
| 303 | + logWrite(data[0], null); | ||
| 304 | + } | ||
| 305 | + | ||
| 306 | + function drawTrailLine() { | ||
| 307 | + trailPolyline = new BMap.Polyline(trailArray, {strokeWeight: 3, strokeColor: 'black'}); | ||
| 308 | + map.addOverlay(trailPolyline); | ||
| 309 | + } | ||
| 310 | + | ||
| 311 | + function initRoutePosData(routeStr) { | ||
| 312 | + var array = [], temps; | ||
| 313 | + $.each(routeStr, function (i, item) { | ||
| 314 | + var pos = []; | ||
| 315 | + $.each(item.split(','), function () { | ||
| 316 | + temps = this.split(' '); | ||
| 317 | + pos.push(new BMap.Point(temps[0], temps[1])); | ||
| 318 | + }); | ||
| 319 | + array.push(pos); | ||
| 320 | + }); | ||
| 321 | + return array; | ||
| 322 | + } | ||
| 323 | + | ||
| 324 | + function drawLine(updown) { | ||
| 325 | + map.clearOverlays(); | ||
| 326 | + | ||
| 327 | + var pos = updown == 0 ? upRoutePos : downRoutePos; | ||
| 328 | + $.each(pos, function () { | ||
| 329 | + map.addOverlay(new BMap.Polyline(this, {strokeWeight: 12, strokeColor: 'rgba(0, 0, 255, 0.6)'})); | ||
| 330 | + }); | ||
| 331 | + | ||
| 332 | + drawTrailLine(); | ||
| 333 | + } | ||
| 334 | + | ||
| 335 | + //日志输出 | ||
| 336 | + var logWrap = $('.pb_log_panel', _body); | ||
| 337 | + var logPanel = $('.pb_log_panel .ct_table_body', _body); | ||
| 338 | + gb_ct_table.fixedHead(logWrap); | ||
| 339 | + | ||
| 340 | + function logWrite(gps, prve) { | ||
| 341 | + if (!gps.road || !gps.road.ROAD_CODE) | ||
| 342 | + return; | ||
| 343 | + | ||
| 344 | + var code = gps.road.ROAD_CODE; | ||
| 345 | + if (!prve || code != prve.road.ROAD_CODE) { | ||
| 346 | + logPanel.append('<dl data-code="' + code + '" ><dd>' + gps.timeStr + '</dd><dd>' + gps.speed + '</dd><dd>' + gps.road.ROAD_NAME + '</dd><dd>正常</dd></dl>'); | ||
| 347 | + } | ||
| 348 | + else { | ||
| 349 | + var dds = logPanel.find('dl[data-code=' + code + ']').last().find('dd'); | ||
| 350 | + $(dds[0]).text(gps.timeStr); | ||
| 351 | + $(dds[1]).text(gps.speed); | ||
| 352 | + } | ||
| 353 | + | ||
| 354 | + logWrap.scrollTop(logWrap[0].scrollHeight); | ||
| 355 | + } | ||
| 356 | + | ||
| 357 | + | ||
| 358 | + var inoutWrap = $('.pb_inout_station_panel', _body); | ||
| 359 | + gb_ct_table.fixedHead(inoutWrap); | ||
| 360 | + //进出站数据输出 | ||
| 361 | + function inoutStationWrite(gps) { | ||
| 362 | + if (gps.inout_stop == -1) | ||
| 363 | + return; | ||
| 364 | + | ||
| 365 | + var inoutInfo = gps['inout_stop_info']; | ||
| 366 | + var htmlStr = '<dl>' + | ||
| 367 | + '<dd>' + gps.timeStr + '</dd>' + | ||
| 368 | + '<dd>' + inoutInfo.stopName + '</dd>' + | ||
| 369 | + '<dd>' + (inoutInfo.inOut == 1 ? '出站' : '进站') + '</dd>' + | ||
| 370 | + '</dl>'; | ||
| 371 | + | ||
| 372 | + $('.pb_inout_station_panel .ct_table_body', _body).append(htmlStr); | ||
| 373 | + | ||
| 374 | + //滚动条 | ||
| 375 | + inoutWrap.scrollTop(inoutWrap[0].scrollHeight); | ||
| 376 | + } | ||
| 377 | + | ||
| 378 | + | ||
| 379 | + | ||
| 380 | + //播放速度 | ||
| 381 | + $('.play_speed_list li a', _body).on('click', function () { | ||
| 382 | + var speed = $(this).data('value'); | ||
| 383 | + runSpeed = defaultRunSpeed / speed; | ||
| 384 | + $('#speedIconBtn .text', _body).text(speed); | ||
| 385 | + }); | ||
| 386 | + })(); | ||
| 387 | + </script> | ||
| 388 | +</div> | ||
| 0 | \ No newline at end of file | 389 | \ No newline at end of file |
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback_v2/main.html
0 → 100644
| 1 | +<div class="uk-modal" id="map-playback2-modal"> | ||
| 2 | + <div class="uk-modal-dialog uk-modal-dialog-blank"> | ||
| 3 | + <button class="uk-modal-close uk-close" type="button"></button> | ||
| 4 | + <div class="uk-grid uk-flex-middle" data-uk-grid-margin> | ||
| 5 | + <div class="uk-width-medium-1-10 uk-height-viewport z-depth-viewport"> | ||
| 6 | + <h5 style="color: #868484;text-indent: 5px;"> | ||
| 7 | + 线路配车 | ||
| 8 | + </h5> | ||
| 9 | + <div class="uk-accordion cc_info_accordion" data-uk-accordion data-uk-observe> | ||
| 10 | + </div> | ||
| 11 | + | ||
| 12 | + </div> | ||
| 13 | + <div class="uk-width-medium-2-10 uk-height-viewport z-depth-viewport " style="position: relative;"> | ||
| 14 | + <div class="play_back_form_shade uk-animation-scale"></div> | ||
| 15 | + <form class="uk-form uk-form-horizontal playBackForm"> | ||
| 16 | + <div class="uk-grid"> | ||
| 17 | + <div class="uk-width-1-1"> | ||
| 18 | + <div class="uk-form-row"> | ||
| 19 | + <label class="uk-form-label">车辆编码</label> | ||
| 20 | + <div class="uk-form-controls"> | ||
| 21 | + <div class="uk-autocomplete uk-form autocomplete-nbbm"> | ||
| 22 | + <div class="uk-autocomplete uk-form autocomplete-nbbm"> | ||
| 23 | + <input name="nbbm" required/> | ||
| 24 | + </div> | ||
| 25 | + </div> | ||
| 26 | + </div> | ||
| 27 | + </div> | ||
| 28 | + </div> | ||
| 29 | + </div> | ||
| 30 | + <div class="uk-grid"> | ||
| 31 | + <div class="uk-width-2-3"> | ||
| 32 | + <div class="uk-form-row"> | ||
| 33 | + <label class="uk-form-label">开始时间</label> | ||
| 34 | + <div class="uk-form-controls"> | ||
| 35 | + <input name="sDate" type="date" style="width: 100%;" required/> | ||
| 36 | + </div> | ||
| 37 | + </div> | ||
| 38 | + </div> | ||
| 39 | + <div class="uk-width-1-3" style="padding-left: 15px;"> | ||
| 40 | + <div class="uk-form-row"> | ||
| 41 | + <div class="uk-form-controls" style="margin-left: 0;"> | ||
| 42 | + <input name="sTime" type="time" style="width: calc(100% - 28px);" required/> | ||
| 43 | + </div> | ||
| 44 | + </div> | ||
| 45 | + </div> | ||
| 46 | + </div> | ||
| 47 | + <div class="uk-grid"> | ||
| 48 | + <div class="uk-width-2-3"> | ||
| 49 | + <div class="uk-form-row"> | ||
| 50 | + <label class="uk-form-label">结束时间</label> | ||
| 51 | + <div class="uk-form-controls"> | ||
| 52 | + <input name="eDate" type="date" style="width: 100%;" required/> | ||
| 53 | + </div> | ||
| 54 | + </div> | ||
| 55 | + </div> | ||
| 56 | + <div class="uk-width-1-3" style="padding-left: 15px;"> | ||
| 57 | + <div class="uk-form-row"> | ||
| 58 | + <div class="uk-form-controls" style="margin-left: 0;"> | ||
| 59 | + <input name="eTime" type="time" style="width: calc(100% - 28px);" required/> | ||
| 60 | + </div> | ||
| 61 | + </div> | ||
| 62 | + </div> | ||
| 63 | + </div> | ||
| 64 | + <div class="uk-grid"> | ||
| 65 | + <button class="uk-button uk-button-large uk-button-primary playBackButton" type="submit"><i | ||
| 66 | + class="uk-icon-search"> </i> 搜索轨迹 | ||
| 67 | + </button> | ||
| 68 | + </div> | ||
| 69 | + </form> | ||
| 70 | + <!-- 异常警报 --> | ||
| 71 | + <div class="abnormal_table_wrap"> | ||
| 72 | + <div class="abnormal_table_panel" | ||
| 73 | + style="height: calc(100% - 15px);margin-top: 15px;overflow: auto;"> | ||
| 74 | + <div class="ct_table abnormal_table" style="height: calc(100% - 30px);"> | ||
| 75 | + <div class="ct_table_head"> | ||
| 76 | + <dl> | ||
| 77 | + <dt>异常状态</dt> | ||
| 78 | + <dt>开始时间</dt> | ||
| 79 | + <dt>结束时间</dt> | ||
| 80 | + <dt>图像</dt> | ||
| 81 | + </dl> | ||
| 82 | + </div> | ||
| 83 | + <div class="ct_table_body"> | ||
| 84 | + </div> | ||
| 85 | + </div> | ||
| 86 | + </div> | ||
| 87 | + </div> | ||
| 88 | + <!-- 路段 和 到离站信息 --> | ||
| 89 | + <div class="uk-margin uk-grid other_info_table_wrap" data-uk-grid-margin> | ||
| 90 | + <div class="uk-width-medium-1-1" style="padding-left: 0;"> | ||
| 91 | + | ||
| 92 | + <ul class="uk-tab" data-uk-tab="{connect:'#real_gps_info_tab_content'}" | ||
| 93 | + style="padding-left: 12px;"> | ||
| 94 | + <li class="uk-active"><a>行车轨迹</a></li> | ||
| 95 | + <li><a>到离站信息</a></li> | ||
| 96 | + </ul> | ||
| 97 | + | ||
| 98 | + <ul id="real_gps_info_tab_content" class="uk-switcher uk-margin" | ||
| 99 | + style="height: calc(100% - 44px);margin-top: 7px;"> | ||
| 100 | + <li class="uk-active" style="height: 100%;"> | ||
| 101 | + <div class="road_table_wrap" style="height: 100%;overflow: auto;"> | ||
| 102 | + <div class="ct_table gps-road-info" | ||
| 103 | + style="height: calc(100% - 30px);"> | ||
| 104 | + <div class="ct_table_head"> | ||
| 105 | + <dl> | ||
| 106 | + <dt>时间</dt> | ||
| 107 | + <dt>速度</dt> | ||
| 108 | + <dt>所在路段</dt> | ||
| 109 | + </dl> | ||
| 110 | + </div> | ||
| 111 | + <div class="ct_table_body"> | ||
| 112 | + </div> | ||
| 113 | + </div> | ||
| 114 | + </div> | ||
| 115 | + </li> | ||
| 116 | + <!-- 到离站数据 --> | ||
| 117 | + <li style="height: 100%;"> | ||
| 118 | + <div class="inout_table_wrap" style="height: 100%;overflow: auto;"> | ||
| 119 | + <div class="ct_table" style="height: calc(100% - 30px);"> | ||
| 120 | + <div class="ct_table_head"> | ||
| 121 | + <dl> | ||
| 122 | + <dt>站点</dt> | ||
| 123 | + <dt>到站时间</dt> | ||
| 124 | + <dt>离站时间</dt> | ||
| 125 | + <dt>上客</dt> | ||
| 126 | + <dt>下客</dt> | ||
| 127 | + </dl> | ||
| 128 | + </div> | ||
| 129 | + <div class="ct_table_body"> | ||
| 130 | + </div> | ||
| 131 | + </div> | ||
| 132 | + </div> | ||
| 133 | + </li> | ||
| 134 | + </ul> | ||
| 135 | + | ||
| 136 | + </div> | ||
| 137 | + </div> | ||
| 138 | + </div> | ||
| 139 | + <div class="uk-width-medium-7-10 uk-height-viewport map-wrap" style="padding-left: 0;position: relative;"> | ||
| 140 | + <div class="map-wrap-tools uk-animation-slide-top"> | ||
| 141 | + <div class="btns"> | ||
| 142 | + <span class="ct_btn play_btn"></span> | ||
| 143 | + <span class="ct_btn clock"></span> | ||
| 144 | + <div class="multi-items"> | ||
| 145 | + <form class="uk-form speed_form"> | ||
| 146 | + <label> | ||
| 147 | + <input type="radio" name="playSpeed" value="1"> x1 | ||
| 148 | + </label> | ||
| 149 | + <label> | ||
| 150 | + <input type="radio" name="playSpeed" value="5"> x5 | ||
| 151 | + </label> | ||
| 152 | + <label> | ||
| 153 | + <input type="radio" name="playSpeed" value="10"> x10 | ||
| 154 | + </label> | ||
| 155 | + <label> | ||
| 156 | + <input type="radio" name="playSpeed" value="20"> x20 | ||
| 157 | + </label> | ||
| 158 | + </form> | ||
| 159 | + </div> | ||
| 160 | + <div class="multi-items"> | ||
| 161 | + <form class="uk-form buffer_area_form"> | ||
| 162 | + <label> | ||
| 163 | + <input type="checkbox" name="drawPoint"> 站点 | ||
| 164 | + </label> | ||
| 165 | + <label> | ||
| 166 | + <input type="checkbox" name="drawBuffArea"> 缓冲区 | ||
| 167 | + </label> | ||
| 168 | + <label> | ||
| 169 | + <input type="checkbox" name="stationName"> 站点名称 | ||
| 170 | + </label> | ||
| 171 | + <label> | ||
| 172 | + <div class="uk-button-dropdown" data-uk-dropdown> | ||
| 173 | + <a>停车场 <i class="uk-icon-angle-down"></i></a> | ||
| 174 | + <div class="uk-dropdown uk-dropdown-scrollable" style="max-height: 300px;"> | ||
| 175 | + <ul class="uk-nav uk-nav-dropdown parks_list"> | ||
| 176 | + | ||
| 177 | + </ul> | ||
| 178 | + </div> | ||
| 179 | + </div> | ||
| 180 | + </label> | ||
| 181 | + </form> | ||
| 182 | + </div> | ||
| 183 | + <span class="ct_btn text-panel"> | ||
| 184 | + <span>共约 <span class="sum_mileage"></span> 公里,<span class="count_point"></span> 个GPS点</span><br> | ||
| 185 | + <a class="export-excel"><i class="uk-icon-file-excel-o"></i> 导出轨迹</a> | ||
| 186 | + | ||
| 187 | + <label> | ||
| 188 | + <div class="uk-button-dropdown" data-uk-dropdown> | ||
| 189 | + <a style="color: grey;margin-left: 12px;font-size: 12px;">线路底图 <i class="uk-icon-angle-down"></i></a> | ||
| 190 | + <div class="uk-dropdown uk-dropdown-scrollable" style="max-height: 300px;"> | ||
| 191 | + <ul class="uk-nav uk-nav-dropdown line_route_list"> | ||
| 192 | + </ul> | ||
| 193 | + </div> | ||
| 194 | + </div> | ||
| 195 | + </label> | ||
| 196 | + </span> | ||
| 197 | + </div> | ||
| 198 | + <div class="ct-progress-bar" > | ||
| 199 | + <div class="scale"></div> | ||
| 200 | + </div> | ||
| 201 | + </div> | ||
| 202 | + <div class="map-container"></div> | ||
| 203 | + </div> | ||
| 204 | + </div> | ||
| 205 | + </div> | ||
| 206 | + | ||
| 207 | + <script id="cc_info_accordion_cont_temp" type="text/html"> | ||
| 208 | + {{each ccInfo as cc i}} | ||
| 209 | + <h3 class="uk-accordion-title">{{cc.name}}</h3> | ||
| 210 | + <div class="uk-accordion-content"> | ||
| 211 | + <ul class="uk-list"> | ||
| 212 | + {{each cc.cars as c j}} | ||
| 213 | + <li>{{c}}</li> | ||
| 214 | + {{/each}} | ||
| 215 | + </ul> | ||
| 216 | + </div> | ||
| 217 | + {{/each}} | ||
| 218 | + </script> | ||
| 219 | + | ||
| 220 | + <script id="gps_road_info_cont_temp" type="text/html"> | ||
| 221 | + {{each array as gps i}} | ||
| 222 | + <dl data-code="{{gps.road.road_CODE}}"> | ||
| 223 | + <dd>{{gps.timeStr}}</dd> | ||
| 224 | + <dd>{{gps.speed}}</dd> | ||
| 225 | + <dd>{{gps.road.road_NAME}}</dd> | ||
| 226 | + </dl> | ||
| 227 | + {{/each}} | ||
| 228 | + </script> | ||
| 229 | + | ||
| 230 | + <script id="multi_inout_info_cont_temp" type="text/html"> | ||
| 231 | + {{each list as item i}} | ||
| 232 | + <dl data-id="{{item.id}}"> | ||
| 233 | + <dd>{{item.stopName}}</dd> | ||
| 234 | + <dd>{{item.in_time_str}}</dd> | ||
| 235 | + <dd>{{item.out_time_str}}</dd> | ||
| 236 | + <dd></dd> | ||
| 237 | + <dd></dd> | ||
| 238 | + </dl> | ||
| 239 | + {{/each}} | ||
| 240 | + </script> | ||
| 241 | + | ||
| 242 | + <script id="inout_info_cont_temp" type="text/html"> | ||
| 243 | + <dl data-id="{{id}}"> | ||
| 244 | + <dd>{{stopName}}</dd> | ||
| 245 | + <dd>{{in_time_str}}</dd> | ||
| 246 | + <dd></dd> | ||
| 247 | + <dd></dd> | ||
| 248 | + <dd></dd> | ||
| 249 | + </dl> | ||
| 250 | + </script> | ||
| 251 | + | ||
| 252 | + | ||
| 253 | + <script id="abnormal_table_cont_temp" type="text/html"> | ||
| 254 | + {{each array as item i}} | ||
| 255 | + <dl> | ||
| 256 | + <dd> | ||
| 257 | + {{if item.abnormalType == 'speed'}} | ||
| 258 | + 超速({{item.speed}}) | ||
| 259 | + {{else if item.abnormalType == 'outbound'}} | ||
| 260 | + 越界 | ||
| 261 | + {{/if}} | ||
| 262 | + </dd> | ||
| 263 | + <dd>{{item.st_str}}</dd> | ||
| 264 | + <dd>{{item.et_str}}</dd> | ||
| 265 | + <dd></dd> | ||
| 266 | + </dl> | ||
| 267 | + {{/each}} | ||
| 268 | + </script> | ||
| 269 | + | ||
| 270 | + <script id="pb_park_list_dropdown-temp" type="text/html"> | ||
| 271 | + {{each list as p i}} | ||
| 272 | + <li data-code="{{p.parkCode}}" ><a>{{p.parkName}}</a></li> | ||
| 273 | + {{if i == 0}} | ||
| 274 | + <li class="uk-nav-divider"></li> | ||
| 275 | + {{/if}} | ||
| 276 | + {{/each}} | ||
| 277 | + </script> | ||
| 278 | + <script> | ||
| 279 | + (function () { | ||
| 280 | + var modal = '#map-playback2-modal', gpsArray; | ||
| 281 | + | ||
| 282 | + //modal hide remove dom | ||
| 283 | + $(modal).on('hide.uk.modal', function () { | ||
| 284 | + $('.map-wrap-tools .play_btn', modal).removeClass('play'); | ||
| 285 | + playObj.pause(); | ||
| 286 | + searchForm.hideShade(); | ||
| 287 | + }); | ||
| 288 | + | ||
| 289 | + $(modal).on('init', function (e, data) { | ||
| 290 | + //初始化地图 | ||
| 291 | + mapObj.initMap(); | ||
| 292 | + | ||
| 293 | + //固定表头 | ||
| 294 | + gb_ct_table.fixedHead($('.road_table_wrap', modal)); | ||
| 295 | + gb_ct_table.fixedHead($('.inout_table_wrap', modal)); | ||
| 296 | + gb_ct_table.fixedHead($('.abnormal_table_panel', modal)); | ||
| 297 | + //线路配车 | ||
| 298 | + ccInfo.init(); | ||
| 299 | + | ||
| 300 | + //表单初始值 | ||
| 301 | + searchForm.init(data); | ||
| 302 | + | ||
| 303 | + //车辆 autocomplete | ||
| 304 | + $.get('/freeLogin/basic/cars', function (rs) { | ||
| 305 | + gb_common.carAutocomplete($('.autocomplete-nbbm', modal), rs); | ||
| 306 | + }); | ||
| 307 | + | ||
| 308 | + //初始化线路底图下拉 | ||
| 309 | + var opts=''; | ||
| 310 | + $.each(gb_data_basic.activeLines, function () { | ||
| 311 | + opts+='<li data-code="'+this.lineCode+'" data-dir="0"><a>'+this.name+'上行</a></li><li data-code="'+this.lineCode+'" data-dir="1"><a>'+this.name+'下行</a></li>'; | ||
| 312 | + }); | ||
| 313 | + $('.line_route_list', modal).html(opts); | ||
| 314 | + }); | ||
| 315 | + | ||
| 316 | + //切换线路底图 | ||
| 317 | + $(modal).on('click', '.line_route_list li', function () { | ||
| 318 | + var code = $(this).data('code'); | ||
| 319 | + var updown = $(this).data('dir'); | ||
| 320 | + mapObj.changeLine(code, updown); | ||
| 321 | + }); | ||
| 322 | + | ||
| 323 | + /** | ||
| 324 | + * 线路配车相关 | ||
| 325 | + */ | ||
| 326 | + var ccInfo = (function () { | ||
| 327 | + | ||
| 328 | + function init() { | ||
| 329 | + $.get('/basic/ccInfo', function (rs) { | ||
| 330 | + var ccInfo = [], lines = gb_data_basic.codeToLine; | ||
| 331 | + for (var code in lines) { | ||
| 332 | + ccInfo.push({ | ||
| 333 | + name: lines[code].name, | ||
| 334 | + cars: carSort(rs[code]) | ||
| 335 | + }); | ||
| 336 | + } | ||
| 337 | + | ||
| 338 | + var htmlStr = template('cc_info_accordion_cont_temp', {ccInfo: ccInfo}); | ||
| 339 | + $('.cc_info_accordion', modal).html(htmlStr) | ||
| 340 | + .find('.uk-list li').on('click', itemClick); | ||
| 341 | + }); | ||
| 342 | + } | ||
| 343 | + | ||
| 344 | + function carSort(list) { | ||
| 345 | + if (!list) | ||
| 346 | + return []; | ||
| 347 | + return list.sort(); | ||
| 348 | + } | ||
| 349 | + | ||
| 350 | + function itemClick() { | ||
| 351 | + $(this).parent().find('li.active').removeClass('active'); | ||
| 352 | + $(this).addClass('active'); | ||
| 353 | + searchForm.setNbbm($(this).text()); | ||
| 354 | + } | ||
| 355 | + | ||
| 356 | + return { | ||
| 357 | + init: init | ||
| 358 | + }; | ||
| 359 | + })(); | ||
| 360 | + | ||
| 361 | + /** | ||
| 362 | + * 搜索表单相关 | ||
| 363 | + */ | ||
| 364 | + var searchForm = (function () { | ||
| 365 | + | ||
| 366 | + var f = $('.playBackForm', modal); | ||
| 367 | + | ||
| 368 | + var init = function (data) { | ||
| 369 | + //设置初始值 | ||
| 370 | + if (data.nbbm) | ||
| 371 | + $('[name=nbbm]', f).val(data.nbbm); | ||
| 372 | + var st = moment().subtract(2, 'hour'); | ||
| 373 | + if (data.st) | ||
| 374 | + st = moment(data.st, 'YYYY-MM-DD HH:mm'); | ||
| 375 | + $('[name=sDate]', f).val(st.format('YYYY-MM-DD')); | ||
| 376 | + $('[name=sTime]', f).val(st.format('HH:mm')); | ||
| 377 | + var et = moment(); | ||
| 378 | + if (data.et) | ||
| 379 | + et = moment(data.et, 'YYYY-MM-DD HH:mm'); | ||
| 380 | + $('[name=eDate]', f).val(et.format('YYYY-MM-DD')); | ||
| 381 | + $('[name=eTime]', f).val(et.format('HH:mm')); | ||
| 382 | + | ||
| 383 | + | ||
| 384 | + /*$('[name=nbbm]', f).val('W0A-018'); | ||
| 385 | + $('[name=sDate]', f).val('2017-04-06'); | ||
| 386 | + $('[name=sTime]', f).val('04:49'); | ||
| 387 | + | ||
| 388 | + $('[name=eDate]', f).val('2017-04-06'); | ||
| 389 | + $('[name=eTime]', f).val('09:49');*/ | ||
| 390 | + //搜索事件 | ||
| 391 | + $('button[type=submit]', f).on('click', search); | ||
| 392 | + }; | ||
| 393 | + | ||
| 394 | + var setNbbm = function (v) { | ||
| 395 | + $('[name=nbbm]', f).val(v); | ||
| 396 | + }; | ||
| 397 | + | ||
| 398 | + var ONE_DAY = 60 * 60 * 24; | ||
| 399 | + var MIN_SPACE = 60; | ||
| 400 | + var search = function (e) { | ||
| 401 | + e.stopPropagation(); | ||
| 402 | + var data = f.serializeJSON(); | ||
| 403 | + | ||
| 404 | + //校验时间间隔 | ||
| 405 | + var fs = 'YYYY-MM-DDHH:mm'; | ||
| 406 | + var st = parseInt(moment(data.sDate + data.sTime, fs).format('X')); | ||
| 407 | + var et = parseInt(moment(data.eDate + data.eTime, fs).format('X')); | ||
| 408 | + | ||
| 409 | + if (et < st) | ||
| 410 | + notify_err('结束时间不能小于开始时间'); | ||
| 411 | + else if ((et - st) > ONE_DAY) | ||
| 412 | + notify_err('最大间隔24小时!'); | ||
| 413 | + else if ((et - st) < MIN_SPACE) | ||
| 414 | + notify_err('最小间隔1分钟!'); | ||
| 415 | + else { | ||
| 416 | + show_wait_modal('搜索数据...'); | ||
| 417 | + $.ajax({ | ||
| 418 | + url: '/gps/history_v2/' + data.nbbm, | ||
| 419 | + traditional: true, | ||
| 420 | + data: {st: st, et: et}, | ||
| 421 | + success: function (rs) { | ||
| 422 | + hide_wait_modal(); | ||
| 423 | + //重置相关对象 | ||
| 424 | + playObj.reset(); | ||
| 425 | + mapObj.reset(); | ||
| 426 | + | ||
| 427 | + gpsArray = rs.list; | ||
| 428 | + if (!gpsArray || gpsArray.length == 0) { | ||
| 429 | + notify_err('没有搜索到轨迹数据!'); | ||
| 430 | + return; | ||
| 431 | + } | ||
| 432 | + | ||
| 433 | + //排序 | ||
| 434 | + gpsArray.sort(function (a, b) { | ||
| 435 | + return parseInt((a.ts - b.ts) + '' + (a.stop_no - b.stop_no)); | ||
| 436 | + }); | ||
| 437 | + //行车轨迹 | ||
| 438 | + trailTableObj.showInitData(gpsArray); | ||
| 439 | + //到离站信息 | ||
| 440 | + inOutStationTableObj.showInitData(gpsArray); | ||
| 441 | + //异常信息 | ||
| 442 | + abnormalTableObj.showInitData(rs['outboundList'], rs['speedList']); | ||
| 443 | + //show 工具条 | ||
| 444 | + mapTools.show(rs); | ||
| 445 | + //地图 | ||
| 446 | + mapObj.initData(rs); | ||
| 447 | + //play 对象 | ||
| 448 | + playObj.init(rs); | ||
| 449 | + //设置导出文件名称 | ||
| 450 | + mapTools.setExcelName(); | ||
| 451 | + } | ||
| 452 | + }); | ||
| 453 | + } | ||
| 454 | + return false; | ||
| 455 | + }; | ||
| 456 | + | ||
| 457 | + //遮罩 | ||
| 458 | + var shade = $('.play_back_form_shade', modal); | ||
| 459 | + var showShade = function () { | ||
| 460 | + shade.show(); | ||
| 461 | + }; | ||
| 462 | + var hideShade = function () { | ||
| 463 | + shade.hide(); | ||
| 464 | + }; | ||
| 465 | + | ||
| 466 | + return { | ||
| 467 | + init: init, | ||
| 468 | + setNbbm: setNbbm, | ||
| 469 | + showShade: showShade, | ||
| 470 | + hideShade: hideShade | ||
| 471 | + }; | ||
| 472 | + })(); | ||
| 473 | + | ||
| 474 | + /** | ||
| 475 | + * 行车轨迹表格 | ||
| 476 | + */ | ||
| 477 | + var trailTableObj = (function () { | ||
| 478 | + | ||
| 479 | + var $tbody = $('.gps-road-info .ct_table_body', modal); | ||
| 480 | + var $wrap = $('.road_table_wrap', modal); | ||
| 481 | + var initFlag, gpsArray; | ||
| 482 | + var showInitData = function (list) { | ||
| 483 | + var array = []; | ||
| 484 | + for (var i = 0, gps; gps = list[i++];) { | ||
| 485 | + //格式化时间 | ||
| 486 | + gps.timeStr = moment(gps.timestamp).format('HH:mm.ss'); | ||
| 487 | + try { | ||
| 488 | + if (i > 0 && array[array.length - 1].road.road_CODE == gps.road.road_CODE) | ||
| 489 | + array.pop(); | ||
| 490 | + } | ||
| 491 | + catch (e) { | ||
| 492 | + } | ||
| 493 | + | ||
| 494 | + if (gps.road) | ||
| 495 | + array.push(gps); | ||
| 496 | + } | ||
| 497 | + | ||
| 498 | + var htmlStr = template('gps_road_info_cont_temp', {array: array}); | ||
| 499 | + $tbody.html(htmlStr); | ||
| 500 | + initFlag = true; | ||
| 501 | + gpsArray = list; | ||
| 502 | + }; | ||
| 503 | + | ||
| 504 | + var prev; | ||
| 505 | + var add = function (gps, i) { | ||
| 506 | + if(i == 0) | ||
| 507 | + return; | ||
| 508 | + if(initFlag){ | ||
| 509 | + //清理初始化的数据 | ||
| 510 | + $tbody.html(''); | ||
| 511 | + initFlag = false; | ||
| 512 | + } | ||
| 513 | + if (!gps.road) | ||
| 514 | + return; | ||
| 515 | + var code = gps.road.road_CODE; | ||
| 516 | + if (!prev || code != prev.road.road_CODE) { | ||
| 517 | + $tbody.append(template('gps_road_info_cont_temp', {array: [gps]})); | ||
| 518 | + } | ||
| 519 | + else{ | ||
| 520 | + var dds = $tbody.find('dl[data-code=' + code + ']').last().find('dd'); | ||
| 521 | + $(dds[0]).text(gps.timeStr); | ||
| 522 | + $(dds[1]).text(gps.speed); | ||
| 523 | + } | ||
| 524 | + prev = gps; | ||
| 525 | + $wrap.scrollTop($wrap[0].scrollHeight); | ||
| 526 | + }; | ||
| 527 | + | ||
| 528 | + return { | ||
| 529 | + showInitData: showInitData, | ||
| 530 | + add : add, | ||
| 531 | + gpsArray : function () { | ||
| 532 | + return gpsArray; | ||
| 533 | + } | ||
| 534 | + }; | ||
| 535 | + })(); | ||
| 536 | + | ||
| 537 | + /** | ||
| 538 | + * 到离站信息表格 | ||
| 539 | + * @type {{}} | ||
| 540 | + */ | ||
| 541 | + var inOutStationTableObj = (function () { | ||
| 542 | + | ||
| 543 | + var data, f, prev, initFlag; | ||
| 544 | + var $wrap = $('.inout_table_wrap', modal); | ||
| 545 | + var $tbody = $('.ct_table_body', $wrap); | ||
| 546 | + var showInitData = function (list) { | ||
| 547 | + clear(); | ||
| 548 | + data = []; | ||
| 549 | + $.each(list, function (i, gps) { | ||
| 550 | + prev = data[data.length - 1]; | ||
| 551 | + if (gps['inout_stop'] == -1) | ||
| 552 | + return true; | ||
| 553 | + if (gps['inout_stop'] == 0 && gps['inout_stop_info']) { | ||
| 554 | + //连续进站信号,取第一个 | ||
| 555 | + if(prev && prev['out_ts'] == null | ||
| 556 | + && prev['stopName'] == gps['inout_stop_info'].stopName){ | ||
| 557 | + return true; | ||
| 558 | + } | ||
| 559 | + data.push(createIn(gps)); | ||
| 560 | + } | ||
| 561 | + else if (gps['inout_stop'] == 1) { | ||
| 562 | + f = matchOut(prev, gps); | ||
| 563 | + if(f) | ||
| 564 | + data.push(f); | ||
| 565 | + } | ||
| 566 | + }); | ||
| 567 | + //格式化时间 | ||
| 568 | + $.each(data, function (i) { | ||
| 569 | + if (this.in_ts) | ||
| 570 | + this.in_time_str = moment(this.in_ts).format('HH:mm.ss'); | ||
| 571 | + if (this.out_ts) | ||
| 572 | + this.out_time_str = moment(this.out_ts).format('HH:mm.ss'); | ||
| 573 | + //id | ||
| 574 | + this.id = 'in_out_' + i; | ||
| 575 | + }); | ||
| 576 | + var htmlStr = template('multi_inout_info_cont_temp', {list: data}); | ||
| 577 | + $tbody.html(htmlStr); | ||
| 578 | + initFlag = true; | ||
| 579 | + len = data.length; | ||
| 580 | + }; | ||
| 581 | + | ||
| 582 | + var inoutIndex=0, len, item; | ||
| 583 | + var add = function (gps, i) { | ||
| 584 | + if(i == 0) | ||
| 585 | + return; | ||
| 586 | + if(initFlag) | ||
| 587 | + clear(); | ||
| 588 | + | ||
| 589 | + var $dl; | ||
| 590 | + for(j = inoutIndex; j < len; j++){ | ||
| 591 | + item = data[j]; | ||
| 592 | + $dl = $tbody.find('dl[data-id='+item.id+']'); | ||
| 593 | + if(gps.ts >= item.in_ts && $dl.length==0){ | ||
| 594 | + $tbody.append(template('inout_info_cont_temp', item)); | ||
| 595 | + inoutIndex = j; | ||
| 596 | + } | ||
| 597 | + | ||
| 598 | + if(gps.ts >= item.out_ts){ | ||
| 599 | + var dds = $dl.find('dd'); | ||
| 600 | + if($dl.length==0) | ||
| 601 | + $tbody.append(template('inout_info_cont_temp', item)); | ||
| 602 | + else | ||
| 603 | + $(dds[2]).text(item.out_time_str); | ||
| 604 | + inoutIndex = j; | ||
| 605 | + } | ||
| 606 | + else { | ||
| 607 | + break; | ||
| 608 | + } | ||
| 609 | + } | ||
| 610 | + $wrap.scrollTop($wrap[0].scrollHeight); | ||
| 611 | + }; | ||
| 612 | + | ||
| 613 | + var clear = function () { | ||
| 614 | + $tbody.html(''); | ||
| 615 | + initFlag = false; | ||
| 616 | + }; | ||
| 617 | + | ||
| 618 | + var createIn = function (gps) { | ||
| 619 | + var info = gps['inout_stop_info']; | ||
| 620 | + return {in_ts: info.ts, stopNo: info.stopNo, stopName: info.stopName} | ||
| 621 | + }; | ||
| 622 | + | ||
| 623 | + var matchOut = function (prevInfo, gps) { | ||
| 624 | + var oi = gps['inout_stop_info']; | ||
| 625 | + if(!oi) | ||
| 626 | + return; | ||
| 627 | + if(prevInfo && prevInfo.stopName == oi.stopName){ | ||
| 628 | + prevInfo['out_ts'] = oi.ts; | ||
| 629 | + return null; | ||
| 630 | + } | ||
| 631 | + else { | ||
| 632 | + return {out_ts: oi.ts,stopNo: oi.stopNo,stopName: oi.stopName} | ||
| 633 | + } | ||
| 634 | + }; | ||
| 635 | + | ||
| 636 | + return { | ||
| 637 | + showInitData: showInitData, | ||
| 638 | + add: add | ||
| 639 | + }; | ||
| 640 | + })(); | ||
| 641 | + | ||
| 642 | + /** | ||
| 643 | + * 异常信息表格 | ||
| 644 | + * @type {{showInitData}} | ||
| 645 | + */ | ||
| 646 | + var abnormalTableObj = (function () { | ||
| 647 | + | ||
| 648 | + var showInitData = function () { | ||
| 649 | + var array = []; | ||
| 650 | + for(var i = 0; i < arguments.length; i ++){ | ||
| 651 | + array = array.concat(arguments[i]); | ||
| 652 | + } | ||
| 653 | + //格式化时间 | ||
| 654 | + $.each(array, function () { | ||
| 655 | + if(this.st) | ||
| 656 | + this.st_str = moment(this.st).format('HH:mm.ss'); | ||
| 657 | + if(this.et) | ||
| 658 | + this.et_str = moment(this.et).format('HH:mm.ss'); | ||
| 659 | + }); | ||
| 660 | + | ||
| 661 | + //排序 | ||
| 662 | + array.sort(function (a, b) { | ||
| 663 | + return a.st - b.st; | ||
| 664 | + }); | ||
| 665 | + | ||
| 666 | + var htmlStr = template('abnormal_table_cont_temp', {array: array}); | ||
| 667 | + $('.abnormal_table .ct_table_body', modal).html(htmlStr); | ||
| 668 | + }; | ||
| 669 | + | ||
| 670 | + return { | ||
| 671 | + showInitData: showInitData | ||
| 672 | + } | ||
| 673 | + })(); | ||
| 674 | + | ||
| 675 | + /** | ||
| 676 | + * 工具条相关 | ||
| 677 | + */ | ||
| 678 | + var mapTools = (function () { | ||
| 679 | + | ||
| 680 | + $('.map-wrap-tools .play_btn', modal).on('click', function () { | ||
| 681 | + if($(this).hasClass('play')){ | ||
| 682 | + //暂停 | ||
| 683 | + $(this).removeClass('play'); | ||
| 684 | + playObj.pause(); | ||
| 685 | + searchForm.hideShade(); | ||
| 686 | + } | ||
| 687 | + else { | ||
| 688 | + //播放 | ||
| 689 | + $(this).addClass('play'); | ||
| 690 | + playObj.play(); | ||
| 691 | + playObj.fixedToCenter(); | ||
| 692 | + searchForm.showShade(); | ||
| 693 | + } | ||
| 694 | + }); | ||
| 695 | + | ||
| 696 | + //播放速度 | ||
| 697 | + $('.speed_form input[name=playSpeed]', modal).on('click', function () { | ||
| 698 | + playObj.setConf('playSpeed', $(this).val()); | ||
| 699 | + }); | ||
| 700 | + | ||
| 701 | + //空间数据 | ||
| 702 | + $('.buffer_area_form input[type=checkbox]', modal).on('click', function () { | ||
| 703 | + playObj.setConf($(this).attr('name'), $(this)[0].checked); | ||
| 704 | + mapObj.refreshOverlay(); | ||
| 705 | + }); | ||
| 706 | + | ||
| 707 | + //进度条 | ||
| 708 | + var step, $scale = $('.ct-progress-bar .scale', modal); | ||
| 709 | + var upProgressBar = function (i) { | ||
| 710 | + $scale.css('width', step * (i + 1)); | ||
| 711 | + }; | ||
| 712 | + | ||
| 713 | + //导出 | ||
| 714 | + $('.export-excel', modal).on('click', function () { | ||
| 715 | + var base64Str = gb_map_play_back.listToExcel(trailTableObj.gpsArray()); | ||
| 716 | + $(this).attr('href', base64Str); | ||
| 717 | + }); | ||
| 718 | + | ||
| 719 | + var setExcelName = function () { | ||
| 720 | + var f = $('.playBackForm', modal); | ||
| 721 | + var fileName = ($('[name=nbbm]', f).val() + '轨迹数据' + $('[name=sDate]', f).val() + $('[name=sTime]', f).val() + '至' + $('[name=eDate]', f).val() + $('[name=eTime]', f).val() + '.xls').replace(new RegExp(/-/g),'').replace(new RegExp(/:/g),''); | ||
| 722 | + $('.export-excel', modal).attr('download', fileName); | ||
| 723 | + }; | ||
| 724 | + | ||
| 725 | + var gpsArray; | ||
| 726 | + var show = function (rs) { | ||
| 727 | + $('.map-wrap-tools').show(); | ||
| 728 | + $('.map-container', modal).addClass('show_tools'); | ||
| 729 | + //总里程 | ||
| 730 | + $('.text-panel .sum_mileage', modal).text(rs.sumMileage); | ||
| 731 | + | ||
| 732 | + var size = rs.list.length; | ||
| 733 | + $('.text-panel .count_point', modal).text(size); | ||
| 734 | + step = $('.ct-progress-bar', modal).width() / size; | ||
| 735 | + | ||
| 736 | + //console.log('stepstep', step); | ||
| 737 | + }; | ||
| 738 | + | ||
| 739 | + return { | ||
| 740 | + show: show, | ||
| 741 | + upProgressBar: upProgressBar, | ||
| 742 | + setExcelName: setExcelName | ||
| 743 | + } | ||
| 744 | + })(); | ||
| 745 | + | ||
| 746 | + /** | ||
| 747 | + * 地图相关 | ||
| 748 | + */ | ||
| 749 | + var mapObj = (function () { | ||
| 750 | + var map; | ||
| 751 | + var initMap = function () { | ||
| 752 | + //初始化地图 | ||
| 753 | + map = new BMap.Map($('.map-container', modal)[0]); | ||
| 754 | + //中心点和缩放级别 | ||
| 755 | + map.centerAndZoom(new BMap.Point(gb_map_consts.center_point.lng, gb_map_consts.center_point.lat), 16); | ||
| 756 | + map.enableScrollWheelZoom(); | ||
| 757 | + //map.setMapStyle({style:'grayscale'}); | ||
| 758 | + }; | ||
| 759 | + | ||
| 760 | + var storage = window.localStorage; | ||
| 761 | + var routes;//路段 | ||
| 762 | + var stations;//站点 | ||
| 763 | + var parks;//停车场 | ||
| 764 | + //停车场编码和Polygon对照 | ||
| 765 | + var parkPolygons={}; | ||
| 766 | + | ||
| 767 | + var initData = function (rs) { | ||
| 768 | + var gpsArray = rs.list; | ||
| 769 | + if(!gpsArray || gpsArray.length==0) | ||
| 770 | + return; | ||
| 771 | + var lineCode = gpsArray[0].lineId; | ||
| 772 | + //从地图模块获取站点数据 | ||
| 773 | + stations = gb_map_spatial_data.getStationArray(lineCode); | ||
| 774 | + //停车场下拉菜单 | ||
| 775 | + initDropdownList(lineCode); | ||
| 776 | + | ||
| 777 | + //从localStorage 获取路段 | ||
| 778 | + routes = JSON.parse(storage.getItem(lineCode + '_route')); | ||
| 779 | + routes = [routes.up_bd, routes.down_bd]; | ||
| 780 | + }; | ||
| 781 | + | ||
| 782 | + /** | ||
| 783 | + * 初始化停车场下拉菜单 | ||
| 784 | + */ | ||
| 785 | + var initDropdownList = function (lineCode) { | ||
| 786 | + //从地图模块获取停车场数据 | ||
| 787 | + parks = gb_map_spatial_data.carparkArray(); | ||
| 788 | + //console.log('parksparks', parks); | ||
| 789 | + //将线路标准停车场排在第一个 | ||
| 790 | + var information = gb_data_basic.getLineInformation(lineCode); | ||
| 791 | + if(information){ | ||
| 792 | + var index; | ||
| 793 | + for(var i = 0,p; p=parks[i++];){ | ||
| 794 | + if(p.parkCode == information.carPark){ | ||
| 795 | + index = i - 1; | ||
| 796 | + break; | ||
| 797 | + } | ||
| 798 | + } | ||
| 799 | + parks[index] = parks.splice(0, 1 , parks[index])[0]; | ||
| 800 | + } | ||
| 801 | + //渲染 | ||
| 802 | + var htmlStr = template('pb_park_list_dropdown-temp', {list: parks}); | ||
| 803 | + $('.buffer_area_form .parks_list', modal).html(htmlStr); | ||
| 804 | + | ||
| 805 | + //停车场点击 | ||
| 806 | + $('.buffer_area_form .parks_list>li', modal).on('click', function () { | ||
| 807 | + var code = $(this).data('code'); | ||
| 808 | + | ||
| 809 | + if(!parkPolygons[code]){ | ||
| 810 | + var park; | ||
| 811 | + $.each(parks, function () { | ||
| 812 | + if(this.parkCode==code){park = this;return false;} | ||
| 813 | + }); | ||
| 814 | + | ||
| 815 | + transMultiWGSToBd(park); | ||
| 816 | + var polygon = new BMap.Polygon(park.bdPoints, {strokeColor: 'red', strokeWeight: 1}); | ||
| 817 | + map.addOverlay(polygon); | ||
| 818 | + parkPolygons[code] = polygon; | ||
| 819 | + //中心点 | ||
| 820 | + var ts = park.gCenterPoint.split(' ') | ||
| 821 | + ,coord = TransGPS.wgsToBD(parseFloat(ts[1]), parseFloat(ts[0])); | ||
| 822 | + polygon._centerPoint = new BMap.Point(coord.lng, coord.lat); | ||
| 823 | + //绘制名称label | ||
| 824 | + var style = {backgroundColor: "rgba(255, 255, 255, 0.69)",color : "red", borderColor: "red", fontSize : "12px", height : "16px", lineHeight : "16px", fontFamily:"微软雅黑"} | ||
| 825 | + var width = park.parkName.length * 12; | ||
| 826 | + var label = new BMap.Label(park.parkName, { | ||
| 827 | + position:polygon._centerPoint, | ||
| 828 | + offset: new BMap.Size(-(width / 2), -27) | ||
| 829 | + }); | ||
| 830 | + label.setStyle(style); | ||
| 831 | + map.addOverlay(label); | ||
| 832 | + } | ||
| 833 | + | ||
| 834 | + //定位到polygon | ||
| 835 | + var polygon=parkPolygons[code]; | ||
| 836 | + map.panTo(polygon._centerPoint); | ||
| 837 | + }); | ||
| 838 | + }; | ||
| 839 | + | ||
| 840 | + | ||
| 841 | + /** | ||
| 842 | + * 更新车辆位置 | ||
| 843 | + */ | ||
| 844 | + var gpsMarker; | ||
| 845 | + var updateCar = function (gps) { | ||
| 846 | + if(!gpsMarker){ | ||
| 847 | + gpsMarker = new BMap.Marker(new BMap.Point(gps.bd_lon, gps.bd_lat)); | ||
| 848 | + var width = gb_map_imap.calcGpsMarkerWidth(gps.nbbm); | ||
| 849 | + gpsMarker.setIcon(new BMap.Icon(gb_map_imap.createCarIconRotation(gps, width), new BMap.Size(width, 75))); | ||
| 850 | + gpsMarker.disableMassClear();//禁止marker被清除 | ||
| 851 | + gpsMarker.setTop(true); | ||
| 852 | + map.addOverlay(gpsMarker); | ||
| 853 | + //居中 | ||
| 854 | + map.panTo(gpsMarker.getPosition()); | ||
| 855 | + } | ||
| 856 | + else{ | ||
| 857 | + gpsMarker.setPosition(new BMap.Point(gps.bd_lon, gps.bd_lat)); | ||
| 858 | + var width = gb_map_imap.calcGpsMarkerWidth(gps.nbbm); | ||
| 859 | + gpsMarker.setIcon(new BMap.Icon(gb_map_imap.createCarIconRotation(gps, width), new BMap.Size(width, 75))); | ||
| 860 | + } | ||
| 861 | + | ||
| 862 | + //更新路段底图 | ||
| 863 | + if(gps.upDown!=0 && gps.upDown!=1) | ||
| 864 | + gps.upDown = 0; | ||
| 865 | + if(gps.upDown!=roadUpdown){ | ||
| 866 | + switchPolyline(gps.upDown); | ||
| 867 | + //清除轨迹线 | ||
| 868 | + trailArray = []; | ||
| 869 | + } | ||
| 870 | + }; | ||
| 871 | + | ||
| 872 | + /** | ||
| 873 | + * 绘制轨迹线 | ||
| 874 | + */ | ||
| 875 | + var trailArray=[], trailPolyline; | ||
| 876 | + var updateTrailLine = function () { | ||
| 877 | + trailArray.push(gpsMarker.getPosition()); | ||
| 878 | + if(!trailPolyline){ | ||
| 879 | + trailPolyline = new BMap.Polyline(trailArray, {strokeWeight: 3, strokeColor: '#000000'}); | ||
| 880 | + trailPolyline.disableMassClear();//禁止trailPolyline被清除 | ||
| 881 | + map.addOverlay(trailPolyline); | ||
| 882 | + } | ||
| 883 | + else{ | ||
| 884 | + trailPolyline.setPath(trailArray); | ||
| 885 | + } | ||
| 886 | + }; | ||
| 887 | + | ||
| 888 | + /** | ||
| 889 | + * 绘制路段底图(包括站点) | ||
| 890 | + */ | ||
| 891 | + var roadUpdown=-100; | ||
| 892 | + var switchPolyline = function (upDown) { | ||
| 893 | + if(typeof(upDown) == "undefined") | ||
| 894 | + upDown = roadUpdown; | ||
| 895 | + | ||
| 896 | + if(upDown!= 0 && upDown != 1) | ||
| 897 | + upDown = 0; | ||
| 898 | + map.clearOverlays(); | ||
| 899 | + parkPolygons = {};//清除停车场对照 | ||
| 900 | + //路段 | ||
| 901 | + drawRoadPolyline(upDown); | ||
| 902 | + //站点 | ||
| 903 | + if(playObj.getConf().drawPoint) | ||
| 904 | + drawStationPoint(upDown); | ||
| 905 | + //缓冲区 | ||
| 906 | + if(playObj.getConf().drawBuffArea) | ||
| 907 | + drawStationBfArea(upDown); | ||
| 908 | + //站点名称 | ||
| 909 | + if(playObj.getConf().stationName) | ||
| 910 | + drawStationName(upDown); | ||
| 911 | + roadUpdown = upDown; | ||
| 912 | + }; | ||
| 913 | + | ||
| 914 | + /** | ||
| 915 | + * 根据走向绘制路段 | ||
| 916 | + */ | ||
| 917 | + var drawRoadPolyline = function (upDown) { | ||
| 918 | + var colour = gb_map_config.getConfig().section.color; | ||
| 919 | + var plConfig = {strokeWeight: 12, strokeColor: upDown?colour.down:colour.up, strokeOpacity: .4}, pos; | ||
| 920 | + $.each(routes[upDown], function (i, item) { | ||
| 921 | + pos = []; | ||
| 922 | + $.each(item.split(','), function () { | ||
| 923 | + temps = this.split(' '); | ||
| 924 | + pos.push(new BMap.Point(temps[0], temps[1])); | ||
| 925 | + }); | ||
| 926 | + map.addOverlay(new BMap.Polyline(pos, plConfig)); | ||
| 927 | + }); | ||
| 928 | + }; | ||
| 929 | + | ||
| 930 | + /** | ||
| 931 | + * 根据走向绘制站点点位 | ||
| 932 | + */ | ||
| 933 | + var drawStationPoint = function (upDown) { | ||
| 934 | + var array = stations[upDown], psm; | ||
| 935 | + $.each(array, function () { | ||
| 936 | + //坐标转换 | ||
| 937 | + var coord = TransGPS.wgsToBD(this.lat, this.lon); | ||
| 938 | + this.bd_lat = coord.lat; | ||
| 939 | + this.bd_lon = coord.lng; | ||
| 940 | + psm = new BMap.Marker(new BMap.Point(this.bd_lon, this.bd_lat)); | ||
| 941 | + psm.setTitle(this.stationName); | ||
| 942 | + map.addOverlay(psm); | ||
| 943 | + psm.setIcon(new BMap.Icon(gb_map_imap.createStationPointIcon(), new BMap.Size(12, 12))); | ||
| 944 | + }); | ||
| 945 | + }; | ||
| 946 | + | ||
| 947 | + /** | ||
| 948 | + * 为站点绘制缓冲区 | ||
| 949 | + */ | ||
| 950 | + var drawStationBfArea = function (upDown) { | ||
| 951 | + var array = stations[upDown]; | ||
| 952 | + $.each(array, function () { | ||
| 953 | + if(this.shapesType=='r') | ||
| 954 | + drawCircle(new BMap.Point(this.bd_lon, this.bd_lat), this.radius); | ||
| 955 | + else if(this.shapesType=='d') | ||
| 956 | + drawPolygon(this); | ||
| 957 | + }); | ||
| 958 | + }; | ||
| 959 | + | ||
| 960 | + /** | ||
| 961 | + * 绘制站点名称 | ||
| 962 | + */ | ||
| 963 | + var drawStationName = function (upDown) { | ||
| 964 | + var style = {backgroundColor: "rgba(255, 255, 255, 0.69)",color : "black", borderColor: "black", fontSize : "12px", height : "16px", lineHeight : "16px", fontFamily:"微软雅黑"} | ||
| 965 | + var array = stations[upDown]; | ||
| 966 | + $.each(array, function () { | ||
| 967 | + var width = this.stationName.length * 12; | ||
| 968 | + var label = new BMap.Label(this.stationName, { | ||
| 969 | + position:new BMap.Point(this.bd_lon, this.bd_lat), | ||
| 970 | + offset: new BMap.Size(-(width / 2), -27) | ||
| 971 | + }); | ||
| 972 | + label.setStyle(style); | ||
| 973 | + map.addOverlay(label); | ||
| 974 | + }); | ||
| 975 | + }; | ||
| 976 | + var drawCircle = function (point, radius) { | ||
| 977 | + var circle = new BMap.Circle(point, radius); | ||
| 978 | + circle.setStrokeColor('#000000'); | ||
| 979 | + circle.setStrokeWeight(1); | ||
| 980 | + map.addOverlay(circle); | ||
| 981 | + }; | ||
| 982 | + | ||
| 983 | + var drawPolygon = function (station) { | ||
| 984 | + transMultiWGSToBd(station); | ||
| 985 | + var polygon = new BMap.Polygon(station.bdPoints, {strokeColor: '#000000', strokeWeight: 1}); | ||
| 986 | + map.addOverlay(polygon); | ||
| 987 | + }; | ||
| 988 | + | ||
| 989 | + /** | ||
| 990 | + * 重置 | ||
| 991 | + */ | ||
| 992 | + var reset = function () { | ||
| 993 | + if(trailPolyline) | ||
| 994 | + trailPolyline.enableMassClear(); | ||
| 995 | + if(gpsMarker) | ||
| 996 | + gpsMarker.enableMassClear(); | ||
| 997 | + map.clearOverlays(); | ||
| 998 | + roadUpdown = -100; | ||
| 999 | + trailArray=[]; | ||
| 1000 | + trailPolyline = null; | ||
| 1001 | + gpsMarker = null; | ||
| 1002 | + parkPolygons = {}; | ||
| 1003 | + }; | ||
| 1004 | + | ||
| 1005 | + /** | ||
| 1006 | + * 居中车辆,超出边界时 | ||
| 1007 | + */ | ||
| 1008 | + var toCenterByBounds = function () { | ||
| 1009 | + var markerIsVisible = BMapLib.GeoUtils.isPointInRect(gpsMarker.getPosition(),map.getBounds()); | ||
| 1010 | + if(!markerIsVisible) | ||
| 1011 | + map.panTo(gpsMarker.getPosition()); | ||
| 1012 | + }; | ||
| 1013 | + | ||
| 1014 | + /** | ||
| 1015 | + * 切换线路底图 | ||
| 1016 | + */ | ||
| 1017 | + var changeLine = function (lineCode, updown) { | ||
| 1018 | + //reset(); | ||
| 1019 | + //从地图模块获取站点数据 | ||
| 1020 | + stations = gb_map_spatial_data.getStationArray(lineCode); | ||
| 1021 | + //从localStorage 获取路段 | ||
| 1022 | + routes = JSON.parse(storage.getItem(lineCode + '_route')); | ||
| 1023 | + routes = [routes.up_bd, routes.down_bd]; | ||
| 1024 | + switchPolyline(updown); | ||
| 1025 | + }; | ||
| 1026 | + return { | ||
| 1027 | + initData: initData, | ||
| 1028 | + updateCar: updateCar, | ||
| 1029 | + initMap: initMap, | ||
| 1030 | + updateTrailLine: updateTrailLine, | ||
| 1031 | + refreshOverlay: switchPolyline, | ||
| 1032 | + toCenterByBounds: toCenterByBounds, | ||
| 1033 | + reset: reset, | ||
| 1034 | + changeLine: changeLine | ||
| 1035 | + } | ||
| 1036 | + })(); | ||
| 1037 | + | ||
| 1038 | + /** | ||
| 1039 | + * 播放相关 | ||
| 1040 | + * @type {{}} | ||
| 1041 | + */ | ||
| 1042 | + var playObj = (function () { | ||
| 1043 | + var conf = { | ||
| 1044 | + playSpeed: 1,//播放速度 | ||
| 1045 | + drawPoint: 1,//绘制站点 | ||
| 1046 | + drawBuffArea: 1 ,//缓冲区 | ||
| 1047 | + stationName: 0, //站点名称 | ||
| 1048 | + carPark: [] //停车场 | ||
| 1049 | + }; | ||
| 1050 | + | ||
| 1051 | + var gpsArray;//gps点位集合 | ||
| 1052 | + var init = function (rs) { | ||
| 1053 | + gpsArray = rs.list; | ||
| 1054 | + if(!gpsArray || gpsArray.length==0) | ||
| 1055 | + return; | ||
| 1056 | + | ||
| 1057 | + len = gpsArray.length; | ||
| 1058 | + //渲染配置信息 | ||
| 1059 | + renderConfig(); | ||
| 1060 | + //播放第一个点 | ||
| 1061 | + run(); | ||
| 1062 | + }; | ||
| 1063 | + | ||
| 1064 | + var renderConfig = function () { | ||
| 1065 | + $('.speed_form [name=playSpeed][value='+conf.playSpeed+']', modal)[0].checked = true; | ||
| 1066 | + $('.buffer_area_form input[type=checkbox]', modal).each(function () { | ||
| 1067 | + var name = $(this).attr('name'); | ||
| 1068 | + $(this)[0].checked = conf[name]; | ||
| 1069 | + }); | ||
| 1070 | + }; | ||
| 1071 | + | ||
| 1072 | + /** | ||
| 1073 | + * 播放函数 | ||
| 1074 | + */ | ||
| 1075 | + var runTimer; //播放定时器 | ||
| 1076 | + var toCenterTimer;//居中定时器 | ||
| 1077 | + var index = 0; //gps下标 | ||
| 1078 | + var play = function () { | ||
| 1079 | + if(!run()) | ||
| 1080 | + runTimer = setTimeout(play, 1000 / conf.playSpeed); | ||
| 1081 | + }; | ||
| 1082 | + | ||
| 1083 | + /** | ||
| 1084 | + * 定时居中 | ||
| 1085 | + */ | ||
| 1086 | + var fixedToCenter = function () { | ||
| 1087 | + toCenterTimer = setInterval(function () { | ||
| 1088 | + mapObj.toCenterByBounds(); | ||
| 1089 | + }, 500); | ||
| 1090 | + }; | ||
| 1091 | + | ||
| 1092 | + var pause = function () { | ||
| 1093 | + clearInterval(runTimer); | ||
| 1094 | + runTimer = null; | ||
| 1095 | + clearInterval(toCenterTimer); | ||
| 1096 | + toCenterTimer = null; | ||
| 1097 | + }; | ||
| 1098 | + | ||
| 1099 | + var clock = $('.ct_btn.clock', modal), gps, len; | ||
| 1100 | + var run = function () { | ||
| 1101 | + if(index == len){ | ||
| 1102 | + $('.map-wrap-tools .play_btn', modal).removeClass('play'); | ||
| 1103 | + pause(); | ||
| 1104 | + notify_succ('本次轨迹回放已结束!'); | ||
| 1105 | + searchForm.hideShade(); | ||
| 1106 | + return true; | ||
| 1107 | + } | ||
| 1108 | + gps = gpsArray[index]; | ||
| 1109 | + //更新GPS点位 | ||
| 1110 | + mapObj.updateCar(gps); | ||
| 1111 | + //绘制轨迹线 | ||
| 1112 | + mapObj.updateTrailLine(); | ||
| 1113 | + //时间文本 | ||
| 1114 | + clock.text(gps.timeStr); | ||
| 1115 | + //输出行车轨迹 | ||
| 1116 | + trailTableObj.add(gps, index); | ||
| 1117 | + //输出到离站信息 | ||
| 1118 | + inOutStationTableObj.add(gps, index); | ||
| 1119 | + //进度条 | ||
| 1120 | + mapTools.upProgressBar(index); | ||
| 1121 | + index ++; | ||
| 1122 | + }; | ||
| 1123 | + | ||
| 1124 | + /** | ||
| 1125 | + * 重置 | ||
| 1126 | + */ | ||
| 1127 | + var reset = function () { | ||
| 1128 | + index = 0; | ||
| 1129 | + gpsArray = null; | ||
| 1130 | + pause(); | ||
| 1131 | + }; | ||
| 1132 | + return { | ||
| 1133 | + init: init, | ||
| 1134 | + getConf: function () { | ||
| 1135 | + return conf; | ||
| 1136 | + }, | ||
| 1137 | + setConf: function (k, v) { | ||
| 1138 | + conf[k] = v; | ||
| 1139 | + }, | ||
| 1140 | + play: play, | ||
| 1141 | + fixedToCenter: fixedToCenter, | ||
| 1142 | + pause: pause, | ||
| 1143 | + reset: reset | ||
| 1144 | + } | ||
| 1145 | + })(); | ||
| 1146 | + | ||
| 1147 | + function transMultiWGSToBd(obj) { | ||
| 1148 | + if(!obj._gPoints) | ||
| 1149 | + return; | ||
| 1150 | + var bdPoints = [],coord; | ||
| 1151 | + $.each(obj._gPoints, function () { | ||
| 1152 | + coord = TransGPS.wgsToBD(this.lat, this.lng); | ||
| 1153 | + bdPoints.push(new BMap.Point(coord.lng, coord.lat)); | ||
| 1154 | + }); | ||
| 1155 | + | ||
| 1156 | + obj.bdPoints=bdPoints; | ||
| 1157 | + } | ||
| 1158 | + })(); | ||
| 1159 | + </script> | ||
| 1160 | +</div> | ||
| 0 | \ No newline at end of file | 1161 | \ No newline at end of file |
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback_v3/icon/pause.png
0 → 100644
915 Bytes
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback_v3/icon/pause_2.png
0 → 100644
735 Bytes
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback_v3/icon/play.png
0 → 100644
1004 Bytes
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback_v3/icon/play_2.png
0 → 100644
775 Bytes
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback_v3/icon/play_grey.png
0 → 100644
982 Bytes
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback_v3/layout.html
0 → 100644
| 1 | +<div class="gps-play-back-panel-v3"> | ||
| 2 | + <div class="left-panel"></div> | ||
| 3 | + <div class="right-panel"></div> | ||
| 4 | + | ||
| 5 | + <script id="pbv3_park_list_dropdown-temp" type="text/html"> | ||
| 6 | + <div class="search-form-wrap"> | ||
| 7 | + <form class="uk-form uk-form-horizontal"> | ||
| 8 | + <fieldset> | ||
| 9 | + <legend>筛选</legend> | ||
| 10 | + <div class="uk-form-row"> | ||
| 11 | + <label class="uk-form-label">线路</label> | ||
| 12 | + <div class="uk-form-controls"> | ||
| 13 | + <select name="lineName" style="width: 85%;"> | ||
| 14 | + <option value="">--请选择--</option> | ||
| 15 | + {{each lineNameArray as name n}} | ||
| 16 | + <option value="{{name}}">{{name}}</option> | ||
| 17 | + {{/each}} | ||
| 18 | + </select> | ||
| 19 | + </div> | ||
| 20 | + </div> | ||
| 21 | + <div class="uk-form-row"> | ||
| 22 | + <label class="uk-form-label">设备号</label> | ||
| 23 | + <div class="uk-form-controls"> | ||
| 24 | + <input name="deviceId"> | ||
| 25 | + </div> | ||
| 26 | + </div> | ||
| 27 | + </fieldset> | ||
| 28 | + </form> | ||
| 29 | + </div> | ||
| 30 | + <table class="uk-table uk-table-condensed uk-table-hover no-db-select" | ||
| 31 | + style="margin-top: 140px;font-size: 13px;font-family: 微软雅黑;"> | ||
| 32 | + {{each list as obj i}} | ||
| 33 | + <tr> | ||
| 34 | + <td>{{obj.nbbm}}</td> | ||
| 35 | + <td>{{obj.deviceId}}</td> | ||
| 36 | + <td>{{obj.lineName}}</td> | ||
| 37 | + </tr> | ||
| 38 | + {{/each}} | ||
| 39 | + </table> | ||
| 40 | + </script> | ||
| 41 | + <script id="pbv3_trail_tbody-temp" type="text/html"> | ||
| 42 | + {{each array as obj i}} | ||
| 43 | + <dl data-code="{{obj.section_code}}"> | ||
| 44 | + <dd>{{obj.timeStr}}</dd> | ||
| 45 | + <dd>{{obj.speed}}</dd> | ||
| 46 | + <dd> | ||
| 47 | + {{if obj.upDown==0}} | ||
| 48 | + 上行 | ||
| 49 | + {{else if obj.upDown==1}} | ||
| 50 | + 下行 | ||
| 51 | + {{else}} | ||
| 52 | + 未知 | ||
| 53 | + {{/if}} | ||
| 54 | + </dd> | ||
| 55 | + <dd>{{obj.section_name}}</dd> | ||
| 56 | + <dd>{{obj.lineName}}</dd> | ||
| 57 | + </dl> | ||
| 58 | + {{/each}} | ||
| 59 | + {{if array.length==0}} | ||
| 60 | + <dl class="pbv3-empty"> | ||
| 61 | + <dd style="text-indent: 135px;">没有搜索到行车轨迹</dd> | ||
| 62 | + </dl> | ||
| 63 | + {{/if}} | ||
| 64 | + </script> | ||
| 65 | + | ||
| 66 | + <script id="pbv3_inout_station_tbody-temp" type="text/html"> | ||
| 67 | + {{each list as item i}} | ||
| 68 | + <dl data-id="{{item.id}}"> | ||
| 69 | + <dd>{{item.stopName}}</dd> | ||
| 70 | + <dd>{{item.in_time_str}}</dd> | ||
| 71 | + <dd>{{item.out_time_str}}</dd> | ||
| 72 | + <dd></dd> | ||
| 73 | + <dd></dd> | ||
| 74 | + </dl> | ||
| 75 | + {{/each}} | ||
| 76 | + | ||
| 77 | + {{if list.length==0}} | ||
| 78 | + <dl class="pbv3-empty"> | ||
| 79 | + <dd style="text-align: center;">没有找到到离站信息</dd> | ||
| 80 | + </dl> | ||
| 81 | + {{/if}} | ||
| 82 | + </script> | ||
| 83 | + | ||
| 84 | + <script id="pbv3_inout_info_one_temp" type="text/html"> | ||
| 85 | + <dl data-id="{{id}}"> | ||
| 86 | + <dd>{{stopName}}</dd> | ||
| 87 | + <dd>{{in_time_str}}</dd> | ||
| 88 | + <dd></dd> | ||
| 89 | + <dd></dd> | ||
| 90 | + <dd></dd> | ||
| 91 | + </dl> | ||
| 92 | + </script> | ||
| 93 | + | ||
| 94 | + <script id="pbv3_abnormal_table_temp" type="text/html"> | ||
| 95 | + {{each array as item i}} | ||
| 96 | + <dl> | ||
| 97 | + <dd> | ||
| 98 | + {{if item.abnormalType == 'speed'}} | ||
| 99 | + {{if item.speed>=100}} | ||
| 100 | + 速度异常 | ||
| 101 | + {{else}} | ||
| 102 | + 超速({{item.speed}}) | ||
| 103 | + {{/if}} | ||
| 104 | + {{else if item.abnormalType == 'outbound'}} | ||
| 105 | + 越界 | ||
| 106 | + {{/if}} | ||
| 107 | + </dd> | ||
| 108 | + <dd>{{item.st_str}}</dd> | ||
| 109 | + <dd>{{item.et_str}}</dd> | ||
| 110 | + <dd></dd> | ||
| 111 | + </dl> | ||
| 112 | + {{/each}} | ||
| 113 | + | ||
| 114 | + {{if array.length==0}} | ||
| 115 | + <dl class="pbv3-empty"> | ||
| 116 | + <dd style="text-indent: 120px;">没有找到相关异常信息</dd> | ||
| 117 | + </dl> | ||
| 118 | + {{/if}} | ||
| 119 | + </script> | ||
| 120 | + <script id="pbv3_park_dropdown-temp" type="text/html"> | ||
| 121 | + <div style="text-align: center;border-bottom: 1px solid #e2e2e2;padding-bottom: 9px;margin-bottom: 9px;"> | ||
| 122 | + <form class="uk-form" data-uk-margin> | ||
| 123 | + <div class="uk-form-icon"> | ||
| 124 | + <i class="uk-icon-search"></i> | ||
| 125 | + <input type="text" placeholder="搜索" class="park_list_search_input"> | ||
| 126 | + </div> | ||
| 127 | + </form> | ||
| 128 | + </div> | ||
| 129 | + {{each list as p i}} | ||
| 130 | + <li data-code="{{p.parkCode}}" ><a>{{p.parkName}}</a></li> | ||
| 131 | + {{/each}} | ||
| 132 | + </script> | ||
| 133 | + | ||
| 134 | + <script id="pbv3_park_form_devices-temp" type="text/html"> | ||
| 135 | + <div class="uk-animation-slide-top dynamic_devices" > | ||
| 136 | + <span>{{deviceStr}}</span> | ||
| 137 | + </div> | ||
| 138 | + </script> | ||
| 139 | + | ||
| 140 | + <script id="pbv3_park_devices_dropdown-temp" type="text/html"> | ||
| 141 | + {{if dcs.length==1 && dcs[0].type==1}} | ||
| 142 | + <div class="dynamic_devices_dropdown style1"> | ||
| 143 | + <div style="text-align: center;">从车辆基础信息关联设备号</div> | ||
| 144 | + </div> | ||
| 145 | + {{else}} | ||
| 146 | + <div class="dynamic_devices_dropdown"> | ||
| 147 | + <ul class="uk-list"> | ||
| 148 | + <li> | ||
| 149 | + <div>设备号</div> | ||
| 150 | + <div>启用时间</div> | ||
| 151 | + <div>停用时间</div> | ||
| 152 | + </li> | ||
| 153 | + {{each dcs as dc i}} | ||
| 154 | + <li> | ||
| 155 | + <div>{{dc.device}}</div> | ||
| 156 | + <div>{{dc.stStr}}</div> | ||
| 157 | + <div>{{dc.etStr}}</div> | ||
| 158 | + </li> | ||
| 159 | + {{/each}} | ||
| 160 | + </ul> | ||
| 161 | + </div> | ||
| 162 | + {{/if}} | ||
| 163 | + </script> | ||
| 164 | + <script> | ||
| 165 | + (function () { | ||
| 166 | + var wrap = '.gps-play-back-panel-v3'; | ||
| 167 | + var leftWrap = '.gps-play-back-panel-v3>div.left-panel'; | ||
| 168 | + var rightWrap = '.gps-play-back-panel-v3>div.right-panel'; | ||
| 169 | + var dir = '/real_control_v3/mapmonitor/fragments/playback_v3/'; | ||
| 170 | + var params; | ||
| 171 | + | ||
| 172 | + $(wrap).one('init', function (e, data) { | ||
| 173 | + e.stopPropagation(); | ||
| 174 | + params = data; | ||
| 175 | + if(!params) | ||
| 176 | + params = {}; | ||
| 177 | + | ||
| 178 | + //左侧dom | ||
| 179 | + $(leftWrap).load(dir + 'left.html', function () { | ||
| 180 | + $(leftWrap).trigger('init-left-dom', params); | ||
| 181 | + }); | ||
| 182 | + //右侧dom | ||
| 183 | + $(rightWrap).load(dir + 'right.html'); | ||
| 184 | + }); | ||
| 185 | + })(); | ||
| 186 | + </script> | ||
| 187 | +</div> | ||
| 0 | \ No newline at end of file | 188 | \ No newline at end of file |
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback_v3/left.html
0 → 100644
| 1 | +<div class="play-back-form bg-grey"> | ||
| 2 | + <form class="uk-form uk-form-horizontal"> | ||
| 3 | + <div class="uk-form-row"> | ||
| 4 | + <label class="uk-form-label">车辆编码</label> | ||
| 5 | + <div class="uk-form-controls"> | ||
| 6 | + <div class="uk-autocomplete uk-form autocomplete-nbbm" style="width: calc(100% - 60px)"> | ||
| 7 | + <div class="uk-autocomplete uk-form autocomplete-nbbm"> | ||
| 8 | + <input name="nbbm" required/> | ||
| 9 | + </div> | ||
| 10 | + </div> | ||
| 11 | + <a style="color: #009688;margin-left: 5px;" data-uk-offcanvas="{target:'#carSelectOffcanvas'}">选择</a> | ||
| 12 | + </div> | ||
| 13 | + </div> | ||
| 14 | + | ||
| 15 | + <div class="uk-form-row"> | ||
| 16 | + <label class="uk-form-label">开始时间</label> | ||
| 17 | + <div class="uk-form-controls"> | ||
| 18 | + <input class="flatpickr_input" name="startTime" required/> | ||
| 19 | + </div> | ||
| 20 | + </div> | ||
| 21 | + | ||
| 22 | + <div class="uk-form-row"> | ||
| 23 | + <label class="uk-form-label">结束时间</label> | ||
| 24 | + <div class="uk-form-controls"> | ||
| 25 | + <input class="flatpickr_input" name="endTime" required/> | ||
| 26 | + </div> | ||
| 27 | + </div> | ||
| 28 | + <div style="text-align: center;margin-top: 20px;"> | ||
| 29 | + <button class="uk-button uk-button-large uk-button-link p_back_form_submit" type="submit"><i | ||
| 30 | + class="uk-icon-search"> </i> 搜索轨迹 | ||
| 31 | + </button> | ||
| 32 | + </div> | ||
| 33 | + </form> | ||
| 34 | + <div class="form-error-text"> | ||
| 35 | + <a href="" class="uk-close uk-close-alt"></a><span></span> | ||
| 36 | + </div> | ||
| 37 | +</div> | ||
| 38 | + | ||
| 39 | +<!-- 异常table --> | ||
| 40 | +<div class="play-back-abnormal_table_wrap bg-grey"> | ||
| 41 | + <div class="pback_abnormal_table_panel" | ||
| 42 | + style="height: 100%;overflow: auto;"> | ||
| 43 | + <div class="ct_table abnormal_table" style="height: calc(100% - 30px);width: 500px;background: #e6e6e6;"> | ||
| 44 | + <div class="ct_table_head" style="background: #e6e6e6;"> | ||
| 45 | + <dl> | ||
| 46 | + <dt>异常信息</dt> | ||
| 47 | + <dt>开始时间</dt> | ||
| 48 | + <dt>结束时间</dt> | ||
| 49 | + <dt>所在路段</dt> | ||
| 50 | + </dl> | ||
| 51 | + </div> | ||
| 52 | + <div class="ct_table_body"> | ||
| 53 | + </div> | ||
| 54 | + </div> | ||
| 55 | + </div> | ||
| 56 | +</div> | ||
| 57 | + | ||
| 58 | +<!-- 行车轨迹和到离站 --> | ||
| 59 | +<div class="play-back-trail-info-wrap bg-grey"> | ||
| 60 | + <div class="uk-width-medium-1-1"> | ||
| 61 | + | ||
| 62 | + <ul class="uk-subnav uk-subnav-pill" data-uk-switcher="{connect:'#playBackV3TrailCont', swiping: false}" style="padding-left: 12px;"> | ||
| 63 | + <li class="uk-active"><a>行车轨迹</a></li> | ||
| 64 | + <li><a>到离站信息</a></li> | ||
| 65 | + </ul> | ||
| 66 | + <span class="sum_mileage_span"></span> | ||
| 67 | + | ||
| 68 | + <ul class="uk-switcher uk-margin real_gps_info_tab_content" id="playBackV3TrailCont"> | ||
| 69 | + <li class="uk-active" style="height: 100%;"> | ||
| 70 | + <div class="trail-info-wrap" > | ||
| 71 | + <div class="ct_table trail-info-table" style="height: calc(100% - 30px);"> | ||
| 72 | + <div class="ct_table_head" style="background: #e6e6e6;"> | ||
| 73 | + <dl> | ||
| 74 | + <dt>时间</dt> | ||
| 75 | + <dt>速度</dt> | ||
| 76 | + <dt>上下行</dt> | ||
| 77 | + <dt>所在路段</dt> | ||
| 78 | + <dt>车载线路</dt> | ||
| 79 | + </dl> | ||
| 80 | + </div> | ||
| 81 | + <div class="ct_table_body"></div> | ||
| 82 | + </div> | ||
| 83 | + </div> | ||
| 84 | + </li> | ||
| 85 | + <!-- 到离站数据 --> | ||
| 86 | + <li style="height: 100%;"> | ||
| 87 | + <div class="inout_table_wrap" style="height: 100%;overflow: auto;"> | ||
| 88 | + <div class="ct_table" style="height: calc(100% - 30px);"> | ||
| 89 | + <div class="ct_table_head" style="background: #e6e6e6;"> | ||
| 90 | + <dl> | ||
| 91 | + <dt>站点</dt> | ||
| 92 | + <dt>进站时间</dt> | ||
| 93 | + <dt>离站时间</dt> | ||
| 94 | + <dt>上客</dt> | ||
| 95 | + <dt>下客</dt> | ||
| 96 | + </dl> | ||
| 97 | + </div> | ||
| 98 | + <div class="ct_table_body"> | ||
| 99 | + </div> | ||
| 100 | + </div> | ||
| 101 | + </div> | ||
| 102 | + </li> | ||
| 103 | + </ul> | ||
| 104 | + </div> | ||
| 105 | +</div> | ||
| 106 | + | ||
| 107 | +<!-- 车辆选择抽屉 --> | ||
| 108 | +<div id="carSelectOffcanvas" class="uk-offcanvas"> | ||
| 109 | + <div class="uk-offcanvas-bar"> | ||
| 110 | + <div class="uk-panel offcanvas-cont"> | ||
| 111 | + <div class="spinner"> | ||
| 112 | + <div class="rect1"></div> | ||
| 113 | + <div class="rect2"></div> | ||
| 114 | + <div class="rect3"></div> | ||
| 115 | + <div class="rect4"></div> | ||
| 116 | + <div class="rect5"></div> | ||
| 117 | + </div> | ||
| 118 | + </div> | ||
| 119 | + </div> | ||
| 120 | +</div> | ||
| 121 | + | ||
| 122 | +<script> | ||
| 123 | + var gb_playback_v3_leftpanel = (function () { | ||
| 124 | + | ||
| 125 | + var leftWrap = '.gps-play-back-panel-v3>div.left-panel'; | ||
| 126 | + var f = $('.play-back-form form', leftWrap); | ||
| 127 | + var params; | ||
| 128 | + | ||
| 129 | + $(leftWrap).one('init-left-dom', function (e, data) { | ||
| 130 | + e.stopPropagation(); | ||
| 131 | + params = data; | ||
| 132 | + | ||
| 133 | + //初始化表单 | ||
| 134 | + initForm(); | ||
| 135 | + | ||
| 136 | + //固定表头 | ||
| 137 | + gb_ct_table.fixedHead($('.trail-info-wrap', leftWrap)); | ||
| 138 | + gb_ct_table.fixedHead($('.pback_abnormal_table_panel', leftWrap)); | ||
| 139 | + gb_ct_table.fixedHead($('.inout_table_wrap', leftWrap)); | ||
| 140 | + //滚动条 | ||
| 141 | + createScrollbar(); | ||
| 142 | + | ||
| 143 | + //show title | ||
| 144 | + /*UIkit.notify("设备端自身标识为无效的GPS点位,将不会再进入回放通路", { | ||
| 145 | + status: 'info' | ||
| 146 | + });*/ | ||
| 147 | + }); | ||
| 148 | + | ||
| 149 | + /** | ||
| 150 | + * 初始化表单 | ||
| 151 | + */ | ||
| 152 | + var initForm = function () { | ||
| 153 | + if (params.nbbm) | ||
| 154 | + $('[name=nbbm]', f).val(params.nbbm); | ||
| 155 | + var st = moment().subtract(2, 'hour'); | ||
| 156 | + if (params.st) | ||
| 157 | + st = moment(data.st, 'YYYY-MM-DD HH:mm'); | ||
| 158 | + $('[name=startTime]', f).val(st.format('YYYY-MM-DD HH:mm')); | ||
| 159 | + var et = moment(); | ||
| 160 | + if (params.et) | ||
| 161 | + et = moment(data.et, 'YYYY-MM-DD HH:mm'); | ||
| 162 | + $('[name=endTime]', f).val(et.format('YYYY-MM-DD HH:mm')); | ||
| 163 | + | ||
| 164 | + //初始化 flatpickr | ||
| 165 | + var sConf = $.extend(gb_common.flatpickrDateTimeConfig, { | ||
| 166 | + defaultHour: st.format('HH'), | ||
| 167 | + defaultMinute: st.format('mm') | ||
| 168 | + }); | ||
| 169 | + var eConf = $.extend(gb_common.flatpickrDateTimeConfig, { | ||
| 170 | + defaultHour: et.format('HH'), | ||
| 171 | + defaultMinute: et.format('mm') | ||
| 172 | + }); | ||
| 173 | + flatpickr(leftWrap + ' .flatpickr_input[name=startTime]', sConf); | ||
| 174 | + flatpickr(leftWrap + ' .flatpickr_input[name=endTime]', eConf); | ||
| 175 | + }; | ||
| 176 | + | ||
| 177 | + //搜索轨迹 | ||
| 178 | + var ONE_DAY = 60 * 60 * 24; | ||
| 179 | + var MIN_SPACE = 60; | ||
| 180 | + $('button[type=submit]', f).on('click', function (e) { | ||
| 181 | + e.stopPropagation(); | ||
| 182 | + try { | ||
| 183 | + var data = f.serializeJSON(); | ||
| 184 | + | ||
| 185 | + //校验时间间隔 | ||
| 186 | + var fs = 'YYYY-MM-DD HH:mm'; | ||
| 187 | + var st = parseInt(moment(data.startTime, fs).format('X')); | ||
| 188 | + var et = parseInt(moment(data.endTime, fs).format('X')); | ||
| 189 | + data.st = st; | ||
| 190 | + data.et = et; | ||
| 191 | + | ||
| 192 | + if (!data.nbbm || !data.nbbm.trim()) | ||
| 193 | + notify_err('你必须输入车辆编码'); | ||
| 194 | + else if (!data.startTime || !data.startTime.trim()) | ||
| 195 | + notify_err('你必须输入开始时间'); | ||
| 196 | + else if (!data.endTime || !data.endTime.trim()) | ||
| 197 | + notify_err('你必须输入结束时间'); | ||
| 198 | + else if (et < st) | ||
| 199 | + notify_err('结束时间不能小于开始时间!'); | ||
| 200 | + else if ((et - st) > ONE_DAY) | ||
| 201 | + notify_err('查询范围不能超过24小时!'); | ||
| 202 | + else if ((et - st) < MIN_SPACE) | ||
| 203 | + notify_err('最小间隔1分钟!'); | ||
| 204 | + else { | ||
| 205 | + show_load_btn(this); | ||
| 206 | + //查询数据 | ||
| 207 | + get_server_trail_data(data, function (rs) { | ||
| 208 | + //线路名称 | ||
| 209 | + var code2Name = gb_data_basic.lineCode2NameAll(); | ||
| 210 | + $.each(rs.list, function () { | ||
| 211 | + this.lineName = code2Name[this.lineId]; | ||
| 212 | + this.nbbm = data.nbbm; | ||
| 213 | + }); | ||
| 214 | + //排序 | ||
| 215 | + rs.list.sort(function (a, b) { | ||
| 216 | + return parseInt((a.ts - b.ts) + '' + (a.stop_no - b.stop_no)); | ||
| 217 | + }); | ||
| 218 | + fillTrailTable(rs.list);//填充行车轨迹表格 | ||
| 219 | + fillArivalStationTable(rs.list);//填充到离站表格 | ||
| 220 | + $('.sum_mileage_span', leftWrap).text('共约 ' + rs.sumMileage + ' 公里'); | ||
| 221 | + fillAbnormalTable(rs['outboundList'], rs['speedList']);//填充异常信息表格 | ||
| 222 | + //准备播放 | ||
| 223 | + rs.arrivalData = arrivalData; | ||
| 224 | + $('.gps-play-back-panel-v3>div.right-panel .play-back-tools-wrap').trigger('ready-to-play', rs); | ||
| 225 | + | ||
| 226 | + //更新滚动条 | ||
| 227 | + resetScrollbar(); | ||
| 228 | + | ||
| 229 | + /** | ||
| 230 | + * 显示设备更换信息 | ||
| 231 | + */ | ||
| 232 | + var deviceStr='', fs='YYYY-MM-DD HH:mm'; | ||
| 233 | + for(var i=0,dc;dc=rs.dcs[i++];){ | ||
| 234 | + deviceStr+=dc.device + ','; | ||
| 235 | + dc.stStr = dc.st>0?moment(dc.st).format(fs):''; | ||
| 236 | + dc.etStr = dc.et>0?moment(dc.et).format(fs):''; | ||
| 237 | + } | ||
| 238 | + deviceStr=deviceStr.substr(0, deviceStr.length-1); | ||
| 239 | + | ||
| 240 | + $('.play-back-form>.dynamic_devices', leftWrap).remove(); | ||
| 241 | + $('.play-back-form>.dynamic_devices_dropdown', leftWrap).remove(); | ||
| 242 | + var htmlStr = template('pbv3_park_form_devices-temp', {deviceStr:deviceStr}), | ||
| 243 | + htmlStr2 = template('pbv3_park_devices_dropdown-temp', {dcs:rs.dcs}); | ||
| 244 | + $('.play-back-form', leftWrap).append(htmlStr).append(htmlStr2); | ||
| 245 | + }); | ||
| 246 | + } | ||
| 247 | + } catch (e) { | ||
| 248 | + console.log(e); | ||
| 249 | + } | ||
| 250 | + return false; | ||
| 251 | + }); | ||
| 252 | + | ||
| 253 | + function resetScrollbar() { | ||
| 254 | + $('.pback_abnormal_table_panel', leftWrap).perfectScrollbar('destroy').perfectScrollbar().scrollTop(0); | ||
| 255 | + $('.trail-info-wrap', leftWrap).perfectScrollbar('destroy').perfectScrollbar().scrollTop(0); | ||
| 256 | + $('.inout_table_wrap', leftWrap).perfectScrollbar('destroy').perfectScrollbar().scrollTop(0); | ||
| 257 | + } | ||
| 258 | + | ||
| 259 | + function destoryScrollbar() { | ||
| 260 | + $('.pback_abnormal_table_panel', leftWrap).perfectScrollbar('destroy'); | ||
| 261 | + $('.trail-info-wrap', leftWrap).perfectScrollbar('destroy'); | ||
| 262 | + $('.inout_table_wrap', leftWrap).perfectScrollbar('destroy'); | ||
| 263 | + } | ||
| 264 | + | ||
| 265 | + function createScrollbar() { | ||
| 266 | + $('.pback_abnormal_table_panel', leftWrap).perfectScrollbar(); | ||
| 267 | + $('.trail-info-wrap', leftWrap).perfectScrollbar(); | ||
| 268 | + $('.inout_table_wrap', leftWrap).perfectScrollbar(); | ||
| 269 | + } | ||
| 270 | + | ||
| 271 | + $('.form-error-text .uk-close', leftWrap).on('click', function (e) { | ||
| 272 | + e.stopPropagation(); | ||
| 273 | + $('.form-error-text').removeClass('show').find('span').text(''); | ||
| 274 | + return false; | ||
| 275 | + }); | ||
| 276 | + | ||
| 277 | + function notify_err(t) { | ||
| 278 | + $('.form-error-text', leftWrap).addClass('show').find('span').text(t); | ||
| 279 | + } | ||
| 280 | + | ||
| 281 | + function show_load_btn(btn) { | ||
| 282 | + $(btn).attr('disabled', 'disabled').html('<i class="uk-icon-spinner uk-icon-spin"> </i> '); | ||
| 283 | + } | ||
| 284 | + | ||
| 285 | + function hide_load_btn() { | ||
| 286 | + $('button[type=submit]', f).removeAttr('disabled').html('<i class="uk-icon-search"> </i> 搜索轨迹'); | ||
| 287 | + } | ||
| 288 | + | ||
| 289 | + //车辆 autocomplete | ||
| 290 | + gb_common.carAutocomplete($('.autocomplete-nbbm', leftWrap), gb_data_basic.carsArray()); | ||
| 291 | + $('.autocomplete-nbbm', leftWrap).on('input', function () { | ||
| 292 | + $('.play-back-form>.dynamic_devices', leftWrap).remove(); | ||
| 293 | + }); | ||
| 294 | + | ||
| 295 | + /** | ||
| 296 | + * 车辆选择抽屉显示 | ||
| 297 | + */ | ||
| 298 | + var fw = '#carSelectOffcanvas .search-form-wrap'; | ||
| 299 | + $('#carSelectOffcanvas').on('show.uk.offcanvas', function () { | ||
| 300 | + var that = this; | ||
| 301 | + $.get('/freeLogin/basic/ccInfo/lineArray', {idx: gb_data_basic.line_idx}, function (rs) { | ||
| 302 | + if (!rs || rs.length == 0) | ||
| 303 | + return; | ||
| 304 | + | ||
| 305 | + rs.sort(function (a, b) { | ||
| 306 | + if (a.lineName == b.lineName) | ||
| 307 | + return a.nbbm.localeCompare(b.nbbm); | ||
| 308 | + return a.lineName.localeCompare(b.lineName); | ||
| 309 | + }); | ||
| 310 | + | ||
| 311 | + var lineNames = {}; | ||
| 312 | + $.each(rs, function () { | ||
| 313 | + lineNames[this.lineName] = 1; | ||
| 314 | + }); | ||
| 315 | + | ||
| 316 | + var bodyStr = template('pbv3_park_list_dropdown-temp', { | ||
| 317 | + list: rs, | ||
| 318 | + lineNameArray: gb_common.get_keys(lineNames) | ||
| 319 | + }); | ||
| 320 | + $('.offcanvas-cont', that).html(bodyStr); | ||
| 321 | + | ||
| 322 | + $('select[name=lineName]', fw).on('change', offcanvasTableFilter); | ||
| 323 | + $('input[name=deviceId]', fw).on('input', offcanvasTableFilter); | ||
| 324 | + $('.offcanvas-cont .uk-table tr').dblclick(function () { | ||
| 325 | + var nbbm = $('td:eq(0)', this).text(); | ||
| 326 | + $('[name=nbbm]', f).val(nbbm); | ||
| 327 | + $.UIkit.offcanvas.hide([force = false]); | ||
| 328 | + }); | ||
| 329 | + }); | ||
| 330 | + }); | ||
| 331 | + var carTab = '.offcanvas-cont .uk-table'; | ||
| 332 | + var offcanvasTableFilter = function () { | ||
| 333 | + var lineName = $('select[name=lineName]', fw).val(); | ||
| 334 | + var deviceId = $('input[name=deviceId]', fw).val(); | ||
| 335 | + $('tr', carTab).show().each(function () { | ||
| 336 | + if (lineName && $('td:eq(2)', this).text() != lineName) | ||
| 337 | + $(this).hide(); | ||
| 338 | + | ||
| 339 | + if (deviceId && $('td:eq(1)', this).text().indexOf(deviceId) == -1) | ||
| 340 | + $(this).hide(); | ||
| 341 | + }); | ||
| 342 | + }; | ||
| 343 | + | ||
| 344 | + | ||
| 345 | + /** | ||
| 346 | + * 从服务器获取轨迹数据 | ||
| 347 | + * @param data | ||
| 348 | + */ | ||
| 349 | + function get_server_trail_data(data, cb) { | ||
| 350 | + $.ajax({ | ||
| 351 | + url: '/freeLogin/gps/history_v3/' + data.nbbm, | ||
| 352 | + data: {st: data.st, et: data.et}, | ||
| 353 | + success: function (rs) { | ||
| 354 | + $('.bg-grey', leftWrap).removeClass('bg-grey'); | ||
| 355 | + hide_load_btn(); | ||
| 356 | + if(rs.status=='ERROR'){ | ||
| 357 | + notify_err('异常:' + rs.msg); | ||
| 358 | + } | ||
| 359 | + else if(rs.status=='SUCCESS'){ | ||
| 360 | + if(!rs.list || rs.list.length==0){ | ||
| 361 | + notify_err('没有查询到历史轨迹信息'); | ||
| 362 | + } | ||
| 363 | + cb && cb(rs); | ||
| 364 | + } | ||
| 365 | + }, | ||
| 366 | + error: function () { | ||
| 367 | + hide_load_btn(); | ||
| 368 | + notify_err('服务器出现异常,请联系管理员!'); | ||
| 369 | + } | ||
| 370 | + }); | ||
| 371 | + } | ||
| 372 | + | ||
| 373 | + /** | ||
| 374 | + * 填充行车轨迹表格 | ||
| 375 | + */ | ||
| 376 | + function fillTrailTable(list){ | ||
| 377 | + var array = []; | ||
| 378 | + for (var i = 0, gps; gps = list[i++];) { | ||
| 379 | + //格式化时间 | ||
| 380 | + gps.timeStr = moment(gps.timestamp).format('HH:mm.ss'); | ||
| 381 | + try { | ||
| 382 | + if (i > 0 && array[array.length - 1]['section_code'] == gps['section_code']) | ||
| 383 | + array.pop(); | ||
| 384 | + } | ||
| 385 | + catch (e) { | ||
| 386 | + } | ||
| 387 | + | ||
| 388 | + if (gps['section_code']) | ||
| 389 | + array.push(gps); | ||
| 390 | + } | ||
| 391 | + | ||
| 392 | + var htmlStr = template('pbv3_trail_tbody-temp', {array: array}); | ||
| 393 | + $('.trail-info-table .ct_table_body', leftWrap).html(htmlStr); | ||
| 394 | + } | ||
| 395 | + | ||
| 396 | + /** | ||
| 397 | + * 填充到离站数据表格 | ||
| 398 | + * @param list | ||
| 399 | + */ | ||
| 400 | + var arrivalData; | ||
| 401 | + function fillArivalStationTable(list){ | ||
| 402 | + var data, f, prev; | ||
| 403 | + var $wrap = $('.inout_table_wrap', leftWrap); | ||
| 404 | + var $tbody = $('.ct_table_body', $wrap); | ||
| 405 | + | ||
| 406 | + data = []; | ||
| 407 | + $.each(list, function (i, gps) { | ||
| 408 | + prev = data[data.length - 1]; | ||
| 409 | + if (gps['inout_stop'] == -1) | ||
| 410 | + return true; | ||
| 411 | + if (gps['inout_stop'] == 0 && gps['inout_stop_info']) { | ||
| 412 | + //连续进站信号,取第一个 | ||
| 413 | + if(prev && prev['out_ts'] == null | ||
| 414 | + && prev['stopName'] == gps['inout_stop_info'].stopName){ | ||
| 415 | + return true; | ||
| 416 | + } | ||
| 417 | + data.push(createIn(gps)); | ||
| 418 | + } | ||
| 419 | + else if (gps['inout_stop'] == 1) { | ||
| 420 | + f = matchOut(prev, gps); | ||
| 421 | + if(f) | ||
| 422 | + data.push(f); | ||
| 423 | + } | ||
| 424 | + }); | ||
| 425 | + //格式化时间 | ||
| 426 | + $.each(data, function (i) { | ||
| 427 | + if (this.in_ts) | ||
| 428 | + this.in_time_str = moment(this.in_ts).format('HH:mm.ss'); | ||
| 429 | + if (this.out_ts) | ||
| 430 | + this.out_time_str = moment(this.out_ts).format('HH:mm.ss'); | ||
| 431 | + //id | ||
| 432 | + this.id = 'in_out_' + i; | ||
| 433 | + }); | ||
| 434 | + | ||
| 435 | + var htmlStr = template('pbv3_inout_station_tbody-temp', {list: data}); | ||
| 436 | + $tbody.html(htmlStr); | ||
| 437 | + arrivalData = data; | ||
| 438 | + } | ||
| 439 | + | ||
| 440 | + var createIn = function (gps) { | ||
| 441 | + var info = gps['inout_stop_info']; | ||
| 442 | + return {in_ts: info.ts, stopNo: info.stopNo, stopName: info.stopName} | ||
| 443 | + }; | ||
| 444 | + var matchOut = function (prevInfo, gps) { | ||
| 445 | + var oi = gps['inout_stop_info']; | ||
| 446 | + if(!oi) | ||
| 447 | + return; | ||
| 448 | + if(prevInfo && prevInfo.stopName == oi.stopName){ | ||
| 449 | + prevInfo['out_ts'] = oi.ts; | ||
| 450 | + return null; | ||
| 451 | + } | ||
| 452 | + else { | ||
| 453 | + return {out_ts: oi.ts,stopNo: oi.stopNo,stopName: oi.stopName} | ||
| 454 | + } | ||
| 455 | + }; | ||
| 456 | + | ||
| 457 | + /** | ||
| 458 | + * 填充异常信息表格 | ||
| 459 | + */ | ||
| 460 | + function fillAbnormalTable(){ | ||
| 461 | + var array = []; | ||
| 462 | + for(var i = 0; i < arguments.length; i ++){ | ||
| 463 | + array = array.concat(arguments[i]); | ||
| 464 | + } | ||
| 465 | + //格式化时间 | ||
| 466 | + $.each(array, function () { | ||
| 467 | + if(this.st) | ||
| 468 | + this.st_str = moment(this.st).format('HH:mm.ss'); | ||
| 469 | + if(this.et) | ||
| 470 | + this.et_str = moment(this.et).format('HH:mm.ss'); | ||
| 471 | + }); | ||
| 472 | + | ||
| 473 | + //排序 | ||
| 474 | + array.sort(function (a, b) { | ||
| 475 | + return a.st - b.st; | ||
| 476 | + }); | ||
| 477 | + | ||
| 478 | + var htmlStr = template('pbv3_abnormal_table_temp', {array: array}); | ||
| 479 | + $('.abnormal_table .ct_table_body', leftWrap).html(htmlStr); | ||
| 480 | + } | ||
| 481 | + | ||
| 482 | + $(leftWrap).on('mouseover', '.dynamic_devices', function () { | ||
| 483 | + $('.dynamic_devices_dropdown', leftWrap).show(); | ||
| 484 | + }).on('mouseout', function () { | ||
| 485 | + $('.dynamic_devices_dropdown', leftWrap).hide(); | ||
| 486 | + }); | ||
| 487 | + | ||
| 488 | + return { | ||
| 489 | + fillTrailTable: fillTrailTable, | ||
| 490 | + fillArivalStationTable: fillArivalStationTable, | ||
| 491 | + destoryScrollbar: destoryScrollbar, | ||
| 492 | + createScrollbar: createScrollbar | ||
| 493 | + } | ||
| 494 | + })(); | ||
| 495 | +</script> | ||
| 0 | \ No newline at end of file | 496 | \ No newline at end of file |
src/main/resources/static/real_control_v3/mapmonitor/fragments/playback_v3/right.html
0 → 100644
| 1 | +<div class="play-back-tools-wrap"> | ||
| 2 | + | ||
| 3 | + <div class="top-btn-list disabled"> | ||
| 4 | + <a class="play"></a> | ||
| 5 | + <div class="multi-items"> | ||
| 6 | + <form class="uk-form speed_form"> | ||
| 7 | + <label><input type="radio" name="playSpeed" value="1" disabled> x1</label> | ||
| 8 | + <label><input type="radio" name="playSpeed" value="5" checked disabled> x5</label> | ||
| 9 | + <label><input type="radio" name="playSpeed" value="10" disabled> x10</label> | ||
| 10 | + <label><input type="radio" name="playSpeed" value="20" disabled> x20</label> | ||
| 11 | + </form> | ||
| 12 | + </div> | ||
| 13 | + <div class="multi-items"> | ||
| 14 | + <form class="uk-form buffer_area_form"> | ||
| 15 | + <label> | ||
| 16 | + <input type="checkbox" name="drawPoint" checked disabled> 站点 | ||
| 17 | + </label> | ||
| 18 | + <label> | ||
| 19 | + <input type="checkbox" name="drawBuffArea" checked disabled> 缓冲区 | ||
| 20 | + </label> | ||
| 21 | + <label> | ||
| 22 | + <input type="checkbox" name="stationName" disabled> 站点名称 | ||
| 23 | + </label> | ||
| 24 | + <label> | ||
| 25 | + <div class="uk-button-dropdown" data-uk-dropdown=""> | ||
| 26 | + <a>停车场 <i class="uk-icon-angle-down"></i></a> | ||
| 27 | + <div class="uk-dropdown uk-dropdown-scrollable" style="max-height: 300px;"> | ||
| 28 | + <ul class="uk-nav uk-nav-dropdown parks_list"> | ||
| 29 | + </ul> | ||
| 30 | + </div> | ||
| 31 | + </div> | ||
| 32 | + </label> | ||
| 33 | + <label> | ||
| 34 | + <div class="uk-button-dropdown" data-uk-dropdown=""> | ||
| 35 | + <a title="默认跟随GPS,选择后将固定底图。每次搜索会重置">线路底图 <i class="uk-icon-angle-down"></i></a> | ||
| 36 | + <div class="uk-dropdown uk-dropdown-scrollable" style="max-height: 300px;"> | ||
| 37 | + <ul class="uk-nav uk-nav-dropdown base_line_list"> | ||
| 38 | + </ul> | ||
| 39 | + </div> | ||
| 40 | + </div> | ||
| 41 | + </label> | ||
| 42 | + </form> | ||
| 43 | + </div> | ||
| 44 | + | ||
| 45 | + <div class="uk-button-group export-btn-list"> | ||
| 46 | + <button class="uk-button" disabled> | ||
| 47 | + <a class="export-excel"><i class="uk-icon-file-excel-o"></i> 导出轨迹</a> | ||
| 48 | + </button> | ||
| 49 | + <div data-uk-dropdown="{mode:'click'}"> | ||
| 50 | + <button class="uk-button" disabled><i class="uk-icon-caret-down"></i></button> | ||
| 51 | + <div class="uk-dropdown uk-dropdown-small"> | ||
| 52 | + <ul class="uk-nav uk-nav-dropdown"> | ||
| 53 | + <li><a class="export-excel-abnormal">导出异常数据</a></li> | ||
| 54 | + <!--<li><a class="export-excel-arrival">导出到离站数据</a></li>--> | ||
| 55 | + </ul> | ||
| 56 | + </div> | ||
| 57 | + </div> | ||
| 58 | + </div> | ||
| 59 | + | ||
| 60 | + </div> | ||
| 61 | + <span class="ui-slider-tip"></span> | ||
| 62 | + <span class="ui-slider-tip-fixed"></span> | ||
| 63 | + <div class="ct-progress-bar" > | ||
| 64 | + <div class="scale"></div> | ||
| 65 | + </div> | ||
| 66 | +</div> | ||
| 67 | + | ||
| 68 | +<div class="play-back-map-wrap"></div> | ||
| 69 | +<script> | ||
| 70 | + | ||
| 71 | + (function () { | ||
| 72 | + var rightWrap = '.gps-play-back-panel-v3>div.right-panel'; | ||
| 73 | + var leftWrap = '.gps-play-back-panel-v3>div.left-panel'; | ||
| 74 | + var progress = $('.ct-progress-bar', rightWrap); | ||
| 75 | + var gpsArray; | ||
| 76 | + var arrivalData; | ||
| 77 | + var step; | ||
| 78 | + var timeTip = $('.ui-slider-tip', rightWrap); | ||
| 79 | + var scale = $('.scale', progress); | ||
| 80 | + var play_before_flag; | ||
| 81 | + | ||
| 82 | + $('.play-back-tools-wrap', rightWrap).on('ready-to-play', function (e, data) { | ||
| 83 | + e.stopPropagation(); | ||
| 84 | + //reset | ||
| 85 | + reset(); | ||
| 86 | + | ||
| 87 | + gpsArray = data.list; | ||
| 88 | + arrivalData = data.arrivalData; | ||
| 89 | + inoutLen = arrivalData.length; | ||
| 90 | + | ||
| 91 | + if(!gpsArray || gpsArray.length==0) | ||
| 92 | + return; | ||
| 93 | + step = progress.width() / gpsArray.length; | ||
| 94 | + //激活工具栏 | ||
| 95 | + $('.top-btn-list', rightWrap).removeClass('disabled').find('[disabled]').removeAttr('disabled'); | ||
| 96 | + //xlPolyline.lineId=gpsArray[0].lineId; | ||
| 97 | + //xlPolyline.upDown=gpsArray[0].upDown; | ||
| 98 | + | ||
| 99 | + /** | ||
| 100 | + * 默认显示完整的地图轨迹 | ||
| 101 | + */ | ||
| 102 | + try{ | ||
| 103 | + play_before_goto(gpsArray.length - 1); | ||
| 104 | + }catch (e){ | ||
| 105 | + console.log(e); | ||
| 106 | + } | ||
| 107 | + play_before_flag=true; | ||
| 108 | + }); | ||
| 109 | + | ||
| 110 | + | ||
| 111 | + function reset() { | ||
| 112 | + pause(); | ||
| 113 | + $('.top-btn-list .play', rightWrap).removeClass('pause'); | ||
| 114 | + index=0; | ||
| 115 | + inoutIndex=0; | ||
| 116 | + clearXlPolyline(); | ||
| 117 | + xlPolyline={}; | ||
| 118 | + scale.css('width', 0); | ||
| 119 | + fixedTime.css('left', 0).css('visibility', 'hidden'); | ||
| 120 | + trailArray=[]; | ||
| 121 | + gpsMarker=null; | ||
| 122 | + trailPolyline=null; | ||
| 123 | + map.clearOverlays(); | ||
| 124 | + parkPolygons={}; | ||
| 125 | + autoChange=true; | ||
| 126 | + } | ||
| 127 | + | ||
| 128 | + function replaceSymbol(s){ | ||
| 129 | + return s.replace(new RegExp(/-/g),'').replace(new RegExp(/:/g),'').replace(new RegExp(/ /g),''); | ||
| 130 | + } | ||
| 131 | + | ||
| 132 | + progress.mousemove(function (e) { | ||
| 133 | + if(!gpsArray || gpsArray.length==0) | ||
| 134 | + return; | ||
| 135 | + var x = e.offsetX; //外面板的margin-left:-3px; | ||
| 136 | + var i = parseInt(x / step); | ||
| 137 | + var time = moment(gpsArray[i].timestamp).format('HH:mm.ss'); | ||
| 138 | + | ||
| 139 | + timeTip.text(time).css('left', x - 28).css('visibility', 'visible'); | ||
| 140 | + }).mouseout(function () { | ||
| 141 | + timeTip.css('visibility', 'hidden') | ||
| 142 | + }).on('click', function (e) { | ||
| 143 | + var x = e.offsetX; | ||
| 144 | + goto(parseInt(x / step)); | ||
| 145 | + }); | ||
| 146 | + | ||
| 147 | + /*** | ||
| 148 | + * 地图 | ||
| 149 | + */ | ||
| 150 | + var mapWrap = $('.play-back-map-wrap', rightWrap); | ||
| 151 | + setTimeout(function () { | ||
| 152 | + initMap(); | ||
| 153 | + }, 700); | ||
| 154 | + | ||
| 155 | + var map; | ||
| 156 | + function initMap() { | ||
| 157 | + //初始化地图 | ||
| 158 | + map = new BMap.Map(mapWrap[0]); | ||
| 159 | + //中心点和缩放级别 | ||
| 160 | + map.centerAndZoom(new BMap.Point(gb_map_consts.center_point.lng, gb_map_consts.center_point.lat), 16); | ||
| 161 | + map.enableScrollWheelZoom(); | ||
| 162 | + //map.setMapStyle({style:'googlelite'}); | ||
| 163 | + } | ||
| 164 | + | ||
| 165 | + /** | ||
| 166 | + * 重置地图 | ||
| 167 | + */ | ||
| 168 | + mapWrap.on('reset-map', function (e) { | ||
| 169 | + e.stopPropagation(); | ||
| 170 | + map.enableAutoResize(); | ||
| 171 | + | ||
| 172 | + if(!gpsArray || gpsArray.length==0) | ||
| 173 | + return; | ||
| 174 | + //重新计算进度条 | ||
| 175 | + step = progress.width() / gpsArray.length; | ||
| 176 | + scale.css('width', step * index); | ||
| 177 | + if(fixedTime.css('visibility')=='visible'){ | ||
| 178 | + fixedTime.text(moment(gpsArray[index].timestamp).format('HH:mm.ss')).css('left', step * index - 27); | ||
| 179 | + } | ||
| 180 | + }).on('close', reset); | ||
| 181 | + | ||
| 182 | + /** | ||
| 183 | + * 播放 | ||
| 184 | + */ | ||
| 185 | + $('.top-btn-list .play', rightWrap).on('click', function () { | ||
| 186 | + if(toolsDisabled()) | ||
| 187 | + return; | ||
| 188 | + | ||
| 189 | + if(!$(this).hasClass('pause')){ | ||
| 190 | + //第一次点击播放,清除一下 | ||
| 191 | + if(play_before_flag){ | ||
| 192 | + reset(); | ||
| 193 | + play_before_flag = false; | ||
| 194 | + } | ||
| 195 | + $(this).addClass('pause'); | ||
| 196 | + if(index>=gpsArray.length-1){ | ||
| 197 | + goto(0); | ||
| 198 | + } | ||
| 199 | + gb_playback_v3_leftpanel.destoryScrollbar(); | ||
| 200 | + play(); | ||
| 201 | + fixedToCenter(); | ||
| 202 | + } | ||
| 203 | + else{ | ||
| 204 | + gb_playback_v3_leftpanel.createScrollbar(); | ||
| 205 | + $(this).removeClass('pause'); | ||
| 206 | + pause(); | ||
| 207 | + } | ||
| 208 | + }); | ||
| 209 | + | ||
| 210 | + function toolsDisabled() { | ||
| 211 | + return $('.top-btn-list', rightWrap).hasClass('disabled'); | ||
| 212 | + } | ||
| 213 | + | ||
| 214 | + | ||
| 215 | + var pause = function () { | ||
| 216 | + clearInterval(runTimer); | ||
| 217 | + runTimer = null; | ||
| 218 | + clearInterval(toCenterTimer); | ||
| 219 | + toCenterTimer = null; | ||
| 220 | + }; | ||
| 221 | + var runTimer | ||
| 222 | + , playSpeed = parseInt($('.speed_form input[checked]').val()); | ||
| 223 | + var index = 0; | ||
| 224 | + var play = function () { | ||
| 225 | + if(!run()){ | ||
| 226 | + runTimer = setTimeout(play, 1000 / playSpeed); | ||
| 227 | + } | ||
| 228 | + }; | ||
| 229 | + | ||
| 230 | + var fixedTime = $('.ui-slider-tip-fixed', rightWrap); | ||
| 231 | + var run = function () { | ||
| 232 | + if(index == gpsArray.length){ | ||
| 233 | + index--; | ||
| 234 | + $('.top-btn-list .play', rightWrap).removeClass('pause'); | ||
| 235 | + pause(); | ||
| 236 | + notify_succ('本次轨迹回放已结束!'); | ||
| 237 | + gb_playback_v3_leftpanel.createScrollbar(); | ||
| 238 | + return true; | ||
| 239 | + } | ||
| 240 | + | ||
| 241 | + gps = gpsArray[index]; | ||
| 242 | + drawCarMarker(gps);//更新GPS点位 | ||
| 243 | + updateTrailLine(gps, index);//行车轨迹线 | ||
| 244 | + updateProgress(gps, index)//进度条 | ||
| 245 | + | ||
| 246 | + printTrailTable(gps, index);//输出轨迹信息 | ||
| 247 | + printArrivalTable(gps, index);//输出到离站信息 | ||
| 248 | + index ++; | ||
| 249 | + }; | ||
| 250 | + | ||
| 251 | + var updateProgress = function (gps, i) { | ||
| 252 | + scale.css('width', step * i);//进度条 | ||
| 253 | + fixedTime.text(moment(gps.timestamp).format('HH:mm.ss')).css('left', step * i - 27).css('visibility', 'visible'); | ||
| 254 | + } | ||
| 255 | + | ||
| 256 | + /** | ||
| 257 | + * 定时居中 | ||
| 258 | + */ | ||
| 259 | + var toCenterTimer; | ||
| 260 | + var fixedToCenter = function () { | ||
| 261 | + toCenterTimer = setInterval(function () { | ||
| 262 | + var markerIsVisible = BMapLib.GeoUtils.isPointInRect(gpsMarker.getPosition(),map.getBounds()); | ||
| 263 | + if(!markerIsVisible){ | ||
| 264 | + map.panTo(gpsMarker.getPosition()); | ||
| 265 | + } | ||
| 266 | + }, 500); | ||
| 267 | + }; | ||
| 268 | + | ||
| 269 | + /** | ||
| 270 | + * 绘制gps | ||
| 271 | + * @param gps | ||
| 272 | + */ | ||
| 273 | + var gpsMarker; | ||
| 274 | + var xlPolyline = {}; | ||
| 275 | + var drawCarMarker = function (gps) { | ||
| 276 | + if(!gpsMarker){ | ||
| 277 | + gpsMarker = new BMap.Marker(new BMap.Point(gps.bd_lon, gps.bd_lat)); | ||
| 278 | + var width = gb_map_imap.calcGpsMarkerWidth(gps.nbbm); | ||
| 279 | + gpsMarker.setIcon(new BMap.Icon(gb_map_imap.createCarIconRotation(gps, width), new BMap.Size(width, 75))); | ||
| 280 | + gpsMarker.setTop(true); | ||
| 281 | + map.addOverlay(gpsMarker); | ||
| 282 | + //居中 | ||
| 283 | + map.panTo(gpsMarker.getPosition()); | ||
| 284 | + } | ||
| 285 | + else{ | ||
| 286 | + gpsMarker.setPosition(new BMap.Point(gps.bd_lon, gps.bd_lat)); | ||
| 287 | + var width = gb_map_imap.calcGpsMarkerWidth(gps.nbbm); | ||
| 288 | + gpsMarker.setIcon(new BMap.Icon(gb_map_imap.createCarIconRotation(gps, width), new BMap.Size(width, 75))); | ||
| 289 | + } | ||
| 290 | + | ||
| 291 | + if(autoChange && (gps.lineId!=xlPolyline.lineId || gps.upDown!=xlPolyline.upDown)){ | ||
| 292 | + drawXlPolyline(gps.lineId, gps.upDown); | ||
| 293 | + } | ||
| 294 | + } | ||
| 295 | + | ||
| 296 | + var bform = $('.buffer_area_form', rightWrap); | ||
| 297 | + var autoChange=true; | ||
| 298 | + function drawXlPolyline(lineCode, upDown) { | ||
| 299 | + if(upDown!=0 && upDown!=1){ | ||
| 300 | + //upDown = xlPolyline.upDown?xlPolyline.upDown:0; | ||
| 301 | + return; | ||
| 302 | + } | ||
| 303 | + | ||
| 304 | + clearXlPolyline(); | ||
| 305 | + //绘制路段 | ||
| 306 | + drawRoadPolyline(lineCode, upDown); | ||
| 307 | + //绘制站点 | ||
| 308 | + if($('input[name=drawPoint]', bform)[0].checked) | ||
| 309 | + drawStationMarkers(lineCode, upDown); | ||
| 310 | + //绘制缓冲区 | ||
| 311 | + if($('input[name=drawBuffArea]', bform)[0].checked) | ||
| 312 | + drawBuffArea(lineCode, upDown); | ||
| 313 | + //绘制站点名称 | ||
| 314 | + if($('input[name=stationName]', bform)[0].checked) | ||
| 315 | + drawNameMarkers(lineCode, upDown); | ||
| 316 | + | ||
| 317 | + xlPolyline.lineId = lineCode; | ||
| 318 | + xlPolyline.upDown = upDown; | ||
| 319 | + } | ||
| 320 | + | ||
| 321 | + var storage = window.localStorage; | ||
| 322 | + var routes;//路段 | ||
| 323 | + var stations;//站点 | ||
| 324 | + var parks;//停车场 | ||
| 325 | + | ||
| 326 | + function drawRoadPolyline(lineCode, upDown) { | ||
| 327 | + //从localStorage获取路段 | ||
| 328 | + routes = JSON.parse(storage.getItem(lineCode + '_route')); | ||
| 329 | + if(!routes){ | ||
| 330 | + var name = gb_data_basic.lineCode2NameAll()[lineCode]; | ||
| 331 | + notify_err("缺少" + name + "的路段信息,请选择" + name + "进入线调"); | ||
| 332 | + return; | ||
| 333 | + } | ||
| 334 | + routes = [routes['up_bd'], routes['down_bd']]; | ||
| 335 | + var colour = gb_map_config.getConfig().section.color; | ||
| 336 | + var plConfig = {strokeWeight: 12, strokeColor: upDown?colour.down:colour.up, strokeOpacity: .4}, pos,polyline,pls=[]; | ||
| 337 | + $.each(routes[upDown], function (i, item) { | ||
| 338 | + pos = []; | ||
| 339 | + $.each(item.split(','), function () { | ||
| 340 | + temps = this.split(' '); | ||
| 341 | + pos.push(new BMap.Point(temps[0], temps[1])); | ||
| 342 | + }); | ||
| 343 | + polyline = new BMap.Polyline(pos, plConfig); | ||
| 344 | + map.addOverlay(polyline); | ||
| 345 | + pls.push(polyline); | ||
| 346 | + }); | ||
| 347 | + xlPolyline.polylines = pls; | ||
| 348 | + } | ||
| 349 | + | ||
| 350 | + function drawStationMarkers(lineCode, upDown) { | ||
| 351 | + if(!lineCode)return; | ||
| 352 | + //从地图模块获取站点数据 | ||
| 353 | + stations = gb_map_spatial_data.getStationArray(lineCode); | ||
| 354 | + if(!stations){ | ||
| 355 | + var name = gb_data_basic.lineCode2NameAll()[lineCode]; | ||
| 356 | + notify_err("缺少" + name + "的站点信息,请选择" + name + "进入线调"); | ||
| 357 | + return; | ||
| 358 | + } | ||
| 359 | + | ||
| 360 | + var array = stations[upDown], psm, zdMarkers=[]; | ||
| 361 | + $.each(array, function () { | ||
| 362 | + //坐标转换 | ||
| 363 | + var coord = TransGPS.wgsToBD(this.lat, this.lon); | ||
| 364 | + this.bd_lat = coord.lat; | ||
| 365 | + this.bd_lon = coord.lng; | ||
| 366 | + psm = new BMap.Marker(new BMap.Point(this.bd_lon, this.bd_lat)); | ||
| 367 | + psm.setTitle(this.stationName); | ||
| 368 | + map.addOverlay(psm); | ||
| 369 | + psm.setIcon(new BMap.Icon(gb_map_imap.createStationPointIcon(), new BMap.Size(12, 12))); | ||
| 370 | + zdMarkers.push(psm); | ||
| 371 | + }); | ||
| 372 | + xlPolyline.zdMarkers=zdMarkers; | ||
| 373 | + } | ||
| 374 | + | ||
| 375 | + function drawBuffArea(lineCode, upDown) { | ||
| 376 | + if(!lineCode)return; | ||
| 377 | + stations = gb_map_spatial_data.getStationArray(lineCode); | ||
| 378 | + if(!stations){ | ||
| 379 | + var name = gb_data_basic.lineCode2NameAll()[lineCode]; | ||
| 380 | + notify_err("缺少" + name + "的缓冲区信息,请选择" + name + "进入线调"); | ||
| 381 | + return; | ||
| 382 | + } | ||
| 383 | + | ||
| 384 | + var array = stations[upDown], obj, buffs=[]; | ||
| 385 | + $.each(array, function () { | ||
| 386 | + if(this.shapesType=='r') | ||
| 387 | + obj = drawCircle(new BMap.Point(this.bd_lon, this.bd_lat), this.radius); | ||
| 388 | + else if(this.shapesType=='d') | ||
| 389 | + obj = drawPolygon(this); | ||
| 390 | + | ||
| 391 | + if(obj) | ||
| 392 | + buffs.push(obj); | ||
| 393 | + }); | ||
| 394 | + | ||
| 395 | + xlPolyline.buffs = buffs; | ||
| 396 | + } | ||
| 397 | + | ||
| 398 | + function drawNameMarkers(lineCode, upDown) { | ||
| 399 | + if(!lineCode)return; | ||
| 400 | + //从地图模块获取站点数据 | ||
| 401 | + stations = gb_map_spatial_data.getStationArray(lineCode); | ||
| 402 | + if(!stations){ | ||
| 403 | + var name = gb_data_basic.lineCode2NameAll()[lineCode]; | ||
| 404 | + notify_err("缺少" + name + "的站点信息,请选择" + name + "进入线调"); | ||
| 405 | + return; | ||
| 406 | + } | ||
| 407 | + | ||
| 408 | + var style = {backgroundColor: "rgba(255, 255, 255, 0.69)",color : "black", borderColor: "black", fontSize : "12px", height : "16px", lineHeight : "16px", fontFamily:"微软雅黑"} | ||
| 409 | + var array = stations[upDown], tMarkers=[]; | ||
| 410 | + $.each(array, function () { | ||
| 411 | + var width = this.stationName.length * 12; | ||
| 412 | + var label = new BMap.Label(this.stationName, { | ||
| 413 | + position:new BMap.Point(this.bd_lon, this.bd_lat), | ||
| 414 | + offset: new BMap.Size(-(width / 2), -27) | ||
| 415 | + }); | ||
| 416 | + label.setStyle(style); | ||
| 417 | + map.addOverlay(label); | ||
| 418 | + tMarkers.push(label); | ||
| 419 | + }); | ||
| 420 | + | ||
| 421 | + xlPolyline.tMarkers = tMarkers; | ||
| 422 | + } | ||
| 423 | + | ||
| 424 | + function clearXlPolyline() { | ||
| 425 | + var rems = []; | ||
| 426 | + //清除路段 | ||
| 427 | + clearOverlayArray(xlPolyline.polylines); | ||
| 428 | + xlPolyline.polylines = []; | ||
| 429 | + //清除站点 | ||
| 430 | + clearOverlayArray(xlPolyline.zdMarkers); | ||
| 431 | + xlPolyline.zdMarkers = []; | ||
| 432 | + //清除缓冲区 | ||
| 433 | + clearOverlayArray(xlPolyline.buffs); | ||
| 434 | + xlPolyline.buffs = []; | ||
| 435 | + //清除站点名称 | ||
| 436 | + clearOverlayArray(xlPolyline.tMarkers); | ||
| 437 | + xlPolyline.tMarkers = []; | ||
| 438 | + } | ||
| 439 | + | ||
| 440 | + function clearOverlayArray(array) { | ||
| 441 | + if(!array || !isArray(array)) | ||
| 442 | + return; | ||
| 443 | + $.each(array, function () { | ||
| 444 | + map.removeOverlay(this); | ||
| 445 | + }); | ||
| 446 | + } | ||
| 447 | + | ||
| 448 | + //更新轨迹线条 | ||
| 449 | + var trailArray=[], trailPolyline; | ||
| 450 | + function updateTrailLine(gps, i) { | ||
| 451 | + trailArray.push(gpsMarker.getPosition()); | ||
| 452 | + if(!trailPolyline){ | ||
| 453 | + trailPolyline = new BMap.Polyline(trailArray, {strokeWeight: 2, strokeColor: '#000000'}); | ||
| 454 | + map.addOverlay(trailPolyline); | ||
| 455 | + } | ||
| 456 | + else{ | ||
| 457 | + trailPolyline.setPath(trailArray); | ||
| 458 | + } | ||
| 459 | + | ||
| 460 | + //最多记录4000个点位轨迹线条 | ||
| 461 | + if(trailArray.length > 4000) | ||
| 462 | + trailArray = trailArray.slice(trailArray.length - 4000); | ||
| 463 | + } | ||
| 464 | + | ||
| 465 | + var trailTbody = leftWrap + ' .trail-info-table .ct_table_body', | ||
| 466 | + trailWrap = leftWrap + ' .trail-info-wrap' , trailPrve; | ||
| 467 | + var printTrailTable = function (gps, i) { | ||
| 468 | + if(i == 0) | ||
| 469 | + $(trailTbody).html(''); | ||
| 470 | + | ||
| 471 | + var code = gps['section_code']; | ||
| 472 | + if (!trailPrve || code != trailPrve['section_code']) { | ||
| 473 | + $(trailTbody).append(template('pbv3_trail_tbody-temp', {array: [gps]})); | ||
| 474 | + } | ||
| 475 | + else{ | ||
| 476 | + var dds = $(trailTbody).find('dl[data-code=' + code + ']').last().find('dd'); | ||
| 477 | + $(dds[0]).text(gps.timeStr); | ||
| 478 | + $(dds[1]).text(gps.speed); | ||
| 479 | + } | ||
| 480 | + trailPrve = gps; | ||
| 481 | + $(trailWrap).scrollTop($(trailWrap)[0].scrollHeight); | ||
| 482 | + }; | ||
| 483 | + | ||
| 484 | + | ||
| 485 | + var arrivalWrap = leftWrap + ' .inout_table_wrap', | ||
| 486 | + arivalTbody = arrivalWrap + ' .ct_table_body'; | ||
| 487 | + | ||
| 488 | + var inoutIndex=0, inoutLen, _item; | ||
| 489 | + var printArrivalTable = function (gps, i) { | ||
| 490 | + if(inoutIndex == 0) | ||
| 491 | + $(arivalTbody).html(''); | ||
| 492 | + | ||
| 493 | + var $dl; | ||
| 494 | + for(var j = inoutIndex; j < inoutLen; j++){ | ||
| 495 | + _item = arrivalData[j]; | ||
| 496 | + $dl = $(arivalTbody).find('dl[data-id='+_item.id+']'); | ||
| 497 | + if(gps.ts >= _item.in_ts && $dl.length==0){ | ||
| 498 | + $(arivalTbody).append(template('pbv3_inout_info_one_temp', _item)); | ||
| 499 | + inoutIndex = j; | ||
| 500 | + } | ||
| 501 | + | ||
| 502 | + if(gps.ts >= _item.out_ts){ | ||
| 503 | + var dds = $dl.find('dd'); | ||
| 504 | + if($dl.length==0) | ||
| 505 | + $(arivalTbody).append(template('pbv3_inout_info_one_temp', _item)); | ||
| 506 | + else | ||
| 507 | + $(dds[2]).text(_item.out_time_str); | ||
| 508 | + inoutIndex = j; | ||
| 509 | + } | ||
| 510 | + else if(!_item.out_ts && gps.ts >= _item.in_ts){ | ||
| 511 | + inoutIndex = j; | ||
| 512 | + } | ||
| 513 | + else { | ||
| 514 | + break; | ||
| 515 | + } | ||
| 516 | + } | ||
| 517 | + $(arrivalWrap).scrollTop($(arrivalWrap)[0].scrollHeight); | ||
| 518 | + }; | ||
| 519 | + | ||
| 520 | + var drawCircle = function (point, radius) { | ||
| 521 | + var circle = new BMap.Circle(point, radius); | ||
| 522 | + circle.setStrokeColor('#000000'); | ||
| 523 | + circle.setStrokeWeight(1); | ||
| 524 | + map.addOverlay(circle); | ||
| 525 | + return circle; | ||
| 526 | + }; | ||
| 527 | + | ||
| 528 | + var drawPolygon = function (station) { | ||
| 529 | + transMultiWGSToBd(station); | ||
| 530 | + var polygon = new BMap.Polygon(station.bdPoints, {strokeColor: '#000000', strokeWeight: 1}); | ||
| 531 | + map.addOverlay(polygon); | ||
| 532 | + return polygon; | ||
| 533 | + }; | ||
| 534 | + | ||
| 535 | + var transMultiWGSToBd = function(obj) { | ||
| 536 | + if(!obj._gPoints) | ||
| 537 | + return; | ||
| 538 | + var bdPoints = [],coord; | ||
| 539 | + $.each(obj._gPoints, function () { | ||
| 540 | + coord = TransGPS.wgsToBD(this.lat, this.lng); | ||
| 541 | + bdPoints.push(new BMap.Point(coord.lng, coord.lat)); | ||
| 542 | + }); | ||
| 543 | + | ||
| 544 | + obj.bdPoints=bdPoints; | ||
| 545 | + }; | ||
| 546 | + | ||
| 547 | + /** | ||
| 548 | + * 工具栏点击事件 | ||
| 549 | + */ | ||
| 550 | + $('.buffer_area_form input', rightWrap).on('click', function () { | ||
| 551 | + var name = $(this).attr('name'), | ||
| 552 | + lineCode = xlPolyline.lineId, | ||
| 553 | + upDown = xlPolyline.upDown; | ||
| 554 | + switch (name){ | ||
| 555 | + case 'stationName': | ||
| 556 | + //清除站点名称 | ||
| 557 | + clearOverlayArray(xlPolyline.tMarkers); | ||
| 558 | + xlPolyline.tMarkers = []; | ||
| 559 | + if(this.checked) | ||
| 560 | + drawNameMarkers(lineCode, upDown); | ||
| 561 | + break; | ||
| 562 | + case 'drawBuffArea': | ||
| 563 | + //清除缓冲区 | ||
| 564 | + clearOverlayArray(xlPolyline.buffs); | ||
| 565 | + xlPolyline.buffs = []; | ||
| 566 | + if(this.checked) | ||
| 567 | + drawBuffArea(lineCode, upDown); | ||
| 568 | + break; | ||
| 569 | + case 'drawPoint': | ||
| 570 | + //清除站点 | ||
| 571 | + clearOverlayArray(xlPolyline.zdMarkers); | ||
| 572 | + xlPolyline.zdMarkers = []; | ||
| 573 | + if(this.checked) | ||
| 574 | + drawStationMarkers(lineCode, upDown); | ||
| 575 | + break; | ||
| 576 | + } | ||
| 577 | + }); | ||
| 578 | + | ||
| 579 | + $('.speed_form input[name=playSpeed]', rightWrap).on('click', function () { | ||
| 580 | + playSpeed = parseInt($(this).val()); | ||
| 581 | + }); | ||
| 582 | + | ||
| 583 | + | ||
| 584 | + function goto(ei) { | ||
| 585 | + if (ei < 0 || ei >= gpsArray.length) | ||
| 586 | + return; | ||
| 587 | + | ||
| 588 | + var isrun; | ||
| 589 | + if(runTimer){ | ||
| 590 | + pause(); | ||
| 591 | + isrun=true; | ||
| 592 | + } | ||
| 593 | + | ||
| 594 | + var gps = gpsArray[ei]; | ||
| 595 | + updateProgress(gps, ei); | ||
| 596 | + //更新gps marker | ||
| 597 | + drawCarMarker(gps); | ||
| 598 | + //更新轨迹线条 | ||
| 599 | + trailArray = []; | ||
| 600 | + var i = 0; | ||
| 601 | + if(ei > 1000) | ||
| 602 | + i = ei - 1000; | ||
| 603 | + for (; i < ei; i++) | ||
| 604 | + trailArray.push(new BMap.Point(gpsArray[i].bd_lon, gpsArray[i].bd_lat)); | ||
| 605 | + updateTrailLine(gpsArray[ei], ei); | ||
| 606 | + | ||
| 607 | + var subArray = gpsArray.slice(0, ei + 1); | ||
| 608 | + //更新行车轨迹表格 | ||
| 609 | + gb_playback_v3_leftpanel.fillTrailTable(subArray); | ||
| 610 | + //更新到离站表格 | ||
| 611 | + //重新定位 inoutIndex | ||
| 612 | + $.each(arrivalData, function (i, obj) { | ||
| 613 | + if(gps.ts<this.in_ts || gps.ts<this.out_ts){ | ||
| 614 | + inoutIndex = i; | ||
| 615 | + return false; | ||
| 616 | + } | ||
| 617 | + }); | ||
| 618 | + gb_playback_v3_leftpanel.fillArivalStationTable(subArray); | ||
| 619 | + //居中 | ||
| 620 | + map.panTo(gpsMarker.getPosition()); | ||
| 621 | + | ||
| 622 | + index = ei + 1; | ||
| 623 | + if(isrun){ | ||
| 624 | + play(); | ||
| 625 | + fixedToCenter(); | ||
| 626 | + } | ||
| 627 | + } | ||
| 628 | + | ||
| 629 | + function play_before_goto(ei) { | ||
| 630 | + if (ei < 0 || ei >= gpsArray.length) | ||
| 631 | + return; | ||
| 632 | + | ||
| 633 | + var gps = gpsArray[ei]; | ||
| 634 | + //更新gps marker | ||
| 635 | + drawCarMarker(gps); | ||
| 636 | + //更新轨迹线条 | ||
| 637 | + trailArray = []; | ||
| 638 | + var i = 0; | ||
| 639 | + if(ei > 1000) | ||
| 640 | + i = ei - 1000; | ||
| 641 | + for (; i < ei; i++) | ||
| 642 | + trailArray.push(new BMap.Point(gpsArray[i].bd_lon, gpsArray[i].bd_lat)); | ||
| 643 | + updateTrailLine(gpsArray[ei], ei); | ||
| 644 | + | ||
| 645 | + //居中 | ||
| 646 | + map.panTo(gpsMarker.getPosition()); | ||
| 647 | + } | ||
| 648 | + | ||
| 649 | + /** | ||
| 650 | + * 初始化停车场下拉菜单 | ||
| 651 | + */ | ||
| 652 | + var parkPolygons={}; | ||
| 653 | + (function (lineCode) { | ||
| 654 | + //从地图模块获取停车场数据 | ||
| 655 | + var parks = gb_map_spatial_data.carparkArray(); | ||
| 656 | + //渲染 | ||
| 657 | + var htmlStr = template('pbv3_park_dropdown-temp', {list: parks}); | ||
| 658 | + $('.buffer_area_form .parks_list', rightWrap).html(htmlStr); | ||
| 659 | + | ||
| 660 | + console.log('parksparks', parks); | ||
| 661 | + //拼音映射 | ||
| 662 | + var searchData=[]; | ||
| 663 | + for(var i=0,p;p=parks[i++];){ | ||
| 664 | + searchData.push({ | ||
| 665 | + code: p.parkCode, | ||
| 666 | + name: p.parkName, | ||
| 667 | + fullChars: pinyin.getFullChars(p.parkName).toUpperCase(), | ||
| 668 | + camelChars: pinyin.getCamelChars(p.parkName).toUpperCase() | ||
| 669 | + }) | ||
| 670 | + } | ||
| 671 | + //搜索 | ||
| 672 | + var listWrap = $('.buffer_area_form .parks_list', rightWrap); | ||
| 673 | + $('.park_list_search_input', rightWrap).on('input', function () { | ||
| 674 | + var v = $(this).val(); | ||
| 675 | + if(!v){ | ||
| 676 | + $('li', listWrap).show(); | ||
| 677 | + return; | ||
| 678 | + } | ||
| 679 | + v = v.toUpperCase(); | ||
| 680 | + $('li', listWrap).hide(); | ||
| 681 | + for(var i=0,obj;obj=searchData[i++];){ | ||
| 682 | + if(obj.name.indexOf(v)!=-1 || obj.fullChars.indexOf(v)!=-1 || obj.camelChars.indexOf(v)!=-1) | ||
| 683 | + $('li[data-code="'+obj.code+'"]', listWrap).show(); | ||
| 684 | + } | ||
| 685 | + }); | ||
| 686 | + | ||
| 687 | + //停车场点击 | ||
| 688 | + $('.buffer_area_form .parks_list>li', rightWrap).on('click', function () { | ||
| 689 | + var code = $(this).data('code'); | ||
| 690 | + | ||
| 691 | + if(!parkPolygons[code]){ | ||
| 692 | + var park; | ||
| 693 | + $.each(parks, function () { | ||
| 694 | + if(this.parkCode==code){park = this;return false;} | ||
| 695 | + }); | ||
| 696 | + | ||
| 697 | + transMultiWGSToBd(park); | ||
| 698 | + var polygon = new BMap.Polygon(park.bdPoints, {strokeColor: 'red', strokeWeight: 1}); | ||
| 699 | + map.addOverlay(polygon); | ||
| 700 | + parkPolygons[code] = polygon; | ||
| 701 | + //中心点 | ||
| 702 | + var ts = park.gCenterPoint.split(' ') | ||
| 703 | + ,coord = TransGPS.wgsToBD(parseFloat(ts[1]), parseFloat(ts[0])); | ||
| 704 | + polygon._centerPoint = new BMap.Point(coord.lng, coord.lat); | ||
| 705 | + //绘制名称label | ||
| 706 | + var style = {backgroundColor: "rgba(255, 255, 255, 0.69)",color : "red", borderColor: "red", fontSize : "12px", height : "16px", lineHeight : "16px", fontFamily:"微软雅黑"} | ||
| 707 | + var width = park.parkName.length * 12; | ||
| 708 | + var label = new BMap.Label(park.parkName, { | ||
| 709 | + position:polygon._centerPoint, | ||
| 710 | + offset: new BMap.Size(-(width / 2), -27) | ||
| 711 | + }); | ||
| 712 | + label.setStyle(style); | ||
| 713 | + map.addOverlay(label); | ||
| 714 | + } | ||
| 715 | + | ||
| 716 | + //定位到polygon | ||
| 717 | + var polygon=parkPolygons[code]; | ||
| 718 | + map.panTo(polygon._centerPoint); | ||
| 719 | + }); | ||
| 720 | + })(); | ||
| 721 | + | ||
| 722 | + //初始化线路地图下拉菜单 | ||
| 723 | + (function () { | ||
| 724 | + var opts=''; | ||
| 725 | + $.each(gb_data_basic.activeLines, function () { | ||
| 726 | + opts+='<li data-code="'+this.lineCode+'" data-dir="0"><a>'+this.name+'上行</a></li><li data-code="'+this.lineCode+'" data-dir="1"><a>'+this.name+'下行</a></li>'; | ||
| 727 | + }); | ||
| 728 | + $('.base_line_list', rightWrap).html(opts); | ||
| 729 | + | ||
| 730 | + //切换线路底图 | ||
| 731 | + $(rightWrap).on('click', '.base_line_list>li', function () { | ||
| 732 | + var code = $(this).data('code'); | ||
| 733 | + var updown = $(this).data('dir'); | ||
| 734 | + autoChange = false; | ||
| 735 | + drawXlPolyline(code, updown); | ||
| 736 | + }); | ||
| 737 | + })(); | ||
| 738 | + | ||
| 739 | + | ||
| 740 | + function formData() { | ||
| 741 | + var fs = 'YYYY-MM-DD HH:mm'; | ||
| 742 | + var f = $('.play-back-form form', leftWrap), | ||
| 743 | + nbbm = $('[name=nbbm]',f).val(), | ||
| 744 | + st = parseInt(moment($('[name=startTime]',f).val(), fs).format('X')), | ||
| 745 | + et = parseInt(moment($('[name=endTime]',f).val(), fs).format('X')); | ||
| 746 | + | ||
| 747 | + return { | ||
| 748 | + nbbm: nbbm, | ||
| 749 | + st: st, | ||
| 750 | + et: et | ||
| 751 | + } | ||
| 752 | + } | ||
| 753 | + | ||
| 754 | + //轨迹 | ||
| 755 | + $('.export-excel', rightWrap).on('click', function () { | ||
| 756 | + var d = formData(); | ||
| 757 | + window.open('/freeLogin/gps/history_v3/excel/' + d.nbbm + "?st="+d.st+"&et="+d.et); | ||
| 758 | + }); | ||
| 759 | + //异常信息 | ||
| 760 | + $('.export-excel-abnormal', rightWrap).on('click', function () { | ||
| 761 | + var d = formData(); | ||
| 762 | + window.open('/freeLogin/gps/history_v3/excel_abnormal/' + d.nbbm + "?st="+d.st+"&et="+d.et); | ||
| 763 | + }); | ||
| 764 | + //到离站 | ||
| 765 | + $('.export-excel-arrival', rightWrap).on('click', function () { | ||
| 766 | + var d = formData(); | ||
| 767 | + window.open('/freeLogin/gps/history_v3/excel_arrival/' + d.nbbm + "?st="+d.st+"&et="+d.et); | ||
| 768 | + }); | ||
| 769 | + })(); | ||
| 770 | +</script> | ||
| 0 | \ No newline at end of file | 771 | \ No newline at end of file |
src/main/resources/static/real_control_v3/mapmonitor/js/playback.js
0 → 100644
| 1 | +/* 地图模块 轨迹回放 */ | ||
| 2 | + | ||
| 3 | +var gb_map_play_back = (function () { | ||
| 4 | + | ||
| 5 | + var dom; | ||
| 6 | +/* $.get('/real_control_v3/mapmonitor/fragments/playback_v2/main.html', function (rs) { | ||
| 7 | + dom = rs; | ||
| 8 | + });*/ | ||
| 9 | + $.get('/real_control_v3/mapmonitor/fragments/playback_v3/layout.html', function (rs) { | ||
| 10 | + dom = rs; | ||
| 11 | + }); | ||
| 12 | + | ||
| 13 | + var setParam = function (sch) { | ||
| 14 | + console.log('sch', sch); | ||
| 15 | + var f = $('.play-back-form form'), | ||
| 16 | + st = (sch['fcsjActualTime']?sch['fcsjActualTime']:sch['dfsjT']) - 1000 * 60 * 5, | ||
| 17 | + et = (sch['zdsjActualTime']?sch['zdsjActualTime']:sch['zdsjT']) + 1000 * 60 * 5, | ||
| 18 | + fs = 'YYYY-MM-DD HH:mm'; | ||
| 19 | + | ||
| 20 | + $('[name=nbbm]', f).val(sch.clZbh); | ||
| 21 | + $('[name=startTime]', f).val(moment(st).format(fs)); | ||
| 22 | + $('[name=endTime]', f).val(moment(et).format(fs)); | ||
| 23 | + }; | ||
| 24 | + | ||
| 25 | + var initParams = function (deviceId, nbbm) { | ||
| 26 | + //关闭infowindow | ||
| 27 | + if (deviceId) | ||
| 28 | + gb_map_imap.call('closeWin', deviceId); | ||
| 29 | + | ||
| 30 | + //show modal | ||
| 31 | + //open_modal_dom(dom, {deviceId: deviceId, nbbm: nbbm}); | ||
| 32 | + | ||
| 33 | + var pbv3MapWrap = '.gps-play-back-panel-v3>div.right-panel .play-back-map-wrap'; | ||
| 34 | + var resizeFlag; | ||
| 35 | + var index = layer.open({ | ||
| 36 | + id: 'play_back_v3_modal', | ||
| 37 | + type: 1, | ||
| 38 | + title: '<i class="uk-icon-play-circle"></i> 轨迹回放', | ||
| 39 | + shadeClose: true, | ||
| 40 | + shade: false, | ||
| 41 | + moveOut: true, | ||
| 42 | + maxmin: true, //开启最大化最小化按钮 | ||
| 43 | + area: ['1299px', '754px'], | ||
| 44 | + //moveOut: true, | ||
| 45 | + skin:'layui-layer-molv play_back-layer', | ||
| 46 | + content: dom, | ||
| 47 | + zIndex: layer.zIndex, | ||
| 48 | + success: function(layero){ | ||
| 49 | + layer.setTop(layero); | ||
| 50 | + $('.gps-play-back-panel-v3').trigger('init', {deviceId: deviceId, nbbm: nbbm}); | ||
| 51 | + }, | ||
| 52 | + end: function () { | ||
| 53 | + | ||
| 54 | + }, | ||
| 55 | + resizing: function () { | ||
| 56 | + if(resizeFlag) | ||
| 57 | + return; | ||
| 58 | + resizeFlag = true; | ||
| 59 | + setTimeout(function () { | ||
| 60 | + $(pbv3MapWrap).trigger('reset-map'); | ||
| 61 | + resizeFlag = false; | ||
| 62 | + }, 1200); | ||
| 63 | + }, | ||
| 64 | + full: function () { | ||
| 65 | + $(pbv3MapWrap).trigger('reset-map'); | ||
| 66 | + }, | ||
| 67 | + min: function () { | ||
| 68 | + $(pbv3MapWrap).trigger('reset-map'); | ||
| 69 | + }, | ||
| 70 | + restore: function () { | ||
| 71 | + $(pbv3MapWrap).trigger('reset-map'); | ||
| 72 | + }, | ||
| 73 | + cancel: function () { | ||
| 74 | + $(pbv3MapWrap).trigger('close'); | ||
| 75 | + //删除所有的flatpickr元素,避免元素堆积 | ||
| 76 | + $('.flatpickr-calendar.showTimeInput').remove(); | ||
| 77 | + } | ||
| 78 | + }); | ||
| 79 | + layer.full(index); | ||
| 80 | + }; | ||
| 81 | + | ||
| 82 | + //导出excel | ||
| 83 | + var listToExcel = function (list) { | ||
| 84 | + var temp = '<html>' + | ||
| 85 | + ' <head> '+ | ||
| 86 | + ' </head>' + | ||
| 87 | + ' <body>' + | ||
| 88 | + ' <table border="1">' + | ||
| 89 | + ' <tr><th>序号</th><th>车辆</th><th>所在道路</th><th>经度</th><th>纬度</th><th>时间</th><th>速度</th></tr>' + | ||
| 90 | + ' {{each list as gps i}}' + | ||
| 91 | + ' <tr><td>{{i+1}}</td><td>{{gps.nbbm}}</td><td>{{gps.section_name}}</td><td>{{gps.lon}}</td><td>{{gps.lat}}</td><td>{{gps.timeStr}}</td><td>{{gps.speed}}</td></tr>' + | ||
| 92 | + ' {{/each}}' + | ||
| 93 | + ' </table>' + | ||
| 94 | + ' </body>' + | ||
| 95 | + ' </html>'; | ||
| 96 | + | ||
| 97 | + var rs = template.compile(temp)({list: list}); | ||
| 98 | + | ||
| 99 | + var uri = 'data:application/vnd.ms-excel;base64,'; | ||
| 100 | + return uri + base64(rs); | ||
| 101 | + //location.href = uri + base64(rs); | ||
| 102 | + }; | ||
| 103 | + | ||
| 104 | + | ||
| 105 | + function base64(string) { | ||
| 106 | + return window.btoa(unescape(encodeURIComponent(string))); | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + return { | ||
| 110 | + initParams: initParams, | ||
| 111 | + listToExcel: listToExcel, | ||
| 112 | + setParam: setParam | ||
| 113 | + } | ||
| 114 | +})(); | ||
| 0 | \ No newline at end of file | 115 | \ No newline at end of file |
src/main/resources/static/real_control_v3/mapmonitor/js/spatial_data.js
0 → 100644
| 1 | +/** 空间数据 */ | ||
| 2 | + | ||
| 3 | +var gb_map_spatial_data = (function () { | ||
| 4 | + | ||
| 5 | + var storage = window.localStorage; | ||
| 6 | + | ||
| 7 | + var activeLines = JSON.parse(storage.getItem('lineControlItems')); | ||
| 8 | + var line_idx = (function () { | ||
| 9 | + var str = ''; | ||
| 10 | + for (var i = 0, item; item = activeLines[i++];) { | ||
| 11 | + str += (',' + item.lineCode); | ||
| 12 | + } | ||
| 13 | + return str.substr(1); | ||
| 14 | + })(); | ||
| 15 | + | ||
| 16 | + var cont = '#spatial-tree-content'; | ||
| 17 | + //线路站点路由数据 | ||
| 18 | + var lineStationArr; | ||
| 19 | + | ||
| 20 | + //停车场数据 | ||
| 21 | + var carparkArr; | ||
| 22 | + | ||
| 23 | + var init = function () { | ||
| 24 | + //加载站点路由数据 | ||
| 25 | + gb_common.$get('/freeLogin/realMap/stationSpatialData', {idx: line_idx}, function (rs) { | ||
| 26 | + var list = rs.list; | ||
| 27 | + $.each(list, function () { | ||
| 28 | + this.lat = this.gLaty; | ||
| 29 | + this.lon = this.gLonx; | ||
| 30 | + delete this.gLaty; | ||
| 31 | + delete this.gLonx; | ||
| 32 | + if(this.shapesType=='d'){ | ||
| 33 | + var calcRs = calcPolygonArea(this.gPolygonGrid); | ||
| 34 | + this._polygonArea = calcRs._polygonArea; | ||
| 35 | + this._gPoints = calcRs._gPoints; | ||
| 36 | + } | ||
| 37 | + }); | ||
| 38 | + //排序 | ||
| 39 | + list.sort(function (a, b) { | ||
| 40 | + return a.stationRouteCode - b.stationRouteCode; | ||
| 41 | + }); | ||
| 42 | + //按线路分组 | ||
| 43 | + lineStationArr = gb_common.groupBy(list, 'lineCode'); | ||
| 44 | + //再按上下行分组 | ||
| 45 | + for (var lineCode in lineStationArr) { | ||
| 46 | + lineStationArr[lineCode] = gb_common.groupBy(lineStationArr[lineCode], 'directions'); | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + ep.emitLater('station'); | ||
| 50 | + }); | ||
| 51 | + | ||
| 52 | + //加载停车场数据 | ||
| 53 | + gb_common.$get('/freeLogin/realMap/carParkSpatialData', {}, function (rs) { | ||
| 54 | + carparkArr = rs.list; | ||
| 55 | + $.each(carparkArr, function () { | ||
| 56 | + if(this.shapesType=='d'){ | ||
| 57 | + var calcRs = calcPolygonArea(this.gParkPoint); | ||
| 58 | + this._polygonArea = calcRs._polygonArea; | ||
| 59 | + this._gPoints = calcRs._gPoints; | ||
| 60 | + } | ||
| 61 | + }); | ||
| 62 | + ep.emitLater('carpark'); | ||
| 63 | + }); | ||
| 64 | + | ||
| 65 | + var ep = EventProxy.create('station', 'carpark', function () { | ||
| 66 | + $(".real_spatial_panel").resizable({ | ||
| 67 | + maxHeight: '100%', | ||
| 68 | + minHeight: 18 | ||
| 69 | + }); | ||
| 70 | + | ||
| 71 | + //绘制站点路由树 | ||
| 72 | + $('.station-route-tree', cont) | ||
| 73 | + //state插件 状态恢复完成 | ||
| 74 | + .on('state_ready.jstree', function () { | ||
| 75 | + //绑定checkbox状态切换事件 | ||
| 76 | + $(this).on('check_node.jstree uncheck_node.jstree', gb_map_overlay_mge.drawStation); | ||
| 77 | + }) | ||
| 78 | + .on('activate_node.jstree', function (e, n) { | ||
| 79 | + var node = n.node; | ||
| 80 | + if(node.state.checked) | ||
| 81 | + gb_map_overlay_mge._focus_station(node.data); | ||
| 82 | + }) | ||
| 83 | + .jstree({ | ||
| 84 | + 'core': { | ||
| 85 | + 'data': get_st_route_tree_data() | ||
| 86 | + }, | ||
| 87 | + 'checkbox': { | ||
| 88 | + 'keep_selected_style': false, | ||
| 89 | + 'whole_node': false, | ||
| 90 | + 'tie_selection': false | ||
| 91 | + }, | ||
| 92 | + //local storage里的key | ||
| 93 | + 'state': { | ||
| 94 | + 'key': 'jstree_map_station_route' | ||
| 95 | + }, | ||
| 96 | + 'plugins': ['checkbox', 'state'] | ||
| 97 | + }); | ||
| 98 | + | ||
| 99 | + | ||
| 100 | + //停车场 | ||
| 101 | + $('.carpark-panel', cont) | ||
| 102 | + .on('state_ready.jstree', function () { | ||
| 103 | + //绑定checkbox状态切换事件 | ||
| 104 | + $(this).on('check_node.jstree uncheck_node.jstree', gb_map_overlay_mge.drawCarpark); | ||
| 105 | + }) | ||
| 106 | + .on('activate_node.jstree', function (e, n) { | ||
| 107 | + var node = n.node; | ||
| 108 | + if(node.state.checked) | ||
| 109 | + gb_map_overlay_mge._focus_carpark(node.data); | ||
| 110 | + }) | ||
| 111 | + .jstree({ | ||
| 112 | + 'core': { | ||
| 113 | + 'data': get_st_carpark_tree_data() | ||
| 114 | + }, | ||
| 115 | + 'checkbox': { | ||
| 116 | + 'keep_selected_style': false, | ||
| 117 | + 'whole_node': false, | ||
| 118 | + 'tie_selection': false | ||
| 119 | + }, | ||
| 120 | + //local storage里的key | ||
| 121 | + 'state': { | ||
| 122 | + 'key': 'jstree_map_carpark' | ||
| 123 | + }, | ||
| 124 | + 'plugins': ['checkbox', 'state'] | ||
| 125 | + }); | ||
| 126 | + | ||
| 127 | + refresh(); | ||
| 128 | + }); | ||
| 129 | + }; | ||
| 130 | + | ||
| 131 | + //计算多边形面积 | ||
| 132 | + function calcPolygonArea(polygonStr) { | ||
| 133 | + var pStr = polygonStr.substring(9, polygonStr.length - 2); | ||
| 134 | + var array = pStr.split(','); | ||
| 135 | + var newArr=[]; | ||
| 136 | + | ||
| 137 | + //递归去掉闭合的尾 | ||
| 138 | + (function () { | ||
| 139 | + var f = arguments.callee; | ||
| 140 | + var end=array.length - 1; | ||
| 141 | + if(array.length > 1 && array[0] == array[end]){ | ||
| 142 | + array = array.slice(0, end); | ||
| 143 | + f(); | ||
| 144 | + } | ||
| 145 | + })(); | ||
| 146 | + | ||
| 147 | + //去掉连续的重复点 | ||
| 148 | + var last; | ||
| 149 | + $.each(array, function (i, str) { | ||
| 150 | + if(last){ | ||
| 151 | + if(last != str) | ||
| 152 | + newArr.push(str); | ||
| 153 | + } | ||
| 154 | + else | ||
| 155 | + newArr.push(str); | ||
| 156 | + last = str; | ||
| 157 | + }); | ||
| 158 | + | ||
| 159 | + var gPoints=[],ts; | ||
| 160 | + $.each(newArr, function (i, c) { | ||
| 161 | + ts=c.split(' '); | ||
| 162 | + gPoints.push({ | ||
| 163 | + lat: parseFloat(ts[1]), | ||
| 164 | + lng: parseFloat(ts[0]) | ||
| 165 | + }); | ||
| 166 | + }); | ||
| 167 | + | ||
| 168 | + //用百度geo工具库计算面积 | ||
| 169 | + var _polygonArea = BMapLib.GeoUtils.getPolygonArea(gPoints); | ||
| 170 | + return {_polygonArea: _polygonArea.toFixed(2), _gPoints: gPoints}; | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + var refresh = function (type, checked) { | ||
| 174 | + if (!triggerElem()) | ||
| 175 | + return; | ||
| 176 | + | ||
| 177 | + if ((type == 'carPark' && checked) || (type == 'station' && !checked)) { | ||
| 178 | + //显示停车场面板 | ||
| 179 | + $('.car-park-item', cont).addClass('uk-active'); | ||
| 180 | + $('li.cp-tab-btn', '.real_spatial_panel').addClass('uk-active'); | ||
| 181 | + $('.carpark-panel', cont).jstree(true).check_all(); | ||
| 182 | + | ||
| 183 | + //绘制停车场 | ||
| 184 | + gb_map_overlay_mge.drawCarpark(); | ||
| 185 | + } | ||
| 186 | + else { | ||
| 187 | + //显示站点路由面板 | ||
| 188 | + $('.station-route-item', cont).addClass('uk-active'); | ||
| 189 | + $('li.sr-tab-btn', '.real_spatial_panel').addClass('uk-active'); | ||
| 190 | + | ||
| 191 | + //选中相关站点路由树 | ||
| 192 | + var chs = gb_map_overlay_mge.getCheckedDevice(); | ||
| 193 | + var idx = {}; | ||
| 194 | + $.each(chs, function () { | ||
| 195 | + idx[this.data.lineId + '_' + this.data.upDown] = 1; | ||
| 196 | + }); | ||
| 197 | + | ||
| 198 | + var treeObj = $('.station-route-tree', cont).jstree(true); | ||
| 199 | + for (var id in idx) { | ||
| 200 | + treeObj.check_node(treeObj.get_node(id + '_st')); | ||
| 201 | + } | ||
| 202 | + | ||
| 203 | + //drawStation(); | ||
| 204 | + gb_map_overlay_mge.drawStation(); | ||
| 205 | + } | ||
| 206 | + } | ||
| 207 | + | ||
| 208 | + var triggerElem = function () { | ||
| 209 | + var config = gb_map_config.getConfig().spatialData; | ||
| 210 | + | ||
| 211 | + if(config.station || config.carPark){ | ||
| 212 | + showPanel(); | ||
| 213 | + return true; | ||
| 214 | + } | ||
| 215 | + hidePanel(); | ||
| 216 | + //gb_map_imap.call('hideAllStationMarker'); | ||
| 217 | + //gb_map_imap.call('hideDrawCarpark'); | ||
| 218 | + return false; | ||
| 219 | + } | ||
| 220 | + | ||
| 221 | + var animationend = 'webkitAnimationEnd animationend'; | ||
| 222 | + var showPanel = function () { | ||
| 223 | + var elem = $('.real_spatial_panel'); | ||
| 224 | + var config = gb_map_config.getConfig().spatialData; | ||
| 225 | + | ||
| 226 | + if (config.station && config.carPark) { | ||
| 227 | + anim_show($('.uk-subnav', elem), 'uk-animation-scale-up'); | ||
| 228 | + $('.real_spatial_body', elem).addClass('show-tab'); | ||
| 229 | + } | ||
| 230 | + else { | ||
| 231 | + $('.uk-subnav', elem).hide(); | ||
| 232 | + $('.real_spatial_body', elem).removeClass('show-tab'); | ||
| 233 | + } | ||
| 234 | + | ||
| 235 | + $('li.uk-active', elem).removeClass('uk-active'); | ||
| 236 | + | ||
| 237 | + if (!elem.is(":hidden")) | ||
| 238 | + return; | ||
| 239 | + | ||
| 240 | + anim_show(elem, 'uk-animation-slide-left'); | ||
| 241 | + } | ||
| 242 | + | ||
| 243 | + var hidePanel = function () { | ||
| 244 | + var elem = $('.real_spatial_panel'); | ||
| 245 | + elem.hide(); | ||
| 246 | + } | ||
| 247 | + | ||
| 248 | + function anim_show(e, anim) { | ||
| 249 | + e.addClass(anim).show().one(animationend, function () { | ||
| 250 | + $(this).removeClass(anim); | ||
| 251 | + }); | ||
| 252 | + } | ||
| 253 | + | ||
| 254 | + function getCheckedStation() { | ||
| 255 | + var list = []; | ||
| 256 | + var chs = $('.station-route-tree', cont).jstree(true).get_checked(true); | ||
| 257 | + chs = chs.filter(function (item) { | ||
| 258 | + return item.data; | ||
| 259 | + }); | ||
| 260 | + $.each(chs, function () { | ||
| 261 | + list.push(this.data); | ||
| 262 | + }); | ||
| 263 | + return list; | ||
| 264 | + } | ||
| 265 | + | ||
| 266 | + function gteCheckedCarpark() { | ||
| 267 | + var list = []; | ||
| 268 | + var chs = $('.carpark-panel', cont).jstree(true).get_checked(true); | ||
| 269 | + $.each(chs, function () { | ||
| 270 | + list.push(this.data); | ||
| 271 | + }); | ||
| 272 | + return list; | ||
| 273 | + } | ||
| 274 | + | ||
| 275 | + var get_st_route_tree_data = function () { | ||
| 276 | + var treeData = []; | ||
| 277 | + | ||
| 278 | + for (var lineCode in lineStationArr) { | ||
| 279 | + name = gb_data_basic.codeToLine[lineCode].name; | ||
| 280 | + treeData.push({ | ||
| 281 | + 'text': name, | ||
| 282 | + 'open': true, | ||
| 283 | + 'children': [ | ||
| 284 | + { | ||
| 285 | + 'text': '上行', | ||
| 286 | + 'children': grabs(lineStationArr[lineCode][0]), | ||
| 287 | + 'id': lineCode + '_0_st' | ||
| 288 | + }, | ||
| 289 | + { | ||
| 290 | + 'text': '下行', | ||
| 291 | + 'children': grabs(lineStationArr[lineCode][1]), | ||
| 292 | + 'id': lineCode + '_1_st' | ||
| 293 | + } | ||
| 294 | + ] | ||
| 295 | + }) | ||
| 296 | + } | ||
| 297 | + return treeData; | ||
| 298 | + }; | ||
| 299 | + | ||
| 300 | + var get_st_carpark_tree_data = function () { | ||
| 301 | + var treeData = []; | ||
| 302 | + | ||
| 303 | + $.each(carparkArr, function () { | ||
| 304 | + treeData.push({ | ||
| 305 | + 'text': this.parkName, | ||
| 306 | + 'data': this | ||
| 307 | + }); | ||
| 308 | + }); | ||
| 309 | + | ||
| 310 | + return treeData; | ||
| 311 | + } | ||
| 312 | + | ||
| 313 | + var grabs = function (array) { | ||
| 314 | + if (!array) | ||
| 315 | + return; | ||
| 316 | + var rs = []; | ||
| 317 | + $.each(array, function () { | ||
| 318 | + rs.push({ | ||
| 319 | + 'text': this.stationName, | ||
| 320 | + 'data': this, | ||
| 321 | + 'icon': false | ||
| 322 | + }); | ||
| 323 | + }); | ||
| 324 | + return rs; | ||
| 325 | + } | ||
| 326 | + | ||
| 327 | + return { | ||
| 328 | + refresh: refresh, | ||
| 329 | + init: init, | ||
| 330 | + getCheckedStation:getCheckedStation, | ||
| 331 | + gteCheckedCarpark: gteCheckedCarpark, | ||
| 332 | + getStationArray: function (lineCode) { | ||
| 333 | + return lineStationArr[lineCode]; | ||
| 334 | + }, | ||
| 335 | + carparkArray: function () { | ||
| 336 | + return carparkArr; | ||
| 337 | + } | ||
| 338 | + }; | ||
| 339 | +})(); | ||
| 0 | \ No newline at end of file | 340 | \ No newline at end of file |
src/main/resources/static/real_control_v3/mapmonitor/real.html
0 → 100644
| 1 | +<link href="/assets/css/TrafficControl.css" rel="stylesheet" merge="map_plugins"/> | ||
| 2 | +<link rel="stylesheet" href="/real_control_v2/assets/plugins/jquery.ui/themes/base/all.css" merge="map_plugins"/> | ||
| 3 | +<link rel="stylesheet" href="/real_control_v2/assets/plugins/spectrum/spectrum.css" merge="map_plugins"/> | ||
| 4 | +<link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/form-advanced.gradient.min.css" merge="map_plugins"/> | ||
| 5 | +<link rel="stylesheet" href="/real_control_v2/mapmonitor/css/real.css" /> | ||
| 6 | +<link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/progress.gradient.min.css" merge="map_plugins"> | ||
| 7 | + | ||
| 8 | +<div class="map-system-msg flex-left"> | ||
| 9 | + <a class="z-depth-2 old_map" href="/pages/mapmonitor/alone/wrap.html" target="_blank"></a> | ||
| 10 | + <a class="z-depth-2 now_map" href="/real_control_v3/alone_page/map/alone_wrap.html" target="_blank"> | ||
| 11 | + <i class="uk-icon-send-o"></i> | ||
| 12 | + </a> | ||
| 13 | +</div> | ||
| 14 | + | ||
| 15 | +<div id="real_map_container"></div> | ||
| 16 | +<div class="real_right_gps_panel"> | ||
| 17 | + <form class="uk-form" > | ||
| 18 | + <div class="uk-autocomplete uk-form ral-gps-autocom" style="width: 100%;"> | ||
| 19 | + <div class="uk-form-icon"> | ||
| 20 | + <i class="uk-icon-search"></i> | ||
| 21 | + <input type="text" placeholder="搜索..."> | ||
| 22 | + </div> | ||
| 23 | + </div> | ||
| 24 | + </form> | ||
| 25 | + | ||
| 26 | + <div class="gps_tree_list"></div> | ||
| 27 | +</div> | ||
| 28 | + | ||
| 29 | +<div class="real_bottom_panel"> | ||
| 30 | + <!--<div id="handle" class="ui-resizable-handle ui-resizable-n"></div>--> | ||
| 31 | + <div class="real_br_cont map_config_wrap"></div> | ||
| 32 | + <div class="telescopic"> | ||
| 33 | + <i class="uk-icon-angle-double-up"></i> | ||
| 34 | + </div> | ||
| 35 | +</div> | ||
| 36 | + | ||
| 37 | +<div class="real_spatial_panel"> | ||
| 38 | + <div class="top-right-toggle"> | ||
| 39 | + <ul class="uk-subnav uk-subnav-pill" data-uk-switcher="{connect:'#spatial-tree-content'}"> | ||
| 40 | + <li class="sr-tab-btn"><a>站点</a></li> | ||
| 41 | + <li class="cp-tab-btn"><a>停车场</a></li> | ||
| 42 | + </ul> | ||
| 43 | + </div> | ||
| 44 | + <div class="real_spatial_body"> | ||
| 45 | + <ul id="spatial-tree-content" class="uk-switcher"> | ||
| 46 | + <li class="station-route-item"> | ||
| 47 | + <div class="station-route-tree"></div> | ||
| 48 | + </li> | ||
| 49 | + <li class="car-park-item"> | ||
| 50 | + <div class="carpark-panel"></div> | ||
| 51 | + </li> | ||
| 52 | + </ul> | ||
| 53 | + </div> | ||
| 54 | +</div> | ||
| 55 | + | ||
| 56 | + | ||
| 57 | +<div class="c_b_abnorm_notice"></div> | ||
| 58 | + | ||
| 59 | +<script id="map_abnorm_overspeed_list-temp" type="text/html"> | ||
| 60 | + {{each list as obj i}} | ||
| 61 | + <div class="c_b_item {{obj.ets!=null?'over':''}}" data-nbbm="{{obj.nbbm}}"> | ||
| 62 | + {{obj.sts}} - {{obj.nbbm}} 开始超速({{obj.speed}}) | ||
| 63 | + | ||
| 64 | + {{if obj.ets!=null}} | ||
| 65 | + <span class="c_b_over"> {{obj.ets}} 结束</span> | ||
| 66 | + {{/if}} | ||
| 67 | + </div> | ||
| 68 | + {{/each}} | ||
| 69 | +</script> | ||
| 70 | + | ||
| 71 | +<script src="/real_control_v2/assets/js/GeoUtils_min.js" merge="map_plugins"></script> | ||
| 72 | +<script src="/real_control_v2/mapmonitor/js/config.js" merge="map_custom_js"></script> | ||
| 73 | +<script src="/real_control_v2/mapmonitor/js/gps_tree.js" merge="map_custom_js"></script> | ||
| 74 | +<script src="/real_control_v3/mapmonitor/js/spatial_data.js" merge="map_custom_js"></script> | ||
| 75 | +<script src="/real_control_v2/mapmonitor/js/map_overlay_manager.js" merge="map_custom_js"></script> | ||
| 76 | +<script src="/real_control_v2/mapmonitor/js/real.js" ></script> | ||
| 77 | +<script src="/real_control_v2/mapmonitor/js/map/iMap.js" merge="map_custom_js"></script> | ||
| 78 | +<script src="/real_control_v2/mapmonitor/js/map/platform/baidu.js" merge="map_custom_js"></script> | ||
| 79 | +<script src="/real_control_v2/mapmonitor/js/map/platform/gaode.js" merge="map_custom_js"></script> | ||
| 80 | +<!-- jquery ui --> | ||
| 81 | +<script src="/real_control_v2/assets/plugins/jquery.ui/core.js" merge="map_plugins"></script> | ||
| 82 | +<script src="/real_control_v2/assets/plugins/jquery.ui/widget.js" merge="map_plugins"></script> | ||
| 83 | +<script src="/real_control_v2/assets/plugins/jquery.ui/mouse.js" merge="map_plugins"></script> | ||
| 84 | +<script src="/real_control_v2/assets/plugins/jquery.ui/resizable.js" merge="map_plugins"></script> | ||
| 85 | +<!-- 颜色选择器 --> | ||
| 86 | +<script src="/real_control_v2/assets/plugins/spectrum/spectrum.js" merge="map_plugins"></script> | ||
| 87 | +<!-- play back --> | ||
| 88 | +<script src="/real_control_v3/mapmonitor/js/playback.js" merge="map_custom_js"></script> | ||
| 0 | \ No newline at end of file | 89 | \ No newline at end of file |
src/main/resources/static/real_control_v3/mapmonitor/real_monitor/fragments/play_back_modal.html
0 → 100644
src/main/resources/static/real_control_v3/mapmonitor/real_monitor/fragments/playback.html
0 → 100644
| 1 | +<div> | ||
| 2 | +<script id="map_play_back_form_temp" type="text/html"> | ||
| 3 | +<div class="ct-form-modal"> | ||
| 4 | + <div class="uk-alert uk-alert-danger"> | ||
| 5 | + <i class="uk-icon-exclamation-circle"></i> 最多跨一天回放,请尽量小范围的查询 | ||
| 6 | + </div> | ||
| 7 | + <form class="uk-form uk-form-horizontal" style="padding: 15px;"> | ||
| 8 | + <div class="uk-grid"> | ||
| 9 | + <div class="uk-width-1-1"> | ||
| 10 | + <div class="uk-form-row"> | ||
| 11 | + <label class="uk-form-label">车辆编码</label> | ||
| 12 | + <div class="uk-form-controls"> | ||
| 13 | + <div class="uk-autocomplete uk-form" id="p_b_autocomp_car" style="width: 100%;"> | ||
| 14 | + <input type="text" name="nbbm" placeholder="车辆自编号" required> | ||
| 15 | + </div> | ||
| 16 | + </div> | ||
| 17 | + </div> | ||
| 18 | + </div> | ||
| 19 | + </div> | ||
| 20 | + <div class="uk-grid"> | ||
| 21 | + <div class="uk-width-1-1"> | ||
| 22 | + <div class="uk-form-row"> | ||
| 23 | + <label class="uk-form-label">起始时间</label> | ||
| 24 | + <div class="uk-form-controls"> | ||
| 25 | + <input type="date" name="sDate" required > | ||
| 26 | + <input type="time" name="sTime" required > | ||
| 27 | + </div> | ||
| 28 | + </div> | ||
| 29 | + </div> | ||
| 30 | + </div> | ||
| 31 | + <div class="uk-grid"> | ||
| 32 | + <div class="uk-width-1-1"> | ||
| 33 | + <div class="uk-form-row"> | ||
| 34 | + <label class="uk-form-label">截止时间</label> | ||
| 35 | + <div class="uk-form-controls"> | ||
| 36 | + <input type="date" name="eDate" required > | ||
| 37 | + <input type="time" name="eTime" required > | ||
| 38 | + </div> | ||
| 39 | + </div> | ||
| 40 | + </div> | ||
| 41 | + </div> | ||
| 42 | + <div class="b_c_submit"> | ||
| 43 | + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-play-circle"></i> 轨迹回放</button> | ||
| 44 | + </div> | ||
| 45 | + </form> | ||
| 46 | +</div> | ||
| 47 | +</script> | ||
| 48 | +</div> |
src/main/resources/static/real_control_v3/mapmonitor/real_monitor/fragments/real_monitor.html
0 → 100644
src/main/resources/static/real_control_v3/mapmonitor/real_monitor/js/gps_play_back.js
0 → 100644
| 1 | +var gb_map_playback = (function() { | ||
| 2 | + var gb_form_validation_opts = { | ||
| 3 | + framework: 'uikit', | ||
| 4 | + locale: 'zh_CN' | ||
| 5 | + }; | ||
| 6 | + | ||
| 7 | + var temps; | ||
| 8 | + $.get('/real_control_v2/mapmonitor/real_monitor/fragments/main.html', function(dom) { | ||
| 9 | + temps= gb_common.compileTempByDom(dom); | ||
| 10 | + }); | ||
| 11 | + | ||
| 12 | + var init = function() { | ||
| 13 | + var cont = '#mapRtContainer'; | ||
| 14 | + | ||
| 15 | + var htmlStr = temps['map_play_back_form_temp']({}); | ||
| 16 | + $('.play_back', cont).html(htmlStr); | ||
| 17 | + | ||
| 18 | + var f = $('.play_back form', cont).formValidation(gb_form_validation_opts); | ||
| 19 | + f.on('success.form.fv', function(e) { | ||
| 20 | + e.preventDefault(); | ||
| 21 | + var data = $(this).serializeJSON(); | ||
| 22 | + console.log(data); | ||
| 23 | + //查询历史gps数据 | ||
| 24 | + var fs = 'YYYY-MM-DDHH:mm', | ||
| 25 | + st = moment(data.sDate + data.sTime, fs).format('X'), | ||
| 26 | + et = moment(data.eDate + data.eTime, fs).format('X'), | ||
| 27 | + nbbm = data.nbbm; | ||
| 28 | + //isEnableFocus = params.enableFocus; | ||
| 29 | + $.ajax({ | ||
| 30 | + url: '/gps/gpsHistory/multiple', | ||
| 31 | + traditional: true, | ||
| 32 | + data: { | ||
| 33 | + nbbmArray: nbbm, | ||
| 34 | + st: st, | ||
| 35 | + et: et | ||
| 36 | + }, | ||
| 37 | + success: function(rs) { | ||
| 38 | + if (!rs || rs.length == 0) { | ||
| 39 | + alert('服务器没有返回数据,请检查你的输入参数!'); | ||
| 40 | + return; | ||
| 41 | + } | ||
| 42 | + console.log(rs); | ||
| 43 | + } | ||
| 44 | + }); | ||
| 45 | + }); | ||
| 46 | + | ||
| 47 | + //----------- 车辆 Autocomplete -------------- | ||
| 48 | + $.get('/freeLogin/basic/cars', function(rs) { | ||
| 49 | + gb_common.carAutocomplete($('#p_b_autocomp_car', cont), rs); | ||
| 50 | + }); | ||
| 51 | + | ||
| 52 | + //默认值,当前时间前2小时 | ||
| 53 | + var m = moment(), | ||
| 54 | + rq = 'YYYY-MM-DD', | ||
| 55 | + sj = 'HH:mm'; | ||
| 56 | + $('input[name=eDate]', cont).val(m.format(rq)); | ||
| 57 | + $('input[name=eTime]', cont).val(m.format('HH:mm')); | ||
| 58 | + $('input[name=sDate]', cont).val(m.subtract(2, 'hour').format(rq)); | ||
| 59 | + $('input[name=sTime]', cont).val(m.format(sj)); | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + return { | ||
| 63 | + init: init | ||
| 64 | + } | ||
| 65 | +})(); |
src/main/resources/static/real_control_v3/mapmonitor/real_monitor/real.html
0 → 100644
| 1 | +<link href="/assets/css/TrafficControl.css" rel="stylesheet" /> | ||
| 2 | +<link rel="stylesheet" href="/real_control_v2/mapmonitor/real_monitor/css/real.css" /> | ||
| 3 | +<div id="mapContainer"></div> | ||
| 4 | +<div class="map-system-msg z-depth-2"> | ||
| 5 | + 当前地图模块正在维护升级,请点击左侧 新窗口 按钮打开原版地图。 | ||
| 6 | +</div> | ||
| 7 | +<nav class="uk-navbar map-lt-tools z-depth-2"> | ||
| 8 | + <ul class="uk-navbar-nav"> | ||
| 9 | + <li class="uk-parent" data-uk-dropdown> | ||
| 10 | + <a><span id="curr_map_name">百度地图</span> <i class="uk-icon-caret-down"></i></a> | ||
| 11 | + <div class="uk-dropdown uk-dropdown-navbar" > | ||
| 12 | + <ul class="uk-nav uk-nav-navbar" id="mapTypeDrop"> | ||
| 13 | + <li data-id="baidu"><a>百度地图</a></li> | ||
| 14 | + <li data-id="gaode"><a>高德地图</a></li> | ||
| 15 | + </ul> | ||
| 16 | + </div> | ||
| 17 | + </li> | ||
| 18 | + <li id="trafficChangeBtn"><a>路况</a></li> | ||
| 19 | + <li id="openFullWindow"><a>新窗口</a></li> | ||
| 20 | + </ul> | ||
| 21 | +</nav> | ||
| 22 | + | ||
| 23 | +<div class="map_rt_wrap"> | ||
| 24 | + <ul class="uk-tab z-depth-2" data-uk-tab data-uk-switcher="{connect:'#mapRtContainer'}"> | ||
| 25 | + <li class="uk-active"><a>实时监控</a></li> | ||
| 26 | + <li class="uk-disabled"><a><i class="uk-icon-search"></i> 搜索</a></li> | ||
| 27 | + <li class="uk-disabled"><a><i class="uk-icon-history"></i> 回放</a></li> | ||
| 28 | + <li class="uk-disabled"><a>安全行车</a></li> | ||
| 29 | + </ul> | ||
| 30 | + <ul id="mapRtContainer" class="uk-switcher z-depth-2"> | ||
| 31 | + <li class="real_monitor"></li> | ||
| 32 | + <li class="search_panel">搜索</li> | ||
| 33 | + <li class="play_back">轨迹回放</li> | ||
| 34 | + <li>安全行车</li> | ||
| 35 | + </ul> | ||
| 36 | +</div> | ||
| 37 | +<!-- gps信息窗口 --> | ||
| 38 | +<script id="map_gps_info_win_temp" type="text/html"> | ||
| 39 | +<div class="gps_info_win"> | ||
| 40 | +<h5 style="color:#0E6AF9;"> | ||
| 41 | +{{if stationName!=null}} | ||
| 42 | + {{stationName}} | ||
| 43 | +{{else}} | ||
| 44 | + 未知站点 | ||
| 45 | +{{/if}} | ||
| 46 | +</h5> | ||
| 47 | +<h4 style="margin: 5px 0 5px 0;"> | ||
| 48 | + <span style="color: #0E6AF9;">{{nbbm}}</span> | ||
| 49 | +</h4> | ||
| 50 | +<p> | ||
| 51 | +营运状态:{{if state==0}}营运{{else}}非营运{{/if}} | ||
| 52 | +</p> | ||
| 53 | +<p> | ||
| 54 | +走向:{{if upDown==0}}上行{{else if upDown==1}}下行{{else}}未知走向{{/if}} | ||
| 55 | +</p> | ||
| 56 | +<p>速度:{{speed}}</p> | ||
| 57 | +<p>经度:{{lon}}</p> | ||
| 58 | +<p>纬度:{{lat}}</p> | ||
| 59 | + | ||
| 60 | +<p style="color: gray;">{{fromNow}} 更新</p> | ||
| 61 | +<hr> | ||
| 62 | +<p> | ||
| 63 | +{{if currSch!=null}} | ||
| 64 | + 路牌:{{currSch.lpName}} | ||
| 65 | +{{/if}} | ||
| 66 | +</p> | ||
| 67 | +<p class="banci-info"> | ||
| 68 | + {{if currSch!=null}}开往 {{currSch.zdzName}}{{/if}} | ||
| 69 | +</p> | ||
| 70 | +<p class="banci-info"> | ||
| 71 | +{{if nextSch!=null}} | ||
| 72 | + 下一班{{nextSch.qdzName}} {{nextSch.fcsj}} 发车 | ||
| 73 | +{{/if}} | ||
| 74 | +</p> | ||
| 75 | +<a href="javascript:lineGroup.toPlayBack('{{nbbm}}', '{{lineId}}')" class="link_to_pback" style="color:#006600;font-size:12px;">轨迹回放</a> | ||
| 76 | +</div> | ||
| 77 | +</script> | ||
| 78 | +<script src="/real_control_v2/mapmonitor/real_monitor/js/gps_play_back.js"></script> | ||
| 79 | +<script src="/real_control_v2/mapmonitor/real_monitor/js/real.js"></script> | ||
| 80 | +<script src="/real_control_v2/mapmonitor/real_monitor/js/map/iMap.js"></script> | ||
| 81 | +<script src="/real_control_v2/mapmonitor/real_monitor/js/map/iMap.js"></script> | ||
| 82 | +<script src="/real_control_v2/mapmonitor/real_monitor/js/map/platform/baidu.js"></script> | ||
| 83 | +<script src="/real_control_v2/mapmonitor/real_monitor/js/map/platform/gaode.js"></script> | ||
| 84 | +<script src="/real_control_v2/mapmonitor/real_monitor/js/gps_tree.js"></script> |