Commit 2cf067bd749a8e2cbeff6924adc2a77bc5c2d727

Authored by 廖磊
2 parents 1499e81d d71b5a59

Merge branch 'pudong' of http://222.66.0.204:8090/panzhaov5/bsth_control

into pudong
src/main/java/com/bsth/controller/realcontrol/AdminUtilsController.java
... ... @@ -2,9 +2,11 @@ package com.bsth.controller.realcontrol;
2 2  
3 3 import com.bsth.data.directive.DayOfDirectives;
4 4 import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
  5 +import com.bsth.data.gpsdata_v2.handlers.overspeed.OverspeedProcess;
5 6 import com.bsth.data.gpsdata_v2.thread.GpsDataLoaderThread;
6 7 import com.bsth.data.msg_queue.DirectivePushQueue;
7 8 import com.bsth.data.msg_queue.WebSocketPushQueue;
  9 +import com.bsth.data.pilot80.PilotReport;
8 10 import com.bsth.data.schedule.DayOfSchedule;
9 11 import com.bsth.entity.realcontrol.ScheduleRealInfo;
10 12 import com.bsth.websocket.handler.SendUtils;
... ... @@ -41,29 +43,32 @@ public class AdminUtilsController {
41 43 @Autowired
42 44 SendUtils sendUtils;
43 45  
  46 + @Autowired
  47 + PilotReport pilotReport;
  48 +
44 49 /**
45 50 * 出现重复班次的车辆
46 51 * @param
47 52  
48   - @RequestMapping(value = "/schRepeat", method = RequestMethod.POST)
49   - public void schRepeat(@RequestParam String nbbm){
50   - logger.info("前端通知,车辆 " + nbbm + "出现重复班次,开始检测...");
51   - List<ScheduleRealInfo> list = dayOfSchedule.findByNbbm(nbbm);
52   - logger.info("检测前,车辆班次数量:" + list.size());
53   -
54   - Map<Long, ScheduleRealInfo> map = new HashMap<>();
55   - for(ScheduleRealInfo sch : list){
56   - if(map.containsKey(sch.getId())){
57   - logger.info("检测到重复ID: " + sch.getId());
58   - }
59   - map.put(sch.getId(), sch);
60   - }
61   -
62   - logger.info("检测后,车辆班次数量:" + list.size());
63   - if(map.values().size() > 0){
64   - dayOfSchedule.replaceByNbbm(nbbm, map.values());
65   - }
66   - }*/
  53 + @RequestMapping(value = "/schRepeat", method = RequestMethod.POST)
  54 + public void schRepeat(@RequestParam String nbbm){
  55 + logger.info("前端通知,车辆 " + nbbm + "出现重复班次,开始检测...");
  56 + List<ScheduleRealInfo> list = dayOfSchedule.findByNbbm(nbbm);
  57 + logger.info("检测前,车辆班次数量:" + list.size());
  58 +
  59 + Map<Long, ScheduleRealInfo> map = new HashMap<>();
  60 + for(ScheduleRealInfo sch : list){
  61 + if(map.containsKey(sch.getId())){
  62 + logger.info("检测到重复ID: " + sch.getId());
  63 + }
  64 + map.put(sch.getId(), sch);
  65 + }
  66 +
  67 + logger.info("检测后,车辆班次数量:" + list.size());
  68 + if(map.values().size() > 0){
  69 + dayOfSchedule.replaceByNbbm(nbbm, map.values());
  70 + }
  71 + }*/
67 72  
68 73 /* @RequestMapping(value = "/directivePushQueue")
69 74 public void directivePushQueue(){
... ... @@ -132,10 +137,12 @@ public class AdminUtilsController {
132 137 public Map<String, Integer> containerSize(){
133 138 Map<String, Integer> rs = new HashMap<>();
134 139 rs.put("60_size", dayOfDirectives.all60().size());
  140 + rs.put("80_size", pilotReport.findAll().size());
135 141 rs.put("nbbm_sch_size", dayOfSchedule.findAll().size());
136 142 rs.put("lp_sch_size", dayOfSchedule.findAllByLpContainer().size());
137 143 rs.put("id_sch_size", dayOfSchedule.findAllByIdContainer().size());
138 144 rs.put("pst_sch_size", dayOfSchedule.getPstSize());
  145 + rs.put("speeds_size", OverspeedProcess.size());
139 146 return rs;
140 147 }
141 148  
... ...
src/main/java/com/bsth/data/directive/DayOfDirectives.java
... ... @@ -16,6 +16,7 @@ import org.springframework.stereotype.Component;
16 16  
17 17 import java.util.*;
18 18 import java.util.concurrent.ConcurrentHashMap;
  19 +import java.util.concurrent.ConcurrentMap;
19 20  
20 21 /**
21 22 *
... ... @@ -29,13 +30,10 @@ import java.util.concurrent.ConcurrentHashMap;
29 30 public class DayOfDirectives {
30 31  
31 32 // 当日60指令缓存
32   - private static Map<Integer, D60> d60Map;
  33 + private static ConcurrentMap<Integer, D60> d60Map;
33 34  
34 35 // 线路切换指令 64
35   - public static Map<String, D64> d64Map;
36   -
37   - //等待C0_A4回复的用户
38   - //public static Map<K, V>
  36 + public static ConcurrentMap<String, D64> d64Map;
39 37  
40 38 //等待入库的指令
41 39 public static LinkedList<Directive> pstDirectives;
... ... @@ -149,9 +147,53 @@ public class DayOfDirectives {
149 147 return;
150 148  
151 149 directiveService.save(d60);
  150 + }
  151 +
  152 + public void clear(String lineCode){
  153 + int c60 = 0, c64 = 0;
  154 +
  155 + Collection<D60> d60s = d60Map.values();
  156 + List<D60> rem60List = new ArrayList<>();
  157 + for(D60 d60 : d60s){
  158 + if(d60.getLineCode().equals(lineCode))
  159 + rem60List.add(d60);
  160 + }
  161 +
  162 + //清除60数据
  163 + for(D60 d60 : rem60List){
  164 + if(d60.getReply47() == null)
  165 + directiveService.save(d60);
  166 + if(null != d60Map.remove(d60.getMsgId()))
  167 + c60 ++;
  168 + }
  169 +
  170 + rem60List.clear();
  171 + if(c60 > 0)
  172 + logger.info("清除60数据 ," + c60);
  173 +
  174 + //找到该设备的64数据
  175 + Collection<D64> d64s = d64Map.values();
  176 + List<D64> rem64List = new ArrayList<>();
  177 + for(D64 d64 : d64s){
  178 + if(d64.get)
  179 + rem64List.add(d64);
  180 + }
  181 +
  182 + //清除64数据
  183 + for(D64 d64 : rem64List){
  184 + if(d64.getRespAck() == null)
  185 + directiveService.save64(d64);
  186 +
  187 + if(null != d64Map.remove(d64.getKey()))
  188 + c64 ++;
  189 + }
  190 +
  191 + rem64List.clear();
  192 + if(c64 > 0)
  193 + logger.info("清除64数据 ," + c64);
152 194 }*/
153   -
154   - public void clear(String device){
  195 +
  196 +/* public void clear(String device){
155 197 int c60 = 0, c64 = 0;
156 198  
157 199 Collection<D60> d60s = d60Map.values();
... ... @@ -193,6 +235,12 @@ public class DayOfDirectives {
193 235 rem64List.clear();
194 236 if(c64 > 0)
195 237 logger.info("清除64数据 ," + c64);
  238 + }*/
  239 +
  240 + public void clearAll(){
  241 + d60Map = new ConcurrentHashMap<>();
  242 + d64Map = new ConcurrentHashMap<>();
  243 + logger.info("清除指令数据 ,,,");
196 244 }
197 245  
198 246 public Collection<D60> all60(){
... ...
src/main/java/com/bsth/data/directive/DirectiveCreator.java
... ... @@ -81,7 +81,7 @@ public class DirectiveCreator {
81 81 }
82 82  
83 83  
84   - public D60 createD60_01(String nbbm, String text, int upDown, int state, Date alarmTime){
  84 + public D60 createD60_02(String nbbm, String text, int upDown, int state, Date alarmTime){
85 85 SimpleDateFormat sdfMMddHHmm = new SimpleDateFormat("MMddHHmm");
86 86  
87 87 Long timestamp = System.currentTimeMillis();
... ... @@ -102,7 +102,7 @@ public class DirectiveCreator {
102 102 directive.setMsgId(msgId);
103 103 // 构造数据
104 104 data.setDeviceId(deviceId);
105   - data.setDispatchInstruct((short) 0x01);
  105 + data.setDispatchInstruct((short) 0x02);
106 106 data.setTimestamp(timestamp);
107 107 data.setCompanyCode(company);
108 108 data.setMsgId(msgId);
... ...
src/main/java/com/bsth/data/directive/GatewayHttpUtils.java
... ... @@ -48,9 +48,7 @@ public class GatewayHttpUtils {
48 48  
49 49 int statusCode = response.getStatusLine().getStatusCode();
50 50 if(statusCode != 200){
51   - //post.abort();
52 51 logger.error("http client status code: " + statusCode);
53   - //return code;
54 52 }
55 53  
56 54 JSONObject json = JSONObject.parseObject(EntityUtils.toString(response.getEntity()));
... ...
src/main/java/com/bsth/data/gpsdata_v2/entity/GpsEntity.java
... ... @@ -13,6 +13,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
13 13 public class GpsEntity implements Cloneable{
14 14  
15 15 /** 公司代码 */
  16 + @JsonIgnore
16 17 private Short companyCode;
17 18  
18 19 /** 线路编码 */
... ... @@ -31,6 +32,7 @@ public class GpsEntity implements Cloneable{
31 32 private String stationName;
32 33  
33 34 /** 到站时间 */
  35 + @JsonIgnore
34 36 private long arrTime;
35 37  
36 38 /** 经度 */
... ... @@ -56,6 +58,12 @@ public class GpsEntity implements Cloneable{
56 58  
57 59 /** 上下行(0 上行 , 1 下行 , -1 无效) */
58 60 private Byte upDown;
  61 +
  62 + /**
  63 + * 设备原始走向_营运状态
  64 + * 当设备状态和系统不一致时,该字段有值
  65 + */
  66 + private String origStateStr;
59 67  
60 68 /** 车辆内部编码 */
61 69 private String nbbm;
... ... @@ -379,4 +387,12 @@ public class GpsEntity implements Cloneable{
379 387 public void setPlanCode(String planCode) {
380 388 this.planCode = planCode;
381 389 }
  390 +
  391 + public String getOrigStateStr() {
  392 + return origStateStr;
  393 + }
  394 +
  395 + public void setOrigStateStr(String origStateStr) {
  396 + this.origStateStr = origStateStr;
  397 + }
382 398 }
... ...
src/main/java/com/bsth/data/gpsdata_v2/handlers/GpsStateProcess.java
... ... @@ -7,6 +7,9 @@ import com.bsth.entity.realcontrol.ScheduleRealInfo;
7 7 import org.springframework.beans.factory.annotation.Autowired;
8 8 import org.springframework.stereotype.Component;
9 9  
  10 +import java.util.concurrent.ConcurrentHashMap;
  11 +import java.util.concurrent.ConcurrentMap;
  12 +
10 13 /**
11 14 * GPS 状态处理
12 15 * Created by panzhao on 2017/11/15.
... ... @@ -20,6 +23,13 @@ public class GpsStateProcess {
20 23 @Autowired
21 24 GpsStatusManager gpsStatusManager;
22 25  
  26 + /**
  27 + * 设置状态差异连续次数
  28 + */
  29 + private static ConcurrentMap<String, Integer> stateDiffMap = new ConcurrentHashMap<>();
  30 +
  31 + private final static int CHANGE_THRESHOLD = 2;
  32 +
23 33 public void process(GpsEntity gps) {
24 34 //在执行的任务
25 35 ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
... ... @@ -27,16 +37,40 @@ public class GpsStateProcess {
27 37 if (null == sch)
28 38 return;
29 39  
30   - byte upDown = Byte.parseByte(sch.getXlDir());
  40 + int upDown = Integer.parseInt(sch.getXlDir());
31 41 int schState = dayOfSchedule.emptyService(sch)?1:0;
32   -
  42 + String device = gps.getDeviceId();
  43 + /**
  44 + * 网关在进终点的时候,会直接将当前点位状态改变
  45 + * 为避免出现单个点的状态跳动,设置一下切换阈值
  46 + */
33 47 if(gps.getState() != schState || gps.getUpDown() != upDown){
34   - //下发指令纠正车载的 营运状态 和 走向
35   - gpsStatusManager.changeServiceState(gps.getNbbm(), upDown, schState, "同步@系统");
  48 + Integer count = 0;
  49 + if(stateDiffMap.containsKey(device))
  50 + count = stateDiffMap.get(device);
  51 +
  52 + count ++;
  53 +
  54 + if(count >= CHANGE_THRESHOLD){
  55 + //下发指令纠正车载的 营运状态 和 走向
  56 + gpsStatusManager.changeServiceState(gps.getNbbm(), upDown, schState, "同步@系统");
  57 + count = 0;
  58 + }
  59 +
  60 + stateDiffMap.put(device, count);
  61 +
  62 + //记录原始设备状态
  63 + gps.setOrigStateStr(gps.getUpDown() + "_" + gps.getState());
36 64 }
  65 + else
  66 + stateDiffMap.put(device, 0);
37 67  
38 68 if (gps.getUpDown() != upDown) {
39   - gps.setUpDown(upDown);//修正走向
  69 + gps.setUpDown((byte) upDown);//修正走向
  70 + }
  71 +
  72 + if(gps.getState() != schState){
  73 + gps.setState(schState);//修正营运状态
40 74 }
41 75  
42 76 if (!sch.getXlBm().equals(gps.getLineId())) {
... ...
src/main/java/com/bsth/data/gpsdata_v2/handlers/InStationProcess.java
... ... @@ -144,6 +144,8 @@ public class InStationProcess {
144 144 dayOfSchedule.addExecPlan(next);
145 145 inStationAndInPark(sch, next);//进站既进场
146 146 }
  147 + else
  148 + dayOfSchedule.removeExecPlan(nbbm);
147 149  
148 150 //路牌的下一个班次,页面显示起点实际到达时间
149 151 ScheduleRealInfo lpNext = dayOfSchedule.nextByLp(sch);
... ... @@ -176,9 +178,14 @@ public class InStationProcess {
176 178 if(null == next && gps.isService()){
177 179 nonService(sch, "结束@系统");//营运结束
178 180 }
179   - //下发运营指令
180   - DirectivePushQueue.put6003(next, "到站@系统");
181 181  
  182 + /**
  183 + * 下一班不是全程班次的时候,下发运营指令
  184 + * 全程班次时,由网关根据进出起终点,自动切换走向
  185 +
  186 + if(null != next && !next.getBcType().equals("normal"))
  187 + DirectivePushQueue.put6003(next, "到站@系统");
  188 + */
182 189 //下发调度指令
183 190 DirectivePushQueue.put6002(next, doneSum, "到站@系统", "");
184 191 }
... ...
src/main/java/com/bsth/data/gpsdata_v2/handlers/overspeed/OverspeedProcess.java
... ... @@ -43,7 +43,7 @@ public class OverspeedProcess {
43 43 */
44 44 private static Map<String, Integer> contSpeedMap;
45 45  
46   - Logger logger = LoggerFactory.getLogger(this.getClass());
  46 + static Logger logger = LoggerFactory.getLogger(OverspeedProcess.class);
47 47  
48 48 static{
49 49 multimap = ArrayListMultimap.create();
... ... @@ -51,6 +51,10 @@ public class OverspeedProcess {
51 51 realOverspeedMap = new HashMap();
52 52 }
53 53  
  54 + public static int size(){
  55 + return multimap.size();
  56 + }
  57 +
54 58 public static void clear(){
55 59 multimap = null;
56 60 multimap = ArrayListMultimap.create();
... ... @@ -60,6 +64,8 @@ public class OverspeedProcess {
60 64  
61 65 realOverspeedMap = null;
62 66 realOverspeedMap = new HashMap();
  67 +
  68 + logger.info("清理超速缓存数据,,,");
63 69 }
64 70  
65 71 public boolean process(GpsEntity gps){
... ...
src/main/java/com/bsth/data/gpsdata_v2/utils/GpsDataUtils.java
... ... @@ -15,6 +15,8 @@ public class GpsDataUtils {
15 15  
16 16 static Logger logger = LoggerFactory.getLogger(GpsDataUtils.class);
17 17  
  18 + private final static long MAX_DIFF = 1000 * 60 * 60 * 24;
  19 +
18 20 /**
19 21 * 过滤无效的gps点位
20 22 *
... ... @@ -24,9 +26,16 @@ public class GpsDataUtils {
24 26 public static List<GpsEntity> clearInvalid(List<GpsEntity> list) {
25 27 List<GpsEntity> rs = new ArrayList<>();
26 28  
  29 + long t = System.currentTimeMillis();
27 30 try {
28 31 GpsEntity prev;
29 32 for (GpsEntity gps : list) {
  33 + if(Math.abs(gps.getTimestamp() - t) > MAX_DIFF){
  34 + //尝试校准GPS时间
  35 + gps.setTimestamp(t + 1);
  36 + gps.setAbnormalStatus("timeError");
  37 + }
  38 +
30 39 prev = GpsRealData.get(gps.getDeviceId());
31 40  
32 41 //不接收过期数据
... ... @@ -48,7 +57,7 @@ public class GpsDataUtils {
48 57 if (rs.size() < list.size())
49 58 logger.info("过滤无效的点位 : " + (list.size() - rs.size()));
50 59 } catch (Exception e) {
51   - logger.error("", e);
  60 + logger.error("过滤GPS出现异常", e);
52 61 rs = list;
53 62 }
54 63 return rs;
... ...
src/main/java/com/bsth/data/msg_queue/DirectivePushQueue.java
... ... @@ -24,7 +24,7 @@ public class DirectivePushQueue implements ApplicationContextAware {
24 24 static ConcurrentLinkedQueue<QueueData_Directive> linkedList;
25 25 static DataPushThread thread;
26 26 static DirectiveService directiveService;
27   - static long t;
  27 + static long threadT;
28 28  
29 29 /**
30 30 * 下发运营指令6003的最小间隔时间
... ... @@ -34,11 +34,11 @@ public class DirectivePushQueue implements ApplicationContextAware {
34 34 /**
35 35 * 车辆 ——> 上次下发6003的时间
36 36 */
37   - static ConcurrentMap<String, Long> lastSend6003Map;
  37 + static ConcurrentMap<String, Long> lastSend60TimeMap;
38 38  
39 39 static {
40 40 linkedList = new ConcurrentLinkedQueue<>();
41   - lastSend6003Map = new ConcurrentHashMap<>();
  41 + lastSend60TimeMap = new ConcurrentHashMap<>();
42 42 }
43 43  
44 44 public static void put6002(ScheduleRealInfo sch, int finish, String sender, String txtPrefix){
... ... @@ -52,12 +52,13 @@ public class DirectivePushQueue implements ApplicationContextAware {
52 52 qd6002.setTxtPrefix(txtPrefix);
53 53  
54 54 linkedList.add(qd6002);
  55 + lastSend60TimeMap.put(sch.getClZbh(), System.currentTimeMillis());
55 56 }
56 57  
57 58 public static void put6003(String nbbm, int state, int upDown, String sender){
58 59 long t = System.currentTimeMillis();
59   - if(lastSend6003Map.containsKey(nbbm)
60   - && t - lastSend6003Map.get(nbbm) < MIN_SEND6003_SPACE)
  60 + if(lastSend60TimeMap.containsKey(nbbm)
  61 + && t - lastSend60TimeMap.get(nbbm) < MIN_SEND6003_SPACE)
61 62 return; //最短下发间隔
62 63  
63 64 QueueData_Directive qd6003 = new QueueData_Directive();
... ... @@ -68,7 +69,7 @@ public class DirectivePushQueue implements ApplicationContextAware {
68 69 qd6003.setCode("60_03");
69 70  
70 71 linkedList.add(qd6003);
71   - lastSend6003Map.put(nbbm, t);
  72 + lastSend60TimeMap.put(nbbm, t);
72 73 }
73 74  
74 75 public static void put6003(ScheduleRealInfo sch, String sender){
... ... @@ -146,7 +147,7 @@ public class DirectivePushQueue implements ApplicationContextAware {
146 147 sleepFlag = true;
147 148 }
148 149 }
149   - t = System.currentTimeMillis();
  150 + threadT = System.currentTimeMillis();
150 151 }
151 152 catch(InterruptedException e){
152 153 log.error("", e);
... ...
src/main/java/com/bsth/data/safe_driv/SafeDrivCenter.java
... ... @@ -3,6 +3,8 @@ package com.bsth.data.safe_driv;
3 3 import com.bsth.websocket.handler.SendUtils;
4 4 import org.joda.time.format.DateTimeFormat;
5 5 import org.joda.time.format.DateTimeFormatter;
  6 +import org.slf4j.Logger;
  7 +import org.slf4j.LoggerFactory;
6 8 import org.springframework.beans.BeansException;
7 9 import org.springframework.beans.factory.annotation.Autowired;
8 10 import org.springframework.context.ApplicationContext;
... ... @@ -33,6 +35,8 @@ public class SafeDrivCenter implements ApplicationContextAware {
33 35 */
34 36 private static Map<String, SafeDriv> safeMap;
35 37  
  38 + static Logger logger = LoggerFactory.getLogger(SafeDrivCenter.class);
  39 +
36 40 static {
37 41 data = new HashSet<>();
38 42 safeMap = new HashMap<>();
... ... @@ -61,6 +65,7 @@ public class SafeDrivCenter implements ApplicationContextAware {
61 65 public static void clear(){
62 66 data = new HashSet<>();
63 67 safeMap = new HashMap<>();
  68 + logger.info("清除安全驾驶数据,,,");
64 69 }
65 70  
66 71 @Override
... ...
src/main/java/com/bsth/data/schedule/thread/CalcOilThread.java
1 1 package com.bsth.data.schedule.thread;
2 2  
  3 +import com.bsth.data.directive.DayOfDirectives;
3 4 import com.bsth.data.gpsdata_v2.handlers.overspeed.OverspeedProcess;
4 5 import com.bsth.service.oil.DlbService;
5 6 import com.bsth.data.safe_driv.SafeDrivCenter;
... ... @@ -27,6 +28,9 @@ public class CalcOilThread extends Thread{
27 28 SheetService sheetService;
28 29 Logger logger = LoggerFactory.getLogger(this.getClass());
29 30  
  31 + @Autowired
  32 + DayOfDirectives dayOfDirectives;
  33 +
30 34 @Override
31 35 public void run() {
32 36 try{
... ... @@ -37,12 +41,15 @@ public class CalcOilThread extends Thread{
37 41 logger.info("开始计算班次准点率....");
38 42 sheetService.saveSheetList("");
39 43 logger.info("计算班次准点率结束!");
40   - //清除安全驾驶数据 先临时蹭这个线程
41   - SafeDrivCenter.clear();
42   - //清除超速缓存数据
43   - OverspeedProcess.clear();
44 44 } catch(Exception e){
45 45 logger.error("计算路单里程加注量失败",e);
46 46 }
  47 +
  48 + //清除指令数据
  49 + dayOfDirectives.clearAll();
  50 + //清除安全驾驶数据
  51 + SafeDrivCenter.clear();
  52 + //清除超速缓存数据
  53 + OverspeedProcess.clear();
47 54 }
48 55 }
... ...
src/main/java/com/bsth/data/schedule/thread/ScheduleRefreshThread.java
1 1 package com.bsth.data.schedule.thread;
2 2  
3   -import com.bsth.data.BasicData;
4 3 import com.bsth.data.LineConfigData;
5 4 import com.bsth.data.directive.DayOfDirectives;
6 5 import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
... ... @@ -56,17 +55,15 @@ public class ScheduleRefreshThread extends Thread{
56 55  
57 56 if(oldSchDate == null || !oldSchDate.equals(currSchDate)){
58 57  
59   - //logger.info(lineCode + "开始翻班, " + currSchDate);
60   -
61 58 try{
62   - //清除指令数据
63 59 Set<String> cars = dayOfSchedule.findCarByLineCode(lineCode);
64 60 for(String car : cars){
65   - dayOfDirectives.clear(BasicData.deviceId2NbbmMap.inverse().get(car));
66 61 GpsCacheData.remove(car);
67 62 }
68 63 //清除驾驶员上报数据
69 64 pilotReport.clear(lineCode);
  65 + //清除指令数据 指令数据,直接定时全部清空
  66 + //dayOfDirectives.clear(lineCode);
70 67 }catch (Exception e){
71 68 logger.error("清理 60 和 80出现问题", e);
72 69 }
... ...
src/main/java/com/bsth/service/directive/DirectiveServiceImpl.java
... ... @@ -128,7 +128,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen
128 128 text += " (放站到"+sch.getMajorStationName()+"带客)";
129 129 }
130 130  
131   - //下发0x01指令 调度指令(闹钟有效)
  131 + //下发0x02指令 调度指令(闹钟有效)
132 132 long t = System.currentTimeMillis() + 1000 * 30,
133 133 alarmTime = sch.getDfsjT() < t?t:sch.getDfsjT();
134 134  
... ... @@ -139,7 +139,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen
139 139 int state = 0;//营运状态
140 140 if(dayOfSchedule.emptyService(sch))
141 141 state = 1;
142   - d60 = new DirectiveCreator().createD60_01(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir())
  142 + d60 = new DirectiveCreator().createD60_02(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir())
143 143 , state, new Date(alarmTime));
144 144  
145 145 d60.setLineCode(sch.getXlBm());
... ...
src/main/java/com/bsth/service/gps/GpsServiceImpl.java
... ... @@ -5,6 +5,7 @@ import com.bsth.data.BasicData;
5 5 import com.bsth.data.forecast.entity.ArrivalEntity;
6 6 import com.bsth.data.gpsdata_v2.GpsRealData;
7 7 import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
  8 +import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
8 9 import com.bsth.data.gpsdata_v2.entity.GpsEntity;
9 10 import com.bsth.data.gpsdata_v2.utils.GeoUtils;
10 11 import com.bsth.data.pilot80.PilotReport;
... ... @@ -492,6 +493,7 @@ public class GpsServiceImpl implements GpsService {
492 493 try {
493 494  
494 495 gpsRealData.remove(device);
  496 + GpsCacheData.remove(BasicData.deviceId2NbbmMap.get(device));
495 497 rs.put("status", ResponseCode.SUCCESS);
496 498 } catch (Exception e) {
497 499 rs.put("status", ResponseCode.ERROR);
... ...
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
... ... @@ -698,13 +698,6 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
698 698 //数据库删除
699 699 rs = super.delete(id);
700 700 if(rs.get("status").equals(ResponseCode.SUCCESS)){
701   - /*ScheduleRealInfo temp = super.findById(id);
702   - if(temp != null){
703   - rs.put("status", ResponseCode.ERROR);
704   - rs.put("msg", "删除失败,请重试!");
705   - return rs;
706   - }*/
707   -
708 701 dayOfSchedule.delete(sch);
709 702 //更新起点应到时间
710 703 List<ScheduleRealInfo> ts = dayOfSchedule.updateQdzTimePlan(sch);
... ...
src/main/resources/static/real_control_v2/alone_page/map/alone_wrap.html
... ... @@ -110,6 +110,7 @@
110 110 <!-- jquery.serializejson JSON序列化插件 -->
111 111 <script src="/assets/plugins/jquery.serializejson.js" merge="uikit_js"></script>
112 112  
  113 +<script src="/assets/plugins/pinyin.js" merge="plugins"></script>
113 114 </body>
114 115 <script>
115 116 gb_data_gps.fixedTimeRefresh();
... ...
src/main/resources/static/real_control_v2/fragments/north/nav/all_devices.html
... ... @@ -36,6 +36,7 @@
36 36 <div class="uk-autocomplete uk-form " >
37 37 <select name="abnormalStatus">
38 38 <option value="">全部</option>
  39 + <option value="timeError">时间戳异常</option>
39 40 <option value="outBounds">越界</option>
40 41 <option value="overspeed">超速</option>
41 42 <option value="offline">离线</option>
... ... @@ -58,11 +59,11 @@
58 59 <th style="width: 14%;">站点</th>
59 60 <th style="width: 11%;">车辆</th>
60 61 <th style="width: 11%;">设备号</th>
61   - <th style="width: 9%;">走向/营运</th>
  62 + <th style="width: 12%;">走向/营运</th>
62 63 <th style="width: 9%;">程序版本</th>
63 64 <th>最后GPS时间</th>
64   - <th style="width: 9%;">状态</th>
65   - <th style="width: 8%;">来源</th>
  65 + <th style="width: 8%;">状态</th>
  66 + <th style="width: 6%;">源</th>
66 67 </tr>
67 68 </thead>
68 69 <tbody>
... ... @@ -81,7 +82,11 @@
81 82 <td>{{gps.stationName}}</td>
82 83 <td>{{gps.nbbm}}</td>
83 84 <td>{{gps.deviceId}}</td>
84   - <td>{{gps.upDown}}/{{gps.state}}</td>
  85 + <td>{{gps.upDown}}/{{gps.state}}
  86 + {{if gps.origStateStr!=null}}
  87 + (<span style="color: #fe6262;">{{gps.origStateStr}}</span>)
  88 + {{/if}}
  89 + </td>
85 90 <td>{{gps.version}}</td>
86 91 <td>{{gps.timeStr}}</td>
87 92 <td>
... ... @@ -95,18 +100,14 @@
95 100 <span class="sm-red">GPS (0,0)</span>
96 101 {{else if gps.abnormalStatus=='offline'}}
97 102 <span>离线</span>
  103 + {{else if gps.abnormalStatus=='timeError'}}
  104 + <span class="sm-red" title="设备时间戳异常,尝试以服务器时间修正">time_ex</span>
98 105 {{else}}
99 106 ...
100 107 {{/if}}
101 108 </td>
102 109 <td>
103   - {{if gps.source==1}}
104   - <span style="color: #1e1ef5;" title="已切换至新网关">网关</span>
105   - {{else if gps.source==0}}
106   - <span style="color: #8e8e8e;" title="转接的数据,无法下发指令">转发</span>
107   - {{else}}
108   - <span class="sm-grey">未知</span>
109   - {{/if}}
  110 + <span class="sm-grey">{{gps.source}}</span>
110 111 </td>
111 112 </tr>
112 113 {{/each}}
... ...