Commit adc2ab19dca45610d316cc0994fac0829e7bd174

Authored by 潘钊
1 parent ea43f1bc

update

src/main/java/com/bsth/controller/DeviceGpsController.java
1 package com.bsth.controller; 1 package com.bsth.controller;
2 2
3 -import java.io.BufferedOutputStream;  
4 -import java.io.BufferedReader;  
5 -import java.io.File;  
6 -import java.io.FileInputStream;  
7 -import java.io.IOException;  
8 -import java.io.InputStreamReader;  
9 -import java.io.OutputStream;  
10 -import java.text.SimpleDateFormat;  
11 -import java.util.ArrayList;  
12 -import java.util.Date;  
13 -import java.util.HashMap;  
14 -import java.util.List;  
15 -import java.util.Map;  
16 -  
17 -import javax.servlet.http.HttpServletRequest;  
18 -import javax.servlet.http.HttpServletResponse;  
19 -  
20 -import org.apache.commons.lang.StringEscapeUtils;  
21 -import org.apache.poi.hssf.usermodel.HSSFCell;  
22 -import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
23 -import org.apache.poi.hssf.usermodel.HSSFRow;  
24 -import org.apache.poi.hssf.usermodel.HSSFSheet;  
25 -import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
26 -import org.springframework.beans.BeanUtils;  
27 -import org.springframework.beans.factory.annotation.Autowired;  
28 -import org.springframework.util.StringUtils;  
29 -import org.springframework.web.bind.annotation.PathVariable;  
30 -import org.springframework.web.bind.annotation.RequestMapping;  
31 -import org.springframework.web.bind.annotation.RequestMethod;  
32 -import org.springframework.web.bind.annotation.RequestParam;  
33 -import org.springframework.web.bind.annotation.RestController;  
34 -import org.springframework.web.multipart.MultipartFile;  
35 -  
36 import com.bsth.data.gpsdata.GpsEntity; 3 import com.bsth.data.gpsdata.GpsEntity;
37 import com.bsth.data.gpsdata.GpsRealData; 4 import com.bsth.data.gpsdata.GpsRealData;
38 import com.fasterxml.jackson.core.JsonParseException; 5 import com.fasterxml.jackson.core.JsonParseException;
39 import com.fasterxml.jackson.databind.JsonMappingException; 6 import com.fasterxml.jackson.databind.JsonMappingException;
40 import com.fasterxml.jackson.databind.ObjectMapper; 7 import com.fasterxml.jackson.databind.ObjectMapper;
41 -import com.fasterxml.jackson.databind.util.BeanUtil; 8 +import org.apache.commons.lang.StringEscapeUtils;
  9 +import org.apache.poi.hssf.usermodel.*;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.util.StringUtils;
  12 +import org.springframework.web.bind.annotation.*;
  13 +import org.springframework.web.multipart.MultipartFile;
  14 +
  15 +import javax.servlet.http.HttpServletRequest;
  16 +import javax.servlet.http.HttpServletResponse;
  17 +import java.io.*;
  18 +import java.text.SimpleDateFormat;
  19 +import java.util.*;
42 20
43 @RestController 21 @RestController
44 @RequestMapping("devicegps") 22 @RequestMapping("devicegps")
@@ -121,7 +99,7 @@ public class DeviceGpsController { @@ -121,7 +99,7 @@ public class DeviceGpsController {
121 try { 99 try {
122 data = new ObjectMapper().readValue(json, List.class); 100 data = new ObjectMapper().readValue(json, List.class);
123 for (Map<String, Object> info : data) { 101 for (Map<String, Object> info : data) {
124 - info.put("detail", gpsRealData.findByDeviceId((String)info.get("deviceId"))); 102 + info.put("detail", gpsRealData.get((String)info.get("deviceId")));
125 } 103 }
126 104
127 res.put("errCode", 0); 105 res.put("errCode", 0);
src/main/java/com/bsth/data/gpsdata/GpsRealData.java
1 package com.bsth.data.gpsdata; 1 package com.bsth.data.gpsdata;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONObject;  
5 import com.bsth.data.BasicData; 3 import com.bsth.data.BasicData;
6 import com.bsth.data.forecast.ForecastRealServer; 4 import com.bsth.data.forecast.ForecastRealServer;
7 -import com.bsth.data.gpsdata.arrival.GpsRealAnalyse;  
8 -import com.bsth.data.gpsdata.recovery.GpsDataRecovery; 5 +import com.bsth.data.gpsdata.thread.GpsDataLoaderThread;
9 import com.bsth.data.schedule.DayOfSchedule; 6 import com.bsth.data.schedule.DayOfSchedule;
10 import com.bsth.entity.realcontrol.ScheduleRealInfo; 7 import com.bsth.entity.realcontrol.ScheduleRealInfo;
11 -import com.bsth.util.ConfigUtil;  
12 import com.google.common.collect.TreeMultimap; 8 import com.google.common.collect.TreeMultimap;
13 import org.apache.commons.lang3.StringUtils; 9 import org.apache.commons.lang3.StringUtils;
14 -import org.apache.http.HttpEntity;  
15 -import org.apache.http.client.methods.CloseableHttpResponse;  
16 -import org.apache.http.client.methods.HttpGet;  
17 -import org.apache.http.impl.client.CloseableHttpClient;  
18 -import org.apache.http.impl.client.HttpClients;  
19 import org.slf4j.Logger; 10 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory; 11 import org.slf4j.LoggerFactory;
21 import org.springframework.beans.factory.annotation.Autowired; 12 import org.springframework.beans.factory.annotation.Autowired;
22 import org.springframework.boot.CommandLineRunner; 13 import org.springframework.boot.CommandLineRunner;
23 import org.springframework.stereotype.Component; 14 import org.springframework.stereotype.Component;
24 15
25 -import java.io.BufferedReader;  
26 -import java.io.InputStreamReader;  
27 import java.util.*; 16 import java.util.*;
28 17
29 /** 18 /**
@@ -42,11 +31,8 @@ public class GpsRealData implements CommandLineRunner { @@ -42,11 +31,8 @@ public class GpsRealData implements CommandLineRunner {
42 //按线路分组设备号 31 //按线路分组设备号
43 private static TreeMultimap<String, String> lineCode2Devices; 32 private static TreeMultimap<String, String> lineCode2Devices;
44 33
45 - // 网关数据接口地址  
46 - private static String url;  
47 -  
48 @Autowired 34 @Autowired
49 - GpsDataLoader gpsDataLoader; 35 + GpsDataLoaderThread gpsDataLoader;
50 36
51 @Autowired 37 @Autowired
52 DayOfSchedule dayOfSchedule; 38 DayOfSchedule dayOfSchedule;
@@ -60,13 +46,15 @@ public class GpsRealData implements CommandLineRunner { @@ -60,13 +46,15 @@ public class GpsRealData implements CommandLineRunner {
60 public GpsRealData() { 46 public GpsRealData() {
61 gpsMap = new HashMap<>(); 47 gpsMap = new HashMap<>();
62 lineCode2Devices = TreeMultimap.create(); 48 lineCode2Devices = TreeMultimap.create();
63 - url = ConfigUtil.get("http.gps.real.url");  
64 } 49 }
65 50
66 @Override 51 @Override
67 public void run(String... arg0) throws Exception { 52 public void run(String... arg0) throws Exception {
68 logger.info("gpsDataLoader,20,5"); 53 logger.info("gpsDataLoader,20,5");
  54 + //定时从网关获取GPS数据
69 //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 5, TimeUnit.SECONDS); 55 //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 5, TimeUnit.SECONDS);
  56 + //定时扫描掉离线
  57 +
70 } 58 }
71 59
72 public void put(GpsEntity gps) { 60 public void put(GpsEntity gps) {
@@ -146,10 +134,6 @@ public class GpsRealData implements CommandLineRunner { @@ -146,10 +134,6 @@ public class GpsRealData implements CommandLineRunner {
146 return gpsMap.keySet(); 134 return gpsMap.keySet();
147 } 135 }
148 136
149 - public GpsEntity findByDeviceId(String deviceId) {  
150 - return gpsMap.get(deviceId);  
151 - }  
152 -  
153 public Collection<GpsEntity> all() { 137 public Collection<GpsEntity> all() {
154 return gpsMap.values(); 138 return gpsMap.values();
155 } 139 }
@@ -157,87 +141,4 @@ public class GpsRealData implements CommandLineRunner { @@ -157,87 +141,4 @@ public class GpsRealData implements CommandLineRunner {
157 public void remove(String device) { 141 public void remove(String device) {
158 gpsMap.remove(device); 142 gpsMap.remove(device);
159 } 143 }
160 -  
161 - @Component  
162 - public static class GpsDataLoader extends Thread {  
163 -  
164 - Logger logger = LoggerFactory.getLogger(GpsDataLoader.class);  
165 -  
166 - @Autowired  
167 - GpsRealData gpsRealData;  
168 -  
169 - @Autowired  
170 - GpsRealAnalyse gpsRealAnalyse;  
171 -  
172 - @Override  
173 - public void run() {  
174 - try {  
175 - //如果正在恢复数据  
176 - if (GpsDataRecovery.run)  
177 - return;  
178 -  
179 - load();  
180 - } catch (Exception e) {  
181 - logger.error("", e);  
182 - }  
183 - }  
184 -  
185 - public void load() throws Exception {  
186 - List<GpsEntity> list = null;  
187 - List<GpsEntity> updateList = new ArrayList<>();  
188 - CloseableHttpClient httpClient = null;  
189 - CloseableHttpResponse response = null;  
190 - try {  
191 - httpClient = HttpClients.createDefault();  
192 - HttpGet get = new HttpGet(url);  
193 -  
194 - response = httpClient.execute(get);  
195 -  
196 - HttpEntity entity = response.getEntity();  
197 - if (null != entity) {  
198 - BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));  
199 - StringBuffer stringBuffer = new StringBuffer();  
200 - String str = "";  
201 - while ((str = br.readLine()) != null)  
202 - stringBuffer.append(str);  
203 -  
204 - JSONObject jsonObj = JSON.parseObject(stringBuffer.toString());  
205 -  
206 - if (jsonObj != null)  
207 - list = JSON.parseArray(jsonObj.getString("data"), GpsEntity.class);  
208 -  
209 - String nbbm;  
210 - GpsEntity old;  
211 - for (GpsEntity gps : list) {  
212 - //没有设备号  
213 - if (StringUtils.isBlank(gps.getDeviceId()))  
214 - continue;  
215 -  
216 - old = gpsMap.get(gps.getDeviceId());  
217 - if (old != null &&  
218 - old.getTimestamp() == gps.getTimestamp())  
219 - continue;  
220 -  
221 - nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId());  
222 - if (StringUtils.isBlank(nbbm))  
223 - gps.setIncomplete(true);//标记为异常数据  
224 - else  
225 - gps.setNbbm(nbbm);  
226 - //有更新的点位  
227 - updateList.add(gps);  
228 - }  
229 - //分析数据  
230 - gpsRealAnalyse.analyse(updateList);  
231 - } else  
232 - logger.error("real gps result is null");  
233 - } catch (Exception e) {  
234 - logger.error("", e);  
235 - } finally {  
236 - if (null != httpClient)  
237 - httpClient.close();  
238 - if (null != response)  
239 - response.close();  
240 - }  
241 - }  
242 - }  
243 } 144 }
244 \ No newline at end of file 145 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/thread/GpsDataLoaderThread.java 0 → 100644
  1 +package com.bsth.data.gpsdata.thread;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.alibaba.fastjson.JSONObject;
  5 +import com.bsth.data.BasicData;
  6 +import com.bsth.data.gpsdata.GpsEntity;
  7 +import com.bsth.data.gpsdata.GpsRealData;
  8 +import com.bsth.data.gpsdata.arrival.GpsRealAnalyse;
  9 +import com.bsth.data.gpsdata.recovery.GpsDataRecovery;
  10 +import com.bsth.util.ConfigUtil;
  11 +import org.apache.commons.lang3.StringUtils;
  12 +import org.apache.http.HttpEntity;
  13 +import org.apache.http.client.methods.CloseableHttpResponse;
  14 +import org.apache.http.client.methods.HttpGet;
  15 +import org.apache.http.impl.client.CloseableHttpClient;
  16 +import org.apache.http.impl.client.HttpClients;
  17 +import org.slf4j.Logger;
  18 +import org.slf4j.LoggerFactory;
  19 +import org.springframework.beans.factory.annotation.Autowired;
  20 +import org.springframework.stereotype.Component;
  21 +
  22 +import java.io.BufferedReader;
  23 +import java.io.InputStreamReader;
  24 +import java.util.ArrayList;
  25 +import java.util.List;
  26 +
  27 +/**
  28 + * Created by panzhao on 2017/1/11.
  29 + */
  30 +@Component
  31 +public class GpsDataLoaderThread extends Thread {
  32 +
  33 + Logger logger = LoggerFactory.getLogger(GpsDataLoaderThread.class);
  34 +
  35 + /**
  36 + * 构造函数
  37 + */
  38 + public GpsDataLoaderThread() {
  39 + url = ConfigUtil.get("http.gps.real.url");
  40 + }
  41 +
  42 + // 网关数据接口地址
  43 + private static String url;
  44 +
  45 + @Autowired
  46 + GpsRealData gpsRealData;
  47 +
  48 + @Autowired
  49 + GpsRealAnalyse gpsRealAnalyse;
  50 +
  51 + @Override
  52 + public void run() {
  53 + try {
  54 + //如果正在恢复数据
  55 + if (GpsDataRecovery.run)
  56 + return;
  57 +
  58 + load();
  59 + } catch (Exception e) {
  60 + logger.error("", e);
  61 + }
  62 + }
  63 +
  64 + public void load() throws Exception {
  65 + List<GpsEntity> list = null;
  66 + List<GpsEntity> updateList = new ArrayList<>();
  67 + CloseableHttpClient httpClient = null;
  68 + CloseableHttpResponse response = null;
  69 + try {
  70 + httpClient = HttpClients.createDefault();
  71 + HttpGet get = new HttpGet(url);
  72 +
  73 + response = httpClient.execute(get);
  74 +
  75 + HttpEntity entity = response.getEntity();
  76 + if (null != entity) {
  77 + BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
  78 + StringBuffer stringBuffer = new StringBuffer();
  79 + String str = "";
  80 + while ((str = br.readLine()) != null)
  81 + stringBuffer.append(str);
  82 +
  83 + JSONObject jsonObj = JSON.parseObject(stringBuffer.toString());
  84 +
  85 + if (jsonObj != null)
  86 + list = JSON.parseArray(jsonObj.getString("data"), GpsEntity.class);
  87 +
  88 + String nbbm;
  89 + GpsEntity old;
  90 + for (GpsEntity gps : list) {
  91 + //没有设备号
  92 + if (StringUtils.isBlank(gps.getDeviceId()))
  93 + continue;
  94 +
  95 + old = gpsRealData.get(gps.getDeviceId());
  96 + if (old != null &&
  97 + old.getTimestamp() == gps.getTimestamp())
  98 + continue;
  99 +
  100 + nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId());
  101 + if (StringUtils.isBlank(nbbm))
  102 + gps.setIncomplete(true);//标记为异常数据
  103 + else
  104 + gps.setNbbm(nbbm);
  105 + //有更新的点位
  106 + updateList.add(gps);
  107 + }
  108 + //分析数据
  109 + gpsRealAnalyse.analyse(updateList);
  110 + } else
  111 + logger.error("real gps result is null");
  112 + } catch (Exception e) {
  113 + logger.error("", e);
  114 + } finally {
  115 + if (null != httpClient)
  116 + httpClient.close();
  117 + if (null != response)
  118 + response.close();
  119 + }
  120 + }
  121 +}
0 \ No newline at end of file 122 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/thread/OfflineMonitorThread.java 0 → 100644
  1 +package com.bsth.data.gpsdata.thread;
  2 +
  3 +import com.bsth.data.gpsdata.GpsEntity;
  4 +import com.bsth.data.gpsdata.GpsRealData;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +
  7 +import java.util.Collection;
  8 +
  9 +/**
  10 + * GPS掉离线监控
  11 + * Created by panzhao on 2017/1/11.
  12 + */
  13 +public class OfflineMonitorThread extends Thread{
  14 +
  15 + @Autowired
  16 + GpsRealData gpsRealData;
  17 +
  18 + //有任务时 掉线阈值
  19 + private final static int LOSE_TIME = 1000 * 60 * 2;
  20 +
  21 + //无任务时 离线阈值
  22 + private final static int OFFLINE_TIME = 1000 * 60 * 10;
  23 +
  24 + @Override
  25 + public void run() {
  26 + long t = System.currentTimeMillis();
  27 + Collection<GpsEntity> list = gpsRealData.all();
  28 +
  29 + String state;
  30 + for(GpsEntity gps : list){
  31 + state = gps.getAbnormalStatus();
  32 +
  33 + if(state.equals("offline"))
  34 + continue;
  35 +
  36 +
  37 + //if(state.equals("lose"))
  38 + //if(!state.equals("lose"))
  39 + //if(state.equals(""))
  40 + //if(gps.getTimestamp())
  41 + //if(gps.getAbnormalStatus().equals("lose"))
  42 + }
  43 + }
  44 +}
src/main/java/com/bsth/service/directive/DirectiveServiceImpl.java
1 package com.bsth.service.directive; 1 package com.bsth.service.directive;
2 2
3 -import java.util.ArrayList;  
4 -import java.util.Collection;  
5 -import java.util.Collections;  
6 -import java.util.Comparator;  
7 -import java.util.Date;  
8 -import java.util.HashMap;  
9 -import java.util.List;  
10 -import java.util.Map;  
11 -  
12 -import org.apache.commons.lang3.StringUtils;  
13 -import org.joda.time.format.DateTimeFormat;  
14 -import org.joda.time.format.DateTimeFormatter;  
15 -import org.slf4j.Logger;  
16 -import org.slf4j.LoggerFactory;  
17 -import org.springframework.beans.factory.annotation.Autowired;  
18 -import org.springframework.stereotype.Service;  
19 -  
20 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
21 import com.alibaba.fastjson.JSONObject; 4 import com.alibaba.fastjson.JSONObject;
22 import com.bsth.common.ResponseCode; 5 import com.bsth.common.ResponseCode;
@@ -24,15 +7,11 @@ import com.bsth.data.BasicData; @@ -24,15 +7,11 @@ import com.bsth.data.BasicData;
24 import com.bsth.data.directive.DayOfDirectives; 7 import com.bsth.data.directive.DayOfDirectives;
25 import com.bsth.data.directive.DirectiveCreator; 8 import com.bsth.data.directive.DirectiveCreator;
26 import com.bsth.data.directive.GatewayHttpUtils; 9 import com.bsth.data.directive.GatewayHttpUtils;
27 -import com.bsth.data.gpsdata.GpsRealData;  
28 import com.bsth.data.gpsdata.GpsEntity; 10 import com.bsth.data.gpsdata.GpsEntity;
  11 +import com.bsth.data.gpsdata.GpsRealData;
29 import com.bsth.data.pilot80.PilotReport; 12 import com.bsth.data.pilot80.PilotReport;
30 import com.bsth.data.schedule.DayOfSchedule; 13 import com.bsth.data.schedule.DayOfSchedule;
31 -import com.bsth.entity.directive.D60;  
32 -import com.bsth.entity.directive.D64;  
33 -import com.bsth.entity.directive.D80;  
34 -import com.bsth.entity.directive.DC0_A3;  
35 -import com.bsth.entity.directive.Directive; 14 +import com.bsth.entity.directive.*;
36 import com.bsth.entity.realcontrol.ScheduleRealInfo; 15 import com.bsth.entity.realcontrol.ScheduleRealInfo;
37 import com.bsth.entity.sys.SysUser; 16 import com.bsth.entity.sys.SysUser;
38 import com.bsth.repository.directive.D60Repository; 17 import com.bsth.repository.directive.D60Repository;
@@ -44,6 +23,15 @@ import com.bsth.websocket.handler.RealControlSocketHandler; @@ -44,6 +23,15 @@ import com.bsth.websocket.handler.RealControlSocketHandler;
44 import com.fasterxml.jackson.core.JsonProcessingException; 23 import com.fasterxml.jackson.core.JsonProcessingException;
45 import com.fasterxml.jackson.databind.ObjectMapper; 24 import com.fasterxml.jackson.databind.ObjectMapper;
46 import com.google.common.base.Splitter; 25 import com.google.common.base.Splitter;
  26 +import org.apache.commons.lang3.StringUtils;
  27 +import org.joda.time.format.DateTimeFormat;
  28 +import org.joda.time.format.DateTimeFormatter;
  29 +import org.slf4j.Logger;
  30 +import org.slf4j.LoggerFactory;
  31 +import org.springframework.beans.factory.annotation.Autowired;
  32 +import org.springframework.stereotype.Service;
  33 +
  34 +import java.util.*;
47 35
48 @Service 36 @Service
49 public class DirectiveServiceImpl extends BaseServiceImpl<D60, Integer> implements DirectiveService { 37 public class DirectiveServiceImpl extends BaseServiceImpl<D60, Integer> implements DirectiveService {
@@ -265,7 +253,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen @@ -265,7 +253,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen
265 // 根据当前GPS确定 上下行和营运状态 253 // 根据当前GPS确定 上下行和营运状态
266 Integer upDown = null, state = null; 254 Integer upDown = null, state = null;
267 if (null == sch) { 255 if (null == sch) {
268 - GpsEntity gpsData = gpsRealDataBuffer.findByDeviceId(deviceId); 256 + GpsEntity gpsData = gpsRealDataBuffer.get(deviceId);
269 if (null == gpsData) { 257 if (null == gpsData) {
270 /* 258 /*
271 * 短语指令不会变更设备状态,所以在没有gps状态对照的情况下可以下发 259 * 短语指令不会变更设备状态,所以在没有gps状态对照的情况下可以下发
src/main/resources/static/real_control_v2/css/ct_table.css
@@ -27,6 +27,7 @@ @@ -27,6 +27,7 @@
27 27
28 .ct_table>.ct_table_head dl dt { 28 .ct_table>.ct_table_head dl dt {
29 font-weight: normal; 29 font-weight: normal;
  30 + font-size: 12px;
30 } 31 }
31 32
32 .ct_table>.ct_table_body { 33 .ct_table>.ct_table_body {
@@ -65,7 +66,7 @@ @@ -65,7 +66,7 @@
65 } 66 }
66 67
67 .ct_table_wrap { 68 .ct_table_wrap {
68 - border: 1px solid #e6e6e6; 69 + /*border: 1px solid #e6e6e6;*/
69 border-left: 0; 70 border-left: 0;
70 } 71 }
71 72
src/main/resources/static/real_control_v2/css/home.css
  1 +.ct_table.home-gps-table>.ct_table_head dl dt{
  2 + font-size: 12px;
  3 +}
1 #main-tab-content>.home-panel, #main-tab-content>.home-panel>#home-main-content>li { 4 #main-tab-content>.home-panel, #main-tab-content>.home-panel>#home-main-content>li {
2 height: 100%; 5 height: 100%;
3 } 6 }
@@ -121,19 +124,16 @@ @@ -121,19 +124,16 @@
121 124
122 .data-wrap .data-title span.data-title-text { 125 .data-wrap .data-title span.data-title-text {
123 display: inline-block; 126 display: inline-block;
124 - color: white;  
125 padding: 0 8px; 127 padding: 0 8px;
126 - border-radius: 0 8px 8px 0; 128 + font-weight: 600;
127 } 129 }
128 130
129 .data-wrap.up .data-title span.data-title-text { 131 .data-wrap.up .data-title span.data-title-text {
130 - background: #5e96d2;  
131 - /*background-image: -webkit-linear-gradient(top, #5e96d2, #5788bb);*/ 132 + color: #3e50b3;
132 } 133 }
133 134
134 .data-wrap.down .data-title span.data-title-text { 135 .data-wrap.down .data-title span.data-title-text {
135 - background: #d66868;  
136 - /*background-image: -webkit-linear-gradient(top, #d66868, #bf6363);*/ 136 + color: #c94f21;
137 } 137 }
138 138
139 .data-wrap .data-body { 139 .data-wrap .data-body {
@@ -278,4 +278,24 @@ span.signal-state-speed-limit{ @@ -278,4 +278,24 @@ span.signal-state-speed-limit{
278 color: #4dc24d; 278 color: #4dc24d;
279 font-size: 14px; 279 font-size: 14px;
280 margin-left: 5px; 280 margin-left: 5px;
  281 +}
  282 +
  283 +.home-rb-explain-icon{
  284 + position: absolute;
  285 + right: 25px;
  286 + top: -5px;
  287 +}
  288 +
  289 +.qtip.qtip-home-rb{
  290 + max-width: 380px;
  291 + width: 300px;
  292 +}
  293 +
  294 +.qtip-home-rb .uk-list{
  295 + font-size: 13px;
  296 + margin-bottom: 0;
  297 +}
  298 +
  299 +.qtip-home-rb .uk-list li{
  300 + padding: 4px 2px;
281 } 301 }
282 \ No newline at end of file 302 \ No newline at end of file
src/main/resources/static/real_control_v2/css/main.css
@@ -121,9 +121,10 @@ svg.line-chart { @@ -121,9 +121,10 @@ svg.line-chart {
121 121
122 svg.line-chart circle.station_circle { 122 svg.line-chart circle.station_circle {
123 fill: #5e96d2; 123 fill: #5e96d2;
124 - r: 6; 124 + r: 5.5;
125 stroke: rgb(253, 253, 253); 125 stroke: rgb(253, 253, 253);
126 stroke-width: 3; 126 stroke-width: 3;
  127 + Pointer-events: none;
127 } 128 }
128 129
129 svg.line-chart circle.station_circle.down { 130 svg.line-chart circle.station_circle.down {
@@ -131,8 +132,9 @@ svg.line-chart circle.station_circle.down { @@ -131,8 +132,9 @@ svg.line-chart circle.station_circle.down {
131 } 132 }
132 133
133 svg.line-chart path.station_link { 134 svg.line-chart path.station_link {
134 - stroke-width: 5.4px; 135 + stroke-width: 3.5px;
135 stroke: #5E96D2; 136 stroke: #5E96D2;
  137 + Pointer-events: none;
136 } 138 }
137 139
138 svg.line-chart path.station_link.down { 140 svg.line-chart path.station_link.down {
@@ -149,6 +151,7 @@ svg.line-chart text.station_text { @@ -149,6 +151,7 @@ svg.line-chart text.station_text {
149 fill: #3e3e3e; 151 fill: #3e3e3e;
150 letter-spacing: -.2px; 152 letter-spacing: -.2px;
151 text-shadow: 0 0 2px #dadada; 153 text-shadow: 0 0 2px #dadada;
  154 + Pointer-events: none;
152 } 155 }
153 156
154 svg.line-chart text.station_text.up { 157 svg.line-chart text.station_text.up {
@@ -188,7 +191,7 @@ svg.line-chart g.gps-wrap&gt;rect { @@ -188,7 +191,7 @@ svg.line-chart g.gps-wrap&gt;rect {
188 } 191 }
189 192
190 svg.line-chart g.gps-wrap>rect[updown="0"] { 193 svg.line-chart g.gps-wrap>rect[updown="0"] {
191 - stroke: rgb(62, 80, 179); 194 + /*stroke: rgb(62, 80, 179);*/
192 fill: rgb(62, 80, 179); 195 fill: rgb(62, 80, 179);
193 } 196 }
194 197
src/main/resources/static/real_control_v2/fragments/home/layout.html
@@ -13,6 +13,9 @@ @@ -13,6 +13,9 @@
13 <li {{if i==0}}class="uk-active"{{/if}}><a> {{t}}</a></li> 13 <li {{if i==0}}class="uk-active"{{/if}}><a> {{t}}</a></li>
14 {{/each}} 14 {{/each}}
15 </ul> 15 </ul>
  16 + <div class="home-rb-explain-icon uk-icon-hover">
  17 + <i class="uk-icon-question-circle"></i>
  18 + </div>
16 </div> 19 </div>
17 </script> 20 </script>
18 21
@@ -32,4 +35,12 @@ @@ -32,4 +35,12 @@
32 {{/each}} 35 {{/each}}
33 </script> 36 </script>
34 37
  38 + <script id="home-rb-explain-help-temp" type="text/html">
  39 + <ul class="uk-list">
  40 + <li>场外车辆,距离线路超过100米即为越界</li>
  41 + <li>线路标准信息限速字段为空,则默认限速60</li>
  42 + <li>有任务时,连续2分钟无信号即为掉线</li>
  43 + <li>无任务时,连续10分钟无信号则已离线</li>
  44 + </ul>
  45 + </script>
35 </div> 46 </div>
src/main/resources/static/real_control_v2/fragments/home/line_panel.html
@@ -32,9 +32,9 @@ @@ -32,9 +32,9 @@
32 <dd> 32 <dd>
33 {{if abnormalStatus != null}} 33 {{if abnormalStatus != null}}
34 {{if abnormalStatus == 'outBounds'}} 34 {{if abnormalStatus == 'outBounds'}}
35 - <span class="signal-state-outbounds">越界</span> 35 + <span class="signal-state-outbounds">越界</span>
36 {{else if abnormalStatus == 'overspeed'}} 36 {{else if abnormalStatus == 'overspeed'}}
37 - <span class="signal-state-speed-limit">超速</span> 37 + <span class="signal-state-speed-limit">超速</span>
38 {{/if}} 38 {{/if}}
39 {{/if}} 39 {{/if}}
40 40
src/main/resources/static/real_control_v2/fragments/line_schedule/sch_table.html
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 {{else}} 7 {{else}}
8 下行/{{line.endStationName}} 8 下行/{{line.endStationName}}
9 {{/if}} 9 {{/if}}
10 - <i class="uk-icon-question-circle"></i> 10 + <i class="uk-icon-question-circle uk-icon-hover"></i>
11 <div class="fixed_legend"> 11 <div class="fixed_legend">
12 <div> 12 <div>
13 <span class="tl-xxfc">消息发出</span> 13 <span class="tl-xxfc">消息发出</span>
src/main/resources/static/real_control_v2/js/data/data_basic.js
@@ -161,9 +161,9 @@ var gb_data_basic = (function () { @@ -161,9 +161,9 @@ var gb_data_basic = (function () {
161 //是否是环线 161 //是否是环线
162 isLoopLine: function (lineCode) { 162 isLoopLine: function (lineCode) {
163 var data = gb_common.groupBy(stationRoutes[lineCode], 'directions'); 163 var data = gb_common.groupBy(stationRoutes[lineCode], 'directions');
164 - //如果上行起终点名称相同,并且距离50米内 164 + //如果上行起终点名称相同,并且距离50米内 并且下行只有2个站点
165 var len = data[0].length; 165 var len = data[0].length;
166 - if(len > 0){ 166 + if(len > 0 && data[1].length == 2){
167 var first = data[0][0], 167 var first = data[0][0],
168 end = data[0][len - 1]; 168 end = data[0][len - 1];
169 169
src/main/resources/static/real_control_v2/js/home/context_menu.js
@@ -37,7 +37,7 @@ var gb_home_context_menu = (function() { @@ -37,7 +37,7 @@ var gb_home_context_menu = (function() {
37 else 37 else
38 notify_err('发送失败,原因参考【指令下发记录】'); 38 notify_err('发送失败,原因参考【指令下发记录】');
39 }); 39 });
40 - } 40 + };
41 41
42 // send phrase 42 // send phrase
43 var sendPhrase = function() { 43 var sendPhrase = function() {
@@ -59,7 +59,7 @@ var gb_home_context_menu = (function() { @@ -59,7 +59,7 @@ var gb_home_context_menu = (function() {
59 notify_err_form('发送短语消息失败', f); 59 notify_err_form('发送短语消息失败', f);
60 }); 60 });
61 }); 61 });
62 - } 62 + };
63 63
64 //send phrase multiple 64 //send phrase multiple
65 var sendPhraseMulti = function() { 65 var sendPhraseMulti = function() {
@@ -100,7 +100,7 @@ var gb_home_context_menu = (function() { @@ -100,7 +100,7 @@ var gb_home_context_menu = (function() {
100 showMultiSendModal(nbbmArr, data.text); 100 showMultiSendModal(nbbmArr, data.text);
101 }, 200); 101 }, 200);
102 }); 102 });
103 - } 103 + };
104 104
105 // multi send animation modal 105 // multi send animation modal
106 var showMultiSendModal = function(nbbmArray, text) { 106 var showMultiSendModal = function(nbbmArray, text) {
@@ -136,7 +136,7 @@ var gb_home_context_menu = (function() { @@ -136,7 +136,7 @@ var gb_home_context_menu = (function() {
136 f(); 136 f();
137 }); 137 });
138 }(); 138 }();
139 - } 139 + };
140 140
141 var state_up_0 = function() { 141 var state_up_0 = function() {
142 changeUpDown(active_car, 0); 142 changeUpDown(active_car, 0);
@@ -182,7 +182,7 @@ var gb_home_context_menu = (function() { @@ -182,7 +182,7 @@ var gb_home_context_menu = (function() {
182 182
183 var C0_A3 = function(){ 183 var C0_A3 = function(){
184 open_modal('/real_control_v2/fragments/home/c0_a3.html', {}, {center: false, bgclose: false}); 184 open_modal('/real_control_v2/fragments/home/c0_a3.html', {}, {center: false, bgclose: false});
185 - } 185 + };
186 186
187 var callbackHandler = { 187 var callbackHandler = {
188 send_phrase: sendPhrase, 188 send_phrase: sendPhrase,
src/main/resources/static/real_control_v2/js/home/layout.js
@@ -34,10 +34,44 @@ var gb_home_layout = (function () { @@ -34,10 +34,44 @@ var gb_home_layout = (function () {
34 return false; 34 return false;
35 }); 35 });
36 36
  37 + initRbDxplain();
37 cb && cb(); 38 cb && cb();
38 }); 39 });
39 }; 40 };
40 41
  42 + //右下角说明icon
  43 + function initRbDxplain() {
  44 + $(document).on('mouseenter', '.home-rb-explain-icon', 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 +
41 //click svg edit icon 75 //click svg edit icon
42 $(document).on('click', '.home-svg-edit-icon', function () { 76 $(document).on('click', '.home-svg-edit-icon', function () {
43 open_modal('/real_control_v2/fragments/home/svg_edit.html', {lineCode: $(this).data('line-code')}); 77 open_modal('/real_control_v2/fragments/home/svg_edit.html', {lineCode: $(this).data('line-code')});
src/main/resources/static/real_control_v2/js/utils/ct_table.js
1 var gb_ct_table = (function() { 1 var gb_ct_table = (function() {
  2 + var webkit=true;
  3 + if(typeof $("body")[0].style.WebkitAnimation=="undefined")
  4 + webkit = false;
  5 +
2 function fixedHead($wrap) { 6 function fixedHead($wrap) {
  7 + if(!webkit)
  8 + return;
3 9
4 $wrap.off('scroll').on('scroll', function() { 10 $wrap.off('scroll').on('scroll', function() {
5 var top = $(this).scrollTop(); 11 var top = $(this).scrollTop();
src/main/resources/static/real_control_v2/js/utils/svg_chart.js
@@ -227,11 +227,10 @@ var gb_svg_chart = (function () { @@ -227,11 +227,10 @@ var gb_svg_chart = (function () {
227 var x; 227 var x;
228 e.transition().attr('x', function (d) { 228 e.transition().attr('x', function (d) {
229 x = gx(d, svg); 229 x = gx(d, svg);
230 - //找不到停靠点,直接隐藏  
231 if(x == -100) 230 if(x == -100)
232 - $(this).hide(); 231 + $(this).css('transition-duration', 0).hide();
233 else 232 else
234 - $(this).show(); 233 + $(this).show();//找不到停靠点,直接隐藏
235 return x; 234 return x;
236 }) 235 })
237 .attr('y', function (d) { 236 .attr('y', function (d) {
@@ -269,7 +268,6 @@ var gb_svg_chart = (function () { @@ -269,7 +268,6 @@ var gb_svg_chart = (function () {
269 //聚合gps 268 //聚合gps
270 marker_clusterer(this, lineCode); 269 marker_clusterer(this, lineCode);
271 }); 270 });
272 -  
273 }; 271 };
274 272
275 var draw_gps = function (svg, data) { 273 var draw_gps = function (svg, data) {
@@ -290,7 +288,6 @@ var gb_svg_chart = (function () { @@ -290,7 +288,6 @@ var gb_svg_chart = (function () {
290 var marker_clusterer = function (svg, lineCode) { 288 var marker_clusterer = function (svg, lineCode) {
291 //debugger 289 //debugger
292 var gpsArr, idxMapp = line_gps_index[lineCode]; 290 var gpsArr, idxMapp = line_gps_index[lineCode];
293 - //svgs = $('.line-chart[data-code=' + lineCode + ']');  
294 for (var stopNo in idxMapp) { 291 for (var stopNo in idxMapp) {
295 gpsArr = gb_common.get_keys(idxMapp[stopNo]); 292 gpsArr = gb_common.get_keys(idxMapp[stopNo]);
296 //remove old merger point 293 //remove old merger point