Commit adc2ab19dca45610d316cc0994fac0829e7bd174
1 parent
ea43f1bc
update
Showing
16 changed files
with
292 additions
and
188 deletions
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<D60, Integer> implemen | @@ -265,7 +253,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl<D60, Integer> 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>rect { | @@ -188,7 +191,7 @@ svg.line-chart g.gps-wrap>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 |