Commit 5a78b34aaa910929eaa06662aa5d60c4e225f40a

Authored by 王通
1 parent 841c9a3e

1.针对线路预设区间的处理

Too many changes to show.

To preserve performance only 16 of 37 files are displayed.

src/main/java/com/bsth/data/directive/DayOfDirectives.java
1 -package com.bsth.data.directive;  
2 -  
3 -import com.alibaba.fastjson.JSONObject;  
4 -import com.bsth.data.LineConfigData;  
5 -import com.bsth.entity.directive.D60;  
6 -import com.bsth.entity.directive.D64;  
7 -import com.bsth.entity.directive.Directive;  
8 -import com.bsth.entity.directive.DirectiveReponse;  
9 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
10 -import com.bsth.service.directive.DirectiveService;  
11 -import com.bsth.websocket.handler.SendUtils;  
12 -import org.slf4j.Logger;  
13 -import org.slf4j.LoggerFactory;  
14 -import org.springframework.beans.factory.annotation.Autowired;  
15 -import org.springframework.stereotype.Component;  
16 -  
17 -import java.util.*;  
18 -import java.util.concurrent.ConcurrentHashMap;  
19 -import java.util.concurrent.ConcurrentLinkedQueue;  
20 -import java.util.concurrent.ConcurrentMap;  
21 -  
22 -/**  
23 - *  
24 - * @ClassName: CurrDayDirectives  
25 - * @Description: TODO(当天指令数据)  
26 - * @author PanZhao  
27 - * @date 2016年8月14日 下午5:23:59  
28 - *  
29 - */  
30 -@Component  
31 -public class DayOfDirectives {  
32 -  
33 - // 当日60指令缓存  
34 - private static ConcurrentMap<Integer, D60> d60Map;  
35 -  
36 - // 线路切换指令 64  
37 - public static ConcurrentMap<String, D64> d64Map;  
38 -  
39 - //等待插入的指令  
40 - public static ConcurrentLinkedQueue<Directive> pstDirectives;  
41 - //等待更新的指令  
42 - public static ConcurrentLinkedQueue<D60> pstD60s;  
43 -  
44 - @Autowired  
45 - DirectiveService directiveService;  
46 -  
47 - @Autowired  
48 - SendUtils sendUtils;  
49 -  
50 - @Autowired  
51 - LineConfigData lineConfigData;  
52 -  
53 - static Logger logger = LoggerFactory.getLogger(DayOfDirectives.class);  
54 -  
55 -  
56 - static{  
57 - d60Map = new ConcurrentHashMap<>();  
58 - d64Map = new ConcurrentHashMap<>();  
59 - pstDirectives = new ConcurrentLinkedQueue<>();  
60 - pstD60s = new ConcurrentLinkedQueue<>();  
61 - }  
62 -  
63 - public void put60(D60 d60) {  
64 - d60Map.put(d60.getMsgId(), d60);  
65 - //等待持久化  
66 - pstDirectives.add(d60);  
67 - }  
68 -  
69 - public void put64(D64 d64) {  
70 - d64Map.put(d64.getKey(), d64);  
71 - //等待持久化  
72 - pstDirectives.add(d64);  
73 - }  
74 -  
75 - /**  
76 - *  
77 - * @Title: reply @Description: TODO(指令 46,47 响应) @throws  
78 - */  
79 - public void reply(DirectiveReponse res) {  
80 - Integer msgId = res.getMsgId();  
81 - if (msgId == null) {  
82 - logger.error("reply error , msgId is null.");  
83 - return;  
84 - }  
85 -  
86 - D60 d60 = d60Map.get(msgId);  
87 -  
88 - if (null == d60) {  
89 - logger.error("找不到msgId: " + msgId + " 对应的指令数据");  
90 - return;  
91 - }  
92 -  
93 - switch (res.getStatus()) {  
94 - case 0:  
95 - d60.setReply46((short) -1);// 失败  
96 - break;  
97 - case 1:  
98 - d60.setReply46((short) 0);// 发送成功  
99 - d60.setReply46Time(System.currentTimeMillis());  
100 - break;  
101 - case 2:  
102 - d60.setReply47((short) 0);// 驾驶员阅读  
103 - d60.setReply47Time(System.currentTimeMillis());  
104 - break;  
105 - }  
106 -  
107 - //更新60数据  
108 - pstD60s.add(d60);  
109 -  
110 - ScheduleRealInfo sch = d60.getSch();  
111 - if (null == sch)  
112 - return;  
113 -  
114 - if (d60.isDispatch()) {  
115 - // 更新班次状态  
116 - sch.setDirectiveState(res.getStatus() * 100);  
117 - // 通知页面  
118 - sendUtils.sendDirectiveToPage(sch);  
119 - }  
120 - }  
121 -  
122 - /**  
123 - *  
124 - * @Title: reply64 @Description: TODO(64 协议响应) @throws  
125 - */  
126 - public void reply64(JSONObject json) {  
127 - String key = json.getString("deviceId") + "_" + json.getString("timestamp");  
128 -  
129 - D64 d64 = d64Map.get(key);  
130 -  
131 - if (null == d64)  
132 - logger.warn("64响应 -找不到请求源,json: " + json);  
133 - else {  
134 - JSONObject data = json.getJSONObject("data");  
135 -  
136 - if (null == data)  
137 - logger.warn("64响应 data is null ,json: " + json);  
138 - else {  
139 - logger.info(d64.getDeviceId() + "_" + d64.getData().getLineId() + "响应:" + data.getShort("requestAck"));  
140 - /*d64.setRespAck(data.getShort("requestAck"));  
141 - // 持久化*/  
142 - //64 响应不入库了...  
143 - }  
144 - }  
145 - }  
146 -  
147 - @Autowired  
148 - DirectivesPstThread directivesPstThread;  
149 - public void clearAll(){  
150 - d60Map = new ConcurrentHashMap<>();  
151 - d64Map = new ConcurrentHashMap<>();  
152 - logger.info("清除指令数据 ,,,");  
153 - }  
154 -  
155 - public Collection<D60> all60(){  
156 - return d60Map.values();  
157 - }  
158 -  
159 - public Collection<D64> all64(){  
160 - return d64Map.values();  
161 - }  
162 -  
163 - public D60 get(Integer msgId){  
164 - return d60Map.get(msgId);  
165 - }  
166 -  
167 - public Collection<Directive> all(){  
168 - List<Directive> all = new ArrayList<>();  
169 - all.addAll(d60Map.values());  
170 - all.addAll(d64Map.values());  
171 -  
172 - return all;  
173 - }  
174 -  
175 - public static class DComparator implements Comparator<Directive>{  
176 -  
177 - @Override  
178 - public int compare(Directive d1, Directive d2) {  
179 - return (int) (d2.getTimestamp() - d1.getTimestamp());  
180 - }  
181 - }  
182 - } 1 +package com.bsth.data.directive;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import com.bsth.data.LineConfigData;
  5 +import com.bsth.entity.directive.D60;
  6 +import com.bsth.entity.directive.D64;
  7 +import com.bsth.entity.directive.Directive;
  8 +import com.bsth.entity.directive.DirectiveReponse;
  9 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  10 +import com.bsth.service.directive.DirectiveService;
  11 +import com.bsth.websocket.handler.SendUtils;
  12 +import org.slf4j.Logger;
  13 +import org.slf4j.LoggerFactory;
  14 +import org.springframework.beans.factory.annotation.Autowired;
  15 +import org.springframework.stereotype.Component;
  16 +
  17 +import java.util.*;
  18 +import java.util.concurrent.ConcurrentHashMap;
  19 +import java.util.concurrent.ConcurrentLinkedQueue;
  20 +import java.util.concurrent.ConcurrentMap;
  21 +
  22 +/**
  23 + *
  24 + * @ClassName: CurrDayDirectives
  25 + * @Description: TODO(当天指令数据)
  26 + * @author PanZhao
  27 + * @date 2016年8月14日 下午5:23:59
  28 + *
  29 + */
  30 +@Component
  31 +public class DayOfDirectives {
  32 +
  33 + // 当日60指令缓存
  34 + private static ConcurrentMap<Integer, D60> d60Map;
  35 +
  36 + // 线路切换指令 64
  37 + public static ConcurrentMap<String, D64> d64Map;
  38 +
  39 + //等待插入的指令
  40 + public static ConcurrentLinkedQueue<Directive> pstDirectives;
  41 + //等待更新的指令
  42 + public static ConcurrentLinkedQueue<D60> pstD60s;
  43 +
  44 + @Autowired
  45 + DirectiveService directiveService;
  46 +
  47 + @Autowired
  48 + SendUtils sendUtils;
  49 +
  50 + @Autowired
  51 + LineConfigData lineConfigData;
  52 +
  53 + static Logger logger = LoggerFactory.getLogger(DayOfDirectives.class);
  54 +
  55 +
  56 + static{
  57 + d60Map = new ConcurrentHashMap<>();
  58 + d64Map = new ConcurrentHashMap<>();
  59 + pstDirectives = new ConcurrentLinkedQueue<>();
  60 + pstD60s = new ConcurrentLinkedQueue<>();
  61 + }
  62 +
  63 + public void put60(D60 d60) {
  64 + d60Map.put(d60.getMsgId(), d60);
  65 + //等待持久化
  66 + pstDirectives.add(d60);
  67 + }
  68 +
  69 + public void put64(D64 d64) {
  70 + d64Map.put(d64.getKey(), d64);
  71 + //等待持久化
  72 + pstDirectives.add(d64);
  73 + }
  74 +
  75 + /**
  76 + *
  77 + * @Title: reply @Description: TODO(指令 46,47 响应) @throws
  78 + */
  79 + public void reply(DirectiveReponse res) {
  80 + Integer msgId = res.getMsgId();
  81 + if (msgId == null) {
  82 + logger.error("reply error , msgId is null.");
  83 + return;
  84 + }
  85 +
  86 + D60 d60 = d60Map.get(msgId);
  87 +
  88 + if (null == d60) {
  89 + logger.error("找不到msgId: " + msgId + " 对应的指令数据");
  90 + return;
  91 + }
  92 +
  93 + switch (res.getStatus()) {
  94 + case 0:
  95 + d60.setReply46((short) -1);// 失败
  96 + break;
  97 + case 1:
  98 + d60.setReply46((short) 0);// 发送成功
  99 + d60.setReply46Time(System.currentTimeMillis());
  100 + break;
  101 + case 2:
  102 + d60.setReply47((short) 0);// 驾驶员阅读
  103 + d60.setReply47Time(System.currentTimeMillis());
  104 + break;
  105 + }
  106 +
  107 + //更新60数据
  108 + pstD60s.add(d60);
  109 +
  110 + ScheduleRealInfo sch = d60.getSch();
  111 + if (null == sch)
  112 + return;
  113 +
  114 + if (d60.isDispatch()) {
  115 + // 更新班次状态
  116 + sch.setDirectiveState(res.getStatus() * 100);
  117 + // 通知页面
  118 + sendUtils.sendDirectiveToPage(sch);
  119 + }
  120 + }
  121 +
  122 + /**
  123 + *
  124 + * @Title: reply64 @Description: TODO(64 协议响应) @throws
  125 + */
  126 + public void reply64(JSONObject json) {
  127 + String key = json.getString("deviceId") + "_" + json.getString("timestamp");
  128 +
  129 + D64 d64 = d64Map.get(key);
  130 +
  131 + if (null == d64)
  132 + logger.warn("64响应 -找不到请求源,json: " + json);
  133 + else {
  134 + JSONObject data = json.getJSONObject("data");
  135 +
  136 + if (null == data)
  137 + logger.warn("64响应 data is null ,json: " + json);
  138 + else {
  139 + logger.info(d64.getDeviceId() + "_" + d64.getData().getLineId() + "响应:" + data.getShort("requestAck"));
  140 + ScheduleRealInfo sch = d64.getSch();
  141 + if (sch != null) {
  142 + sch.setRegionSwitchState(1);
  143 + }
  144 + /*d64.setRespAck(data.getShort("requestAck"));
  145 + // 持久化*/
  146 + //64 响应不入库了...
  147 + }
  148 + }
  149 + }
  150 +
  151 + @Autowired
  152 + DirectivesPstThread directivesPstThread;
  153 + public void clearAll(){
  154 + d60Map = new ConcurrentHashMap<>();
  155 + d64Map = new ConcurrentHashMap<>();
  156 + logger.info("清除指令数据 ,,,");
  157 + }
  158 +
  159 + public Collection<D60> all60(){
  160 + return d60Map.values();
  161 + }
  162 +
  163 + public Collection<D64> all64(){
  164 + return d64Map.values();
  165 + }
  166 +
  167 + public D60 get(Integer msgId){
  168 + return d60Map.get(msgId);
  169 + }
  170 +
  171 + public Collection<Directive> all(){
  172 + List<Directive> all = new ArrayList<>();
  173 + all.addAll(d60Map.values());
  174 + all.addAll(d64Map.values());
  175 +
  176 + return all;
  177 + }
  178 +
  179 + public static class DComparator implements Comparator<Directive>{
  180 +
  181 + @Override
  182 + public int compare(Directive d1, Directive d2) {
  183 + return (int) (d2.getTimestamp() - d1.getTimestamp());
  184 + }
  185 + }
  186 + }
src/main/java/com/bsth/data/directive/DirectiveCreator.java
1 -package com.bsth.data.directive;  
2 -  
3 -import com.alibaba.fastjson.JSON;  
4 -import com.bsth.data.BasicData;  
5 -import com.bsth.entity.directive.D60;  
6 -import com.bsth.entity.directive.D60.D60Data;  
7 -import com.bsth.entity.directive.D64;  
8 -import com.bsth.entity.directive.D64.D64Data;  
9 -import org.slf4j.Logger;  
10 -import org.slf4j.LoggerFactory;  
11 -  
12 -import java.text.SimpleDateFormat;  
13 -import java.util.Date;  
14 -import java.util.HashMap;  
15 -import java.util.Map;  
16 -  
17 -/**  
18 - *  
19 - * @ClassName: DirectiveCreator  
20 - * @Description: TODO(指令数据生成)  
21 - * @author PanZhao  
22 - * @date 2016年8月14日 下午9:57:07  
23 - *  
24 - */  
25 -public class DirectiveCreator {  
26 -  
27 - // 城市代码  
28 - static final short cityCode = 22;  
29 -  
30 - static Logger logger = LoggerFactory.getLogger(DirectiveCreator.class);  
31 -  
32 - /**  
33 - *  
34 - * @Title: createDirective60  
35 - * @Description: TODO(创建60数据包)  
36 - * @param @param nbbm 车辆内部编码  
37 - * @param @param text 文本  
38 - * @param @param dispatchInstruct 指令类型(0X00表示信息短语,0X01表示取消上次指令+调度指令(闹钟有效),0x02表示为调度指令(闹钟有效); 0x03表示运营状态指令(闹钟无效);0x04表示其他指令)  
39 - * @param @param upDown 上下行(0 上行 1 下行)  
40 - * @param @param state 营运状态(0 营运 1 非营运)  
41 - * @param @return 设定文件  
42 - * @return Directive60 返回类型  
43 - * @throws  
44 - */  
45 - public D60 createD60(String nbbm, String text, Short dispatchInstruct, int upDown, int state,String lineCode) {  
46 - Long timestamp = System.currentTimeMillis();  
47 -  
48 - Short company = Short.parseShort(BasicData.nbbm2CompanyCodeMap.get(nbbm));  
49 - String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);  
50 -  
51 - int msgId = MsgIdGenerator.getMsgId();  
52 -  
53 - D60 directive = new D60();  
54 - D60Data data = new D60Data();  
55 - // 一级协议  
56 - directive.setOperCode((short) 0x60);  
57 - // 设备号  
58 - directive.setDeviceId(deviceId);  
59 - // 时间戳  
60 - directive.setTimestamp(timestamp);  
61 - directive.setMsgId(msgId);  
62 - // 构造数据  
63 - data.setDeviceId(deviceId);  
64 - data.setDispatchInstruct(dispatchInstruct);  
65 - data.setTimestamp(timestamp);  
66 - data.setCompanyCode(company);  
67 - data.setMsgId(msgId);  
68 - directive.setData(data);  
69 - directive.setLineCode(lineCode);  
70 - long serviceState;  
71 - try {  
72 - serviceState = Consts.SERVICE_STATE[upDown][state];  
73 - } catch (IndexOutOfBoundsException e) {  
74 - // 未知营运状态的直接默认为上行非营运  
75 - serviceState = Consts.SERVICE_STATE[0][1];  
76 - }  
77 - data.setServiceState(serviceState);  
78 - data.setTxtContent(text);  
79 -  
80 - return directive;  
81 - }  
82 -  
83 -  
84 - public D60 createD60_02(String nbbm, String text, int upDown, int state, Date alarmTime){  
85 - SimpleDateFormat sdfMMddHHmm = new SimpleDateFormat("MMddHHmm");  
86 -  
87 - Long timestamp = System.currentTimeMillis();  
88 -  
89 - Short company = Short.parseShort(BasicData.nbbm2CompanyCodeMap.get(nbbm));  
90 - String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);  
91 -  
92 - int msgId = MsgIdGenerator.getMsgId();  
93 -  
94 - D60 directive = new D60();  
95 - D60Data data = new D60Data();  
96 - // 一级协议  
97 - directive.setOperCode((short) 0x60);  
98 - // 设备号  
99 - directive.setDeviceId(deviceId);  
100 - // 时间戳  
101 - directive.setTimestamp(timestamp);  
102 - directive.setMsgId(msgId);  
103 - // 构造数据  
104 - data.setDeviceId(deviceId);  
105 - data.setDispatchInstruct((short) 0x02);  
106 - data.setTimestamp(timestamp);  
107 - data.setCompanyCode(company);  
108 - data.setMsgId(msgId);  
109 - data.setAlarmTime(Long.parseLong(sdfMMddHHmm.format(alarmTime)));  
110 - directive.setData(data);  
111 - long serviceState;  
112 - try {  
113 - serviceState = Consts.SERVICE_STATE[upDown][state];  
114 - } catch (IndexOutOfBoundsException e) {  
115 - // 未知营运状态的直接默认为上行非营运  
116 - serviceState = Consts.SERVICE_STATE[0][1];  
117 - }  
118 - data.setServiceState(serviceState);  
119 - data.setTxtContent(text);  
120 - return directive;  
121 - }  
122 -  
123 - /**  
124 - *  
125 - * @Title: createD64  
126 - * @Description: TODO(创建线路切换指令 64)  
127 - * @param @param nbbm 车辆内部编码  
128 - * @param @param lineId 线路编码  
129 - * @param @param t 时间戳  
130 - * @throws  
131 -  
132 - public D64 createD64(String nbbm, String lineCode, long t){  
133 - String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);  
134 - return create64(deviceId, lineCode, t);  
135 - }*/  
136 -  
137 - public D64 create64(String deviceId, String lineCode, long t){  
138 - D64 change = new D64();  
139 - D64Data data = new D64Data();  
140 - data.setCityCode(cityCode);  
141 - data.setDeviceId(deviceId);  
142 -  
143 - //线路编码补满6位数  
144 - String lineCodeStr = padLeft(lineCode, 6, '0');  
145 - data.setLineId(lineCodeStr);  
146 -  
147 - change.setDeviceId(deviceId);  
148 - change.setOperCode((short) 0X64);  
149 - change.setTimestamp(t);  
150 - change.setData(data);  
151 -  
152 - return change;  
153 - }  
154 -  
155 - /**  
156 - *  
157 - * @Title: createDeviceRefreshData  
158 - * @Description: TODO(线路刷新指令(用于切换线路后,要求设置重新下载线路文件))  
159 - * @param @param deviceId 设备编号  
160 - * @param @param lineId 线路ID  
161 - * @throws  
162 - */  
163 - public String createDeviceRefreshData(String deviceId, String lineCode) {  
164 - Long t = System.currentTimeMillis();  
165 - Map<String, Object> param = new HashMap<>();  
166 - param.put("deviceId", deviceId);  
167 - param.put("timestamp", t);  
168 - param.put("operCode", 0Xc0);  
169 -  
170 - Map<String, Object> data = new HashMap<>();  
171 - data.put("operCode2", 0xa1);  
172 - data.put("cityCode", cityCode);  
173 - data.put("deviceId", deviceId);  
174 - data.put("timestamp", t);  
175 - data.put("centerId", 1);  
176 -  
177 - //线路编码补满6位数  
178 - String lineCodeStr = padLeft(lineCode, 6, '0');  
179 -  
180 - data.put("lineId", lineCodeStr);  
181 - data.put("lineVersion", 0);  
182 - data.put("carparkDataVersion", 0);  
183 - param.put("data", data);  
184 -  
185 - return JSON.toJSONString(param);  
186 - }  
187 -  
188 - public String padLeft(String oriStr,int len,char alexin){  
189 - String str = "";  
190 - int strlen = oriStr.length();  
191 - if(strlen < len){  
192 - for(int i=0;i<len-strlen;i++){  
193 - str = str+alexin;  
194 - }  
195 - }  
196 - str = str + oriStr;  
197 - return str;  
198 - }  
199 -} 1 +package com.bsth.data.directive;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.bsth.data.BasicData;
  5 +import com.bsth.entity.directive.D60;
  6 +import com.bsth.entity.directive.D60.D60Data;
  7 +import com.bsth.entity.directive.D64;
  8 +import com.bsth.entity.directive.D64.D64Data;
  9 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  10 +import org.slf4j.Logger;
  11 +import org.slf4j.LoggerFactory;
  12 +import org.springframework.util.StringUtils;
  13 +
  14 +import java.text.SimpleDateFormat;
  15 +import java.util.Date;
  16 +import java.util.HashMap;
  17 +import java.util.Map;
  18 +
  19 +/**
  20 + *
  21 + * @ClassName: DirectiveCreator
  22 + * @Description: TODO(指令数据生成)
  23 + * @author PanZhao
  24 + * @date 2016年8月14日 下午9:57:07
  25 + *
  26 + */
  27 +public class DirectiveCreator {
  28 +
  29 + // 城市代码
  30 + static final short cityCode = 22;
  31 +
  32 + static Logger logger = LoggerFactory.getLogger(DirectiveCreator.class);
  33 +
  34 + /**
  35 + *
  36 + * @Title: createDirective60
  37 + * @Description: TODO(创建60数据包)
  38 + * @param @param nbbm 车辆内部编码
  39 + * @param @param text 文本
  40 + * @param @param dispatchInstruct 指令类型(0X00表示信息短语,0X01表示取消上次指令+调度指令(闹钟有效),0x02表示为调度指令(闹钟有效); 0x03表示运营状态指令(闹钟无效);0x04表示其他指令)
  41 + * @param @param upDown 上下行(0 上行 1 下行)
  42 + * @param @param state 营运状态(0 营运 1 非营运)
  43 + * @param @return 设定文件
  44 + * @return Directive60 返回类型
  45 + * @throws
  46 + */
  47 + public D60 createD60(String nbbm, String text, Short dispatchInstruct, int upDown, int state,String lineCode) {
  48 + Long timestamp = System.currentTimeMillis();
  49 +
  50 + Short company = Short.parseShort(BasicData.nbbm2CompanyCodeMap.get(nbbm));
  51 + String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
  52 +
  53 + int msgId = MsgIdGenerator.getMsgId();
  54 +
  55 + D60 directive = new D60();
  56 + D60Data data = new D60Data();
  57 + // 一级协议
  58 + directive.setOperCode((short) 0x60);
  59 + // 设备号
  60 + directive.setDeviceId(deviceId);
  61 + // 时间戳
  62 + directive.setTimestamp(timestamp);
  63 + directive.setMsgId(msgId);
  64 + // 构造数据
  65 + data.setDeviceId(deviceId);
  66 + data.setDispatchInstruct(dispatchInstruct);
  67 + data.setTimestamp(timestamp);
  68 + data.setCompanyCode(company);
  69 + data.setMsgId(msgId);
  70 + directive.setData(data);
  71 + directive.setLineCode(lineCode);
  72 + long serviceState;
  73 + try {
  74 + serviceState = Consts.SERVICE_STATE[upDown][state];
  75 + } catch (IndexOutOfBoundsException e) {
  76 + // 未知营运状态的直接默认为上行非营运
  77 + serviceState = Consts.SERVICE_STATE[0][1];
  78 + }
  79 + data.setServiceState(serviceState);
  80 + data.setTxtContent(text);
  81 +
  82 + return directive;
  83 + }
  84 +
  85 +
  86 + public D60 createD60_02(String nbbm, String text, int upDown, int state, Date alarmTime){
  87 + SimpleDateFormat sdfMMddHHmm = new SimpleDateFormat("MMddHHmm");
  88 +
  89 + Long timestamp = System.currentTimeMillis();
  90 +
  91 + Short company = Short.parseShort(BasicData.nbbm2CompanyCodeMap.get(nbbm));
  92 + String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
  93 +
  94 + int msgId = MsgIdGenerator.getMsgId();
  95 +
  96 + D60 directive = new D60();
  97 + D60Data data = new D60Data();
  98 + // 一级协议
  99 + directive.setOperCode((short) 0x60);
  100 + // 设备号
  101 + directive.setDeviceId(deviceId);
  102 + // 时间戳
  103 + directive.setTimestamp(timestamp);
  104 + directive.setMsgId(msgId);
  105 + // 构造数据
  106 + data.setDeviceId(deviceId);
  107 + data.setDispatchInstruct((short) 0x02);
  108 + data.setTimestamp(timestamp);
  109 + data.setCompanyCode(company);
  110 + data.setMsgId(msgId);
  111 + data.setAlarmTime(Long.parseLong(sdfMMddHHmm.format(alarmTime)));
  112 + directive.setData(data);
  113 + long serviceState;
  114 + try {
  115 + serviceState = Consts.SERVICE_STATE[upDown][state];
  116 + } catch (IndexOutOfBoundsException e) {
  117 + // 未知营运状态的直接默认为上行非营运
  118 + serviceState = Consts.SERVICE_STATE[0][1];
  119 + }
  120 + data.setServiceState(serviceState);
  121 + data.setTxtContent(text);
  122 + return directive;
  123 + }
  124 +
  125 + /**
  126 + *
  127 + * @Title: createD64
  128 + * @Description: TODO(创建线路切换指令 64)
  129 + * @param @param nbbm 车辆内部编码
  130 + * @param @param lineId 线路编码
  131 + * @param @param t 时间戳
  132 + * @throws
  133 +
  134 + public D64 createD64(String nbbm, String lineCode, long t){
  135 + String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
  136 + return create64(deviceId, lineCode, t);
  137 + }*/
  138 +
  139 + public D64 create64(String deviceId, String lineCode, ScheduleRealInfo sch, long t){
  140 + D64 change = new D64();
  141 + D64Data data = new D64Data();
  142 + data.setCityCode(cityCode);
  143 + data.setDeviceId(deviceId);
  144 +
  145 + //线路编码补满6位数
  146 + String lineCodeStr = padLeft(lineCode, 6, '0');
  147 + data.setLineId(lineCodeStr);
  148 + int seq = 0;
  149 + if (sch != null) {
  150 + String regionId = sch.getRegionId();
  151 + if (StringUtils.hasText(regionId)) {
  152 + seq = Integer.parseInt(regionId.split("_")[1]);
  153 + }
  154 + }
  155 + data.setSeq(seq);
  156 +
  157 + change.setDeviceId(deviceId);
  158 + change.setOperCode((short) 0X64);
  159 + change.setTimestamp(t);
  160 + change.setData(data);
  161 + change.setSch(sch);
  162 +
  163 + return change;
  164 + }
  165 +
  166 + /**
  167 + *
  168 + * @Title: createDeviceRefreshData
  169 + * @Description: TODO(线路刷新指令(用于切换线路后,要求设置重新下载线路文件))
  170 + * @param @param deviceId 设备编号
  171 + * @param @param lineId 线路ID
  172 + * @throws
  173 + */
  174 + public String createDeviceRefreshData(String deviceId, String lineCode) {
  175 + Long t = System.currentTimeMillis();
  176 + Map<String, Object> param = new HashMap<>();
  177 + param.put("deviceId", deviceId);
  178 + param.put("timestamp", t);
  179 + param.put("operCode", 0Xc0);
  180 +
  181 + Map<String, Object> data = new HashMap<>();
  182 + data.put("operCode2", 0xa1);
  183 + data.put("cityCode", cityCode);
  184 + data.put("deviceId", deviceId);
  185 + data.put("timestamp", t);
  186 + data.put("centerId", 1);
  187 +
  188 + //线路编码补满6位数
  189 + String lineCodeStr = padLeft(lineCode, 6, '0');
  190 +
  191 + data.put("lineId", lineCodeStr);
  192 + data.put("lineVersion", 0);
  193 + data.put("carparkDataVersion", 0);
  194 + param.put("data", data);
  195 +
  196 + return JSON.toJSONString(param);
  197 + }
  198 +
  199 + public String padLeft(String oriStr,int len,char alexin){
  200 + String str = "";
  201 + int strlen = oriStr.length();
  202 + if(strlen < len){
  203 + for(int i=0;i<len-strlen;i++){
  204 + str = str+alexin;
  205 + }
  206 + }
  207 + str = str + oriStr;
  208 + return str;
  209 + }
  210 +}
src/main/java/com/bsth/data/gpsdata_v2/handlers/GpsStateProcess.java
1 -package com.bsth.data.gpsdata_v2.handlers;  
2 -  
3 -import com.bsth.data.gpsdata_v2.entity.GpsEntity;  
4 -import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;  
5 -import com.bsth.data.schedule.DayOfSchedule;  
6 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
7 -import org.springframework.beans.factory.annotation.Autowired;  
8 -import org.springframework.stereotype.Component;  
9 -  
10 -import java.util.concurrent.ConcurrentHashMap;  
11 -import java.util.concurrent.ConcurrentMap;  
12 -  
13 -/**  
14 - * GPS 状态处理  
15 - * Created by panzhao on 2017/11/15.  
16 - */  
17 -@Component  
18 -public class GpsStateProcess {  
19 -  
20 - @Autowired  
21 - DayOfSchedule dayOfSchedule;  
22 -  
23 - @Autowired  
24 - GpsStatusManager gpsStatusManager;  
25 -  
26 - /**  
27 - * 设置状态差异连续次数  
28 - */  
29 - private static ConcurrentMap<String, Integer> stateDiffMap = new ConcurrentHashMap<>();  
30 -  
31 - private final static int CHANGE_THRESHOLD = 2;  
32 -  
33 - public void process(GpsEntity gps) {  
34 - //在执行的任务  
35 - ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());  
36 -  
37 - if (null == sch)  
38 - return;  
39 -  
40 - int upDown = Integer.parseInt(sch.getXlDir());  
41 - int schState = dayOfSchedule.emptyService(sch)?1:0;  
42 - String device = gps.getDeviceId();  
43 - /**  
44 - * 网关在进终点的时候,会直接将当前点位状态改变  
45 - * 为避免出现单个点的状态跳动,设置一下切换阈值  
46 - */  
47 - if(gps.getState() != schState || gps.getUpDown() != upDown){  
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());  
64 - }  
65 - else  
66 - stateDiffMap.put(device, 0);  
67 -  
68 - if (gps.getUpDown() != upDown) {  
69 - gps.setUpDown((byte) upDown);//修正走向  
70 - }  
71 -  
72 - if(gps.getState() != schState){  
73 - gps.setState(schState);//修正营运状态  
74 - }  
75 -  
76 - if (!sch.getXlBm().equals(gps.getLineId())) {  
77 - //切换车载的 线路编码  
78 - gpsStatusManager.changeLine(gps.getNbbm(), sch.getXlBm(), "同步@系统");  
79 - }  
80 - }  
81 -} 1 +package com.bsth.data.gpsdata_v2.handlers;
  2 +
  3 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  4 +import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;
  5 +import com.bsth.data.schedule.DayOfSchedule;
  6 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.stereotype.Component;
  9 +import org.springframework.util.StringUtils;
  10 +
  11 +import java.util.concurrent.ConcurrentHashMap;
  12 +import java.util.concurrent.ConcurrentMap;
  13 +
  14 +/**
  15 + * GPS 状态处理
  16 + * Created by panzhao on 2017/11/15.
  17 + */
  18 +@Component
  19 +public class GpsStateProcess {
  20 +
  21 + @Autowired
  22 + DayOfSchedule dayOfSchedule;
  23 +
  24 + @Autowired
  25 + GpsStatusManager gpsStatusManager;
  26 +
  27 + /**
  28 + * 设置状态差异连续次数
  29 + */
  30 + private static ConcurrentMap<String, Integer> stateDiffMap = new ConcurrentHashMap<>();
  31 +
  32 + private final static int CHANGE_THRESHOLD = 2;
  33 +
  34 + public void process(GpsEntity gps) {
  35 + if ("W7G-083".equals(gps.getNbbm())) {
  36 + System.out.println("a");
  37 + }
  38 + //在执行的任务
  39 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
  40 +
  41 + if (null == sch)
  42 + return;
  43 +
  44 + int upDown = Integer.parseInt(sch.getXlDir());
  45 + int schState = dayOfSchedule.emptyService(sch)?1:0;
  46 + String device = gps.getDeviceId();
  47 + /**
  48 + * 网关在进终点的时候,会直接将当前点位状态改变
  49 + * 为避免出现单个点的状态跳动,设置一下切换阈值
  50 + */
  51 + if(gps.getState() != schState || gps.getUpDown() != upDown){
  52 + Integer count = 0;
  53 + if(stateDiffMap.containsKey(device))
  54 + count = stateDiffMap.get(device);
  55 +
  56 + count ++;
  57 +
  58 + if(count >= CHANGE_THRESHOLD){
  59 + //下发指令纠正车载的 营运状态 和 走向
  60 + gpsStatusManager.changeServiceState(gps.getNbbm(), upDown, schState, "同步@系统");
  61 + count = 0;
  62 + }
  63 +
  64 + stateDiffMap.put(device, count);
  65 +
  66 + //记录原始设备状态
  67 + gps.setOrigStateStr(gps.getUpDown() + "_" + gps.getState());
  68 + }
  69 + else
  70 + stateDiffMap.put(device, 0);
  71 +
  72 + if (gps.getUpDown() != upDown) {
  73 + gps.setUpDown((byte) upDown);//修正走向
  74 + }
  75 +
  76 + if(gps.getState() != schState){
  77 + gps.setState(schState);//修正营运状态
  78 + }
  79 +
  80 + // 线路编码不一致或者未接收到切换区间线的响应
  81 + if (!sch.getXlBm().equals(gps.getLineId()) || StringUtils.hasText(sch.getRegionId()) && sch.getRegionSwitchState() == 0) {
  82 + //切换车载的 线路编码
  83 + gpsStatusManager.changeLine(gps.getNbbm(), sch, "同步@系统");
  84 + }
  85 + }
  86 +}
src/main/java/com/bsth/data/gpsdata_v2/handlers/InStationProcess.java
@@ -183,7 +183,7 @@ public class InStationProcess { @@ -183,7 +183,7 @@ public class InStationProcess {
183 183
184 //套跑 -下发线路切换指令 184 //套跑 -下发线路切换指令
185 if (null != next && !next.getXlBm().equals(sch.getXlBm())) { 185 if (null != next && !next.getXlBm().equals(sch.getXlBm())) {
186 - gpsStatusManager.changeLine(next.getClZbh(), next.getXlBm(), "套跑@系统"); 186 + gpsStatusManager.changeLine(next.getClZbh(), next, "套跑@系统");
187 } 187 }
188 188
189 /** 189 /**
src/main/java/com/bsth/data/gpsdata_v2/rfid/handle/RfidSignalHandle.java
1 -package com.bsth.data.gpsdata_v2.rfid.handle;  
2 -  
3 -import com.bsth.data.gpsdata_v2.rfid.entity.RfidInoutStation;  
4 -import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;  
5 -import com.bsth.data.msg_queue.DirectivePushQueue;  
6 -import com.bsth.data.schedule.DayOfSchedule;  
7 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
8 -import com.bsth.websocket.handler.SendUtils;  
9 -import org.apache.commons.lang3.StringUtils;  
10 -import org.slf4j.Logger;  
11 -import org.slf4j.LoggerFactory;  
12 -import org.springframework.beans.factory.annotation.Autowired;  
13 -import org.springframework.stereotype.Component;  
14 -  
15 -import java.util.List;  
16 -  
17 -/**  
18 - * RFID信号处理  
19 - * Created by panzhao on 2017/11/22.  
20 - */  
21 -@Component  
22 -public class RfidSignalHandle {  
23 -  
24 - @Autowired  
25 - DayOfSchedule dayOfSchedule;  
26 -  
27 - @Autowired  
28 - SendUtils sendUtils;  
29 -  
30 - @Autowired  
31 - GpsStatusManager gpsStatusManager;  
32 -  
33 - private final static int MAX_TIME_DIFF = 1000 * 60 * 60 * 2;  
34 -  
35 - Logger logger = LoggerFactory.getLogger(this.getClass());  
36 -  
37 - public void handle(List<RfidInoutStation> list){  
38 - for(RfidInoutStation signal : list){  
39 - if(signal.getType()==2)  
40 - in(signal);  
41 - else if(signal.getType()==4)  
42 - out(signal);  
43 - }  
44 - }  
45 -  
46 - /**  
47 - * 出  
48 - * @param signal  
49 - */  
50 - private void out(RfidInoutStation signal) {  
51 - try{  
52 - String nbbm = signal.getNbbm();  
53 - ScheduleRealInfo sch = dayOfSchedule.executeCurr(nbbm);  
54 -  
55 - if(null == sch)  
56 - return;  
57 -  
58 - //最大时间差  
59 - if(Math.abs(sch.getDfsjT() - signal.getT()) > MAX_TIME_DIFF)  
60 - return;  
61 -  
62 - if(sch.getQdzCode().equals(signal.getStation())  
63 - && StringUtils.isEmpty(sch.getFcsjActual())){  
64 -  
65 - //班次发车  
66 - sch.setFcsjActualAll(signal.getT());  
67 -  
68 - //webSocket  
69 - sendUtils.sendFcsj(sch);  
70 -  
71 - //持久化  
72 - dayOfSchedule.save(sch);  
73 -  
74 - logger.info("RFID; 车辆:" + sch.getClZbh() + " 班次:" + sch.getDfsj() + "发车, 时间:" + sch.getFcsjActual());  
75 - }  
76 - }catch (Exception e){  
77 - logger.error("", e);  
78 - }  
79 - }  
80 -  
81 - /**  
82 - * 进  
83 - * @param signal  
84 - */  
85 - private void in(RfidInoutStation signal) {  
86 - try{  
87 - String nbbm = signal.getNbbm();  
88 - ScheduleRealInfo sch = dayOfSchedule.executeCurr(nbbm);  
89 -  
90 - if(null == sch)  
91 - return;  
92 -  
93 - //最大时间差  
94 - if(Math.abs(sch.getDfsjT() - signal.getT()) > MAX_TIME_DIFF)  
95 - return;  
96 -  
97 - if(sch.getZdzCode().equals(signal.getStation())  
98 - && StringUtils.isEmpty(sch.getZdsjActual())){  
99 -  
100 - sch.setZdsjActualAll(signal.getT());  
101 -  
102 - //持久化  
103 - dayOfSchedule.save(sch);  
104 -  
105 - //车辆的下一个班次  
106 - ScheduleRealInfo next = dayOfSchedule.next(sch);  
107 - if(next != null){  
108 - dayOfSchedule.addExecPlan(next);  
109 - }  
110 -  
111 - //路牌的下一个班次,页面显示起点实际到达时间  
112 - ScheduleRealInfo lpNext = dayOfSchedule.nextByLp(sch);  
113 - if(lpNext != null){  
114 - lpNext.setQdzArrDatesj(sch.getZdsjActual());  
115 - }  
116 -  
117 - //已完成班次数  
118 - int doneSum = dayOfSchedule.doneSum(nbbm);  
119 -  
120 - //webSocket  
121 - sendUtils.sendZdsj(sch, lpNext, doneSum);  
122 -  
123 - logger.info("RFID; 车辆:" + nbbm + " 班次:" + sch.getDfsj() + "到终点, 时间:" + sch.getZdsjActual());  
124 -  
125 - //下发调度指令  
126 - DirectivePushQueue.put6002(next, doneSum, "rfid@系统", "");  
127 -  
128 - //套跑 -下发线路切换指令  
129 - if(null != next && !next.getXlBm().equals(sch.getXlBm())){  
130 - gpsStatusManager.changeLine(next.getClZbh(), next.getXlBm(), "rfid@系统");  
131 - }  
132 -  
133 - if(null == next)  
134 - nonService(sch, "rfid1@系统");//班次结束  
135 - else if(null != next && dayOfSchedule.emptyService(next))  
136 - nonService(sch, "rfid2@系统");//下一班非营运  
137 - }  
138 - }catch (Exception e){  
139 - logger.error("", e);  
140 - }  
141 - }  
142 -  
143 - /**  
144 - * 将车载设备切换为非营运状态  
145 - * @param sch  
146 - * @param sender  
147 - */  
148 - private void nonService(ScheduleRealInfo sch, String sender){  
149 - gpsStatusManager.changeServiceState(sch.getClZbh(), sch.getXlDir(), 1, sender);  
150 - } 1 +package com.bsth.data.gpsdata_v2.rfid.handle;
  2 +
  3 +import com.bsth.data.gpsdata_v2.rfid.entity.RfidInoutStation;
  4 +import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;
  5 +import com.bsth.data.msg_queue.DirectivePushQueue;
  6 +import com.bsth.data.schedule.DayOfSchedule;
  7 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  8 +import com.bsth.websocket.handler.SendUtils;
  9 +import org.apache.commons.lang3.StringUtils;
  10 +import org.slf4j.Logger;
  11 +import org.slf4j.LoggerFactory;
  12 +import org.springframework.beans.factory.annotation.Autowired;
  13 +import org.springframework.stereotype.Component;
  14 +
  15 +import java.util.List;
  16 +
  17 +/**
  18 + * RFID信号处理
  19 + * Created by panzhao on 2017/11/22.
  20 + */
  21 +@Component
  22 +public class RfidSignalHandle {
  23 +
  24 + @Autowired
  25 + DayOfSchedule dayOfSchedule;
  26 +
  27 + @Autowired
  28 + SendUtils sendUtils;
  29 +
  30 + @Autowired
  31 + GpsStatusManager gpsStatusManager;
  32 +
  33 + private final static int MAX_TIME_DIFF = 1000 * 60 * 60 * 2;
  34 +
  35 + Logger logger = LoggerFactory.getLogger(this.getClass());
  36 +
  37 + public void handle(List<RfidInoutStation> list){
  38 + for(RfidInoutStation signal : list){
  39 + if(signal.getType()==2)
  40 + in(signal);
  41 + else if(signal.getType()==4)
  42 + out(signal);
  43 + }
  44 + }
  45 +
  46 + /**
  47 + * 出
  48 + * @param signal
  49 + */
  50 + private void out(RfidInoutStation signal) {
  51 + try{
  52 + String nbbm = signal.getNbbm();
  53 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(nbbm);
  54 +
  55 + if(null == sch)
  56 + return;
  57 +
  58 + //最大时间差
  59 + if(Math.abs(sch.getDfsjT() - signal.getT()) > MAX_TIME_DIFF)
  60 + return;
  61 +
  62 + if(sch.getQdzCode().equals(signal.getStation())
  63 + && StringUtils.isEmpty(sch.getFcsjActual())){
  64 +
  65 + //班次发车
  66 + sch.setFcsjActualAll(signal.getT());
  67 +
  68 + //webSocket
  69 + sendUtils.sendFcsj(sch);
  70 +
  71 + //持久化
  72 + dayOfSchedule.save(sch);
  73 +
  74 + logger.info("RFID; 车辆:" + sch.getClZbh() + " 班次:" + sch.getDfsj() + "发车, 时间:" + sch.getFcsjActual());
  75 + }
  76 + }catch (Exception e){
  77 + logger.error("", e);
  78 + }
  79 + }
  80 +
  81 + /**
  82 + * 进
  83 + * @param signal
  84 + */
  85 + private void in(RfidInoutStation signal) {
  86 + try{
  87 + String nbbm = signal.getNbbm();
  88 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(nbbm);
  89 +
  90 + if(null == sch)
  91 + return;
  92 +
  93 + //最大时间差
  94 + if(Math.abs(sch.getDfsjT() - signal.getT()) > MAX_TIME_DIFF)
  95 + return;
  96 +
  97 + if(sch.getZdzCode().equals(signal.getStation())
  98 + && StringUtils.isEmpty(sch.getZdsjActual())){
  99 +
  100 + sch.setZdsjActualAll(signal.getT());
  101 +
  102 + //持久化
  103 + dayOfSchedule.save(sch);
  104 +
  105 + //车辆的下一个班次
  106 + ScheduleRealInfo next = dayOfSchedule.next(sch);
  107 + if(next != null){
  108 + dayOfSchedule.addExecPlan(next);
  109 + }
  110 +
  111 + //路牌的下一个班次,页面显示起点实际到达时间
  112 + ScheduleRealInfo lpNext = dayOfSchedule.nextByLp(sch);
  113 + if(lpNext != null){
  114 + lpNext.setQdzArrDatesj(sch.getZdsjActual());
  115 + }
  116 +
  117 + //已完成班次数
  118 + int doneSum = dayOfSchedule.doneSum(nbbm);
  119 +
  120 + //webSocket
  121 + sendUtils.sendZdsj(sch, lpNext, doneSum);
  122 +
  123 + logger.info("RFID; 车辆:" + nbbm + " 班次:" + sch.getDfsj() + "到终点, 时间:" + sch.getZdsjActual());
  124 +
  125 + //下发调度指令
  126 + DirectivePushQueue.put6002(next, doneSum, "rfid@系统", "");
  127 +
  128 + //套跑 -下发线路切换指令
  129 + if(null != next && !next.getXlBm().equals(sch.getXlBm())){
  130 + gpsStatusManager.changeLine(next.getClZbh(), next, "rfid@系统");
  131 + }
  132 +
  133 + if(null == next)
  134 + nonService(sch, "rfid1@系统");//班次结束
  135 + else if(null != next && dayOfSchedule.emptyService(next))
  136 + nonService(sch, "rfid2@系统");//下一班非营运
  137 + }
  138 + }catch (Exception e){
  139 + logger.error("", e);
  140 + }
  141 + }
  142 +
  143 + /**
  144 + * 将车载设备切换为非营运状态
  145 + * @param sch
  146 + * @param sender
  147 + */
  148 + private void nonService(ScheduleRealInfo sch, String sender){
  149 + gpsStatusManager.changeServiceState(sch.getClZbh(), sch.getXlDir(), 1, sender);
  150 + }
151 } 151 }
152 \ No newline at end of file 152 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata_v2/status_manager/GpsStatusManager.java
1 -package com.bsth.data.gpsdata_v2.status_manager;  
2 -  
3 -import com.bsth.Application;  
4 -import com.bsth.data.gpsdata_v2.status_manager.gps_line_state.LineStateHandle;  
5 -import com.bsth.data.gpsdata_v2.status_manager.gps_service_state.ServiceStateHandle;  
6 -import org.springframework.beans.factory.annotation.Autowired;  
7 -import org.springframework.boot.CommandLineRunner;  
8 -import org.springframework.stereotype.Component;  
9 -  
10 -import java.util.concurrent.TimeUnit;  
11 -  
12 -/**  
13 - * GPS 状态管理  
14 - * Created by panzhao on 2017/7/13.  
15 - */  
16 -@Component  
17 -public class GpsStatusManager implements CommandLineRunner {  
18 -  
19 - @Autowired  
20 - StatusCheckThread checkThread;  
21 -  
22 - @Autowired  
23 - LineStateHandle lineStateHandle;  
24 -  
25 - @Autowired  
26 - ServiceStateHandle serviceStateHandle;  
27 -  
28 - /**  
29 - * 切换线路  
30 - * @param nbbm  
31 - * @param lineCode  
32 - * @param sender  
33 - */  
34 - public void changeLine(String nbbm, String lineCode, String sender){  
35 - lineStateHandle.changeLine(nbbm, lineCode, sender);  
36 - }  
37 -  
38 - /**  
39 - * 切换营运状态  
40 - * @param nbbm  
41 - * @param state 0 营运, 1:非营运  
42 - * @param sender  
43 - */  
44 - public void changeServiceState(String nbbm, String upDown,int state, String sender){  
45 - changeServiceState(nbbm, Integer.parseInt(upDown), state, sender);  
46 - }  
47 -  
48 - /**  
49 - * 切换营运状态  
50 - * @param nbbm  
51 - * @param state 0 营运, 1:非营运  
52 - * @param sender  
53 - */  
54 - public void changeServiceState(String nbbm, int upDown,int state, String sender){  
55 - serviceStateHandle.changeState(nbbm, upDown, state, sender);  
56 - }  
57 -  
58 - @Override  
59 - public void run(String... strings) throws Exception {  
60 - Application.mainServices.scheduleWithFixedDelay(checkThread, 120, 120, TimeUnit.SECONDS);  
61 - }  
62 -  
63 - @Component  
64 - public static class StatusCheckThread extends Thread{  
65 -  
66 - @Autowired  
67 - LineStateHandle lineStateHandle;  
68 -  
69 - @Autowired  
70 - ServiceStateHandle serviceStateHandle;  
71 -  
72 - @Override  
73 - public void run() {  
74 - /** 检查线路切换结果 */  
75 - lineStateHandle.checkResultAll();  
76 - /** 检查营运状态切换结果 */  
77 - serviceStateHandle.checkResultAll();  
78 - }  
79 - }  
80 -} 1 +package com.bsth.data.gpsdata_v2.status_manager;
  2 +
  3 +import com.bsth.Application;
  4 +import com.bsth.data.gpsdata_v2.status_manager.gps_line_state.LineStateHandle;
  5 +import com.bsth.data.gpsdata_v2.status_manager.gps_service_state.ServiceStateHandle;
  6 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.boot.CommandLineRunner;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import java.util.concurrent.TimeUnit;
  12 +
  13 +/**
  14 + * GPS 状态管理
  15 + * Created by panzhao on 2017/7/13.
  16 + */
  17 +@Component
  18 +public class GpsStatusManager implements CommandLineRunner {
  19 +
  20 + @Autowired
  21 + StatusCheckThread checkThread;
  22 +
  23 + @Autowired
  24 + LineStateHandle lineStateHandle;
  25 +
  26 + @Autowired
  27 + ServiceStateHandle serviceStateHandle;
  28 +
  29 + /**
  30 + * 切换线路
  31 + * @param nbbm
  32 + * @param lineCode
  33 + * @param sender
  34 + */
  35 + public void changeLine(String nbbm, String lineCode, String sender){
  36 + lineStateHandle.changeLine(nbbm, lineCode, sender);
  37 + }
  38 +
  39 + public void changeLine(String nbbm, ScheduleRealInfo sch, String sender){
  40 + lineStateHandle.changeLine(nbbm, sch, sender);
  41 + }
  42 +
  43 + /**
  44 + * 切换营运状态
  45 + * @param nbbm
  46 + * @param state 0 营运, 1:非营运
  47 + * @param sender
  48 + */
  49 + public void changeServiceState(String nbbm, String upDown,int state, String sender){
  50 + changeServiceState(nbbm, Integer.parseInt(upDown), state, sender);
  51 + }
  52 +
  53 + /**
  54 + * 切换营运状态
  55 + * @param nbbm
  56 + * @param state 0 营运, 1:非营运
  57 + * @param sender
  58 + */
  59 + public void changeServiceState(String nbbm, int upDown,int state, String sender){
  60 + serviceStateHandle.changeState(nbbm, upDown, state, sender);
  61 + }
  62 +
  63 + @Override
  64 + public void run(String... strings) throws Exception {
  65 + Application.mainServices.scheduleWithFixedDelay(checkThread, 120, 120, TimeUnit.SECONDS);
  66 + }
  67 +
  68 + @Component
  69 + public static class StatusCheckThread extends Thread{
  70 +
  71 + @Autowired
  72 + LineStateHandle lineStateHandle;
  73 +
  74 + @Autowired
  75 + ServiceStateHandle serviceStateHandle;
  76 +
  77 + @Override
  78 + public void run() {
  79 + /** 检查线路切换结果 */
  80 + lineStateHandle.checkResultAll();
  81 + /** 检查营运状态切换结果 */
  82 + serviceStateHandle.checkResultAll();
  83 + }
  84 + }
  85 +}
src/main/java/com/bsth/data/gpsdata_v2/status_manager/gps_line_state/ChangeBean.java
1 -package com.bsth.data.gpsdata_v2.status_manager.gps_line_state;  
2 -  
3 -/**  
4 - * Created by panzhao on 2017/7/13.  
5 - */  
6 -public class ChangeBean {  
7 -  
8 - /**  
9 - * 车辆自编号  
10 - */  
11 - private String nbbm;  
12 -  
13 - /**  
14 - * 要切换到的线路  
15 - */  
16 - private String lineCode;  
17 -  
18 - /**  
19 - * 指令发送次数  
20 - */  
21 - private int sendCount;  
22 -  
23 - /**  
24 - * 上次指令时间  
25 - */  
26 - private long st;  
27 -  
28 - /**发送人 */  
29 - private String sender;  
30 -  
31 - public static ChangeBean getInstance(String nbbm, String lineCode, String sender){  
32 - ChangeBean cb = new ChangeBean();  
33 - cb.setNbbm(nbbm);  
34 - cb.setLineCode(lineCode);  
35 - cb.setSendCount(0);  
36 - cb.setSender(sender);  
37 - return cb;  
38 - }  
39 -  
40 - public void countPlus(){  
41 - sendCount ++;  
42 - }  
43 -  
44 - public String getLineCode() {  
45 - return lineCode;  
46 - }  
47 -  
48 - public void setLineCode(String lineCode) {  
49 - this.lineCode = lineCode;  
50 - }  
51 -  
52 - public int getSendCount() {  
53 - return sendCount;  
54 - }  
55 -  
56 - public void setSendCount(int sendCount) {  
57 - this.sendCount = sendCount;  
58 - }  
59 -  
60 - public long getSt() {  
61 - return st;  
62 - }  
63 -  
64 - public void setSt(long st) {  
65 - this.st = st;  
66 - }  
67 -  
68 - public String getSender() {  
69 - return sender;  
70 - }  
71 -  
72 - public void setSender(String sender) {  
73 - this.sender = sender;  
74 - }  
75 -  
76 - public String getNbbm() {  
77 - return nbbm;  
78 - }  
79 -  
80 - public void setNbbm(String nbbm) {  
81 - this.nbbm = nbbm;  
82 - }  
83 -} 1 +package com.bsth.data.gpsdata_v2.status_manager.gps_line_state;
  2 +
  3 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  4 +
  5 +/**
  6 + * Created by panzhao on 2017/7/13.
  7 + */
  8 +public class ChangeBean {
  9 +
  10 + /**
  11 + * 车辆自编号
  12 + */
  13 + private String nbbm;
  14 +
  15 + /**
  16 + * 要切换到的线路
  17 + */
  18 + private String lineCode;
  19 +
  20 + /**
  21 + * 班次
  22 + */
  23 + private ScheduleRealInfo sch;
  24 +
  25 + /**
  26 + * 指令发送次数
  27 + */
  28 + private int sendCount;
  29 +
  30 + /**
  31 + * 上次指令时间
  32 + */
  33 + private long st;
  34 +
  35 + /**发送人 */
  36 + private String sender;
  37 +
  38 + public static ChangeBean getInstance(String nbbm, String lineCode, String sender){
  39 + ChangeBean cb = new ChangeBean();
  40 + cb.setNbbm(nbbm);
  41 + cb.setLineCode(lineCode);
  42 + cb.setSendCount(0);
  43 + cb.setSender(sender);
  44 + return cb;
  45 + }
  46 +
  47 + public void countPlus(){
  48 + sendCount ++;
  49 + }
  50 +
  51 + public String getLineCode() {
  52 + return lineCode;
  53 + }
  54 +
  55 + public void setLineCode(String lineCode) {
  56 + this.lineCode = lineCode;
  57 + }
  58 +
  59 + public ScheduleRealInfo getSch() {
  60 + return sch;
  61 + }
  62 +
  63 + public void setSch(ScheduleRealInfo sch) {
  64 + this.sch = sch;
  65 + }
  66 +
  67 + public int getSendCount() {
  68 + return sendCount;
  69 + }
  70 +
  71 + public void setSendCount(int sendCount) {
  72 + this.sendCount = sendCount;
  73 + }
  74 +
  75 + public long getSt() {
  76 + return st;
  77 + }
  78 +
  79 + public void setSt(long st) {
  80 + this.st = st;
  81 + }
  82 +
  83 + public String getSender() {
  84 + return sender;
  85 + }
  86 +
  87 + public void setSender(String sender) {
  88 + this.sender = sender;
  89 + }
  90 +
  91 + public String getNbbm() {
  92 + return nbbm;
  93 + }
  94 +
  95 + public void setNbbm(String nbbm) {
  96 + this.nbbm = nbbm;
  97 + }
  98 +}
src/main/java/com/bsth/data/gpsdata_v2/status_manager/gps_line_state/LineStateHandle.java
1 -package com.bsth.data.gpsdata_v2.status_manager.gps_line_state;  
2 -  
3 -import com.bsth.data.gpsdata_v2.GpsRealData;  
4 -import com.bsth.data.gpsdata_v2.entity.GpsEntity;  
5 -import com.bsth.data.msg_queue.DirectivePushQueue;  
6 -import com.bsth.service.directive.DirectiveService;  
7 -import org.slf4j.Logger;  
8 -import org.slf4j.LoggerFactory;  
9 -import org.springframework.beans.factory.annotation.Autowired;  
10 -import org.springframework.stereotype.Component;  
11 -  
12 -import java.util.Collection;  
13 -import java.util.concurrent.ConcurrentHashMap;  
14 -  
15 -/**  
16 - * 设备线路状态处理  
17 - * Created by panzhao on 2017/7/13.  
18 - */  
19 -@Component  
20 -public class LineStateHandle {  
21 -  
22 - private static ConcurrentHashMap<String, ChangeBean> map;  
23 -  
24 - @Autowired  
25 - DirectiveService directiveService;  
26 - @Autowired  
27 - GpsRealData gpsRealData;  
28 -  
29 - Logger logger = LoggerFactory.getLogger(this.getClass());  
30 -  
31 - /** 重发次数 */  
32 - private final static int MAX_SEND_COUNT=3;  
33 - /** 重发间隔 */  
34 - private final static int SEND_SPACE=1000 * 60 * 6;  
35 - /** 最大有效时间 */  
36 - private final static int MAX_AVAIL_TIME=1000 * 60 * 60 * 2;  
37 -  
38 - static{  
39 - map = new ConcurrentHashMap();  
40 - }  
41 -  
42 - public void changeLine(String nbbm, String lineCode, String sender){  
43 - ChangeBean cb = map.get(nbbm);  
44 - if(cb != null && cb.getLineCode().equals(lineCode)){  
45 - return;  
46 - }  
47 -  
48 - cb = ChangeBean.getInstance(nbbm, lineCode, sender);  
49 - map.put(nbbm, cb);  
50 -  
51 - changeLine(cb);  
52 - }  
53 -  
54 - private void changeLine(ChangeBean cb){  
55 - cb.setSt(System.currentTimeMillis());  
56 - cb.countPlus();  
57 - DirectivePushQueue.put64(cb.getNbbm(), cb.getLineCode(), cb.getSender());  
58 - }  
59 -  
60 -  
61 - public void checkResultAll(){  
62 - Collection<ChangeBean> cbs = map.values();  
63 - for(ChangeBean cb : cbs){  
64 - checkResult(cb);  
65 - }  
66 - }  
67 -  
68 - private void checkResult(ChangeBean cb){  
69 - try{  
70 - GpsEntity gps = gpsRealData.getByNbbm(cb.getNbbm());  
71 - if(gps == null)  
72 - return;  
73 -  
74 - if(cb.getLineCode().equals(gps.getLineId())){  
75 - map.remove(cb.getNbbm());  
76 - logger.info("线路切换成功," + cb.getNbbm() + "、" + cb.getLineCode());  
77 - }  
78 - else{  
79 - reSend(cb);  
80 - }  
81 - }catch (Exception e){  
82 - logger.error("", e);  
83 - }  
84 - }  
85 -  
86 - private void reSend(ChangeBean cb){  
87 - if(cb.getSendCount() >= MAX_SEND_COUNT){  
88 - map.remove(cb.getNbbm());  
89 - logger.info("超过重发次数," + cb.getNbbm() + "、" + cb.getLineCode());  
90 - return;  
91 - }  
92 -  
93 - long diff = System.currentTimeMillis() - cb.getSt();  
94 - if(diff >= MAX_AVAIL_TIME){  
95 - map.remove(cb.getNbbm());  
96 - logger.info("超过有效时间," + cb.getNbbm() + "、" + cb.getLineCode() + "、" + cb.getSt());  
97 - return;  
98 - }  
99 -  
100 - if(diff >= SEND_SPACE){  
101 - cb.setSender("补发@系统");  
102 - changeLine(cb);  
103 - logger.info("重发线路切换指令," + cb.getNbbm() + "、" + cb.getLineCode());  
104 - return;  
105 - }  
106 - }  
107 -} 1 +package com.bsth.data.gpsdata_v2.status_manager.gps_line_state;
  2 +
  3 +import com.bsth.data.gpsdata_v2.GpsRealData;
  4 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  5 +import com.bsth.data.msg_queue.DirectivePushQueue;
  6 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  7 +import com.bsth.service.directive.DirectiveService;
  8 +import org.slf4j.Logger;
  9 +import org.slf4j.LoggerFactory;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.stereotype.Component;
  12 +import org.springframework.util.StringUtils;
  13 +
  14 +import java.util.Collection;
  15 +import java.util.concurrent.ConcurrentHashMap;
  16 +
  17 +/**
  18 + * 设备线路状态处理
  19 + * Created by panzhao on 2017/7/13.
  20 + */
  21 +@Component
  22 +public class LineStateHandle {
  23 +
  24 + private static ConcurrentHashMap<String, ChangeBean> map;
  25 +
  26 + @Autowired
  27 + DirectiveService directiveService;
  28 + @Autowired
  29 + GpsRealData gpsRealData;
  30 +
  31 + Logger logger = LoggerFactory.getLogger(this.getClass());
  32 +
  33 + /** 重发次数 */
  34 + private final static int MAX_SEND_COUNT=3;
  35 + /** 重发间隔 */
  36 + private final static int SEND_SPACE=1000 * 60 * 3;
  37 + /** 最大有效时间 */
  38 + private final static int MAX_AVAIL_TIME=1000 * 60 * 60 * 2;
  39 +
  40 + static{
  41 + map = new ConcurrentHashMap();
  42 + }
  43 +
  44 + public void changeLine(String nbbm, String lineCode, String sender){
  45 + ChangeBean cb = map.get(nbbm);
  46 + if(cb != null && cb.getLineCode().equals(lineCode)){
  47 + return;
  48 + }
  49 +
  50 + cb = ChangeBean.getInstance(nbbm, lineCode, sender);
  51 + map.put(nbbm, cb);
  52 +
  53 + changeLine(cb);
  54 + }
  55 +
  56 + public void changeLine(String nbbm, ScheduleRealInfo sch, String sender){
  57 + ChangeBean cb = map.get(nbbm);
  58 + if(cb != null && cb.getLineCode().equals(sch.getXlBm())){
  59 + return;
  60 + }
  61 +
  62 + cb = ChangeBean.getInstance(nbbm, sch.getXlBm(), sender);
  63 + cb.setSch(sch);
  64 + map.put(nbbm, cb);
  65 +
  66 + changeLine(cb);
  67 + }
  68 +
  69 + private void changeLine(ChangeBean cb){
  70 + cb.setSt(System.currentTimeMillis());
  71 + cb.countPlus();
  72 + DirectivePushQueue.put64(cb.getNbbm(), cb.getLineCode(), cb.getSch(), cb.getSender());
  73 + }
  74 +
  75 +
  76 + public void checkResultAll(){
  77 + Collection<ChangeBean> cbs = map.values();
  78 + for(ChangeBean cb : cbs){
  79 + checkResult(cb);
  80 + }
  81 + }
  82 +
  83 + private void checkResult(ChangeBean cb){
  84 + try{
  85 + GpsEntity gps = gpsRealData.getByNbbm(cb.getNbbm());
  86 + if(gps == null)
  87 + return;
  88 +
  89 + if(cb.getLineCode().equals(gps.getLineId())){
  90 + map.remove(cb.getNbbm());
  91 + logger.info("线路切换成功," + cb.getNbbm() + "、" + cb.getLineCode());
  92 + }
  93 + else{
  94 + reSend(cb);
  95 + }
  96 + }catch (Exception e){
  97 + logger.error("", e);
  98 + }
  99 + }
  100 +
  101 + private void reSend(ChangeBean cb){
  102 + if(cb.getSendCount() >= MAX_SEND_COUNT){
  103 + map.remove(cb.getNbbm());
  104 + logger.info("超过重发次数," + cb.getNbbm() + "、" + cb.getLineCode());
  105 + return;
  106 + }
  107 +
  108 + long diff = System.currentTimeMillis() - cb.getSt();
  109 + if(diff >= MAX_AVAIL_TIME){
  110 + map.remove(cb.getNbbm());
  111 + logger.info("超过有效时间," + cb.getNbbm() + "、" + cb.getLineCode() + "、" + cb.getSt());
  112 + return;
  113 + }
  114 +
  115 + if(diff >= SEND_SPACE){
  116 + cb.setSender("补发@系统");
  117 + changeLine(cb);
  118 + logger.info("重发线路切换指令," + cb.getNbbm() + "、" + cb.getLineCode());
  119 + return;
  120 + }
  121 + }
  122 +}
src/main/java/com/bsth/data/msg_queue/DirectivePushQueue.java
1 -package com.bsth.data.msg_queue;  
2 -  
3 -import com.bsth.data.schedule.DayOfSchedule;  
4 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
5 -import com.bsth.service.directive.DirectiveService;  
6 -import org.slf4j.Logger;  
7 -import org.slf4j.LoggerFactory;  
8 -import org.springframework.beans.BeansException;  
9 -import org.springframework.context.ApplicationContext;  
10 -import org.springframework.context.ApplicationContextAware;  
11 -import org.springframework.stereotype.Component;  
12 -  
13 -import java.util.concurrent.ConcurrentHashMap;  
14 -import java.util.concurrent.ConcurrentLinkedQueue;  
15 -import java.util.concurrent.ConcurrentMap;  
16 -  
17 -/**  
18 - * 到网关的指令推送队列 (系统发送的队列, 用户手动发送的不走这里)  
19 - * Created by panzhao on 2017/5/11.  
20 - */  
21 -@Component  
22 -public class DirectivePushQueue implements ApplicationContextAware {  
23 -  
24 - static ConcurrentLinkedQueue<QueueData_Directive> linkedList;  
25 - static DataPushThread thread;  
26 - static DirectiveService directiveService;  
27 - static long threadT;  
28 -  
29 - /**  
30 - * 下发运营指令6003的最小间隔时间  
31 - */  
32 - static final int MIN_SEND6003_SPACE = 1000 * 30;  
33 -  
34 - /**  
35 - * 车辆 ——> 上次下发6003的时间  
36 - */  
37 - static ConcurrentMap<String, Long> lastSend60TimeMap;  
38 -  
39 - static {  
40 - linkedList = new ConcurrentLinkedQueue<>();  
41 - lastSend60TimeMap = new ConcurrentHashMap<>();  
42 - }  
43 -  
44 - public static void put6002(ScheduleRealInfo sch, int finish, String sender, String txtPrefix){  
45 - if(null == sch)  
46 - return;  
47 - QueueData_Directive qd6002 = new QueueData_Directive();  
48 - qd6002.setSch(sch);  
49 - qd6002.setFinish(finish);  
50 - qd6002.setSender(sender);  
51 - qd6002.setCode("60_02");  
52 - qd6002.setTxtPrefix(txtPrefix);  
53 -  
54 - linkedList.add(qd6002);  
55 - lastSend60TimeMap.put(sch.getClZbh(), System.currentTimeMillis());  
56 - }  
57 - //单独出厂请求设计  
58 - public static void put60_002(ScheduleRealInfo sch, int finish, String sender, String txtPrefix){  
59 - if(null == sch)  
60 - return;  
61 - QueueData_Directive qd6002 = new QueueData_Directive();  
62 - qd6002.setSch(sch);  
63 - qd6002.setFinish(finish);  
64 - qd6002.setSender(sender);  
65 - qd6002.setCode("60_002");  
66 - qd6002.setTxtPrefix(txtPrefix);  
67 -  
68 - linkedList.add(qd6002);  
69 - lastSend60TimeMap.put(sch.getClZbh(), System.currentTimeMillis());  
70 - }  
71 -  
72 -  
73 -  
74 -  
75 - public static void put6003(String nbbm, int state, int upDown, String sender){  
76 - long t = System.currentTimeMillis();  
77 - if(lastSend60TimeMap.containsKey(nbbm)  
78 - && t - lastSend60TimeMap.get(nbbm) < MIN_SEND6003_SPACE)  
79 - return; //最短下发间隔  
80 -  
81 - QueueData_Directive qd6003 = new QueueData_Directive();  
82 - qd6003.setNbbm(nbbm);  
83 - qd6003.setState(state);  
84 - qd6003.setUpDown(upDown);  
85 - qd6003.setSender(sender);  
86 - qd6003.setCode("60_03");  
87 -  
88 - linkedList.add(qd6003);  
89 - lastSend60TimeMap.put(nbbm, t);  
90 - }  
91 -  
92 - public static void put6003(ScheduleRealInfo sch, String sender){  
93 - if(null == sch)  
94 - return;  
95 - int state = 0;//营运状态  
96 - if(DayOfSchedule.emptyService(sch))  
97 - state = 1;  
98 -  
99 - put6003(sch.getClZbh(), state, Integer.parseInt(sch.getXlDir()), sender);  
100 - }  
101 -  
102 - public static void put64(String nbbm, String lineCode, String sender){  
103 - QueueData_Directive qd64 = new QueueData_Directive();  
104 - qd64.setNbbm(nbbm);  
105 - qd64.setLineCode(lineCode);  
106 - qd64.setSender(sender);  
107 -  
108 - qd64.setCode("64");  
109 -  
110 - linkedList.add(qd64);  
111 - }  
112 -  
113 - public static void start(){  
114 - if(thread != null){  
115 - thread.interrupt();  
116 - }  
117 - linkedList.clear();  
118 - thread = new DataPushThread();  
119 - thread.start();  
120 - }  
121 -  
122 - public static int size(){  
123 - return linkedList.size();  
124 - }  
125 -  
126 - @Override  
127 - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  
128 - directiveService = applicationContext.getBean(DirectiveService.class);  
129 - }  
130 -  
131 - public static class DataPushThread extends Thread {  
132 -  
133 - Logger log = LoggerFactory.getLogger(this.getClass());  
134 -  
135 - @Override  
136 - public void run() {  
137 - boolean sleepFlag = false;  
138 - QueueData_Directive qd;  
139 - String code;  
140 - while (true) {  
141 - try {  
142 - qd = linkedList.poll();  
143 - if (qd != null) {  
144 - sleepFlag = false;  
145 - code = qd.getCode();  
146 -  
147 - if(code.equals("60_02")){  
148 - directiveService.send60Dispatch(qd.getSch(), qd.getFinish(), qd.getSender(), qd.getTxtPrefix());  
149 - log.info("directive 60_02 sch id: " + qd.getSch().getId());  
150 - }  
151 - else if(code.equals("60_002")){ //出场请求只写出场  
152 - directiveService.send60Dispatchcc(qd.getSch(), qd.getFinish(), qd.getSender(), qd.getTxtPrefix());  
153 - log.info("directive出场 60_002 nbbm: " + qd.getNbbm() + " lineCode: " + qd.getLineCode());  
154 - }  
155 - else if(code.equals("60_03")){  
156 - directiveService.send60Operation(qd.getNbbm(), qd.getState(), qd.getUpDown(), qd.getSender());  
157 - log.info("directive 60_03 nbbm: " + qd.getNbbm());  
158 - }  
159 - else if(code.equals("64")){  
160 - directiveService.lineChange(qd.getNbbm(), qd.getLineCode(), qd.getSender());  
161 - log.info("directive 64 nbbm: " + qd.getNbbm() + " lineCode: " + qd.getLineCode());  
162 - }  
163 -  
164 -  
165 - } else{  
166 - Thread.sleep(500);  
167 - if(!sleepFlag){  
168 - log.info("sleep...");  
169 - sleepFlag = true;  
170 - }  
171 - }  
172 - threadT = System.currentTimeMillis();  
173 - }  
174 - catch(InterruptedException e){  
175 - log.error("", e);  
176 - break;  
177 - }  
178 - catch (Exception e) {  
179 - log.error("", e);  
180 - }  
181 - }  
182 -  
183 - log.warn("DirectivePushQueue is break...");  
184 - }  
185 - }  
186 -} 1 +package com.bsth.data.msg_queue;
  2 +
  3 +import com.bsth.data.schedule.DayOfSchedule;
  4 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  5 +import com.bsth.service.directive.DirectiveService;
  6 +import org.slf4j.Logger;
  7 +import org.slf4j.LoggerFactory;
  8 +import org.springframework.beans.BeansException;
  9 +import org.springframework.context.ApplicationContext;
  10 +import org.springframework.context.ApplicationContextAware;
  11 +import org.springframework.stereotype.Component;
  12 +import org.springframework.util.StringUtils;
  13 +
  14 +import java.util.concurrent.ConcurrentHashMap;
  15 +import java.util.concurrent.ConcurrentLinkedQueue;
  16 +import java.util.concurrent.ConcurrentMap;
  17 +
  18 +/**
  19 + * 到网关的指令推送队列 (系统发送的队列, 用户手动发送的不走这里)
  20 + * Created by panzhao on 2017/5/11.
  21 + */
  22 +@Component
  23 +public class DirectivePushQueue implements ApplicationContextAware {
  24 +
  25 + static ConcurrentLinkedQueue<QueueData_Directive> linkedList;
  26 + static DataPushThread thread;
  27 + static DirectiveService directiveService;
  28 + static long threadT;
  29 +
  30 + /**
  31 + * 下发运营指令6003的最小间隔时间
  32 + */
  33 + static final int MIN_SEND6003_SPACE = 1000 * 30;
  34 +
  35 + /**
  36 + * 车辆 ——> 上次下发6003的时间
  37 + */
  38 + static ConcurrentMap<String, Long> lastSend60TimeMap;
  39 +
  40 + static {
  41 + linkedList = new ConcurrentLinkedQueue<>();
  42 + lastSend60TimeMap = new ConcurrentHashMap<>();
  43 + }
  44 +
  45 + public static void put6002(ScheduleRealInfo sch, int finish, String sender, String txtPrefix){
  46 + if(null == sch)
  47 + return;
  48 + QueueData_Directive qd6002 = new QueueData_Directive();
  49 + qd6002.setSch(sch);
  50 + qd6002.setFinish(finish);
  51 + qd6002.setSender(sender);
  52 + qd6002.setCode("60_02");
  53 + qd6002.setTxtPrefix(txtPrefix);
  54 +
  55 + linkedList.add(qd6002);
  56 + lastSend60TimeMap.put(sch.getClZbh(), System.currentTimeMillis());
  57 + }
  58 + //单独出厂请求设计
  59 + public static void put60_002(ScheduleRealInfo sch, int finish, String sender, String txtPrefix){
  60 + if(null == sch)
  61 + return;
  62 + QueueData_Directive qd6002 = new QueueData_Directive();
  63 + qd6002.setSch(sch);
  64 + qd6002.setFinish(finish);
  65 + qd6002.setSender(sender);
  66 + qd6002.setCode("60_002");
  67 + qd6002.setTxtPrefix(txtPrefix);
  68 +
  69 + linkedList.add(qd6002);
  70 + lastSend60TimeMap.put(sch.getClZbh(), System.currentTimeMillis());
  71 + }
  72 +
  73 +
  74 +
  75 +
  76 + public static void put6003(String nbbm, int state, int upDown, String sender){
  77 + long t = System.currentTimeMillis();
  78 + if(lastSend60TimeMap.containsKey(nbbm)
  79 + && t - lastSend60TimeMap.get(nbbm) < MIN_SEND6003_SPACE)
  80 + return; //最短下发间隔
  81 +
  82 + QueueData_Directive qd6003 = new QueueData_Directive();
  83 + qd6003.setNbbm(nbbm);
  84 + qd6003.setState(state);
  85 + qd6003.setUpDown(upDown);
  86 + qd6003.setSender(sender);
  87 + qd6003.setCode("60_03");
  88 +
  89 + linkedList.add(qd6003);
  90 + lastSend60TimeMap.put(nbbm, t);
  91 + }
  92 +
  93 + public static void put6003(ScheduleRealInfo sch, String sender){
  94 + if(null == sch)
  95 + return;
  96 + int state = 0;//营运状态
  97 + if(DayOfSchedule.emptyService(sch))
  98 + state = 1;
  99 +
  100 + put6003(sch.getClZbh(), state, Integer.parseInt(sch.getXlDir()), sender);
  101 + }
  102 +
  103 + public static void put64(String nbbm, String lineCode, ScheduleRealInfo sch, String sender){
  104 + QueueData_Directive qd64 = new QueueData_Directive();
  105 + qd64.setNbbm(nbbm);
  106 + qd64.setLineCode(lineCode);
  107 + qd64.setSch(sch);
  108 + qd64.setSender(sender);
  109 +
  110 + qd64.setCode("64");
  111 +
  112 + linkedList.add(qd64);
  113 + }
  114 +
  115 + public static void start(){
  116 + if(thread != null){
  117 + thread.interrupt();
  118 + }
  119 + linkedList.clear();
  120 + thread = new DataPushThread();
  121 + thread.start();
  122 + }
  123 +
  124 + public static int size(){
  125 + return linkedList.size();
  126 + }
  127 +
  128 + @Override
  129 + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  130 + directiveService = applicationContext.getBean(DirectiveService.class);
  131 + }
  132 +
  133 + public static class DataPushThread extends Thread {
  134 +
  135 + Logger log = LoggerFactory.getLogger(this.getClass());
  136 +
  137 + @Override
  138 + public void run() {
  139 + boolean sleepFlag = false;
  140 + QueueData_Directive qd;
  141 + String code;
  142 + while (true) {
  143 + try {
  144 + qd = linkedList.poll();
  145 + if (qd != null) {
  146 + sleepFlag = false;
  147 + code = qd.getCode();
  148 +
  149 + if(code.equals("60_02")){
  150 + directiveService.send60Dispatch(qd.getSch(), qd.getFinish(), qd.getSender(), qd.getTxtPrefix());
  151 + log.info("directive 60_02 sch id: " + qd.getSch().getId());
  152 + }
  153 + else if(code.equals("60_002")){ //出场请求只写出场
  154 + directiveService.send60Dispatchcc(qd.getSch(), qd.getFinish(), qd.getSender(), qd.getTxtPrefix());
  155 + log.info("directive出场 60_002 nbbm: " + qd.getNbbm() + " lineCode: " + qd.getLineCode());
  156 + }
  157 + else if(code.equals("60_03")){
  158 + directiveService.send60Operation(qd.getNbbm(), qd.getState(), qd.getUpDown(), qd.getSender());
  159 + log.info("directive 60_03 nbbm: " + qd.getNbbm());
  160 + }
  161 + else if(code.equals("64")){
  162 + directiveService.lineChange(qd.getNbbm(), qd.getLineCode(), qd.getSch(), qd.getSender());
  163 + log.info("directive 64 nbbm: " + qd.getNbbm() + " lineCode: " + qd.getLineCode());
  164 + }
  165 +
  166 +
  167 + } else{
  168 + Thread.sleep(500);
  169 + if(!sleepFlag){
  170 + log.info("sleep...");
  171 + sleepFlag = true;
  172 + }
  173 + }
  174 + threadT = System.currentTimeMillis();
  175 + }
  176 + catch(InterruptedException e){
  177 + log.error("", e);
  178 + break;
  179 + }
  180 + catch (Exception e) {
  181 + log.error("", e);
  182 + }
  183 + }
  184 +
  185 + log.warn("DirectivePushQueue is break...");
  186 + }
  187 + }
  188 +}
src/main/java/com/bsth/data/schedule/auto_exec/RealScheduleAutoExecHandler.java
1 -package com.bsth.data.schedule.auto_exec;  
2 -  
3 -import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;  
4 -import com.bsth.data.schedule.DayOfSchedule;  
5 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
6 -import com.bsth.websocket.handler.SendUtils;  
7 -import org.apache.commons.lang3.StringUtils;  
8 -import org.springframework.beans.factory.annotation.Autowired;  
9 -import org.springframework.stereotype.Component;  
10 -  
11 -import java.util.ArrayList;  
12 -import java.util.List;  
13 -  
14 -/**  
15 - * 实际班次自动执行  
16 - * Created by panzhao on 2017/10/31.  
17 - */  
18 -@Component  
19 -public class RealScheduleAutoExecHandler {  
20 -  
21 - @Autowired  
22 - SendUtils sendUtils;  
23 - @Autowired  
24 - DayOfSchedule dayOfSchedule;  
25 -  
26 - @Autowired  
27 - GpsStatusManager gpsStatusManager;  
28 -  
29 - public void exec(ScheduleRealInfo sch) {  
30 - boolean flag = false;  
31 - long t = System.currentTimeMillis();  
32 -  
33 - if (StringUtils.isEmpty(sch.getFcsjActual()) && sch.getDfsjT() < t) {  
34 - sch.setFcsjActualAll(sch.getDfsjT());  
35 - flag = true;  
36 - }  
37 -  
38 - if (StringUtils.isEmpty(sch.getZdsjActual()) && sch.getZdsjT() < t) {  
39 - sch.setZdsjActualAll(sch.getZdsjT());  
40 - flag = true;  
41 -  
42 - //准备执行下一个班次  
43 - ScheduleRealInfo next = dayOfSchedule.next(sch);  
44 - if (next != null) {  
45 - dayOfSchedule.addExecPlan(next);  
46 - //套跑 -下发线路切换指令  
47 - if(!next.getXlBm().equals(sch.getXlBm())){  
48 - gpsStatusManager.changeLine(next.getClZbh(), next.getXlBm(), "auto@系统");  
49 - }  
50 - }  
51 -  
52 - //路牌有下一个班次,线调页面显示  
53 - ScheduleRealInfo nextLp = dayOfSchedule.nextByLp(sch);  
54 - if (null != nextLp) {  
55 - //入库  
56 - dayOfSchedule.save(sch);  
57 -  
58 - nextLp.setQdzArrDatesj(sch.getZdsjActual());  
59 - List<ScheduleRealInfo> refs = new ArrayList<>();  
60 - refs.add(sch);  
61 - refs.add(nextLp);  
62 - sendUtils.refreshSch(refs);  
63 - return;  
64 - }  
65 - }  
66 -  
67 - if (flag) {  
68 - dayOfSchedule.save(sch);  
69 - sendUtils.refreshSch(sch);  
70 - }  
71 - }  
72 -} 1 +package com.bsth.data.schedule.auto_exec;
  2 +
  3 +import com.bsth.data.gpsdata_v2.status_manager.GpsStatusManager;
  4 +import com.bsth.data.schedule.DayOfSchedule;
  5 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  6 +import com.bsth.websocket.handler.SendUtils;
  7 +import org.apache.commons.lang3.StringUtils;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import java.util.ArrayList;
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 实际班次自动执行
  16 + * Created by panzhao on 2017/10/31.
  17 + */
  18 +@Component
  19 +public class RealScheduleAutoExecHandler {
  20 +
  21 + @Autowired
  22 + SendUtils sendUtils;
  23 + @Autowired
  24 + DayOfSchedule dayOfSchedule;
  25 +
  26 + @Autowired
  27 + GpsStatusManager gpsStatusManager;
  28 +
  29 + public void exec(ScheduleRealInfo sch) {
  30 + boolean flag = false;
  31 + long t = System.currentTimeMillis();
  32 +
  33 + if (StringUtils.isEmpty(sch.getFcsjActual()) && sch.getDfsjT() < t) {
  34 + sch.setFcsjActualAll(sch.getDfsjT());
  35 + flag = true;
  36 + }
  37 +
  38 + if (StringUtils.isEmpty(sch.getZdsjActual()) && sch.getZdsjT() < t) {
  39 + sch.setZdsjActualAll(sch.getZdsjT());
  40 + flag = true;
  41 +
  42 + //准备执行下一个班次
  43 + ScheduleRealInfo next = dayOfSchedule.next(sch);
  44 + if (next != null) {
  45 + dayOfSchedule.addExecPlan(next);
  46 + //套跑 -下发线路切换指令
  47 + if(!next.getXlBm().equals(sch.getXlBm())){
  48 + gpsStatusManager.changeLine(next.getClZbh(), next, "auto@系统");
  49 + }
  50 + }
  51 +
  52 + //路牌有下一个班次,线调页面显示
  53 + ScheduleRealInfo nextLp = dayOfSchedule.nextByLp(sch);
  54 + if (null != nextLp) {
  55 + //入库
  56 + dayOfSchedule.save(sch);
  57 +
  58 + nextLp.setQdzArrDatesj(sch.getZdsjActual());
  59 + List<ScheduleRealInfo> refs = new ArrayList<>();
  60 + refs.add(sch);
  61 + refs.add(nextLp);
  62 + sendUtils.refreshSch(refs);
  63 + return;
  64 + }
  65 + }
  66 +
  67 + if (flag) {
  68 + dayOfSchedule.save(sch);
  69 + sendUtils.refreshSch(sch);
  70 + }
  71 + }
  72 +}
src/main/java/com/bsth/data/schedule/thread/SchedulePstThread.java
@@ -101,7 +101,7 @@ public class SchedulePstThread extends Thread { @@ -101,7 +101,7 @@ public class SchedulePstThread extends Thread {
101 ",qdz_name=?,real_exec_date=?,remarks=?,s_gh=?,s_name=?,schedule_date=?,schedule_date_str=?,sflj=?" + 101 ",qdz_name=?,real_exec_date=?,remarks=?,s_gh=?,s_name=?,schedule_date=?,schedule_date_str=?,sflj=?" +
102 ",sp_id=?,status=?,update_date=?,xl_bm=?,xl_dir=?,xl_name=?,zdsj=?,zdsj_actual=?,zdz_code=?,zdz_name=?" + 102 ",sp_id=?,status=?,update_date=?,xl_bm=?,xl_dir=?,xl_name=?,zdsj=?,zdsj_actual=?,zdz_code=?,zdz_name=?" +
103 ",ccno=?,df_auto=?,fgs_bm=?,fgs_name=?,gs_bm=?,gs_name=?,online=?,adjust_exps=?,reissue=?,jhlc_orig=?" + 103 ",ccno=?,df_auto=?,fgs_bm=?,fgs_name=?,gs_bm=?,gs_name=?,online=?,adjust_exps=?,reissue=?,jhlc_orig=?" +
104 - ",sigin_compate=?,drift_status=?,cc_service=?,major_station_name=?,rfid_state=?,first_rfid_state=? where id=?", new BatchPreparedStatementSetter() { 104 + ",sigin_compate=?,drift_status=?,cc_service=?,major_station_name=?,rfid_state=?,first_rfid_state=?,region_id=? where id=?", new BatchPreparedStatementSetter() {
105 @Override 105 @Override
106 public void setValues(PreparedStatement ps, int i) throws SQLException { 106 public void setValues(PreparedStatement ps, int i) throws SQLException {
107 ScheduleRealInfo sch = pstList.get(i); 107 ScheduleRealInfo sch = pstList.get(i);
@@ -154,7 +154,8 @@ public class SchedulePstThread extends Thread { @@ -154,7 +154,8 @@ public class SchedulePstThread extends Thread {
154 ps.setString(47, sch.getMajorStationName()); 154 ps.setString(47, sch.getMajorStationName());
155 ps.setInt(48, sch.getRfidState()); 155 ps.setInt(48, sch.getRfidState());
156 ps.setInt(49, sch.getFirstRfidState()); 156 ps.setInt(49, sch.getFirstRfidState());
157 - ps.setLong(50, sch.getId()); 157 + ps.setString(50, sch.getRegionId());
  158 + ps.setLong(51, sch.getId());
158 } 159 }
159 160
160 @Override 161 @Override
src/main/java/com/bsth/entity/directive/D64.java
1 package com.bsth.entity.directive; 1 package com.bsth.entity.directive;
2 2
  3 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  4 +import com.fasterxml.jackson.annotation.JsonIgnore;
  5 +
3 import javax.persistence.*; 6 import javax.persistence.*;
4 7
5 /** 8 /**
@@ -26,6 +29,10 @@ public class D64 extends Directive{ @@ -26,6 +29,10 @@ public class D64 extends Directive{
26 29
27 private D64Data data; 30 private D64Data data;
28 31
  32 + @Transient
  33 + @JsonIgnore
  34 + private ScheduleRealInfo sch;
  35 +
29 @Embeddable 36 @Embeddable
30 public static class D64Data { 37 public static class D64Data {
31 38
@@ -35,7 +42,12 @@ public class D64 extends Directive{ @@ -35,7 +42,12 @@ public class D64 extends Directive{
35 private String deviceId; 42 private String deviceId;
36 43
37 private String lineId; 44 private String lineId;
38 - 45 +
  46 + /**
  47 + * 预设区间seq(子线路)
  48 + */
  49 + private Integer seq;
  50 +
39 private String txtContent; 51 private String txtContent;
40 52
41 public Short getCityCode() { 53 public Short getCityCode() {
@@ -62,6 +74,14 @@ public class D64 extends Directive{ @@ -62,6 +74,14 @@ public class D64 extends Directive{
62 this.lineId = lineId; 74 this.lineId = lineId;
63 } 75 }
64 76
  77 + public Integer getSeq() {
  78 + return seq;
  79 + }
  80 +
  81 + public void setSeq(Integer seq) {
  82 + this.seq = seq;
  83 + }
  84 +
65 public String getTxtContent() { 85 public String getTxtContent() {
66 return txtContent; 86 return txtContent;
67 } 87 }
@@ -95,6 +115,14 @@ public class D64 extends Directive{ @@ -95,6 +115,14 @@ public class D64 extends Directive{
95 this.respAck = respAck; 115 this.respAck = respAck;
96 } 116 }
97 117
  118 + public ScheduleRealInfo getSch() {
  119 + return sch;
  120 + }
  121 +
  122 + public void setSch(ScheduleRealInfo sch) {
  123 + this.sch = sch;
  124 + }
  125 +
98 @Override 126 @Override
99 public void setDeviceId(String deviceId) { 127 public void setDeviceId(String deviceId) {
100 if(this.data != null) 128 if(this.data != null)
src/main/java/com/bsth/entity/realcontrol/ScheduleRealInfo.java
@@ -257,6 +257,22 @@ public class ScheduleRealInfo implements Cloneable{ @@ -257,6 +257,22 @@ public class ScheduleRealInfo implements Cloneable{
257 @Transient 257 @Transient
258 private String operationType; 258 private String operationType;
259 259
  260 + /**
  261 + * 区间ID+seq
  262 + */
  263 + private String regionId;
  264 +
  265 + /**
  266 + * 封锁站点(站点编号以','分割)
  267 + */
  268 + private String blockStations;
  269 +
  270 + /**
  271 + * 区间切换状态 0 未发或未成功 1 成功
  272 + */
  273 + @Transient
  274 + private int regionSwitchState;
  275 +
260 public Integer getLpChange() { 276 public Integer getLpChange() {
261 return lpChange; 277 return lpChange;
262 } 278 }
@@ -1055,6 +1071,30 @@ public class ScheduleRealInfo implements Cloneable{ @@ -1055,6 +1071,30 @@ public class ScheduleRealInfo implements Cloneable{
1055 this.operationType = operationType; 1071 this.operationType = operationType;
1056 } 1072 }
1057 1073
  1074 + public String getRegionId() {
  1075 + return regionId;
  1076 + }
  1077 +
  1078 + public void setRegionId(String regionId) {
  1079 + this.regionId = regionId;
  1080 + }
  1081 +
  1082 + public String getBlockStations() {
  1083 + return blockStations;
  1084 + }
  1085 +
  1086 + public void setBlockStations(String blockStations) {
  1087 + this.blockStations = blockStations;
  1088 + }
  1089 +
  1090 + public int getRegionSwitchState() {
  1091 + return regionSwitchState;
  1092 + }
  1093 +
  1094 + public void setRegionSwitchState(int regionSwitchState) {
  1095 + this.regionSwitchState = regionSwitchState;
  1096 + }
  1097 +
1058 @Override 1098 @Override
1059 public ScheduleRealInfo clone() throws CloneNotSupportedException { 1099 public ScheduleRealInfo clone() throws CloneNotSupportedException {
1060 ScheduleRealInfo cloned = (ScheduleRealInfo) super.clone(); 1100 ScheduleRealInfo cloned = (ScheduleRealInfo) super.clone();
src/main/java/com/bsth/service/directive/DirectiveService.java
1 -package com.bsth.service.directive;  
2 -  
3 -  
4 -import com.bsth.entity.directive.D60;  
5 -import com.bsth.entity.directive.D64;  
6 -import com.bsth.entity.directive.D80;  
7 -import com.bsth.entity.directive.DC0_A3;  
8 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
9 -import com.bsth.service.BaseService;  
10 -  
11 -import java.util.List;  
12 -import java.util.Map;  
13 -  
14 -public interface DirectiveService extends BaseService<D60, Integer>{  
15 -  
16 - /**  
17 - *  
18 - * @Title: send60Phrase  
19 - * @Description: TODO(60短语下发)  
20 - * @param @param nbbm 车辆内部编码  
21 - * @param @param text 短语  
22 - * @return int 返回类型  
23 - * @throws  
24 - */  
25 - int send60Phrase(String nbbm, String text, String sender);  
26 -  
27 - /**  
28 - *  
29 - * @Title: send60Dispatch  
30 - * @Description: TODO(调度指令下发)  
31 - * @param @param sch 要下发的班次  
32 - * @param @param finish 已完成的班次数  
33 - * @throws  
34 - */  
35 - int send60Dispatch(ScheduleRealInfo sch, int finish, String sender,String txtPrefix);  
36 -  
37 -  
38 - int send60Dispatchcc(ScheduleRealInfo sch, int finish, String sender,String txtPrefix);  
39 -  
40 - /**  
41 - *  
42 - * @Title: send60Dispatch  
43 - * @Description: TODO(调度指令下发)  
44 - * @param @param id 班次ID  
45 - * @throws  
46 - */  
47 - int send60Dispatch(Long id, String sender);  
48 -  
49 - int send60DispatchZndd(Long id, String sender);  
50 - //60营运指令  
51 - int send60Operation(String nbbm, int state, int upDown, String sender);  
52 -  
53 - /**  
54 - *  
55 - * @Title: lineChange  
56 - * @Description: TODO(线路切换)  
57 - * @param @param nbbm 车辆内部编码  
58 - * @param @param lineId 新线路编码  
59 - * @throws  
60 - */  
61 - int lineChange(String nbbm, String lineId, String sender);  
62 -  
63 - int lineChangeByDeviceId(String deviceId, String lineCode, String sender);  
64 -  
65 - /**  
66 - *  
67 - * @Title: upDownChange  
68 - * @Description: TODO(切换上下行)  
69 - * @param @param nbbm 车辆内部编码  
70 - * @param @param upDonw 上下行 0 上行 1 下行  
71 - * @throws  
72 - */  
73 - //int upDownChange(String nbbm, Integer upDown, String sender);  
74 -  
75 - /**  
76 - *  
77 - * @Title: sendDirectiveState  
78 - * @Description: TODO(向页面推送班次指令状态)  
79 - * @throws  
80 - */  
81 - void sendD60ToPage(ScheduleRealInfo sch);  
82 -  
83 - Map<String, List<D80>> findNoCofm80(String lineCodes);  
84 -  
85 - Map<String, Object> reply80(int id, int reply);  
86 -  
87 - Map<String, Object> findDirective(String nbbm, int dType, int page, int size);  
88 -  
89 - Map<String, Object> findAll80(Map<String, Object> map, int page, int size);  
90 -  
91 - D64 save64(D64 d64);  
92 -  
93 - Map<String, Object> sendC0A4(String nbbm);  
94 -  
95 - int sendC0A3(DC0_A3 c0a4);  
96 -  
97 - int sendC0A5(String json);  
98 -  
99 - int refreshLineFile(String deviceId);  
100 -  
101 - //int stateChange(String nbbm, Integer upDown, Integer state, String userName);  
102 -  
103 - Map<String,Object> deviceCofigList(Map<String, String> map, int page, int size);  
104 -} 1 +package com.bsth.service.directive;
  2 +
  3 +
  4 +import com.bsth.entity.directive.D60;
  5 +import com.bsth.entity.directive.D64;
  6 +import com.bsth.entity.directive.D80;
  7 +import com.bsth.entity.directive.DC0_A3;
  8 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  9 +import com.bsth.service.BaseService;
  10 +
  11 +import java.util.List;
  12 +import java.util.Map;
  13 +
  14 +public interface DirectiveService extends BaseService<D60, Integer>{
  15 +
  16 + /**
  17 + *
  18 + * @Title: send60Phrase
  19 + * @Description: TODO(60短语下发)
  20 + * @param @param nbbm 车辆内部编码
  21 + * @param @param text 短语
  22 + * @return int 返回类型
  23 + * @throws
  24 + */
  25 + int send60Phrase(String nbbm, String text, String sender);
  26 +
  27 + /**
  28 + *
  29 + * @Title: send60Dispatch
  30 + * @Description: TODO(调度指令下发)
  31 + * @param @param sch 要下发的班次
  32 + * @param @param finish 已完成的班次数
  33 + * @throws
  34 + */
  35 + int send60Dispatch(ScheduleRealInfo sch, int finish, String sender,String txtPrefix);
  36 +
  37 +
  38 + int send60Dispatchcc(ScheduleRealInfo sch, int finish, String sender,String txtPrefix);
  39 +
  40 + /**
  41 + *
  42 + * @Title: send60Dispatch
  43 + * @Description: TODO(调度指令下发)
  44 + * @param @param id 班次ID
  45 + * @throws
  46 + */
  47 + int send60Dispatch(Long id, String sender);
  48 +
  49 + int send60DispatchZndd(Long id, String sender);
  50 + //60营运指令
  51 + int send60Operation(String nbbm, int state, int upDown, String sender);
  52 +
  53 + /**
  54 + *
  55 + * @Title: lineChange
  56 + * @Description: TODO(线路切换)
  57 + * @param @param nbbm 车辆内部编码
  58 + * @param @param lineId 新线路编码
  59 + * @throws
  60 + */
  61 + int lineChange(String nbbm, String lineId, String sender);
  62 +
  63 + int lineChange(String nbbm, String lineId, ScheduleRealInfo sch, String sender);
  64 +
  65 + int lineChangeByDeviceId(String deviceId, String lineCode, String sender);
  66 +
  67 + int lineChangeByDeviceId(String deviceId, String lineCode, ScheduleRealInfo sch, String sender);
  68 +
  69 + /**
  70 + *
  71 + * @Title: upDownChange
  72 + * @Description: TODO(切换上下行)
  73 + * @param @param nbbm 车辆内部编码
  74 + * @param @param upDonw 上下行 0 上行 1 下行
  75 + * @throws
  76 + */
  77 + //int upDownChange(String nbbm, Integer upDown, String sender);
  78 +
  79 + /**
  80 + *
  81 + * @Title: sendDirectiveState
  82 + * @Description: TODO(向页面推送班次指令状态)
  83 + * @throws
  84 + */
  85 + void sendD60ToPage(ScheduleRealInfo sch);
  86 +
  87 + Map<String, List<D80>> findNoCofm80(String lineCodes);
  88 +
  89 + Map<String, Object> reply80(int id, int reply);
  90 +
  91 + Map<String, Object> findDirective(String nbbm, int dType, int page, int size);
  92 +
  93 + Map<String, Object> findAll80(Map<String, Object> map, int page, int size);
  94 +
  95 + D64 save64(D64 d64);
  96 +
  97 + Map<String, Object> sendC0A4(String nbbm);
  98 +
  99 + int sendC0A3(DC0_A3 c0a4);
  100 +
  101 + int sendC0A5(String json);
  102 +
  103 + int refreshLineFile(String deviceId);
  104 +
  105 + //int stateChange(String nbbm, Integer upDown, Integer state, String userName);
  106 +
  107 + Map<String,Object> deviceCofigList(Map<String, String> map, int page, int size);
  108 +}
src/main/java/com/bsth/service/directive/DirectiveServiceImpl.java
1 -package com.bsth.service.directive;  
2 -  
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONObject;  
5 -import com.bsth.common.ResponseCode;  
6 -import com.bsth.data.BasicData;  
7 -import com.bsth.data.directive.DayOfDirectives;  
8 -import com.bsth.data.directive.DirectiveCreator;  
9 -import com.bsth.data.directive.GatewayHttpUtils;  
10 -import com.bsth.data.gpsdata_v2.GpsRealData;  
11 -import com.bsth.data.gpsdata_v2.entity.GpsEntity;  
12 -import com.bsth.data.pilot80.PilotReport;  
13 -import com.bsth.data.schedule.DayOfSchedule;  
14 -import com.bsth.data.utils.ListFilterUtils;  
15 -import com.bsth.data.utils.ListPageQueryUtils;  
16 -import com.bsth.entity.directive.*;  
17 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
18 -import com.bsth.entity.sys.SysUser;  
19 -import com.bsth.repository.directive.D60Repository;  
20 -import com.bsth.repository.directive.D64Repository;  
21 -import com.bsth.repository.directive.D80Repository;  
22 -import com.bsth.security.util.SecurityUtils;  
23 -import com.bsth.service.directive.dto.DeviceConfigDto;  
24 -import com.bsth.service.impl.BaseServiceImpl;  
25 -import com.bsth.websocket.handler.RealControlSocketHandler;  
26 -import com.fasterxml.jackson.core.JsonProcessingException;  
27 -import com.fasterxml.jackson.databind.ObjectMapper;  
28 -import com.google.common.base.Splitter;  
29 -import org.apache.commons.lang3.StringEscapeUtils;  
30 -import org.apache.commons.lang3.StringUtils;  
31 -import org.joda.time.format.DateTimeFormat;  
32 -import org.joda.time.format.DateTimeFormatter;  
33 -import org.slf4j.Logger;  
34 -import org.slf4j.LoggerFactory;  
35 -import org.springframework.beans.factory.annotation.Autowired;  
36 -import org.springframework.jdbc.core.BeanPropertyRowMapper;  
37 -import org.springframework.jdbc.core.JdbcTemplate;  
38 -import org.springframework.stereotype.Service;  
39 -  
40 -import java.util.*;  
41 -  
42 -@Service  
43 -public class DirectiveServiceImpl extends BaseServiceImpl<D60, Integer> implements DirectiveService {  
44 -  
45 - Logger logger = LoggerFactory.getLogger(this.getClass());  
46 -  
47 - @Autowired  
48 - D60Repository d60Repository;  
49 -  
50 - @Autowired  
51 - GpsRealData gpsRealDataBuffer;  
52 -  
53 - @Autowired  
54 - D64Repository d64Repository;  
55 -  
56 - @Autowired  
57 - RealControlSocketHandler socketHandler;  
58 -  
59 - @Autowired  
60 - D80Repository d80Repository;  
61 -  
62 - @Autowired  
63 - DayOfDirectives dayOfDirectives;  
64 -  
65 - @Autowired  
66 - PilotReport pilotReport;  
67 -  
68 - @Autowired  
69 - DayOfSchedule dayOfSchedule;  
70 -  
71 - @Autowired  
72 - JdbcTemplate jdbcTemplate;  
73 -  
74 - //static Long schDiff = 1000 * 60 * 60L;  
75 -  
76 - private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm"), fmtHHmm_CN = DateTimeFormat.forPattern("HH点mm分");  
77 -  
78 - @Override  
79 - public int send60Phrase(String nbbm, String text, String sender) {  
80 - D60 d60 = null;  
81 - try {  
82 - text = StringEscapeUtils.unescapeHtml4(text);  
83 - text = text.replaceAll("#", "");  
84 - d60 = create60Data(nbbm, text, (short) 0x00, null);  
85 - } catch (Exception e) {  
86 - logger.error("发送消息短语出现异常", e);  
87 - return -1;  
88 - }  
89 -  
90 - if (null == d60)  
91 - return -1;  
92 -  
93 - // 发送指令  
94 - int code = GatewayHttpUtils.postJson(JSON.toJSONString(d60));  
95 - if (null != sender)  
96 - d60.setSender(sender);  
97 - d60.setHttpCode(code);  
98 -  
99 - if (code != 0)  
100 - d60.setErrorText("网关通讯失败, code: " + code);  
101 -  
102 - dayOfDirectives.put60(d60);  
103 - return code;  
104 - }  
105 -  
106 - @Override  
107 - public int send60Dispatch(ScheduleRealInfo sch, int finish, String sender, String txtPrefix) {  
108 - D60 d60 = null;  
109 - try {  
110 - if (sch.isDestroy()) {  
111 - logger.warn("烂班不允许发送调度指令....");  
112 - return -1;  
113 - }  
114 -  
115 - //待发应到时间  
116 - String dfsj = fmtHHmm.print(sch.getDfsjT() + (sch.getBcsj() * 60 * 1000));  
117 - String text = "您已完成" + finish + "个班次,下一发车时间" + fmtHHmm_CN.print(sch.getDfsjT()) + ",由"  
118 - + sch.getQdzName() + "发往" + sch.getZdzName() + ";应到 " + dfsj;  
119 -  
120 - if(sch.getBcType().equals("venting")){  
121 - text += " (直放)";  
122 - }  
123 - else if(sch.getBcType().equals("major")){  
124 - text += " (放站到"+sch.getMajorStationName()+"带客)";  
125 - } else if ("ldks".equals(sch.getBcType())) {  
126 - text += " (两点空驶)";  
127 - }  
128 -  
129 - //下发0x02指令 调度指令(闹钟有效)  
130 - long t = System.currentTimeMillis() + 1000 * 30,  
131 - alarmTime = sch.getDfsjT() < t?t:sch.getDfsjT();  
132 -  
133 - if(StringUtils.isNotEmpty(txtPrefix)){  
134 - text = txtPrefix + text;  
135 - }  
136 - text = StringEscapeUtils.unescapeHtml4(text);  
137 - int state = 0;//营运状态  
138 - if(dayOfSchedule.emptyService(sch))  
139 - state = 1;  
140 - d60 = new DirectiveCreator().createD60_02(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir())  
141 - , state, new Date(alarmTime));  
142 -  
143 - d60.setLineCode(sch.getXlBm());  
144 - } catch (Exception e) {  
145 - logger.error("生成调度指令时出现异常", e);  
146 - return -1;  
147 - }  
148 -  
149 - if (null == d60)  
150 - return -1;  
151 -  
152 - d60.setSender(sender);  
153 -  
154 - JSONObject jObj = JSON.parseObject(JSON.toJSONString(d60));  
155 -  
156 - //进场或者出场班次时,附加lock 标识  
157 - if (null != sch.getBcType()  
158 - && (sch.getBcType().equals("out") || sch.getBcType().equals("in"))) {  
159 -  
160 - jObj.put("lock", 1);  
161 - }  
162 -  
163 - // 发送指令  
164 - int code = GatewayHttpUtils.postJson(jObj.toJSONString());  
165 -  
166 - d60.setDispatch(true);  
167 - d60.setSch(sch);  
168 - d60.setHttpCode(code);  
169 -  
170 - if (code == 0) {  
171 - sch.setDirectiveState(60);  
172 - // 通知页面  
173 - sendD60ToPage(sch);  
174 - } else {  
175 - d60.setErrorText("网关通讯失败, code: " + code);  
176 - }  
177 -  
178 - dayOfDirectives.put60(d60);  
179 - return code;  
180 - }  
181 -  
182 - //出场请求  
183 - @Override  
184 - public int send60Dispatchcc(ScheduleRealInfo sch, int finish, String sender, String txtPrefix) {  
185 - D60 d60 = null;  
186 - try {  
187 - if (sch.isDestroy()) {  
188 - logger.warn("烂班不允许发送调度指令....");  
189 - return -1;  
190 - }  
191 - //待发应到时间  
192 - String dfsj = fmtHHmm.print(sch.getDfsjT() + (sch.getBcsj() * 60 * 1000));  
193 - String text = "出场请求,由" + sch.getQdzName() + "发往" + sch.getZdzName() + ";请出场";  
194 -  
195 - //下发0x02指令 调度指令(闹钟有效)  
196 - long t = System.currentTimeMillis() + 1000 * 30,  
197 - alarmTime = sch.getDfsjT() < t?t:sch.getDfsjT();  
198 -  
199 - if(StringUtils.isNotEmpty(txtPrefix)){  
200 - text = txtPrefix + text;  
201 - }  
202 - text = StringEscapeUtils.unescapeHtml4(text);  
203 - int state = 0;//营运状态  
204 - if(dayOfSchedule.emptyService(sch))  
205 - state = 1;  
206 - d60 = new DirectiveCreator().createD60_02(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir())  
207 - , state, new Date(alarmTime));  
208 -  
209 - d60.setLineCode(sch.getXlBm());  
210 - } catch (Exception e) {  
211 - logger.error("生成调度指令时出现异常", e);  
212 - return -1;  
213 - }  
214 -  
215 - if (null == d60)  
216 - return -1;  
217 -  
218 - d60.setSender(sender);  
219 -  
220 - JSONObject jObj = JSON.parseObject(JSON.toJSONString(d60));  
221 -  
222 - //进场或者出场班次时,附加lock 标识  
223 - if (null != sch.getBcType()  
224 - && (sch.getBcType().equals("out") || sch.getBcType().equals("in"))) {  
225 -  
226 - jObj.put("lock", 1);  
227 - }  
228 -  
229 - // 发送指令  
230 - int code = GatewayHttpUtils.postJson(jObj.toJSONString());  
231 -  
232 - d60.setDispatch(true);  
233 - d60.setSch(sch);  
234 - d60.setHttpCode(code);  
235 -  
236 - if (code == 0) {  
237 - sch.setDirectiveState(60);  
238 - // 通知页面  
239 - sendD60ToPage(sch);  
240 - } else {  
241 - d60.setErrorText("网关通讯失败, code: " + code);  
242 - }  
243 -  
244 - dayOfDirectives.put60(d60);  
245 - return code;  
246 - }  
247 -  
248 -  
249 - public int send60DispatchZndd(ScheduleRealInfo sch, int finish, String sender, String txtPrefix) {  
250 - D60 d60 = null;  
251 - try {  
252 - if (sch.isDestroy()) {  
253 - logger.warn("烂班不允许发送调度指令....");  
254 - return -1;  
255 - }  
256 -  
257 - //待发应到时间  
258 - String dfsj = fmtHHmm.print(sch.getDfsjT() + (sch.getBcsj() * 60 * 1000));  
259 - String text = "(自动补发命令)"+sch.getFcsjActual() +"发出的,由"  
260 - + sch.getQdzName() + "发往" + sch.getZdzName() + ";还未确认,请尽快确认";  
261 -  
262 - if(sch.getBcType().equals("venting")){  
263 - text += " (直放)";  
264 - }  
265 - else if(sch.getBcType().equals("major")){  
266 - text += " (放站到"+sch.getMajorStationName()+"带客)";  
267 - } else if ("ldks".equals(sch.getBcType())) {  
268 - text += " (两点空驶)";  
269 - }  
270 -  
271 - //下发0x02指令 调度指令(闹钟有效)  
272 - long t = System.currentTimeMillis() + 1000 * 30,  
273 - alarmTime = sch.getDfsjT() < t?t:sch.getDfsjT();  
274 -  
275 - if(StringUtils.isNotEmpty(txtPrefix)){  
276 - text = txtPrefix + text;  
277 - }  
278 - text = StringEscapeUtils.unescapeHtml4(text);  
279 - int state = 0;//营运状态  
280 - if(dayOfSchedule.emptyService(sch))  
281 - state = 1;  
282 - d60 = new DirectiveCreator().createD60_02(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir())  
283 - , state, new Date(alarmTime));  
284 -  
285 - d60.setLineCode(sch.getXlBm());  
286 - } catch (Exception e) {  
287 - logger.error("生成调度指令时出现异常", e);  
288 - return -1;  
289 - }  
290 -  
291 - if (null == d60)  
292 - return -1;  
293 -  
294 - d60.setSender(sender);  
295 -  
296 - JSONObject jObj = JSON.parseObject(JSON.toJSONString(d60));  
297 -  
298 - //进场或者出场班次时,附加lock 标识  
299 - if (null != sch.getBcType()  
300 - && (sch.getBcType().equals("out") || sch.getBcType().equals("in"))) {  
301 -  
302 - jObj.put("lock", 1);  
303 - }  
304 -  
305 - // 发送指令  
306 - int code = GatewayHttpUtils.postJson(jObj.toJSONString());  
307 -  
308 - d60.setDispatch(true);  
309 - d60.setSch(sch);  
310 - d60.setHttpCode(code);  
311 -  
312 - if (code == 0) {  
313 - sch.setDirectiveState(60);  
314 - // 通知页面  
315 - sendD60ToPage(sch);  
316 - } else {  
317 - d60.setErrorText("网关通讯失败, code: " + code);  
318 - }  
319 - dayOfDirectives.put60(d60);  
320 - return code;  
321 - }  
322 -  
323 - /**  
324 - * @Title: sendDirectiveState @Description: TODO(向页面推送班次指令状态) @throws  
325 - */  
326 - @Override  
327 - public void sendD60ToPage(ScheduleRealInfo sch) {  
328 - Map<String, Object> map = new HashMap<>();  
329 - map.put("fn", "directive");  
330 - map.put("t", sch);  
331 -  
332 - ObjectMapper mapper = new ObjectMapper();  
333 -  
334 - try {  
335 - socketHandler.sendMessageToLine(sch.getXlBm(), mapper.writeValueAsString(map));  
336 - } catch (JsonProcessingException e) {  
337 - logger.error("", e);  
338 - }  
339 - }  
340 -  
341 - @Override  
342 - public int send60Dispatch(Long id, String sender) {  
343 - ScheduleRealInfo sch = dayOfSchedule.get(id);  
344 - // 车辆已完成班次  
345 - int finish = dayOfSchedule.doneSum(sch.getClZbh());  
346 - return send60Dispatch(sch, finish, sender, "");  
347 - }  
348 -  
349 - @Override  
350 - public int send60DispatchZndd(Long id, String sender) {  
351 - ScheduleRealInfo sch = dayOfSchedule.get(id);  
352 - // 车辆已完成班次  
353 - int finish = dayOfSchedule.doneSum(sch.getClZbh());  
354 - return send60DispatchZndd(sch, finish, sender, "");  
355 - }  
356 -  
357 - @Override  
358 - public int send60Operation(String nbbm, int state, int upDown, String sender) {  
359 - logger.info("切换运营状态, nbbm: " + nbbm + " ,state: " + state + " ,upDown:" + upDown);  
360 -  
361 - String text = "切换为 " + (upDown == 0 ? "上行" : "下行") + (state == 0 ? "营运" : "未营运");  
362 - D60 d60 = new DirectiveCreator().createD60(nbbm, text, (short) 0x03, upDown, state, null);  
363 -  
364 - if (null == d60)  
365 - return -1;  
366 - if (null != sender)  
367 - d60.setSender(sender);  
368 - else  
369 - d60.setSender("系统");  
370 - // 发送指令  
371 - int code = GatewayHttpUtils.postJson(JSON.toJSONString(d60));  
372 - // 添加到缓存,等待入库  
373 - d60.setHttpCode(code);  
374 -  
375 - GpsEntity gps = gpsRealDataBuffer.getByNbbm(nbbm);  
376 - if(null != gps)  
377 - d60.setLineCode(gps.getLineId());  
378 -  
379 - if (code != 0)  
380 - d60.setErrorText("网关通讯失败, code: " + code);  
381 -  
382 - dayOfDirectives.put60(d60);  
383 - return code;  
384 - }  
385 -  
386 - /**  
387 - * 线路切换  
388 - */  
389 - @Override  
390 - public int lineChange(String nbbm, String lineCode, String sender) {  
391 - return lineChangeByDeviceId(BasicData.deviceId2NbbmMap.inverse().get(nbbm), lineCode, sender);  
392 - }  
393 -  
394 -  
395 - @Override  
396 - public int lineChangeByDeviceId(String deviceId, String lineCode, String sender) {  
397 - DirectiveCreator crt = new DirectiveCreator();  
398 - Long t = System.currentTimeMillis();  
399 - //生成64数据包  
400 - D64 d64 = crt.create64(deviceId, lineCode, t);  
401 -  
402 - if (null != sender)  
403 - d64.setSender(sender);  
404 - else  
405 - d64.setSender("系统");  
406 -  
407 - //String deviceId = d64.getDeviceId();  
408 - int code = GatewayHttpUtils.postJson(JSON.toJSONString(d64));  
409 - // 入库  
410 - d64.setHttpCode(code);  
411 - d64.getData().setTxtContent("切换线路[" + BasicData.lineCode2NameMap.get(lineCode) + "]");  
412 - // 通知设备刷新线路文件,忽略结果  
413 - if (code == 0)  
414 - GatewayHttpUtils.postJson(crt.createDeviceRefreshData(deviceId, lineCode));  
415 - else  
416 - d64.setErrorText(" 网关通讯失败, code: " + code);  
417 -  
418 - dayOfDirectives.put64(d64);  
419 - return code;  
420 - }  
421 -  
422 - public D60 create60Data(String nbbm, String text, Short dispatchInstruct, ScheduleRealInfo sch) {  
423 -  
424 - String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);  
425 - String lineCode = null;  
426 - if (null == deviceId) {  
427 - logger.error("没有设备号对照的车辆:" + nbbm);  
428 - return null;  
429 - }  
430 - // 根据当前GPS确定 上下行和营运状态  
431 - Byte upDown = null;  
432 - Integer state = null;  
433 - if (null == sch) {  
434 - GpsEntity gpsData = gpsRealDataBuffer.get(deviceId);  
435 - if (null == gpsData) {  
436 - /*  
437 - * 短语指令不会变更设备状态,所以在没有gps状态对照的情况下可以下发  
438 - * 其他指令在不确定状态的情况下,一律不允许  
439 - */  
440 - if (dispatchInstruct == 0) {  
441 - upDown = 0;  
442 - state = 0;  
443 - } else {  
444 - logger.error("没有找到gps对照,无法确认营运状态和上下行:" + nbbm);  
445 - return null;  
446 - }  
447 - } else {  
448 - upDown = gpsData.getUpDown();  
449 - state = gpsData.getState();  
450 - lineCode = gpsData.getLineId();  
451 - }  
452 - } else {  
453 - upDown = Byte.parseByte(sch.getXlDir());  
454 - state = 0;  
455 - }  
456 -  
457 - return new DirectiveCreator().createD60(nbbm, text, dispatchInstruct, upDown, state, lineCode);  
458 - }  
459 -  
460 -/* @Override  
461 - public int upDownChange(String nbbm, Integer upDown, String sender) {  
462 - return send60Operation(nbbm, 0, upDown, sender);  
463 - }*/  
464 -  
465 -  
466 - @Override  
467 - public Map<String, List<D80>> findNoCofm80(String lineCodes) {  
468 - List<String> lineList = Splitter.on(",").trimResults().splitToList(lineCodes);  
469 -  
470 - Map<String, List<D80>> rs = new HashMap<>();  
471 - for (String code : lineList)  
472 - rs.put(code, pilotReport.unconfirmed80(code));  
473 -  
474 - return rs;  
475 - }  
476 -  
477 - @Override  
478 - public Map<String, Object> reply80(int id, int reply) {  
479 - Map<String, Object> rs = new HashMap<>();  
480 - D80 d80 = pilotReport.findById(id);  
481 - try {  
482 - if (null == d80) {  
483 - rs.put("status", ResponseCode.ERROR);  
484 - rs.put("msg", "服务器没有找到对应数据!");  
485 - } else if (d80.isConfirm()) {  
486 - rs.put("status", ResponseCode.ERROR);  
487 - rs.put("msg", "该数据已经被处理了!");  
488 - } else {  
489 - SysUser user = SecurityUtils.getCurrentUser();  
490 - d80.setC0(reply, user.getUserName());  
491 - // 入库  
492 - d80Repository.save(d80);  
493 - //回复网关  
494 - int code = GatewayHttpUtils.postJson(JSON.toJSONString(d80.getC0()));  
495 -  
496 - rs.put("status", ResponseCode.SUCCESS);  
497 - if (code != 0)  
498 - rs.put("msg", "发送C0响应指令到车载设备失败,但该操作已经被系统记录!");  
499 -  
500 - pilotReport.reply(d80);  
501 -  
502 - // 通知页面  
503 - Map<String, Object> sockMap = new HashMap<>();  
504 - sockMap.put("fn", "d80Confirm");  
505 - sockMap.put("id", d80.getId());  
506 - sockMap.put("lineId", d80.getData().getLineId());  
507 - socketHandler.sendMessageToLine(d80.getData().getLineId().toString(), JSON.toJSONString(sockMap));  
508 - }  
509 - } catch (Exception e) {  
510 - logger.error("80响应出现异常...", e);  
511 - rs.put("status", ResponseCode.SUCCESS);  
512 - }  
513 -  
514 - return rs;  
515 - }  
516 -  
517 - @Override  
518 - public Map<String, Object> findDirective(String nbbms, int dType, int page, int size) {  
519 - Map<String, Object> rsMap = new HashMap<>();  
520 - try{  
521 -  
522 - List<String> carArray = new ArrayList<>(), deviceArray=new ArrayList<>();  
523 - if(StringUtils.isNotEmpty(nbbms)){  
524 - carArray = Splitter.on(",").splitToList(nbbms);  
525 - //转换成设备号  
526 - Map<String, String> nbbm2deviceMap = BasicData.deviceId2NbbmMap.inverse();  
527 - for(int i = 0, len=carArray.size(); i < len; i++){  
528 - deviceArray.add(nbbm2deviceMap.get(carArray.get(i)));  
529 - }  
530 - }  
531 -  
532 - List<Directive> list = new ArrayList<>();  
533 - switch (dType) {  
534 - case -1:  
535 - //所有指令  
536 - list = new ArrayList<>(dayOfDirectives.all());  
537 - break;  
538 - case 0:  
539 - //调度指令  
540 - Collection<D60> dptArray = dayOfDirectives.all60();  
541 - for (D60 d60 : dptArray) {  
542 - if (d60.isDispatch())  
543 - list.add(d60);  
544 - }  
545 - break;  
546 - case 1:  
547 - //运营指令  
548 - Collection<D60> yyArray = dayOfDirectives.all60();  
549 - for (D60 d60 : yyArray) {  
550 - if (d60 != null && d60.getData().getDispatchInstruct() == (short) 0x03  
551 - && !d60.isDispatch())  
552 - list.add(d60);  
553 - }  
554 - break;  
555 - case 2:  
556 - //线路切换指令  
557 - list.addAll(dayOfDirectives.all64());  
558 - break;  
559 - case 3:  
560 - //消息短语  
561 - Collection<D60> dyArray = dayOfDirectives.all60();  
562 - for (D60 d60 : dyArray) {  
563 - if (d60 != null && d60.getData().getDispatchInstruct() == (short) 0x00  
564 - && !d60.isDispatch())  
565 - list.add(d60);  
566 - }  
567 - break;  
568 - }  
569 -  
570 - // 时间倒序  
571 - Collections.sort(list, new DayOfDirectives.DComparator());  
572 - if(deviceArray.size() > 0){  
573 - //按设备号过滤  
574 - List<Directive> subList = new ArrayList<>();  
575 - for (Directive d : list) {  
576 - if (deviceArray.contains(d.getDeviceId())) {  
577 - subList.add(d);  
578 - }  
579 - }  
580 - list = subList;  
581 - }  
582 -  
583 - for(Directive d : list){  
584 - d.setTimeHHmm(fmtHHmm.print(d.getTimestamp()));  
585 - d.setNbbm(BasicData.deviceId2NbbmMap.get(d.getDeviceId()));  
586 - }  
587 -  
588 - int count = list.size();  
589 - // 分页  
590 - int s = page * size, e = s + size;  
591 -  
592 - if (e > count)  
593 - e = count;  
594 -  
595 - List<Directive> rs = list.subList(s, e);  
596 - rsMap.put("list", rs);  
597 - rsMap.put("totalPages", count % size == 0 ? (count / size - 1) : count / size);  
598 - rsMap.put("page", page);  
599 - }catch (Exception e){  
600 - logger.error("", e);  
601 - throw e;  
602 - }  
603 - return rsMap;  
604 - }  
605 -  
606 - @Override  
607 - public Map<String, Object> findAll80(Map<String, Object> map, int page, int size) {  
608 -  
609 - List all = ListFilterUtils.filter(pilotReport.findAll(), map, D80.class);  
610 - //排序  
611 - Collections.sort(all, new Comparator<D80>() {  
612 - @Override  
613 - public int compare(D80 o1, D80 o2) {  
614 - return (int) (o2.getTimestamp() - o1.getTimestamp());  
615 - }  
616 - });  
617 - List<D80> d80s = ListPageQueryUtils.paging(all, page, size);  
618 - //时间格式化  
619 - for (D80 d80 : d80s) {  
620 - d80.setTimeStr(fmtHHmm.print(d80.getTimestamp()));  
621 - }  
622 - Map<String, Object> rsMap = new HashMap<>();  
623 - rsMap.put("list", d80s);  
624 - rsMap.put("totalPages", all.size() % size == 0 ? all.size() / size - 1: all.size() / size);  
625 - rsMap.put("page", page);  
626 - return rsMap;  
627 - }  
628 -  
629 - @Override  
630 - public D64 save64(D64 d64) {  
631 - return d64Repository.save(d64);  
632 - }  
633 -  
634 - @Override  
635 - public Map<String, Object> sendC0A4(String nbbm) {  
636 - Map<String, Object> rs = new HashMap<>();  
637 -  
638 - String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);  
639 -  
640 - GpsEntity gps = gpsRealDataBuffer.get(deviceId);  
641 - if(gps == null || gps.isOffline()){  
642 - rs.put("status", ResponseCode.ERROR);  
643 - rs.put("msg", "下发指令失败,设备离线");  
644 - return rs;  
645 - }  
646 -  
647 - Map<String, Object> c0a4 = new HashMap<>();  
648 - c0a4.put("deviceId", deviceId);  
649 - c0a4.put("timestamp", System.currentTimeMillis());  
650 - c0a4.put("operCode", (short) 0xC0);  
651 -  
652 - Map<String, Object> data = new HashMap<>();  
653 - data.put("deviceId", deviceId);  
654 - data.put("operCode2", (short) 0xA4);  
655 - c0a4.put("data", data);  
656 -  
657 - int code = GatewayHttpUtils.postJson(JSON.toJSONString(c0a4));  
658 - if(code != 0){  
659 - rs.put("status", ResponseCode.ERROR);  
660 - rs.put("msg", "和网关通讯失败, code " + code);  
661 - }  
662 - else{  
663 - rs.put("status", ResponseCode.SUCCESS);  
664 - }  
665 - return rs;  
666 - }  
667 -  
668 - @Override  
669 - public int sendC0A3(DC0_A3 c0a3) {  
670 - GatewayHttpUtils.postJson(JSON.toJSONString(c0a3));  
671 - return 0;  
672 - }  
673 -  
674 - @Override  
675 - public int sendC0A5(String json) {  
676 - return GatewayHttpUtils.postJson(json);  
677 - }  
678 -  
679 - @Override  
680 - public int refreshLineFile(String deviceId) {  
681 - GpsEntity gps = gpsRealDataBuffer.get(deviceId);  
682 - if (gps == null)  
683 - return -1;  
684 -  
685 - return GatewayHttpUtils.postJson(new DirectiveCreator().createDeviceRefreshData(deviceId, gps.getLineId()));  
686 - }  
687 -  
688 -/* @Override  
689 - public int stateChange(String nbbm, Integer upDown, Integer state, String userName) {  
690 - return send60Operation(nbbm, state, upDown, userName);  
691 - }*/  
692 -  
693 - @Override  
694 - public Map<String, Object> deviceCofigList(Map<String, String> map, int page, int size) {  
695 - Map<String, Object> rs = new HashMap<>();  
696 - try {  
697 - String conts="";  
698 - if(StringUtils.isNotBlank(map.get("lineId"))){  
699 - conts+=" AND xl='" + map.get("lineId")+"'";  
700 - }  
701 - if(StringUtils.isNotBlank(map.get("nbbm"))){  
702 - conts+=" AND inside_code like '%" + map.get("nbbm")+"%'";  
703 - }  
704 - if(StringUtils.isNotBlank(map.get("deviceId"))){  
705 - conts+=" AND equipment_code like '%" + map.get("deviceId")+"%'";  
706 - }  
707 -  
708 - String sql = "select * from (SELECT * FROM (SELECT id AS cl_id,inside_code,equipment_code FROM bsth_c_cars ) t1 LEFT JOIN bsth_v_c0_a4 t2 ON t1.equipment_code = t2.id LEFT JOIN (SELECT xl,cl FROM bsth_c_s_ccinfo WHERE id IN (SELECT max(id) FROM bsth_c_s_ccinfo GROUP BY cl)) t3 ON t1.cl_id = t3.cl ORDER BY t2.`timestamp` DESC) t4 where 1=1 "+conts;  
709 -  
710 - int count = jdbcTemplate.queryForObject("select count(*) from ("+sql+") c1", Integer.class);  
711 - int totalPages = count % size == 0 ? count / size : count / size + 1;  
712 - int s = page * size;  
713 - List<DeviceConfigDto> list = jdbcTemplate.query(sql + " LIMIT " + s + "," + size, new BeanPropertyRowMapper<>(DeviceConfigDto.class));  
714 -  
715 - rs.put("status", ResponseCode.SUCCESS);  
716 - rs.put("list", list);  
717 - rs.put("totalPages", totalPages);  
718 - rs.put("page", page);  
719 - } catch (Exception e) {  
720 - e.printStackTrace();  
721 - logger.error("", e);  
722 - rs.put("status", ResponseCode.ERROR);  
723 - }  
724 - return rs;  
725 - }  
726 -} 1 +package com.bsth.service.directive;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.alibaba.fastjson.JSONObject;
  5 +import com.bsth.common.ResponseCode;
  6 +import com.bsth.data.BasicData;
  7 +import com.bsth.data.directive.DayOfDirectives;
  8 +import com.bsth.data.directive.DirectiveCreator;
  9 +import com.bsth.data.directive.GatewayHttpUtils;
  10 +import com.bsth.data.gpsdata_v2.GpsRealData;
  11 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  12 +import com.bsth.data.pilot80.PilotReport;
  13 +import com.bsth.data.schedule.DayOfSchedule;
  14 +import com.bsth.data.utils.ListFilterUtils;
  15 +import com.bsth.data.utils.ListPageQueryUtils;
  16 +import com.bsth.entity.directive.*;
  17 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  18 +import com.bsth.entity.sys.SysUser;
  19 +import com.bsth.repository.directive.D60Repository;
  20 +import com.bsth.repository.directive.D64Repository;
  21 +import com.bsth.repository.directive.D80Repository;
  22 +import com.bsth.security.util.SecurityUtils;
  23 +import com.bsth.service.directive.dto.DeviceConfigDto;
  24 +import com.bsth.service.impl.BaseServiceImpl;
  25 +import com.bsth.websocket.handler.RealControlSocketHandler;
  26 +import com.fasterxml.jackson.core.JsonProcessingException;
  27 +import com.fasterxml.jackson.databind.ObjectMapper;
  28 +import com.google.common.base.Splitter;
  29 +import org.apache.commons.lang3.StringEscapeUtils;
  30 +import org.apache.commons.lang3.StringUtils;
  31 +import org.joda.time.format.DateTimeFormat;
  32 +import org.joda.time.format.DateTimeFormatter;
  33 +import org.slf4j.Logger;
  34 +import org.slf4j.LoggerFactory;
  35 +import org.springframework.beans.factory.annotation.Autowired;
  36 +import org.springframework.jdbc.core.BeanPropertyRowMapper;
  37 +import org.springframework.jdbc.core.JdbcTemplate;
  38 +import org.springframework.stereotype.Service;
  39 +
  40 +import java.util.*;
  41 +
  42 +@Service
  43 +public class DirectiveServiceImpl extends BaseServiceImpl<D60, Integer> implements DirectiveService {
  44 +
  45 + Logger logger = LoggerFactory.getLogger(this.getClass());
  46 +
  47 + @Autowired
  48 + D60Repository d60Repository;
  49 +
  50 + @Autowired
  51 + GpsRealData gpsRealDataBuffer;
  52 +
  53 + @Autowired
  54 + D64Repository d64Repository;
  55 +
  56 + @Autowired
  57 + RealControlSocketHandler socketHandler;
  58 +
  59 + @Autowired
  60 + D80Repository d80Repository;
  61 +
  62 + @Autowired
  63 + DayOfDirectives dayOfDirectives;
  64 +
  65 + @Autowired
  66 + PilotReport pilotReport;
  67 +
  68 + @Autowired
  69 + DayOfSchedule dayOfSchedule;
  70 +
  71 + @Autowired
  72 + JdbcTemplate jdbcTemplate;
  73 +
  74 + @Autowired
  75 + private ObjectMapper mapper;
  76 +
  77 + //static Long schDiff = 1000 * 60 * 60L;
  78 +
  79 + private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm"), fmtHHmm_CN = DateTimeFormat.forPattern("HH点mm分");
  80 +
  81 + @Override
  82 + public int send60Phrase(String nbbm, String text, String sender) {
  83 + D60 d60 = null;
  84 + try {
  85 + text = StringEscapeUtils.unescapeHtml4(text);
  86 + text = text.replaceAll("#", "");
  87 + d60 = create60Data(nbbm, text, (short) 0x00, null);
  88 + } catch (Exception e) {
  89 + logger.error("发送消息短语出现异常", e);
  90 + return -1;
  91 + }
  92 +
  93 + if (null == d60)
  94 + return -1;
  95 +
  96 + // 发送指令
  97 + int code = GatewayHttpUtils.postJson(JSON.toJSONString(d60));
  98 + if (null != sender)
  99 + d60.setSender(sender);
  100 + d60.setHttpCode(code);
  101 +
  102 + if (code != 0)
  103 + d60.setErrorText("网关通讯失败, code: " + code);
  104 +
  105 + dayOfDirectives.put60(d60);
  106 + return code;
  107 + }
  108 +
  109 + @Override
  110 + public int send60Dispatch(ScheduleRealInfo sch, int finish, String sender, String txtPrefix) {
  111 + D60 d60 = null;
  112 + try {
  113 + if (sch.isDestroy()) {
  114 + logger.warn("烂班不允许发送调度指令....");
  115 + return -1;
  116 + }
  117 +
  118 + //待发应到时间
  119 + String dfsj = fmtHHmm.print(sch.getDfsjT() + (sch.getBcsj() * 60 * 1000));
  120 + String text = "您已完成" + finish + "个班次,下一发车时间" + fmtHHmm_CN.print(sch.getDfsjT()) + ",由"
  121 + + sch.getQdzName() + "发往" + sch.getZdzName() + ";应到 " + dfsj;
  122 +
  123 + if(sch.getBcType().equals("venting")){
  124 + text += " (直放)";
  125 + }
  126 + else if(sch.getBcType().equals("major")){
  127 + text += " (放站到"+sch.getMajorStationName()+"带客)";
  128 + } else if ("ldks".equals(sch.getBcType())) {
  129 + text += " (两点空驶)";
  130 + }
  131 +
  132 + //下发0x02指令 调度指令(闹钟有效)
  133 + long t = System.currentTimeMillis() + 1000 * 30,
  134 + alarmTime = sch.getDfsjT() < t?t:sch.getDfsjT();
  135 +
  136 + if(StringUtils.isNotEmpty(txtPrefix)){
  137 + text = txtPrefix + text;
  138 + }
  139 + text = StringEscapeUtils.unescapeHtml4(text);
  140 + int state = 0;//营运状态
  141 + if(dayOfSchedule.emptyService(sch))
  142 + state = 1;
  143 + d60 = new DirectiveCreator().createD60_02(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir())
  144 + , state, new Date(alarmTime));
  145 +
  146 + d60.setLineCode(sch.getXlBm());
  147 + } catch (Exception e) {
  148 + logger.error("生成调度指令时出现异常", e);
  149 + return -1;
  150 + }
  151 +
  152 + if (null == d60)
  153 + return -1;
  154 +
  155 + d60.setSender(sender);
  156 +
  157 + JSONObject jObj = JSON.parseObject(JSON.toJSONString(d60));
  158 +
  159 + //进场或者出场班次时,附加lock 标识
  160 + if (null != sch.getBcType()
  161 + && (sch.getBcType().equals("out") || sch.getBcType().equals("in"))) {
  162 +
  163 + jObj.put("lock", 1);
  164 + }
  165 +
  166 + // 发送指令
  167 + int code = GatewayHttpUtils.postJson(jObj.toJSONString());
  168 +
  169 + d60.setDispatch(true);
  170 + d60.setSch(sch);
  171 + d60.setHttpCode(code);
  172 +
  173 + if (code == 0) {
  174 + sch.setDirectiveState(60);
  175 + // 通知页面
  176 + sendD60ToPage(sch);
  177 + } else {
  178 + d60.setErrorText("网关通讯失败, code: " + code);
  179 + }
  180 +
  181 + dayOfDirectives.put60(d60);
  182 + return code;
  183 + }
  184 +
  185 + //出场请求
  186 + @Override
  187 + public int send60Dispatchcc(ScheduleRealInfo sch, int finish, String sender, String txtPrefix) {
  188 + D60 d60 = null;
  189 + try {
  190 + if (sch.isDestroy()) {
  191 + logger.warn("烂班不允许发送调度指令....");
  192 + return -1;
  193 + }
  194 + //待发应到时间
  195 + String dfsj = fmtHHmm.print(sch.getDfsjT() + (sch.getBcsj() * 60 * 1000));
  196 + String text = "出场请求,由" + sch.getQdzName() + "发往" + sch.getZdzName() + ";请出场";
  197 +
  198 + //下发0x02指令 调度指令(闹钟有效)
  199 + long t = System.currentTimeMillis() + 1000 * 30,
  200 + alarmTime = sch.getDfsjT() < t?t:sch.getDfsjT();
  201 +
  202 + if(StringUtils.isNotEmpty(txtPrefix)){
  203 + text = txtPrefix + text;
  204 + }
  205 + text = StringEscapeUtils.unescapeHtml4(text);
  206 + int state = 0;//营运状态
  207 + if(dayOfSchedule.emptyService(sch))
  208 + state = 1;
  209 + d60 = new DirectiveCreator().createD60_02(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir())
  210 + , state, new Date(alarmTime));
  211 +
  212 + d60.setLineCode(sch.getXlBm());
  213 + } catch (Exception e) {
  214 + logger.error("生成调度指令时出现异常", e);
  215 + return -1;
  216 + }
  217 +
  218 + if (null == d60)
  219 + return -1;
  220 +
  221 + d60.setSender(sender);
  222 +
  223 + JSONObject jObj = JSON.parseObject(JSON.toJSONString(d60));
  224 +
  225 + //进场或者出场班次时,附加lock 标识
  226 + if (null != sch.getBcType()
  227 + && (sch.getBcType().equals("out") || sch.getBcType().equals("in"))) {
  228 +
  229 + jObj.put("lock", 1);
  230 + }
  231 +
  232 + // 发送指令
  233 + int code = GatewayHttpUtils.postJson(jObj.toJSONString());
  234 +
  235 + d60.setDispatch(true);
  236 + d60.setSch(sch);
  237 + d60.setHttpCode(code);
  238 +
  239 + if (code == 0) {
  240 + sch.setDirectiveState(60);
  241 + // 通知页面
  242 + sendD60ToPage(sch);
  243 + } else {
  244 + d60.setErrorText("网关通讯失败, code: " + code);
  245 + }
  246 +
  247 + dayOfDirectives.put60(d60);
  248 + return code;
  249 + }
  250 +
  251 +
  252 + public int send60DispatchZndd(ScheduleRealInfo sch, int finish, String sender, String txtPrefix) {
  253 + D60 d60 = null;
  254 + try {
  255 + if (sch.isDestroy()) {
  256 + logger.warn("烂班不允许发送调度指令....");
  257 + return -1;
  258 + }
  259 +
  260 + //待发应到时间
  261 + String dfsj = fmtHHmm.print(sch.getDfsjT() + (sch.getBcsj() * 60 * 1000));
  262 + String text = "(自动补发命令)"+sch.getFcsjActual() +"发出的,由"
  263 + + sch.getQdzName() + "发往" + sch.getZdzName() + ";还未确认,请尽快确认";
  264 +
  265 + if(sch.getBcType().equals("venting")){
  266 + text += " (直放)";
  267 + }
  268 + else if(sch.getBcType().equals("major")){
  269 + text += " (放站到"+sch.getMajorStationName()+"带客)";
  270 + } else if ("ldks".equals(sch.getBcType())) {
  271 + text += " (两点空驶)";
  272 + }
  273 +
  274 + //下发0x02指令 调度指令(闹钟有效)
  275 + long t = System.currentTimeMillis() + 1000 * 30,
  276 + alarmTime = sch.getDfsjT() < t?t:sch.getDfsjT();
  277 +
  278 + if(StringUtils.isNotEmpty(txtPrefix)){
  279 + text = txtPrefix + text;
  280 + }
  281 + text = StringEscapeUtils.unescapeHtml4(text);
  282 + int state = 0;//营运状态
  283 + if(dayOfSchedule.emptyService(sch))
  284 + state = 1;
  285 + d60 = new DirectiveCreator().createD60_02(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir())
  286 + , state, new Date(alarmTime));
  287 +
  288 + d60.setLineCode(sch.getXlBm());
  289 + } catch (Exception e) {
  290 + logger.error("生成调度指令时出现异常", e);
  291 + return -1;
  292 + }
  293 +
  294 + if (null == d60)
  295 + return -1;
  296 +
  297 + d60.setSender(sender);
  298 +
  299 + JSONObject jObj = JSON.parseObject(JSON.toJSONString(d60));
  300 +
  301 + //进场或者出场班次时,附加lock 标识
  302 + if (null != sch.getBcType()
  303 + && (sch.getBcType().equals("out") || sch.getBcType().equals("in"))) {
  304 +
  305 + jObj.put("lock", 1);
  306 + }
  307 +
  308 + // 发送指令
  309 + int code = GatewayHttpUtils.postJson(jObj.toJSONString());
  310 +
  311 + d60.setDispatch(true);
  312 + d60.setSch(sch);
  313 + d60.setHttpCode(code);
  314 +
  315 + if (code == 0) {
  316 + sch.setDirectiveState(60);
  317 + // 通知页面
  318 + sendD60ToPage(sch);
  319 + } else {
  320 + d60.setErrorText("网关通讯失败, code: " + code);
  321 + }
  322 + dayOfDirectives.put60(d60);
  323 + return code;
  324 + }
  325 +
  326 + /**
  327 + * @Title: sendDirectiveState @Description: TODO(向页面推送班次指令状态) @throws
  328 + */
  329 + @Override
  330 + public void sendD60ToPage(ScheduleRealInfo sch) {
  331 + Map<String, Object> map = new HashMap<>();
  332 + map.put("fn", "directive");
  333 + map.put("t", sch);
  334 +
  335 + ObjectMapper mapper = new ObjectMapper();
  336 +
  337 + try {
  338 + socketHandler.sendMessageToLine(sch.getXlBm(), mapper.writeValueAsString(map));
  339 + } catch (JsonProcessingException e) {
  340 + logger.error("", e);
  341 + }
  342 + }
  343 +
  344 + @Override
  345 + public int send60Dispatch(Long id, String sender) {
  346 + ScheduleRealInfo sch = dayOfSchedule.get(id);
  347 + // 车辆已完成班次
  348 + int finish = dayOfSchedule.doneSum(sch.getClZbh());
  349 + return send60Dispatch(sch, finish, sender, "");
  350 + }
  351 +
  352 + @Override
  353 + public int send60DispatchZndd(Long id, String sender) {
  354 + ScheduleRealInfo sch = dayOfSchedule.get(id);
  355 + // 车辆已完成班次
  356 + int finish = dayOfSchedule.doneSum(sch.getClZbh());
  357 + return send60DispatchZndd(sch, finish, sender, "");
  358 + }
  359 +
  360 + @Override
  361 + public int send60Operation(String nbbm, int state, int upDown, String sender) {
  362 + logger.info("切换运营状态, nbbm: " + nbbm + " ,state: " + state + " ,upDown:" + upDown);
  363 +
  364 + String text = "切换为 " + (upDown == 0 ? "上行" : "下行") + (state == 0 ? "营运" : "未营运");
  365 + D60 d60 = new DirectiveCreator().createD60(nbbm, text, (short) 0x03, upDown, state, null);
  366 +
  367 + if (null == d60)
  368 + return -1;
  369 + if (null != sender)
  370 + d60.setSender(sender);
  371 + else
  372 + d60.setSender("系统");
  373 + // 发送指令
  374 + int code = GatewayHttpUtils.postJson(JSON.toJSONString(d60));
  375 + // 添加到缓存,等待入库
  376 + d60.setHttpCode(code);
  377 +
  378 + GpsEntity gps = gpsRealDataBuffer.getByNbbm(nbbm);
  379 + if(null != gps)
  380 + d60.setLineCode(gps.getLineId());
  381 +
  382 + if (code != 0)
  383 + d60.setErrorText("网关通讯失败, code: " + code);
  384 +
  385 + dayOfDirectives.put60(d60);
  386 + return code;
  387 + }
  388 +
  389 + @Override
  390 + public int lineChange(String nbbm, String lineCode, String sender) {
  391 + return lineChangeByDeviceId(BasicData.deviceId2NbbmMap.inverse().get(nbbm), lineCode, null, sender);
  392 + }
  393 +
  394 + /**
  395 + * 线路切换
  396 + */
  397 + @Override
  398 + public int lineChange(String nbbm, String lineCode, ScheduleRealInfo sch, String sender) {
  399 + return lineChangeByDeviceId(BasicData.deviceId2NbbmMap.inverse().get(nbbm), lineCode, sch, sender);
  400 + }
  401 +
  402 + @Override
  403 + public int lineChangeByDeviceId(String deviceId, String lineCode, String sender) {
  404 + return lineChangeByDeviceId(deviceId, lineCode, null, sender);
  405 + }
  406 +
  407 + @Override
  408 + public int lineChangeByDeviceId(String deviceId, String lineCode, ScheduleRealInfo sch, String sender) {
  409 + DirectiveCreator crt = new DirectiveCreator();
  410 + Long t = System.currentTimeMillis();
  411 + //生成64数据包
  412 + D64 d64 = crt.create64(deviceId, lineCode, sch, t);
  413 +
  414 + if (null != sender)
  415 + d64.setSender(sender);
  416 + else
  417 + d64.setSender("系统");
  418 +
  419 + //String deviceId = d64.getDeviceId();
  420 + int code = -1;
  421 + try {
  422 + code = GatewayHttpUtils.postJson(mapper.writeValueAsString(d64));
  423 + } catch (JsonProcessingException e) {
  424 + throw new RuntimeException(e);
  425 + }
  426 + // 入库
  427 + d64.setHttpCode(code);
  428 + d64.getData().setTxtContent("切换线路[" + BasicData.lineCode2NameMap.get(lineCode) + "]");
  429 + // 通知设备刷新线路文件,忽略结果
  430 + if (code == 0)
  431 + GatewayHttpUtils.postJson(crt.createDeviceRefreshData(deviceId, lineCode));
  432 + else
  433 + d64.setErrorText(" 网关通讯失败, code: " + code);
  434 +
  435 + dayOfDirectives.put64(d64);
  436 + return code;
  437 + }
  438 +
  439 + public D60 create60Data(String nbbm, String text, Short dispatchInstruct, ScheduleRealInfo sch) {
  440 +
  441 + String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
  442 + String lineCode = null;
  443 + if (null == deviceId) {
  444 + logger.error("没有设备号对照的车辆:" + nbbm);
  445 + return null;
  446 + }
  447 + // 根据当前GPS确定 上下行和营运状态
  448 + Byte upDown = null;
  449 + Integer state = null;
  450 + if (null == sch) {
  451 + GpsEntity gpsData = gpsRealDataBuffer.get(deviceId);
  452 + if (null == gpsData) {
  453 + /*
  454 + * 短语指令不会变更设备状态,所以在没有gps状态对照的情况下可以下发
  455 + * 其他指令在不确定状态的情况下,一律不允许
  456 + */
  457 + if (dispatchInstruct == 0) {
  458 + upDown = 0;
  459 + state = 0;
  460 + } else {
  461 + logger.error("没有找到gps对照,无法确认营运状态和上下行:" + nbbm);
  462 + return null;
  463 + }
  464 + } else {
  465 + upDown = gpsData.getUpDown();
  466 + state = gpsData.getState();
  467 + lineCode = gpsData.getLineId();
  468 + }
  469 + } else {
  470 + upDown = Byte.parseByte(sch.getXlDir());
  471 + state = 0;
  472 + }
  473 +
  474 + return new DirectiveCreator().createD60(nbbm, text, dispatchInstruct, upDown, state, lineCode);
  475 + }
  476 +
  477 +/* @Override
  478 + public int upDownChange(String nbbm, Integer upDown, String sender) {
  479 + return send60Operation(nbbm, 0, upDown, sender);
  480 + }*/
  481 +
  482 +
  483 + @Override
  484 + public Map<String, List<D80>> findNoCofm80(String lineCodes) {
  485 + List<String> lineList = Splitter.on(",").trimResults().splitToList(lineCodes);
  486 +
  487 + Map<String, List<D80>> rs = new HashMap<>();
  488 + for (String code : lineList)
  489 + rs.put(code, pilotReport.unconfirmed80(code));
  490 +
  491 + return rs;
  492 + }
  493 +
  494 + @Override
  495 + public Map<String, Object> reply80(int id, int reply) {
  496 + Map<String, Object> rs = new HashMap<>();
  497 + D80 d80 = pilotReport.findById(id);
  498 + try {
  499 + if (null == d80) {
  500 + rs.put("status", ResponseCode.ERROR);
  501 + rs.put("msg", "服务器没有找到对应数据!");
  502 + } else if (d80.isConfirm()) {
  503 + rs.put("status", ResponseCode.ERROR);
  504 + rs.put("msg", "该数据已经被处理了!");
  505 + } else {
  506 + SysUser user = SecurityUtils.getCurrentUser();
  507 + d80.setC0(reply, user.getUserName());
  508 + // 入库
  509 + d80Repository.save(d80);
  510 + //回复网关
  511 + int code = GatewayHttpUtils.postJson(JSON.toJSONString(d80.getC0()));
  512 +
  513 + rs.put("status", ResponseCode.SUCCESS);
  514 + if (code != 0)
  515 + rs.put("msg", "发送C0响应指令到车载设备失败,但该操作已经被系统记录!");
  516 +
  517 + pilotReport.reply(d80);
  518 +
  519 + // 通知页面
  520 + Map<String, Object> sockMap = new HashMap<>();
  521 + sockMap.put("fn", "d80Confirm");
  522 + sockMap.put("id", d80.getId());
  523 + sockMap.put("lineId", d80.getData().getLineId());
  524 + socketHandler.sendMessageToLine(d80.getData().getLineId().toString(), JSON.toJSONString(sockMap));
  525 + }
  526 + } catch (Exception e) {
  527 + logger.error("80响应出现异常...", e);
  528 + rs.put("status", ResponseCode.SUCCESS);
  529 + }
  530 +
  531 + return rs;
  532 + }
  533 +
  534 + @Override
  535 + public Map<String, Object> findDirective(String nbbms, int dType, int page, int size) {
  536 + Map<String, Object> rsMap = new HashMap<>();
  537 + try{
  538 +
  539 + List<String> carArray = new ArrayList<>(), deviceArray=new ArrayList<>();
  540 + if(StringUtils.isNotEmpty(nbbms)){
  541 + carArray = Splitter.on(",").splitToList(nbbms);
  542 + //转换成设备号
  543 + Map<String, String> nbbm2deviceMap = BasicData.deviceId2NbbmMap.inverse();
  544 + for(int i = 0, len=carArray.size(); i < len; i++){
  545 + deviceArray.add(nbbm2deviceMap.get(carArray.get(i)));
  546 + }
  547 + }
  548 +
  549 + List<Directive> list = new ArrayList<>();
  550 + switch (dType) {
  551 + case -1:
  552 + //所有指令
  553 + list = new ArrayList<>(dayOfDirectives.all());
  554 + break;
  555 + case 0:
  556 + //调度指令
  557 + Collection<D60> dptArray = dayOfDirectives.all60();
  558 + for (D60 d60 : dptArray) {
  559 + if (d60.isDispatch())
  560 + list.add(d60);
  561 + }
  562 + break;
  563 + case 1:
  564 + //运营指令
  565 + Collection<D60> yyArray = dayOfDirectives.all60();
  566 + for (D60 d60 : yyArray) {
  567 + if (d60 != null && d60.getData().getDispatchInstruct() == (short) 0x03
  568 + && !d60.isDispatch())
  569 + list.add(d60);
  570 + }
  571 + break;
  572 + case 2:
  573 + //线路切换指令
  574 + list.addAll(dayOfDirectives.all64());
  575 + break;
  576 + case 3:
  577 + //消息短语
  578 + Collection<D60> dyArray = dayOfDirectives.all60();
  579 + for (D60 d60 : dyArray) {
  580 + if (d60 != null && d60.getData().getDispatchInstruct() == (short) 0x00
  581 + && !d60.isDispatch())
  582 + list.add(d60);
  583 + }
  584 + break;
  585 + }
  586 +
  587 + // 时间倒序
  588 + Collections.sort(list, new DayOfDirectives.DComparator());
  589 + if(deviceArray.size() > 0){
  590 + //按设备号过滤
  591 + List<Directive> subList = new ArrayList<>();
  592 + for (Directive d : list) {
  593 + if (deviceArray.contains(d.getDeviceId())) {
  594 + subList.add(d);
  595 + }
  596 + }
  597 + list = subList;
  598 + }
  599 +
  600 + for(Directive d : list){
  601 + d.setTimeHHmm(fmtHHmm.print(d.getTimestamp()));
  602 + d.setNbbm(BasicData.deviceId2NbbmMap.get(d.getDeviceId()));
  603 + }
  604 +
  605 + int count = list.size();
  606 + // 分页
  607 + int s = page * size, e = s + size;
  608 +
  609 + if (e > count)
  610 + e = count;
  611 +
  612 + List<Directive> rs = list.subList(s, e);
  613 + rsMap.put("list", rs);
  614 + rsMap.put("totalPages", count % size == 0 ? (count / size - 1) : count / size);
  615 + rsMap.put("page", page);
  616 + }catch (Exception e){
  617 + logger.error("", e);
  618 + throw e;
  619 + }
  620 + return rsMap;
  621 + }
  622 +
  623 + @Override
  624 + public Map<String, Object> findAll80(Map<String, Object> map, int page, int size) {
  625 +
  626 + List all = ListFilterUtils.filter(pilotReport.findAll(), map, D80.class);
  627 + //排序
  628 + Collections.sort(all, new Comparator<D80>() {
  629 + @Override
  630 + public int compare(D80 o1, D80 o2) {
  631 + return (int) (o2.getTimestamp() - o1.getTimestamp());
  632 + }
  633 + });
  634 + List<D80> d80s = ListPageQueryUtils.paging(all, page, size);
  635 + //时间格式化
  636 + for (D80 d80 : d80s) {
  637 + d80.setTimeStr(fmtHHmm.print(d80.getTimestamp()));
  638 + }
  639 + Map<String, Object> rsMap = new HashMap<>();
  640 + rsMap.put("list", d80s);
  641 + rsMap.put("totalPages", all.size() % size == 0 ? all.size() / size - 1: all.size() / size);
  642 + rsMap.put("page", page);
  643 + return rsMap;
  644 + }
  645 +
  646 + @Override
  647 + public D64 save64(D64 d64) {
  648 + return d64Repository.save(d64);
  649 + }
  650 +
  651 + @Override
  652 + public Map<String, Object> sendC0A4(String nbbm) {
  653 + Map<String, Object> rs = new HashMap<>();
  654 +
  655 + String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
  656 +
  657 + GpsEntity gps = gpsRealDataBuffer.get(deviceId);
  658 + if(gps == null || gps.isOffline()){
  659 + rs.put("status", ResponseCode.ERROR);
  660 + rs.put("msg", "下发指令失败,设备离线");
  661 + return rs;
  662 + }
  663 +
  664 + Map<String, Object> c0a4 = new HashMap<>();
  665 + c0a4.put("deviceId", deviceId);
  666 + c0a4.put("timestamp", System.currentTimeMillis());
  667 + c0a4.put("operCode", (short) 0xC0);
  668 +
  669 + Map<String, Object> data = new HashMap<>();
  670 + data.put("deviceId", deviceId);
  671 + data.put("operCode2", (short) 0xA4);
  672 + c0a4.put("data", data);
  673 +
  674 + int code = GatewayHttpUtils.postJson(JSON.toJSONString(c0a4));
  675 + if(code != 0){
  676 + rs.put("status", ResponseCode.ERROR);
  677 + rs.put("msg", "和网关通讯失败, code " + code);
  678 + }
  679 + else{
  680 + rs.put("status", ResponseCode.SUCCESS);
  681 + }
  682 + return rs;
  683 + }
  684 +
  685 + @Override
  686 + public int sendC0A3(DC0_A3 c0a3) {
  687 + GatewayHttpUtils.postJson(JSON.toJSONString(c0a3));
  688 + return 0;
  689 + }
  690 +
  691 + @Override
  692 + public int sendC0A5(String json) {
  693 + return GatewayHttpUtils.postJson(json);
  694 + }
  695 +
  696 + @Override
  697 + public int refreshLineFile(String deviceId) {
  698 + GpsEntity gps = gpsRealDataBuffer.get(deviceId);
  699 + if (gps == null)
  700 + return -1;
  701 +
  702 + return GatewayHttpUtils.postJson(new DirectiveCreator().createDeviceRefreshData(deviceId, gps.getLineId()));
  703 + }
  704 +
  705 +/* @Override
  706 + public int stateChange(String nbbm, Integer upDown, Integer state, String userName) {
  707 + return send60Operation(nbbm, state, upDown, userName);
  708 + }*/
  709 +
  710 + @Override
  711 + public Map<String, Object> deviceCofigList(Map<String, String> map, int page, int size) {
  712 + Map<String, Object> rs = new HashMap<>();
  713 + try {
  714 + String conts="";
  715 + if(StringUtils.isNotBlank(map.get("lineId"))){
  716 + conts+=" AND xl='" + map.get("lineId")+"'";
  717 + }
  718 + if(StringUtils.isNotBlank(map.get("nbbm"))){
  719 + conts+=" AND inside_code like '%" + map.get("nbbm")+"%'";
  720 + }
  721 + if(StringUtils.isNotBlank(map.get("deviceId"))){
  722 + conts+=" AND equipment_code like '%" + map.get("deviceId")+"%'";
  723 + }
  724 +
  725 + String sql = "select * from (SELECT * FROM (SELECT id AS cl_id,inside_code,equipment_code FROM bsth_c_cars ) t1 LEFT JOIN bsth_v_c0_a4 t2 ON t1.equipment_code = t2.id LEFT JOIN (SELECT xl,cl FROM bsth_c_s_ccinfo WHERE id IN (SELECT max(id) FROM bsth_c_s_ccinfo GROUP BY cl)) t3 ON t1.cl_id = t3.cl ORDER BY t2.`timestamp` DESC) t4 where 1=1 "+conts;
  726 +
  727 + int count = jdbcTemplate.queryForObject("select count(*) from ("+sql+") c1", Integer.class);
  728 + int totalPages = count % size == 0 ? count / size : count / size + 1;
  729 + int s = page * size;
  730 + List<DeviceConfigDto> list = jdbcTemplate.query(sql + " LIMIT " + s + "," + size, new BeanPropertyRowMapper<>(DeviceConfigDto.class));
  731 +
  732 + rs.put("status", ResponseCode.SUCCESS);
  733 + rs.put("list", list);
  734 + rs.put("totalPages", totalPages);
  735 + rs.put("page", page);
  736 + } catch (Exception e) {
  737 + e.printStackTrace();
  738 + logger.error("", e);
  739 + rs.put("status", ResponseCode.ERROR);
  740 + }
  741 + return rs;
  742 + }
  743 +}
src/main/java/com/bsth/service/impl/StationRouteServiceImpl.java
@@ -67,6 +67,11 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ @@ -67,6 +67,11 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
67 @Autowired 67 @Autowired
68 private LsSectionRouteRepository lsSectionRouteRepository; 68 private LsSectionRouteRepository lsSectionRouteRepository;
69 69
  70 + @Autowired
  71 + private LineRegionRepository lineRegionRepository;
  72 + @Autowired
  73 + private LineVersionsRepository lineVersionsRepository;
  74 +
70 @Override 75 @Override
71 public Iterable<StationRoute> list(Map<String, Object> map) { 76 public Iterable<StationRoute> list(Map<String, Object> map) {
72 List<Sort.Order> orders = new ArrayList<>(); 77 List<Sort.Order> orders = new ArrayList<>();
@@ -404,10 +409,13 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ @@ -404,10 +409,13 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
404 try { 409 try {
405 // 获取线路ID 410 // 获取线路ID
406 Integer lineId = map.get("lineId").equals("") ? 0 : Integer.parseInt(map.get("lineId").toString()); 411 Integer lineId = map.get("lineId").equals("") ? 0 : Integer.parseInt(map.get("lineId").toString());
  412 + Integer version = lineVersionsRepository.findCurrentVersion(lineId);
  413 + Map<String, Object> param = new HashMap<>();
  414 + param.put("line_eq", lineId);
  415 + param.put("version_eq", version);
407 /** 查询线路信息 @param:<lineId:线路ID> */ 416 /** 查询线路信息 @param:<lineId:线路ID> */
408 Line line = lineRepository.findById(lineId).get(); 417 Line line = lineRepository.findById(lineId).get();
409 418
410 -  
411 Business company = businessRepository.findByBusinessCode(line.getCompany()).get(0); 419 Business company = businessRepository.findByBusinessCode(line.getCompany()).get(0);
412 420
413 Integer fileVersions = lineRepository.findfileVersions(lineId); 421 Integer fileVersions = lineRepository.findfileVersions(lineId);
@@ -421,6 +429,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ @@ -421,6 +429,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
421 // Integer fileVersions = map.get("fileVersions").equals("") ? 1 : Integer.parseInt(map.get("fileVersions").toString());// 没有输入就默认1 429 // Integer fileVersions = map.get("fileVersions").equals("") ? 1 : Integer.parseInt(map.get("fileVersions").toString());// 没有输入就默认1
422 /** 查询线路信息下的站点路由信息 @param:<lineId:线路ID> */ 430 /** 查询线路信息下的站点路由信息 @param:<lineId:线路ID> */
423 List<Object[]> objects = stationRouteRepository.usingSingle(lineId); 431 List<Object[]> objects = stationRouteRepository.usingSingle(lineId);
  432 + List<LineRegion> lineRegions = lineRegionRepository.findAll(new CustomerSpecs<>(param));
424 if (objects.size()>0) { 433 if (objects.size()>0) {
425 /** 获取配置文件里的ftp登录参数 */ 434 /** 获取配置文件里的ftp登录参数 */
426 Map<String, Object> FTPParamMap = readPropertiesGetFTPParam(); 435 Map<String, Object> FTPParamMap = readPropertiesGetFTPParam();
@@ -489,7 +498,14 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ @@ -489,7 +498,14 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
489 clientUtils.uploadFile(url, port, username, password, remotePath + "/voice/", textFileName, input); 498 clientUtils.uploadFile(url, port, username, password, remotePath + "/voice/", textFileName, input);
490 499
491 // textFile.delete(); 500 // textFile.delete();
492 - 501 + if (lineRegions.size() > 0) {
  502 + FTPClientUtils.deleteFileByPrefix(String.format("%s-", line.getLineCode()), url, port, username, password, String.format("%s/voice/", remotePath));
  503 + for (LineRegion lineRegion : lineRegions) {
  504 + textStr = String.format("%s\r\n%s", head, subLine2Ftp(lineRegion));
  505 + input = new ByteArrayInputStream(textStr.getBytes("gbk"));
  506 + clientUtils.uploadFile(url, port, username, password, remotePath + "/voice/", String.format("%s-%d.txt", line.getLineCode(), lineRegion.getSeq()), input);
  507 + }
  508 + }
493 509
494 resultMap.put("status", ResponseCode.SUCCESS); 510 resultMap.put("status", ResponseCode.SUCCESS);
495 }else { 511 }else {
@@ -1001,4 +1017,30 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ @@ -1001,4 +1017,30 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1001 } 1017 }
1002 } 1018 }
1003 } 1019 }
  1020 +
  1021 + private String subLine2Ftp(LineRegion lineRegion) {
  1022 + StringBuilder builder = new StringBuilder();
  1023 + int len = lineRegion.getStationRoutes().size();
  1024 + int idx = 1;
  1025 + for (int i = 0;i < len;i++) {
  1026 + LsStationRoute route = lineRegion.getStationRoutes().get(i);
  1027 + builder.append(route.getCenterPointWgs().getPosition().getCoordinate(0))
  1028 + .append("\t").append(route.getCenterPointWgs().getPosition().getCoordinate(1))
  1029 + .append("\t").append(i == len - 1 ? 2 : 1)
  1030 + .append("\t").append(idx).append("\t");
  1031 + for (int j = 0;j < 8 - route.getStationCode().length();j++) {
  1032 + builder.append("0");
  1033 + }
  1034 + builder.append(route.getStationCode())
  1035 + .append("\t").append((int) route.getDistances().doubleValue() * 1000)
  1036 + .append("\t0")
  1037 + .append("\t").append(route.getStationName())
  1038 + .append("\t").append(route.getStationNameEn())
  1039 + .append("\r\n");
  1040 +
  1041 + idx++;
  1042 + }
  1043 +
  1044 + return builder.toString();
  1045 + }
1004 } 1046 }