Commit ba8b101ae7a6a4ffd76e5053605ad7ceecde6257

Authored by 潘钊
1 parent 4ec6a915

指令相关

Showing 31 changed files with 1410 additions and 458 deletions
src/main/java/com/bsth/StartCommand.java
... ... @@ -11,9 +11,11 @@ import org.springframework.beans.factory.annotation.Autowired;
11 11 import org.springframework.boot.CommandLineRunner;
12 12 import org.springframework.stereotype.Component;
13 13  
14   -import com.bsth.common.GetSchedulePlanThread;
15 14 import com.bsth.security.SecurityMetadataSourceService;
16 15 import com.bsth.util.DateUtils;
  16 +import com.bsth.vehicle.GetSchedulePlanThread;
  17 +import com.bsth.vehicle.common.CommonRefreshThread;
  18 +import com.bsth.vehicle.directive.DirectivePersistenceThread;
17 19 import com.bsth.vehicle.gpsdata.GpsRefreshThread;
18 20  
19 21 /**
... ... @@ -29,7 +31,7 @@ public class StartCommand implements CommandLineRunner{
29 31 @Autowired
30 32 SecurityMetadataSourceService invocationSecurityMetadataSourceService;
31 33  
32   - public static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
  34 + public static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4);
33 35  
34 36 @Autowired
35 37 GpsRefreshThread gpsRefreshThread;
... ... @@ -37,6 +39,12 @@ public class StartCommand implements CommandLineRunner{
37 39 @Autowired
38 40 GetSchedulePlanThread getSchedulePlanThread;
39 41  
  42 + @Autowired
  43 + CommonRefreshThread commonRefreshThread;
  44 +
  45 + @Autowired
  46 + DirectivePersistenceThread directivePersistenceThread;
  47 +
40 48 @Override
41 49 public void run(String... arg0){
42 50  
... ... @@ -44,18 +52,19 @@ public class StartCommand implements CommandLineRunner{
44 52 //启动时加载所有资源
45 53 invocationSecurityMetadataSourceService.loadResourceDefine();
46 54  
47   - /**
48   - * GPS实时数据更新线程,每次执行完成4秒后开始下一次
49   - * 如果抛出异常,后续执行将被取消
50   - */
  55 + //GPS实时数据更新线程,每次执行完成4秒后开始下一次
51 56 //scheduler.scheduleWithFixedDelay(gpsRefreshThread, 0, 4, TimeUnit.SECONDS);
52 57  
53   - /**
54   - * 定时0点从计划排班表抓取当天实际排班
55   - */
56   - //scheduler.scheduleAtFixedRate(getSchedulePlanThread
57   - // , 0//DateUtils.getTimesnight() - System.currentTimeMillis() / 1000
58   - // , 60 * 60 * 24, TimeUnit.SECONDS);
  58 + //定时0点从计划排班表抓取当天实际排班
  59 + /*scheduler.scheduleAtFixedRate(getSchedulePlanThread
  60 + , 0//DateUtils.getTimesnight() - System.currentTimeMillis() / 1000
  61 + , 60 * 60 * 24, TimeUnit.SECONDS);*/
  62 +
  63 + //两分钟调度指令入库一次
  64 + //scheduler.scheduleWithFixedDelay(directivePersistenceThread, 20, 60 * 1, TimeUnit.SECONDS);
  65 +
  66 + //两小时刷新一次对照数据
  67 + //scheduler.scheduleWithFixedDelay(commonRefreshThread, 0, 60 * 60 * 2, TimeUnit.SECONDS);
59 68 } catch (Exception e) {
60 69 e.printStackTrace();
61 70 }
... ...
src/main/java/com/bsth/common/Constants.java
... ... @@ -20,4 +20,7 @@ public class Constants {
20 20 public static final String FAVICON_URL = "/favicon.ico";
21 21 public static final String METRONIC_URL = "/metronic_v4.5.4/**";
22 22 public static final String LOGIN_FAILURE = "/user/loginFailure";
  23 +
  24 + //车载网关上行接口
  25 + public static final String UPSTREAM_URL = "/control/upstream";
23 26 }
... ...
src/main/java/com/bsth/controller/realcontrol/DirectiveController.java deleted 100644 → 0
1   -package com.bsth.controller.realcontrol;
2   -
3   -import org.springframework.web.bind.annotation.RequestMapping;
4   -import org.springframework.web.bind.annotation.RestController;
5   -
6   -/**
7   - *
8   - * @ClassName: DirectiveController
9   - * @Description: TODO(调度指令)
10   - * @author PanZhao
11   - * @date 2016年6月7日 上午9:52:11
12   - *
13   - */
14   -@RestController
15   -@RequestMapping("/realcontrol/directive")
16   -public class DirectiveController {
17   -
18   -}
src/main/java/com/bsth/entity/realcontrol/ScheduleRealInfo.java
... ... @@ -11,247 +11,109 @@ import java.util.Date;
11 11 @Entity
12 12 @Table(name = "bsth_c_s_sp_info_real")
13 13 public class ScheduleRealInfo {
14   -
15   - /** 主键Id */
16   - @Id
17   - @GeneratedValue
18   - private Long id;
19   -
20   - /** 排班计划日期 */
21   - private Date scheduleDate;
22   -
23   - /** 路牌名称 */
24   - private String lpName;
25   - /** 线路编码 */
26   - private String xlBm;
27   - /** 线路名称 */
28   - private String xlName;
29   - /** 车辆自编号 */
30   - private String clZbh;
31   -
32   - /** 报道1时间(格式 HH:mm) */
33   - private String bd1Time;
34   - /** 出场1时间(格式 HH:mm) */
35   - private String cc1Time;
36   - /** 驾驶员1工号 */
37   - private String j1Gh;
38   - /** 驾驶员1名字 */
39   - private String j1Name;
40   - /** 售票员1工号 */
41   - private String s1Gh;
42   - /** 售票员1名字 */
43   - private String s1Name;
44   -
45   - // 冗余的时刻明细信息
46   - /** 线路方向 */
47   - private String xlDir;
48   - /** 起点站名称 */
49   - private String qdz;
50   - /** 终点站名称 */
51   - private String zdz;
52   - /** 发车时间(格式 HH:mm) */
53   - private String fcsj;
54   - /** 发车顺序号 */
55   - private int fcno;
56   - /** 对应班次数 */
57   - private int bcs;
58   - /** 计划里程 */
59   - private double jhlc;
60   - /** 班次历时 */
61   - private int bcsj;
62   -
63   - /** 操作人 */
64   - @ManyToOne(optional = false, cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
65   - private SysUser user;
66   -
67   - // 创建日期
68   - @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
69   - private Date createDate;
70   - // 修改日期
71   - @Column(name = "update_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
72   - private Date updateDate;
73   -
74   - public Long getId() {
75   - return id;
76   - }
77   -
78   - public void setId(Long id) {
79   - this.id = id;
80   - }
81   -
82   - public Date getScheduleDate() {
83   - return scheduleDate;
84   - }
85   -
86   - public void setScheduleDate(Date scheduleDate) {
87   - this.scheduleDate = scheduleDate;
88   - }
89   -
90   - public String getLpName() {
91   - return lpName;
92   - }
93   -
94   - public void setLpName(String lpName) {
95   - this.lpName = lpName;
96   - }
97   -
98   - public String getXlName() {
99   - return xlName;
100   - }
101   -
102   - public void setXlName(String xlName) {
103   - this.xlName = xlName;
104   - }
105   -
106   - public String getClZbh() {
107   - return clZbh;
108   - }
109   -
110   - public void setClZbh(String clZbh) {
111   - this.clZbh = clZbh;
112   - }
113   -
114   - public String getCc1Time() {
115   - return cc1Time;
116   - }
117   -
118   - public void setCc1Time(String cc1Time) {
119   - this.cc1Time = cc1Time;
120   - }
121   -
122   - public String getJ1Gh() {
123   - return j1Gh;
124   - }
125   -
126   - public void setJ1Gh(String j1Gh) {
127   - this.j1Gh = j1Gh;
128   - }
129   -
130   - public String getJ1Name() {
131   - return j1Name;
132   - }
133   -
134   - public void setJ1Name(String j1Name) {
135   - this.j1Name = j1Name;
136   - }
137   -
138   - public String getS1Gh() {
139   - return s1Gh;
140   - }
141   -
142   - public void setS1Gh(String s1Gh) {
143   - this.s1Gh = s1Gh;
144   - }
145   -
146   - public String getS1Name() {
147   - return s1Name;
148   - }
149   -
150   - public void setS1Name(String s1Name) {
151   - this.s1Name = s1Name;
152   - }
153   -
154   - public String getBd1Time() {
155   - return bd1Time;
156   - }
157   -
158   - public void setBd1Time(String bd1Time) {
159   - this.bd1Time = bd1Time;
160   - }
161   -
162   - public String getXlDir() {
163   - return xlDir;
164   - }
165   -
166   - public void setXlDir(String xlDir) {
167   - this.xlDir = xlDir;
168   - }
169   -
170   - public String getQdz() {
171   - return qdz;
172   - }
173   -
174   - public void setQdz(String qdz) {
175   - this.qdz = qdz;
176   - }
177   -
178   - public String getZdz() {
179   - return zdz;
180   - }
181   -
182   - public void setZdz(String zdz) {
183   - this.zdz = zdz;
184   - }
185   -
186   - public String getFcsj() {
187   - return fcsj;
188   - }
189   -
190   - public void setFcsj(String fcsj) {
191   - this.fcsj = fcsj;
192   - }
193   -
194   - public SysUser getUser() {
195   - return user;
196   - }
197   -
198   - public void setUser(SysUser user) {
199   - this.user = user;
200   - }
201   -
202   - public Date getCreateDate() {
203   - return createDate;
204   - }
205   -
206   - public void setCreateDate(Date createDate) {
207   - this.createDate = createDate;
208   - }
209   -
210   - public Date getUpdateDate() {
211   - return updateDate;
212   - }
213   -
214   - public void setUpdateDate(Date updateDate) {
215   - this.updateDate = updateDate;
216   - }
217   -
218   - public int getFcno() {
219   - return fcno;
220   - }
221   -
222   - public void setFcno(int fcno) {
223   - this.fcno = fcno;
224   - }
225   -
226   - public int getBcs() {
227   - return bcs;
228   - }
229   -
230   - public void setBcs(int bcs) {
231   - this.bcs = bcs;
232   - }
233   -
234   - public double getJhlc() {
235   - return jhlc;
236   - }
237   -
238   - public void setJhlc(double jhlc) {
239   - this.jhlc = jhlc;
240   - }
241   -
242   - public int getBcsj() {
243   - return bcsj;
244   - }
245   -
246   - public void setBcsj(int bcsj) {
247   - this.bcsj = bcsj;
248   - }
249   -
250   - public String getXlBm() {
251   - return xlBm;
252   - }
253   -
254   - public void setXlBm(String xlBm) {
255   - this.xlBm = xlBm;
256   - }
  14 + /** 主键Id */
  15 + @Id
  16 + @GeneratedValue
  17 + private Long id;
  18 +
  19 + /** 排班计划日期 */
  20 + @Column(nullable = false)
  21 + private Date scheduleDate;
  22 +
  23 + /** 关联 bsth_c_line 主键,不做mapping */
  24 + @Column(nullable = false)
  25 + private Integer xl;
  26 + /** 线路名称 */
  27 + @Column(nullable = false)
  28 + private String xlName;
  29 + /** 线路编码 */
  30 + @Column(nullable = false)
  31 + private String xlBm;
  32 +
  33 + /** 关联 bsth_c_s_gbi 主键,不做mapping */
  34 + @Column(nullable = false)
  35 + private Long lp;
  36 + /** 路牌名称 */
  37 + @Column(nullable = false)
  38 + private String lpName;
  39 +
  40 + /** 关联 bsth_c_cars 主键,不做mapping */
  41 + @Column(nullable = false)
  42 + private Integer cl;
  43 + /** 车辆自编号 */
  44 + @Column(nullable = false)
  45 + private String clZbh;
  46 +
  47 + /** 报道时间(格式 HH:mm) */
  48 + private String bdTime;
  49 + /** 出场时间(格式 HH:mm) */
  50 + private String ccTime;
  51 + /** 关联 bsth_c_personnel 主键,不做mapping */
  52 + @Column(nullable = false)
  53 + private Integer j;
  54 + /** 驾驶员工号 */
  55 + @Column(nullable = false)
  56 + private String jGh;
  57 + /** 驾驶员名字 */
  58 + @Column(nullable = false)
  59 + private String jName;
  60 + /** 售票员工号 */
  61 + private String sGh;
  62 + /** 售票员名字 */
  63 + private String sName;
  64 +
  65 + /** 线路方向(TODO:上下行,上行,下行,这个以后用枚举还是字典再议,现在先用文字) */
  66 + @Column(nullable = false)
  67 + private String xlDir;
  68 + /** 起点站id,根据班次类型,会关联 bsth_c_station,或 bsth_c_car_park,不做mapping */
  69 + @Column(nullable = false)
  70 + private Integer qdz;
  71 + /** 起点站名字 */
  72 + @Column(nullable = false)
  73 + private String qdzName;
  74 + /** 终点站id,根据班次类型,会关联 bsth_c_station,或 bsth_c_car_park,不做mapping */
  75 + @Column(nullable = false)
  76 + private Integer zdz;
  77 + /** 终点站名字 */
  78 + @Column(nullable = false)
  79 + private String zdzName;
  80 +
  81 + /** 发车时间(格式 HH:mm) */
  82 + @Column(nullable = false)
  83 + private String fcsj;
  84 + /** 发车顺序号 */
  85 + @Column(nullable = false)
  86 + private Integer fcno;
  87 + /** 对应班次数 */
  88 + @Column(nullable = false)
  89 + private Integer bcs;
  90 + /** 计划里程 */
  91 + private Double jhlc;
  92 + /** 班次历时 */
  93 + private Integer bcsj;
  94 +
  95 + /**
  96 + * 班次类型 TODO:正常班次、出场、进场、加油、临加班次、区间班次、放空班次、放大站班次、两点间空驶
  97 + * TODO:这个以后用枚举还是字典再议,现在先用文字
  98 + */
  99 + @Column(nullable = false)
  100 + private String bcType;
  101 +
  102 + /** 创建人 */
  103 + @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
  104 + private SysUser createBy;
  105 + /** 修改人 */
  106 + @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
  107 + private SysUser updateBy;
  108 + /** 创建日期 */
  109 + @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
  110 + private Date createDate;
  111 + /** 修改日期 */
  112 + @Column(name = "update_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
  113 + private Date updateDate;
  114 +
  115 + //实际发车时间
  116 + private String sjqdsj;
  117 + //实际到达时间
  118 + private String sjzdsj;
257 119 }
... ...
src/main/java/com/bsth/filter/BaseFilter.java
... ... @@ -24,7 +24,7 @@ public abstract class BaseFilter implements Filter {
24 24 * 白名单
25 25 */
26 26 private String[] whiteListURLs = { Constants.LOGIN_PAGE,
27   - Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE };
  27 + Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL };
28 28  
29 29 @Override
30 30 public void destroy() {
... ...
src/main/java/com/bsth/security/WebSecurityConfig.java
... ... @@ -36,7 +36,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
36 36 // 白名单
37 37 web.ignoring().antMatchers(Constants.ASSETS_URL, Constants.FAVICON_URL,
38 38 Constants.METRONIC_URL, Constants.LOGIN_PAGE,
39   - Constants.LOGIN_FAILURE);
  39 + Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL);
40 40 }
41 41  
42 42 @Override
... ...
src/main/java/com/bsth/common/GetSchedulePlanThread.java renamed to src/main/java/com/bsth/vehicle/GetSchedulePlanThread.java
1   -package com.bsth.common;
  1 +package com.bsth.vehicle;
2 2  
3 3 import java.text.SimpleDateFormat;
4   -import java.util.Date;
5   -import java.util.Iterator;
6 4 import java.util.List;
7 5  
8 6 import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -31,7 +29,5 @@ public class GetSchedulePlanThread extends Thread{
31 29 public void run() {
32 30 List<SchedulePlanInfo> list = schedulePlanInfoRepository.findByDate(/*sdf.format(new Date())*/"2016-06-01");
33 31  
34   -
35   -
36 32 }
37 33 }
... ...
src/main/java/com/bsth/vehicle/UpstreamEntrance.java
1 1 package com.bsth.vehicle;
2 2  
  3 +import org.slf4j.Logger;
  4 +import org.slf4j.LoggerFactory;
  5 +import org.springframework.beans.factory.annotation.Autowired;
3 6 import org.springframework.web.bind.annotation.RequestMapping;
  7 +import org.springframework.web.bind.annotation.RequestMethod;
  8 +import org.springframework.web.bind.annotation.RequestParam;
4 9 import org.springframework.web.bind.annotation.RestController;
5 10  
  11 +import com.alibaba.fastjson.JSON;
  12 +import com.alibaba.fastjson.JSONObject;
  13 +import com.bsth.vehicle.directive.buffer.DirectiveBuffer;
  14 +import com.bsth.vehicle.directive.entity.DirectiveReply;
  15 +import com.bsth.vehicle.directive.entity.DriverReport;
  16 +
6 17 /**
7 18 *
8 19 * @ClassName: UpstreamEntrance
9   - * @Description: TODO(车载网关上行入口)
  20 + * @Description: TODO(车载网关HTTP上行入口)
10 21 * @author PanZhao
11 22 * @date 2016年6月7日 下午3:00:01
12 23 *
13 24 */
14 25 @RestController
15   -@RequestMapping("/control/upstream")
  26 +@RequestMapping("/control")
16 27 public class UpstreamEntrance {
17   -
  28 +
  29 + Logger logger = LoggerFactory.getLogger(this.getClass());
  30 +
  31 + @Autowired
  32 + DirectiveBuffer directiveBuffer;
  33 +
  34 + @RequestMapping(value = "/upstream" , method = RequestMethod.POST)
  35 + public int main(@RequestParam String json){
  36 + logger.info(json);
  37 + JSONObject jsonParam = JSONObject.parseObject(json);
  38 +
  39 + //46和47 调度指令确认
  40 + if(jsonParam.getInteger("operCode") == null
  41 + && jsonParam.getInteger("status") != null){
  42 + try{
  43 + DirectiveReply reply = JSON.toJavaObject(jsonParam, DirectiveReply.class);
  44 + directiveBuffer.reply(reply);
  45 + }catch(NumberFormatException e){
  46 + logger.error("NumberFormatException ,,,,一般是老数据,msgId太大");
  47 + }
  48 + }
  49 + //80协议,驾驶员上报
  50 + else if(jsonParam.getInteger("operCode") == 0X80){
  51 + try{
  52 + DriverReport report = JSON.toJavaObject(jsonParam, DriverReport.class);
  53 + directiveBuffer.jsyReport(report);
  54 + }catch(Exception e){
  55 + logger.error("", e);
  56 + }
  57 + }
  58 + //64协议 线路切换回复
  59 + else if(jsonParam.getInteger("operCode") == 0X64){
  60 + directiveBuffer.reply64(jsonParam);
  61 + }
  62 + else
  63 + logger.warn("未知的上行数据,p: " + json);
  64 +
  65 + return 0;
  66 + }
18 67 }
... ...
src/main/java/com/bsth/vehicle/common/CommonMapped.java 0 → 100644
  1 +package com.bsth.vehicle.common;
  2 +
  3 +import java.util.Map;
  4 +
  5 +import com.google.common.collect.BiMap;
  6 +
  7 +/**
  8 + *
  9 + * @ClassName: CommonMapped
  10 + * @Description: TODO(常用的数据映射)
  11 + * @author PanZhao
  12 + * @date 2016年6月7日 下午4:01:43
  13 + *
  14 + */
  15 +public class CommonMapped {
  16 +
  17 +
  18 + /**
  19 + * 设备号和车辆自编号
  20 + * (K: 设备编码 ,V:车辆自编号)
  21 + */
  22 + public static BiMap<String, String> vehicDeviceBiMap;
  23 +
  24 + /**
  25 + * 设备号和线路编码对照
  26 + * (K: 设备编码 ,V:线路编码)
  27 + */
  28 + //public static Map<String, Integer> deviceLineMap;
  29 +
  30 +
  31 + /**
  32 + * 车辆自编号和公司代码对照
  33 + * (K: 车辆自编号 ,V:公司代码)
  34 + */
  35 + public static Map<String , String> vehicCompanyMap;
  36 +
  37 + /**
  38 + * 站点和编码对照
  39 + *(K: 站点编码 ,V:站点名称)
  40 + */
  41 + public static Map<String, String> stationCodeMap;
  42 +
  43 +}
... ...
src/main/java/com/bsth/vehicle/common/CommonRefreshThread.java 0 → 100644
  1 +package com.bsth.vehicle.common;
  2 +
  3 +import java.util.HashMap;
  4 +import java.util.Iterator;
  5 +import java.util.Map;
  6 +
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import com.bsth.entity.Cars;
  13 +import com.bsth.entity.Station;
  14 +import com.bsth.repository.CarsRepository;
  15 +import com.bsth.repository.StationRepository;
  16 +import com.google.common.collect.BiMap;
  17 +import com.google.common.collect.HashBiMap;
  18 +
  19 +/**
  20 + *
  21 + * @ClassName: CommonRefreshThread
  22 + * @Description: TODO(刷新映射数据)
  23 + * @author PanZhao
  24 + * @date 2016年6月7日 下午4:05:34
  25 + *
  26 + */
  27 +@Component
  28 +public class CommonRefreshThread extends Thread{
  29 +
  30 + @Autowired
  31 + CarsRepository carsRepository;
  32 +
  33 + @Autowired
  34 + StationRepository stationRepository;
  35 +
  36 + Logger logger = LoggerFactory.getLogger(this.getClass());
  37 +
  38 + @Override
  39 + public void run() {
  40 + try {
  41 + initVehicMapp();
  42 + initStationCodeMap();
  43 + } catch (Exception e) {
  44 + logger.error("", e);
  45 + }
  46 + }
  47 +
  48 + /**
  49 + *
  50 + * @Title: initDeviceMapp
  51 + * @Description: TODO(初始化车辆相关对照)
  52 + */
  53 + public void initVehicMapp(){
  54 + BiMap<String, String> biMap = HashBiMap.create();
  55 + //车辆和公司代码对照
  56 + Map<String, String> vcMap = new HashMap<>();
  57 + Iterator<Cars> carIterator = carsRepository.findAll().iterator();
  58 + Cars car;
  59 + while(carIterator.hasNext()){
  60 + car = carIterator.next();
  61 + biMap.put(car.getEquipmentCode(), car.getInsideCode());
  62 + vcMap.put(car.getInsideCode(), car.getBusinessCode());
  63 + }
  64 +
  65 + CommonMapped.vehicDeviceBiMap = biMap;
  66 + CommonMapped.vehicCompanyMap = vcMap;
  67 + }
  68 +
  69 + /**
  70 + *
  71 + * @Title: initStationCodeMap
  72 + * @Description: TODO(初始化站点和编码对照)
  73 + */
  74 + public void initStationCodeMap(){
  75 + Map<String, String> newMap = new HashMap<>();
  76 + Iterator<Station> iterator = stationRepository.findAll().iterator();
  77 +
  78 + Station station;
  79 + while(iterator.hasNext()){
  80 + station = iterator.next();
  81 + newMap.put(station.getStationCod(), station.getStationName());
  82 + }
  83 +
  84 + CommonMapped.stationCodeMap = newMap;
  85 + }
  86 +}
... ...
src/main/java/com/bsth/vehicle/directive/Consts.java
1 1 package com.bsth.vehicle.directive;
2 2  
  3 +import com.bsth.util.Tools;
  4 +
3 5 public class Consts {
  6 +
  7 + static Tools tools = new Tools("application.properties");
  8 +
4 9 /**
5 10 * 调度指令 -多营运状态 [0][0]上行营运 [0][1]上行非营运 [1][0]下行营运 [1][1]下行非营运
6 11 */
7 12 public static final int[][] SERVICE_STATE = { { 0, 0x02000000 }, { 0x10000000, 0x12000000 } };
  13 +
  14 + /**
  15 + * 消息下发地址
  16 + */
  17 + public static final String SEND_DIRECTIVE_URL = tools.getValue("http.send.directive");
8 18 }
... ...
src/main/java/com/bsth/vehicle/directive/DirectivePersistenceThread.java 0 → 100644
  1 +package com.bsth.vehicle.directive;
  2 +
  3 +import java.util.ArrayList;
  4 +import java.util.LinkedList;
  5 +import java.util.List;
  6 +
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import com.bsth.vehicle.directive.buffer.DirectiveBuffer;
  13 +import com.bsth.vehicle.directive.entity.Directive;
  14 +import com.bsth.vehicle.directive.repository.DirectiveRepository;
  15 +
  16 +/**
  17 + *
  18 + * @ClassName: DirectivePersistenceThread
  19 + * @Description: TODO(调度指令定时入库)
  20 + * @author PanZhao
  21 + * @date 2016年6月8日 上午10:42:32
  22 + *
  23 + */
  24 +@Component
  25 +public class DirectivePersistenceThread extends Thread{
  26 +
  27 + @Autowired
  28 + DirectiveRepository directiveRepository;
  29 +
  30 + Logger logger = LoggerFactory.getLogger(this.getClass());
  31 +
  32 + @Override
  33 + public void run() {
  34 + LinkedList<Directive> list = DirectiveBuffer.transientList;
  35 +
  36 + List<Directive> persList = new ArrayList<>();
  37 +
  38 + Directive directive;
  39 + for(int i = 0; i < 1000; i ++){
  40 + directive = list.poll();
  41 +
  42 + if(null == directive)
  43 + break;
  44 +
  45 + persList.add(directive);
  46 + }
  47 +
  48 + if(persList.size() > 0){
  49 + try{
  50 + directiveRepository.save(persList);
  51 + }catch(Exception e){
  52 + logger.error("", e);
  53 + }
  54 + }
  55 + }
  56 +}
... ...
src/main/java/com/bsth/vehicle/directive/MsgIdGenerator.java 0 → 100644
  1 +package com.bsth.vehicle.directive;
  2 +
  3 +/**
  4 + *
  5 + * @ClassName: MsgIdGenerator
  6 + * @Description: TODO(指令下发 msgId 生成器)
  7 + * @author PanZhao
  8 + * @date 2016年6月7日 下午4:38:04
  9 + *
  10 + */
  11 +public class MsgIdGenerator {
  12 +
  13 + private static int msgId = 0;
  14 +
  15 + public synchronized static int getMsgId(){
  16 + msgId ++;
  17 + if(msgId == Integer.MAX_VALUE){
  18 + msgId = 0;
  19 + }
  20 + return msgId;
  21 + }
  22 +}
... ...
src/main/java/com/bsth/vehicle/directive/buffer/DirectiveBuffer.java 0 → 100644
  1 +package com.bsth.vehicle.directive.buffer;
  2 +
  3 +import java.util.HashMap;
  4 +import java.util.LinkedList;
  5 +import java.util.Map;
  6 +
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import com.alibaba.fastjson.JSONObject;
  13 +import com.bsth.vehicle.directive.entity.Directive;
  14 +import com.bsth.vehicle.directive.entity.DirectiveReply;
  15 +import com.bsth.vehicle.directive.entity.DriverReport;
  16 +import com.bsth.vehicle.directive.entity.LineChange;
  17 +import com.bsth.vehicle.directive.repository.DriverReportRepository;
  18 +import com.bsth.vehicle.directive.repository.LineChangeRepository;
  19 +import com.google.common.collect.ArrayListMultimap;
  20 +import com.google.common.collect.Multimap;
  21 +
  22 +/**
  23 + *
  24 + * @ClassName: DirectiveBuffer
  25 + * @Description: TODO(调度指令缓存)
  26 + * @author PanZhao
  27 + * @date 2016年6月7日 下午3:24:19
  28 + *
  29 + */
  30 +@Component
  31 +public class DirectiveBuffer {
  32 +
  33 + Logger logger = LoggerFactory.getLogger(this.getClass());
  34 +
  35 + @Autowired
  36 + DriverReportRepository driverReportRepository;
  37 +
  38 + @Autowired
  39 + LineChangeRepository lineChangeRepository;
  40 +
  41 + /**
  42 + * 等待入库的调度指令
  43 + */
  44 + public static LinkedList<Directive> transientList;
  45 +
  46 + /**
  47 + * 等待确认的线路切换指令
  48 + */
  49 + public static Map<String, LineChange> changeMap;
  50 +
  51 + /**
  52 + * 当日调度指令缓存
  53 + */
  54 + private static Map<Integer, Directive> directiveMap;
  55 +
  56 + /**
  57 + * 驾驶员上报数据
  58 + * {K: 线路编码}
  59 + */
  60 + private static Multimap<Integer, DriverReport> reportMultiMap;
  61 +
  62 + static{
  63 + transientList = new LinkedList<>();
  64 + directiveMap = new HashMap<>();
  65 + reportMultiMap = ArrayListMultimap.create();
  66 + changeMap = new HashMap<>();
  67 + }
  68 +
  69 + public static void put(Directive directive){
  70 + transientList.add(directive);
  71 + directiveMap.put(directive.getMsgId(), directive);
  72 + }
  73 +
  74 + /**
  75 + *
  76 + * @Title: reply
  77 + * @Description: TODO(指令 46,47 响应)
  78 + * @throws
  79 + */
  80 + public void reply(DirectiveReply reply){
  81 + Integer msgId = reply.getMsgId();
  82 + if(msgId == null){
  83 + logger.error("reply error , msgId is null.");
  84 + return;
  85 + }
  86 +
  87 + Directive directive = directiveMap.get(msgId);
  88 +
  89 + if(null == directive){
  90 + //无效的响应
  91 + return;
  92 + }
  93 +
  94 + switch (reply.getStatus()) {
  95 + case 0:
  96 + //失败
  97 + directive.setReply46((short)-1);
  98 + break;
  99 +
  100 + case 1:
  101 + //发送成功
  102 + directive.setReply46((short)0);
  103 + break;
  104 + case 2:
  105 + //驾驶员阅读
  106 + directive.setReply47((short)0);
  107 + break;
  108 + }
  109 + transientList.add(directive);
  110 + }
  111 +
  112 + /**
  113 + *
  114 + * @Title: reply64
  115 + * @Description: TODO(64协议响应)
  116 + * @throws
  117 + */
  118 + public void reply64(JSONObject json){
  119 + String key = json.getString("deviceId") + "_" + json.getString("timestamp");
  120 +
  121 + LineChange change = changeMap.get(key);
  122 +
  123 + if(null == change)
  124 + logger.warn("64响应 -找不到请求源,json: " + json);
  125 + else{
  126 + JSONObject data = json.getJSONObject("data");
  127 +
  128 + changeMap.remove(key);
  129 +
  130 + if(null == data)
  131 + logger.warn("64响应 data is null ,json: " + json);
  132 + else{
  133 + change.setRespAck(data.getShort("requestAck"));
  134 + //响应入库
  135 + lineChangeRepository.save(change);
  136 + }
  137 + }
  138 + }
  139 +
  140 + /**
  141 + *
  142 + * @Title: jsyReport
  143 + * @Description: TODO(80 驾驶员上报)
  144 + * @throws
  145 + */
  146 + public void jsyReport(DriverReport report){
  147 + logger.info("驾驶员上报");
  148 + //实时入库
  149 + driverReportRepository.save(report);
  150 + reportMultiMap.put(report.getData().getLineId(), report);
  151 + }
  152 +}
... ...
src/main/java/com/bsth/vehicle/directive/controller/DirectiveController.java 0 → 100644
  1 +package com.bsth.vehicle.directive.controller;
  2 +
  3 +import org.springframework.beans.factory.annotation.Autowired;
  4 +import org.springframework.web.bind.annotation.RequestMapping;
  5 +import org.springframework.web.bind.annotation.RequestMethod;
  6 +import org.springframework.web.bind.annotation.RequestParam;
  7 +import org.springframework.web.bind.annotation.RestController;
  8 +
  9 +import com.bsth.vehicle.directive.service.DirectiveService;
  10 +
  11 +/**
  12 + *
  13 + * @ClassName: DirectiveController
  14 + * @Description: TODO(页面下发调度指令) .0
  15 + * @author PanZhao
  16 + * @date 2016年6月8日 上午9:34:51
  17 + *
  18 + */
  19 +@RestController
  20 +@RequestMapping("/directive")
  21 +public class DirectiveController {
  22 +
  23 + @Autowired
  24 + DirectiveService directiveService;
  25 +
  26 + /**
  27 + *
  28 + * @Title: send60
  29 + * @Description: TODO(60协议短语下发)
  30 + * @throws
  31 + */
  32 + @RequestMapping(value = "/phrase", method = RequestMethod.GET)
  33 + public int send60Phrase(@RequestParam String nbbm, @RequestParam String text){
  34 + return directiveService.send60Phrase(nbbm, text);
  35 + }
  36 +
  37 + /**
  38 + *
  39 + * @Title: lineChange
  40 + * @Description: TODO(切换线路)
  41 + * @param @param nbbm 车辆内部编码
  42 + * @param @param lineId 新线路编码
  43 + * @throws
  44 + */
  45 + @RequestMapping(value = "/lineChnage", method = RequestMethod.GET)
  46 + public int lineChange(@RequestParam String nbbm, @RequestParam Integer lineId){
  47 + return directiveService.lineChange(nbbm, lineId);
  48 + }
  49 +}
... ...
src/main/java/com/bsth/vehicle/directive/entity/Directive.java
1 1 package com.bsth.vehicle.directive.entity;
2 2  
  3 +import javax.persistence.Embeddable;
3 4 import javax.persistence.Entity;
4 5 import javax.persistence.GeneratedValue;
5 6 import javax.persistence.Id;
6 7 import javax.persistence.Table;
  8 +import javax.persistence.Transient;
7 9  
8 10  
9 11 /**
... ... @@ -15,18 +17,160 @@ import javax.persistence.Table;
15 17 *
16 18 */
17 19 @Entity
18   -@Table(name = "bsth_v_directive")
  20 +@Table(name = "bsth_v_directive_60")
19 21 public class Directive {
20 22  
21 23 @Id
22 24 @GeneratedValue
23 25 private Integer id;
24 26  
25   - //一级协议
  27 + /**
  28 + * 一级协议
  29 + */
26 30 private short operCode;
27 31  
28   - //数据
  32 + /**
  33 + * 数据
  34 + */
29 35 private DirectiveData data;
  36 +
  37 + /**
  38 + * 设备号
  39 + */
  40 + @Transient
  41 + private String deviceId;
  42 +
  43 + /**
  44 + * 时间戳
  45 + */
  46 + @Transient
  47 + private Long timestamp;
  48 +
  49 + /**
  50 + * 唯一标识
  51 + */
  52 + @Transient
  53 + private Integer msgId;
  54 +
  55 + /**
  56 + * 46上行
  57 + */
  58 + private Short reply46;
  59 +
  60 + /**
  61 + * 47上行
  62 + */
  63 + private Short reply47;
  64 +
  65 +
  66 + @Embeddable
  67 + public static class DirectiveData {
  68 + // 公司代码
  69 + private short companyCode;
  70 +
  71 + // 设备号
  72 + private String deviceId;
  73 +
  74 + // 时间戳
  75 + private Long timestamp;
  76 +
  77 + // 保留 默认0
  78 + private short instructType = 0;
  79 +
  80 + /*
  81 + * 调度指令 调度指令。
  82 + * 0X00表示信息短语
  83 + * 0X01表示取消上次指令+调度指令(闹钟有效)
  84 + * 0x02表示为调度指令(闹钟有效)
  85 + * 0x03表示运营状态指令(闹钟无效)
  86 + * 0x04表示其他指令
  87 + */
  88 + private DispatchInstruct dispatchInstruct;
  89 +
  90 + // 唯一标识
  91 + private int msgId;
  92 +
  93 + // 闹钟
  94 + private Long alarmTime;
  95 +
  96 + // 多个运营状态字节
  97 + private Long serviceState;
  98 +
  99 + // 消息文本
  100 + private String txtContent;
  101 +
  102 + public short getCompanyCode() {
  103 + return companyCode;
  104 + }
  105 +
  106 + public void setCompanyCode(short companyCode) {
  107 + this.companyCode = companyCode;
  108 + }
  109 +
  110 + public String getDeviceId() {
  111 + return deviceId;
  112 + }
  113 +
  114 + public void setDeviceId(String deviceId) {
  115 + this.deviceId = deviceId;
  116 + }
  117 +
  118 + public Long getTimestamp() {
  119 + return timestamp;
  120 + }
  121 +
  122 + public void setTimestamp(Long timestamp) {
  123 + this.timestamp = timestamp;
  124 + }
  125 +
  126 + public short getInstructType() {
  127 + return instructType;
  128 + }
  129 +
  130 + public void setInstructType(short instructType) {
  131 + this.instructType = instructType;
  132 + }
  133 +
  134 + public DispatchInstruct getDispatchInstruct() {
  135 + return dispatchInstruct;
  136 + }
  137 +
  138 + public void setDispatchInstruct(DispatchInstruct dispatchInstruct) {
  139 + this.dispatchInstruct = dispatchInstruct;
  140 + }
  141 +
  142 + public int getMsgId() {
  143 + return msgId;
  144 + }
  145 +
  146 + public void setMsgId(int msgId) {
  147 + this.msgId = msgId;
  148 + }
  149 +
  150 + public Long getAlarmTime() {
  151 + return alarmTime;
  152 + }
  153 +
  154 + public void setAlarmTime(Long alarmTime) {
  155 + this.alarmTime = alarmTime;
  156 + }
  157 +
  158 + public Long getServiceState() {
  159 + return serviceState;
  160 + }
  161 +
  162 + public void setServiceState(Long serviceState) {
  163 + this.serviceState = serviceState;
  164 + }
  165 +
  166 + public String getTxtContent() {
  167 + return txtContent;
  168 + }
  169 +
  170 + public void setTxtContent(String txtContent) {
  171 + this.txtContent = txtContent;
  172 + }
  173 + }
30 174  
31 175 public Integer getId() {
32 176 return id;
... ... @@ -51,4 +195,44 @@ public class Directive {
51 195 public void setData(DirectiveData data) {
52 196 this.data = data;
53 197 }
  198 +
  199 + public String getDeviceId() {
  200 + return deviceId;
  201 + }
  202 +
  203 + public void setDeviceId(String deviceId) {
  204 + this.deviceId = deviceId;
  205 + }
  206 +
  207 + public Long getTimestamp() {
  208 + return timestamp;
  209 + }
  210 +
  211 + public void setTimestamp(Long timestamp) {
  212 + this.timestamp = timestamp;
  213 + }
  214 +
  215 + public Integer getMsgId() {
  216 + return msgId;
  217 + }
  218 +
  219 + public void setMsgId(Integer msgId) {
  220 + this.msgId = msgId;
  221 + }
  222 +
  223 + public Short getReply46() {
  224 + return reply46;
  225 + }
  226 +
  227 + public void setReply46(Short reply46) {
  228 + this.reply46 = reply46;
  229 + }
  230 +
  231 + public Short getReply47() {
  232 + return reply47;
  233 + }
  234 +
  235 + public void setReply47(Short reply47) {
  236 + this.reply47 = reply47;
  237 + }
54 238 }
... ...
src/main/java/com/bsth/vehicle/directive/entity/DirectiveData.java deleted 100644 → 0
1   -package com.bsth.vehicle.directive.entity;
2   -
3   -import javax.persistence.Embeddable;
4   -
5   -@Embeddable
6   -public class DirectiveData {
7   - // 公司代码
8   - private short companyCode;
9   -
10   - // 设备号
11   - private String deviceId;
12   -
13   - // 时间戳
14   - private Long timestamp;
15   -
16   - // 保留 默认0
17   - private short instructType = 0;
18   -
19   - /*
20   - * 调度指令 调度指令。 0X00表示信息短语 0X01表示取消上次指令+调度指令(闹钟有效) 0x02表示为调度指令(闹钟有效)
21   - * 0x03表示运营状态指令(闹钟无效) 0x04表示其他指令
22   - */
23   - private DispatchInstruct dispatchInstruct;
24   -
25   - // 唯一标识
26   - private Long msgId;
27   -
28   - // 闹钟
29   - private Long alarmTime;
30   -
31   - // 多个运营状态字节
32   - private Long serviceState;
33   -
34   - // 消息文本
35   - private String txtContent;
36   -
37   - public short getCompanyCode() {
38   - return companyCode;
39   - }
40   -
41   - public void setCompanyCode(short companyCode) {
42   - this.companyCode = companyCode;
43   - }
44   -
45   - public String getDeviceId() {
46   - return deviceId;
47   - }
48   -
49   - public void setDeviceId(String deviceId) {
50   - this.deviceId = deviceId;
51   - }
52   -
53   - public Long getTimestamp() {
54   - return timestamp;
55   - }
56   -
57   - public void setTimestamp(Long timestamp) {
58   - this.timestamp = timestamp;
59   - }
60   -
61   - public short getInstructType() {
62   - return instructType;
63   - }
64   -
65   - public void setInstructType(short instructType) {
66   - this.instructType = instructType;
67   - }
68   -
69   - public DispatchInstruct getDispatchInstruct() {
70   - return dispatchInstruct;
71   - }
72   -
73   - public void setDispatchInstruct(DispatchInstruct dispatchInstruct) {
74   - this.dispatchInstruct = dispatchInstruct;
75   - }
76   -
77   - public Long getMsgId() {
78   - return msgId;
79   - }
80   -
81   - public void setMsgId(Long msgId) {
82   - this.msgId = msgId;
83   - }
84   -
85   - public Long getAlarmTime() {
86   - return alarmTime;
87   - }
88   -
89   - public void setAlarmTime(Long alarmTime) {
90   - this.alarmTime = alarmTime;
91   - }
92   -
93   - public Long getServiceState() {
94   - return serviceState;
95   - }
96   -
97   - public void setServiceState(Long serviceState) {
98   - this.serviceState = serviceState;
99   - }
100   -
101   - public String getTxtContent() {
102   - return txtContent;
103   - }
104   -
105   - public void setTxtContent(String txtContent) {
106   - this.txtContent = txtContent;
107   - }
108   -}
src/main/java/com/bsth/vehicle/directive/entity/DirectiveReply.java 0 → 100644
  1 +package com.bsth.vehicle.directive.entity;
  2 +
  3 +/**
  4 + *
  5 + * @ClassName: DirectiveReply
  6 + * @Description: TODO(上行响应)
  7 + * @author PanZhao
  8 + * @date 2016年6月7日 下午8:41:11
  9 + *
  10 + */
  11 +public class DirectiveReply {
  12 +
  13 + //设备编号
  14 + private String deviceId;
  15 +
  16 + private Integer msgId;
  17 +
  18 + /**
  19 + * operCode 为 0x80时无数据
  20 + * 0表示失败
  21 + * 1表示成功或设备确认
  22 + * 2表示驾驶员阅读
  23 + */
  24 + private Integer status;
  25 +
  26 + //时间戳(ms)
  27 + private Long timestamp;
  28 +
  29 + public String getDeviceId() {
  30 + return deviceId;
  31 + }
  32 +
  33 + public void setDeviceId(String deviceId) {
  34 + this.deviceId = deviceId;
  35 + }
  36 +
  37 + public Integer getMsgId() {
  38 + return msgId;
  39 + }
  40 +
  41 + public void setMsgId(Integer msgId) {
  42 + this.msgId = msgId;
  43 + }
  44 +
  45 + public Long getTimestamp() {
  46 + return timestamp;
  47 + }
  48 +
  49 + public void setTimestamp(Long timestamp) {
  50 + this.timestamp = timestamp;
  51 + }
  52 +
  53 + public Integer getStatus() {
  54 + return status;
  55 + }
  56 +
  57 + public void setStatus(Integer status) {
  58 + this.status = status;
  59 + }
  60 +}
... ...
src/main/java/com/bsth/vehicle/directive/entity/DispatchInstruct.java
... ... @@ -3,21 +3,35 @@ package com.bsth.vehicle.directive.entity;
3 3 /**
4 4 *
5 5 * @ClassName: DispatchInstruct
6   - * @Description: TODO(调度指令)
  6 + * @Description: TODO(调度指令类型)
7 7 * @author PanZhao
8 8 * @date 2016年6月7日 下午2:15:10
9 9 *
10 10 */
11 11 public enum DispatchInstruct {
12   - // 信息短语
  12 + /**
  13 + * 信息短语
  14 + */
13 15 PHRASE((byte) 0x00),
14   - // 取消上次指令+调度指令(闹钟有效)
  16 +
  17 + /**
  18 + * 取消上次指令+调度指令(闹钟有效)
  19 + */
15 20 CANCEL_AND_CLOCK_ON((byte) 0x01),
16   - // 调度指令(闹钟有效)
  21 +
  22 + /**
  23 + * 调度指令(闹钟有效)
  24 + */
17 25 DISPATCH_CLOCK_ON((byte) 0x02),
18   - // 运营状态指令(闹钟无效)
  26 +
  27 + /**
  28 + * 运营状态指令(闹钟无效)
  29 + */
19 30 OPERATE_CLOCK_OFF((byte) 0x03),
20   - // 其他
  31 +
  32 + /**
  33 + * 其他
  34 + */
21 35 OTHER((byte) 0x04);
22 36  
23 37 private final byte value;
... ...
src/main/java/com/bsth/vehicle/directive/entity/DriverReport.java 0 → 100644
  1 +package com.bsth.vehicle.directive.entity;
  2 +
  3 +import javax.persistence.Embeddable;
  4 +import javax.persistence.Entity;
  5 +import javax.persistence.GeneratedValue;
  6 +import javax.persistence.Id;
  7 +import javax.persistence.Table;
  8 +
  9 +/**
  10 + *
  11 + * @ClassName: DriverReport
  12 + * @Description: TODO(驾驶员上报)
  13 + * @author PanZhao
  14 + * @date 2016年6月8日 下午12:36:42
  15 + *
  16 + */
  17 +@Entity
  18 +@Table(name = "bsth_v_report_80")
  19 +public class DriverReport {
  20 +
  21 + @Id
  22 + @GeneratedValue
  23 + private Integer id;
  24 +
  25 + /**
  26 + * 设备编号
  27 + */
  28 + private String deviceId;
  29 +
  30 + /**
  31 + * 时间戳(ms)
  32 + */
  33 + private Long timestamp;
  34 +
  35 + /**
  36 + * 一级协议
  37 + */
  38 + private Short operCode;
  39 +
  40 + private DriverReportData data;
  41 +
  42 + @Embeddable
  43 + public static class DriverReportData {
  44 +
  45 + private Short operCode2;
  46 +
  47 + /**
  48 + * 请求代码 0xa1 恢复运营 0xa2 申请调档 0xa3 出场请求 0xa5 进场请求 0xa7 加油请求 0x50 车辆故障 0x70
  49 + * 路阻报告 0x60 事故报告 0x11 扣证纠纷 0x12 报警
  50 + */
  51 + private Short requestCode;
  52 +
  53 + /**
  54 + * 线路编码
  55 + */
  56 + private Integer lineId;
  57 +
  58 + public Short getOperCode2() {
  59 + return operCode2;
  60 + }
  61 +
  62 + public void setOperCode2(Short operCode2) {
  63 + this.operCode2 = operCode2;
  64 + }
  65 +
  66 + public Short getRequestCode() {
  67 + return requestCode;
  68 + }
  69 +
  70 + public void setRequestCode(Short requestCode) {
  71 + this.requestCode = requestCode;
  72 + }
  73 +
  74 + public Integer getLineId() {
  75 + return lineId;
  76 + }
  77 +
  78 + public void setLineId(Integer lineId) {
  79 + this.lineId = lineId;
  80 + }
  81 + }
  82 +
  83 + public Integer getId() {
  84 + return id;
  85 + }
  86 +
  87 + public void setId(Integer id) {
  88 + this.id = id;
  89 + }
  90 +
  91 + public String getDeviceId() {
  92 + return deviceId;
  93 + }
  94 +
  95 + public void setDeviceId(String deviceId) {
  96 + this.deviceId = deviceId;
  97 + }
  98 +
  99 + public Long getTimestamp() {
  100 + return timestamp;
  101 + }
  102 +
  103 + public void setTimestamp(Long timestamp) {
  104 + this.timestamp = timestamp;
  105 + }
  106 +
  107 + public Short getOperCode() {
  108 + return operCode;
  109 + }
  110 +
  111 + public void setOperCode(Short operCode) {
  112 + this.operCode = operCode;
  113 + }
  114 +
  115 + public DriverReportData getData() {
  116 + return data;
  117 + }
  118 +
  119 + public void setData(DriverReportData data) {
  120 + this.data = data;
  121 + }
  122 +}
... ...
src/main/java/com/bsth/vehicle/directive/entity/LineChange.java 0 → 100644
  1 +package com.bsth.vehicle.directive.entity;
  2 +
  3 +import javax.persistence.Table;
  4 +import javax.persistence.Transient;
  5 +import javax.persistence.Embeddable;
  6 +import javax.persistence.Entity;
  7 +import javax.persistence.GeneratedValue;
  8 +import javax.persistence.Id;
  9 +
  10 +/**
  11 + *
  12 + * @ClassName: LineChange
  13 + * @Description: TODO(线路切换指令)
  14 + * @author PanZhao
  15 + * @date 2016年6月8日 下午1:41:15
  16 + *
  17 + */
  18 +@Entity
  19 +@Table(name = "bsth_v_directive_64")
  20 +public class LineChange {
  21 +
  22 + @Id
  23 + @GeneratedValue
  24 + private Integer id;
  25 +
  26 + /**
  27 + * 设备编号
  28 + */
  29 + @Transient
  30 + private String deviceId;
  31 +
  32 + /**
  33 + * 时间戳(ms)
  34 + */
  35 + private Long timestamp;
  36 +
  37 + /**
  38 + * 一级协议
  39 + */
  40 + private Short operCode;
  41 +
  42 + /**
  43 + * 设备响应应答字
  44 + * 0x06同意 0x15不同意
  45 + */
  46 + private Short respAck;
  47 +
  48 + private LineChangeData data;
  49 +
  50 + @Embeddable
  51 + public static class LineChangeData {
  52 +
  53 + private Short cityCode;
  54 +
  55 + private String deviceId;
  56 +
  57 + private String lineId;
  58 +
  59 + public Short getCityCode() {
  60 + return cityCode;
  61 + }
  62 +
  63 + public void setCityCode(Short cityCode) {
  64 + this.cityCode = cityCode;
  65 + }
  66 +
  67 + public String getDeviceId() {
  68 + return deviceId;
  69 + }
  70 +
  71 + public void setDeviceId(String deviceId) {
  72 + this.deviceId = deviceId;
  73 + }
  74 +
  75 + public String getLineId() {
  76 + return lineId;
  77 + }
  78 +
  79 + public void setLineId(String lineId) {
  80 + this.lineId = lineId;
  81 + }
  82 + }
  83 +
  84 + public Integer getId() {
  85 + return id;
  86 + }
  87 +
  88 + public void setId(Integer id) {
  89 + this.id = id;
  90 + }
  91 +
  92 + public String getDeviceId() {
  93 + return deviceId;
  94 + }
  95 +
  96 + public void setDeviceId(String deviceId) {
  97 + this.deviceId = deviceId;
  98 + }
  99 +
  100 + public Long getTimestamp() {
  101 + return timestamp;
  102 + }
  103 +
  104 + public void setTimestamp(Long timestamp) {
  105 + this.timestamp = timestamp;
  106 + }
  107 +
  108 + public Short getOperCode() {
  109 + return operCode;
  110 + }
  111 +
  112 + public void setOperCode(Short operCode) {
  113 + this.operCode = operCode;
  114 + }
  115 +
  116 + public LineChangeData getData() {
  117 + return data;
  118 + }
  119 +
  120 + public void setData(LineChangeData data) {
  121 + this.data = data;
  122 + }
  123 +
  124 + public Short getRespAck() {
  125 + return respAck;
  126 + }
  127 +
  128 + public void setRespAck(Short respAck) {
  129 + this.respAck = respAck;
  130 + }
  131 +}
... ...
src/main/java/com/bsth/vehicle/directive/repository/DirectiveRepository.java 0 → 100644
  1 +package com.bsth.vehicle.directive.repository;
  2 +
  3 +import org.springframework.stereotype.Repository;
  4 +
  5 +import com.bsth.repository.BaseRepository;
  6 +import com.bsth.vehicle.directive.entity.Directive;
  7 +
  8 +@Repository
  9 +public interface DirectiveRepository extends BaseRepository<Directive, Integer>{
  10 +
  11 +}
... ...
src/main/java/com/bsth/vehicle/directive/repository/DriverReportRepository.java 0 → 100644
  1 +package com.bsth.vehicle.directive.repository;
  2 +
  3 +import org.springframework.stereotype.Repository;
  4 +
  5 +import com.bsth.repository.BaseRepository;
  6 +import com.bsth.vehicle.directive.entity.DriverReport;
  7 +
  8 +@Repository
  9 +public interface DriverReportRepository extends BaseRepository<DriverReport, Integer>{
  10 +
  11 +}
... ...
src/main/java/com/bsth/vehicle/directive/repository/LineChangeRepository.java 0 → 100644
  1 +package com.bsth.vehicle.directive.repository;
  2 +
  3 +import org.springframework.stereotype.Repository;
  4 +
  5 +import com.bsth.repository.BaseRepository;
  6 +import com.bsth.vehicle.directive.entity.LineChange;
  7 +
  8 +@Repository
  9 +public interface LineChangeRepository extends BaseRepository<LineChange, Integer>{
  10 +
  11 +}
... ...
src/main/java/com/bsth/vehicle/directive/service/DirectiveService.java 0 → 100644
  1 +package com.bsth.vehicle.directive.service;
  2 +
  3 +
  4 +import com.bsth.service.BaseService;
  5 +import com.bsth.vehicle.directive.entity.Directive;
  6 +
  7 +public interface DirectiveService extends BaseService<Directive, Integer>{
  8 +
  9 + /**
  10 + *
  11 + * @Title: send60Phrase
  12 + * @Description: TODO(60短语下发)
  13 + * @param @param nbbm 车辆内部编码
  14 + * @param @param text 短语
  15 + * @return int 返回类型
  16 + * @throws
  17 + */
  18 + int send60Phrase(String nbbm, String text);
  19 +
  20 + int send60Dispatch(String nbbm, String text);
  21 +
  22 + //60营运指令
  23 + int send60Operation(String nbbm, int state, int upDown);
  24 +
  25 + /**
  26 + *
  27 + * @Title: lineChange
  28 + * @Description: TODO(线路切换)
  29 + * @param @param nbbm 车辆内部编码
  30 + * @param @param lineId 新线路编码
  31 + * @throws
  32 + */
  33 + int lineChange(String nbbm, Integer lineId);
  34 +}
... ...
src/main/java/com/bsth/vehicle/directive/service/DirectiveServiceImpl.java 0 → 100644
  1 +package com.bsth.vehicle.directive.service;
  2 +
  3 +import java.io.IOException;
  4 +
  5 +import org.apache.http.client.methods.CloseableHttpResponse;
  6 +import org.apache.http.client.methods.HttpPost;
  7 +import org.apache.http.entity.StringEntity;
  8 +import org.apache.http.impl.client.CloseableHttpClient;
  9 +import org.apache.http.impl.client.HttpClients;
  10 +import org.apache.http.util.EntityUtils;
  11 +import org.slf4j.Logger;
  12 +import org.slf4j.LoggerFactory;
  13 +import org.springframework.beans.factory.annotation.Autowired;
  14 +import org.springframework.stereotype.Service;
  15 +
  16 +import com.alibaba.fastjson.JSON;
  17 +import com.alibaba.fastjson.JSONObject;
  18 +import com.bsth.service.impl.BaseServiceImpl;
  19 +import com.bsth.vehicle.common.CommonMapped;
  20 +import com.bsth.vehicle.directive.Consts;
  21 +import com.bsth.vehicle.directive.MsgIdGenerator;
  22 +import com.bsth.vehicle.directive.buffer.DirectiveBuffer;
  23 +import com.bsth.vehicle.directive.entity.Directive;
  24 +import com.bsth.vehicle.directive.entity.Directive.DirectiveData;
  25 +import com.bsth.vehicle.directive.entity.DispatchInstruct;
  26 +import com.bsth.vehicle.directive.entity.LineChange;
  27 +import com.bsth.vehicle.directive.entity.LineChange.LineChangeData;
  28 +import com.bsth.vehicle.directive.repository.DirectiveRepository;
  29 +import com.bsth.vehicle.directive.repository.LineChangeRepository;
  30 +import com.bsth.vehicle.gpsdata.buffer.GpsRealDataBuffer;
  31 +import com.bsth.vehicle.gpsdata.entity.GpsRealData;
  32 +
  33 +@Service
  34 +public class DirectiveServiceImpl extends BaseServiceImpl<Directive, Integer> implements DirectiveService{
  35 +
  36 + Logger logger = LoggerFactory.getLogger(this.getClass());
  37 +
  38 + @Autowired
  39 + DirectiveRepository directiveRepository;
  40 +
  41 + @Autowired
  42 + GpsRealDataBuffer gpsRealDataBuffer;
  43 +
  44 + @Autowired
  45 + LineChangeRepository lineChangeRepository;
  46 +
  47 + @Override
  48 + public int send60Phrase(String nbbm, String text) {
  49 + Directive directive = create60Data(nbbm, text, DispatchInstruct.PHRASE);
  50 +
  51 + //发送指令
  52 + int code = postJson(JSON.toJSONString(directive));
  53 +
  54 + if(code == 0){
  55 + //添加到缓存,等待入库
  56 + DirectiveBuffer.put(directive);
  57 + }else{
  58 + logger.error("send60Phrase error, code: " + code);
  59 + }
  60 + return code;
  61 + }
  62 +
  63 + @Override
  64 + public int send60Dispatch(String nbbm, String text) {
  65 + return 0;
  66 + }
  67 +
  68 + @Override
  69 + public int send60Operation(String nbbm, int state, int upDown) {
  70 + return 0;
  71 + }
  72 +
  73 + /**
  74 + * 线路切换
  75 + */
  76 + @Override
  77 + public int lineChange(String nbbm, Integer lineId) {
  78 + Long t = System.currentTimeMillis();
  79 + String deviceId = CommonMapped.vehicDeviceBiMap.inverse().get(nbbm);
  80 +
  81 + LineChange change = new LineChange();
  82 + LineChangeData data = new LineChangeData();
  83 + //暂时写死,没什么用
  84 + data.setCityCode((short) 22);
  85 + data.setDeviceId(deviceId);
  86 + data.setLineId(String.valueOf(lineId));
  87 +
  88 + change.setDeviceId(deviceId);
  89 + change.setOperCode((short) 0X64);
  90 + change.setTimestamp(t);
  91 + change.setData(data);
  92 +
  93 + int code = 0;//postJson(JSON.toJSONString(change));
  94 + //if(code == 0){
  95 + //入库
  96 + lineChangeRepository.save(change);
  97 + DirectiveBuffer.changeMap.put(deviceId + '_' + t , change);
  98 + //}else{
  99 + // logger.error("send60Phrase error, code: " + code);
  100 + //}
  101 + return code;
  102 + }
  103 +
  104 +
  105 + public Directive create60Data(String nbbm, String text, DispatchInstruct dispatchInstruct){
  106 + Long timestamp = System.currentTimeMillis();
  107 +
  108 + String deviceId = CommonMapped.vehicDeviceBiMap.inverse().get(nbbm);
  109 + Short company = Short.parseShort(CommonMapped.vehicCompanyMap.get(nbbm));
  110 + if(null == deviceId){
  111 + logger.error("没有设备号对照的车辆:" + nbbm);
  112 + return null;
  113 + }
  114 +
  115 + GpsRealData gpsData = gpsRealDataBuffer.findOneByDeviceId(deviceId);
  116 + if(null == gpsData){
  117 + logger.error("没有找到gps对照,无法确认营运状态和上下行:" + nbbm);
  118 + return null;
  119 + }
  120 +
  121 + int msgId = MsgIdGenerator.getMsgId();
  122 +
  123 + Directive directive = new Directive();
  124 + DirectiveData data = new DirectiveData();
  125 + //一级协议
  126 + directive.setOperCode((short) 0x60);
  127 + //设备号
  128 + directive.setDeviceId(deviceId);
  129 + //时间戳
  130 + directive.setTimestamp(timestamp);
  131 + directive.setMsgId(msgId);
  132 + //构造数据
  133 + data.setDeviceId(deviceId);
  134 + data.setDispatchInstruct(dispatchInstruct);
  135 + data.setTimestamp(timestamp);
  136 + data.setCompanyCode(company);
  137 + data.setMsgId(msgId);
  138 + directive.setData(data);
  139 + long serviceState;
  140 + try{
  141 + serviceState = Consts.SERVICE_STATE[gpsData.getUpDown()][gpsData.getState()];
  142 + }catch(IndexOutOfBoundsException e){
  143 + //未知营运状态的直接默认为上行非营运
  144 + serviceState = Consts.SERVICE_STATE[0][1];
  145 + }
  146 + data.setServiceState(serviceState);
  147 + data.setTxtContent(text);
  148 +
  149 + return directive;
  150 + }
  151 +
  152 + public int postJson(String jsonStr){
  153 + CloseableHttpClient httpClient = null;
  154 + int code = -1;
  155 + try{
  156 + httpClient = HttpClients.createDefault();
  157 + HttpPost post = new HttpPost(Consts.SEND_DIRECTIVE_URL);
  158 +
  159 + post.setEntity(new StringEntity(jsonStr, "utf-8"));
  160 +
  161 + CloseableHttpResponse response = httpClient.execute(post);
  162 +
  163 + JSONObject json = JSONObject.parseObject(EntityUtils.toString(response.getEntity()));
  164 + if(null != json && json.getInteger("errCode") == 0)
  165 + code = 0;
  166 + else
  167 + logger.error("和网关http通讯失败,rs: " + json);
  168 + }catch(Exception e){
  169 + logger.error("", e);
  170 + }finally {
  171 + try {
  172 + if(httpClient != null)
  173 + httpClient.close();
  174 + } catch (IOException e) {
  175 + logger.error("", e);
  176 + }
  177 + }
  178 + return code;
  179 + }
  180 +}
... ...
src/main/java/com/bsth/vehicle/gpsdata/GpsRefreshThread.java
... ... @@ -52,8 +52,6 @@ public class GpsRefreshThread extends Thread{
52 52 @Override
53 53 public void run() {
54 54 try{
55   - long t = System.currentTimeMillis();
56   -
57 55 List<GpsRealData> newList = getterRealGpsData();
58 56  
59 57 if(gpsBuffer.isNullEmpty())
... ... @@ -85,10 +83,10 @@ public class GpsRefreshThread extends Thread{
85 83 gpsBuffer.setLastUpdateTime(System.currentTimeMillis());
86 84 }
87 85  
88   - logger.info("本次刷新GPS实时数据耗时:" + (System.currentTimeMillis() - t) + "毫秒");
  86 + //logger.info("本次刷新GPS实时数据耗时:" + (System.currentTimeMillis() - t) + "毫秒");
89 87 }catch(Exception e){
90 88 //logger.error("", e);
91   - logger.error("加载gps数据失败");
  89 + logger.error("加载gps数据失败," + e.getMessage());
92 90 }
93 91 }
94 92  
... ...
src/main/java/com/bsth/vehicle/gpsdata/buffer/GpsRealDataBuffer.java
... ... @@ -9,13 +9,8 @@ import java.util.Set;
9 9  
10 10 import org.slf4j.Logger;
11 11 import org.slf4j.LoggerFactory;
12   -import org.springframework.beans.factory.annotation.Autowired;
13 12 import org.springframework.stereotype.Component;
14 13  
15   -import com.bsth.entity.Cars;
16   -import com.bsth.entity.Station;
17   -import com.bsth.repository.CarsRepository;
18   -import com.bsth.repository.StationRepository;
19 14 import com.bsth.vehicle.gpsdata.entity.GpsRealData;
20 15 import com.google.common.collect.ArrayListMultimap;
21 16 import com.google.common.collect.ImmutableMap;
... ... @@ -34,12 +29,6 @@ public class GpsRealDataBuffer {
34 29  
35 30 private Logger logger = LoggerFactory.getLogger(this.getClass());
36 31  
37   - @Autowired
38   - CarsRepository carsRepository;
39   -
40   - @Autowired
41   - StationRepository stationRepository;
42   -
43 32 /**
44 33 * 线路和GPS对照
45 34 *(K: 线路编码 ,V:GpsRealData)
... ... @@ -89,36 +78,6 @@ public class GpsRealDataBuffer {
89 78 deviceGpsMap.put(gpsData.getDeviceId(), gpsData);
90 79 }
91 80 logger.info("init gps buffer gps! list size: " + list.size());
92   - initDeviceMapp();
93   - initStationCodeMap();
94   - }
95   -
96   - public void initDeviceMapp(){
97   - //初始化车辆设备号对照
98   - vehicDeviceMap = new HashMap<>();
99   - Iterator<Cars> carIterator = carsRepository.findAll().iterator();
100   -
101   - Cars car;
102   - while(carIterator.hasNext()){
103   - car = carIterator.next();
104   - vehicDeviceMap.put(car.getEquipmentCode(), car.getInsideCode());
105   - }
106   -
107   - logger.info("初始化车辆设备号对照 数量: " + vehicDeviceMap.size());
108   - }
109   -
110   - public void initStationCodeMap(){
111   - //初始化站点和编码对照
112   - stationCodeMap = new HashMap<>();
113   - Iterator<Station> iterator = stationRepository.findAll().iterator();
114   -
115   - Station station;
116   - while(iterator.hasNext()){
117   - station = iterator.next();
118   - stationCodeMap.put(station.getStationCod(), station.getStationName());
119   - }
120   -
121   - logger.info("初始化站点编码对照 数量: " + stationCodeMap.size());
122 81 }
123 82  
124 83 public void putLineMultimap(String lineCode, GpsRealData gpsData){
... ... @@ -154,7 +113,7 @@ public class GpsRealDataBuffer {
154 113 gpsdata = iterator.next();
155 114 lineGpsMultimap.put(gpsdata.getLineId(), gpsdata);
156 115 }
157   - logger.info("update gps buffer over! new gps list size: " + upGpsList.size() + " - lineGpsMultimap size: " + lineGpsMultimap.size());
  116 + //logger.info("update gps buffer over! new gps list size: " + upGpsList.size() + " - lineGpsMultimap size: " + lineGpsMultimap.size());
158 117 }
159 118  
160 119 /**
... ... @@ -213,6 +172,10 @@ public class GpsRealDataBuffer {
213 172 return list;
214 173 }
215 174  
  175 + public GpsRealData findOneByDeviceId(String deviceId){
  176 + return deviceGpsMap.get(deviceId);
  177 + }
  178 +
216 179  
217 180 public void setLastUpdateTime(Long time){
218 181 lastUpdateTime = time;
... ...
src/main/resources/application.properties
... ... @@ -9,9 +9,9 @@ spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy
9 9 spring.jpa.database= MYSQL
10 10 spring.jpa.show-sql= true
11 11 spring.datasource.driver-class-name= com.mysql.jdbc.Driver
12   -spring.datasource.url= jdbc:mysql://192.168.168.201:3306/control
  12 +spring.datasource.url= jdbc:mysql://127.0.0.1:3306/control
13 13 spring.datasource.username= root
14   -spring.datasource.password= 123456
  14 +spring.datasource.password= panzhao
15 15  
16 16 #DATASOURCE
17 17 spring.datasource.max-active=100
... ... @@ -26,5 +26,8 @@ server.session-timeout=-1
26 26 security.basic.enabled=false
27 27  
28 28 ##
29   -#http.gps.real.url= http://222.66.0.204:5555/transport_server/rtgps/
  29 +#222.66.0.204:5555
  30 +##\u5B9E\u65F6gps
30 31 http.gps.real.url= http://192.168.168.192:8080/transport_server/rtgps/
  32 +##\u6D88\u606F\u4E0B\u53D1
  33 +http.send.directive = http://192.168.168.192:8080/transport_server/message/
... ...
src/main/resources/fatso/exclude.txt 0 → 100644
src/main/resources/logback.xml
... ... @@ -17,9 +17,9 @@
17 17 <!-- 主日志文件 -->
18 18 <appender name="FILE"
19 19 class="ch.qos.logback.core.rolling.RollingFileAppender">
20   - <file>${LOG_BASE}/main.log</file>
  20 + <file>${LOG_BASE}/main/main.log</file>
21 21 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
22   - <fileNamePattern>${LOG_BASE}/main-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  22 + <fileNamePattern>${LOG_BASE}/main/main-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
23 23 <timeBasedFileNamingAndTriggeringPolicy
24 24 class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
25 25 <maxFileSize>100MB</maxFileSize>
... ... @@ -39,28 +39,47 @@
39 39 <!-- 访问日志 -->
40 40 <appender name="ACCESS"
41 41 class="ch.qos.logback.core.rolling.RollingFileAppender">
42   - <file>${LOG_BASE}/access.log</file>
  42 + <file>${LOG_BASE}/access/access.log</file>
43 43 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
44   - <fileNamePattern>${LOG_BASE}/access-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  44 + <fileNamePattern>${LOG_BASE}/access/access-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
45 45 <timeBasedFileNamingAndTriggeringPolicy
46 46 class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
47 47 <maxFileSize>100MB</maxFileSize>
48 48 </timeBasedFileNamingAndTriggeringPolicy>
49 49 </rollingPolicy>
50   - <encoder>
51   - <pattern>%msg%n</pattern>
52   - </encoder>
53 50  
54 51 <layout class="ch.qos.logback.classic.PatternLayout">
55 52 <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
56   - <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%file:%line] %-5level -%msg%n
  53 + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level -%msg%n
57 54 </pattern>
58 55 </layout>
59 56 </appender>
60   -
61 57 <logger name="com.bsth.filter.AccessLogFilter" level="INFO" additivity="false">
62 58 <appender-ref ref="ACCESS" />
63 59 </logger>
  60 +
  61 + <!-- 调度指令日志 -->
  62 + <appender name="DEVICE"
  63 + class="ch.qos.logback.core.rolling.RollingFileAppender">
  64 + <file>${LOG_BASE}/device/device.log</file>
  65 + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  66 + <fileNamePattern>${LOG_BASE}/device/device-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  67 + <timeBasedFileNamingAndTriggeringPolicy
  68 + class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  69 + <maxFileSize>100MB</maxFileSize>
  70 + </timeBasedFileNamingAndTriggeringPolicy>
  71 + </rollingPolicy>
  72 +
  73 + <layout class="ch.qos.logback.classic.PatternLayout">
  74 + <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
  75 + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%file:%line] %-5level -%msg%n
  76 + </pattern>
  77 + </layout>
  78 + </appender>
  79 + <logger name="com.bsth.vehicle" level="INFO" additivity="false">
  80 + <appender-ref ref="DEVICE" />
  81 + </logger>
  82 +
64 83  
65 84 <!-- 日志输出级别 -->
66 85 <root level="info">
... ...