Commit b0ddb170b200513c2f0ea0cea3ed4cea892e68ea

Authored by 徐烜
1 parent d2f2c84d

添加误点提示功能,dubbo配置,相关pom.xml修改,后端GpsController调用dubbo服务,前端修改页面和js

@@ -194,6 +194,12 @@ @@ -194,6 +194,12 @@
194 <groupId>net.sourceforge.jexcelapi</groupId> 194 <groupId>net.sourceforge.jexcelapi</groupId>
195 <artifactId>jxl</artifactId> 195 <artifactId>jxl</artifactId>
196 <version>2.6.12</version> 196 <version>2.6.12</version>
  197 + <exclusions>
  198 + <exclusion>
  199 + <groupId>log4j</groupId>
  200 + <artifactId>log4j</artifactId>
  201 + </exclusion>
  202 + </exclusions>
197 </dependency> 203 </dependency>
198 <dependency> 204 <dependency>
199 <groupId>rhino</groupId> 205 <groupId>rhino</groupId>
@@ -295,6 +301,87 @@ @@ -295,6 +301,87 @@
295 <artifactId>jpinyin</artifactId> 301 <artifactId>jpinyin</artifactId>
296 <version>1.1.8</version> 302 <version>1.1.8</version>
297 </dependency> 303 </dependency>
  304 +
  305 + <!-- dubbo 需要的jar start -->
  306 + <dependency>
  307 + <groupId>com.alibaba</groupId>
  308 + <artifactId>dubbo</artifactId>
  309 + <!--<version>2.6.3</version>-->
  310 + <version>2.5.3</version>
  311 + <exclusions>
  312 + <exclusion>
  313 + <groupId>org.springframework</groupId>
  314 + <artifactId>spring</artifactId>
  315 + </exclusion>
  316 + <exclusion>
  317 + <groupId>log4j</groupId>
  318 + <artifactId>log4j</artifactId>
  319 + </exclusion>
  320 + </exclusions>
  321 + </dependency>
  322 +
  323 + <dependency>
  324 + <groupId>org.apache.zookeeper</groupId>
  325 + <artifactId>zookeeper</artifactId>
  326 + <version>3.4.5</version>
  327 + <exclusions>
  328 + <exclusion>
  329 + <groupId>log4j</groupId>
  330 + <artifactId>log4j</artifactId>
  331 + </exclusion>
  332 + <exclusion>
  333 + <groupId>org.slf4j</groupId>
  334 + <artifactId>slf4j-log4j12</artifactId>
  335 + </exclusion>
  336 + </exclusions>
  337 + </dependency>
  338 +
  339 + <dependency>
  340 + <groupId>com.101tec</groupId>
  341 + <artifactId>zkclient</artifactId>
  342 + <version>0.3</version>
  343 + <exclusions>
  344 + <exclusion>
  345 + <groupId>log4j</groupId>
  346 + <artifactId>log4j</artifactId>
  347 + </exclusion>
  348 + </exclusions>
  349 + </dependency>
  350 +
  351 + <!-- plan common工程依赖 -->
  352 + <dependency>
  353 + <groupId>com.bsth.control_v2</groupId>
  354 + <artifactId>plan_module-common</artifactId>
  355 + <version>1.0-SNAPSHOT</version>
  356 + </dependency>
  357 + <!-- plan common config 工程依赖 -->
  358 + <dependency>
  359 + <groupId>com.bsth.control_v2</groupId>
  360 + <artifactId>plan_module-common-config</artifactId>
  361 + <version>1.0-SNAPSHOT</version>
  362 + </dependency>
  363 + <!-- real common 依赖 -->
  364 + <dependency>
  365 + <groupId>com.bsth.control_v3</groupId>
  366 + <artifactId>real_module-common</artifactId>
  367 + <version>0.0.1-SNAPSHOT</version>
  368 + </dependency>
  369 + <dependency>
  370 + <groupId>org.slf4j</groupId>
  371 + <artifactId>slf4j-api</artifactId>
  372 + <version>1.7.7</version>
  373 + </dependency>
  374 + <dependency>
  375 + <groupId>ch.qos.logback</groupId>
  376 + <artifactId>logback-classic</artifactId>
  377 + <version>1.1.3</version>
  378 + </dependency>
  379 + <dependency>
  380 + <groupId>org.slf4j</groupId>
  381 + <artifactId>log4j-over-slf4j</artifactId>
  382 + <version>1.7.7</version>
  383 + </dependency>
  384 +
298 </dependencies> 385 </dependencies>
299 386
300 <dependencyManagement> 387 <dependencyManagement>
src/main/java/com/bsth/controller/gps/GpsController.java
1 package com.bsth.controller.gps; 1 package com.bsth.controller.gps;
2 2
  3 +import com.alibaba.dubbo.config.annotation.Reference;
  4 +import com.bsth.control_v3.real_module.common.dto.VehicleArrivalStopRealMonitorDto;
  5 +import com.bsth.control_v3.real_module.common.service.LateReminderServiceFacade;
3 import com.bsth.data.BasicData; 6 import com.bsth.data.BasicData;
4 import com.bsth.data.gpsdata_v2.GpsRealData; 7 import com.bsth.data.gpsdata_v2.GpsRealData;
5 import com.bsth.data.gpsdata_v2.entity.GpsEntity; 8 import com.bsth.data.gpsdata_v2.entity.GpsEntity;
@@ -10,6 +13,8 @@ import com.bsth.data.schedule.e_state_check.entity.SCodeInfo; @@ -10,6 +13,8 @@ import com.bsth.data.schedule.e_state_check.entity.SCodeInfo;
10 import com.bsth.service.gps.GpsService; 13 import com.bsth.service.gps.GpsService;
11 import com.bsth.service.gps.entity.GpsSpeed; 14 import com.bsth.service.gps.entity.GpsSpeed;
12 import com.google.common.base.Splitter; 15 import com.google.common.base.Splitter;
  16 +import org.slf4j.Logger;
  17 +import org.slf4j.LoggerFactory;
13 import org.springframework.beans.factory.annotation.Autowired; 18 import org.springframework.beans.factory.annotation.Autowired;
14 import org.springframework.web.bind.annotation.*; 19 import org.springframework.web.bind.annotation.*;
15 20
@@ -23,6 +28,8 @@ import java.util.Map; @@ -23,6 +28,8 @@ import java.util.Map;
23 @RestController 28 @RestController
24 @RequestMapping("gps") 29 @RequestMapping("gps")
25 public class GpsController { 30 public class GpsController {
  31 + /** 日志处理器 */
  32 + private static final Logger LOG = LoggerFactory.getLogger(GpsController.class);
26 33
27 @Autowired 34 @Autowired
28 GpsRealData gpsRealData; 35 GpsRealData gpsRealData;
@@ -33,6 +40,9 @@ public class GpsController { @@ -33,6 +40,9 @@ public class GpsController {
33 @Autowired 40 @Autowired
34 OverspeedProcess overspeedProcess; 41 OverspeedProcess overspeedProcess;
35 42
  43 + @Reference
  44 + LateReminderServiceFacade lateReminderServiceFacade;
  45 +
36 @RequestMapping(value = "/real/all") 46 @RequestMapping(value = "/real/all")
37 public Map<String, Object> search(@RequestParam Map<String, Object> map, 47 public Map<String, Object> search(@RequestParam Map<String, Object> map,
38 @RequestParam(defaultValue = "0") int page, 48 @RequestParam(defaultValue = "0") int page,
@@ -62,8 +72,21 @@ public class GpsController { @@ -62,8 +72,21 @@ public class GpsController {
62 //班次站点检查信息 72 //班次站点检查信息
63 List<SCodeInfo> scis = ScheduleStationCodeChecker.findByLineIdx(lineArray); 73 List<SCodeInfo> scis = ScheduleStationCodeChecker.findByLineIdx(lineArray);
64 74
  75 + // 扩展到达站预测时间(使用外部模块处理)
  76 + Map<String, VehicleArrivalStopRealMonitorDto> arrivalStopRealMonitorMap = new HashMap<>();
  77 + if (lateReminderServiceFacade == null) {
  78 + LOG.warn("LateReminderServiceFacade服务未导入,请检查dubbo相关配置!");
  79 + }
  80 + try {
  81 + // 按照车牌作为key,映射map
  82 + arrivalStopRealMonitorMap.putAll(lateReminderServiceFacade.getVehicleArrivalStopRealMonitorInfo_cph(lineArray));
  83 + } catch (Exception exp) {
  84 + LOG.warn("LateReminderServiceFacade远端调用异常,请检查dubbo服务部署情况!", exp);
  85 + }
  86 +
65 rs.put("gpsList", gpsList); 87 rs.put("gpsList", gpsList);
66 rs.put("overspeedList", overspeedList); 88 rs.put("overspeedList", overspeedList);
  89 + rs.put("arrivalStopRealMonitorMap", arrivalStopRealMonitorMap);
67 rs.put("scis", scis); 90 rs.put("scis", scis);
68 return rs; 91 return rs;
69 } 92 }
src/main/resources/application-dev.properties
@@ -2,6 +2,8 @@ server.port=9088 @@ -2,6 +2,8 @@ server.port=9088
2 management.port= 9001 2 management.port= 9001
3 management.address= 127.0.0.1 3 management.address= 127.0.0.1
4 4
  5 +dubbo.use=false
  6 +
5 spring.jpa.hibernate.ddl-auto= update 7 spring.jpa.hibernate.ddl-auto= update
6 spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy 8 spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy
7 #DATABASE 9 #DATABASE
src/main/resources/application-prod.properties
@@ -2,6 +2,8 @@ server.port=9088 @@ -2,6 +2,8 @@ server.port=9088
2 management.port= 9001 2 management.port= 9001
3 management.address= 127.0.0.1 3 management.address= 127.0.0.1
4 4
  5 +dubbo.use=true
  6 +
5 spring.jpa.hibernate.ddl-auto= none 7 spring.jpa.hibernate.ddl-auto= none
6 spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy 8 spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy
7 #DATABASE 9 #DATABASE
src/main/resources/dubbo/config-dev.properties 0 → 100644
  1 +# application名字
  2 +spring.dubbo.application.name=bsth_control_v_multi_service
  3 +# zookeeper注册中心地址
  4 +spring.dubbo.registry=zookeeper://127.0.0.1:2181
  5 +# protocol配置
  6 +spring.dubbo.protocol.name=dubbo
  7 +spring.dubbo.protocol.port=30881
  8 +
  9 +#----------- dubbo:consumer 性能调优选项 -------------#
  10 +# 远程服务调用超时时间,单位毫秒,这里设置30分钟
  11 +spring.dubbo.consumer.timeout=1800000
  12 +# 远程服务调用重试次数,0表示不需要重试
  13 +spring.dubbo.consumer.retries=0
  14 +#----------- dubbo:consumer 服务治理选项 -------------#
  15 +# 启动不检查提供者是否存在
  16 +spring.dubbo.consumer.check=false
src/main/resources/dubbo/config-prod.properties 0 → 100644
  1 +# application名字
  2 +spring.dubbo.application.name=bsth_control_v_multi_service
  3 +# zookeeper注册中心地址
  4 +spring.dubbo.registry=zookeeper://127.0.0.1:2181
  5 +# protocol配置
  6 +spring.dubbo.protocol.name=dubbo
  7 +spring.dubbo.protocol.port=30881
  8 +
  9 +#----------- dubbo:consumer 性能调优选项 -------------#
  10 +# 远程服务调用超时时间,单位毫秒,这里设置30分钟
  11 +spring.dubbo.consumer.timeout=1800000
  12 +# 远程服务调用重试次数,0表示不需要重试
  13 +spring.dubbo.consumer.retries=0
  14 +#----------- dubbo:consumer 服务治理选项 -------------#
  15 +# 启动不检查提供者是否存在
  16 +spring.dubbo.consumer.check=false
src/main/resources/static/real_control_v2/fragments/home/tooltip.html
@@ -17,7 +17,13 @@ @@ -17,7 +17,13 @@
17 <span class="abnormal-text">已离线</span> 17 <span class="abnormal-text">已离线</span>
18 {{/if}} 18 {{/if}}
19 </a> 19 </a>
  20 +
  21 + {{if _as_isLate}}
  22 + <button class="uk-button uk-button-mini uk-button-primary">预测误点</button>
  23 + {{/if}}
20 </div> 24 </div>
  25 +
  26 +
21 <div> 27 <div>
22 <span class="field">车牌号:</span>{{plateNo}} 28 <span class="field">车牌号:</span>{{plateNo}}
23 </div> 29 </div>
@@ -47,9 +53,18 @@ @@ -47,9 +53,18 @@
47 <span class="field">速度:</span>{{speed>99?'..':speed}}</div> 53 <span class="field">速度:</span>{{speed>99?'..':speed}}</div>
48 <div> 54 <div>
49 <span class="field">时间:</span>{{dateStr}}</div> 55 <span class="field">时间:</span>{{dateStr}}</div>
50 - {{if expectStopTime!=null}}  
51 - <div>  
52 - 预计 {{expectStopTime}} 分钟到达终点</div> 56 + <!--{{if expectStopTime!=null}}-->
  57 + <!--<div>-->
  58 + <!--预计 {{expectStopTime}} 分钟到达终点</div>-->
  59 + <!--{{/if}}-->
  60 +
  61 +
  62 + {{if _plan_ftime}}
  63 + <div>计划 {{_plan_ftime}} 到达终点站</div>
  64 + {{/if}}
  65 +
  66 + {{if _as_ftime}}
  67 + <div>预计 {{_as_ftime}} 到达终点站</div>
53 {{/if}} 68 {{/if}}
54 </div> 69 </div>
55 70
src/main/resources/static/real_control_v2/js/data/data_gps.js
@@ -61,6 +61,9 @@ var gb_data_gps = (function () { @@ -61,6 +61,9 @@ var gb_data_gps = (function () {
61 this.sch = schArray[this.schId]; 61 this.sch = schArray[this.schId];
62 } 62 }
63 63
  64 + // 误点提示信息
  65 + refreshData_lateReminder(rs, this);
  66 +
64 //时间格式化 67 //时间格式化
65 this.dateStr = moment(this.timestamp).format('YYYY-MM-DD HH:mm:ss'); 68 this.dateStr = moment(this.timestamp).format('YYYY-MM-DD HH:mm:ss');
66 realData[this.deviceId] = this; 69 realData[this.deviceId] = this;
@@ -81,6 +84,36 @@ var gb_data_gps = (function () { @@ -81,6 +84,36 @@ var gb_data_gps = (function () {
81 84
82 }; 85 };
83 86
  87 + var refreshData_lateReminder = function(rs, gps) {
  88 + // 到站实时数据信息(用于计算误点)
  89 + var _arrivalStopRealMonitorMap = rs.arrivalStopRealMonitorMap;
  90 +
  91 + // 获取cph
  92 + var _cph = gps.nbbm && gb_data_basic.nbbm2PlateMap()[gps.nbbm];
  93 + // 获取到站提示信息
  94 + var _info = _cph && _arrivalStopRealMonitorMap[_cph];
  95 +
  96 + // 获取预计到终点站时间
  97 + var _future_time = _info && _info.toFutureStopTime && moment(_info.toFutureStopTime);
  98 + // 获取计划到终点站时间
  99 + var _plan_time = gps.sch && gps.sch.zdsjT && moment(gps.sch.zdsjT);
  100 +
  101 + // 设置误点提示
  102 + if (_future_time && _plan_time) {
  103 + if (_future_time.isAfter(_plan_time)) {
  104 + gps._as_isLate = true;
  105 + }
  106 + }
  107 +
  108 + // 设置计划到终点站时间提示
  109 + gps._plan_ftime = _plan_time && _plan_time.format("HH:mm");
  110 + // 设置预计到终点站时间提示
  111 + gps._as_ftime = _future_time && _future_time.format("HH:mm");
  112 +
  113 + // console.log(gps.sch);
  114 +
  115 + };
  116 +
84 var startFixedTime; 117 var startFixedTime;
85 var fixedTimeRefresh = function () { 118 var fixedTimeRefresh = function () {
86 if (startFixedTime) 119 if (startFixedTime)
src/main/resources/static/real_control_v2/js/north/tabs.js
@@ -68,7 +68,34 @@ var gb_tabs = (function() { @@ -68,7 +68,34 @@ var gb_tabs = (function() {
68 //文件载入完毕 68 //文件载入完毕
69 res_load_ep.emitLater('load_tab'); 69 res_load_ep.emitLater('load_tab');
70 70
  71 + // 根据gps的相关数据,切换tab页面
  72 + var _trigger_tab_Fun = function(gps) {
  73 + // tab跳转
  74 + var tabIndex = 0;
  75 + var lineCode = gps.lineId;
  76 + $('.north-tabs .uk-tab li.tab-line').each(function(index, element) {
  77 + var _code = $(element).data('code');
  78 + if (_code == lineCode) {
  79 + // li.tab-line 是从第3个tab页开始的
  80 + tabIndex = index + 2;
  81 + return false;
  82 + }
  83 + });
  84 + UIkit.switcher($('.north-tabs>ul.uk-tab')).show(tabIndex);
  85 +
  86 + // 班次自动选择
  87 + var schId = gps.schId;
  88 + var sch = gb_schedule_table.findScheduleByLine(lineCode)[schId];
  89 + var dl = gb_schedule_table.scroToDl(sch);
  90 + gb_schedule_table.reset_drag_active_all(dl);
  91 + dl.find('dd:eq(5)').trigger('click');
  92 +
  93 + // $('.line_schedule[data-id=' + lineCode + '] dl[data-id=' + gps.schId + ']').find('dd:eq(5)').trigger('click');
  94 +
  95 + };
  96 +
71 return { 97 return {
72 - init: init 98 + init: init,
  99 + triggerTab: _trigger_tab_Fun
73 }; 100 };
74 })(); 101 })();
src/main/resources/static/real_control_v2/js/utils/svg_chart.js
@@ -297,7 +297,7 @@ var gb_svg_chart = (function () { @@ -297,7 +297,7 @@ var gb_svg_chart = (function () {
297 297
298 abmStatus = this['abnormalStatus']; 298 abmStatus = this['abnormalStatus'];
299 suffix = ''; 299 suffix = '';
300 - if(abmStatus != 'offline'){ 300 + if(abmStatus != 'offline') {
301 this['abnormalClaszz'] = true; 301 this['abnormalClaszz'] = true;
302 if(abmStatus=='outBounds') 302 if(abmStatus=='outBounds')
303 suffix = '界'; 303 suffix = '界';
@@ -307,6 +307,12 @@ var gb_svg_chart = (function () { @@ -307,6 +307,12 @@ var gb_svg_chart = (function () {
307 suffix = '掉'; 307 suffix = '掉';
308 else 308 else
309 this['abnormalClaszz'] = false; 309 this['abnormalClaszz'] = false;
  310 +
  311 + // 误点提示
  312 + if (this['_as_isLate']) {
  313 + this['abnormalClaszz'] = true;
  314 + suffix += "误"; // suffix叠加
  315 + }
310 } 316 }
311 else 317 else
312 this['abnormalClaszz'] = false; 318 this['abnormalClaszz'] = false;
src/main/resources/static/real_control_v2/js/utils/svg_chart_tooltip.js
@@ -45,6 +45,14 @@ var gb_svg_tooltip = (function () { @@ -45,6 +45,14 @@ var gb_svg_tooltip = (function () {
45 visible: function () { 45 visible: function () {
46 show_baidu_map($('.tip_map_wrap', this)[0], gps); 46 show_baidu_map($('.tip_map_wrap', this)[0], gps);
47 rect.dblclick(fiexdTip); 47 rect.dblclick(fiexdTip);
  48 +
  49 + if (gps._as_isLate) { // 存在误点可点击
  50 + var _tool_tip_ = this;
  51 + $('button', _tool_tip_).click(function() {
  52 + gb_tabs.triggerTab(gps);
  53 + $(_tool_tip_).qtip("hide");
  54 + });
  55 + }
48 } 56 }
49 } 57 }
50 }); 58 });
src/main/resources/static/real_control_v2_mobile/js/utils/svg_chart_tooltip.js
@@ -14,6 +14,7 @@ var gb_svg_tooltip = (function () { @@ -14,6 +14,7 @@ var gb_svg_tooltip = (function () {
14 return; 14 return;
15 var gps = gb_data_gps.findOne($(this).attr('_id').split('_')[1]); 15 var gps = gb_data_gps.findOne($(this).attr('_id').split('_')[1]);
16 addPlateNo(gps); 16 addPlateNo(gps);
  17 + addLateReminder(gps);
17 $(this).qtip({ 18 $(this).qtip({
18 show: { 19 show: {
19 ready: true, 20 ready: true,
@@ -219,6 +220,36 @@ var gb_svg_tooltip = (function () { @@ -219,6 +220,36 @@ var gb_svg_tooltip = (function () {
219 }catch (e){} 220 }catch (e){}
220 } 221 }
221 222
  223 + /**
  224 + * 为GPS附加误点提示功能
  225 + * @param gpsArray
  226 + */
  227 + function addLateReminder(gpsArray) {
  228 + if (!isArray(gpsArray))
  229 + gpsArray = [gpsArray];
  230 + try {
  231 + $.each(gpsArray, function() {
  232 + // 计算误点提示的相关字段
  233 + if (this.plateNo) {
  234 + var _info = gb_data_gps.getArrivalStopRealMonitorInfoByCph(this.plateNo);
  235 + if (_info) {
  236 + var _future_time = moment(_info.toFutureStopTime);
  237 + var _plan_time = moment(this.sch.zdsjT);
  238 + if (_future_time.isAfter(_plan_time)) {
  239 + // 可能误点
  240 + this._as_isLate = true;
  241 + }
  242 + this._as_ftime = _future_time.format("hh:mm");
  243 + }
  244 + }
  245 +
  246 + });
  247 + } catch (e) {
  248 +
  249 + }
  250 +
  251 + }
  252 +
222 return { 253 return {
223 update: updateFixedTip, 254 update: updateFixedTip,
224 refresh: refresh, 255 refresh: refresh,