Commit 7a40065f15fad2e14f692cf22c10fa724fc1432a

Authored by 徐烜
2 parents 0e7be12c e0064270

Update

Showing 52 changed files with 3190 additions and 1418 deletions

Too many changes to show.

To preserve performance only 52 of 1714 files are displayed.

@@ -264,6 +264,12 @@ @@ -264,6 +264,12 @@
264 <artifactId>ojdbc</artifactId> 264 <artifactId>ojdbc</artifactId>
265 <version>14</version> 265 <version>14</version>
266 </dependency> 266 </dependency>
  267 +
  268 + <dependency>
  269 + <groupId>org.apache.mina</groupId>
  270 + <artifactId>mina-core</artifactId>
  271 + <version>2.0.13</version>
  272 + </dependency>
267 </dependencies> 273 </dependencies>
268 274
269 <dependencyManagement> 275 <dependencyManagement>
src/main/java/com/bsth/Application.java
@@ -8,14 +8,16 @@ import org.springframework.boot.builder.SpringApplicationBuilder; @@ -8,14 +8,16 @@ import org.springframework.boot.builder.SpringApplicationBuilder;
8 import org.springframework.boot.context.web.SpringBootServletInitializer; 8 import org.springframework.boot.context.web.SpringBootServletInitializer;
9 import org.springframework.context.annotation.Bean; 9 import org.springframework.context.annotation.Bean;
10 import org.springframework.context.annotation.Primary; 10 import org.springframework.context.annotation.Primary;
  11 +import org.springframework.transaction.annotation.EnableTransactionManagement;
11 12
12 import java.util.concurrent.Executors; 13 import java.util.concurrent.Executors;
13 import java.util.concurrent.ScheduledExecutorService; 14 import java.util.concurrent.ScheduledExecutorService;
14 15
  16 +@EnableTransactionManagement
15 @SpringBootApplication 17 @SpringBootApplication
16 public class Application extends SpringBootServletInitializer { 18 public class Application extends SpringBootServletInitializer {
17 19
18 - public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(13); 20 + public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(14);
19 21
20 @Override 22 @Override
21 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 23 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
src/main/java/com/bsth/controller/forms/ExportController.java
@@ -330,69 +330,22 @@ public class ExportController { @@ -330,69 +330,22 @@ public class ExportController {
330 SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"), sdfSimple = new SimpleDateFormat("yyyyMMdd"); 330 SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"), sdfSimple = new SimpleDateFormat("yyyyMMdd");
331 List<Iterator<?>> listI = new ArrayList<Iterator<?>>(); 331 List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
332 ReportUtils ee = new ReportUtils(); 332 ReportUtils ee = new ReportUtils();
333 - List<Turnoutrate> turnoutrate = formsService.turnoutrate(map);  
334 Map<String, Object> map1 = new HashMap<String, Object>(); 333 Map<String, Object> map1 = new HashMap<String, Object>();
335 - List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();  
336 - String xlts="";  
337 - String zsgs="";  
338 - String jh="";  
339 - Float j=0f;  
340 - Float sj=0f;  
341 - Float qz=0f;  
342 - Float ccl=0f;  
343 - Float bcjh=0f;  
344 - String bcsj="";  
345 - Float bczxl=0f;  
346 - String gs="";  
347 - String zhgs="";  
348 334
349 - for (Turnoutrate l : turnoutrate) {  
350 - Map<String, Object> m = new HashMap<String, Object>();  
351 -  
352 - xlts +=l.getGsgs()==""?0:String.valueOf(l.getGsgs());  
353 - zsgs +=l.getFgsgs()==""?0:String.valueOf(l.getFgsgs());  
354 - jh +=l.getXl()==""?0:String.valueOf(l.getXl());  
355 - sj +=l.getCchjh()==""?0f:Float.valueOf(l.getCchjh());  
356 - ccl +=l.getCchsj()==""?0f:Float.valueOf(l.getCchsj());  
357 - bcjh +=l.getCchqz()==""?0f:Float.valueOf(l.getCchqz());  
358 - bcsj +=l.getChl()==""?0:String.valueOf(l.getChl());  
359 - bczxl +=l.getBcjh()==""?0f:Float.valueOf(l.getBcjh());  
360 - gs +=l.getBcsj()==""?0:String.valueOf(l.getBcsj());  
361 - zhgs +=l.getBbzxl()==""?0:String.valueOf(l.getBbzxl());  
362 -  
363 -  
364 - m.put("rq", l.getRq());  
365 - m.put("gs", l.getGs());  
366 - m.put("zhgs", l.getZhgs());  
367 - m.put("xl", l.getXl());  
368 - m.put("cchjh", l.getCchjh());  
369 - m.put("cchsj", l.getCchsj());  
370 - m.put("cchqz", l.getCchqz());  
371 - m.put("chl", l.getChl());  
372 - m.put("bcjh", l.getBcjh());  
373 - m.put("bcsj", l.getBcsj());  
374 - m.put("bbzxl", l.getBbzxl());  
375 - m.put("sm", l.getSm());  
376 - resList.add(m);  
377 -  
378 -  
379 -  
380 - m=new HashMap<String,Object>();  
381 - m.put("total_xlts", xlts);  
382 - m.put("total_zhgs", zsgs);  
383 - m.put("total_jh", jh);  
384 - m.put("total_sj", sj);  
385 - m.put("total_qz", ccl);  
386 - m.put("total_ccl", bcjh);  
387 - m.put("total_bcjh",bcsj);  
388 - m.put("total_bcsj", bczxl);  
389 - m.put("total_bczxl", bczxl);  
390 - m.put("total_gs", zhgs);  
391 -  
392 -  
393 - map1 = m;  
394 - }  
395 - 335 + List<Map<String, Object>> resList = formsService.turnoutrate(map);
  336 + Map<String, Object> m = resList.get(resList.size() - 1);
  337 + map1.put("line", m.get("line"));
  338 + map1.put("jhcc", m.get("jhcc"));
  339 + map1.put("sjcc", m.get("sjcc"));
  340 + map1.put("jhbc", m.get("jhbc"));
  341 + map1.put("sjbc", m.get("sjbc"));
  342 + map1.put("ccl", m.get("ccl"));
  343 + map1.put("zxl", m.get("zxl"));
  344 + map1.put("qz", m.get("qz"));
  345 + map1.put("sm", m.get("sm"));
  346 +
  347 + resList.remove(m);
  348 +
396 try { 349 try {
397 listI.add(resList.iterator()); 350 listI.add(resList.iterator());
398 String path = this.getClass().getResource("/").getPath() + "static/pages/forms/"; 351 String path = this.getClass().getResource("/").getPath() + "static/pages/forms/";
src/main/java/com/bsth/controller/forms/MCY_FormsController.java
@@ -94,7 +94,7 @@ public class MCY_FormsController { @@ -94,7 +94,7 @@ public class MCY_FormsController {
94 94
95 // 营运线路出车率统计表 95 // 营运线路出车率统计表
96 @RequestMapping(value = "/turnoutrate", method = RequestMethod.POST) 96 @RequestMapping(value = "/turnoutrate", method = RequestMethod.POST)
97 - public List<Turnoutrate> turnoutrate(@RequestParam Map<String, Object> map) { 97 + public List<Map<String, Object>> turnoutrate(@RequestParam Map<String, Object> map) {
98 98
99 return formsService.turnoutrate(map); 99 return formsService.turnoutrate(map);
100 } 100 }
src/main/java/com/bsth/controller/oil/DlbController.java
@@ -143,12 +143,16 @@ public class DlbController extends BaseController&lt;Dlb, Integer&gt;{ @@ -143,12 +143,16 @@ public class DlbController extends BaseController&lt;Dlb, Integer&gt;{
143 Map<String, Object> m = new HashMap<String, Object>(); 143 Map<String, Object> m = new HashMap<String, Object>();
144 m.put("rq", y.getRq()); 144 m.put("rq", y.getRq());
145 m.put("gsname",y.getGsname() ); 145 m.put("gsname",y.getGsname() );
  146 + m.put("fgsname", y.getFgsname());
146 m.put("xlname", y.getXlname()); 147 m.put("xlname", y.getXlname());
147 m.put("nbbm", y.getNbbm()); 148 m.put("nbbm", y.getNbbm());
148 m.put("jsy", y.getJsy()); 149 m.put("jsy", y.getJsy());
  150 + m.put("name", y.getName());
149 m.put("cdl", y.getCdl()); 151 m.put("cdl", y.getCdl());
150 m.put("czcd", y.getCzcd()+"%"); 152 m.put("czcd", y.getCzcd()+"%");
151 m.put("jzcd", y.getJzcd()+"%"); 153 m.put("jzcd", y.getJzcd()+"%");
  154 + m.put("czlc", y.getCzlc());
  155 + m.put("jzlc", y.getJzlc());
152 m.put("hd", y.getHd()); 156 m.put("hd", y.getHd());
153 String shyy ="无"; 157 String shyy ="无";
154 if(y.getShyy()!=null){ 158 if(y.getShyy()!=null){
@@ -162,9 +166,11 @@ public class DlbController extends BaseController&lt;Dlb, Integer&gt;{ @@ -162,9 +166,11 @@ public class DlbController extends BaseController&lt;Dlb, Integer&gt;{
162 else if(shyy.equals("8")){shyy="车间(小修)";} 166 else if(shyy.equals("8")){shyy="车间(小修)";}
163 else{shyy ="无";} 167 else{shyy ="无";}
164 } 168 }
  169 + m.put("ns", y.getNs());
165 m.put("shyy", shyy); 170 m.put("shyy", shyy);
166 m.put("sh", y.getSh()); 171 m.put("sh", y.getSh());
167 m.put("zlc", y.getZlc()); 172 m.put("zlc", y.getZlc());
  173 + m.put("rdlx", "");
168 m.put("bglyh", y.getBglyh()); 174 m.put("bglyh", y.getBglyh());
169 resList.add(m); 175 resList.add(m);
170 } 176 }
src/main/java/com/bsth/controller/oil/YlbController.java
@@ -239,7 +239,7 @@ public class YlbController extends BaseController&lt;Ylb, Integer&gt;{ @@ -239,7 +239,7 @@ public class YlbController extends BaseController&lt;Ylb, Integer&gt;{
239 m.put("rq", y.getRq()); 239 m.put("rq", y.getRq());
240 m.put("gsname",y.getGsname() ); 240 m.put("gsname",y.getGsname() );
241 m.put("fgsname", y.getFgsname()); 241 m.put("fgsname", y.getFgsname());
242 - m.put("xlname", y.getXlname()); 242 + m.put("xlname", y.getXlname()==null?"":y.getXlname());
243 m.put("nbbm", y.getNbbm()); 243 m.put("nbbm", y.getNbbm());
244 m.put("jsy", y.getJsy()); 244 m.put("jsy", y.getJsy());
245 m.put("name", y.getName()); 245 m.put("name", y.getName());
@@ -258,6 +258,7 @@ public class YlbController extends BaseController&lt;Ylb, Integer&gt;{ @@ -258,6 +258,7 @@ public class YlbController extends BaseController&lt;Ylb, Integer&gt;{
258 m.put("ns", y.getNs()); 258 m.put("ns", y.getNs());
259 String shyy ="无"; 259 String shyy ="无";
260 if(y.getShyy()!=null){ 260 if(y.getShyy()!=null){
  261 + shyy=y.getShyy();
261 if(shyy.equals("1")){shyy="票务用油";} 262 if(shyy.equals("1")){shyy="票务用油";}
262 else if(shyy.equals("2")){shyy="保养用油";} 263 else if(shyy.equals("2")){shyy="保养用油";}
263 else if(shyy.equals("3")){shyy="报废车用油";} 264 else if(shyy.equals("3")){shyy="报废车用油";}
src/main/java/com/bsth/controller/schedule/core/SchedulePlanInfoController.java
1 -package com.bsth.controller.schedule.core;  
2 -  
3 -import com.bsth.common.ResponseCode;  
4 -import com.bsth.controller.schedule.BController;  
5 -import com.bsth.entity.schedule.SchedulePlanInfo;  
6 -import com.bsth.service.schedule.SchedulePlanInfoService;  
7 -import org.springframework.beans.factory.annotation.Autowired;  
8 -import org.springframework.web.bind.annotation.*;  
9 -  
10 -import java.util.Date;  
11 -import java.util.HashMap;  
12 -import java.util.List;  
13 -import java.util.Map;  
14 -  
15 -/**  
16 - * Created by xu on 17/5/1.  
17 - */  
18 -@RestController  
19 -@RequestMapping("spic")  
20 -public class SchedulePlanInfoController extends BController<SchedulePlanInfo, Long> {  
21 - @Autowired  
22 - private SchedulePlanInfoService schedulePlanInfoService;  
23 -  
24 - @RequestMapping(value = "/groupextinfos/{xlid}/{date}", method = RequestMethod.GET)  
25 - public Map<String, Object> findGroupInfoExt(  
26 - @PathVariable(value = "xlid") Integer xlid,  
27 - @PathVariable(value = "date") Date scheduleDate) {  
28 - Map<String, Object> resultMap = new HashMap<>();  
29 - try {  
30 - resultMap.put("status", ResponseCode.SUCCESS);  
31 - resultMap.put("data", schedulePlanInfoService.findSchedulePlanGroupInfo(xlid, scheduleDate));  
32 -  
33 - } catch (Exception exp) {  
34 - exp.printStackTrace();  
35 - resultMap.put("status", ResponseCode.ERROR);  
36 - resultMap.put("msg", exp.getLocalizedMessage());  
37 - }  
38 -  
39 - return resultMap;  
40 - }  
41 -  
42 -  
43 -// ------------------------ 老版本 ----------------------//  
44 - @RequestMapping(value = "/groupinfos/{xlid}/{date}", method = RequestMethod.GET)  
45 - public List<SchedulePlanInfoService.GroupInfo> findGroupInfo(  
46 - @PathVariable(value = "xlid") Integer xlid,  
47 - @PathVariable(value = "date") Date scheduleDate) {  
48 - return schedulePlanInfoService.findGroupInfo(xlid, scheduleDate);  
49 - }  
50 -  
51 - @RequestMapping(value = "/groupinfos/update", method = RequestMethod.POST)  
52 - public Map<String, Object> updateGroupInfo(@RequestBody SchedulePlanInfoService.GroupInfoUpdate groupInfoUpdate) {  
53 - Map<String, Object> resultMap = new HashMap<>();  
54 - try {  
55 - schedulePlanInfoService.updateGroupInfo(groupInfoUpdate);  
56 -  
57 - resultMap.put("status", ResponseCode.SUCCESS);  
58 - resultMap.put("msg", "更新成功");  
59 - } catch (Exception exp) {  
60 - exp.printStackTrace();  
61 - resultMap.put("status", ResponseCode.ERROR);  
62 - resultMap.put("msg", exp.getLocalizedMessage());  
63 - }  
64 -  
65 - return resultMap;  
66 - }  
67 -} 1 +package com.bsth.controller.schedule.core;
  2 +
  3 +import com.bsth.common.ResponseCode;
  4 +import com.bsth.controller.schedule.BController;
  5 +import com.bsth.entity.schedule.SchedulePlanInfo;
  6 +import com.bsth.service.schedule.SchedulePlanInfoService;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.web.bind.annotation.*;
  9 +
  10 +import java.util.Date;
  11 +import java.util.HashMap;
  12 +import java.util.List;
  13 +import java.util.Map;
  14 +
  15 +/**
  16 + * Created by xu on 17/5/1.
  17 + */
  18 +@RestController
  19 +@RequestMapping("spic")
  20 +public class SchedulePlanInfoController extends BController<SchedulePlanInfo, Long> {
  21 + @Autowired
  22 + private SchedulePlanInfoService schedulePlanInfoService;
  23 +
  24 + @RequestMapping(value = "/groupextinfos/{xlid}/{date}", method = RequestMethod.GET)
  25 + public Map<String, Object> findGroupInfoExt(
  26 + @PathVariable(value = "xlid") Integer xlid,
  27 + @PathVariable(value = "date") Date scheduleDate) {
  28 + Map<String, Object> resultMap = new HashMap<>();
  29 + try {
  30 + resultMap.put("status", ResponseCode.SUCCESS);
  31 + resultMap.put("data", schedulePlanInfoService.findSchedulePlanGroupInfo(xlid, scheduleDate));
  32 +
  33 + } catch (Exception exp) {
  34 + exp.printStackTrace();
  35 + resultMap.put("status", ResponseCode.ERROR);
  36 + resultMap.put("msg", exp.getLocalizedMessage());
  37 + }
  38 +
  39 + return resultMap;
  40 + }
  41 +
  42 +
  43 +// ------------------------ 老版本 ----------------------//
  44 + @RequestMapping(value = "/groupinfos/{xlid}/{date}", method = RequestMethod.GET)
  45 + public List<SchedulePlanInfoService.GroupInfo> findGroupInfo(
  46 + @PathVariable(value = "xlid") Integer xlid,
  47 + @PathVariable(value = "date") Date scheduleDate) {
  48 + return schedulePlanInfoService.findGroupInfo(xlid, scheduleDate);
  49 + }
  50 +
  51 + @RequestMapping(value = "/groupinfos/update", method = RequestMethod.POST)
  52 + public Map<String, Object> updateGroupInfo(@RequestBody SchedulePlanInfoService.GroupInfoUpdate groupInfoUpdate) {
  53 + Map<String, Object> resultMap = new HashMap<>();
  54 + try {
  55 + schedulePlanInfoService.updateGroupInfo(groupInfoUpdate);
  56 +
  57 + resultMap.put("status", ResponseCode.SUCCESS);
  58 + resultMap.put("msg", "更新成功");
  59 + } catch (Exception exp) {
  60 + exp.printStackTrace();
  61 + resultMap.put("status", ResponseCode.ERROR);
  62 + resultMap.put("msg", exp.getLocalizedMessage());
  63 + }
  64 +
  65 + return resultMap;
  66 + }
  67 +}
src/main/java/com/bsth/data/BasicData.java
@@ -39,6 +39,9 @@ public class BasicData implements CommandLineRunner { @@ -39,6 +39,9 @@ public class BasicData implements CommandLineRunner {
39 39
40 //车辆自编号和公司代码对照 (K: 车辆自编号 ,V:公司代码) 40 //车辆自编号和公司代码对照 (K: 车辆自编号 ,V:公司代码)
41 public static Map<String, String> nbbm2CompanyCodeMap; 41 public static Map<String, String> nbbm2CompanyCodeMap;
  42 +
  43 + //车辆自编号和牌照号对照 (K: 车辆自编号 ,V:牌照号)
  44 + public static Map<String, String> nbbmCompanyPlateMap;
42 45
43 //站点编码和名称对照,包括停车场 (K: lineCode_updown_stationCode ,V:站点名称) 46 //站点编码和名称对照,包括停车场 (K: lineCode_updown_stationCode ,V:站点名称)
44 public static Map<String, String> stationCode2NameMap; 47 public static Map<String, String> stationCode2NameMap;
@@ -195,16 +198,22 @@ public class BasicData implements CommandLineRunner { @@ -195,16 +198,22 @@ public class BasicData implements CommandLineRunner {
195 BiMap<String, String> deviceId2Nbbm = HashBiMap.create(); 198 BiMap<String, String> deviceId2Nbbm = HashBiMap.create();
196 //车辆和公司代码对照 199 //车辆和公司代码对照
197 Map<String, String> nbbm2CompanyCode = new HashMap<>(); 200 Map<String, String> nbbm2CompanyCode = new HashMap<>();
  201 +
  202 + //车辆自编号和拍照号对照
  203 + Map<String, String> nbbmCompanyPlate = new HashMap<>();
  204 +
198 Iterator<Cars> carIterator = carsRepository.findAll().iterator(); 205 Iterator<Cars> carIterator = carsRepository.findAll().iterator();
199 Cars car; 206 Cars car;
200 while (carIterator.hasNext()) { 207 while (carIterator.hasNext()) {
201 car = carIterator.next(); 208 car = carIterator.next();
202 deviceId2Nbbm.put(car.getEquipmentCode(), car.getInsideCode()); 209 deviceId2Nbbm.put(car.getEquipmentCode(), car.getInsideCode());
203 nbbm2CompanyCode.put(car.getInsideCode(), car.getBusinessCode()); 210 nbbm2CompanyCode.put(car.getInsideCode(), car.getBusinessCode());
  211 + nbbmCompanyPlate.put(car.getInsideCode(), car.getCarPlate());
204 } 212 }
205 213
206 deviceId2NbbmMap = deviceId2Nbbm; 214 deviceId2NbbmMap = deviceId2Nbbm;
207 nbbm2CompanyCodeMap = nbbm2CompanyCode; 215 nbbm2CompanyCodeMap = nbbm2CompanyCode;
  216 + nbbmCompanyPlateMap =nbbmCompanyPlate;
208 } 217 }
209 218
210 /** 219 /**
src/main/java/com/bsth/data/arrival/AnalyseData.java deleted 100644 → 0
1 -package com.bsth.data.arrival;  
2 -  
3 -import org.slf4j.Logger;  
4 -import org.slf4j.LoggerFactory;  
5 -import org.springframework.stereotype.Component;  
6 -  
7 -import java.util.ArrayList;  
8 -import java.util.Collections;  
9 -import java.util.List;  
10 -import java.util.Set;  
11 -  
12 -/**  
13 - *  
14 - * @ClassName: AnalyseArrivalData  
15 - * @Description: TODO(分析一下进出站场数据)  
16 - * @author PanZhao  
17 - * @date 2016年8月24日 上午11:09:37  
18 - *  
19 - */  
20 -@Component  
21 -public class AnalyseData {  
22 -  
23 - Logger logger = LoggerFactory.getLogger(AnalyseData.class);  
24 -  
25 - public void analyse(Set<String> cars){  
26 - try{  
27 - List<ArrivalEntity> list, clearList;  
28 - for(String car : cars){  
29 - list = ArrivalData_GPS.findByNbbm(car);  
30 - analyse(list);  
31 -  
32 - //清理掉无效的点  
33 - clearList = new ArrayList<>();  
34 - for(ArrivalEntity arr : list){  
35 - if(!arr.isEnable())  
36 - clearList.add(arr);  
37 - }  
38 - list.removeAll(clearList);  
39 - }  
40 - }catch(Exception e){  
41 - logger.error("", e);  
42 - }  
43 - }  
44 -  
45 - private final static int SHIFT_TIME = 1000 * 60 * 5,  
46 - SCH_TIME = 1000 * 60 * 10;  
47 -  
48 - static ArrivalComparator comp = new ArrivalComparator();  
49 -  
50 - public void analyse(List<ArrivalEntity> list){  
51 - if(list.size() <= 1)  
52 - return;  
53 -  
54 - //排序  
55 - Collections.sort(list, comp);  
56 - ArrivalEntity prve = list.get(0)  
57 - ,curr;  
58 - for(int i = 1; i < list.size(); i ++){  
59 - curr = list.get(i);  
60 - //如果第一个点无效  
61 - if(!effective(prve)){  
62 - prve.setEnable(false);  
63 - prve = curr;  
64 - continue;  
65 - }  
66 - //如果第二个点无效  
67 - else if(!effective(curr)){  
68 - curr.setEnable(false);  
69 - continue;  
70 - }  
71 - else if(curr.getTs() - prve.getTs() < SCH_TIME){  
72 - if(prve.getUpDown() == curr.getUpDown()){  
73 - //信号漂移,出站无效  
74 - if(curr.getStopNo().equals(prve.getStopNo())  
75 - && prve.getInOut() == 1 && curr.getInOut() == 0  
76 - && curr.getTs() - prve.getTs() < SHIFT_TIME){  
77 - prve.setEnable(false);  
78 - }  
79 -// else if(curr.getInOut()){  
80 -// //curr.getTs() - prve.getTs() < 30000  
81 -// }  
82 - }  
83 - else{  
84 - //上下行的同名站,新走向的第一个出站信号开始有效  
85 - if(prve.getStopName().equals(curr.getStopName())){  
86 - if(curr.getInOut() == 0)  
87 - curr.setEnable(false);  
88 - else  
89 - prve = curr;  
90 - }  
91 - }  
92 - }  
93 - else  
94 - prve = curr;  
95 - }  
96 - }  
97 -  
98 - private boolean effective(ArrivalEntity arr){  
99 - /*//停车场  
100 - if(BasicData.parkCodeList.contains(arr.getStopNo())){  
101 - arr.setTcc(true);  
102 - return true;  
103 - }  
104 -  
105 - Integer upDown = BasicData.lineStationUpDownMap.get(arr.getLineCode() + "_" + arr.getStopNo());  
106 -  
107 - return arr.getUpDown() == upDown || BasicData.parkCodeList.contains(arr.getStopNo());*/  
108 - return false;  
109 - }  
110 -}  
src/main/java/com/bsth/data/arrival/ArrivalData_GPS.java deleted 100644 → 0
1 -package com.bsth.data.arrival;  
2 -  
3 -import com.bsth.data.schedule.DayOfSchedule;  
4 -import com.google.common.collect.ArrayListMultimap;  
5 -import com.google.common.collect.ListMultimap;  
6 -import org.slf4j.Logger;  
7 -import org.slf4j.LoggerFactory;  
8 -import org.springframework.beans.factory.annotation.Autowired;  
9 -import org.springframework.boot.CommandLineRunner;  
10 -import org.springframework.stereotype.Component;  
11 -  
12 -import java.util.*;  
13 -  
14 -/**  
15 - *  
16 - * @ClassName: ArrivalData_GPS  
17 - * @Description: TODO(GPS到离站数据)  
18 - * @author PanZhao  
19 - * @date 2016年8月18日 下午10:05:27  
20 - *  
21 - */  
22 -@Component  
23 -public class ArrivalData_GPS implements CommandLineRunner{  
24 -  
25 - // 起终点站进出数据 K:车辆编码  
26 - private static ListMultimap<String, ArrivalEntity> startAndEndMaps;  
27 -  
28 - private static Map<String, Integer> carIndexMap;  
29 -  
30 - static{  
31 - startAndEndMaps = ArrayListMultimap.create();  
32 -  
33 - carIndexMap = new HashMap<>();  
34 - }  
35 -  
36 - @Autowired  
37 - DataLoaderThread dataLoaderThread;  
38 -  
39 - static Logger logger = LoggerFactory.getLogger(ArrivalData_GPS.class);  
40 -  
41 - @Override  
42 - public void run(String... arg0) throws Exception {  
43 - logger.info("ArrivalData_GPS,30,06");  
44 - //Application.mainServices.scheduleWithFixedDelay(dataLoaderThread, 40, 6, TimeUnit.SECONDS);  
45 - }  
46 -  
47 - @Component  
48 - public static class DataLoaderThread extends Thread {  
49 -  
50 - @Autowired  
51 - DataLoader dataLoader;  
52 -  
53 - @Autowired  
54 - DayOfSchedule dayOfSchedule;  
55 -  
56 - @Autowired  
57 - AnalyseData analyseData;  
58 -  
59 - @Override  
60 - public void run() {  
61 - /*try{  
62 - logger.info("开始加载到离站数据, " + System.currentTimeMillis());  
63 - List<ArrivalEntity> arrSets = dataLoader.load();  
64 - if(null == arrSets || arrSets.size() == 0)  
65 - return;  
66 -  
67 - //有起终点进出的车辆  
68 - Set<String> carSet = new TreeSet<>();  
69 - //按车辆起终点站过滤数据  
70 - String nbbm;  
71 - Set<String> seList;  
72 - for(ArrivalEntity arr : arrSets){  
73 - nbbm = arr.getNbbm();  
74 -  
75 - seList = dayOfSchedule.getSEStationList(nbbm);  
76 - if(seList.contains(arr.getStopNo())){  
77 - startAndEndMaps.put(nbbm, arr);  
78 - carSet.add(nbbm);  
79 - }  
80 - }  
81 - //从专业的角度分析一下数据  
82 - analyseData.analyse(carSet);  
83 -  
84 - //开始匹配  
85 - Arrival2Schedule.start(carSet);  
86 - }catch(Exception e){  
87 - logger.error("", e);  
88 - }*/  
89 - }  
90 - }  
91 -  
92 - /**  
93 - *  
94 - * @Title: clearRAMData  
95 - * @Description: TODO(清理内存数据)  
96 - */  
97 - public void clearRAMData(String lineCode){  
98 -  
99 - List<ArrivalEntity> remList = new ArrayList<>();  
100 -  
101 - //车辆映射的进出站数据,遍历删除对应线路数据。  
102 - Collection<ArrivalEntity> seList = startAndEndMaps.values();  
103 - for(ArrivalEntity arr : seList){  
104 - if(arr.getLineCode().equals(lineCode))  
105 - remList.add(arr);  
106 - }  
107 -  
108 - //删除数据  
109 - int count = 0;  
110 - for(ArrivalEntity arr : remList){  
111 - startAndEndMaps.remove(arr.getNbbm(), arr);  
112 - count ++;  
113 - }  
114 -  
115 - logger.info(lineCode + " 清除到离站数据 ," + count);  
116 - }  
117 -  
118 - public synchronized static List<ArrivalEntity> findByNbbm(String nbbm){  
119 - return startAndEndMaps.get(nbbm);  
120 - }  
121 -  
122 - public static List<ArrivalEntity> getIncrement(String nbbm){  
123 - Integer mark = null;  
124 - if (!carIndexMap.containsKey(nbbm))  
125 - mark = 0;  
126 - else  
127 - mark = carIndexMap.get(nbbm);  
128 -  
129 - List<ArrivalEntity> all = startAndEndMaps.get(nbbm);  
130 - int size = all.size();  
131 - if(size == 0)  
132 - return new ArrayList<>(0);  
133 -  
134 - List<ArrivalEntity> rs = all.subList(mark, size);  
135 - carIndexMap.put(nbbm, size);  
136 - return rs;  
137 - }  
138 -}  
139 \ No newline at end of file 0 \ No newline at end of file
src/main/java/com/bsth/data/car_out_info/CarOutInfo.java 0 → 100644
  1 +package com.bsth.data.car_out_info;
  2 +
  3 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  4 +
  5 +import java.util.List;
  6 +
  7 +/**
  8 + * Created by panzhao on 2017/5/7.
  9 + */
  10 +public interface CarOutInfo {
  11 +
  12 + void updateAll();
  13 +
  14 + void update(String lineCode);
  15 +
  16 + void update(List<ScheduleRealInfo> list) ;
  17 +}
src/main/java/com/bsth/data/car_out_info/CarOutInfoHandler.java 0 → 100644
  1 +package com.bsth.data.car_out_info;
  2 +
  3 +import com.bsth.data.BasicData;
  4 +import com.bsth.data.schedule.DayOfSchedule;
  5 +import com.bsth.data.schedule.ScheduleComparator;
  6 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  7 +import com.google.common.collect.ArrayListMultimap;
  8 +import org.apache.commons.lang3.StringUtils;
  9 +import org.slf4j.Logger;
  10 +import org.slf4j.LoggerFactory;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.boot.CommandLineRunner;
  13 +import org.springframework.jdbc.core.BatchPreparedStatementSetter;
  14 +import org.springframework.jdbc.core.JdbcTemplate;
  15 +import org.springframework.stereotype.Component;
  16 +import org.springframework.stereotype.Service;
  17 +import org.springframework.transaction.annotation.Transactional;
  18 +
  19 +import java.sql.PreparedStatement;
  20 +import java.sql.SQLException;
  21 +import java.util.*;
  22 +
  23 +/**
  24 + * 发车信息表处理程序
  25 + * Created by panzhao on 2017/5/5.
  26 + */
  27 +@Service
  28 +public class CarOutInfoHandler implements CommandLineRunner, CarOutInfo {
  29 +
  30 + @Autowired
  31 + DayOfSchedule dayOfSchedule;
  32 +
  33 + //班次类型对照表
  34 + Map<String, String> bcTypeMap;
  35 +
  36 + private static ScheduleComparator.FCSJ schFCSJComparator = new ScheduleComparator.FCSJ();
  37 +
  38 + @Autowired
  39 + JdbcTemplate jdbcTemplate;
  40 +
  41 + Logger logger = LoggerFactory.getLogger(this.getClass());
  42 +
  43 + /**
  44 + * 全量更新发车信息表
  45 + */
  46 + @Override
  47 + public void updateAll() {
  48 + Set<String> ks = BasicData.lineCode2NameMap.keySet();
  49 + for (String lineCode : ks) {
  50 + update(lineCode);
  51 + }
  52 + }
  53 +
  54 + @Override
  55 + public void update(String lineCode) {
  56 + try {
  57 + ArrayListMultimap<String, ScheduleRealInfo> lpScheduleMap = dayOfSchedule.getLpScheduleMap();
  58 + List<ScheduleRealInfo> list = new ArrayList<>();
  59 +
  60 + Set<String> ks = lpScheduleMap.keySet();
  61 + String prefix = lineCode + "_";
  62 + for (String k : ks) {
  63 + if (k.indexOf(prefix) != -1) {
  64 + list.addAll(lpScheduleMap.get(k));
  65 + }
  66 + }
  67 +
  68 + update(list);
  69 + } catch (Exception e) {
  70 + logger.error("", e);
  71 + }
  72 + }
  73 +
  74 + @Transactional
  75 + @Override
  76 + public void update(List<ScheduleRealInfo> list) {
  77 + if (list.size() == 0)
  78 + return;
  79 + String lineCode = list.get(0).getXlBm();
  80 + //按上下行分组
  81 + List<ScheduleRealInfo> ups = new ArrayList<>(), downs = new ArrayList<>();
  82 + for (ScheduleRealInfo sch : list) {
  83 + if (sch.getXlDir().equals("0"))
  84 + ups.add(sch);
  85 + else
  86 + downs.add(sch);
  87 + }
  88 +
  89 + ScheduleRealInfo[] upArray = nexts(ups),
  90 + downArray = nexts(downs);
  91 +
  92 + final List<ScheduleRealInfo> pstArray = mergeArray(upArray, downArray);
  93 + //删除
  94 + jdbcTemplate.update("delete from bsth_t_clfcxxb where line_code=?", lineCode);
  95 + //重新写入
  96 + jdbcTemplate.batchUpdate("insert into bsth_t_clfcxxb(rq, line_code, line_name, lp_name, lp_sn, dfsj, nbbm, cph, bc_type, end_station_name, updown, jGh, jName, remarks, sn)" +
  97 + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", new BatchPreparedStatementSetter() {
  98 + @Override
  99 + public void setValues(PreparedStatement ps, int i) throws SQLException {
  100 + ScheduleRealInfo sch = pstArray.get(i);
  101 + ps.setString(1, sch.getScheduleDateStr());
  102 + ps.setString(2, sch.getXlBm());
  103 + ps.setString(3, sch.getXlName());
  104 + ps.setString(4, sch.getLpName());
  105 + ps.setInt(5, sch.getFcno());
  106 + ps.setString(6, sch.getDfsj());
  107 + ps.setString(7, sch.getClZbh());
  108 + ps.setString(8, BasicData.nbbmCompanyPlateMap.get(sch.getClZbh()));
  109 + ps.setString(9, bcTypeMap.containsKey(sch.getBcType()) ? bcTypeMap.get(sch.getBcType()) : sch.getBcType());
  110 + ps.setString(10, sch.getZdzName());
  111 + ps.setInt(11, Integer.parseInt(sch.getXlDir()));
  112 + ps.setString(12, sch.getjGh());
  113 + ps.setString(13, sch.getjName());
  114 + ps.setString(14, sch.getRemarks());
  115 + ps.setInt(15, sch.getFcpSn());
  116 + }
  117 +
  118 + @Override
  119 + public int getBatchSize() {
  120 + return pstArray.size();
  121 + }
  122 + });
  123 + }
  124 +
  125 + private List<ScheduleRealInfo> mergeArray(ScheduleRealInfo[] upArray, ScheduleRealInfo[] downArray) {
  126 + List<ScheduleRealInfo> list = new ArrayList<>();
  127 + for (int i = 0; i < upArray.length; i++) {
  128 + if (upArray[i] != null) {
  129 + upArray[i].setFcpSn(i + 1);
  130 + list.add(upArray[i]);
  131 + }
  132 + }
  133 + for (int i = 0; i < downArray.length; i++) {
  134 + if (downArray[i] != null) {
  135 + downArray[i].setFcpSn(i + 1);
  136 + list.add(downArray[i]);
  137 + }
  138 + }
  139 + return list;
  140 + }
  141 +
  142 + /**
  143 + * 接下来要执行的3个班次
  144 + *
  145 + * @param list
  146 + * @return
  147 + */
  148 + private ScheduleRealInfo[] nexts(List<ScheduleRealInfo> list) {
  149 + ScheduleRealInfo[] array = new ScheduleRealInfo[3];
  150 + Collections.sort(list, schFCSJComparator);
  151 +
  152 + int count = 0, threshold = 1000 * 60 * 30;
  153 + long t = System.currentTimeMillis();
  154 + for (ScheduleRealInfo sch : list) {
  155 + if (count == 3)
  156 + break;
  157 +
  158 + //烂班
  159 + if (sch.isDestroy())
  160 + continue;
  161 +
  162 + //进场、出场、2点间空驶
  163 + if (sch.getBcType().equals("in")
  164 + || sch.getBcType().equals("out")
  165 + || sch.getBcType().equals("ldks"))
  166 + continue;
  167 +
  168 + //有实发实达时间的
  169 + if (StringUtils.isNotEmpty(sch.getFcsjActual())
  170 + || StringUtils.isNotEmpty(sch.getZdsjActual()))
  171 + continue;
  172 +
  173 + if (t - sch.getDfsjT() > threshold)
  174 + continue;
  175 +
  176 + array[count] = sch;
  177 + count++;
  178 + }
  179 + return array;
  180 + }
  181 +
  182 + @Autowired
  183 + UpdateInfoThread updateInfoThread;
  184 +
  185 + @Override
  186 + public void run(String... strings) throws Exception {
  187 + bcTypeMap = new HashMap<>();
  188 + bcTypeMap.put("normal", "正常班次");
  189 + bcTypeMap.put("region", "区间");
  190 + bcTypeMap.put("venting", "直放");
  191 + bcTypeMap.put("major", "放站");
  192 + bcTypeMap.put("ldks", "两点间空驶");
  193 + //Application.mainServices.scheduleWithFixedDelay(updateInfoThread, 60, 40, TimeUnit.SECONDS);
  194 + }
  195 +
  196 + @Component
  197 + private static class UpdateInfoThread extends Thread {
  198 +
  199 + @Autowired
  200 + CarOutInfo carOutInfoHandler;
  201 +
  202 + @Override
  203 + public void run() {
  204 + carOutInfoHandler.updateAll();
  205 + }
  206 + }
  207 +}
src/main/java/com/bsth/data/arrival/ArrivalComparator.java renamed to src/main/java/com/bsth/data/forecast/ArrivalComparator.java
1 -package com.bsth.data.arrival;  
2 -  
3 -import java.util.Comparator;  
4 -  
5 -public class ArrivalComparator implements Comparator<ArrivalEntity>{  
6 -  
7 - @Override  
8 - public int compare(ArrivalEntity a1, ArrivalEntity a2) {  
9 - return (int) (a1.getTs() - a2.getTs());  
10 - }  
11 -} 1 +package com.bsth.data.forecast;
  2 +
  3 +import com.bsth.data.forecast.entity.ArrivalEntity;
  4 +
  5 +import java.util.Comparator;
  6 +
  7 +public class ArrivalComparator implements Comparator<ArrivalEntity>{
  8 +
  9 + @Override
  10 + public int compare(ArrivalEntity a1, ArrivalEntity a2) {
  11 + return (int) (a1.getTs() - a2.getTs());
  12 + }
  13 +}
src/main/java/com/bsth/data/arrival/DataLoader.java renamed to src/main/java/com/bsth/data/forecast/ArrivalDataLoader.java
1 -package com.bsth.data.arrival;  
2 -  
3 -import java.sql.Connection;  
4 -import java.sql.PreparedStatement;  
5 -import java.sql.ResultSet;  
6 -import java.sql.SQLException;  
7 -import java.util.ArrayList;  
8 -import java.util.Calendar;  
9 -import java.util.Collection;  
10 -import java.util.List;  
11 -  
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 com.bsth.data.BasicData;  
18 -import com.bsth.data.LineConfigData;  
19 -import com.bsth.entity.realcontrol.LineConfig;  
20 -import com.bsth.util.db.DBUtils_MS;  
21 -  
22 -/**  
23 - *  
24 - * @ClassName: DataLoader  
25 - * @Description: TODO(从数据库加载进出站数据)  
26 - * @author PanZhao  
27 - * @date 2016年8月19日 上午9:59:21  
28 - *  
29 - */  
30 -@Component  
31 -public class DataLoader {  
32 -  
33 - private static Long prveLoadTime;  
34 -  
35 - private final static long DAY_TIME = 1000 * 60 * 60 * 24;  
36 -  
37 - private Logger logger = LoggerFactory.getLogger(this.getClass());  
38 -  
39 - @Autowired  
40 - LineConfigData lineConfigData;  
41 -  
42 - /**  
43 - *  
44 - * @Title: load  
45 - * @Description: TODO(根据上次加载时间,查询之后的增量数据)  
46 - */  
47 - public List<ArrivalEntity> load(){  
48 - List<ArrivalEntity> list = null;  
49 -  
50 - if(null == prveLoadTime)  
51 - list = recovery();  
52 - else{  
53 - Calendar cal = Calendar.getInstance();  
54 - //周数,表分区字段  
55 - int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);  
56 -  
57 - Connection conn = null;  
58 - PreparedStatement ps = null;  
59 - ResultSet rs = null;  
60 -  
61 - String sql = "select * from bsth_c_arrival_info where weeks_year=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by create_date";  
62 - try{  
63 - long t = System.currentTimeMillis();  
64 -  
65 - conn = DBUtils_MS.getConnection();  
66 - ps = conn.prepareStatement(sql);  
67 - ps.setInt(1, weeks_year);  
68 - ps.setLong(2, prveLoadTime);  
69 - ps.setLong(3, t);  
70 - rs = ps.executeQuery();  
71 -  
72 - list = resultSet2Set(rs);  
73 -  
74 - prveLoadTime = t;  
75 - }catch(Exception e){  
76 - logger.error("", e);  
77 - }finally {  
78 - DBUtils_MS.close(rs, ps, conn);  
79 - }  
80 - }  
81 - return list;  
82 - }  
83 -  
84 - /**  
85 - *  
86 - * @Title: recovery  
87 - * @Description: TODO(从数据库恢复数据,按照线路的开始运营时间恢复)  
88 - */  
89 - public List<ArrivalEntity> recovery(){  
90 - Collection<LineConfig> confs = lineConfigData.getAll();  
91 - long t = System.currentTimeMillis()  
92 - ,st;  
93 -  
94 - List<ArrivalEntity> all = new ArrayList<>();  
95 - for(LineConfig conf : confs){  
96 - st = conf.getCurrStartTime();  
97 - if(t < st)  
98 - st = st - DAY_TIME;  
99 - try{  
100 - all.addAll(loadByLineAndTime(conf.getLine().getLineCode(), st, t));  
101 - }catch(Exception e){  
102 - logger.error("", e);  
103 - }  
104 - }  
105 -  
106 - prveLoadTime = t;  
107 - return all;  
108 - }  
109 -  
110 - /**  
111 - *  
112 - * @Title: loadByLineAndStartTime  
113 - * @Description: TODO(根据线路和时间戳加载数据)  
114 - */  
115 - public List<ArrivalEntity> loadByLineAndTime(String lineCode, long st, long et){  
116 - Calendar cal = Calendar.getInstance();  
117 - cal.setTimeInMillis(st);  
118 - int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);  
119 -  
120 - Connection conn = null;  
121 - PreparedStatement ps = null;  
122 - ResultSet rs = null;  
123 -  
124 - List<ArrivalEntity> list = new ArrayList<>();  
125 - String sql = "select * from bsth_c_arrival_info where weeks_year=? and line_id=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by ts";  
126 - try{  
127 - conn = DBUtils_MS.getConnection();  
128 - ps = conn.prepareStatement(sql);  
129 - ps.setInt(1, weeks_year);  
130 - ps.setString(2, lineCode);  
131 - ps.setLong(3, st);  
132 - ps.setLong(4, et);  
133 - rs = ps.executeQuery();  
134 -  
135 - list = resultSet2Set(rs);  
136 - }catch(Exception e){  
137 - logger.error("", e);  
138 - }finally {  
139 - DBUtils_MS.close(rs, ps, conn);  
140 - }  
141 - return list;  
142 - }  
143 -  
144 - /**  
145 - *  
146 - * @Title: loadByLineAndStartTime  
147 - * @Description: TODO(根据线路,走向和时间戳加载数据)  
148 - */  
149 - public List<ArrivalEntity> loadByLineAndTime(String lineCode, int updown, long st, long et){  
150 - Calendar cal = Calendar.getInstance();  
151 - cal.setTimeInMillis(st);  
152 - int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);  
153 -  
154 - Connection conn = null;  
155 - PreparedStatement ps = null;  
156 - ResultSet rs = null;  
157 -  
158 - List<ArrivalEntity> list = new ArrayList<>();  
159 - String sql = "select * from bsth_c_arrival_info where weeks_year=? and line_id=? and up_down=? and in_out=0 AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by ts";  
160 - try{  
161 - conn = DBUtils_MS.getConnection();  
162 - ps = conn.prepareStatement(sql);  
163 - ps.setInt(1, weeks_year);  
164 - ps.setString(2, lineCode);  
165 - ps.setInt(3, updown);  
166 - ps.setLong(4, st);  
167 - ps.setLong(5, et);  
168 - rs = ps.executeQuery();  
169 -  
170 - list = resultSet2Set(rs);  
171 - }catch(Exception e){  
172 - logger.error("", e);  
173 - }finally {  
174 - DBUtils_MS.close(rs, ps, conn);  
175 - }  
176 - return list;  
177 - }  
178 -  
179 - public List<ArrivalEntity> resultSet2Set(ResultSet rs) throws SQLException{  
180 - List<ArrivalEntity> list = new ArrayList<>();  
181 -  
182 - ArrivalEntity arr;  
183 - while(rs.next()){  
184 - arr = new ArrivalEntity();  
185 - arr.setDeviceId(rs.getString("device_id"));  
186 - arr.setNbbm(BasicData.deviceId2NbbmMap.get(arr.getDeviceId()));  
187 - if(null == arr.getNbbm()){  
188 - logger.warn("未注册的设备号," + arr.getDeviceId());  
189 - continue;  
190 - }  
191 -  
192 - arr.setTs(rs.getLong("ts"));  
193 - arr.setLineCode(rs.getString("line_id"));  
194 - arr.setUpDown(rs.getInt("up_down"));  
195 - arr.setStopNo(rs.getString("stop_no"));  
196 - arr.setStopName(BasicData.stationCode2NameMap.get(arr.getStopNo()));  
197 - arr.setInOut(rs.getInt("in_out"));  
198 - arr.setCreateDate(rs.getLong("create_timestamp"));  
199 - arr.setWeeksYear(rs.getInt("weeks_year"));  
200 - arr.setEnable(true);  
201 -  
202 - list.add(arr);  
203 - }  
204 - return list;  
205 - }  
206 -  
207 - public static void setPrveLoadTime(long t){  
208 - prveLoadTime = t;  
209 - }  
210 -} 1 +package com.bsth.data.forecast;
  2 +
  3 +import com.bsth.data.BasicData;
  4 +import com.bsth.data.LineConfigData;
  5 +import com.bsth.data.forecast.entity.ArrivalEntity;
  6 +import com.bsth.entity.realcontrol.LineConfig;
  7 +import com.bsth.util.db.DBUtils_MS;
  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 +
  13 +import java.sql.Connection;
  14 +import java.sql.PreparedStatement;
  15 +import java.sql.ResultSet;
  16 +import java.sql.SQLException;
  17 +import java.util.ArrayList;
  18 +import java.util.Calendar;
  19 +import java.util.Collection;
  20 +import java.util.List;
  21 +
  22 +/**
  23 + *
  24 + * @ClassName: DataLoader
  25 + * @Description: TODO(从数据库加载进出站数据)
  26 + * @author PanZhao
  27 + * @date 2016年8月19日 上午9:59:21
  28 + *
  29 + */
  30 +@Component
  31 +public class ArrivalDataLoader {
  32 +
  33 + private static Long prveLoadTime;
  34 +
  35 + private final static long DAY_TIME = 1000 * 60 * 60 * 24;
  36 +
  37 + private Logger logger = LoggerFactory.getLogger(this.getClass());
  38 +
  39 + @Autowired
  40 + LineConfigData lineConfigData;
  41 +
  42 + /**
  43 + *
  44 + * @Title: load
  45 + * @Description: TODO(根据上次加载时间,查询之后的增量数据)
  46 + */
  47 + public List<ArrivalEntity> load(){
  48 + List<ArrivalEntity> list = null;
  49 +
  50 + if(null == prveLoadTime)
  51 + list = recovery();
  52 + else{
  53 + Calendar cal = Calendar.getInstance();
  54 + //周数,表分区字段
  55 + int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
  56 +
  57 + Connection conn = null;
  58 + PreparedStatement ps = null;
  59 + ResultSet rs = null;
  60 +
  61 + String sql = "select * from bsth_c_arrival_info where weeks_year=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by create_date";
  62 + try{
  63 + long t = System.currentTimeMillis();
  64 +
  65 + conn = DBUtils_MS.getConnection();
  66 + ps = conn.prepareStatement(sql);
  67 + ps.setInt(1, weeks_year);
  68 + ps.setLong(2, prveLoadTime);
  69 + ps.setLong(3, t);
  70 + rs = ps.executeQuery();
  71 +
  72 + list = resultSet2Set(rs);
  73 +
  74 + prveLoadTime = t;
  75 + }catch(Exception e){
  76 + logger.error("", e);
  77 + }finally {
  78 + DBUtils_MS.close(rs, ps, conn);
  79 + }
  80 + }
  81 + return list;
  82 + }
  83 +
  84 + /**
  85 + *
  86 + * @Title: recovery
  87 + * @Description: TODO(从数据库恢复数据,按照线路的开始运营时间恢复)
  88 + */
  89 + public List<ArrivalEntity> recovery(){
  90 + Collection<LineConfig> confs = lineConfigData.getAll();
  91 + long t = System.currentTimeMillis()
  92 + ,st;
  93 +
  94 + List<ArrivalEntity> all = new ArrayList<>();
  95 + for(LineConfig conf : confs){
  96 + st = conf.getCurrStartTime();
  97 + if(t < st)
  98 + st = st - DAY_TIME;
  99 + try{
  100 + all.addAll(loadByLineAndTime(conf.getLine().getLineCode(), st, t));
  101 + }catch(Exception e){
  102 + logger.error("", e);
  103 + }
  104 + }
  105 +
  106 + prveLoadTime = t;
  107 + return all;
  108 + }
  109 +
  110 + /**
  111 + *
  112 + * @Title: loadByLineAndStartTime
  113 + * @Description: TODO(根据线路和时间戳加载数据)
  114 + */
  115 + public List<ArrivalEntity> loadByLineAndTime(String lineCode, long st, long et){
  116 + Calendar cal = Calendar.getInstance();
  117 + cal.setTimeInMillis(st);
  118 + int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
  119 +
  120 + Connection conn = null;
  121 + PreparedStatement ps = null;
  122 + ResultSet rs = null;
  123 +
  124 + List<ArrivalEntity> list = new ArrayList<>();
  125 + String sql = "select * from bsth_c_arrival_info where weeks_year=? and line_id=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by ts";
  126 + try{
  127 + conn = DBUtils_MS.getConnection();
  128 + ps = conn.prepareStatement(sql);
  129 + ps.setInt(1, weeks_year);
  130 + ps.setString(2, lineCode);
  131 + ps.setLong(3, st);
  132 + ps.setLong(4, et);
  133 + rs = ps.executeQuery();
  134 +
  135 + list = resultSet2Set(rs);
  136 + }catch(Exception e){
  137 + logger.error("", e);
  138 + }finally {
  139 + DBUtils_MS.close(rs, ps, conn);
  140 + }
  141 + return list;
  142 + }
  143 +
  144 + /**
  145 + *
  146 + * @Title: loadByLineAndStartTime
  147 + * @Description: TODO(根据线路,走向和时间戳加载数据)
  148 + */
  149 + public List<ArrivalEntity> loadByLineAndTime(String lineCode, int updown, long st, long et){
  150 + Calendar cal = Calendar.getInstance();
  151 + cal.setTimeInMillis(st);
  152 + int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
  153 +
  154 + Connection conn = null;
  155 + PreparedStatement ps = null;
  156 + ResultSet rs = null;
  157 +
  158 + List<ArrivalEntity> list = new ArrayList<>();
  159 + String sql = "select * from bsth_c_arrival_info where weeks_year=? and line_id=? and up_down=? and in_out=0 AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by ts";
  160 + try{
  161 + conn = DBUtils_MS.getConnection();
  162 + ps = conn.prepareStatement(sql);
  163 + ps.setInt(1, weeks_year);
  164 + ps.setString(2, lineCode);
  165 + ps.setInt(3, updown);
  166 + ps.setLong(4, st);
  167 + ps.setLong(5, et);
  168 + rs = ps.executeQuery();
  169 +
  170 + list = resultSet2Set(rs);
  171 + }catch(Exception e){
  172 + logger.error("", e);
  173 + }finally {
  174 + DBUtils_MS.close(rs, ps, conn);
  175 + }
  176 + return list;
  177 + }
  178 +
  179 + public List<ArrivalEntity> resultSet2Set(ResultSet rs) throws SQLException{
  180 + List<ArrivalEntity> list = new ArrayList<>();
  181 +
  182 + ArrivalEntity arr;
  183 + while(rs.next()){
  184 + arr = new ArrivalEntity();
  185 + arr.setDeviceId(rs.getString("device_id"));
  186 + arr.setNbbm(BasicData.deviceId2NbbmMap.get(arr.getDeviceId()));
  187 + if(null == arr.getNbbm()){
  188 + logger.warn("未注册的设备号," + arr.getDeviceId());
  189 + continue;
  190 + }
  191 +
  192 + arr.setTs(rs.getLong("ts"));
  193 + arr.setLineCode(rs.getString("line_id"));
  194 + arr.setUpDown(rs.getInt("up_down"));
  195 + arr.setStopNo(rs.getString("stop_no"));
  196 + arr.setStopName(BasicData.stationCode2NameMap.get(arr.getStopNo()));
  197 + arr.setInOut(rs.getInt("in_out"));
  198 + arr.setCreateDate(rs.getLong("create_timestamp"));
  199 + arr.setWeeksYear(rs.getInt("weeks_year"));
  200 + arr.setEnable(true);
  201 +
  202 + list.add(arr);
  203 + }
  204 + return list;
  205 + }
  206 +
  207 + public static void setPrveLoadTime(long t){
  208 + prveLoadTime = t;
  209 + }
  210 +}
src/main/java/com/bsth/data/arrival/ArrivalEntity.java renamed to src/main/java/com/bsth/data/forecast/entity/ArrivalEntity.java
1 -package com.bsth.data.arrival;  
2 -  
3 -import java.text.SimpleDateFormat;  
4 -import java.util.Date;  
5 -  
6 -import com.bsth.data.BasicData;  
7 -  
8 -/**  
9 - *  
10 - * @ClassName: ArrivalEntity  
11 - * @Description: TODO(进出站实体)  
12 - * @author PanZhao  
13 - * @date 2016年8月19日 上午9:32:20  
14 - *  
15 - */  
16 -public class ArrivalEntity {  
17 -  
18 - /** 设备号*/  
19 - private String deviceId;  
20 -  
21 - private String nbbm;  
22 -  
23 - /** 站点名称 */  
24 - private String stopName;  
25 -  
26 - /** 时间戳*/  
27 - private Long ts;  
28 -  
29 - /** 线路编码*/  
30 - private String lineCode;  
31 -  
32 - /** 上下行*/  
33 - private Integer upDown;  
34 -  
35 - /**站点编码*/  
36 - private String stopNo;  
37 -  
38 - /** 0: 进 1:出*/  
39 - private Integer inOut;  
40 -  
41 - private Long createDate;  
42 -  
43 - /** 是否有效 */  
44 - private boolean enable;  
45 -  
46 - /**分区字段,当年的第几周*/  
47 - private Integer weeksYear;  
48 -  
49 - private boolean tcc;  
50 -  
51 - //是否被纠正  
52 - private boolean correct;  
53 -  
54 - private String correctText;  
55 -  
56 - /** -1 则信号有效,但程序标记为不使用 */  
57 - private int flag = 0;  
58 -  
59 - public ArrivalEntity(){}  
60 -  
61 - public ArrivalEntity(String deviceId, long ts, String lineCode, int upDown, String stopNo, int inOut, long createDate,  
62 - int weeksYear, String stopName) {  
63 -  
64 - this.deviceId = deviceId;  
65 - this.ts = ts;  
66 - this.lineCode = lineCode;  
67 - this.upDown = upDown;  
68 - this.stopNo = stopNo;  
69 - this.stopName = stopName;  
70 - this.inOut = inOut;  
71 - this.createDate = createDate;  
72 - }  
73 -  
74 -/* @Override  
75 - public boolean equals(Object obj) {  
76 - ArrivalEntity a2 = (ArrivalEntity)obj;  
77 -  
78 - return this.toString().equals(a2.toString())  
79 - && Math.abs(this.ts - a2.ts) < EQ_RANGE;  
80 - }  
81 -  
82 - @Override  
83 - public int hashCode() {  
84 - return this.toString().hashCode();  
85 - }*/  
86 -  
87 -  
88 - @Override  
89 - public String toString() {  
90 - try {  
91 - SimpleDateFormat sdfHHmm = new SimpleDateFormat("HH:mm");  
92 - return "["+BasicData.deviceId2NbbmMap.get(this.deviceId)+", "+sdfHHmm.format(new Date(this.ts))  
93 - +","+(this.getUpDown()==0?"上行":"下行")+","+(this.inOut==0?"进":"出")+","+this.stopNo+" ("+this.stopName+")]";  
94 - } catch (Exception e) {  
95 - return "";  
96 - }  
97 - }  
98 -  
99 - public String getLineCode() {  
100 - return lineCode;  
101 - }  
102 -  
103 - public void setLineCode(String lineCode) {  
104 - this.lineCode = lineCode;  
105 - }  
106 -  
107 - public Integer getUpDown() {  
108 - return upDown;  
109 - }  
110 -  
111 - public void setUpDown(Integer upDown) {  
112 - this.upDown = upDown;  
113 - }  
114 -  
115 - public String getStopNo() {  
116 - return stopNo;  
117 - }  
118 -  
119 - public void setStopNo(String stopNo) {  
120 - this.stopNo = stopNo;  
121 - }  
122 -  
123 - public Integer getInOut() {  
124 - return inOut;  
125 - }  
126 -  
127 - public void setInOut(Integer inOut) {  
128 - this.inOut = inOut;  
129 - }  
130 -  
131 - public Long getCreateDate() {  
132 - return createDate;  
133 - }  
134 -  
135 - public void setCreateDate(Long createDate) {  
136 - this.createDate = createDate;  
137 - }  
138 -  
139 - public Integer getWeeksYear() {  
140 - return weeksYear;  
141 - }  
142 -  
143 - public void setWeeksYear(Integer weeksYear) {  
144 - this.weeksYear = weeksYear;  
145 - }  
146 -  
147 - public String getDeviceId() {  
148 - return deviceId;  
149 - }  
150 -  
151 - public void setDeviceId(String deviceId) {  
152 - this.deviceId = deviceId;  
153 - }  
154 -  
155 - public Long getTs() {  
156 - return ts;  
157 - }  
158 -  
159 - public void setTs(Long ts) {  
160 - this.ts = ts;  
161 - }  
162 -  
163 - public String getStopName() {  
164 - return stopName;  
165 - }  
166 -  
167 - public void setStopName(String stopName) {  
168 - this.stopName = stopName;  
169 - }  
170 -  
171 - public String getId(){  
172 - return this.deviceId + "_" + this.ts;  
173 - }  
174 -  
175 - public String getNbbm() {  
176 - return nbbm;  
177 - }  
178 -  
179 - public void setNbbm(String nbbm) {  
180 - this.nbbm = nbbm;  
181 - }  
182 -  
183 - public boolean isEnable() {  
184 - return enable;  
185 - }  
186 -  
187 - public void setEnable(boolean enable) {  
188 - this.enable = enable;  
189 - }  
190 -  
191 - public boolean isTcc() {  
192 - return tcc;  
193 - }  
194 -  
195 - public void setTcc(boolean tcc) {  
196 - this.tcc = tcc;  
197 - }  
198 -  
199 - public boolean isOutTcc() {  
200 - return isTcc() && inOut == 1;  
201 - }  
202 -  
203 - public boolean isCorrect() {  
204 - return correct;  
205 - }  
206 -  
207 - public void setCorrect(boolean correct) {  
208 - this.correct = correct;  
209 - }  
210 -  
211 - public String getCorrectText() {  
212 - return correctText;  
213 - }  
214 -  
215 - public void setCorrectText(String correctText) {  
216 - this.correctText = correctText;  
217 - }  
218 -  
219 - public Integer getFlag() {  
220 - return flag;  
221 - }  
222 -  
223 - public void setFlag(Integer flag) {  
224 - this.flag = flag;  
225 - }  
226 -} 1 +package com.bsth.data.forecast.entity;
  2 +
  3 +import com.bsth.data.BasicData;
  4 +
  5 +import java.text.SimpleDateFormat;
  6 +import java.util.Date;
  7 +
  8 +/**
  9 + *
  10 + * @ClassName: ArrivalEntity
  11 + * @Description: TODO(进出站实体)
  12 + * @author PanZhao
  13 + * @date 2016年8月19日 上午9:32:20
  14 + *
  15 + */
  16 +public class ArrivalEntity {
  17 +
  18 + /** 设备号*/
  19 + private String deviceId;
  20 +
  21 + private String nbbm;
  22 +
  23 + /** 站点名称 */
  24 + private String stopName;
  25 +
  26 + /** 时间戳*/
  27 + private Long ts;
  28 +
  29 + /** 线路编码*/
  30 + private String lineCode;
  31 +
  32 + /** 上下行*/
  33 + private Integer upDown;
  34 +
  35 + /**站点编码*/
  36 + private String stopNo;
  37 +
  38 + /** 0: 进 1:出*/
  39 + private Integer inOut;
  40 +
  41 + private Long createDate;
  42 +
  43 + /** 是否有效 */
  44 + private boolean enable;
  45 +
  46 + /**分区字段,当年的第几周*/
  47 + private Integer weeksYear;
  48 +
  49 + private boolean tcc;
  50 +
  51 + //是否被纠正
  52 + private boolean correct;
  53 +
  54 + private String correctText;
  55 +
  56 + /** -1 则信号有效,但程序标记为不使用 */
  57 + private int flag = 0;
  58 +
  59 + public ArrivalEntity(){}
  60 +
  61 + public ArrivalEntity(String deviceId, long ts, String lineCode, int upDown, String stopNo, int inOut, long createDate,
  62 + int weeksYear, String stopName) {
  63 +
  64 + this.deviceId = deviceId;
  65 + this.ts = ts;
  66 + this.lineCode = lineCode;
  67 + this.upDown = upDown;
  68 + this.stopNo = stopNo;
  69 + this.stopName = stopName;
  70 + this.inOut = inOut;
  71 + this.createDate = createDate;
  72 + }
  73 +
  74 +/* @Override
  75 + public boolean equals(Object obj) {
  76 + ArrivalEntity a2 = (ArrivalEntity)obj;
  77 +
  78 + return this.toString().equals(a2.toString())
  79 + && Math.abs(this.ts - a2.ts) < EQ_RANGE;
  80 + }
  81 +
  82 + @Override
  83 + public int hashCode() {
  84 + return this.toString().hashCode();
  85 + }*/
  86 +
  87 +
  88 + @Override
  89 + public String toString() {
  90 + try {
  91 + SimpleDateFormat sdfHHmm = new SimpleDateFormat("HH:mm");
  92 + return "["+BasicData.deviceId2NbbmMap.get(this.deviceId)+", "+sdfHHmm.format(new Date(this.ts))
  93 + +","+(this.getUpDown()==0?"上行":"下行")+","+(this.inOut==0?"进":"出")+","+this.stopNo+" ("+this.stopName+")]";
  94 + } catch (Exception e) {
  95 + return "";
  96 + }
  97 + }
  98 +
  99 + public String getLineCode() {
  100 + return lineCode;
  101 + }
  102 +
  103 + public void setLineCode(String lineCode) {
  104 + this.lineCode = lineCode;
  105 + }
  106 +
  107 + public Integer getUpDown() {
  108 + return upDown;
  109 + }
  110 +
  111 + public void setUpDown(Integer upDown) {
  112 + this.upDown = upDown;
  113 + }
  114 +
  115 + public String getStopNo() {
  116 + return stopNo;
  117 + }
  118 +
  119 + public void setStopNo(String stopNo) {
  120 + this.stopNo = stopNo;
  121 + }
  122 +
  123 + public Integer getInOut() {
  124 + return inOut;
  125 + }
  126 +
  127 + public void setInOut(Integer inOut) {
  128 + this.inOut = inOut;
  129 + }
  130 +
  131 + public Long getCreateDate() {
  132 + return createDate;
  133 + }
  134 +
  135 + public void setCreateDate(Long createDate) {
  136 + this.createDate = createDate;
  137 + }
  138 +
  139 + public Integer getWeeksYear() {
  140 + return weeksYear;
  141 + }
  142 +
  143 + public void setWeeksYear(Integer weeksYear) {
  144 + this.weeksYear = weeksYear;
  145 + }
  146 +
  147 + public String getDeviceId() {
  148 + return deviceId;
  149 + }
  150 +
  151 + public void setDeviceId(String deviceId) {
  152 + this.deviceId = deviceId;
  153 + }
  154 +
  155 + public Long getTs() {
  156 + return ts;
  157 + }
  158 +
  159 + public void setTs(Long ts) {
  160 + this.ts = ts;
  161 + }
  162 +
  163 + public String getStopName() {
  164 + return stopName;
  165 + }
  166 +
  167 + public void setStopName(String stopName) {
  168 + this.stopName = stopName;
  169 + }
  170 +
  171 + public String getId(){
  172 + return this.deviceId + "_" + this.ts;
  173 + }
  174 +
  175 + public String getNbbm() {
  176 + return nbbm;
  177 + }
  178 +
  179 + public void setNbbm(String nbbm) {
  180 + this.nbbm = nbbm;
  181 + }
  182 +
  183 + public boolean isEnable() {
  184 + return enable;
  185 + }
  186 +
  187 + public void setEnable(boolean enable) {
  188 + this.enable = enable;
  189 + }
  190 +
  191 + public boolean isTcc() {
  192 + return tcc;
  193 + }
  194 +
  195 + public void setTcc(boolean tcc) {
  196 + this.tcc = tcc;
  197 + }
  198 +
  199 + public boolean isOutTcc() {
  200 + return isTcc() && inOut == 1;
  201 + }
  202 +
  203 + public boolean isCorrect() {
  204 + return correct;
  205 + }
  206 +
  207 + public void setCorrect(boolean correct) {
  208 + this.correct = correct;
  209 + }
  210 +
  211 + public String getCorrectText() {
  212 + return correctText;
  213 + }
  214 +
  215 + public void setCorrectText(String correctText) {
  216 + this.correctText = correctText;
  217 + }
  218 +
  219 + public Integer getFlag() {
  220 + return flag;
  221 + }
  222 +
  223 + public void setFlag(Integer flag) {
  224 + this.flag = flag;
  225 + }
  226 +}
src/main/java/com/bsth/data/gpsdata/GpsEntity.java
@@ -14,7 +14,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; @@ -14,7 +14,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
14 public class GpsEntity { 14 public class GpsEntity {
15 15
16 /** 公司代码 */ 16 /** 公司代码 */
17 - private Integer companyCode; 17 + private Short companyCode;
18 18
19 /** 线路编码 */ 19 /** 线路编码 */
20 private String lineId; 20 private String lineId;
@@ -47,23 +47,20 @@ public class GpsEntity { @@ -47,23 +47,20 @@ public class GpsEntity {
47 private Float speed; 47 private Float speed;
48 48
49 /** 方向(角度) */ 49 /** 方向(角度) */
50 - private Float direction; 50 + private float direction;
51 51
52 /** 营运状态( 0 营运 ,1 非营运, -1 无效) */ 52 /** 营运状态( 0 营运 ,1 非营运, -1 无效) */
53 private Integer state; 53 private Integer state;
54 54
55 /** 上下行(0 上行 , 1 下行 , -1 无效) */ 55 /** 上下行(0 上行 , 1 下行 , -1 无效) */
56 - private Integer upDown; 56 + private Byte upDown;
57 57
58 /** 车辆内部编码 */ 58 /** 车辆内部编码 */
59 private String nbbm; 59 private String nbbm;
60 60
61 /** 预计到达终点时间 */ 61 /** 预计到达终点时间 */
62 private Float expectStopTime; 62 private Float expectStopTime;
63 -  
64 - /** 设备是否在线  
65 - private boolean online;  
66 - */ 63 +
67 /** 当前执行班次ID */ 64 /** 当前执行班次ID */
68 private Long schId; 65 private Long schId;
69 66
@@ -91,14 +88,6 @@ public class GpsEntity { @@ -91,14 +88,6 @@ public class GpsEntity {
91 /** gps是否有效 设备端发送的状态 */ 88 /** gps是否有效 设备端发送的状态 */
92 private int valid; 89 private int valid;
93 90
94 - public Integer getCompanyCode() {  
95 - return companyCode;  
96 - }  
97 -  
98 - public void setCompanyCode(Integer companyCode) {  
99 - this.companyCode = companyCode;  
100 - }  
101 -  
102 public String getDeviceId() { 91 public String getDeviceId() {
103 return deviceId; 92 return deviceId;
104 } 93 }
@@ -147,21 +136,6 @@ public class GpsEntity { @@ -147,21 +136,6 @@ public class GpsEntity {
147 this.timestamp = timestamp; 136 this.timestamp = timestamp;
148 } 137 }
149 138
150 - public Float getSpeed() {  
151 - return speed;  
152 - }  
153 -  
154 - public void setSpeed(Float speed) {  
155 - this.speed = speed;  
156 - }  
157 -  
158 - public Float getDirection() {  
159 - return direction;  
160 - }  
161 -  
162 - public void setDirection(Float direction) {  
163 - this.direction = direction;  
164 - }  
165 139
166 public Integer getState() { 140 public Integer getState() {
167 return state; 141 return state;
@@ -171,14 +145,6 @@ public class GpsEntity { @@ -171,14 +145,6 @@ public class GpsEntity {
171 this.state = state; 145 this.state = state;
172 } 146 }
173 147
174 - public Integer getUpDown() {  
175 - return upDown;  
176 - }  
177 -  
178 - public void setUpDown(Integer upDown) {  
179 - this.upDown = upDown;  
180 - }  
181 -  
182 public String getNbbm() { 148 public String getNbbm() {
183 return nbbm; 149 return nbbm;
184 } 150 }
@@ -291,4 +257,39 @@ public class GpsEntity { @@ -291,4 +257,39 @@ public class GpsEntity {
291 public void setValid(int valid) { 257 public void setValid(int valid) {
292 this.valid = valid; 258 this.valid = valid;
293 } 259 }
  260 +
  261 +
  262 +
  263 + public short getCompanyCode() {
  264 + return companyCode;
  265 + }
  266 +
  267 + public void setCompanyCode(short companyCode) {
  268 + this.companyCode = companyCode;
  269 + }
  270 +
  271 + public Byte getUpDown() {
  272 + return upDown;
  273 + }
  274 +
  275 + public void setUpDown(Byte upDown) {
  276 + this.upDown = upDown;
  277 + }
  278 +
  279 +
  280 + public float getDirection() {
  281 + return direction;
  282 + }
  283 +
  284 + public void setDirection(float direction) {
  285 + this.direction = direction;
  286 + }
  287 +
  288 + public Float getSpeed() {
  289 + return speed;
  290 + }
  291 +
  292 + public void setSpeed(Float speed) {
  293 + this.speed = speed;
  294 + }
294 } 295 }
src/main/java/com/bsth/data/gpsdata/GpsRealData.java
1 package com.bsth.data.gpsdata; 1 package com.bsth.data.gpsdata;
2 2
  3 +import com.bsth.Application;
3 import com.bsth.data.BasicData; 4 import com.bsth.data.BasicData;
4 import com.bsth.data.forecast.ForecastRealServer; 5 import com.bsth.data.forecast.ForecastRealServer;
  6 +import com.bsth.data.gpsdata.client.ClientApp;
5 import com.bsth.data.gpsdata.thread.GpsDataLoaderThread; 7 import com.bsth.data.gpsdata.thread.GpsDataLoaderThread;
6 import com.bsth.data.gpsdata.thread.OfflineMonitorThread; 8 import com.bsth.data.gpsdata.thread.OfflineMonitorThread;
7 import com.bsth.data.schedule.DayOfSchedule; 9 import com.bsth.data.schedule.DayOfSchedule;
@@ -15,6 +17,7 @@ import org.springframework.boot.CommandLineRunner; @@ -15,6 +17,7 @@ import org.springframework.boot.CommandLineRunner;
15 import org.springframework.stereotype.Component; 17 import org.springframework.stereotype.Component;
16 18
17 import java.util.*; 19 import java.util.*;
  20 +import java.util.concurrent.TimeUnit;
18 21
19 /** 22 /**
20 * @author PanZhao 23 * @author PanZhao
@@ -52,13 +55,18 @@ public class GpsRealData implements CommandLineRunner { @@ -52,13 +55,18 @@ public class GpsRealData implements CommandLineRunner {
52 lineCode2Devices = TreeMultimap.create(); 55 lineCode2Devices = TreeMultimap.create();
53 } 56 }
54 57
  58 + @Autowired
  59 + ClientApp clientApp;
55 @Override 60 @Override
56 public void run(String... arg0) throws Exception { 61 public void run(String... arg0) throws Exception {
57 logger.info("gpsDataLoader,20,3"); 62 logger.info("gpsDataLoader,20,3");
58 - //定时从网关获取GPS数据 63 + //定时从网关http形式获取GPS数据 --- 已弃用,现socket客户端接入数据
59 //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 3, TimeUnit.SECONDS); 64 //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 3, TimeUnit.SECONDS);
60 //定时扫描掉离线 65 //定时扫描掉离线
61 - //Application.mainServices.scheduleWithFixedDelay(offlineMonitorThread, 120, 60, TimeUnit.SECONDS); 66 + Application.mainServices.scheduleWithFixedDelay(offlineMonitorThread, 120, 60, TimeUnit.SECONDS);
  67 +
  68 + //gps 客户端
  69 + //clientApp.init();
62 } 70 }
63 71
64 72
src/main/java/com/bsth/data/gpsdata/arrival/GeoCacheData.java
@@ -285,7 +285,7 @@ public class GeoCacheData { @@ -285,7 +285,7 @@ public class GeoCacheData {
285 * @param stationCode 285 * @param stationCode
286 * @return 286 * @return
287 */ 287 */
288 - public static boolean isEndStation(String lineId, Integer upDown, String stationCode) { 288 + public static boolean isEndStation(String lineId, Byte upDown, String stationCode) {
289 StationRoute station = routeCodeMap.get(lineId + "_" + upDown + "_" + stationCode); 289 StationRoute station = routeCodeMap.get(lineId + "_" + upDown + "_" + stationCode);
290 return station != null && station.getMark().equals("E"); 290 return station != null && station.getMark().equals("E");
291 } 291 }
src/main/java/com/bsth/data/gpsdata/arrival/GpsRealAnalyse.java
@@ -4,12 +4,15 @@ import com.bsth.data.gpsdata.GpsEntity; @@ -4,12 +4,15 @@ import com.bsth.data.gpsdata.GpsEntity;
4 import com.bsth.data.gpsdata.GpsRealData; 4 import com.bsth.data.gpsdata.GpsRealData;
5 import com.bsth.data.gpsdata.arrival.handlers.*; 5 import com.bsth.data.gpsdata.arrival.handlers.*;
6 import com.bsth.data.gpsdata.arrival.utils.CircleQueue; 6 import com.bsth.data.gpsdata.arrival.utils.CircleQueue;
  7 +import com.bsth.data.gpsdata.recovery.GpsDataRecovery;
  8 +import com.google.common.collect.ArrayListMultimap;
7 import org.slf4j.Logger; 9 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory; 10 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.stereotype.Component; 12 import org.springframework.stereotype.Component;
11 13
12 import java.util.List; 14 import java.util.List;
  15 +import java.util.Set;
13 import java.util.concurrent.CountDownLatch; 16 import java.util.concurrent.CountDownLatch;
14 import java.util.concurrent.ExecutorService; 17 import java.util.concurrent.ExecutorService;
15 import java.util.concurrent.Executors; 18 import java.util.concurrent.Executors;
@@ -43,10 +46,22 @@ public class GpsRealAnalyse { @@ -43,10 +46,22 @@ public class GpsRealAnalyse {
43 static ExecutorService threadPool = Executors.newFixedThreadPool(50); 46 static ExecutorService threadPool = Executors.newFixedThreadPool(50);
44 47
45 public void analyse(List<GpsEntity> list) { 48 public void analyse(List<GpsEntity> list) {
46 - CountDownLatch count = new CountDownLatch(list.size()); 49 + //如果正在恢复数据
  50 + if (GpsDataRecovery.run)
  51 + return;
  52 + logger.info("analyse gps size: " + list.size());
  53 + //按车辆分组gps
  54 + ArrayListMultimap multimap = ArrayListMultimap.create();
  55 + for(GpsEntity gps : list){
  56 + multimap.put(gps.getNbbm(), gps);
  57 + }
  58 +
  59 + Set<String> ks = multimap.keySet();
  60 + CountDownLatch count = new CountDownLatch(ks.size());
47 61
48 - for(GpsEntity gps : list)  
49 - threadPool.execute(new SignalHandleThread(gps, count)); 62 + for(String nbbm : ks){
  63 + threadPool.execute(new SignalHandleThread(multimap.get(nbbm), count));
  64 + }
50 65
51 try { 66 try {
52 //等待子线程结束 67 //等待子线程结束
@@ -62,11 +77,11 @@ public class GpsRealAnalyse { @@ -62,11 +77,11 @@ public class GpsRealAnalyse {
62 77
63 public class SignalHandleThread implements Runnable { 78 public class SignalHandleThread implements Runnable {
64 79
65 - GpsEntity gps; 80 + List<GpsEntity> list;
66 CountDownLatch count; 81 CountDownLatch count;
67 82
68 - SignalHandleThread(GpsEntity gps, CountDownLatch count) {  
69 - this.gps = gps; 83 + SignalHandleThread(List<GpsEntity> gpsList, CountDownLatch count) {
  84 + this.list = gpsList;
70 this.count = count; 85 this.count = count;
71 } 86 }
72 87
@@ -74,31 +89,33 @@ public class GpsRealAnalyse { @@ -74,31 +89,33 @@ public class GpsRealAnalyse {
74 public void run() { 89 public void run() {
75 90
76 try { 91 try {
77 - //是否有任务  
78 - boolean task;  
79 - CircleQueue<GpsEntity> prevs = GeoCacheData.getGps(gps.getNbbm());  
80 - //掉线处理  
81 - offlineSignalHandle.handle(gps, prevs);  
82 - //状态处理  
83 - task = correctSignalHandle.handle(gps, prevs);  
84 - //场,站内外判断  
85 - stationInsideHandle.handle(gps, prevs);  
86 - //异常判定(越界/超速)  
87 - abnormalStateHandle.handle(gps, prevs);  
88 -  
89 - if(!task)  
90 - return; //无任务的,到这里就结束  
91 -  
92 - //反向处理  
93 - reverseSignalHandle.handle(gps, prevs);  
94 - //进出站动作处理  
95 - inOutStationSignalHandle.handle(gps, prevs);  
96 - GeoCacheData.putGps(gps);  
97 - 92 + for(GpsEntity gps : list){
  93 + //是否有任务
  94 + boolean task;
  95 + CircleQueue<GpsEntity> prevs = GeoCacheData.getGps(gps.getNbbm());
  96 + //掉线处理
  97 + offlineSignalHandle.handle(gps, prevs);
  98 + //状态处理
  99 + task = correctSignalHandle.handle(gps, prevs);
  100 + //场,站内外判断
  101 + stationInsideHandle.handle(gps, prevs);
  102 + //异常判定(越界/超速)
  103 + abnormalStateHandle.handle(gps, prevs);
  104 +
  105 + if(!task)
  106 + return; //无任务的,到这里就结束
  107 +
  108 + //反向处理
  109 + reverseSignalHandle.handle(gps, prevs);
  110 + //进出站动作处理
  111 + inOutStationSignalHandle.handle(gps, prevs);
  112 + GeoCacheData.putGps(gps);
  113 + }
98 } catch (Exception e) { 114 } catch (Exception e) {
99 logger.error("", e); 115 logger.error("", e);
100 } finally { 116 } finally {
101 - count.countDown(); 117 + if(count != null)
  118 + count.countDown();
102 } 119 }
103 } 120 }
104 } 121 }
src/main/java/com/bsth/data/gpsdata/arrival/SignalHandle.java
@@ -75,7 +75,7 @@ public abstract class SignalHandle { @@ -75,7 +75,7 @@ public abstract class SignalHandle {
75 Logger logger = LoggerFactory.getLogger(this.getClass()); 75 Logger logger = LoggerFactory.getLogger(this.getClass());
76 private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm"); 76 private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm");
77 protected void transformUpdown(GpsEntity gps, ScheduleRealInfo sch) { 77 protected void transformUpdown(GpsEntity gps, ScheduleRealInfo sch) {
78 - int updown = Integer.parseInt(sch.getXlDir()); 78 + byte updown = Byte.parseByte(sch.getXlDir());
79 //gps 切换走向 79 //gps 切换走向
80 gps.setUpDown(updown); 80 gps.setUpDown(updown);
81 81
src/main/java/com/bsth/data/gpsdata/arrival/handlers/CorrectSignalHandle.java
@@ -41,7 +41,7 @@ public class CorrectSignalHandle extends SignalHandle { @@ -41,7 +41,7 @@ public class CorrectSignalHandle extends SignalHandle {
41 else 41 else
42 sch = (ScheduleRealInfo) task; 42 sch = (ScheduleRealInfo) task;
43 43
44 - int updown = Integer.parseInt(sch.getXlDir()); 44 + byte updown = Byte.parseByte(sch.getXlDir());
45 //走向 45 //走向
46 if(gps.getUpDown() != updown){ 46 if(gps.getUpDown() != updown){
47 gps.setUpDown(updown); 47 gps.setUpDown(updown);
src/main/java/com/bsth/data/gpsdata/client/ClientApp.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client;
  2 +
  3 +import com.bsth.data.gpsdata.client.pd.codec.PdMessageCodecFactory;
  4 +import com.bsth.data.gpsdata.client.pd.handler.PdClientHandler;
  5 +import com.bsth.data.gpsdata.client.pd.protocol.Pd_31_0;
  6 +import com.bsth.data.gpsdata.client.pf.codec.PfMessageCodecFactory;
  7 +import com.bsth.data.gpsdata.client.pf.handler.PfClientHandler;
  8 +import com.bsth.util.ConfigUtil;
  9 +import org.apache.mina.core.future.ConnectFuture;
  10 +import org.apache.mina.core.future.WriteFuture;
  11 +import org.apache.mina.core.session.IdleStatus;
  12 +import org.apache.mina.core.session.IoSession;
  13 +import org.apache.mina.core.session.IoSessionConfig;
  14 +import org.apache.mina.filter.codec.ProtocolCodecFilter;
  15 +import org.apache.mina.filter.logging.LogLevel;
  16 +import org.apache.mina.filter.logging.LoggingFilter;
  17 +import org.apache.mina.transport.socket.nio.NioSocketConnector;
  18 +import org.slf4j.Logger;
  19 +import org.slf4j.LoggerFactory;
  20 +import org.springframework.beans.factory.annotation.Autowired;
  21 +import org.springframework.stereotype.Component;
  22 +
  23 +import java.net.InetSocketAddress;
  24 +
  25 +/**
  26 + * Created by panzhao on 2017/5/4.
  27 + */
  28 +@Component
  29 +public class ClientApp {
  30 +
  31 + private static NioSocketConnector pdDataConnector;
  32 + private static NioSocketConnector pfDataConnector;
  33 +
  34 + @Autowired
  35 + private PdClientHandler pdClient;
  36 + @Autowired
  37 + private PfClientHandler pfClient;
  38 + @Autowired
  39 + GpsBeforeBuffer gpsBeforeBuffer;
  40 +
  41 + static Logger logger = LoggerFactory.getLogger(ClientApp.class);
  42 +
  43 + public static boolean dconnect(String device) {
  44 + boolean flag = false;
  45 + try {
  46 + ConnectFuture con = pdDataConnector.connect(new InetSocketAddress(ConfigUtil.get("gps.server.pd"), Integer.parseInt(ConfigUtil.get("gps.port.pd"))));
  47 + con.awaitUninterruptibly();
  48 + IoSession session = con.getSession();
  49 + session.setAttribute("deviceId", device);
  50 + com.bsth.data.gpsdata.client.pd.protocol.PdMessage msg = new com.bsth.data.gpsdata.client.pd.protocol.PdMessage();
  51 + Pd_31_0 body = new Pd_31_0();
  52 + body.setFunCode((short)0x15);
  53 + body.setLineId(0);
  54 + body.setDeviceId(device);
  55 + msg.setMessageBody(body);
  56 + msg.setVersion((short)1);
  57 + msg.setSerialNo((short)1);
  58 + msg.setCommandType((short)0x31);
  59 + byte[] bytes = msg.write();
  60 + WriteFuture write = session.write(bytes);
  61 + write.awaitUninterruptibly();
  62 + flag = true;
  63 +
  64 + logger.info("dconnect...");
  65 + //SessionManager.getInstance().register(device, session);
  66 + } catch (Exception e) {
  67 + e.printStackTrace();
  68 + }
  69 + return flag;
  70 + }
  71 +
  72 + public static boolean fconnect(String device) {
  73 + boolean flag = false;
  74 + try {
  75 + ConnectFuture con = pfDataConnector.connect(new InetSocketAddress(ConfigUtil.get("gps.server.pf"), Integer.parseInt(ConfigUtil.get("gps.port.pf"))));
  76 + con.awaitUninterruptibly();
  77 + IoSession session = con.getSession();
  78 + session.setAttribute("deviceId", device);
  79 + flag = true;
  80 +
  81 + logger.info("fconnect...");
  82 + } catch (Exception e) {
  83 + e.printStackTrace();
  84 + }
  85 + return flag;
  86 + }
  87 +
  88 + public void init() {
  89 + //exec = Executors.newFixedThreadPool(4);
  90 + //sexec.scheduleAtFixedRate(new SessionChecker(), 1, 1, TimeUnit.MINUTES);
  91 + /*******************************浦东********************************/
  92 + pdDataConnector = new NioSocketConnector();
  93 +
  94 + LoggingFilter log = new LoggingFilter();
  95 + log.setMessageReceivedLogLevel(LogLevel.DEBUG);
  96 + pdDataConnector.getFilterChain().addLast("logger", log);
  97 +
  98 + pdDataConnector.getFilterChain().addLast("codec",
  99 + new ProtocolCodecFilter(new PdMessageCodecFactory()));
  100 +
  101 + IoSessionConfig config = pdDataConnector.getSessionConfig();
  102 +
  103 + config.setReadBufferSize(4096);
  104 + config.setWriteTimeout(10000);
  105 + config.setWriterIdleTime(60000);
  106 +
  107 + config.setIdleTime(IdleStatus.BOTH_IDLE, 60);
  108 +
  109 + pdDataConnector.setHandler(pdClient);
  110 +
  111 + dconnect(ConfigUtil.get("forward.device.name"));
  112 + /*******************************浦东转发********************************/
  113 + pfDataConnector = new NioSocketConnector();
  114 +
  115 + LoggingFilter log1 = new LoggingFilter();
  116 + log1.setMessageReceivedLogLevel(LogLevel.DEBUG);
  117 + pfDataConnector.getFilterChain().addLast("logger", log1);
  118 +
  119 + pfDataConnector.getFilterChain().addLast("codec",
  120 + new ProtocolCodecFilter(new PfMessageCodecFactory()));
  121 +
  122 + IoSessionConfig config1 = pfDataConnector.getSessionConfig();
  123 +
  124 + config1.setReadBufferSize(4096);
  125 + config1.setWriteTimeout(10000);
  126 + config1.setWriterIdleTime(60000);
  127 +
  128 + config1.setIdleTime(IdleStatus.BOTH_IDLE, 60);
  129 +
  130 + pfDataConnector.setHandler(pfClient);
  131 + fconnect(ConfigUtil.get("forward.device.name"));
  132 +
  133 +
  134 + gpsBeforeBuffer.init();
  135 + }
  136 +}
0 \ No newline at end of file 137 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/client/GpsBeforeBuffer.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client;
  2 +
  3 +import com.bsth.Application;
  4 +import com.bsth.data.BasicData;
  5 +import com.bsth.data.gpsdata.GpsEntity;
  6 +import com.bsth.data.gpsdata.arrival.GpsRealAnalyse;
  7 +import com.bsth.data.gpsdata.client.pd.protocol.BasicInfo;
  8 +import org.apache.commons.lang3.StringUtils;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import java.util.ArrayList;
  13 +import java.util.LinkedList;
  14 +import java.util.List;
  15 +import java.util.concurrent.TimeUnit;
  16 +
  17 +/**
  18 + * 从 socket client 到 .. 的缓冲
  19 + * Created by panzhao on 2017/5/4.
  20 + */
  21 +@Component
  22 +public class GpsBeforeBuffer {
  23 +
  24 + static LinkedList<GpsEntity> linkedList = new LinkedList<>();
  25 +
  26 + @Autowired
  27 + GpsHandleThread gpsHandleThread;
  28 +
  29 + public void put(BasicInfo basicInfo){
  30 + //放弃补发数据
  31 + byte cacheData = getCacheState(basicInfo.getServiceState());
  32 + if(cacheData == 1)
  33 + return;
  34 + GpsEntity gps = new GpsEntity();
  35 +
  36 + gps.setDeviceId(basicInfo.getDeviceId());
  37 + gps.setTimestamp(basicInfo.getTimestamp());
  38 + gps.setLat(basicInfo.getLat());
  39 + gps.setLon(basicInfo.getLon());
  40 + gps.setDirection((float)basicInfo.getDirection() / 10);
  41 + gps.setValid(basicInfo.getGpsValid());
  42 + gps.setCompanyCode(basicInfo.getCompanyCode());
  43 + gps.setStopNo(basicInfo.getStopNo());
  44 + gps.setUpDown(basicInfo.getUpOrDown());
  45 + gps.setSpeed((float)basicInfo.getSpeedGps() / 10);
  46 + gps.setLineId(String.valueOf(basicInfo.getLineId()));
  47 + gps.setState((int) getService(basicInfo.getServiceState()));
  48 + //没有设备号
  49 + if (StringUtils.isBlank(gps.getDeviceId()))
  50 + return;
  51 +
  52 + String nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId());
  53 + if (StringUtils.isBlank(nbbm))
  54 + gps.setIncomplete(true);
  55 + else
  56 + gps.setNbbm(nbbm);
  57 +
  58 + linkedList.addLast(gps);
  59 + }
  60 +
  61 + public byte getCacheState(long serviceState) {
  62 + return (byte)(((serviceState & 0x00100000) == 0x00100000) ? 1 : 0);
  63 + }
  64 +
  65 + public void init(){
  66 + Application.mainServices.scheduleWithFixedDelay(gpsHandleThread, 20 * 1000, 1100, TimeUnit.MILLISECONDS);
  67 + }
  68 +
  69 + @Component
  70 + public static class GpsHandleThread extends Thread{
  71 +
  72 + List<GpsEntity> list;
  73 +
  74 + @Autowired
  75 + GpsRealAnalyse gpsRealAnalyse;
  76 +
  77 + @Override
  78 + public void run() {
  79 + list = new ArrayList<>(100);
  80 +
  81 + GpsEntity gps;
  82 + for(int i = 0; i < 2000; i ++){
  83 + gps = linkedList.poll();
  84 + if(gps == null)
  85 + break;
  86 + list.add(gps);
  87 + }
  88 +
  89 + gpsRealAnalyse.analyse(list);
  90 + }
  91 + }
  92 +
  93 + /**
  94 + * 获取运营状态
  95 + *
  96 + * @return -1无效 0运营 1未运营
  97 + */
  98 + public static byte getService(long serviceState) {
  99 + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000)
  100 + return -1;
  101 + return (byte) (((serviceState & 0x02000000) == 0x02000000) ? 1 : 0);
  102 + }
  103 +}
0 \ No newline at end of file 104 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata/client/common/ExceptionUtil.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.common;
  2 +
  3 +public class ExceptionUtil {
  4 +
  5 + public static String getTrace(Throwable e) {
  6 + StringBuilder sb = new StringBuilder();
  7 + sb.append(e.toString());
  8 + for (StackTraceElement ste : e.getStackTrace()) {
  9 + sb.append(ste).append("\r\n");
  10 + }
  11 + return sb.toString();
  12 + }
  13 +}
src/main/java/com/bsth/data/gpsdata/client/common/Protocol2BizUtil.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.common;
  2 +
  3 +//import com.bsth.data.gpsdata.socket_client_001.pd.protocol.BasicInfo;
  4 +//import com.bsth.data.gpsdata.socket_client_001.pf.protocol.PfMessage;
  5 +//import com.bsth.data.gpsdata.socket_client_001.pf.protocol.Pf_1_0;
  6 +
  7 +import com.bsth.data.gpsdata.client.pd.protocol.BasicInfo;
  8 +import com.bsth.data.gpsdata.client.pf.protocol.PfMessage;
  9 +import com.bsth.data.gpsdata.client.pf.protocol.Pf_1_0;
  10 +import org.slf4j.Logger;
  11 +import org.slf4j.LoggerFactory;
  12 +
  13 +public class Protocol2BizUtil {
  14 +
  15 + private final static Logger log = LoggerFactory.getLogger(Protocol2BizUtil.class);
  16 +
  17 + /**
  18 + * 从协议数据中获得基本数据
  19 + */
  20 + public static BasicInfo getBasicInfoFromMsg(PfMessage msg) {
  21 + if (msg == null) return null;
  22 + BasicInfo info = null;
  23 + if (msg.getCommandType() == 0x01) {
  24 + Pf_1_0 pf_1_0 = (Pf_1_0)msg.getMessageBody();
  25 + info = new BasicInfo();
  26 + info.setLineId(pf_1_0.getXldm());
  27 + info.setDeviceId(pf_1_0.getMtd());
  28 + info.setDriverEmpNo(Integer.parseInt(pf_1_0.getDriver().trim()));
  29 + info.setCarparkNo(pf_1_0.getTccbh());
  30 + info.setStopNo(pf_1_0.getZdbh());
  31 + double lon = pf_1_0.getLon()/1000000, lat = pf_1_0.getLat()/1000000;
  32 + info.setCarLon(((long)lon) * 1000000 + (long)((lon - (long)lon) * 600000));
  33 + info.setCarLat(((int)lat) * 1000000 + (int)((lat - (int)lat) * 600000));
  34 + info.setTimestamp(pf_1_0.getFssj().getTime());
  35 + info.setSpeedGps((short)pf_1_0.getSpeed());
  36 + info.setSpeedSensor((short)(pf_1_0.getSpeed()));
  37 + info.setDirection((short)(pf_1_0.getFx()));
  38 + info.setServiceState(0);
  39 + info.setService(pf_1_0.getYyzt() == 0 ? true : false);
  40 + info.setUpOrDown(pf_1_0.getSxxzt() == 0 ? true : false);
  41 +
  42 + info.setLon(Float.parseFloat(String.valueOf(lon)));
  43 + info.setLat(Float.parseFloat(String.valueOf(lat)));
  44 + }
  45 +
  46 + return info;
  47 + }
  48 +}
src/main/java/com/bsth/data/gpsdata/client/common/ThreadLocalDateUtil.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.common;
  2 +
  3 +import java.text.DateFormat;
  4 +import java.text.ParseException;
  5 +import java.text.SimpleDateFormat;
  6 +import java.util.Date;
  7 +
  8 +public class ThreadLocalDateUtil {
  9 + private static final String date_format = "yyyyMMddHHmmss";
  10 + private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>();
  11 +
  12 + public static DateFormat getDateFormat()
  13 + {
  14 + DateFormat df = threadLocal.get();
  15 + if(df==null){
  16 + df = new SimpleDateFormat(date_format);
  17 + threadLocal.set(df);
  18 + }
  19 + return df;
  20 + }
  21 +
  22 + public static String formatDate(Date date) throws ParseException {
  23 + return getDateFormat().format(date);
  24 + }
  25 +
  26 + public static Date parse(String strDate) throws ParseException {
  27 + return getDateFormat().parse(strDate);
  28 + }
  29 +}
src/main/java/com/bsth/data/gpsdata/client/msg/IMessage.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.msg;
  2 +
  3 +public interface IMessage extends IMessageIO {
  4 +
  5 + public IMessageBody getMessageBody();
  6 +}
src/main/java/com/bsth/data/gpsdata/client/msg/IMessageBody.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.msg;
  2 +
  3 +public interface IMessageBody extends IMessageIO {
  4 +
  5 + public String getDeviceId();
  6 +
  7 + public long getTimestamp();
  8 +}
src/main/java/com/bsth/data/gpsdata/client/msg/IMessageIO.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.msg;
  2 +
  3 +public interface IMessageIO {
  4 +
  5 + public void read(byte[] bytes);
  6 +
  7 + public byte[] write();
  8 +}
src/main/java/com/bsth/data/gpsdata/client/pd/codec/MessageDecoder.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pd.codec;
  2 +
  3 +import com.bsth.data.gpsdata.client.pd.protocol.PdMessage;
  4 +import org.apache.mina.core.buffer.IoBuffer;
  5 +import org.apache.mina.core.session.IoSession;
  6 +import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
  7 +import org.apache.mina.filter.codec.ProtocolDecoderOutput;
  8 +
  9 +
  10 +public class MessageDecoder extends CumulativeProtocolDecoder {
  11 +
  12 + @Override
  13 + protected boolean doDecode(IoSession session, IoBuffer in,
  14 + ProtocolDecoderOutput out) throws Exception {
  15 + // TODO Auto-generated method stub
  16 + while (in.remaining() > 3) {
  17 + in.mark();
  18 + byte head1 = in.get(), head2 = in.get(), lenh = in.get(), lenl = in.get();
  19 + int len = ((lenh & 0xff) << 8) + (lenl & 0xff);
  20 + if ((head1 & 0xff) == 0xfa && (head2 & 0xff) == 0xf5) {
  21 + if (in.remaining() > len) {
  22 + byte[] bytes = new byte[len + 1];
  23 + in.get(bytes);
  24 + PdMessage msg = new PdMessage();
  25 + msg.read(bytes);
  26 + out.write(msg);
  27 + /*if ("true".equals(ConfigUtil.getProperty("protocolup", "true"))) {
  28 + UpProtocolDataService.getInstance().write(new byte[]{ head1, head2, lenh, lenl });
  29 + UpProtocolDataService.getInstance().write(bytes);
  30 + }*/
  31 + } else {
  32 + in.reset();
  33 + return false;
  34 + }
  35 + }
  36 + }
  37 + return false;
  38 + }
  39 +
  40 + /*private static String toHexString(byte[] bytes) {
  41 + StringBuilder sb = new StringBuilder();
  42 + for (byte b : bytes) {
  43 + sb.append(Integer.toHexString(b & 0xff) + "|");
  44 + }
  45 + return sb.toString();
  46 + }*/
  47 +}
src/main/java/com/bsth/data/gpsdata/client/pd/codec/MessageEncoder.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pd.codec;
  2 +
  3 +import org.apache.mina.core.buffer.IoBuffer;
  4 +import org.apache.mina.core.session.IoSession;
  5 +import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
  6 +import org.apache.mina.filter.codec.ProtocolEncoderOutput;
  7 +
  8 +
  9 +public class MessageEncoder extends ProtocolEncoderAdapter {
  10 +
  11 + @Override
  12 + public void encode(IoSession session, Object message,
  13 + ProtocolEncoderOutput out) throws Exception {
  14 + // TODO Auto-generated method stub
  15 + IoBuffer buf = IoBuffer.allocate(1024).setAutoExpand(true);
  16 + buf.put((byte[])message);
  17 + buf.flip();
  18 + out.write(buf);
  19 + /*if ("true".equals(ConfigUtil.getProperty("protocoldown", "true"))) {
  20 + DownProtocolDataService.getInstance().write((byte[])message);
  21 + }*/
  22 + }
  23 +
  24 +}
src/main/java/com/bsth/data/gpsdata/client/pd/codec/PdMessageCodecFactory.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pd.codec;
  2 +
  3 +import org.apache.mina.core.session.IoSession;
  4 +import org.apache.mina.filter.codec.ProtocolCodecFactory;
  5 +import org.apache.mina.filter.codec.ProtocolDecoder;
  6 +import org.apache.mina.filter.codec.ProtocolEncoder;
  7 +
  8 +public class PdMessageCodecFactory implements ProtocolCodecFactory {
  9 +
  10 + private ProtocolEncoder encoder;
  11 + private ProtocolDecoder decoder;
  12 +
  13 + public PdMessageCodecFactory() {
  14 + encoder = new MessageEncoder();
  15 + decoder = new MessageDecoder();
  16 + }
  17 +
  18 + @Override
  19 + public ProtocolEncoder getEncoder(IoSession session) throws Exception {
  20 + // TODO Auto-generated method stub
  21 + return encoder;
  22 + }
  23 +
  24 + @Override
  25 + public ProtocolDecoder getDecoder(IoSession session) throws Exception {
  26 + // TODO Auto-generated method stub
  27 + return decoder;
  28 + }
  29 +
  30 +}
src/main/java/com/bsth/data/gpsdata/client/pd/common/ConvertUtil.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pd.common;
  2 +
  3 +import com.bsth.data.gpsdata.client.common.ThreadLocalDateUtil;
  4 +import org.slf4j.Logger;
  5 +import org.slf4j.LoggerFactory;
  6 +
  7 +import java.text.ParseException;
  8 +import java.util.Arrays;
  9 +import java.util.Calendar;
  10 +import java.util.Date;
  11 +
  12 +
  13 +public class ConvertUtil {
  14 +
  15 + private final static Logger log = LoggerFactory.getLogger(ConvertUtil.class);
  16 +
  17 + public static int bcd2int(byte[] bytes, int start, int len) {
  18 + if (len > 4 || len == 0)
  19 + throw new IllegalArgumentException("bcd2int 字节数不符合要求");
  20 + String temp = "";
  21 + for (int i = 0;i < len;i++) {
  22 + int val = bytes[start + i] & 0xff;
  23 + if (val < 10) temp += 0;
  24 + temp += Integer.toHexString(val);
  25 + }
  26 + return Integer.parseInt(temp);
  27 + }
  28 +
  29 + public static byte[] int2bcd(int val, int len) {
  30 + if (len > 4 || len == 0)
  31 + throw new IllegalArgumentException("int2bcd 字节数不符合要求");
  32 + byte[] result = new byte[len];
  33 + for (int i = len - 1;i > -1;i--) {
  34 + result[i] = (byte)Integer.parseInt(val%100 + "", 16);
  35 + val = val/100;
  36 + }
  37 + return result;
  38 + }
  39 +
  40 + public static long bcd2long(byte[] bytes, int start, int len) {
  41 + if (len > 8 || len == 0)
  42 + throw new IllegalArgumentException("bcd2long 字节数不符合要求");
  43 + String temp = "";
  44 + for (int i = 0;i < len;i++) {
  45 + int val = bytes[start + i] & 0xff;
  46 + if (val < 10) temp += 0;
  47 + temp += Integer.toHexString(val);
  48 + }
  49 + return Long.parseLong(temp);
  50 + }
  51 +
  52 + public static byte[] long2bcd(long val, int len) {
  53 + if (len > 8 || len == 0)
  54 + throw new IllegalArgumentException("long2bcd 字节数不符合要求");
  55 + byte[] result = new byte[len];
  56 + for (int i = len - 1;i > -1;i--) {
  57 + result[i] = (byte)Integer.parseInt(val%100 + "", 16);
  58 + val = val/100;
  59 + }
  60 + return result;
  61 + }
  62 +
  63 + public static String ascii2string(byte[] bytes, int start, int len) {
  64 + return new String(Arrays.copyOfRange(bytes, start, start + len));
  65 + }
  66 +
  67 + public static byte[] string2ascii(String val, int len) {
  68 + byte[] result = new byte[len];
  69 + byte[] bytes = val.getBytes();
  70 + if (bytes.length > len && len != 0)
  71 + throw new IllegalArgumentException("string2ascii 参数不符合要求");
  72 + if (len != 0)
  73 + for (int i = 0, l = bytes.length;i < l;i++) result[i] = bytes[i];
  74 + else return bytes;
  75 + return result;
  76 + }
  77 +
  78 + public static long bcd2timestamp(byte[] bytes, int start) {
  79 + String temp = "20";
  80 + for (int i = 0;i < 6;i++) {
  81 + int val = bytes[start + i] & 0xff;
  82 + if (val < 10) temp += 0;
  83 + temp += Integer.toHexString(val);
  84 + }
  85 + Date date = null;
  86 + try {
  87 + date = ThreadLocalDateUtil.parse(temp);
  88 + } catch (ParseException e) {
  89 + log.error("协议中时间数据异常:" + temp);
  90 + }
  91 + if (date != null) return date.getTime();
  92 + return -1;
  93 + }
  94 +
  95 + public static byte[] timestamp2bcd(long val) {
  96 + byte[] result = new byte[6];
  97 + Calendar c = Calendar.getInstance();
  98 + c.setTime(new Date(val));
  99 + result[0] = (byte)(Integer.parseInt(c.get(Calendar.YEAR)%100 + "", 16));
  100 + result[1] = (byte)(Integer.parseInt(c.get(Calendar.MONTH) + 1 + "", 16));
  101 + result[2] = (byte)Integer.parseInt(c.get(Calendar.DAY_OF_MONTH) + "", 16);
  102 + result[3] = (byte)Integer.parseInt(c.get(Calendar.HOUR_OF_DAY) + "", 16);
  103 + result[4] = (byte)Integer.parseInt(c.get(Calendar.MINUTE) + "", 16);
  104 + result[5] = (byte)Integer.parseInt(c.get(Calendar.SECOND) + "", 16);
  105 + return result;
  106 + }
  107 +
  108 + public static byte[] int2hex(int val, int len) {
  109 + if (len < 1)
  110 + throw new IllegalArgumentException("int2hex len 参数不符合要求");
  111 + byte[] result = new byte[len];
  112 + for (int i = 0;i < len;i++) {
  113 + result[len - 1 - i] = (byte)(val%100);
  114 + val = val/100;
  115 + }
  116 +
  117 + return result;
  118 + }
  119 +
  120 + public static int bytes2int(byte[] bytes, int start, int len) {
  121 + int val = 0;
  122 + for (int i = 0; i < len; i++) {
  123 + int shift = (len - 1 - i) * 8;
  124 + val += (bytes[start + i] & 0x0000FF) << shift;
  125 + }
  126 +
  127 + return val;
  128 + }
  129 +}
src/main/java/com/bsth/data/gpsdata/client/pd/handler/PdClientHandler.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pd.handler;
  2 +
  3 +import com.bsth.data.gpsdata.client.ClientApp;
  4 +import com.bsth.data.gpsdata.client.GpsBeforeBuffer;
  5 +import com.bsth.data.gpsdata.client.msg.IMessageBody;
  6 +import com.bsth.data.gpsdata.client.pd.protocol.PdMessage;
  7 +import com.bsth.data.gpsdata.client.pd.protocol.Pd_41_0;
  8 +import com.bsth.data.gpsdata.client.pd.protocol.Pd_42_0;
  9 +import org.apache.mina.core.service.IoHandlerAdapter;
  10 +import org.apache.mina.core.session.IdleStatus;
  11 +import org.apache.mina.core.session.IoSession;
  12 +import org.apache.mina.transport.socket.SocketSessionConfig;
  13 +import org.slf4j.Logger;
  14 +import org.slf4j.LoggerFactory;
  15 +import org.springframework.beans.factory.annotation.Autowired;
  16 +import org.springframework.stereotype.Service;
  17 +
  18 +import java.io.IOException;
  19 +
  20 +
  21 +@Service
  22 +public class PdClientHandler extends IoHandlerAdapter{
  23 +
  24 + private final static Logger log = LoggerFactory.getLogger(PdClientHandler.class);
  25 +
  26 + @Autowired
  27 + GpsBeforeBuffer gpsBeforeBuffer;
  28 +
  29 + @Override
  30 + public void sessionCreated(IoSession session) throws Exception {
  31 + SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig();
  32 + cfg.setSoLinger(0);
  33 + }
  34 +
  35 + @Override
  36 + public void sessionOpened(IoSession session) throws Exception {
  37 +
  38 + }
  39 +
  40 + @Override
  41 + public void sessionClosed(IoSession session) throws Exception {
  42 + String deviceId = (String)session.getAttribute("deviceId");
  43 + if (deviceId != null) {
  44 + //SessionManager.getInstance().unregister(deviceId);
  45 + log.info("连网关设备编号:" + deviceId + "断开连接");
  46 + log.warn(deviceId + "网关设备注销");
  47 +
  48 + ClientApp.dconnect(deviceId);
  49 + } else {
  50 + log.info("连网关设备编号:" + deviceId + "断开连接");
  51 + }
  52 + }
  53 +
  54 + @Override
  55 + public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
  56 + session.closeNow();
  57 + }
  58 +
  59 + @Override
  60 + public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
  61 + if (cause instanceof IOException) session.closeNow();
  62 + log.error("PdClientHandler异常:", cause);
  63 + }
  64 +
  65 + @Override
  66 + public void messageReceived(IoSession session, Object message) throws Exception {
  67 + PdMessage msg = (PdMessage)message;
  68 + IMessageBody body = msg.getMessageBody();
  69 + if (body != null) {
  70 + //String deviceId = body.getDeviceId();
  71 + if (0x31 == msg.getCommandType()) {
  72 + //IoSession regSession = SessionManager.getInstance().getSession(deviceId);
  73 + //if (regSession != null) regSession.closeNow();
  74 + //SessionManager.getInstance().register(deviceId, session);
  75 + log.debug("设备编号:" + body.getDeviceId() + "建立连接");
  76 + }
  77 + else if(0x41 == msg.getCommandType()){
  78 + Pd_41_0 pd41 = (Pd_41_0)msg.getMessageBody();
  79 + gpsBeforeBuffer.put(pd41.getInfo());
  80 + }
  81 + else if(0x42 == msg.getCommandType()){
  82 + Pd_42_0 pd42 = (Pd_42_0)msg.getMessageBody();
  83 + gpsBeforeBuffer.put(pd42.getInfo());
  84 + }
  85 + }
  86 + }
  87 +
  88 + @Override
  89 + public void messageSent(IoSession session, Object message) throws Exception {
  90 +
  91 + }
  92 +}
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/BasicInfo.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pd.protocol;
  2 +
  3 +
  4 +import com.bsth.data.gpsdata.client.pd.common.ConvertUtil;
  5 +
  6 +import java.nio.ByteBuffer;
  7 +import java.util.Date;
  8 +
  9 +
  10 +public class BasicInfo {
  11 +
  12 + private int cityCode;
  13 + private short industryCode;
  14 + private short companyCode;
  15 + private String deviceId;
  16 + private int lineId;
  17 + private int driverEmpNo;
  18 + private short carparkSerialNo;
  19 + private String carparkNo;
  20 + private short stopSerialNo;
  21 + private String stopNo;
  22 + // 经度 bcd 5 0121245333表示经度为121度24.5333分
  23 + private long carLon;
  24 + // 维度
  25 + private int carLat;
  26 + private long timestamp;
  27 + // 速度(传感器)bcd 2 保留一位小数 km/h
  28 + private short speedSensor;
  29 + // 速度(gps)bcd 2 保留一位小数 km/h
  30 + private short speedGps;
  31 + // 方向 bcd 2 0-359.5 保留一位小数
  32 + private short direction;
  33 + // 车内温度 bcd 2 第一字节为符号 00为正 01为负 后一字节为温度
  34 + private short inTemp;
  35 + // 营运状态 hex 4高位在前
  36 + // 第一字节位 7 GPS有/无效|6 场外/内|5 起终点站外/内|4 上/下行|3 已知/未知|2站外/站内|1 营运/非营运|0 在线路上/不在
  37 + // 7=1时其它位无效|0=1时3,4,5无效 第二字节6,7无效|3=1时2,4无效 第二字节6,7无效
  38 + // 第二字节位 7 非/标杆点|6 非/中途校时点|5 点/熄火|4 实时/缓存数据|3 门开/关|2 预留|1 非/包车|0预留
  39 + // 1=1时 第一字节0-6无效 6,7无效
  40 + // 后两个字节保留
  41 + private long serviceState;
  42 + // 调控状态
  43 + private long controlState;
  44 + // 累计里程 km 保留两位小数
  45 + private int totalMiles;
  46 + // 水温
  47 + private byte waterTemp;
  48 + // 油耗 (第一个字节 + 第二个字节/10)升/百公里
  49 + private int oilConsumption;
  50 + // 发动机转速 100转/秒
  51 + private int engineSpeed;
  52 + private float lon;
  53 + private float lat;
  54 +
  55 + private boolean inOutStopFlag = false;
  56 +
  57 + public void read(byte[] bytes, int idx) {
  58 + // TODO Auto-generated method stub
  59 + ByteBuffer buf = ByteBuffer.wrap(bytes);
  60 + cityCode = ConvertUtil.bcd2int(bytes, idx, 3); idx += 3;
  61 + industryCode = (short)(bytes[idx] & 0xff); idx++;
  62 + companyCode = (short)(bytes[idx] & 0xff); idx++;
  63 + deviceId = ConvertUtil.ascii2string(bytes, idx, 8); idx += 8;
  64 + lineId = ConvertUtil.bcd2int(bytes, idx, 3); idx += 3;
  65 + driverEmpNo = ConvertUtil.bcd2int(bytes, idx, 4); idx +=4;
  66 + carparkSerialNo = (short)(bytes[idx] & 0xff); idx++;
  67 + carparkNo = ConvertUtil.ascii2string(bytes, idx, 8); idx += 8;
  68 + stopSerialNo = (short)(bytes[idx] & 0xff); idx++;
  69 + stopNo = ConvertUtil.ascii2string(bytes, idx, 8).trim(); idx += 8;
  70 + carLon = ConvertUtil.bcd2long(bytes, idx, 5); lon = (int)(carLon/1000000) + carLon%1000000/600000f; idx += 5;
  71 + carLat = ConvertUtil.bcd2int(bytes, idx, 4); lat = carLat/1000000 + carLat%1000000/600000f; idx += 4;
  72 + timestamp = ConvertUtil.bcd2timestamp(bytes, idx); idx += 6;
  73 + speedSensor = (short)ConvertUtil.bcd2int(bytes, idx, 2); idx += 2;
  74 + speedGps = (short)ConvertUtil.bcd2int(bytes, idx, 2); idx += 2;
  75 + direction = (short)(ConvertUtil.bcd2int(bytes, idx, 2)); idx += 2;
  76 + inTemp = (short)ConvertUtil.bcd2int(bytes, idx, 2); idx += 2;
  77 + serviceState = buf.getInt(idx) & 0xffffffff; idx += 4;
  78 + controlState = buf.getInt(idx) & 0xffffffff; idx += 4;
  79 + totalMiles = ConvertUtil.bcd2int(bytes, idx, 4); idx += 4;
  80 + waterTemp = bytes[idx]; idx++;
  81 + oilConsumption = ConvertUtil.bcd2int(bytes, idx, 4); idx += 4;
  82 + engineSpeed = buf.getShort(idx) & 0xffff; idx += 2;
  83 + }
  84 +
  85 + public byte[] write() {
  86 + ByteBuffer buf = ByteBuffer.allocate(80);
  87 + buf.put(ConvertUtil.int2bcd(cityCode, 3));
  88 + buf.put((byte)industryCode);
  89 + buf.put((byte)companyCode);
  90 + buf.put(ConvertUtil.string2ascii(deviceId, 8));
  91 + buf.put(ConvertUtil.int2bcd(lineId, 3));
  92 + buf.put(ConvertUtil.int2bcd(driverEmpNo, 4));
  93 + buf.put((byte)carparkSerialNo);
  94 + buf.put(ConvertUtil.string2ascii(carparkNo, 8));
  95 + buf.put((byte)stopSerialNo);
  96 + buf.put(ConvertUtil.string2ascii(stopNo, 8));
  97 + buf.put(ConvertUtil.long2bcd(carLon, 5));
  98 + buf.put(ConvertUtil.long2bcd(carLat, 4));
  99 + buf.put(ConvertUtil.timestamp2bcd(timestamp));
  100 + buf.put(ConvertUtil.int2bcd(speedSensor, 2));
  101 + buf.put(ConvertUtil.int2bcd(speedGps, 2));
  102 + buf.put(ConvertUtil.int2bcd(direction, 2));
  103 + buf.put(ConvertUtil.int2bcd(inTemp, 2));
  104 + buf.putInt((int)serviceState);
  105 + buf.putInt((int)controlState);
  106 + buf.put(ConvertUtil.int2bcd(totalMiles, 4));
  107 + buf.put(waterTemp);
  108 + buf.put(ConvertUtil.int2bcd(oilConsumption, 2));
  109 + buf.putShort((short)engineSpeed);
  110 +
  111 + return buf.array();
  112 + }
  113 +
  114 + public String getDeviceId() {
  115 + // TODO Auto-generated method stub
  116 + return deviceId;
  117 + }
  118 +
  119 + public int getCityCode() {
  120 + return cityCode;
  121 + }
  122 +
  123 + public short getIndustryCode() {
  124 + return industryCode;
  125 + }
  126 +
  127 + public short getCompanyCode() {
  128 + return companyCode;
  129 + }
  130 +
  131 + public int getLineId() {
  132 + return lineId;
  133 + }
  134 +
  135 + public int getDriverEmpNo() {
  136 + return driverEmpNo;
  137 + }
  138 +
  139 + public short getCarparkSerialNo() {
  140 + return carparkSerialNo;
  141 + }
  142 +
  143 + public String getCarparkNo() {
  144 + return carparkNo;
  145 + }
  146 +
  147 + public short getStopSerialNo() {
  148 + return stopSerialNo;
  149 + }
  150 +
  151 + public String getStopNo() {
  152 + return stopNo;
  153 + }
  154 +
  155 + public long getCarLon() {
  156 + return carLon;
  157 + }
  158 +
  159 + public int getCarLat() {
  160 + return carLat;
  161 + }
  162 +
  163 + public long getTimestamp() {
  164 + return timestamp;
  165 + }
  166 +
  167 + public short getSpeedSensor() {
  168 + return speedSensor;
  169 + }
  170 +
  171 + public short getSpeedGps() {
  172 + return speedGps;
  173 + }
  174 +
  175 + public short getDirection() {
  176 + return direction;
  177 + }
  178 +
  179 + public short getInTemp() {
  180 + return inTemp;
  181 + }
  182 +
  183 + public long getServiceState() {
  184 + return serviceState;
  185 + }
  186 +
  187 + public long getControlState() {
  188 + return controlState;
  189 + }
  190 +
  191 + public int getTotalMiles() {
  192 + return totalMiles;
  193 + }
  194 +
  195 + public byte getWaterTemp() {
  196 + return waterTemp;
  197 + }
  198 +
  199 + public int getOilConsumption() {
  200 + return oilConsumption;
  201 + }
  202 +
  203 + public int getEngineSpeed() {
  204 + return engineSpeed;
  205 + }
  206 +
  207 + public float getLon() {
  208 + return lon;
  209 + }
  210 +
  211 + public void setLon(float lon) {
  212 + this.lon = lon;
  213 + }
  214 +
  215 + public float getLat() {
  216 + return lat;
  217 + }
  218 +
  219 + public void setLat(float lat) {
  220 + this.lat = lat;
  221 + }
  222 +
  223 + public void setStopNo(String stopNo) {
  224 + this.stopNo = stopNo;
  225 + }
  226 +
  227 + public byte getGpsValid() {
  228 + return (byte)(((serviceState & 0x80000000) == 0x80000000) ? 1 : 0);
  229 + }
  230 +
  231 + /**
  232 + * 获取车辆在场外/内
  233 + * @return -1无效 0场外1场内
  234 + */
  235 + public byte getInOrOutCarpark() {
  236 + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000
  237 + || (serviceState & 0x01000000) == 0x01000000) return -1;
  238 + return (byte)(((serviceState & 0x40000000) == 0x40000000) ? 1 : 0);
  239 + }
  240 +
  241 + public void setInOrOutCarpark(boolean inOutFlag) {
  242 + if (inOutFlag) serviceState |= 0x40000000;
  243 + else serviceState &= 0xbfffffff;
  244 + }
  245 +
  246 + /**
  247 + * 获取车辆在起终点站外/内
  248 + * @return -1无效 0起终点站外1起终点站内
  249 + */
  250 + public byte getInOrOutStartEnd() {
  251 + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000
  252 + || (serviceState & 0x01000000) == 0x01000000) return -1;
  253 + return (byte)(((serviceState & 0x20000000) == 0x20000000) ? 1 : 0);
  254 + }
  255 +
  256 + /**
  257 + * 获取车辆线路上下行
  258 + * @return -1无效 0上行 1下行
  259 + */
  260 + public byte getUpOrDown() {
  261 + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000
  262 + || (serviceState & 0x01000000) == 0x01000000
  263 + || (serviceState & 0x08000000) == 0x08000000) return -1;
  264 + return (byte)(((serviceState & 0x10000000) == 0x10000000) ? 1 : 0);
  265 + }
  266 +
  267 + public void setUpOrDown(boolean upOrDown) {
  268 + if (!upOrDown) serviceState |= 0x10000000;
  269 + else serviceState &= 0xefffffff;
  270 + }
  271 +
  272 + /**
  273 + * 获取车辆在站外/内
  274 + * @return -1无效 0站外 1站内
  275 + */
  276 + public byte getInOrOutStop() {
  277 + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000
  278 + || (serviceState & 0x01000000) == 0x01000000
  279 + || (serviceState & 0x08000000) == 0x08000000) return -1;
  280 + return (byte)(((serviceState & 0x04000000) == 0x04000000) ? 1 : 0);
  281 + }
  282 +
  283 + public void setInOrOutStop(boolean isInOrOutStop) {
  284 + inOutStopFlag = true;
  285 + if (isInOrOutStop) serviceState |= 0x04000000;
  286 + else serviceState &= 0xfbffffff;
  287 + }
  288 +
  289 + /**
  290 + * 获取运营状态
  291 + * @return -1无效 0运营 1未运营
  292 + */
  293 + public byte getService() {
  294 + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000) return -1;
  295 + return (byte)(((serviceState & 0x02000000) == 0x02000000) ? 1 : 0);
  296 + }
  297 +
  298 + public void setService(boolean service) {
  299 + if (!service) serviceState |= 0x02000000;
  300 + else serviceState &= 0xfdffffff;
  301 + }
  302 +
  303 + /**
  304 + * 获得车辆状态
  305 + * @return 0点火 1熄火
  306 + */
  307 + public byte getVehicleState() {
  308 + return (byte)(((serviceState & 0x00200000) == 0x00200000) ? 1 : 0);
  309 + }
  310 +
  311 + public void setInOutStopFlag(boolean inOutStopFlag) {
  312 + this.inOutStopFlag = inOutStopFlag;
  313 + }
  314 +
  315 + public boolean getInOutStopFlag() {
  316 + return inOutStopFlag;
  317 + }
  318 +
  319 + public String toString() {
  320 + Date d = new Date();d.setTime(timestamp);
  321 + StringBuilder sb = new StringBuilder();
  322 + sb.append("城市代码:").append(cityCode)
  323 + .append("行业代码:").append(industryCode)
  324 + .append("公司代码:").append(companyCode)
  325 + .append("设备号:").append(deviceId)
  326 + .append("线路编号:").append(lineId)
  327 + .append("驾驶员工号:").append(driverEmpNo)
  328 + .append("停车场序列号:").append(carparkSerialNo)
  329 + .append("停车场编号:").append(carparkNo)
  330 + .append("站点序列号").append(stopSerialNo)
  331 + .append("站点编号:").append(stopNo)
  332 + .append("经度:").append(carLon)
  333 + .append("维度:").append(carLat)
  334 + .append("时间戳:").append(d)
  335 + .append("速度(传感器):").append(speedSensor)
  336 + .append("速度(gps)").append(speedGps)
  337 + .append("方向:").append(direction)
  338 + .append("车内温度:").append(inTemp)
  339 + .append("营运状态:").append(serviceState)
  340 + .append("调控状态:").append(controlState)
  341 + .append("总里程:").append(totalMiles)
  342 + .append("水温:").append(waterTemp)
  343 + .append("油耗:").append(oilConsumption)
  344 + .append("发动机速度:").append(engineSpeed);
  345 +
  346 + return sb.toString();
  347 + }
  348 + /* ----------------------------------------------------- */
  349 +
  350 + public void setCityCode(int cityCode) {
  351 + this.cityCode = cityCode;
  352 + }
  353 +
  354 + public void setIndustryCode(short industryCode) {
  355 + this.industryCode = industryCode;
  356 + }
  357 +
  358 + public void setCompanyCode(short companyCode) {
  359 + this.companyCode = companyCode;
  360 + }
  361 +
  362 + public void setDeviceId(String deviceId) {
  363 + this.deviceId = deviceId;
  364 + }
  365 +
  366 + public void setLineId(int lineId) {
  367 + this.lineId = lineId;
  368 + }
  369 +
  370 + public void setDriverEmpNo(int driverEmpNo) {
  371 + this.driverEmpNo = driverEmpNo;
  372 + }
  373 +
  374 + public void setCarparkSerialNo(short carparkSerialNo) {
  375 + this.carparkSerialNo = carparkSerialNo;
  376 + }
  377 +
  378 + public void setCarparkNo(String carparkNo) {
  379 + this.carparkNo = carparkNo;
  380 + }
  381 +
  382 + public void setStopSerialNo(short stopSerialNo) {
  383 + this.stopSerialNo = stopSerialNo;
  384 + }
  385 +
  386 + public void setCarLon(long carLon) {
  387 + this.carLon = carLon;
  388 + }
  389 +
  390 + public void setCarLat(int carLat) {
  391 + this.carLat = carLat;
  392 + }
  393 +
  394 + public void setTimestamp(long timestamp) {
  395 + this.timestamp = timestamp;
  396 + }
  397 +
  398 + public void setSpeedSensor(short speedSensor) {
  399 + this.speedSensor = speedSensor;
  400 + }
  401 +
  402 + public void setSpeedGps(short speedGps) {
  403 + this.speedGps = speedGps;
  404 + }
  405 +
  406 + public void setDirection(short direction) {
  407 + this.direction = direction;
  408 + }
  409 +
  410 + public void setInTemp(short inTemp) {
  411 + this.inTemp = inTemp;
  412 + }
  413 +
  414 + public void setServiceState(long serviceState) {
  415 + this.serviceState = serviceState;
  416 + }
  417 +
  418 + public void setControlState(long controlState) {
  419 + this.controlState = controlState;
  420 + }
  421 +
  422 + public void setTotalMiles(int totalMiles) {
  423 + this.totalMiles = totalMiles;
  424 + }
  425 +
  426 + public void setWaterTemp(byte waterTemp) {
  427 + this.waterTemp = waterTemp;
  428 + }
  429 +
  430 + public void setOilConsumption(int oilConsumption) {
  431 + this.oilConsumption = oilConsumption;
  432 + }
  433 +
  434 + public void setEngineSpeed(int engineSpeed) {
  435 + this.engineSpeed = engineSpeed;
  436 + }
  437 +}
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/PdFactory.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pd.protocol;
  2 +
  3 +
  4 +import com.bsth.data.gpsdata.client.msg.IMessageBody;
  5 +
  6 +public class PdFactory {
  7 +
  8 + public static IMessageBody create(int commandType, byte[] data) {
  9 + String pkgName = PdFactory.class.getPackage().getName();
  10 + IMessageBody body = null;
  11 + try {
  12 + Class<?> cls = Class.forName(pkgName + ".Pd_" + Integer.toHexString(commandType).toUpperCase() + "_0");
  13 + body = (IMessageBody)cls.newInstance();
  14 + body.read(data);
  15 + } catch (ClassNotFoundException e) {
  16 + // TODO Auto-generated catch block
  17 + //e.printStackTrace();
  18 + } catch (InstantiationException e) {
  19 + // TODO Auto-generated catch block
  20 + e.printStackTrace();
  21 + } catch (IllegalAccessException e) {
  22 + // TODO Auto-generated catch block
  23 + e.printStackTrace();
  24 + }
  25 + return body;
  26 + }
  27 +}
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/PdMessage.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pd.protocol;
  2 +
  3 +
  4 +import com.bsth.data.gpsdata.client.msg.IMessage;
  5 +import com.bsth.data.gpsdata.client.msg.IMessageBody;
  6 +
  7 +import java.nio.ByteBuffer;
  8 +import java.util.Arrays;
  9 +
  10 +public class PdMessage implements IMessage {
  11 +
  12 + private short version;
  13 + private short serialNo;
  14 + private short commandType;
  15 + private IMessageBody messageBody;
  16 + private byte checkSum;
  17 +
  18 + public short getVersion() {
  19 + return version;
  20 + }
  21 +
  22 + public void setVersion(short version) {
  23 + this.version = version;
  24 + }
  25 +
  26 + public short getSerialNo() {
  27 + return serialNo;
  28 + }
  29 +
  30 + public void setSerialNo(short serialNo) {
  31 + this.serialNo = serialNo;
  32 + }
  33 +
  34 + public short getCommandType() {
  35 + return commandType;
  36 + }
  37 +
  38 + public void setCommandType(short commandType) {
  39 + this.commandType = commandType;
  40 + }
  41 +
  42 + public IMessageBody getMessageBody() {
  43 + return messageBody;
  44 + }
  45 +
  46 + public void setMessageBody(IMessageBody messageBody) {
  47 + this.messageBody = messageBody;
  48 + }
  49 +
  50 + public byte getCheckSum() {
  51 + return checkSum;
  52 + }
  53 +
  54 + public void setCheckSum(byte checkSum) {
  55 + this.checkSum = checkSum;
  56 + }
  57 +
  58 + public void read(byte[] data) {
  59 + int idx = 0, len = data.length;
  60 + version = (short)(data[idx] & 0xff); idx++;
  61 + serialNo = (short)(data[idx] & 0xff); idx++;
  62 + commandType = (short)(data[idx] & 0xff); idx++;
  63 + byte[] temp = Arrays.copyOfRange(data, idx, len - 1);
  64 + checkSum = data[len - 1];
  65 + byte sum = 0;
  66 + for (int i = 0;i < len - 1;i++) {
  67 + sum += data[i];
  68 + }
  69 + if (sum == checkSum) {
  70 + messageBody = PdFactory.create(commandType, temp);
  71 + }
  72 + }
  73 +
  74 + public byte[] write() {
  75 + byte[] bytes = messageBody.write();
  76 + ByteBuffer buf = ByteBuffer.allocate(bytes.length + 8);
  77 + buf.put(new byte[] { (byte)0xfa, (byte)0xf5 });
  78 + buf.putShort((short)(bytes.length + 3));
  79 + buf.put((byte)version);
  80 + buf.put((byte)serialNo);
  81 + buf.put((byte)commandType);
  82 + buf.put(bytes);
  83 + checkSum = 0;
  84 + checkSum += (byte)version;
  85 + checkSum += (byte)serialNo;
  86 + checkSum += (byte)commandType;
  87 + for (byte b : bytes) {
  88 + checkSum += b;
  89 + }
  90 + buf.put(checkSum);
  91 + return buf.array();
  92 + }
  93 +
  94 + public String toString() {
  95 + StringBuilder sb = new StringBuilder();
  96 + sb.append("报文版本号:").append(version)
  97 + .append("报文序列号:").append(serialNo)
  98 + .append("报文命令字:0x").append(Integer.toHexString(commandType))
  99 + .append("报文主体:(").append(messageBody).append(")")
  100 + .append("报文校验和:").append(checkSum);
  101 +
  102 + return sb.toString();
  103 + }
  104 +}
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/Pd_31_0.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pd.protocol;
  2 +
  3 +
  4 +import com.bsth.data.gpsdata.client.msg.IMessageBody;
  5 +import com.bsth.data.gpsdata.client.pd.common.ConvertUtil;
  6 +
  7 +import java.nio.ByteBuffer;
  8 +import java.util.Date;
  9 +
  10 +
  11 +public class Pd_31_0 implements IMessageBody {
  12 +
  13 + // bcd 1
  14 + private short funCode;
  15 + // bcd 3
  16 + private int lineId;
  17 + // ascii 8
  18 + private String deviceId;
  19 + // bcd 6 yyMMddhhmmss
  20 + private long timestamp;
  21 + // hex 8
  22 + private String reserved;
  23 +
  24 + @Override
  25 + public void read(byte[] bytes) {
  26 + // TODO Auto-generated method stub
  27 + int idx = 0;
  28 + funCode = (short)(bytes[idx] & 0xff);idx++;
  29 + lineId = ConvertUtil.bcd2int(bytes, idx, 3);idx += 3;
  30 + deviceId = ConvertUtil.ascii2string(bytes, idx, 8);idx += 8;
  31 + timestamp = ConvertUtil.bcd2timestamp(bytes, idx);idx += 6;
  32 + reserved = ConvertUtil.ascii2string(bytes, idx, 8);idx += 8;
  33 + }
  34 +
  35 + @Override
  36 + public byte[] write() {
  37 + // TODO Auto-generated method stub
  38 + ByteBuffer buf = ByteBuffer.allocate(26);
  39 + buf.put((byte)funCode);
  40 + buf.put(ConvertUtil.int2bcd(lineId, 3));
  41 + buf.put(deviceId.getBytes());
  42 + buf.put(ConvertUtil.timestamp2bcd(timestamp));
  43 + buf.put(new byte[]{0,0,0,0,0,0,0,0});
  44 + return buf.array();
  45 + }
  46 +
  47 + public short getFunCode() {
  48 + return funCode;
  49 + }
  50 +
  51 + public int getLineId() {
  52 + return lineId;
  53 + }
  54 +
  55 + public String getDeviceId() {
  56 + return deviceId;
  57 + }
  58 +
  59 + public long getTimestamp() {
  60 + return timestamp;
  61 + }
  62 +
  63 + public String getReserved() {
  64 + return reserved;
  65 + }
  66 +
  67 + public void setFunCode(short funCode) {
  68 + this.funCode = funCode;
  69 + }
  70 +
  71 + public void setLineId(int lineId) {
  72 + this.lineId = lineId;
  73 + }
  74 +
  75 + public void setDeviceId(String deviceId) {
  76 + this.deviceId = deviceId;
  77 + }
  78 +
  79 + public void setTimeStamp(long timestamp) {
  80 + this.timestamp = timestamp;
  81 + }
  82 +
  83 + public void setReserved(String reserved) {
  84 + this.reserved = reserved;
  85 + }
  86 +
  87 + public String toString() {
  88 + Date d = new Date();
  89 + d.setTime(timestamp);
  90 + StringBuilder sb = new StringBuilder();
  91 + sb.append("功能号:").append(Integer.toHexString(funCode))
  92 + .append("线路编号:").append(lineId)
  93 + .append("设备编号:").append(deviceId)
  94 + .append("时间戳:").append(d);
  95 + return sb.toString();
  96 + }
  97 +}
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/Pd_41_0.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pd.protocol;
  2 +
  3 +
  4 +import com.bsth.data.gpsdata.client.msg.IMessageBody;
  5 +import com.bsth.data.gpsdata.client.pd.common.ConvertUtil;
  6 +
  7 +import java.nio.ByteBuffer;
  8 +
  9 +
  10 +public class Pd_41_0 implements IMessageBody {
  11 +
  12 + private BasicInfo info;
  13 + private short leaveStopDis;
  14 +
  15 + public BasicInfo getInfo() {
  16 + return info;
  17 + }
  18 +
  19 + public void setInfo(BasicInfo info) {
  20 + this.info = info;
  21 + }
  22 +
  23 + public short getLeaveStopDis() {
  24 + return leaveStopDis;
  25 + }
  26 +
  27 + public void setLeaveStopDis(short leaveStopDis) {
  28 + this.leaveStopDis = leaveStopDis;
  29 + }
  30 +
  31 + @Override
  32 + public void read(byte[] bytes) {
  33 + // TODO Auto-generated method stub
  34 + int idx = 0;
  35 + info = new BasicInfo();
  36 + info.read(bytes, idx); idx += 80;
  37 + leaveStopDis = (short) ConvertUtil.bcd2int(bytes, idx, 2); idx += 2;
  38 + }
  39 +
  40 + @Override
  41 + public byte[] write() {
  42 + // TODO Auto-generated method stub
  43 + ByteBuffer buf = ByteBuffer.allocate(82);
  44 + buf.put(info.write());
  45 + buf.put(ConvertUtil.int2bcd(leaveStopDis, 2));
  46 +
  47 + return buf.array();
  48 + }
  49 +
  50 + @Override
  51 + public String getDeviceId() {
  52 + // TODO Auto-generated method stub
  53 + return info.getDeviceId();
  54 + }
  55 +
  56 + public String toString() {
  57 + StringBuilder sb = new StringBuilder();
  58 + sb.append("基本数据:").append(info.toString())
  59 + .append("离站距离:").append(leaveStopDis);
  60 +
  61 + return sb.toString();
  62 + }
  63 +
  64 + @Override
  65 + public long getTimestamp() {
  66 + // TODO Auto-generated method stub
  67 + return info.getTimestamp();
  68 + }
  69 +}
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/Pd_42_0.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pd.protocol;
  2 +
  3 +import com.bsth.data.gpsdata.client.msg.IMessageBody;
  4 +import com.bsth.data.gpsdata.client.pd.common.ConvertUtil;
  5 +
  6 +import java.nio.ByteBuffer;
  7 +
  8 +public class Pd_42_0 implements IMessageBody {
  9 +
  10 + private BasicInfo info;
  11 + // 站间里程 保留两位小数 km
  12 + private short stopBetMiles;
  13 + private short frontDoorUp;
  14 + private short frontDoorDown;
  15 + private short backDoorUp;
  16 + private short backDoorDown;
  17 + // 本站留车人数
  18 + private int stay;
  19 + // 本站刷卡次数
  20 + private short cardCount;
  21 + // 本站刷卡金额
  22 + private int cardMoney;
  23 + // 免费刷卡次数
  24 + private short freeCardCount;
  25 + // 免费刷卡金额
  26 + private int freeCardMoney;
  27 + // 总刷卡次数
  28 + private int totalCardCount;
  29 + // 总数卡金额
  30 + private long totalCardMoney;
  31 + // 总免费刷卡次数
  32 + private int totalFreeCardCount;
  33 + // 总免费刷卡金额
  34 + private long totalFreeCardMoney;
  35 + // 客流站号
  36 + private short passengerStopNo;
  37 +
  38 + @Override
  39 + public void read(byte[] bytes) {
  40 + // TODO Auto-generated method stub
  41 + ByteBuffer buf = ByteBuffer.wrap(bytes);
  42 + int idx = 0;
  43 + info = new BasicInfo();
  44 + info.read(bytes, idx); idx += 80;
  45 + stopBetMiles = (short) ConvertUtil.bcd2int(bytes, idx, 2); idx += 2;
  46 + frontDoorUp = (short)(buf.get(idx) & 0xff); idx++;
  47 + frontDoorDown = (short)(buf.get(idx) & 0xff); idx++;
  48 + backDoorUp = (short)(buf.get(idx) & 0xff); idx++;
  49 + backDoorDown = (short)(buf.get(idx) & 0xff); idx++;
  50 + stay = buf.getShort(idx) & 0xffff; idx += 2;
  51 + cardCount = (short)(buf.get(idx) & 0xff); idx++;
  52 + cardMoney = buf.getShort(idx) & 0xffff; idx += 2;
  53 + freeCardCount = (short)(buf.get(idx) & 0xff); idx++;
  54 + freeCardMoney = buf.getShort(idx) & 0xffff; idx += 2;
  55 + totalCardCount = buf.getShort(idx) & 0xffff; idx += 2;
  56 + totalCardMoney = buf.getInt(idx) & 0xffffffffl; idx += 4;
  57 + totalFreeCardCount = buf.getShort(idx) & 0xffff; idx += 2;
  58 + totalFreeCardMoney = buf.getInt(idx) & 0xffffffffl; idx += 4;
  59 + passengerStopNo = (short)(buf.get(idx) & 0xff); idx++;
  60 + }
  61 +
  62 + @Override
  63 + public byte[] write() {
  64 + // TODO Auto-generated method stub
  65 + ByteBuffer buf = ByteBuffer.allocate(107);
  66 + buf.put(info.write());
  67 + buf.put(ConvertUtil.int2bcd(stopBetMiles, 2));
  68 + buf.put((byte)frontDoorUp);
  69 + buf.put((byte)frontDoorDown);
  70 + buf.put((byte)backDoorUp);
  71 + buf.put((byte)backDoorDown);
  72 + buf.putShort((short)stay);
  73 + buf.put((byte)cardCount);
  74 + buf.putShort((short)cardMoney);
  75 + buf.put((byte)freeCardCount);
  76 + buf.putShort((short)freeCardMoney);
  77 + buf.putShort((short)totalCardCount);
  78 + buf.putInt((int)totalCardMoney);
  79 + buf.putShort((short)totalFreeCardCount);
  80 + buf.putInt((int)totalFreeCardMoney);
  81 + buf.put((byte)passengerStopNo);
  82 +
  83 + return buf.array();
  84 + }
  85 +
  86 + @Override
  87 + public String getDeviceId() {
  88 + // TODO Auto-generated method stub
  89 + return info.getDeviceId();
  90 + }
  91 +
  92 + public BasicInfo getInfo() {
  93 + return info;
  94 + }
  95 +
  96 + public short getStopBetMiles() {
  97 + return stopBetMiles;
  98 + }
  99 +
  100 + public short getFrontDoorUp() {
  101 + return frontDoorUp;
  102 + }
  103 +
  104 + public short getFrontDoorDown() {
  105 + return frontDoorDown;
  106 + }
  107 +
  108 + public short getBackDoorUp() {
  109 + return backDoorUp;
  110 + }
  111 +
  112 + public short getBackDoorDown() {
  113 + return backDoorDown;
  114 + }
  115 +
  116 + public int getStay() {
  117 + return stay;
  118 + }
  119 +
  120 + public short getCardCount() {
  121 + return cardCount;
  122 + }
  123 +
  124 + public int getCardMoney() {
  125 + return cardMoney;
  126 + }
  127 +
  128 + public short getFreeCardCount() {
  129 + return freeCardCount;
  130 + }
  131 +
  132 + public int getFreeCardMoney() {
  133 + return freeCardMoney;
  134 + }
  135 +
  136 + public int getTotalCardCount() {
  137 + return totalCardCount;
  138 + }
  139 +
  140 + public long getTotalCardMoney() {
  141 + return totalCardMoney;
  142 + }
  143 +
  144 + public int getTotalFreeCardCount() {
  145 + return totalFreeCardCount;
  146 + }
  147 +
  148 + public long getTotalFreeCardMoney() {
  149 + return totalFreeCardMoney;
  150 + }
  151 +
  152 + public short getPassengerStopNo() {
  153 + return passengerStopNo;
  154 + }
  155 +
  156 + public String toString() {
  157 + StringBuilder sb = new StringBuilder();
  158 + sb.append("基本数据:").append(info.toString())
  159 + .append("站间距离:").append(stopBetMiles)
  160 + .append("前门上客:").append(frontDoorUp)
  161 + .append("前门下客:").append(frontDoorDown)
  162 + .append("后门上客:").append(backDoorUp)
  163 + .append("后门下客:").append(backDoorDown)
  164 + .append("本站留车人数:").append(stay)
  165 + .append("本站刷卡次数:").append(cardCount)
  166 + .append("本站刷卡金额:").append(cardMoney)
  167 + .append("免费刷卡次数:").append(freeCardCount)
  168 + .append("免费刷卡金额:").append(freeCardMoney)
  169 + .append("总刷卡次数:").append(totalCardCount)
  170 + .append("总数卡金额:").append(totalCardMoney)
  171 + .append("总免费刷卡次数:").append(totalFreeCardCount)
  172 + .append("总免费刷卡金额:").append(totalFreeCardMoney)
  173 + .append("客流站号:").append(passengerStopNo);
  174 +
  175 + return sb.toString();
  176 + }
  177 +
  178 + @Override
  179 + public long getTimestamp() {
  180 + // TODO Auto-generated method stub
  181 + return info.getTimestamp();
  182 + }
  183 +}
src/main/java/com/bsth/data/gpsdata/client/pf/codec/MessageDecoder.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pf.codec;
  2 +
  3 +import com.bsth.data.gpsdata.client.pf.protocol.PfMessage;
  4 +import org.apache.mina.core.buffer.IoBuffer;
  5 +import org.apache.mina.core.session.IoSession;
  6 +import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
  7 +import org.apache.mina.filter.codec.ProtocolDecoderOutput;
  8 +
  9 +
  10 +public class MessageDecoder extends CumulativeProtocolDecoder {
  11 +
  12 + @Override
  13 + protected boolean doDecode(IoSession session, IoBuffer in,
  14 + ProtocolDecoderOutput out) throws Exception {
  15 + // TODO Auto-generated method stub
  16 + while (in.remaining() > 3) {
  17 + in.mark();
  18 + byte head1 = in.get(), head2 = in.get(), lenh = in.get(), lenl = in.get();
  19 + int len = ((lenh & 0xff) << 8) + (lenl & 0xff);
  20 + if ((head1 & 0xff) == 0xfa && (head2 & 0xff) == 0xf5) {
  21 + if (in.remaining() > len) {
  22 + byte[] bytes = new byte[len + 1];
  23 + in.get(bytes);
  24 + PfMessage msg = new PfMessage();
  25 + msg.read(bytes);
  26 + out.write(msg);
  27 + } else {
  28 + in.reset();
  29 + return false;
  30 + }
  31 + }
  32 + }
  33 + return false;
  34 + }
  35 +
  36 + /*private static String toHexString(byte[] bytes) {
  37 + StringBuilder sb = new StringBuilder();
  38 + for (byte b : bytes) {
  39 + sb.append(Integer.toHexString(b & 0xff) + "|");
  40 + }
  41 + return sb.toString();
  42 + }*/
  43 +}
src/main/java/com/bsth/data/gpsdata/client/pf/codec/MessageEncoder.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pf.codec;
  2 +
  3 +import org.apache.mina.core.buffer.IoBuffer;
  4 +import org.apache.mina.core.session.IoSession;
  5 +import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
  6 +import org.apache.mina.filter.codec.ProtocolEncoderOutput;
  7 +
  8 +public class MessageEncoder extends ProtocolEncoderAdapter {
  9 +
  10 + @Override
  11 + public void encode(IoSession session, Object message,
  12 + ProtocolEncoderOutput out) throws Exception {
  13 + // TODO Auto-generated method stub
  14 + IoBuffer buf = IoBuffer.allocate(1024).setAutoExpand(true);
  15 + buf.put((byte[])message);
  16 + buf.flip();
  17 + out.write(buf);
  18 + }
  19 +
  20 +}
src/main/java/com/bsth/data/gpsdata/client/pf/codec/PfMessageCodecFactory.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pf.codec;
  2 +
  3 +import org.apache.mina.core.session.IoSession;
  4 +import org.apache.mina.filter.codec.ProtocolCodecFactory;
  5 +import org.apache.mina.filter.codec.ProtocolDecoder;
  6 +import org.apache.mina.filter.codec.ProtocolEncoder;
  7 +
  8 +public class PfMessageCodecFactory implements ProtocolCodecFactory {
  9 +
  10 + private ProtocolEncoder encoder;
  11 + private ProtocolDecoder decoder;
  12 +
  13 + public PfMessageCodecFactory() {
  14 + encoder = new MessageEncoder();
  15 + decoder = new MessageDecoder();
  16 + }
  17 +
  18 + @Override
  19 + public ProtocolEncoder getEncoder(IoSession session) throws Exception {
  20 + // TODO Auto-generated method stub
  21 + return encoder;
  22 + }
  23 +
  24 + @Override
  25 + public ProtocolDecoder getDecoder(IoSession session) throws Exception {
  26 + // TODO Auto-generated method stub
  27 + return decoder;
  28 + }
  29 +
  30 +}
src/main/java/com/bsth/data/gpsdata/client/pf/common/ConvertUtil.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pf.common;
  2 +
  3 +import com.bsth.data.gpsdata.client.common.ThreadLocalDateUtil;
  4 +import org.slf4j.Logger;
  5 +import org.slf4j.LoggerFactory;
  6 +
  7 +import java.text.ParseException;
  8 +import java.util.Arrays;
  9 +import java.util.Calendar;
  10 +import java.util.Date;
  11 +
  12 +
  13 +public class ConvertUtil {
  14 +
  15 + private final static Logger log = LoggerFactory.getLogger(ConvertUtil.class);
  16 +
  17 + public static int bcd2int(byte[] bytes, int start, int len) {
  18 + if (len > 4 || len == 0)
  19 + throw new IllegalArgumentException("bcd2int 字节数不符合要求");
  20 + String temp = "";
  21 + for (int i = 0;i < len;i++) {
  22 + int val = bytes[start + i] & 0xff;
  23 + if (val < 10) temp += 0;
  24 + temp += Integer.toHexString(val);
  25 + }
  26 + return Integer.parseInt(temp);
  27 + }
  28 +
  29 + public static byte[] int2bcd(int val, int len) {
  30 + if (len > 4 || len == 0)
  31 + throw new IllegalArgumentException("int2bcd 字节数不符合要求");
  32 + byte[] result = new byte[len];
  33 + for (int i = len - 1;i > -1;i--) {
  34 + result[i] = (byte)Integer.parseInt(val%100 + "", 16);
  35 + val = val/100;
  36 + }
  37 + return result;
  38 + }
  39 +
  40 + public static long bcd2long(byte[] bytes, int start, int len) {
  41 + if (len > 8 || len == 0)
  42 + throw new IllegalArgumentException("bcd2long 字节数不符合要求");
  43 + String temp = "";
  44 + for (int i = 0;i < len;i++) {
  45 + int val = bytes[start + i] & 0xff;
  46 + if (val < 10) temp += 0;
  47 + temp += Integer.toHexString(val);
  48 + }
  49 + return Long.parseLong(temp);
  50 + }
  51 +
  52 + public static byte[] long2bcd(long val, int len) {
  53 + if (len > 8 || len == 0)
  54 + throw new IllegalArgumentException("long2bcd 字节数不符合要求");
  55 + byte[] result = new byte[len];
  56 + for (int i = len - 1;i > -1;i--) {
  57 + result[i] = (byte)Integer.parseInt(val%100 + "", 16);
  58 + val = val/100;
  59 + }
  60 + return result;
  61 + }
  62 +
  63 + public static String ascii2string(byte[] bytes, int start, int len) {
  64 + return new String(Arrays.copyOfRange(bytes, start, start + len));
  65 + }
  66 +
  67 + public static byte[] string2ascii(String val, int len) {
  68 + byte[] result = new byte[len];
  69 + byte[] bytes = val.getBytes();
  70 + if (bytes.length > len && len != 0)
  71 + throw new IllegalArgumentException("string2ascii 参数不符合要求");
  72 + if (len != 0)
  73 + for (int i = 0, l = bytes.length;i < l;i++) result[i] = bytes[i];
  74 + else return bytes;
  75 + return result;
  76 + }
  77 +
  78 + public static long bcd2timestamp(byte[] bytes, int start) {
  79 + String temp = "20";
  80 + for (int i = 0;i < 6;i++) {
  81 + int val = bytes[start + i] & 0xff;
  82 + if (val < 10) temp += 0;
  83 + temp += Integer.toHexString(val);
  84 + }
  85 + Date date = null;
  86 + try {
  87 + date = ThreadLocalDateUtil.parse(temp);
  88 + } catch (ParseException e) {
  89 + log.error("协议中时间数据异常:" + temp);
  90 + }
  91 + if (date != null) return date.getTime();
  92 + return -1;
  93 + }
  94 +
  95 + public static byte[] timestamp2bcd(long val) {
  96 + byte[] result = new byte[6];
  97 + Calendar c = Calendar.getInstance();
  98 + c.setTime(new Date(val));
  99 + result[0] = (byte)(Integer.parseInt(c.get(Calendar.YEAR)%100 + "", 16));
  100 + result[1] = (byte)(Integer.parseInt(c.get(Calendar.MONTH) + 1 + "", 16));
  101 + result[2] = (byte)Integer.parseInt(c.get(Calendar.DAY_OF_MONTH) + "", 16);
  102 + result[3] = (byte)Integer.parseInt(c.get(Calendar.HOUR_OF_DAY) + "", 16);
  103 + result[4] = (byte)Integer.parseInt(c.get(Calendar.MINUTE) + "", 16);
  104 + result[5] = (byte)Integer.parseInt(c.get(Calendar.SECOND) + "", 16);
  105 + return result;
  106 + }
  107 +
  108 + public static byte[] int2hex(int val, int len) {
  109 + if (len < 1)
  110 + throw new IllegalArgumentException("int2hex len 参数不符合要求");
  111 + byte[] result = new byte[len];
  112 + for (int i = 0;i < len;i++) {
  113 + result[len - 1 - i] = (byte)(val%100);
  114 + val = val/100;
  115 + }
  116 +
  117 + return result;
  118 + }
  119 +}
src/main/java/com/bsth/data/gpsdata/client/pf/handler/PfClientHandler.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pf.handler;
  2 +
  3 +import com.bsth.data.gpsdata.client.ClientApp;
  4 +import com.bsth.data.gpsdata.client.GpsBeforeBuffer;
  5 +import com.bsth.data.gpsdata.client.common.Protocol2BizUtil;
  6 +import com.bsth.data.gpsdata.client.msg.IMessageBody;
  7 +import com.bsth.data.gpsdata.client.pd.protocol.BasicInfo;
  8 +import com.bsth.data.gpsdata.client.pf.protocol.PfMessage;
  9 +import org.apache.mina.core.service.IoHandlerAdapter;
  10 +import org.apache.mina.core.session.IdleStatus;
  11 +import org.apache.mina.core.session.IoSession;
  12 +import org.slf4j.Logger;
  13 +import org.slf4j.LoggerFactory;
  14 +import org.springframework.beans.factory.annotation.Autowired;
  15 +import org.springframework.stereotype.Service;
  16 +
  17 +import java.io.IOException;
  18 +
  19 +@Service
  20 +public class PfClientHandler extends IoHandlerAdapter{
  21 +
  22 + private final static Logger log = LoggerFactory.getLogger(PfClientHandler.class);
  23 +
  24 + //@Autowired
  25 + //private MessageProcessor processor;
  26 +
  27 + @Autowired
  28 + GpsBeforeBuffer gpsBeforeBuffer;
  29 +
  30 + @Override
  31 + public void sessionCreated(IoSession session) throws Exception {
  32 +
  33 + }
  34 +
  35 + @Override
  36 + public void sessionOpened(IoSession session) throws Exception {
  37 +
  38 + }
  39 +
  40 + @Override
  41 + public void sessionClosed(IoSession session) throws Exception {
  42 + String deviceId = (String)session.getAttribute("deviceId");
  43 + if (deviceId != null) {
  44 + //SessionManager.getInstance().unregister(deviceId);
  45 + log.info("连老网关设备编号:" + deviceId + "断开连接");
  46 + log.warn(deviceId + "老网关设备注销");
  47 + ClientApp.fconnect(deviceId);
  48 + }
  49 + }
  50 +
  51 + @Override
  52 + public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
  53 + session.closeNow();
  54 + }
  55 +
  56 + @Override
  57 + public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
  58 + if (cause instanceof IOException) session.closeNow();
  59 + log.error("PfClientHandler exceptionCaught", cause);
  60 + }
  61 +
  62 + @Override
  63 + public void messageReceived(IoSession session, Object message) throws Exception {
  64 + PfMessage msg = (PfMessage)message;
  65 + IMessageBody body = msg.getMessageBody();
  66 + if (body != null) {
  67 + String deviceId = body.getDeviceId();
  68 + if (0x1 == msg.getCommandType()) {
  69 + log.debug("设备编号:" + body.getDeviceId() + "建立连接");
  70 + }
  71 +
  72 + BasicInfo info = Protocol2BizUtil.getBasicInfoFromMsg(msg);
  73 + gpsBeforeBuffer.put(info);
  74 + }
  75 +
  76 + }
  77 +
  78 + @Override
  79 + public void messageSent(IoSession session, Object message) throws Exception {
  80 +
  81 + }
  82 +}
src/main/java/com/bsth/data/gpsdata/client/pf/protocol/PfFactory.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pf.protocol;
  2 +
  3 +
  4 +import com.bsth.data.gpsdata.client.msg.IMessageBody;
  5 +
  6 +public class PfFactory {
  7 +
  8 + public static IMessageBody create(int commandType, byte[] data) {
  9 + String pkgName = PfFactory.class.getPackage().getName();
  10 + IMessageBody body = null;
  11 + try {
  12 + Class<?> cls = Class.forName(pkgName + ".Pf_" + Integer.toHexString(commandType).toUpperCase() + "_0");
  13 + body = (IMessageBody)cls.newInstance();
  14 + body.read(data);
  15 + } catch (ClassNotFoundException e) {
  16 + // TODO Auto-generated catch block
  17 + //e.printStackTrace();
  18 + } catch (InstantiationException e) {
  19 + // TODO Auto-generated catch block
  20 + e.printStackTrace();
  21 + } catch (IllegalAccessException e) {
  22 + // TODO Auto-generated catch block
  23 + e.printStackTrace();
  24 + }
  25 + return body;
  26 + }
  27 +}
src/main/java/com/bsth/data/gpsdata/client/pf/protocol/PfMessage.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pf.protocol;
  2 +
  3 +import com.bsth.data.gpsdata.client.msg.IMessage;
  4 +import com.bsth.data.gpsdata.client.msg.IMessageBody;
  5 +
  6 +import java.util.Arrays;
  7 +
  8 +public class PfMessage implements IMessage {
  9 +
  10 + private short version;
  11 + private short serialNo;
  12 + private short commandType;
  13 + private IMessageBody messageBody;
  14 + private byte checkSum;
  15 +
  16 + public short getVersion() {
  17 + return version;
  18 + }
  19 +
  20 + public void setVersion(short version) {
  21 + this.version = version;
  22 + }
  23 +
  24 + public short getSerialNo() {
  25 + return serialNo;
  26 + }
  27 +
  28 + public void setSerialNo(short serialNo) {
  29 + this.serialNo = serialNo;
  30 + }
  31 +
  32 + public short getCommandType() {
  33 + return commandType;
  34 + }
  35 +
  36 + public void setCommandType(short commandType) {
  37 + this.commandType = commandType;
  38 + }
  39 +
  40 + public IMessageBody getMessageBody() {
  41 + return messageBody;
  42 + }
  43 +
  44 + public void setMessageBody(IMessageBody messageBody) {
  45 + this.messageBody = messageBody;
  46 + }
  47 +
  48 + public byte getCheckSum() {
  49 + return checkSum;
  50 + }
  51 +
  52 + public void setCheckSum(byte checkSum) {
  53 + this.checkSum = checkSum;
  54 + }
  55 +
  56 + public void read(byte[] data) {
  57 + int idx = 0, len = data.length;
  58 + //version = (short)(data[idx] & 0xff); idx++;
  59 + //serialNo = (short)(data[idx] & 0xff); idx++;
  60 + commandType = (short)(data[idx] & 0xff); idx++;
  61 + byte[] temp = Arrays.copyOfRange(data, idx, len - 1);
  62 + checkSum = data[len - 1];
  63 + if (0xff == (checkSum & 0xff)) {
  64 + try {
  65 + messageBody = PfFactory.create(commandType, temp);
  66 + } catch (Exception e) {
  67 +
  68 + }
  69 + }
  70 + }
  71 +
  72 + public byte[] write() {
  73 + return null;
  74 + }
  75 +
  76 + public String toString() {
  77 + StringBuilder sb = new StringBuilder();
  78 + //sb.append("报文版本号:").append(version)
  79 + //.append("报文序列号:").append(serialNo)
  80 + sb.append("报文命令字:0x").append(Integer.toHexString(commandType))
  81 + .append("报文主体:(").append(messageBody).append(")")
  82 + .append("报文校验和:").append(checkSum);
  83 +
  84 + return sb.toString();
  85 + }
  86 +}
src/main/java/com/bsth/data/gpsdata/client/pf/protocol/Pf_1_0.java 0 → 100644
  1 +package com.bsth.data.gpsdata.client.pf.protocol;
  2 +
  3 +import com.bsth.data.gpsdata.client.msg.IMessageBody;
  4 +import com.bsth.data.gpsdata.client.pd.common.ConvertUtil;
  5 +
  6 +import java.nio.ByteBuffer;
  7 +import java.util.Date;
  8 +
  9 +
  10 +public class Pf_1_0 implements IMessageBody {
  11 +
  12 + /** 1、车载终端识别码-byte[8] */
  13 + private String mtd;
  14 + /** 2、司机工号-byte[8] */
  15 + private String driver;
  16 + /** 3、包车状态-byte[1] */
  17 + private int bczt;
  18 + /** 4、线路状态-byte[1] */
  19 + private int xlzt;
  20 + /** 5、线路代码-byte[6] */
  21 + private int xldm;
  22 + /** 6、营运状态-byte[1] */
  23 + private int yyzt;
  24 + /** 7、进出站状态-byte[1] */
  25 + private int jczzt;
  26 + /** 8、站点编号-byte[8] */
  27 + private String zdbh;
  28 + /** 9、进出停车场状态(0:厂内,1:厂外,2:未知)-byte[1] */
  29 + private int jctcczt;
  30 + /** 10、停车场编号-byte[8] */
  31 + private String tccbh;
  32 + /** 11、路段编码-byte[12] */
  33 + private String ldbh;
  34 + /** 12、上下行状态-byte[1] */
  35 + private int sxxzt;
  36 + /** 13、速度-byte[1] */
  37 + private int speed;
  38 + /** 14、初始异常状态-byte[1] */
  39 + private int csyczt;
  40 + /** 15、结束异常状态-byte[1] */
  41 + private int jsyczt;
  42 + /** 16、车辆位置经度(纠偏后)-byte[4] */
  43 + private double lon;
  44 + /** 17、车辆位置维度(纠偏后)-byte[4] */
  45 + private double lat;
  46 + /** 18、方向-byte[2] */
  47 + private int fx;
  48 + /** 19、发送时间-byte[4] */
  49 + private Date fssj;
  50 + /** 20、离下站距离-byte[2] */
  51 + private int lxzjl;
  52 + /** 21、本站留车人数-byte[2] */
  53 + private int bzlcrs;
  54 + /** 22、车辆位置经度(未纠偏)-byte[4] */
  55 + private double lon_old;
  56 + /** 23、车辆位置经度(未纠偏)-byte[4] */
  57 + private double lat_old;
  58 + /** 24、城建X坐标 */
  59 + private double x;
  60 + /** 25、城建Y坐标 */
  61 + private double y;
  62 +
  63 + public String getMtd() {
  64 + return mtd;
  65 + }
  66 +
  67 + public void setMtd(String mtd) {
  68 + this.mtd = mtd;
  69 + }
  70 +
  71 + public String getDriver() {
  72 + return driver;
  73 + }
  74 +
  75 + public void setDriver(String driver) {
  76 + this.driver = driver;
  77 + }
  78 +
  79 + public int getBczt() {
  80 + return bczt;
  81 + }
  82 +
  83 + public void setBczt(int bczt) {
  84 + this.bczt = bczt;
  85 + }
  86 +
  87 + public int getXlzt() {
  88 + return xlzt;
  89 + }
  90 +
  91 + public void setXlzt(int xlzt) {
  92 + this.xlzt = xlzt;
  93 + }
  94 +
  95 + public int getXldm() {
  96 + return xldm;
  97 + }
  98 +
  99 + public void setXldm(int xldm) {
  100 + this.xldm = xldm;
  101 + }
  102 +
  103 + public int getYyzt() {
  104 + return yyzt;
  105 + }
  106 +
  107 + public void setYyzt(int yyzt) {
  108 + this.yyzt = yyzt;
  109 + }
  110 +
  111 + public int getJczzt() {
  112 + return jczzt;
  113 + }
  114 +
  115 + public void setJczzt(int jczzt) {
  116 + this.jczzt = jczzt;
  117 + }
  118 +
  119 + public String getZdbh() {
  120 + return zdbh;
  121 + }
  122 +
  123 + public void setZdbh(String zdbh) {
  124 + this.zdbh = zdbh;
  125 + }
  126 +
  127 + public int getJctcczt() {
  128 + return jctcczt;
  129 + }
  130 +
  131 + public void setJctcczt(int jctcczt) {
  132 + this.jctcczt = jctcczt;
  133 + }
  134 +
  135 + public String getTccbh() {
  136 + return tccbh;
  137 + }
  138 +
  139 + public void setTccbh(String tccbh) {
  140 + this.tccbh = tccbh;
  141 + }
  142 +
  143 + public String getLdbh() {
  144 + return ldbh;
  145 + }
  146 +
  147 + public void setLdbh(String ldbh) {
  148 + this.ldbh = ldbh;
  149 + }
  150 +
  151 + public int getSxxzt() {
  152 + return sxxzt;
  153 + }
  154 +
  155 + public void setSxxzt(int sxxzt) {
  156 + this.sxxzt = sxxzt;
  157 + }
  158 +
  159 + public int getSpeed() {
  160 + return speed;
  161 + }
  162 +
  163 + public void setSpeed(int speed) {
  164 + this.speed = speed;
  165 + }
  166 +
  167 + public int getCsyczt() {
  168 + return csyczt;
  169 + }
  170 +
  171 + public void setCsyczt(int csyczt) {
  172 + this.csyczt = csyczt;
  173 + }
  174 +
  175 + public int getJsyczt() {
  176 + return jsyczt;
  177 + }
  178 +
  179 + public void setJsyczt(int jsyczt) {
  180 + this.jsyczt = jsyczt;
  181 + }
  182 +
  183 + public double getLon() {
  184 + return lon;
  185 + }
  186 +
  187 + public void setLon(double lon) {
  188 + this.lon = lon;
  189 + }
  190 +
  191 + public double getLat() {
  192 + return lat;
  193 + }
  194 +
  195 + public void setLat(double lat) {
  196 + this.lat = lat;
  197 + }
  198 +
  199 + public int getFx() {
  200 + return fx;
  201 + }
  202 +
  203 + public void setFx(int fx) {
  204 + this.fx = fx;
  205 + }
  206 +
  207 + public Date getFssj() {
  208 + return fssj;
  209 + }
  210 +
  211 + public void setFssj(Date fssj) {
  212 + this.fssj = fssj;
  213 + }
  214 +
  215 + public int getLxzjl() {
  216 + return lxzjl;
  217 + }
  218 +
  219 + public void setLxzjl(int lxzjl) {
  220 + this.lxzjl = lxzjl;
  221 + }
  222 +
  223 + public int getBzlcrs() {
  224 + return bzlcrs;
  225 + }
  226 +
  227 + public void setBzlcrs(int bzlcrs) {
  228 + this.bzlcrs = bzlcrs;
  229 + }
  230 +
  231 + public double getLon_old() {
  232 + return lon_old;
  233 + }
  234 +
  235 + public void setLon_old(double lon_old) {
  236 + this.lon_old = lon_old;
  237 + }
  238 +
  239 + public double getLat_old() {
  240 + return lat_old;
  241 + }
  242 +
  243 + public void setLat_old(double lat_old) {
  244 + this.lat_old = lat_old;
  245 + }
  246 +
  247 + public double getX() {
  248 + return x;
  249 + }
  250 +
  251 + public void setX(double x) {
  252 + this.x = x;
  253 + }
  254 +
  255 + public double getY() {
  256 + return y;
  257 + }
  258 +
  259 + public void setY(double y) {
  260 + this.y = y;
  261 + }
  262 +
  263 + public byte[] write() {
  264 + return null;
  265 + }
  266 +
  267 + @Override
  268 + public void read(byte[] bytes) {
  269 + // TODO Auto-generated method stub
  270 + int idx = 0;
  271 + ByteBuffer buf = ByteBuffer.wrap(bytes);
  272 + mtd = ConvertUtil.ascii2string(bytes, idx, 8); idx += 8;
  273 + driver = ConvertUtil.ascii2string(bytes, idx, 8); idx += 8;
  274 + bczt = buf.get(idx); idx++;
  275 + xlzt = buf.get(idx); idx++;
  276 + xldm = Integer.parseInt(ConvertUtil.ascii2string(bytes, idx, 6).trim()); idx += 6;
  277 + yyzt = buf.get(idx); idx++;
  278 + jczzt = buf.get(idx); idx++;
  279 + zdbh = ConvertUtil.ascii2string(bytes, idx, 8).trim(); idx += 8;
  280 + jctcczt = buf.get(idx); idx++;
  281 + tccbh = ConvertUtil.ascii2string(bytes, idx, 8); idx += 8;
  282 + ldbh = ConvertUtil.ascii2string(bytes, idx, 12).trim(); idx += 12;
  283 + sxxzt = buf.get(idx); idx++;
  284 + speed = buf.get(idx)*10; idx++;
  285 + csyczt = buf.get(idx); idx++;
  286 + jsyczt = buf.get(idx); idx++;
  287 + byte flagx = buf.get(idx); idx++;
  288 + if (flagx == 0) x = ConvertUtil.bytes2int(bytes, idx, 3)/100.0;
  289 + else x = -ConvertUtil.bytes2int(bytes, idx, 3)/100.0;
  290 + idx += 3;
  291 + byte flagy = buf.get(idx); idx++;
  292 + if (flagy == 0) y = ConvertUtil.bytes2int(bytes, idx, 3)/100.0;
  293 + else y = -ConvertUtil.bytes2int(bytes, idx, 3)/100.0;
  294 + idx += 3;
  295 + fx = buf.getShort(idx)*(short)10; idx += 2;
  296 + fssj = new Date(ConvertUtil.bytes2int(bytes, idx, 4) * 1000L); idx += 4;
  297 + lxzjl = buf.getShort(idx); idx += 2;
  298 + bzlcrs = buf.getShort(idx); idx += 2;
  299 + lon = ConvertUtil.bytes2int(bytes, idx, 4); idx += 4;
  300 + lat = ConvertUtil.bytes2int(bytes, idx, 4); idx += 4;
  301 + }
  302 +
  303 + @Override
  304 + public String getDeviceId() {
  305 + // TODO Auto-generated method stub
  306 + return mtd;
  307 + }
  308 +
  309 + @Override
  310 + public long getTimestamp() {
  311 + // TODO Auto-generated method stub
  312 + return 0;
  313 + }
  314 +}
src/main/java/com/bsth/data/gpsdata/recovery/GpsDataRecovery.java
@@ -98,7 +98,7 @@ public class GpsDataRecovery implements ApplicationContextAware { @@ -98,7 +98,7 @@ public class GpsDataRecovery implements ApplicationContextAware {
98 gps.setLon(rs.getFloat("LON")); 98 gps.setLon(rs.getFloat("LON"));
99 gps.setLineId(rs.getString("LINE_ID")); 99 gps.setLineId(rs.getString("LINE_ID"));
100 gps.setTimestamp(rs.getLong("TS")); 100 gps.setTimestamp(rs.getLong("TS"));
101 - gps.setUpDown(getUpOrDown(rs.getLong("SERVICE_STATE"))); 101 + gps.setUpDown((byte) getUpOrDown(rs.getLong("SERVICE_STATE")));
102 return gps; 102 return gps;
103 } 103 }
104 }); 104 });
src/main/java/com/bsth/data/match/Arrival2Schedule.java deleted 100644 → 0
1 -package com.bsth.data.match;  
2 -  
3 -import java.util.ArrayList;  
4 -import java.util.Collections;  
5 -import java.util.List;  
6 -import java.util.Set;  
7 -  
8 -import org.joda.time.format.DateTimeFormat;  
9 -import org.joda.time.format.DateTimeFormatter;  
10 -import org.slf4j.Logger;  
11 -import org.slf4j.LoggerFactory;  
12 -import org.springframework.beans.BeansException;  
13 -import org.springframework.context.ApplicationContext;  
14 -import org.springframework.context.ApplicationContextAware;  
15 -import org.springframework.stereotype.Component;  
16 -  
17 -import com.bsth.data.LineConfigData;  
18 -import com.bsth.data.arrival.ArrivalComparator;  
19 -import com.bsth.data.arrival.ArrivalData_GPS;  
20 -import com.bsth.data.arrival.ArrivalEntity;  
21 -import com.bsth.data.schedule.DayOfSchedule;  
22 -import com.bsth.data.schedule.ScheduleComparator;  
23 -import com.bsth.entity.realcontrol.LineConfig;  
24 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
25 -import com.bsth.service.directive.DirectiveService;  
26 -import com.bsth.websocket.handler.SendUtils;  
27 -import com.google.common.collect.ArrayListMultimap;  
28 -  
29 -/**  
30 - *  
31 - * @ClassName: Arrival2Schedule  
32 - * @Description: TODO(到离站数据 和 计划班次进行匹配 注意线程安全!!!!)  
33 - * @author PanZhao  
34 - * @date 2016年8月28日 上午1:13:02  
35 - *  
36 - */  
37 -@Component  
38 -public class Arrival2Schedule implements ApplicationContextAware {  
39 -  
40 - private static DayOfSchedule dayOfSchedule;  
41 - private static SendUtils sendUtils;  
42 - private static DirectiveService directiveService;  
43 - private static LineConfigData lineConfigData;  
44 - private final static int ONE_MINUTE = 1000 * 60;  
45 - //定一个4小时的范围,基本能对正常班次进行容错。主要防止早上停车场GPS飘导致完成晚上的进场班次  
46 - private final static int FOUR_HOURS = 1000 * 60 * 60 * 4;  
47 -  
48 - private static Logger logger = LoggerFactory.getLogger(Arrival2Schedule.class);  
49 -  
50 - private static ArrayListMultimap<String, ExpectArrivalEnd> expectMap = ArrayListMultimap.create();  
51 -  
52 - /**  
53 - *  
54 - * @Title: start  
55 - * @Description: TODO(开始)  
56 - * @param @param cars 需要匹配的车辆集合  
57 - */  
58 - public static void start(Set<String> cars){  
59 -  
60 - for(String car : cars){  
61 - new SchMatchThread(car).start();  
62 - }  
63 - }  
64 -  
65 - public static class SchMatchThread extends Thread{  
66 - String nbbm;  
67 - LineConfig conf;  
68 -  
69 - public SchMatchThread(String nbbm){  
70 - this.nbbm = nbbm;  
71 - }  
72 -  
73 - //排序器  
74 - private ScheduleComparator.FCSJ schComparator = new ScheduleComparator.FCSJ();  
75 - private ArrivalComparator arrComparator = new ArrivalComparator();  
76 - private MatchResultComparator mrComparator = new MatchResultComparator();  
77 -  
78 - private static DateTimeFormatter fmtyyyyMMddHHmm = DateTimeFormat.forPattern("yyyy-MM-ddHH:mm");  
79 -  
80 - @Override  
81 - public void run() {  
82 - //班次列表  
83 - List<ScheduleRealInfo> schList = dayOfSchedule.findByNbbm(nbbm);  
84 - //进出起终点数据  
85 - List<ArrivalEntity> arrList = ArrivalData_GPS.findByNbbm(nbbm);  
86 -  
87 - if(schList.size() == 0 || arrList.size() == 0)  
88 - return;  
89 -  
90 - conf = lineConfigData.get(schList.get(0).getXlBm());  
91 - //排序  
92 - Collections.sort(schList, schComparator);  
93 - Collections.sort(arrList, arrComparator);  
94 - //过滤班次  
95 - schList = matchFilter(schList);  
96 -  
97 - //检查并修正首班出场终点信号,可能会出现走向异常  
98 - correctFirstSignal(schList, arrList);  
99 -  
100 -  
101 - //用实际来匹配计划  
102 - for(ArrivalEntity arr : arrList){  
103 - match(arr, schList);  
104 - }  
105 - }  
106 -  
107 - private void match(ArrivalEntity arr, List<ScheduleRealInfo> schList) {  
108 -  
109 - if(arr.getInOut() == 1)  
110 - matchOut(arr, schList);  
111 - else if(arr.getInOut() == 0)  
112 - matchIn(arr, schList);  
113 - }  
114 -  
115 - private List<ScheduleRealInfo> matchFilter(List<ScheduleRealInfo> schList) {  
116 - List<ScheduleRealInfo> list = new ArrayList<>();  
117 - for(ScheduleRealInfo sch : schList){  
118 - //烂班不匹配  
119 - if(sch.isDestroy())  
120 - continue;  
121 -  
122 - //线路配置出站既出场,并且没有里程的不匹配  
123 - if(conf.getOutConfig()==2 && sch.getBcsj() == null && sch.getJhlc() == null)  
124 - continue;  
125 -  
126 - list.add(sch);  
127 - }  
128 - return list;  
129 - }  
130 -  
131 - private void matchOut(ArrivalEntity arr, List<ScheduleRealInfo> schList){  
132 - if(arr.getFlag() == -1)  
133 - return;  
134 -  
135 - List<MatchResult> mrs = new ArrayList<>();  
136 - ScheduleRealInfo sch;  
137 - MatchResult mr;  
138 - for(int i = 0; i < schList.size(); i ++){  
139 - sch = schList.get(i);  
140 - if(!arr.isTcc() && arr.getUpDown() != Integer.parseInt(sch.getXlDir()))  
141 - continue;  
142 -  
143 - if(!arr.getStopNo().equals(sch.getQdzCode()))  
144 - continue;  
145 -  
146 - //班次有实发时间  
147 - if(sch.getFcsjActualTime() != null){  
148 - //实际发车已经被引用  
149 - if(Math.abs(arr.getTs() - sch.getFcsjActualTime()) < ONE_MINUTE)  
150 - return;  
151 - else  
152 - continue;  
153 - }  
154 - //添加一个匹配结果  
155 - mr = new MatchResult();  
156 - mr.sch = sch;  
157 - mr.ts = arr.getTs();  
158 - mr.diff = arr.getTs() - sch.getFcsjT();  
159 - mr.success = dayOfSchedule.validStartTime(sch, arr.getTs());  
160 -  
161 - if(Math.abs(mr.diff) < FOUR_HOURS && mr.success)  
162 - mrs.add(mr);  
163 - }  
164 -  
165 - if(mrs.size() > 0){  
166 - //排序后的第一个 就是最合适的匹配  
167 - Collections.sort(mrs, mrComparator);  
168 - mr = mrs.get(0);  
169 -  
170 - //漂移判定  
171 - if(driftCheck(mr, arr)){  
172 - carOut(mr);  
173 - }  
174 - }  
175 - }  
176 -  
177 - private void matchIn(ArrivalEntity inArr, List<ScheduleRealInfo> schList){  
178 -  
179 - List<MatchResult> mrs = new ArrayList<>();  
180 - ScheduleRealInfo sch;  
181 - MatchResult mr;  
182 - for(int i = 0; i < schList.size(); i ++){  
183 - sch = schList.get(i);  
184 - if(!inArr.isTcc() && inArr.getUpDown() != Integer.parseInt(sch.getXlDir()))  
185 - continue;  
186 -  
187 - if(!inArr.getStopNo().equals(sch.getZdzCode()))  
188 - continue;  
189 -  
190 - //班次有实达时间  
191 - if(sch.getZdsjActualTime() != null){  
192 - //实际到达已经被引用  
193 - if(Math.abs(inArr.getTs() - sch.getZdsjActualTime()) < ONE_MINUTE)  
194 - return;  
195 - else  
196 - continue;  
197 - }  
198 -  
199 - //添加一个匹配结果  
200 - mr = new MatchResult();  
201 - mr.sch = sch;  
202 - mr.ts = inArr.getTs();  
203 - //班次没有里程和运送时间的  
204 - if(sch.getZdsj() == null){  
205 - if(i < schList.size()-1)  
206 - mr.diff = inArr.getTs() - schList.get(i + 1).getDfsjT();  
207 - else  
208 - mr.diff = inArr.getTs() - sch.getDfsjT();  
209 - }  
210 - else  
211 - mr.diff = inArr.getTs() - sch.getZdsjT();  
212 - mr.success = dayOfSchedule.validEndTime(sch, inArr.getTs());  
213 - if(Math.abs(mr.diff) < FOUR_HOURS && mr.success)  
214 - mrs.add(mr);  
215 - }  
216 -  
217 - if(mrs.size() > 0){  
218 - //排序后的第一个 就是最合适的匹配  
219 - Collections.sort(mrs, mrComparator);  
220 - mr = mrs.get(0);  
221 - carInStop(mr);  
222 - }  
223 - }  
224 -  
225 - /**  
226 - *  
227 - * @Title: carOut  
228 - * @Description: TODO(车辆发出)  
229 - */  
230 - public void carOut(MatchResult mr){  
231 - ScheduleRealInfo sch = mr.sch;  
232 -  
233 - if(!isExpectOut(mr))  
234 - return;  
235 - //设置发车时间  
236 - sch.setFcsjActualAll(mr.ts);  
237 - //通知客户端  
238 - sendUtils.sendFcsj(sch);  
239 - //持久化  
240 - dayOfSchedule.save(sch);  
241 - //车辆当前执行班次  
242 - dayOfSchedule.addExecPlan(sch);  
243 -  
244 - //期望车辆到达的终点  
245 - if(sch.getZdsj() != null)  
246 - expectMap.put(nbbm, ExpectArrivalEnd.getEndInstance(sch, mr.ts));  
247 - }  
248 -  
249 - /**  
250 - *  
251 - * @Title: isExpectOut  
252 - * @Description: TODO(是否是一个期望的出站匹配结果)  
253 - */  
254 - private boolean isExpectOut(MatchResult mr){  
255 - ScheduleRealInfo sch = mr.sch;  
256 - String nbbm = sch.getClZbh();  
257 - if(expectMap.containsKey(nbbm)){  
258 - List<ExpectArrivalEnd> eads = expectMap.get(nbbm);  
259 - for(ExpectArrivalEnd ead : eads){  
260 - if(sch.getQdzCode().equals(ead.getEndStation())  
261 - || mr.ts > ead.getEndTime()){  
262 - expectMap.removeAll(nbbm);  
263 - return true;  
264 - }  
265 - }  
266 - return false;  
267 - }  
268 - return true;  
269 - }  
270 -  
271 - /**  
272 - *  
273 - * @Title: carInStop  
274 - * @Description: TODO(车辆进入终点站)  
275 - */  
276 - public void carInStop(MatchResult mr){  
277 - ScheduleRealInfo sch = mr.sch;  
278 - String nbbm=sch.getClZbh();  
279 - if(!isExpectIn(mr))  
280 - return;  
281 -  
282 - //如果是进停车场,并且实达时间差值大于 30 分钟,并且之前还有未完成班次。  
283 - if(sch.getBcType().equals("in") && Math.abs(mr.diff) > (1000 * 60 * 30)){  
284 - int prve_nen = dayOfSchedule.prveNotExecNum(sch);  
285 - if(prve_nen > 0)  
286 - return;  
287 - }  
288 -  
289 - sch.setZdsjActualAll(mr.ts);  
290 - int doneSum = dayOfSchedule.doneSum(nbbm);  
291 - ScheduleRealInfo next = dayOfSchedule.next(sch);  
292 - if(null != next){  
293 - next.setQdzArrDateSJ(sch.getZdsjActual());  
294 - //下发调度指令  
295 - directiveService.send60Dispatch(next, doneSum, "到站@系统");  
296 -  
297 - //完成“起点既停车场”的进场班次  
298 - if(next.getBcType().equals("in") && next.getJhlc() == null)  
299 - next.setFcsjActualAll(mr.ts);  
300 -  
301 - //套跑 -下发线路切换指令  
302 - if(!next.getXlBm().equals(sch.getXlBm()))  
303 - directiveService.lineChange(nbbm, next.getXlBm(), "套跑@系统");  
304 - }  
305 - else//下发文本指令(已结束运营)  
306 - directiveService.send60Phrase(nbbm, "到达终点 " + sch.getZdzName() + ",已完成当日所有排班。", "系统");  
307 - //通知客户端  
308 - sendUtils.sendZdsj(sch, next, doneSum);  
309 - //持久化  
310 - dayOfSchedule.save(sch);  
311 - logger.info(sch.getClZbh() + "移除正在执行班次," + sch.getFcsj());  
312 - //移除车辆正在执行班次索引  
313 - dayOfSchedule.removeExecPlan(nbbm);  
314 - }  
315 -  
316 - /**  
317 - *  
318 - * @Title: isExpectOut  
319 - * @Description: TODO(是否是一个期望的进站匹配结果)  
320 - */  
321 - private boolean isExpectIn(MatchResult mr){  
322 - ScheduleRealInfo sch = mr.sch;  
323 - String nbbm = sch.getClZbh();  
324 - if(expectMap.containsKey(nbbm)){  
325 - List<ExpectArrivalEnd> eads = expectMap.get(nbbm);  
326 - for(ExpectArrivalEnd ead : eads){  
327 - if(sch.getZdzCode().equals(ead.getEndStation())  
328 - || mr.ts > ead.getEndTime()){  
329 - expectMap.removeAll(nbbm);  
330 - return true;  
331 - }  
332 - }  
333 - return false;  
334 - }  
335 - return true;  
336 - }  
337 -  
338 - /**  
339 - *  
340 - * @Title: correctFirstSignal  
341 - * @Description: TODO(检查并纠正首班出场到离站)  
342 - */  
343 - private final static long TEN_MINUTES = 1000 * 60 * 10;  
344 - private void correctFirstSignal(List<ScheduleRealInfo> schList, List<ArrivalEntity> arrList) {  
345 - ScheduleRealInfo sch = schList.get(0);  
346 - ArrivalEntity arr = arrList.get(0);  
347 -  
348 - //有里程的出场班次才需要纠正  
349 - if(arr.isCorrect() || !sch.getBcType().equals("out") || sch.getJhlc() == null || sch.getBcsj() == null)  
350 - return;  
351 -  
352 - //如果首个进出站信号是出场  
353 - if(arr.isOutTcc() && arrList.size() >= 2)  
354 - arr = arrList.get(1);  
355 - else  
356 - return;  
357 -  
358 - //出场任务 “进终点” 信号才需要纠正  
359 - if(arr.getInOut() != 0)  
360 - return;  
361 -  
362 - //在计划终点之前到达,或者之后10分钟内到达  
363 - if(arr.getTs() < sch.getZdsjT()  
364 - || arr.getTs() - sch.getZdsjT() < TEN_MINUTES){  
365 -  
366 - int upDown = Integer.parseInt(sch.getXlDir());  
367 - //走向不一致,相信班次的走向。纠正进站信号  
368 - if(arr.getUpDown() != upDown  
369 - && arr.getStopName().equals(sch.getZdzName())){  
370 -  
371 -  
372 - String old = arr.toString();  
373 - arr.setUpDown(upDown);  
374 - arr.setStopNo(sch.getZdzCode());  
375 - arr.setCorrect(true);  
376 - arr.setCorrectText(old + " | " + arr.toString());  
377 -  
378 - logger.info("被纠正的信号:" + arr.getCorrectText());  
379 - }  
380 - }  
381 - }  
382 -  
383 - /**  
384 - *  
385 - * @Title: driftCheck  
386 - * @Description: TODO(漂移判定)  
387 - */  
388 - public boolean driftCheck(MatchResult mr, ArrivalEntity arr){  
389 - try{  
390 - //上行发车,和到达时间比较一下。起点一般不会立即发出  
391 - if(mr.sch.getXlDir().equals("0")  
392 - && null != mr.sch.getQdzArrDateSJ()){  
393 -  
394 -  
395 - long dt = fmtyyyyMMddHHmm.parseMillis(mr.sch.getRealExecDate() + mr.sch.getQdzArrDateSJ());  
396 -  
397 - //停站时间少于 计划的3分之1,标记为漂移信号  
398 - if((mr.ts - dt < (mr.sch.getDfsjT() - dt) / 3)){  
399 - arr.setCorrect(true);  
400 - arr.setCorrectText("停站时间太短,标记为信号漂移");  
401 - arr.setFlag(-1);  
402 -  
403 - logger.info("漂移判定:" + arr);  
404 - return false;  
405 - }  
406 - }  
407 - }catch(Exception e){  
408 - logger.error("", e);  
409 - }  
410 - return true;  
411 - }  
412 - }  
413 -  
414 - @Override  
415 - public void setApplicationContext(ApplicationContext arg0) throws BeansException {  
416 - sendUtils = arg0.getBean(SendUtils.class);  
417 - dayOfSchedule = arg0.getBean(DayOfSchedule.class);  
418 - directiveService = arg0.getBean(DirectiveService.class);  
419 - lineConfigData = arg0.getBean(LineConfigData.class);  
420 - }  
421 -  
422 - /**  
423 - *  
424 - * @Title: removeExpect  
425 - * @Description: TODO(清除预期站点)  
426 - * @param @param nbbm  
427 - */  
428 - public void removeExpect(String nbbm){  
429 - expectMap.removeAll(nbbm);  
430 - }  
431 -  
432 - public static void addExpect(String nbbm, ExpectArrivalEnd eae){  
433 - expectMap.put(nbbm, eae);  
434 - }  
435 -}  
src/main/java/com/bsth/data/match/ExpectArrivalEnd.java deleted 100644 → 0
1 -package com.bsth.data.match;  
2 -  
3 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
4 -  
5 -/**  
6 - *  
7 - * @ClassName: ExpectArrivalEnd  
8 - * @Description: TODO(期望车辆在某个时间段到达某个终点或 发出某个起点........)  
9 - * @author PanZhao  
10 - * @date 2016年11月2日 下午8:04:43  
11 - *  
12 - */  
13 -public class ExpectArrivalEnd {  
14 -  
15 - private String nbbm;  
16 -  
17 - private String endStation;  
18 -  
19 - private Long endTime;  
20 -  
21 - public static ExpectArrivalEnd getEndInstance(ScheduleRealInfo sch, long t){  
22 - ExpectArrivalEnd ead = new ExpectArrivalEnd();  
23 - ead.setNbbm(sch.getClZbh());  
24 - ead.setEndStation(sch.getZdzCode());  
25 - if(sch.getBcType().equals("out"))  
26 - ead.setEndTime(sch.getZdsjT());  
27 - else{  
28 - ead.setEndTime(sch.getZdsjT() - (sch.getDfsjT() - t));  
29 - }  
30 - return ead;  
31 - }  
32 -  
33 -  
34 - public String getNbbm() {  
35 - return nbbm;  
36 - }  
37 -  
38 - public void setNbbm(String nbbm) {  
39 - this.nbbm = nbbm;  
40 - }  
41 -  
42 - public String getEndStation() {  
43 - return endStation;  
44 - }  
45 -  
46 - public void setEndStation(String endStation) {  
47 - this.endStation = endStation;  
48 - }  
49 -  
50 - public Long getEndTime() {  
51 - return endTime;  
52 - }  
53 -  
54 - public void setEndTime(Long endTime) {  
55 - this.endTime = endTime;  
56 - }  
57 -}  
src/main/java/com/bsth/data/match/MatchResult.java deleted 100644 → 0
1 -package com.bsth.data.match;  
2 -  
3 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
4 -  
5 -/**  
6 - *  
7 - * @ClassName: MatchResult  
8 - * @Description: TODO(实际和计划匹配结果)  
9 - * @author PanZhao  
10 - * @date 2016年8月10日 下午3:55:48  
11 - *  
12 - */  
13 -public class MatchResult {  
14 -  
15 - /** 班次 */  
16 - public ScheduleRealInfo sch;  
17 -  
18 - /** 时间差 */  
19 - public long diff;  
20 -  
21 - /** 0 进 1 出 */  
22 - public int inOut;  
23 -  
24 - public long ts;  
25 -  
26 - /** 交配成功 */  
27 - public boolean success;  
28 -}