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 264 <artifactId>ojdbc</artifactId>
265 265 <version>14</version>
266 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 273 </dependencies>
268 274  
269 275 <dependencyManagement>
... ...
src/main/java/com/bsth/Application.java
... ... @@ -8,14 +8,16 @@ import org.springframework.boot.builder.SpringApplicationBuilder;
8 8 import org.springframework.boot.context.web.SpringBootServletInitializer;
9 9 import org.springframework.context.annotation.Bean;
10 10 import org.springframework.context.annotation.Primary;
  11 +import org.springframework.transaction.annotation.EnableTransactionManagement;
11 12  
12 13 import java.util.concurrent.Executors;
13 14 import java.util.concurrent.ScheduledExecutorService;
14 15  
  16 +@EnableTransactionManagement
15 17 @SpringBootApplication
16 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 22 @Override
21 23 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
... ...
src/main/java/com/bsth/controller/forms/ExportController.java
... ... @@ -330,69 +330,22 @@ public class ExportController {
330 330 SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"), sdfSimple = new SimpleDateFormat("yyyyMMdd");
331 331 List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
332 332 ReportUtils ee = new ReportUtils();
333   - List<Turnoutrate> turnoutrate = formsService.turnoutrate(map);
334 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 349 try {
397 350 listI.add(resList.iterator());
398 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 94  
95 95 // 营运线路出车率统计表
96 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 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 143 Map<String, Object> m = new HashMap<String, Object>();
144 144 m.put("rq", y.getRq());
145 145 m.put("gsname",y.getGsname() );
  146 + m.put("fgsname", y.getFgsname());
146 147 m.put("xlname", y.getXlname());
147 148 m.put("nbbm", y.getNbbm());
148 149 m.put("jsy", y.getJsy());
  150 + m.put("name", y.getName());
149 151 m.put("cdl", y.getCdl());
150 152 m.put("czcd", y.getCzcd()+"%");
151 153 m.put("jzcd", y.getJzcd()+"%");
  154 + m.put("czlc", y.getCzlc());
  155 + m.put("jzlc", y.getJzlc());
152 156 m.put("hd", y.getHd());
153 157 String shyy ="无";
154 158 if(y.getShyy()!=null){
... ... @@ -162,9 +166,11 @@ public class DlbController extends BaseController&lt;Dlb, Integer&gt;{
162 166 else if(shyy.equals("8")){shyy="车间(小修)";}
163 167 else{shyy ="无";}
164 168 }
  169 + m.put("ns", y.getNs());
165 170 m.put("shyy", shyy);
166 171 m.put("sh", y.getSh());
167 172 m.put("zlc", y.getZlc());
  173 + m.put("rdlx", "");
168 174 m.put("bglyh", y.getBglyh());
169 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 239 m.put("rq", y.getRq());
240 240 m.put("gsname",y.getGsname() );
241 241 m.put("fgsname", y.getFgsname());
242   - m.put("xlname", y.getXlname());
  242 + m.put("xlname", y.getXlname()==null?"":y.getXlname());
243 243 m.put("nbbm", y.getNbbm());
244 244 m.put("jsy", y.getJsy());
245 245 m.put("name", y.getName());
... ... @@ -258,6 +258,7 @@ public class YlbController extends BaseController&lt;Ylb, Integer&gt;{
258 258 m.put("ns", y.getNs());
259 259 String shyy ="无";
260 260 if(y.getShyy()!=null){
  261 + shyy=y.getShyy();
261 262 if(shyy.equals("1")){shyy="票务用油";}
262 263 else if(shyy.equals("2")){shyy="保养用油";}
263 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 39  
40 40 //车辆自编号和公司代码对照 (K: 车辆自编号 ,V:公司代码)
41 41 public static Map<String, String> nbbm2CompanyCodeMap;
  42 +
  43 + //车辆自编号和牌照号对照 (K: 车辆自编号 ,V:牌照号)
  44 + public static Map<String, String> nbbmCompanyPlateMap;
42 45  
43 46 //站点编码和名称对照,包括停车场 (K: lineCode_updown_stationCode ,V:站点名称)
44 47 public static Map<String, String> stationCode2NameMap;
... ... @@ -195,16 +198,22 @@ public class BasicData implements CommandLineRunner {
195 198 BiMap<String, String> deviceId2Nbbm = HashBiMap.create();
196 199 //车辆和公司代码对照
197 200 Map<String, String> nbbm2CompanyCode = new HashMap<>();
  201 +
  202 + //车辆自编号和拍照号对照
  203 + Map<String, String> nbbmCompanyPlate = new HashMap<>();
  204 +
198 205 Iterator<Cars> carIterator = carsRepository.findAll().iterator();
199 206 Cars car;
200 207 while (carIterator.hasNext()) {
201 208 car = carIterator.next();
202 209 deviceId2Nbbm.put(car.getEquipmentCode(), car.getInsideCode());
203 210 nbbm2CompanyCode.put(car.getInsideCode(), car.getBusinessCode());
  211 + nbbmCompanyPlate.put(car.getInsideCode(), car.getCarPlate());
204 212 }
205 213  
206 214 deviceId2NbbmMap = deviceId2Nbbm;
207 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 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 14 public class GpsEntity {
15 15  
16 16 /** 公司代码 */
17   - private Integer companyCode;
  17 + private Short companyCode;
18 18  
19 19 /** 线路编码 */
20 20 private String lineId;
... ... @@ -47,23 +47,20 @@ public class GpsEntity {
47 47 private Float speed;
48 48  
49 49 /** 方向(角度) */
50   - private Float direction;
  50 + private float direction;
51 51  
52 52 /** 营运状态( 0 营运 ,1 非营运, -1 无效) */
53 53 private Integer state;
54 54  
55 55 /** 上下行(0 上行 , 1 下行 , -1 无效) */
56   - private Integer upDown;
  56 + private Byte upDown;
57 57  
58 58 /** 车辆内部编码 */
59 59 private String nbbm;
60 60  
61 61 /** 预计到达终点时间 */
62 62 private Float expectStopTime;
63   -
64   - /** 设备是否在线
65   - private boolean online;
66   - */
  63 +
67 64 /** 当前执行班次ID */
68 65 private Long schId;
69 66  
... ... @@ -91,14 +88,6 @@ public class GpsEntity {
91 88 /** gps是否有效 设备端发送的状态 */
92 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 91 public String getDeviceId() {
103 92 return deviceId;
104 93 }
... ... @@ -147,21 +136,6 @@ public class GpsEntity {
147 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 140 public Integer getState() {
167 141 return state;
... ... @@ -171,14 +145,6 @@ public class GpsEntity {
171 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 148 public String getNbbm() {
183 149 return nbbm;
184 150 }
... ... @@ -291,4 +257,39 @@ public class GpsEntity {
291 257 public void setValid(int valid) {
292 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 1 package com.bsth.data.gpsdata;
2 2  
  3 +import com.bsth.Application;
3 4 import com.bsth.data.BasicData;
4 5 import com.bsth.data.forecast.ForecastRealServer;
  6 +import com.bsth.data.gpsdata.client.ClientApp;
5 7 import com.bsth.data.gpsdata.thread.GpsDataLoaderThread;
6 8 import com.bsth.data.gpsdata.thread.OfflineMonitorThread;
7 9 import com.bsth.data.schedule.DayOfSchedule;
... ... @@ -15,6 +17,7 @@ import org.springframework.boot.CommandLineRunner;
15 17 import org.springframework.stereotype.Component;
16 18  
17 19 import java.util.*;
  20 +import java.util.concurrent.TimeUnit;
18 21  
19 22 /**
20 23 * @author PanZhao
... ... @@ -52,13 +55,18 @@ public class GpsRealData implements CommandLineRunner {
52 55 lineCode2Devices = TreeMultimap.create();
53 56 }
54 57  
  58 + @Autowired
  59 + ClientApp clientApp;
55 60 @Override
56 61 public void run(String... arg0) throws Exception {
57 62 logger.info("gpsDataLoader,20,3");
58   - //定时从网关获取GPS数据
  63 + //定时从网关http形式获取GPS数据 --- 已弃用,现socket客户端接入数据
59 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 285 * @param stationCode
286 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 289 StationRoute station = routeCodeMap.get(lineId + "_" + upDown + "_" + stationCode);
290 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 4 import com.bsth.data.gpsdata.GpsRealData;
5 5 import com.bsth.data.gpsdata.arrival.handlers.*;
6 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 9 import org.slf4j.Logger;
8 10 import org.slf4j.LoggerFactory;
9 11 import org.springframework.beans.factory.annotation.Autowired;
10 12 import org.springframework.stereotype.Component;
11 13  
12 14 import java.util.List;
  15 +import java.util.Set;
13 16 import java.util.concurrent.CountDownLatch;
14 17 import java.util.concurrent.ExecutorService;
15 18 import java.util.concurrent.Executors;
... ... @@ -43,10 +46,22 @@ public class GpsRealAnalyse {
43 46 static ExecutorService threadPool = Executors.newFixedThreadPool(50);
44 47  
45 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 66 try {
52 67 //等待子线程结束
... ... @@ -62,11 +77,11 @@ public class GpsRealAnalyse {
62 77  
63 78 public class SignalHandleThread implements Runnable {
64 79  
65   - GpsEntity gps;
  80 + List<GpsEntity> list;
66 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 85 this.count = count;
71 86 }
72 87  
... ... @@ -74,31 +89,33 @@ public class GpsRealAnalyse {
74 89 public void run() {
75 90  
76 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 114 } catch (Exception e) {
99 115 logger.error("", e);
100 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 75 Logger logger = LoggerFactory.getLogger(this.getClass());
76 76 private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm");
77 77 protected void transformUpdown(GpsEntity gps, ScheduleRealInfo sch) {
78   - int updown = Integer.parseInt(sch.getXlDir());
  78 + byte updown = Byte.parseByte(sch.getXlDir());
79 79 //gps 切换走向
80 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 41 else
42 42 sch = (ScheduleRealInfo) task;
43 43  
44   - int updown = Integer.parseInt(sch.getXlDir());
  44 + byte updown = Byte.parseByte(sch.getXlDir());
45 45 //走向
46 46 if(gps.getUpDown() != updown){
47 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 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 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 98 gps.setLon(rs.getFloat("LON"));
99 99 gps.setLineId(rs.getString("LINE_ID"));
100 100 gps.setTimestamp(rs.getLong("TS"));
101   - gps.setUpDown(getUpOrDown(rs.getLong("SERVICE_STATE")));
  101 + gps.setUpDown((byte) getUpOrDown(rs.getLong("SERVICE_STATE")));
102 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   -}