Commit 0e0673d249760c2bb53905378545d620f04ceff2
Merge branch 'minhang' into qingpu
Showing
54 changed files
with
2824 additions
and
1281 deletions
Too many changes to show.
To preserve performance only 54 of 713 files are displayed.
pom.xml
| ... | ... | @@ -225,6 +225,12 @@ |
| 225 | 225 | <artifactId>spring-boot-devtools</artifactId> |
| 226 | 226 | <optional>true</optional> |
| 227 | 227 | </dependency>--> |
| 228 | + <dependency> | |
| 229 | + <groupId>com.vividsolutions</groupId> | |
| 230 | + <artifactId>jts</artifactId> | |
| 231 | + <version>1.13</version> | |
| 232 | + </dependency> | |
| 233 | + | |
| 228 | 234 | </dependencies> |
| 229 | 235 | |
| 230 | 236 | <dependencyManagement> | ... | ... |
src/main/java/com/bsth/controller/BaseController2.java
| ... | ... | @@ -187,9 +187,11 @@ public class BaseController2<T, ID extends Serializable> { |
| 187 | 187 | } |
| 188 | 188 | |
| 189 | 189 | System.out.println(outputfile.getName()); |
| 190 | + System.out.println(outputfile.getAbsolutePath()); | |
| 191 | + | |
| 190 | 192 | String filePath = outputfile.getAbsolutePath(); |
| 191 | - String fp[] = filePath.split(File.separator); | |
| 192 | - String fileName = fp[fp.length - 1]; | |
| 193 | +// String fp[] = filePath.split(File.separator); | |
| 194 | +// String fileName = fp[fp.length - 1]; | |
| 193 | 195 | |
| 194 | 196 | // TODO:使用ktr获取导出数据 |
| 195 | 197 | ... | ... |
src/main/java/com/bsth/controller/BusIntervalController.java
| ... | ... | @@ -22,6 +22,11 @@ public class BusIntervalController { |
| 22 | 22 | public List<Map<String,Object>> getDir(@RequestParam Map<String, Object> map){ |
| 23 | 23 | return busIntervalService.getDir(map); |
| 24 | 24 | } |
| 25 | + | |
| 26 | + @RequestMapping(value = "/getLp", method = RequestMethod.GET) | |
| 27 | + public List<Map<String,Object>> getLp(@RequestParam Map<String, Object> map){ | |
| 28 | + return busIntervalService.getLp(map); | |
| 29 | + } | |
| 25 | 30 | |
| 26 | 31 | @RequestMapping(value = "/interval", method = RequestMethod.GET) |
| 27 | 32 | public List<Map<String,Object>> interval(@RequestParam Map<String, Object> map){ | ... | ... |
src/main/java/com/bsth/controller/forms/ExportController.java
| ... | ... | @@ -65,10 +65,12 @@ public class ExportController { |
| 65 | 65 | i++; |
| 66 | 66 | } |
| 67 | 67 | |
| 68 | + | |
| 69 | + | |
| 68 | 70 | try { |
| 69 | 71 | listI.add(resList.iterator()); |
| 70 | 72 | String path = this.getClass().getResource("/").getPath() + "static\\pages\\forms\\"; |
| 71 | - ee.excelReplace(listI, new Object[] { map }, path + "mould\\linepassengerflow.xls", | |
| 73 | + ee.excelReplace(listI, new Object[] { map }, path + "mould\\linepasswengerflow.xls", | |
| 72 | 74 | path + "export\\线路客流量报表" + sdfSimple.format(sdfMonth.parse(map.get("date").toString())) + ".xls"); |
| 73 | 75 | } catch (Exception e) { |
| 74 | 76 | e.printStackTrace(); |
| ... | ... | @@ -189,7 +191,7 @@ public class ExportController { |
| 189 | 191 | listI.add(resList.iterator()); |
| 190 | 192 | String path = this.getClass().getResource("/").getPath() + "static\\pages\\forms\\"; |
| 191 | 193 | ee.excelReplace(listI, new Object[] { map }, path + "mould\\singledata.xls", |
| 192 | - path + "export\\路单报表" + sdfSimple.format(sdfMonth.parse(map.get("startDate").toString())) + ".xls"); | |
| 194 | + path + "export\\路单数据" + sdfSimple.format(sdfMonth.parse(map.get("startDate").toString())) + ".xls"); | |
| 193 | 195 | } catch (Exception e) { |
| 194 | 196 | e.printStackTrace(); |
| 195 | 197 | } |
| ... | ... | @@ -203,8 +205,8 @@ public class ExportController { |
| 203 | 205 | SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"), sdfSimple = new SimpleDateFormat("yyyyMMdd"); |
| 204 | 206 | List<Iterator<?>> listI = new ArrayList<Iterator<?>>(); |
| 205 | 207 | ReportUtils ee = new ReportUtils(); |
| 206 | - List<Vehicleloading> vehicleloading = formsService.vehicleloading(/*map.get("gsdmVehic").toString(),map.get("fgsdmVehic").toString(),*/map.get("line").toString(), | |
| 207 | - map.get("date").toString()); | |
| 208 | + List<Vehicleloading> vehicleloading = formsService.vehicleloading(map.get("gsdmVehic").toString(),map.get("fgsdmVehic").toString(),map.get("line").toString(), | |
| 209 | + map.get("data").toString()); | |
| 208 | 210 | List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>(); |
| 209 | 211 | int i = 1; |
| 210 | 212 | for (Vehicleloading l : vehicleloading) { |
| ... | ... | @@ -214,8 +216,8 @@ public class ExportController { |
| 214 | 216 | m.put("gS", l.getgS()); |
| 215 | 217 | m.put("xL", l.getxL()); |
| 216 | 218 | m.put("clzbh", l.getClzbh()); |
| 217 | - m.put("hyl", l.getHyl()); | |
| 218 | 219 | m.put("jzl", l.getJzl()); |
| 220 | + m.put("hyl", l.getHyl()); | |
| 219 | 221 | m.put("ls", l.getLs()); |
| 220 | 222 | m.put("jhlc", l.getJhlc()); |
| 221 | 223 | m.put("unyyyl", l.getUnyyyl()); |
| ... | ... | @@ -229,7 +231,7 @@ public class ExportController { |
| 229 | 231 | listI.add(resList.iterator()); |
| 230 | 232 | String path = this.getClass().getResource("/").getPath() + "static\\pages\\forms\\"; |
| 231 | 233 | ee.excelReplace(listI, new Object[] { map }, path + "mould\\vehicleloading.xls", |
| 232 | - path + "export\\车辆加注" + sdfSimple.format(sdfMonth.parse(map.get("date").toString())) + ".xls"); | |
| 234 | + path + "export\\车辆加注" + sdfSimple.format(sdfMonth.parse(map.get("dat").toString())) + ".xls"); | |
| 233 | 235 | } catch (Exception e) { |
| 234 | 236 | e.printStackTrace(); |
| 235 | 237 | } |
| ... | ... | @@ -417,5 +419,9 @@ public class ExportController { |
| 417 | 419 | } |
| 418 | 420 | return resList; |
| 419 | 421 | } |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 420 | 426 | |
| 421 | 427 | } | ... | ... |
src/main/java/com/bsth/controller/forms/MCY_FormsController.java
| ... | ... | @@ -80,9 +80,9 @@ public class MCY_FormsController { |
| 80 | 80 | |
| 81 | 81 | // 车辆加注 |
| 82 | 82 | @RequestMapping(value = "/vehicleloading", method = RequestMethod.POST) |
| 83 | - public List<Vehicleloading> vehicleloading(/*@RequestParam String gsdmVehic, @RequestParam String fgsdmVehic,*/ | |
| 83 | + public List<Vehicleloading> vehicleloading(@RequestParam String gsdmVehic, @RequestParam String fgsdmVehic, | |
| 84 | 84 | @RequestParam String line, @RequestParam String data) { |
| 85 | - return formsService.vehicleloading(/*gsdmVehic, fgsdmVehic, */line, data); | |
| 85 | + return formsService.vehicleloading(gsdmVehic, fgsdmVehic, line, data); | |
| 86 | 86 | } |
| 87 | 87 | |
| 88 | 88 | // 运营服务阶段报表 | ... | ... |
src/main/java/com/bsth/controller/gps/GpsController.java
| 1 | 1 | package com.bsth.controller.gps; |
| 2 | 2 | |
| 3 | -import java.util.List; | |
| 4 | -import java.util.Map; | |
| 5 | - | |
| 6 | -import org.springframework.beans.factory.annotation.Autowired; | |
| 7 | -import org.springframework.web.bind.annotation.*; | |
| 8 | - | |
| 9 | 3 | import com.bsth.data.BasicData; |
| 10 | 4 | import com.bsth.data.gpsdata.GpsEntity; |
| 11 | 5 | import com.bsth.data.gpsdata.GpsRealData; |
| 12 | 6 | import com.bsth.service.gps.GpsService; |
| 13 | 7 | import com.google.common.base.Splitter; |
| 8 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 9 | +import org.springframework.web.bind.annotation.*; | |
| 10 | + | |
| 11 | +import java.util.List; | |
| 12 | +import java.util.Map; | |
| 14 | 13 | |
| 15 | 14 | @RestController |
| 16 | 15 | @RequestMapping("gps") |
| ... | ... | @@ -70,7 +69,7 @@ public class GpsController { |
| 70 | 69 | return gpsService.history(nbbmArray, st, et); |
| 71 | 70 | } |
| 72 | 71 | |
| 73 | - /*@RequestMapping(value = "/arrival/ram") | |
| 72 | + /*@RequestMapping(value = "/analyse/ram") | |
| 74 | 73 | public List<ArrivalInfo> ramData(@RequestParam String nbbm) { |
| 75 | 74 | return ArrivalDataBuffer.allMap.get(nbbm); |
| 76 | 75 | }*/ |
| ... | ... | @@ -84,4 +83,9 @@ public class GpsController { |
| 84 | 83 | public Map<String, Object> findBuffAeraByCode(@RequestParam String code,@RequestParam String type){ |
| 85 | 84 | return gpsService.findBuffAeraByCode(code, type); |
| 86 | 85 | } |
| 86 | + | |
| 87 | + @RequestMapping(value = "/findRoadSpeed") | |
| 88 | + public Map<String, Object> findRoadSpeed(@RequestParam String lineCode){ | |
| 89 | + return gpsService.findRoadSpeed(lineCode); | |
| 90 | + } | |
| 87 | 91 | } | ... | ... |
src/main/java/com/bsth/controller/oil/YlbController.java
| ... | ... | @@ -3,7 +3,9 @@ package com.bsth.controller.oil; |
| 3 | 3 | import java.text.ParseException; |
| 4 | 4 | import java.text.SimpleDateFormat; |
| 5 | 5 | import java.util.ArrayList; |
| 6 | +import java.util.Calendar; | |
| 6 | 7 | import java.util.Date; |
| 8 | +import java.util.GregorianCalendar; | |
| 7 | 9 | import java.util.HashMap; |
| 8 | 10 | import java.util.Iterator; |
| 9 | 11 | import java.util.List; |
| ... | ... | @@ -107,8 +109,16 @@ public class YlbController extends BaseController<Ylb, Integer>{ |
| 107 | 109 | try { |
| 108 | 110 | String rq=map.get("rq").toString(); |
| 109 | 111 | if(!(rq=="")){ |
| 112 | + | |
| 110 | 113 | SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); |
| 111 | - map.put("rq_eq", sdf.parse(rq)); | |
| 114 | + Calendar calendar = new GregorianCalendar(); | |
| 115 | + calendar.setTime(sdf.parse(rq)); | |
| 116 | + calendar.add(calendar.DATE,1); | |
| 117 | + Date date=calendar.getTime(); | |
| 118 | + map.put("rq_ge", rq); | |
| 119 | + map.put("rq_le", sdf.format(date)); | |
| 120 | + System.out.println(rq); | |
| 121 | + System.out.println(sdf.format(date)); | |
| 112 | 122 | } |
| 113 | 123 | } catch (ParseException e) { |
| 114 | 124 | // TODO Auto-generated catch block | ... | ... |
src/main/java/com/bsth/controller/realcontrol/ScheduleRealInfoController.java
| ... | ... | @@ -131,13 +131,13 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, |
| 131 | 131 | * @Title: adjust @Description: TODO(调整人车) @param @param id |
| 132 | 132 | * 班次ID @param @param nbbm 内部编码 @param @param jsy 驾驶员 @param @param spy |
| 133 | 133 | * 售票员 @throws |
| 134 | - */ | |
| 134 | + | |
| 135 | 135 | @RequestMapping(value = "/adjust", method = RequestMethod.POST) |
| 136 | 136 | public Map<String, Object> adjust(@RequestParam Long id, String nbbm, String jsy, |
| 137 | 137 | String spy, Integer revertLine, Integer borrowLine, String borrowTimeStr, String revertTimeStr) { |
| 138 | 138 | return scheduleRealInfoService.adjust(id, nbbm, jsy, spy, revertLine, borrowLine, borrowTimeStr, revertTimeStr); |
| 139 | 139 | } |
| 140 | - | |
| 140 | + */ | |
| 141 | 141 | /** |
| 142 | 142 | * |
| 143 | 143 | * @Title: realOutAdjust |
| ... | ... | @@ -292,8 +292,9 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, |
| 292 | 292 | } |
| 293 | 293 | |
| 294 | 294 | @RequestMapping(value = "/queryUserInfo") |
| 295 | - public List<ScheduleRealInfo> queryUserInfo(@RequestParam String line, @RequestParam String date) { | |
| 296 | - return scheduleRealInfoService.queryUserInfo(line, date); | |
| 295 | + public List<ScheduleRealInfo> queryUserInfo(@RequestParam String line, | |
| 296 | + @RequestParam String date,@RequestParam String state) { | |
| 297 | + return scheduleRealInfoService.queryUserInfo(line, date,state); | |
| 297 | 298 | } |
| 298 | 299 | |
| 299 | 300 | @RequestMapping(value = "/exportWaybill") | ... | ... |
src/main/java/com/bsth/controller/report/ReportController.java
| ... | ... | @@ -50,23 +50,28 @@ public class ReportController { |
| 50 | 50 | } |
| 51 | 51 | |
| 52 | 52 | @RequestMapping(value = "/tbodyTime1", method = RequestMethod.GET) |
| 53 | - public Map<String, Object> tbodyTime1(@RequestParam String line,@RequestParam String date) { | |
| 54 | - return service.tbodyTime1(line, date); | |
| 53 | + public Map<String, Object> tbodyTime1(@RequestParam String line,@RequestParam String ttinfo) { | |
| 54 | + return service.tbodyTime1(line, ttinfo); | |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | 57 | @RequestMapping(value = "/tbodyTime2", method = RequestMethod.GET) |
| 58 | - public Map<String, Object> tbodyTime2(@RequestParam String line,@RequestParam String date) { | |
| 59 | - return service.tbodyTime2(line, date); | |
| 58 | + public Map<String, Object> tbodyTime2(@RequestParam String line,@RequestParam String ttinfo) { | |
| 59 | + return service.tbodyTime2(line, ttinfo); | |
| 60 | 60 | } |
| 61 | 61 | |
| 62 | 62 | @RequestMapping(value = "/tbodyTime3", method = RequestMethod.GET) |
| 63 | - public List<Map<String, Object>> tbodyTime3(@RequestParam String line,@RequestParam String date) { | |
| 64 | - return service.tbodyTime3(line, date); | |
| 63 | + public List<Map<String, Object>> tbodyTime3(@RequestParam String line,@RequestParam String ttinfo) { | |
| 64 | + return service.tbodyTime3(line, ttinfo); | |
| 65 | 65 | } |
| 66 | 66 | |
| 67 | 67 | @RequestMapping(value = "/tbodyTime5", method = RequestMethod.GET) |
| 68 | - public List<Map<String, Object>> tbodyTime5(@RequestParam String line,@RequestParam String date) { | |
| 69 | - return service.tbodyTime5(line, date); | |
| 68 | + public List<Map<String, Object>> tbodyTime5(@RequestParam String line,@RequestParam String ttinfo) { | |
| 69 | + return service.tbodyTime5(line, ttinfo); | |
| 70 | + } | |
| 71 | + | |
| 72 | + @RequestMapping(value="/getTtinfo", method = RequestMethod.GET) | |
| 73 | + public List<Map<String,Object>> getTtinfo(@RequestParam Map<String, Object> map){ | |
| 74 | + return service.getTtinfo(map); | |
| 70 | 75 | } |
| 71 | 76 | |
| 72 | 77 | } | ... | ... |
src/main/java/com/bsth/controller/schedule/RerunController.java deleted
100644 → 0
| 1 | -package com.bsth.controller.schedule; | |
| 2 | - | |
| 3 | -import com.bsth.controller.BaseController; | |
| 4 | -import com.bsth.entity.schedule.rule.RerunRule; | |
| 5 | -import com.bsth.repository.schedule.RerunRuleRepository; | |
| 6 | -import org.springframework.beans.factory.annotation.Autowired; | |
| 7 | -import org.springframework.web.bind.annotation.*; | |
| 8 | - | |
| 9 | -import java.util.Map; | |
| 10 | - | |
| 11 | -/** | |
| 12 | - * Created by xu on 16/10/20. | |
| 13 | - */ | |
| 14 | -@RestController | |
| 15 | -@RequestMapping("rms") | |
| 16 | -public class RerunController extends BaseController<RerunRule, Long> { | |
| 17 | - | |
| 18 | - @Autowired | |
| 19 | - private RerunRuleRepository rerunRuleRepository; | |
| 20 | - | |
| 21 | - @Override | |
| 22 | - public RerunRule findById(@PathVariable("id") Long aLong) { | |
| 23 | - return rerunRuleRepository.findOneExtend(aLong); | |
| 24 | - } | |
| 25 | - | |
| 26 | - /** | |
| 27 | - * 覆写方法,因为form提交的方式参数不全,改用 json形式提交 @RequestBody | |
| 28 | - * @Title: save | |
| 29 | - * @Description: TODO(持久化对象) | |
| 30 | - * @param @param t | |
| 31 | - * @param @return 设定文件 | |
| 32 | - * @return Map<String,Object> {status: 1(成功),-1(失败)} | |
| 33 | - * @throws | |
| 34 | - */ | |
| 35 | - @RequestMapping(method = RequestMethod.POST) | |
| 36 | - public Map<String, Object> save(@RequestBody RerunRule t){ | |
| 37 | - return baseService.save(t); | |
| 38 | - } | |
| 39 | - | |
| 40 | - | |
| 41 | -} |
src/main/java/com/bsth/controller/schedule/TTInfoController.java deleted
100644 → 0
| 1 | -package com.bsth.controller.schedule; | |
| 2 | - | |
| 3 | -import com.bsth.controller.BaseController2; | |
| 4 | -import com.bsth.entity.schedule.TTInfo; | |
| 5 | -import com.bsth.repository.schedule.TTInfoDetailRepository; | |
| 6 | -import com.bsth.repository.schedule.TTInfoRepository; | |
| 7 | -import com.bsth.service.schedule.utils.DataToolsProperties; | |
| 8 | -import org.springframework.beans.factory.annotation.Autowired; | |
| 9 | -import org.springframework.boot.context.properties.EnableConfigurationProperties; | |
| 10 | -import org.springframework.data.domain.Page; | |
| 11 | -import org.springframework.web.bind.annotation.*; | |
| 12 | - | |
| 13 | -import java.util.Map; | |
| 14 | - | |
| 15 | -/** | |
| 16 | - * Created by xu on 16/5/12. | |
| 17 | - */ | |
| 18 | -@RestController | |
| 19 | -@RequestMapping("tic") | |
| 20 | -@EnableConfigurationProperties(DataToolsProperties.class) | |
| 21 | -public class TTInfoController extends BaseController2<TTInfo, Long> { | |
| 22 | - @Autowired | |
| 23 | - private DataToolsProperties dataToolsProperties; | |
| 24 | - @Autowired | |
| 25 | - private TTInfoRepository ttInfoRepository; | |
| 26 | - @Autowired | |
| 27 | - private TTInfoDetailRepository ttInfoDetailRepository; | |
| 28 | - | |
| 29 | - @Override | |
| 30 | - protected String getDataImportKtrClasspath() { | |
| 31 | - return dataToolsProperties.getTtinfoDatainputktr(); | |
| 32 | - } | |
| 33 | - | |
| 34 | - @Override | |
| 35 | - public TTInfo findById(@PathVariable("id") Long aLong) { | |
| 36 | - return ttInfoRepository.findOneExtend(aLong); | |
| 37 | - } | |
| 38 | - | |
| 39 | - /** | |
| 40 | - * 验证。 | |
| 41 | - * @param map | |
| 42 | - * @return | |
| 43 | - */ | |
| 44 | - @RequestMapping(value = "/validate/equale", method = RequestMethod.GET) | |
| 45 | - public Map<String, Object> validateData(@RequestParam Map<String, Object> map) { | |
| 46 | - // 一般比较自编号是否重复 | |
| 47 | - return baseService.validateEquale(map); | |
| 48 | - } | |
| 49 | - | |
| 50 | - @Override | |
| 51 | - public Page<TTInfo> list(@RequestParam Map<String, Object> map, @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size, @RequestParam(defaultValue = "id") String order, @RequestParam(defaultValue = "DESC") String direction) { | |
| 52 | - // 如果有isCancel键值,将其值变成boolean | |
| 53 | - if (map.get("isCancel_eq") != null) | |
| 54 | - map.put("isCancel_eq", new Boolean(map.get("isCancel_eq").toString())); | |
| 55 | - | |
| 56 | - return super.list(map, page, size, order, direction); | |
| 57 | - } | |
| 58 | -} |
src/main/java/com/bsth/controller/schedule/TTInfoDetailController.java
| ... | ... | @@ -113,6 +113,9 @@ public class TTInfoDetailController extends BaseController2<TTInfoDetail, Long> |
| 113 | 113 | p1.put("stationName_eq", cell_con.trim()); |
| 114 | 114 | p1.put("stationMark_eq", "B"); |
| 115 | 115 | |
| 116 | + | |
| 117 | + // TODO:这里要修改(起点站有启用撤销的标志的) | |
| 118 | + | |
| 116 | 119 | List<StationRoute> stationRouteList = (List<StationRoute>) stationRouteService.list(p1); |
| 117 | 120 | if (CollectionUtils.isEmpty(stationRouteList)) { |
| 118 | 121 | rtn.put("status", ResponseCode.ERROR); | ... | ... |
src/main/java/com/bsth/controller/schedule/core/RerunController.java
0 → 100644
| 1 | +package com.bsth.controller.schedule.core; | |
| 2 | + | |
| 3 | +import com.bsth.controller.schedule.BController; | |
| 4 | +import com.bsth.entity.schedule.rule.RerunRule; | |
| 5 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 6 | +import org.springframework.web.bind.annotation.RestController; | |
| 7 | + | |
| 8 | +/** | |
| 9 | + * Created by xu on 16/10/20. | |
| 10 | + */ | |
| 11 | +@RestController | |
| 12 | +@RequestMapping("rms") | |
| 13 | +public class RerunController extends BController<RerunRule, Long> { | |
| 14 | + | |
| 15 | + | |
| 16 | +} | ... | ... |
src/main/java/com/bsth/controller/schedule/core/TTInfoController.java
0 → 100644
| 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.TTInfo; | |
| 6 | +import com.bsth.service.schedule.ScheduleException; | |
| 7 | +import com.bsth.service.schedule.TTInfoService; | |
| 8 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 9 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 10 | +import org.springframework.web.bind.annotation.RequestMethod; | |
| 11 | +import org.springframework.web.bind.annotation.RequestParam; | |
| 12 | +import org.springframework.web.bind.annotation.RestController; | |
| 13 | + | |
| 14 | +import java.util.HashMap; | |
| 15 | +import java.util.Map; | |
| 16 | + | |
| 17 | +/** | |
| 18 | + * Created by xu on 16/12/20. | |
| 19 | + */ | |
| 20 | +@RestController(value = "tTInfoController_ec") | |
| 21 | +@RequestMapping(value = "tic_ec") | |
| 22 | +public class TTInfoController extends BController<TTInfo, Long> { | |
| 23 | + @Autowired | |
| 24 | + private TTInfoService ttInfoService; | |
| 25 | + | |
| 26 | + @RequestMapping(value = "/validate_name", method = RequestMethod.GET) | |
| 27 | + public Map<String, Object> validate_name(@RequestParam Map<String, Object> param) { | |
| 28 | + Map<String, Object> rtn = new HashMap<>(); | |
| 29 | + try { | |
| 30 | + // 名字重复验证 | |
| 31 | + TTInfo ttInfo = new TTInfo( | |
| 32 | + param.get("id_eq"), | |
| 33 | + param.get("xl.id_eq"), | |
| 34 | + param.get("name_eq"), | |
| 35 | + param.get("rule_days_eq"), | |
| 36 | + param.get("special_days_eq") | |
| 37 | + ); | |
| 38 | + ttInfoService.validate_name(ttInfo); | |
| 39 | + rtn.put("status", ResponseCode.SUCCESS); | |
| 40 | + } catch (ScheduleException exp) { | |
| 41 | + rtn.put("status", ResponseCode.ERROR); | |
| 42 | + rtn.put("msg", exp.getMessage()); | |
| 43 | + } | |
| 44 | + | |
| 45 | + return rtn; | |
| 46 | + } | |
| 47 | + | |
| 48 | + @RequestMapping(value = "/validate_n_d", method = RequestMethod.GET) | |
| 49 | + public Map<String, Object> validate_n_d(@RequestParam Map<String, Object> param) { | |
| 50 | + Map<String, Object> rtn = new HashMap<>(); | |
| 51 | + try { | |
| 52 | + // 常规有效日重复验证 | |
| 53 | + TTInfo ttInfo = new TTInfo( | |
| 54 | + param.get("id_eq"), | |
| 55 | + param.get("xl.id_eq"), | |
| 56 | + param.get("name_eq"), | |
| 57 | + param.get("rule_days_eq"), | |
| 58 | + param.get("special_days_eq") | |
| 59 | + ); | |
| 60 | + ttInfoService.validate_n_d(ttInfo); | |
| 61 | + rtn.put("status", ResponseCode.SUCCESS); | |
| 62 | + } catch (ScheduleException exp) { | |
| 63 | + rtn.put("status", ResponseCode.ERROR); | |
| 64 | + rtn.put("msg", exp.getMessage()); | |
| 65 | + } | |
| 66 | + return rtn; | |
| 67 | + } | |
| 68 | + | |
| 69 | + @RequestMapping(value = "/validate_s_d", method = RequestMethod.GET) | |
| 70 | + public Map<String, Object> validate_s_d(@RequestParam Map<String, Object> param) { | |
| 71 | + Map<String, Object> rtn = new HashMap<>(); | |
| 72 | + try { | |
| 73 | + // 特殊有效日重复判定 | |
| 74 | + TTInfo ttInfo = new TTInfo( | |
| 75 | + param.get("id_eq"), | |
| 76 | + param.get("xl.id_eq"), | |
| 77 | + param.get("name_eq"), | |
| 78 | + param.get("rule_days_eq"), | |
| 79 | + param.get("special_days_eq") | |
| 80 | + ); | |
| 81 | + ttInfoService.validate_s_d(ttInfo); | |
| 82 | + rtn.put("status", ResponseCode.SUCCESS); | |
| 83 | + } catch (ScheduleException exp) { | |
| 84 | + rtn.put("status", ResponseCode.ERROR); | |
| 85 | + rtn.put("msg", exp.getMessage()); | |
| 86 | + } | |
| 87 | + return rtn; | |
| 88 | + } | |
| 89 | + | |
| 90 | +} | |
| 91 | + | |
| 92 | +// | |
| 93 | +//@Autowired | |
| 94 | +//private DataToolsProperties dataToolsProperties; | |
| 95 | +//@Autowired | |
| 96 | +//private TTInfoRepository ttInfoRepository; | |
| 97 | +//@Autowired | |
| 98 | +//private TTInfoDetailRepository ttInfoDetailRepository; | |
| 99 | +// | |
| 100 | +// @Override | |
| 101 | +// protected String getDataImportKtrClasspath() { | |
| 102 | +// return dataToolsProperties.getTtinfoDatainputktr(); | |
| 103 | +// } | |
| 104 | +// | |
| 105 | +// @Override | |
| 106 | +// public TTInfo findById(@PathVariable("id") Long aLong) { | |
| 107 | +// return ttInfoRepository.findOneExtend(aLong); | |
| 108 | +// } | |
| 109 | +// | |
| 110 | +// /** | |
| 111 | +// * 验证。 | |
| 112 | +// * @param map | |
| 113 | +// * @return | |
| 114 | +// */ | |
| 115 | +// @RequestMapping(value = "/validate/equale", method = RequestMethod.GET) | |
| 116 | +// public Map<String, Object> validateData(@RequestParam Map<String, Object> map) { | |
| 117 | +// // 一般比较自编号是否重复 | |
| 118 | +// return baseService.validateEquale(map); | |
| 119 | +// } | |
| 120 | +// | |
| 121 | +// @Override | |
| 122 | +// public Page<TTInfo> list(@RequestParam Map<String, Object> map, @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size, @RequestParam(defaultValue = "id") String order, @RequestParam(defaultValue = "DESC") String direction) { | |
| 123 | +// // 如果有isCancel键值,将其值变成boolean | |
| 124 | +// if (map.get("isCancel_eq") != null) | |
| 125 | +// map.put("isCancel_eq", new Boolean(map.get("isCancel_eq").toString())); | |
| 126 | +// | |
| 127 | +// return super.list(map, page, size, order, direction); | |
| 128 | +// } | |
| 0 | 129 | \ No newline at end of file | ... | ... |
src/main/java/com/bsth/data/BasicData.java
| 1 | 1 | package com.bsth.data; |
| 2 | 2 | |
| 3 | 3 | import com.bsth.Application; |
| 4 | +import com.bsth.data.gpsdata.arrival.GeoCacheData; | |
| 4 | 5 | import com.bsth.entity.*; |
| 5 | 6 | import com.bsth.entity.schedule.CarConfigInfo; |
| 6 | 7 | import com.bsth.repository.*; |
| ... | ... | @@ -57,7 +58,7 @@ public class BasicData implements CommandLineRunner { |
| 57 | 58 | public static Map<String, String> lineCode2NameMap; |
| 58 | 59 | |
| 59 | 60 | //线路编码_站点编码 == 0|1 上下行 |
| 60 | - public static Map<String, Integer> lineStationUpDownMap; | |
| 61 | + //public static Map<String, Integer> lineStationUpDownMap; | |
| 61 | 62 | |
| 62 | 63 | //停车场 |
| 63 | 64 | public static List<String> parkCodeList; |
| ... | ... | @@ -86,7 +87,7 @@ public class BasicData implements CommandLineRunner { |
| 86 | 87 | |
| 87 | 88 | @Override |
| 88 | 89 | public void run(String... arg0) throws Exception { |
| 89 | - Application.mainServices.scheduleWithFixedDelay(dataLoader, 0, 1, TimeUnit.HOURS); | |
| 90 | + Application.mainServices.scheduleWithFixedDelay(dataLoader, 2, 2, TimeUnit.HOURS); | |
| 90 | 91 | } |
| 91 | 92 | |
| 92 | 93 | |
| ... | ... | @@ -117,6 +118,9 @@ public class BasicData implements CommandLineRunner { |
| 117 | 118 | @Autowired |
| 118 | 119 | BusinessRepository businessRepository; |
| 119 | 120 | |
| 121 | + @Autowired | |
| 122 | + GeoCacheData geoCacheData; | |
| 123 | + | |
| 120 | 124 | |
| 121 | 125 | @Override |
| 122 | 126 | public void run() { |
| ... | ... | @@ -138,11 +142,13 @@ public class BasicData implements CommandLineRunner { |
| 138 | 142 | //车辆和线路映射信息 |
| 139 | 143 | loadNbbm2LineInfo(); |
| 140 | 144 | //站点路由信息 |
| 141 | - loadStationRouteInfo(); | |
| 145 | + //loadStationRouteInfo(); | |
| 142 | 146 | //人员信息 |
| 143 | 147 | loadPersonnelInfo(); |
| 144 | 148 | //公司信息 |
| 145 | 149 | loadBusinessInfo(); |
| 150 | + | |
| 151 | + geoCacheData.loadData(); | |
| 146 | 152 | logger.info("加载基础数据成功!,"); |
| 147 | 153 | } catch (Exception e) { |
| 148 | 154 | logger.error("加载基础数据时出现异常,", e); |
| ... | ... | @@ -151,7 +157,7 @@ public class BasicData implements CommandLineRunner { |
| 151 | 157 | } |
| 152 | 158 | |
| 153 | 159 | |
| 154 | - private void loadStationRouteInfo() { | |
| 160 | +/* private void loadStationRouteInfo() { | |
| 155 | 161 | Iterator<StationRoute> iterator = stationRouteRepository.findAllEffective().iterator(); |
| 156 | 162 | |
| 157 | 163 | Map<String, String> sePointMap = new HashMap<>(); |
| ... | ... | @@ -172,7 +178,7 @@ public class BasicData implements CommandLineRunner { |
| 172 | 178 | } |
| 173 | 179 | lineStationUpDownMap = map; |
| 174 | 180 | lineSEPointMap = sePointMap; |
| 175 | - } | |
| 181 | + }*/ | |
| 176 | 182 | |
| 177 | 183 | /** |
| 178 | 184 | * loadBusinessInfo |
| ... | ... | @@ -280,7 +286,7 @@ public class BasicData implements CommandLineRunner { |
| 280 | 286 | /** |
| 281 | 287 | * 加载运管处的站点及序号 |
| 282 | 288 | * 上行从1开始,下行顺序续编 |
| 283 | - */ | |
| 289 | + | |
| 284 | 290 | List<Object[]> ygcLines = stationRouteRepository.findAllLineWithYgc(); |
| 285 | 291 | if(ygcLines != null && ygcLines.size() > 0){ |
| 286 | 292 | int size = ygcLines.size(); |
| ... | ... | @@ -299,7 +305,7 @@ public class BasicData implements CommandLineRunner { |
| 299 | 305 | key = tempArray[0] + "_"+tempArray[1] + "_"+tempArray[2]; |
| 300 | 306 | tempStationName2YgcNumber.put(key,num++); |
| 301 | 307 | } |
| 302 | - } | |
| 308 | + }*/ | |
| 303 | 309 | } |
| 304 | 310 | |
| 305 | 311 | lineId2CodeMap = biMap; | ... | ... |
src/main/java/com/bsth/data/LineConfigData.java
| 1 | 1 | package com.bsth.data; |
| 2 | 2 | |
| 3 | -import java.util.Collection; | |
| 4 | -import java.util.HashMap; | |
| 5 | -import java.util.Iterator; | |
| 6 | -import java.util.Map; | |
| 7 | -import java.util.Set; | |
| 8 | - | |
| 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.stereotype.Component; | |
| 14 | - | |
| 15 | 3 | import com.bsth.entity.Line; |
| 16 | 4 | import com.bsth.entity.realcontrol.D80ReplyTemp; |
| 17 | 5 | import com.bsth.entity.realcontrol.LineConfig; |
| 18 | 6 | import com.bsth.oplog.normal.OpLogger; |
| 19 | 7 | import com.bsth.service.LineService; |
| 20 | 8 | import com.bsth.service.realcontrol.LineConfigService; |
| 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.stereotype.Component; | |
| 14 | + | |
| 15 | +import java.util.*; | |
| 21 | 16 | |
| 22 | 17 | /** |
| 23 | 18 | * |
| ... | ... | @@ -92,7 +87,7 @@ public class LineConfigData implements CommandLineRunner { |
| 92 | 87 | //出场时间类型 |
| 93 | 88 | conf.setOutConfig(1); |
| 94 | 89 | //进场时间类型 |
| 95 | - conf.setInConfig(1); | |
| 90 | + //conf.setInConfig(1); | |
| 96 | 91 | //短语模板 |
| 97 | 92 | conf.setPhraseTemps(""); |
| 98 | 93 | //调度指令模板 | ... | ... |
src/main/java/com/bsth/data/arrival/AnalyseData.java
| 1 | 1 | package com.bsth.data.arrival; |
| 2 | 2 | |
| 3 | -import java.util.ArrayList; | |
| 4 | -import java.util.Collections; | |
| 5 | -import java.util.List; | |
| 6 | -import java.util.Set; | |
| 7 | - | |
| 8 | 3 | import org.slf4j.Logger; |
| 9 | 4 | import org.slf4j.LoggerFactory; |
| 10 | 5 | import org.springframework.stereotype.Component; |
| 11 | 6 | |
| 12 | -import com.bsth.data.BasicData; | |
| 7 | +import java.util.ArrayList; | |
| 8 | +import java.util.Collections; | |
| 9 | +import java.util.List; | |
| 10 | +import java.util.Set; | |
| 13 | 11 | |
| 14 | 12 | /** |
| 15 | 13 | * |
| ... | ... | @@ -98,14 +96,15 @@ public class AnalyseData { |
| 98 | 96 | } |
| 99 | 97 | |
| 100 | 98 | private boolean effective(ArrivalEntity arr){ |
| 101 | - //停车场 | |
| 99 | + /*//停车场 | |
| 102 | 100 | if(BasicData.parkCodeList.contains(arr.getStopNo())){ |
| 103 | 101 | arr.setTcc(true); |
| 104 | 102 | return true; |
| 105 | 103 | } |
| 106 | - | |
| 104 | + | |
| 107 | 105 | Integer upDown = BasicData.lineStationUpDownMap.get(arr.getLineCode() + "_" + arr.getStopNo()); |
| 108 | - | |
| 109 | - return arr.getUpDown() == upDown || BasicData.parkCodeList.contains(arr.getStopNo()); | |
| 106 | + | |
| 107 | + return arr.getUpDown() == upDown || BasicData.parkCodeList.contains(arr.getStopNo());*/ | |
| 108 | + return false; | |
| 110 | 109 | } |
| 111 | 110 | } | ... | ... |
src/main/java/com/bsth/data/forecast/ForecastRealServer.java
| ... | ... | @@ -70,7 +70,7 @@ public class ForecastRealServer implements CommandLineRunner { |
| 70 | 70 | /* public void forecast(String nbbm){ |
| 71 | 71 | logger.info("预测," + nbbm); |
| 72 | 72 | //当前执行班次 |
| 73 | - ScheduleRealInfo sch = dayOfSchedule.execPlamMap().get(nbbm); | |
| 73 | + ScheduleRealInfo sch = dayOfSchedule.execPlanMap().get(nbbm); | |
| 74 | 74 | if(null == sch) |
| 75 | 75 | return; |
| 76 | 76 | |
| ... | ... | @@ -86,7 +86,7 @@ public class ForecastRealServer implements CommandLineRunner { |
| 86 | 86 | //终点站 |
| 87 | 87 | String eStation = null; |
| 88 | 88 | //当前执行班次 |
| 89 | - ScheduleRealInfo sch = dayOfSchedule.execPlamMap().get(nbbm); | |
| 89 | + ScheduleRealInfo sch = dayOfSchedule.execPlanMap().get(nbbm); | |
| 90 | 90 | if(null != sch) |
| 91 | 91 | eStation = sch.getZdzCode(); |
| 92 | 92 | ... | ... |
src/main/java/com/bsth/data/gpsdata/GpsEntity.java
| 1 | 1 | package com.bsth.data.gpsdata; |
| 2 | 2 | |
| 3 | +import com.bsth.data.gpsdata.arrival.entity.StationRoute; | |
| 4 | +import com.fasterxml.jackson.annotation.JsonIgnore; | |
| 5 | + | |
| 3 | 6 | /** |
| 4 | 7 | * |
| 5 | 8 | * @ClassName: GpsRealData |
| ... | ... | @@ -58,21 +61,32 @@ public class GpsEntity { |
| 58 | 61 | /** 预计到达终点时间 */ |
| 59 | 62 | private Float expectStopTime; |
| 60 | 63 | |
| 61 | - /** 设备是否在线 */ | |
| 64 | + /** 设备是否在线 | |
| 62 | 65 | private boolean online; |
| 63 | - | |
| 66 | + */ | |
| 64 | 67 | /** 当前执行班次ID */ |
| 65 | 68 | private Long schId; |
| 66 | 69 | |
| 67 | 70 | /** 是否异常数据 */ |
| 68 | 71 | private boolean abnormal; |
| 69 | - | |
| 70 | - private int valid; | |
| 72 | +/* | |
| 73 | + private int valid;*/ | |
| 71 | 74 | |
| 72 | 75 | private int version; |
| 73 | 76 | |
| 74 | - /** 是否起终点站 */ | |
| 77 | + /** 是否起终点站 | |
| 75 | 78 | private boolean sEPoint; |
| 79 | + */ | |
| 80 | + | |
| 81 | + /** 0: 站外 1:站内 2:场内 */ | |
| 82 | + private int instation; | |
| 83 | + | |
| 84 | + /** 站点信息,站内时有值 */ | |
| 85 | + @JsonIgnore | |
| 86 | + private StationRoute station; | |
| 87 | + | |
| 88 | + /** 状态 */ | |
| 89 | + private String signalState; | |
| 76 | 90 | |
| 77 | 91 | public Integer getCompanyCode() { |
| 78 | 92 | return companyCode; |
| ... | ... | @@ -178,14 +192,6 @@ public class GpsEntity { |
| 178 | 192 | this.stationName = stationName; |
| 179 | 193 | } |
| 180 | 194 | |
| 181 | - public boolean isOnline() { | |
| 182 | - return online; | |
| 183 | - } | |
| 184 | - | |
| 185 | - public void setOnline(boolean online) { | |
| 186 | - this.online = online; | |
| 187 | - } | |
| 188 | - | |
| 189 | 195 | public long getArrTime() { |
| 190 | 196 | return arrTime; |
| 191 | 197 | } |
| ... | ... | @@ -218,35 +224,44 @@ public class GpsEntity { |
| 218 | 224 | this.schId = schId; |
| 219 | 225 | } |
| 220 | 226 | |
| 221 | - public boolean isAbnormal() { | |
| 222 | - return abnormal; | |
| 227 | + | |
| 228 | + public int getVersion() { | |
| 229 | + return version; | |
| 223 | 230 | } |
| 224 | 231 | |
| 225 | - public void setAbnormal(boolean abnormal) { | |
| 226 | - this.abnormal = abnormal; | |
| 232 | + public void setVersion(int version) { | |
| 233 | + this.version = version; | |
| 227 | 234 | } |
| 228 | 235 | |
| 229 | - public int getValid() { | |
| 230 | - return valid; | |
| 236 | + public StationRoute getStation() { | |
| 237 | + return station; | |
| 231 | 238 | } |
| 232 | 239 | |
| 233 | - public void setValid(int valid) { | |
| 234 | - this.valid = valid; | |
| 240 | + public void setStation(StationRoute station) { | |
| 241 | + this.station = station; | |
| 235 | 242 | } |
| 236 | 243 | |
| 237 | - public int getVersion() { | |
| 238 | - return version; | |
| 244 | + public boolean isAbnormal() { | |
| 245 | + return abnormal; | |
| 239 | 246 | } |
| 240 | 247 | |
| 241 | - public void setVersion(int version) { | |
| 242 | - this.version = version; | |
| 248 | + public void setAbnormal(boolean abnormal) { | |
| 249 | + this.abnormal = abnormal; | |
| 250 | + } | |
| 251 | + | |
| 252 | + public String getSignalState() { | |
| 253 | + return signalState; | |
| 254 | + } | |
| 255 | + | |
| 256 | + public void setSignalState(String signalState) { | |
| 257 | + this.signalState = signalState; | |
| 243 | 258 | } |
| 244 | 259 | |
| 245 | - public boolean issEPoint() { | |
| 246 | - return sEPoint; | |
| 260 | + public int getInstation() { | |
| 261 | + return instation; | |
| 247 | 262 | } |
| 248 | 263 | |
| 249 | - public void setsEPoint(boolean sEPoint) { | |
| 250 | - this.sEPoint = sEPoint; | |
| 264 | + public void setInstation(int instation) { | |
| 265 | + this.instation = instation; | |
| 251 | 266 | } |
| 252 | 267 | } | ... | ... |
src/main/java/com/bsth/data/gpsdata/GpsRealData.java
| ... | ... | @@ -5,6 +5,8 @@ import com.alibaba.fastjson.JSONObject; |
| 5 | 5 | import com.bsth.Application; |
| 6 | 6 | import com.bsth.data.BasicData; |
| 7 | 7 | import com.bsth.data.forecast.ForecastRealServer; |
| 8 | +import com.bsth.data.gpsdata.arrival.GpsRealAnalyse; | |
| 9 | +import com.bsth.data.gpsdata.recovery.GpsDataRecovery; | |
| 8 | 10 | import com.bsth.data.schedule.DayOfSchedule; |
| 9 | 11 | import com.bsth.entity.realcontrol.ScheduleRealInfo; |
| 10 | 12 | import com.bsth.util.ConfigUtil; |
| ... | ... | @@ -27,263 +29,187 @@ import java.util.*; |
| 27 | 29 | import java.util.concurrent.TimeUnit; |
| 28 | 30 | |
| 29 | 31 | /** |
| 30 | - * | |
| 32 | + * @author PanZhao | |
| 31 | 33 | * @ClassName: GpsRealData |
| 32 | 34 | * @Description: TODO(实时GPS数据集合) |
| 33 | - * @author PanZhao | |
| 34 | 35 | * @date 2016年8月12日 下午2:04:41 |
| 35 | - * | |
| 36 | 36 | */ |
| 37 | 37 | @Component |
| 38 | -public class GpsRealData implements CommandLineRunner{ | |
| 39 | - | |
| 40 | - static Logger logger = LoggerFactory.getLogger(GpsRealData.class); | |
| 41 | - | |
| 42 | - private static Map<String, GpsEntity> gpsMap; | |
| 43 | - | |
| 44 | - //按线路分组设备号 | |
| 45 | - private static TreeMultimap<String, String> lineCode2Devices; | |
| 46 | - | |
| 47 | - // 网关数据接口地址 | |
| 48 | - private static String url; | |
| 49 | - | |
| 50 | - @Autowired | |
| 51 | - GpsDataLoader gpsDataLoader; | |
| 52 | - | |
| 53 | - @Autowired | |
| 54 | - DayOfSchedule dayOfSchedule; | |
| 55 | - | |
| 56 | - @Autowired | |
| 57 | - ForecastRealServer forecastRealServer; | |
| 58 | - /** | |
| 59 | - * 构造函数 | |
| 60 | - */ | |
| 61 | - public GpsRealData(){ | |
| 62 | - gpsMap = new HashMap<>(); | |
| 63 | - lineCode2Devices = TreeMultimap.create(); | |
| 64 | - url = ConfigUtil.get("http.gps.real.url"); | |
| 65 | - } | |
| 66 | - | |
| 67 | - @Override | |
| 68 | - public void run(String... arg0) throws Exception { | |
| 69 | - logger.info("gpsDataLoader,20,6"); | |
| 70 | - Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 5, TimeUnit.SECONDS); | |
| 71 | - } | |
| 72 | - | |
| 73 | - public GpsEntity add(GpsEntity gps) { | |
| 74 | - String device = gps.getDeviceId(); | |
| 75 | - GpsEntity old = gpsMap.get(device); | |
| 76 | - | |
| 77 | - if(!StringUtils.isEmpty(gps.getStopNo())){ | |
| 78 | - //定时定距数据附带站点编码改变 | |
| 79 | - if(null == old || !gps.getStopNo().equals(old.getStopNo())){ | |
| 80 | - gps.setArrTime(gps.getTimestamp()); | |
| 81 | - //预测到达终点时间 | |
| 82 | - forecastRealServer.forecast(gps.getNbbm(), gps); | |
| 83 | - } | |
| 84 | - else{ | |
| 85 | - gps.setArrTime(old.getArrTime()); | |
| 86 | - //不预测, 重新计算终点时间 | |
| 87 | - gps.setExpectStopTime(forecastRealServer.expectStopTime(gps.getNbbm())); | |
| 88 | - } | |
| 89 | - } | |
| 90 | - | |
| 91 | - gpsMap.put(device, gps); | |
| 92 | - if(StringUtils.isNotBlank(gps.getLineId())) | |
| 93 | - lineCode2Devices.put(gps.getLineId(), device); | |
| 94 | - return gps; | |
| 95 | - } | |
| 96 | - | |
| 97 | - /** | |
| 98 | - * | |
| 99 | - * @Title: get @Description: TODO(设备号获取GPS) | |
| 100 | - */ | |
| 101 | - public GpsEntity get(String deviceId) { | |
| 102 | - return gpsMap.get(deviceId); | |
| 103 | - } | |
| 104 | - | |
| 105 | - /** | |
| 106 | - * | |
| 107 | - * @Title: get @Description: TODO(线路编码获取GPS集合) @throws | |
| 108 | - */ | |
| 109 | - public List<GpsEntity> getByLine(String lineCode) { | |
| 110 | - NavigableSet<String> set = lineCode2Devices.get(lineCode); | |
| 111 | - | |
| 112 | - List<GpsEntity> rs = new ArrayList<>(); | |
| 113 | - GpsEntity gps; | |
| 114 | - ScheduleRealInfo sch; | |
| 115 | - for(String device : set){ | |
| 116 | - gps = gpsMap.get(device); | |
| 117 | - //过滤异常GPS数据 | |
| 118 | - if(gps.isAbnormal()) | |
| 119 | - continue; | |
| 120 | - | |
| 121 | - sch = dayOfSchedule.execPlamMap().get(gps.getNbbm()); | |
| 122 | - if(null != sch) | |
| 123 | - gps.setSchId(sch.getId()); | |
| 124 | - rs.add(gps); | |
| 125 | - } | |
| 126 | - | |
| 127 | - return rs; | |
| 128 | - } | |
| 129 | - | |
| 130 | - public List<GpsEntity> get(List<String> pArray){ | |
| 131 | - List<GpsEntity> list = new ArrayList<>(); | |
| 132 | - | |
| 133 | - for(String code : pArray) | |
| 134 | - list.addAll(getByLine(code)); | |
| 135 | - return list; | |
| 136 | - } | |
| 137 | - | |
| 138 | - public Set<String> allDevices(){ | |
| 139 | - return gpsMap.keySet(); | |
| 140 | - } | |
| 141 | - | |
| 142 | - public GpsEntity findByDeviceId(String deviceId) { | |
| 143 | - return gpsMap.get(deviceId); | |
| 144 | - } | |
| 145 | - | |
| 146 | - public Collection<GpsEntity> all(){ | |
| 147 | - return gpsMap.values(); | |
| 148 | - } | |
| 149 | - | |
| 150 | - public void remove(String device){ | |
| 151 | - gpsMap.remove(device); | |
| 152 | - } | |
| 153 | - @Component | |
| 154 | - public static class GpsDataLoader extends Thread{ | |
| 155 | - | |
| 156 | - Logger logger = LoggerFactory.getLogger(GpsDataLoader.class); | |
| 157 | - | |
| 158 | - @Autowired | |
| 159 | - GpsRealData gpsRealData; | |
| 160 | - | |
| 161 | - @Override | |
| 162 | - public void run() { | |
| 163 | - try{ | |
| 164 | - load(); | |
| 165 | - }catch(Exception e){ | |
| 166 | - logger.error("", e); | |
| 167 | - } | |
| 168 | - } | |
| 169 | - | |
| 170 | - public void load() throws Exception { | |
| 171 | - List<GpsEntity> list = new ArrayList<>(); | |
| 172 | - CloseableHttpClient httpClient = null; | |
| 173 | - CloseableHttpResponse response = null; | |
| 174 | - try { | |
| 175 | - httpClient = HttpClients.createDefault(); | |
| 176 | - HttpGet get = new HttpGet(url); | |
| 177 | - | |
| 178 | - response = httpClient.execute(get); | |
| 179 | - | |
| 180 | - HttpEntity entity = response.getEntity(); | |
| 181 | - if (null != entity) { | |
| 182 | - // 返回数据量比较大,建议以流的形式读取 | |
| 183 | - BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent())); | |
| 184 | - StringBuffer stringBuffer = new StringBuffer(); | |
| 185 | - String str = ""; | |
| 186 | - while ((str = br.readLine()) != null) | |
| 187 | - stringBuffer.append(str); | |
| 188 | - | |
| 189 | - JSONObject jsonObj = JSON.parseObject(stringBuffer.toString()); | |
| 190 | - | |
| 191 | - if (jsonObj != null) | |
| 192 | - list = JSON.parseArray(jsonObj.getString("data"), GpsEntity.class); | |
| 193 | - | |
| 194 | - String nbbm; | |
| 195 | - for(GpsEntity gps : list){ | |
| 196 | - //没有设备号 | |
| 197 | - if(StringUtils.isBlank(gps.getDeviceId())) | |
| 198 | - continue; | |
| 199 | - | |
| 200 | - nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId()); | |
| 201 | - if(StringUtils.isBlank(nbbm)) | |
| 202 | - gps.setAbnormal(true);//标记为异常数据 | |
| 203 | - else | |
| 204 | - gps.setNbbm(nbbm); | |
| 205 | - | |
| 206 | - gps.setStationName(BasicData.stationCode2NameMap.get(gps.getStopNo())); | |
| 207 | - gpsRealData.add(gps); | |
| 208 | - | |
| 209 | - //纠正走向 | |
| 210 | - correctUpdown(gps); | |
| 211 | - /*if(issEPoint(gps)) | |
| 212 | - continue; | |
| 213 | - | |
| 214 | - //如果走向未知,尝试根据站点纠正走向 | |
| 215 | - if(gps.getUpDown() == -1){ | |
| 216 | - updown=stationUpDownMap.get(gps.getLineId()+"_"+gps.getStopNo()); | |
| 217 | - if(updown != null) | |
| 218 | - gps.setUpDown(updown); | |
| 219 | - } | |
| 220 | - //如果站点编码和走向相反(即上行站点ID,走向为下行),尝试根据站点纠正走向 | |
| 221 | - updown=stationUpDownMap.get(gps.getLineId()+"_"+gps.getStopNo()); | |
| 222 | - if(updown != null && !gps.getUpDown().equals(updown)){ | |
| 223 | - gps.setUpDown(updown); | |
| 224 | - }*/ | |
| 225 | - } | |
| 226 | - } else | |
| 227 | - logger.error("result is null"); | |
| 228 | - } catch(Exception e){ | |
| 229 | - logger.error("", e); | |
| 230 | - } | |
| 231 | - finally { | |
| 232 | - if (null != httpClient) | |
| 233 | - httpClient.close(); | |
| 234 | - if(null != response) | |
| 235 | - response.close(); | |
| 236 | - } | |
| 237 | - } | |
| 238 | - | |
| 239 | - /** | |
| 240 | - * 是否是起终点 | |
| 241 | - * @param gps | |
| 242 | - * @return | |
| 243 | - */ | |
| 244 | - public boolean isSEPoint(GpsEntity gps){ | |
| 245 | - String key = gps.getLineId()+"_"+gps.getUpDown()+"_" | |
| 246 | - ,stationCode; | |
| 247 | - | |
| 248 | - if(BasicData.lineSEPointMap.containsKey(key+"B")){ | |
| 249 | - stationCode = BasicData.lineSEPointMap.get(key+"B"); | |
| 250 | - if(gps.getStopNo().equals(stationCode)){ | |
| 251 | - gps.setsEPoint(true); | |
| 252 | - return true; | |
| 253 | - } | |
| 254 | - } | |
| 255 | - | |
| 256 | - if(BasicData.lineSEPointMap.containsKey(key+"E")){ | |
| 257 | - stationCode = BasicData.lineSEPointMap.get(key+"E"); | |
| 258 | - if(gps.getStopNo().equals(stationCode)){ | |
| 259 | - gps.setsEPoint(true); | |
| 260 | - return true; | |
| 261 | - } | |
| 262 | - } | |
| 263 | - return false; | |
| 264 | - } | |
| 265 | - | |
| 266 | - /** | |
| 267 | - * 纠正上下行 | |
| 268 | - * @param gps | |
| 269 | - */ | |
| 270 | - public void correctUpdown(GpsEntity gps){ | |
| 271 | - Integer updown=BasicData.lineStationUpDownMap.get(gps.getLineId()+"_"+gps.getStopNo()); | |
| 272 | - if(updown != null && !updown.equals(gps.getUpDown())) | |
| 273 | - gps.setUpDown(updown); | |
| 274 | - /*//如果走向未知,尝试根据站点纠正走向 | |
| 275 | - if(gps.getUpDown() == -1){ | |
| 276 | - | |
| 277 | - }*/ | |
| 278 | - | |
| 279 | - if(isSEPoint(gps)) | |
| 280 | - return; | |
| 281 | - | |
| 282 | - /*//如果站点编码和走向相反(即上行站点ID,走向为下行),尝试根据站点纠正走向 | |
| 283 | - updown=BasicData.lineStationUpDownMap.get(gps.getLineId()+"_"+gps.getStopNo()); | |
| 284 | - if(updown != null && !gps.getUpDown().equals(updown)){ | |
| 285 | - gps.setUpDown(updown); | |
| 286 | - }*/ | |
| 287 | - } | |
| 288 | - } | |
| 289 | -} | |
| 38 | +public class GpsRealData implements CommandLineRunner { | |
| 39 | + | |
| 40 | + static Logger logger = LoggerFactory.getLogger(GpsRealData.class); | |
| 41 | + | |
| 42 | + private static Map<String, GpsEntity> gpsMap; | |
| 43 | + | |
| 44 | + //按线路分组设备号 | |
| 45 | + private static TreeMultimap<String, String> lineCode2Devices; | |
| 46 | + | |
| 47 | + // 网关数据接口地址 | |
| 48 | + private static String url; | |
| 49 | + | |
| 50 | + @Autowired | |
| 51 | + GpsDataLoader gpsDataLoader; | |
| 52 | + | |
| 53 | + @Autowired | |
| 54 | + DayOfSchedule dayOfSchedule; | |
| 55 | + | |
| 56 | + @Autowired | |
| 57 | + ForecastRealServer forecastRealServer; | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * 构造函数 | |
| 61 | + */ | |
| 62 | + public GpsRealData() { | |
| 63 | + gpsMap = new HashMap<>(); | |
| 64 | + lineCode2Devices = TreeMultimap.create(); | |
| 65 | + url = ConfigUtil.get("http.gps.real.url"); | |
| 66 | + } | |
| 67 | + | |
| 68 | + @Override | |
| 69 | + public void run(String... arg0) throws Exception { | |
| 70 | + logger.info("gpsDataLoader,40,6"); | |
| 71 | + Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 40, 6, TimeUnit.SECONDS); | |
| 72 | + } | |
| 73 | + | |
| 74 | + public void put(GpsEntity gps) { | |
| 75 | + gpsMap.put(gps.getDeviceId(), gps); | |
| 76 | + } | |
| 77 | + | |
| 78 | + /** | |
| 79 | + * @Title: get @Description: TODO(设备号获取GPS) | |
| 80 | + */ | |
| 81 | + public GpsEntity get(String deviceId) { | |
| 82 | + return gpsMap.get(deviceId); | |
| 83 | + } | |
| 84 | + | |
| 85 | + /** | |
| 86 | + * @Title: get @Description: TODO(线路编码获取GPS集合) @throws | |
| 87 | + */ | |
| 88 | + public List<GpsEntity> getByLine(String lineCode) { | |
| 89 | + NavigableSet<String> set = lineCode2Devices.get(lineCode); | |
| 90 | + | |
| 91 | + List<GpsEntity> rs = new ArrayList<>(); | |
| 92 | + GpsEntity gps; | |
| 93 | + ScheduleRealInfo sch; | |
| 94 | + for (String device : set) { | |
| 95 | + gps = gpsMap.get(device); | |
| 96 | + //过滤异常GPS数据 | |
| 97 | + if (gps.isAbnormal()) | |
| 98 | + continue; | |
| 99 | + | |
| 100 | + sch = dayOfSchedule.execPlanMap().get(gps.getNbbm()); | |
| 101 | + if (null != sch) | |
| 102 | + gps.setSchId(sch.getId()); | |
| 103 | + rs.add(gps); | |
| 104 | + } | |
| 105 | + | |
| 106 | + return rs; | |
| 107 | + } | |
| 108 | + | |
| 109 | + public List<GpsEntity> get(List<String> pArray) { | |
| 110 | + List<GpsEntity> list = new ArrayList<>(); | |
| 111 | + | |
| 112 | + for (String code : pArray) | |
| 113 | + list.addAll(getByLine(code)); | |
| 114 | + return list; | |
| 115 | + } | |
| 116 | + | |
| 117 | + public Set<String> allDevices() { | |
| 118 | + return gpsMap.keySet(); | |
| 119 | + } | |
| 120 | + | |
| 121 | + public GpsEntity findByDeviceId(String deviceId) { | |
| 122 | + return gpsMap.get(deviceId); | |
| 123 | + } | |
| 124 | + | |
| 125 | + public Collection<GpsEntity> all() { | |
| 126 | + return gpsMap.values(); | |
| 127 | + } | |
| 128 | + | |
| 129 | + public void remove(String device) { | |
| 130 | + gpsMap.remove(device); | |
| 131 | + } | |
| 132 | + | |
| 133 | + @Component | |
| 134 | + public static class GpsDataLoader extends Thread { | |
| 135 | + | |
| 136 | + Logger logger = LoggerFactory.getLogger(GpsDataLoader.class); | |
| 137 | + | |
| 138 | + @Autowired | |
| 139 | + GpsRealData gpsRealData; | |
| 140 | + | |
| 141 | + @Autowired | |
| 142 | + GpsRealAnalyse gpsRealAnalyse; | |
| 143 | + | |
| 144 | + @Override | |
| 145 | + public void run() { | |
| 146 | + try { | |
| 147 | + //如果正在恢复数据 | |
| 148 | + if (GpsDataRecovery.run) | |
| 149 | + return; | |
| 150 | + | |
| 151 | + load(); | |
| 152 | + } catch (Exception e) { | |
| 153 | + logger.error("", e); | |
| 154 | + } | |
| 155 | + } | |
| 156 | + | |
| 157 | + public void load() throws Exception { | |
| 158 | + List<GpsEntity> list = null; | |
| 159 | + List<GpsEntity> updateList = new ArrayList<>(); | |
| 160 | + CloseableHttpClient httpClient = null; | |
| 161 | + CloseableHttpResponse response = null; | |
| 162 | + try { | |
| 163 | + httpClient = HttpClients.createDefault(); | |
| 164 | + HttpGet get = new HttpGet(url); | |
| 165 | + | |
| 166 | + response = httpClient.execute(get); | |
| 167 | + | |
| 168 | + HttpEntity entity = response.getEntity(); | |
| 169 | + if (null != entity) { | |
| 170 | + BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent())); | |
| 171 | + StringBuffer stringBuffer = new StringBuffer(); | |
| 172 | + String str = ""; | |
| 173 | + while ((str = br.readLine()) != null) | |
| 174 | + stringBuffer.append(str); | |
| 175 | + | |
| 176 | + JSONObject jsonObj = JSON.parseObject(stringBuffer.toString()); | |
| 177 | + | |
| 178 | + if (jsonObj != null) | |
| 179 | + list = JSON.parseArray(jsonObj.getString("data"), GpsEntity.class); | |
| 180 | + | |
| 181 | + String nbbm; | |
| 182 | + GpsEntity old; | |
| 183 | + for (GpsEntity gps : list) { | |
| 184 | + //没有设备号 | |
| 185 | + if (StringUtils.isBlank(gps.getDeviceId())) | |
| 186 | + continue; | |
| 187 | + | |
| 188 | + old = gpsMap.get(gps.getDeviceId()); | |
| 189 | + if (old != null && | |
| 190 | + old.getTimestamp() == gps.getTimestamp()) | |
| 191 | + continue; | |
| 192 | + | |
| 193 | + nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId()); | |
| 194 | + if (StringUtils.isBlank(nbbm)) | |
| 195 | + gps.setAbnormal(true);//标记为异常数据 | |
| 196 | + else | |
| 197 | + gps.setNbbm(nbbm); | |
| 198 | + //有更新的点位 | |
| 199 | + updateList.add(gps); | |
| 200 | + } | |
| 201 | + //分析数据 | |
| 202 | + gpsRealAnalyse.analyse(updateList); | |
| 203 | + } else | |
| 204 | + logger.error("real gps result is null"); | |
| 205 | + } catch (Exception e) { | |
| 206 | + logger.error("", e); | |
| 207 | + } finally { | |
| 208 | + if (null != httpClient) | |
| 209 | + httpClient.close(); | |
| 210 | + if (null != response) | |
| 211 | + response.close(); | |
| 212 | + } | |
| 213 | + } | |
| 214 | + } | |
| 215 | +} | |
| 290 | 216 | \ No newline at end of file | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/GeoCacheData.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.GpsEntity; | |
| 4 | +import com.bsth.data.gpsdata.arrival.entity.StationRoute; | |
| 5 | +import com.bsth.data.gpsdata.arrival.utils.CircleQueue; | |
| 6 | +import com.bsth.data.gpsdata.arrival.utils.StationRouteComp; | |
| 7 | +import com.google.common.collect.ArrayListMultimap; | |
| 8 | +import com.vividsolutions.jts.geom.Coordinate; | |
| 9 | +import com.vividsolutions.jts.geom.GeometryFactory; | |
| 10 | +import com.vividsolutions.jts.geom.LineString; | |
| 11 | +import com.vividsolutions.jts.geom.Polygon; | |
| 12 | +import org.apache.commons.lang3.StringUtils; | |
| 13 | +import org.slf4j.Logger; | |
| 14 | +import org.slf4j.LoggerFactory; | |
| 15 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 16 | +import org.springframework.jdbc.core.JdbcTemplate; | |
| 17 | +import org.springframework.jdbc.core.RowMapper; | |
| 18 | +import org.springframework.stereotype.Component; | |
| 19 | + | |
| 20 | +import java.sql.ResultSet; | |
| 21 | +import java.sql.SQLException; | |
| 22 | +import java.util.*; | |
| 23 | + | |
| 24 | +/** | |
| 25 | + * Created by panzhao on 2016/12/23. | |
| 26 | + */ | |
| 27 | +@Component | |
| 28 | +public class GeoCacheData { | |
| 29 | + | |
| 30 | + static Logger logger = LoggerFactory.getLogger(GeoCacheData.class); | |
| 31 | + | |
| 32 | + //每辆车缓存最后500条gps | |
| 33 | + private static final int CACHE_SIZE = 500; | |
| 34 | + private static Map<String, CircleQueue<GpsEntity>> gpsCacheMap = new HashMap<>(); | |
| 35 | + | |
| 36 | + //线路路段走向 | |
| 37 | + private static ArrayListMultimap<String, LineString> sectionCacheMap; | |
| 38 | + | |
| 39 | + //线路站点路由 | |
| 40 | + private static ArrayListMultimap<String, StationRoute> stationCacheMap; | |
| 41 | + | |
| 42 | + //线路_上下行_站点编码 ——> 站点 | |
| 43 | + private static Map<String, StationRoute> routeCodeMap; | |
| 44 | + | |
| 45 | + //停车场 | |
| 46 | + public static Map<String, Polygon> tccMap; | |
| 47 | + | |
| 48 | + @Autowired | |
| 49 | + JdbcTemplate jdbcTemplate; | |
| 50 | + | |
| 51 | + public static CircleQueue<GpsEntity> getGps(String nbbm) { | |
| 52 | + return gpsCacheMap.get(nbbm); | |
| 53 | + } | |
| 54 | + | |
| 55 | + public static void putGps(GpsEntity gps) { | |
| 56 | + CircleQueue<GpsEntity> queue = gpsCacheMap.get(gps.getNbbm()); | |
| 57 | + if (queue == null) { | |
| 58 | + /*//第一个点从站内开始 | |
| 59 | + if (gps.getInstation() == 0) | |
| 60 | + return;*/ | |
| 61 | + | |
| 62 | + queue = new CircleQueue<>(CACHE_SIZE); | |
| 63 | + gpsCacheMap.put(gps.getNbbm(), queue); | |
| 64 | + } | |
| 65 | + queue.add(gps); | |
| 66 | + } | |
| 67 | + | |
| 68 | + public static void clear(String nbbm) { | |
| 69 | + try { | |
| 70 | + CircleQueue<GpsEntity> queue = gpsCacheMap.get(nbbm); | |
| 71 | + if (queue != null) | |
| 72 | + queue.clear(); | |
| 73 | + } catch (Exception e) { | |
| 74 | + logger.error("", e); | |
| 75 | + } | |
| 76 | + } | |
| 77 | + | |
| 78 | + public static StationRoute getRouteCode(GpsEntity gps){ | |
| 79 | + return routeCodeMap.get(gps.getLineId() + "_" + gps.getUpDown() + "_" + gps.getStopNo()); | |
| 80 | + } | |
| 81 | + | |
| 82 | + public static List<StationRoute> getStationRoute(String lineCode, int directions) { | |
| 83 | + return stationCacheMap.get(lineCode + "_" + directions); | |
| 84 | + } | |
| 85 | + | |
| 86 | + public static StationRoute getStation(String lineCode, int directions, String code) { | |
| 87 | + List<StationRoute> list = getStationRoute(lineCode, directions); | |
| 88 | + | |
| 89 | + for (StationRoute sr : list) { | |
| 90 | + if (sr.getCode().equals(code)) { | |
| 91 | + return sr; | |
| 92 | + } | |
| 93 | + } | |
| 94 | + return null; | |
| 95 | + } | |
| 96 | + | |
| 97 | + public static Polygon getTccPolygon(String code) { | |
| 98 | + return tccMap.get(code); | |
| 99 | + } | |
| 100 | + | |
| 101 | + public void loadData() { | |
| 102 | + final GeometryFactory geometryFactory = new GeometryFactory(); | |
| 103 | + //加载站点路由 | |
| 104 | + String sql = "select r.LINE_CODE,r.DIRECTIONS,r.STATION_CODE,r.STATION_MARK,s.SHAPES_TYPE,s.G_LONX,s.G_LATY,ST_AsText(s.G_POLYGON_GRID) as G_POLYGON_GRID,s.RADIUS, r.STATION_ROUTE_CODE,s.STATION_NAME from bsth_c_stationroute r left join bsth_c_station s on r.station=s.id where r.destroy=0 order by r.station_route_code"; | |
| 105 | + List<StationRoute> routeList = jdbcTemplate.query(sql, new RowMapper<StationRoute>() { | |
| 106 | + @Override | |
| 107 | + public StationRoute mapRow(ResultSet rs, int rowNum) throws SQLException { | |
| 108 | + StationRoute sRoute = new StationRoute(); | |
| 109 | + sRoute.setCode(rs.getString("STATION_CODE")); | |
| 110 | + sRoute.setLineCode(rs.getString("LINE_CODE")); | |
| 111 | + sRoute.setDirections(rs.getInt("DIRECTIONS")); | |
| 112 | + sRoute.setPoint(geometryFactory.createPoint(new Coordinate(rs.getFloat("G_LATY"), rs.getFloat("G_LONX")))); | |
| 113 | + sRoute.setRadius(rs.getFloat("RADIUS")); | |
| 114 | + sRoute.setRouteSort(rs.getInt("STATION_ROUTE_CODE")); | |
| 115 | + sRoute.setMark(rs.getString("STATION_MARK")); | |
| 116 | + sRoute.setName(rs.getString("STATION_NAME")); | |
| 117 | + | |
| 118 | + String shapesType = rs.getString("SHAPES_TYPE"); | |
| 119 | + //多边形电子围栏 | |
| 120 | + if (StringUtils.isNotEmpty(shapesType) && shapesType.equals("d")) { | |
| 121 | + sRoute.setPolygon(geometryFactory.createPolygon(parsePolygon(rs.getString("G_POLYGON_GRID")))); | |
| 122 | + } | |
| 123 | + return sRoute; | |
| 124 | + } | |
| 125 | + }); | |
| 126 | + //按线路和走向分组 | |
| 127 | + if (routeList.size() > 0) { | |
| 128 | + ArrayListMultimap<String, StationRoute> tempMap = ArrayListMultimap.create(); | |
| 129 | + Map<String, StationRoute> codeMap = new HashMap<>(routeList.size()); | |
| 130 | + for (StationRoute sr : routeList) { | |
| 131 | + tempMap.put(sr.getLineCode() + "_" + sr.getDirections(), sr); | |
| 132 | + //站点编码 ——> 和路由顺序对照 | |
| 133 | + codeMap.put(sr.getLineCode() + "_" + sr.getDirections() + "_" + sr.getCode(), sr); | |
| 134 | + } | |
| 135 | + | |
| 136 | + StationRouteComp srCom = new StationRouteComp(); | |
| 137 | + //连接路由 | |
| 138 | + Set<String> set = tempMap.keySet(); | |
| 139 | + for (String key : set) { | |
| 140 | + Collections.sort(tempMap.get(key), srCom); | |
| 141 | + connectStationRoute(tempMap.get(key)); | |
| 142 | + } | |
| 143 | + | |
| 144 | + stationCacheMap = tempMap; | |
| 145 | + routeCodeMap = codeMap; | |
| 146 | + } | |
| 147 | + | |
| 148 | + //加载停车场数据 | |
| 149 | + sql = "select PARK_CODE, ST_AsText(G_PARK_POINT) as G_PARK_POINT from bsth_c_car_park where park_code is not null and b_park_point is not null"; | |
| 150 | + List<Map<String, Object>> tccList = jdbcTemplate.queryForList(sql); | |
| 151 | + Map<String, Polygon> tccTempMap = new HashMap<>(); | |
| 152 | + | |
| 153 | + Polygon polygon; | |
| 154 | + for (Map<String, Object> tMap : tccList) { | |
| 155 | + | |
| 156 | + try { | |
| 157 | + polygon = geometryFactory.createPolygon(parsePolygon(tMap.get("G_PARK_POINT").toString())); | |
| 158 | + tccTempMap.put(tMap.get("PARK_CODE").toString() | |
| 159 | + , polygon); | |
| 160 | + } catch (Exception e) { | |
| 161 | + logger.error("停车场:" + tMap.get("PARK_CODE"), e); | |
| 162 | + } | |
| 163 | + } | |
| 164 | + | |
| 165 | + if (tccTempMap.size() > 0) | |
| 166 | + tccMap = tccTempMap; | |
| 167 | + } | |
| 168 | + | |
| 169 | + private void connectStationRoute(List<StationRoute> list) { | |
| 170 | + int size = list.size(); | |
| 171 | + StationRoute sr = null; | |
| 172 | + for (int i = 0; i < size; i++) { | |
| 173 | + sr = list.get(i); | |
| 174 | + //上一个 | |
| 175 | + if (i > 0) | |
| 176 | + sr.setPrve(list.get(i - 1)); | |
| 177 | + //下一个 | |
| 178 | + if (i < size - 1) | |
| 179 | + sr.setNext(list.get(i + 1)); | |
| 180 | + } | |
| 181 | + } | |
| 182 | + | |
| 183 | + public Coordinate[] parsePolygon(String polygonStr) { | |
| 184 | + String[] coords = polygonStr.substring(9, polygonStr.length() - 2).split(","), temps; | |
| 185 | + | |
| 186 | + Coordinate[] cds = new Coordinate[coords.length]; | |
| 187 | + int len = coords.length; | |
| 188 | + for (int i = 0; i < len; i++) { | |
| 189 | + temps = coords[i].split(" "); | |
| 190 | + cds[i] = new Coordinate(Float.parseFloat(temps[1]), Float.parseFloat(temps[0])); | |
| 191 | + } | |
| 192 | + return cds; | |
| 193 | + } | |
| 194 | +} | |
| 0 | 195 | \ No newline at end of file | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/GpsRealAnalyse.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.GpsEntity; | |
| 4 | +import com.bsth.data.gpsdata.arrival.handlers.*; | |
| 5 | +import com.bsth.data.gpsdata.arrival.utils.CircleQueue; | |
| 6 | +import org.slf4j.Logger; | |
| 7 | +import org.slf4j.LoggerFactory; | |
| 8 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 9 | +import org.springframework.stereotype.Component; | |
| 10 | + | |
| 11 | +import java.util.List; | |
| 12 | +import java.util.concurrent.CountDownLatch; | |
| 13 | +import java.util.concurrent.ExecutorService; | |
| 14 | +import java.util.concurrent.Executors; | |
| 15 | + | |
| 16 | +/** | |
| 17 | + * gps 实时数据分析 | |
| 18 | + * Created by panzhao on 2016/12/27. | |
| 19 | + */ | |
| 20 | +@Component | |
| 21 | +public class GpsRealAnalyse { | |
| 22 | + | |
| 23 | + Logger logger = LoggerFactory.getLogger(this.getClass()); | |
| 24 | + | |
| 25 | + @Autowired | |
| 26 | + OfflineSignalHandle offlineSignalHandle; | |
| 27 | + @Autowired | |
| 28 | + CorrectSignalHandle correctSignalHandle; | |
| 29 | + @Autowired | |
| 30 | + StationInsideHandle stationInsideHandle; | |
| 31 | + @Autowired | |
| 32 | + InOutStationSignalHandle inOutStationSignalHandle; | |
| 33 | + @Autowired | |
| 34 | + ReverseSignalHandle reverseSignalHandle; | |
| 35 | + | |
| 36 | + //50个线程 | |
| 37 | + static ExecutorService threadPool = Executors.newFixedThreadPool(50); | |
| 38 | + | |
| 39 | + public void analyse(List<GpsEntity> list) { | |
| 40 | + CountDownLatch count = new CountDownLatch(list.size()); | |
| 41 | + | |
| 42 | + for(GpsEntity gps : list) | |
| 43 | + threadPool.execute(new SignalHandleThread(gps, count)); | |
| 44 | + | |
| 45 | + try { | |
| 46 | + //等待子线程结束 | |
| 47 | + count.await(); | |
| 48 | + } catch (InterruptedException e) { | |
| 49 | + logger.error("", e); | |
| 50 | + } | |
| 51 | + } | |
| 52 | + | |
| 53 | + public class SignalHandleThread implements Runnable { | |
| 54 | + | |
| 55 | + GpsEntity gps; | |
| 56 | + CountDownLatch count; | |
| 57 | + | |
| 58 | + SignalHandleThread(GpsEntity gps, CountDownLatch count) { | |
| 59 | + this.gps = gps; | |
| 60 | + this.count = count; | |
| 61 | + } | |
| 62 | + | |
| 63 | + @Override | |
| 64 | + public void run() { | |
| 65 | + | |
| 66 | + try { | |
| 67 | + CircleQueue<GpsEntity> prevs = GeoCacheData.getGps(gps.getNbbm()); | |
| 68 | + //掉线处理 | |
| 69 | + offlineSignalHandle.handle(gps, prevs); | |
| 70 | + //状态处理 | |
| 71 | + if(!correctSignalHandle.handle(gps, prevs)) | |
| 72 | + return; | |
| 73 | + //场,站内外判断 | |
| 74 | + stationInsideHandle.handle(gps, prevs); | |
| 75 | + //反向处理 | |
| 76 | + reverseSignalHandle.handle(gps, prevs); | |
| 77 | + //进出站动作处理 | |
| 78 | + inOutStationSignalHandle.handle(gps, prevs); | |
| 79 | + GeoCacheData.putGps(gps); | |
| 80 | + | |
| 81 | + } catch (Exception e) { | |
| 82 | + logger.error("", e); | |
| 83 | + } finally { | |
| 84 | + count.countDown(); | |
| 85 | + } | |
| 86 | + } | |
| 87 | + } | |
| 88 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/SignalHandle.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.GpsEntity; | |
| 4 | +import com.bsth.data.gpsdata.arrival.utils.CircleQueue; | |
| 5 | + | |
| 6 | +/** | |
| 7 | + * Created by panzhao on 2016/12/27. | |
| 8 | + */ | |
| 9 | +public abstract class SignalHandle { | |
| 10 | + | |
| 11 | + public abstract boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs); | |
| 12 | + | |
| 13 | + protected boolean isNotEmpty(CircleQueue<GpsEntity> prevs) { | |
| 14 | + return prevs != null && prevs.size() > 0 && prevs.getTail() != null; | |
| 15 | + } | |
| 16 | + | |
| 17 | + /** | |
| 18 | + * 是不是异常信号 | |
| 19 | + * | |
| 20 | + * @param gps | |
| 21 | + * @return | |
| 22 | + */ | |
| 23 | + protected boolean isAbnormal(GpsEntity gps) { | |
| 24 | + return gps.getLat() == 0 || gps.getLon() == 0; | |
| 25 | + } | |
| 26 | + | |
| 27 | + /** | |
| 28 | + * 连续异常信号个数统计 | |
| 29 | + * | |
| 30 | + * @param prevs | |
| 31 | + * @return | |
| 32 | + */ | |
| 33 | + protected int abnormalCount(CircleQueue<GpsEntity> prevs) { | |
| 34 | + int count = 0; | |
| 35 | + | |
| 36 | + if (!isNotEmpty(prevs)) | |
| 37 | + return count; | |
| 38 | + | |
| 39 | + GpsEntity[] array = (GpsEntity[]) prevs.getQueue(); | |
| 40 | + GpsEntity gps; | |
| 41 | + for (int i = array.length - 1; i > 0; i--) { | |
| 42 | + gps = array[i]; | |
| 43 | + | |
| 44 | + if (isAbnormal(gps)) | |
| 45 | + count++; | |
| 46 | + else | |
| 47 | + break; | |
| 48 | + } | |
| 49 | + | |
| 50 | + return count; | |
| 51 | + } | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * 车辆运行轨迹(最近20分钟) | |
| 55 | + * 0:上行 1:下行 -1:未知 | |
| 56 | + * | |
| 57 | + * @param gps | |
| 58 | + * @return | |
| 59 | + */ | |
| 60 | + protected int runTrack(GpsEntity gps, CircleQueue<GpsEntity> prevs) { | |
| 61 | + int rs = -1, count = 0; | |
| 62 | + | |
| 63 | + long et = gps.getTimestamp() - (1000 * 60 * 20); | |
| 64 | + Object[] array = prevs.getQueue(); | |
| 65 | + GpsEntity prev; | |
| 66 | + for(Object obj : array){ | |
| 67 | + prev = (GpsEntity) obj; | |
| 68 | + if(prev.getTimestamp() < et) | |
| 69 | + break; | |
| 70 | + | |
| 71 | + | |
| 72 | + } | |
| 73 | + //for() | |
| 74 | + return 0; | |
| 75 | + } | |
| 76 | + | |
| 77 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/entity/RouteReverse.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival.entity; | |
| 2 | + | |
| 3 | +/** 路由反转 | |
| 4 | + * Created by panzhao on 2016/12/28. | |
| 5 | + */ | |
| 6 | +public class RouteReverse { | |
| 7 | + | |
| 8 | + //反转个数 | |
| 9 | + private int count; | |
| 10 | + | |
| 11 | + //详细 1,2,3,2,1 | |
| 12 | + private String detail; | |
| 13 | + | |
| 14 | + //掉头站点 | |
| 15 | + private String turned; | |
| 16 | + | |
| 17 | + //开始时间 | |
| 18 | + private long st; | |
| 19 | + | |
| 20 | + //掉头时间 | |
| 21 | + private long zt; | |
| 22 | + | |
| 23 | + //结束时间 | |
| 24 | + private long et; | |
| 25 | + | |
| 26 | + //是否闭合 | |
| 27 | + private boolean close; | |
| 28 | + | |
| 29 | + public int getCount() { | |
| 30 | + return count; | |
| 31 | + } | |
| 32 | + | |
| 33 | + public void setCount(int count) { | |
| 34 | + this.count = count; | |
| 35 | + } | |
| 36 | + | |
| 37 | + public String getDetail() { | |
| 38 | + return detail; | |
| 39 | + } | |
| 40 | + | |
| 41 | + public void setDetail(String detail) { | |
| 42 | + this.detail = detail; | |
| 43 | + } | |
| 44 | + | |
| 45 | + public String getTurned() { | |
| 46 | + return turned; | |
| 47 | + } | |
| 48 | + | |
| 49 | + public void setTurned(String turned) { | |
| 50 | + this.turned = turned; | |
| 51 | + } | |
| 52 | + | |
| 53 | + public long getSt() { | |
| 54 | + return st; | |
| 55 | + } | |
| 56 | + | |
| 57 | + public void setSt(long st) { | |
| 58 | + this.st = st; | |
| 59 | + } | |
| 60 | + | |
| 61 | + public long getEt() { | |
| 62 | + return et; | |
| 63 | + } | |
| 64 | + | |
| 65 | + public void setEt(long et) { | |
| 66 | + this.et = et; | |
| 67 | + } | |
| 68 | + | |
| 69 | + public boolean isClose() { | |
| 70 | + return close; | |
| 71 | + } | |
| 72 | + | |
| 73 | + public void setClose(boolean close) { | |
| 74 | + this.close = close; | |
| 75 | + } | |
| 76 | + | |
| 77 | + public long getZt() { | |
| 78 | + return zt; | |
| 79 | + } | |
| 80 | + | |
| 81 | + public void setZt(long zt) { | |
| 82 | + this.zt = zt; | |
| 83 | + } | |
| 84 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/entity/StationRoute.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival.entity; | |
| 2 | + | |
| 3 | +import com.vividsolutions.jts.geom.Point; | |
| 4 | +import com.vividsolutions.jts.geom.Polygon; | |
| 5 | + | |
| 6 | +/** | |
| 7 | + * Created by panzhao on 2016/12/23. | |
| 8 | + */ | |
| 9 | +public class StationRoute { | |
| 10 | + | |
| 11 | + /** | |
| 12 | + * 线路编码 | |
| 13 | + */ | |
| 14 | + private String lineCode; | |
| 15 | + | |
| 16 | + /** | |
| 17 | + * 上下行 | |
| 18 | + */ | |
| 19 | + private int directions; | |
| 20 | + | |
| 21 | + /** | |
| 22 | + * 站点编码 | |
| 23 | + */ | |
| 24 | + private String code; | |
| 25 | + | |
| 26 | + /** | |
| 27 | + * 路由顺序 | |
| 28 | + */ | |
| 29 | + private int routeSort; | |
| 30 | + | |
| 31 | + /** | |
| 32 | + * 站点位置 | |
| 33 | + */ | |
| 34 | + private Point point; | |
| 35 | + | |
| 36 | + /** | |
| 37 | + * 圆形半径 | |
| 38 | + */ | |
| 39 | + private Float radius; | |
| 40 | + | |
| 41 | + /** | |
| 42 | + * 多边形电子围栏 | |
| 43 | + */ | |
| 44 | + private Polygon polygon; | |
| 45 | + | |
| 46 | + /** | |
| 47 | + * 站点标记 | |
| 48 | + */ | |
| 49 | + private String mark; | |
| 50 | + | |
| 51 | + /** | |
| 52 | + * 下一站 | |
| 53 | + */ | |
| 54 | + private StationRoute next; | |
| 55 | + | |
| 56 | + /** | |
| 57 | + * 上一站 | |
| 58 | + */ | |
| 59 | + private StationRoute prve; | |
| 60 | + | |
| 61 | + private String name; | |
| 62 | + | |
| 63 | + public String getCode() { | |
| 64 | + return code; | |
| 65 | + } | |
| 66 | + | |
| 67 | + public void setCode(String code) { | |
| 68 | + this.code = code; | |
| 69 | + } | |
| 70 | + | |
| 71 | + public int getRouteSort() { | |
| 72 | + return routeSort; | |
| 73 | + } | |
| 74 | + | |
| 75 | + public void setRouteSort(int routeSort) { | |
| 76 | + this.routeSort = routeSort; | |
| 77 | + } | |
| 78 | + | |
| 79 | + public Point getPoint() { | |
| 80 | + return point; | |
| 81 | + } | |
| 82 | + | |
| 83 | + public void setPoint(Point point) { | |
| 84 | + this.point = point; | |
| 85 | + } | |
| 86 | + | |
| 87 | + public Float getRadius() { | |
| 88 | + return radius; | |
| 89 | + } | |
| 90 | + | |
| 91 | + public void setRadius(Float radius) { | |
| 92 | + this.radius = radius; | |
| 93 | + } | |
| 94 | + | |
| 95 | + public Polygon getPolygon() { | |
| 96 | + return polygon; | |
| 97 | + } | |
| 98 | + | |
| 99 | + public void setPolygon(Polygon polygon) { | |
| 100 | + this.polygon = polygon; | |
| 101 | + } | |
| 102 | + | |
| 103 | + public String getLineCode() { | |
| 104 | + return lineCode; | |
| 105 | + } | |
| 106 | + | |
| 107 | + public void setLineCode(String lineCode) { | |
| 108 | + this.lineCode = lineCode; | |
| 109 | + } | |
| 110 | + | |
| 111 | + public int getDirections() { | |
| 112 | + return directions; | |
| 113 | + } | |
| 114 | + | |
| 115 | + public void setDirections(int directions) { | |
| 116 | + this.directions = directions; | |
| 117 | + } | |
| 118 | + | |
| 119 | + public StationRoute getNext() { | |
| 120 | + return next; | |
| 121 | + } | |
| 122 | + | |
| 123 | + public void setNext(StationRoute next) { | |
| 124 | + this.next = next; | |
| 125 | + } | |
| 126 | + | |
| 127 | + public StationRoute getPrve() { | |
| 128 | + return prve; | |
| 129 | + } | |
| 130 | + | |
| 131 | + public void setPrve(StationRoute prve) { | |
| 132 | + this.prve = prve; | |
| 133 | + } | |
| 134 | + | |
| 135 | + public String getMark() { | |
| 136 | + return mark; | |
| 137 | + } | |
| 138 | + | |
| 139 | + public void setMark(String mark) { | |
| 140 | + this.mark = mark; | |
| 141 | + } | |
| 142 | + | |
| 143 | + public String getName() { | |
| 144 | + return name; | |
| 145 | + } | |
| 146 | + | |
| 147 | + public void setName(String name) { | |
| 148 | + this.name = name; | |
| 149 | + } | |
| 150 | +} | |
| 151 | + | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/handlers/CorrectSignalHandle.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival.handlers; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.GpsEntity; | |
| 4 | +import com.bsth.data.gpsdata.arrival.SignalHandle; | |
| 5 | +import com.bsth.data.gpsdata.arrival.utils.CircleQueue; | |
| 6 | +import com.bsth.data.schedule.DayOfSchedule; | |
| 7 | +import com.bsth.entity.realcontrol.ChildTaskPlan; | |
| 8 | +import com.bsth.entity.realcontrol.ScheduleRealInfo; | |
| 9 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 10 | +import org.springframework.stereotype.Component; | |
| 11 | + | |
| 12 | +/** | |
| 13 | + * 信号状态纠正 | |
| 14 | + * Created by panzhao on 2016/12/27. | |
| 15 | + */ | |
| 16 | +@Component | |
| 17 | +public class CorrectSignalHandle extends SignalHandle { | |
| 18 | + | |
| 19 | + @Autowired | |
| 20 | + DayOfSchedule dayOfSchedule; | |
| 21 | + | |
| 22 | + @Override | |
| 23 | + public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) { | |
| 24 | + Object task = dayOfSchedule.executeCurr(gps.getNbbm()); | |
| 25 | + if(task == null) | |
| 26 | + return false; | |
| 27 | + ScheduleRealInfo sch; | |
| 28 | + | |
| 29 | + //子任务 | |
| 30 | + if(task.getClass().isAssignableFrom(ChildTaskPlan.class)){ | |
| 31 | + ChildTaskPlan childTask = (ChildTaskPlan) task; | |
| 32 | + sch = childTask.getSchedule(); | |
| 33 | + } | |
| 34 | + else | |
| 35 | + sch = (ScheduleRealInfo) task; | |
| 36 | + | |
| 37 | + int updown = Integer.parseInt(sch.getXlDir()); | |
| 38 | + //走向 | |
| 39 | + if(gps.getUpDown() != updown){ | |
| 40 | + gps.setUpDown(updown); | |
| 41 | + gps.setState(0); | |
| 42 | + } | |
| 43 | + | |
| 44 | + | |
| 45 | + return true; | |
| 46 | + } | |
| 47 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/handlers/InOutStationSignalHandle.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival.handlers; | |
| 2 | + | |
| 3 | +import com.bsth.data.LineConfigData; | |
| 4 | +import com.bsth.data.gpsdata.GpsEntity; | |
| 5 | +import com.bsth.data.gpsdata.arrival.GeoCacheData; | |
| 6 | +import com.bsth.data.gpsdata.arrival.SignalHandle; | |
| 7 | +import com.bsth.data.gpsdata.arrival.entity.StationRoute; | |
| 8 | +import com.bsth.data.gpsdata.arrival.utils.CircleQueue; | |
| 9 | +import com.bsth.data.gpsdata.arrival.utils.GeoUtils; | |
| 10 | +import com.bsth.data.schedule.DayOfSchedule; | |
| 11 | +import com.bsth.entity.realcontrol.LineConfig; | |
| 12 | +import com.bsth.entity.realcontrol.ScheduleRealInfo; | |
| 13 | +import com.bsth.service.directive.DirectiveService; | |
| 14 | +import com.bsth.websocket.handler.SendUtils; | |
| 15 | +import org.slf4j.Logger; | |
| 16 | +import org.slf4j.LoggerFactory; | |
| 17 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 18 | +import org.springframework.stereotype.Component; | |
| 19 | + | |
| 20 | +import java.util.List; | |
| 21 | + | |
| 22 | +/** | |
| 23 | + * 进出站动作处理 | |
| 24 | + * Created by panzhao on 2016/12/27. | |
| 25 | + */ | |
| 26 | +@Component | |
| 27 | +public class InOutStationSignalHandle extends SignalHandle{ | |
| 28 | + | |
| 29 | + Logger logger = LoggerFactory.getLogger(this.getClass()); | |
| 30 | + | |
| 31 | + @Autowired | |
| 32 | + DayOfSchedule dayOfSchedule; | |
| 33 | + | |
| 34 | + @Autowired | |
| 35 | + LineConfigData lineConfigData; | |
| 36 | + | |
| 37 | + @Autowired | |
| 38 | + SendUtils sendUtils; | |
| 39 | + | |
| 40 | + @Autowired | |
| 41 | + DirectiveService directiveService; | |
| 42 | + | |
| 43 | + @Override | |
| 44 | + public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) { | |
| 45 | + | |
| 46 | + if(isNotEmpty(prevs)){ | |
| 47 | + GpsEntity prev = prevs.getTail(); | |
| 48 | + if(isOutStation(gps, prev)) | |
| 49 | + outStation(gps, prev); | |
| 50 | + | |
| 51 | + | |
| 52 | + if(isInStation(gps, prev)) | |
| 53 | + inStation(gps, prev); | |
| 54 | + } | |
| 55 | + | |
| 56 | + return true; | |
| 57 | + } | |
| 58 | + | |
| 59 | + private boolean isOutStation(GpsEntity gps, GpsEntity prev){ | |
| 60 | + //从站内到站外 | |
| 61 | + if(prev.getInstation() > 0 && gps.getInstation() == 0) | |
| 62 | + return true; | |
| 63 | + | |
| 64 | + //从站内到另一个站内 | |
| 65 | + if(prev.getInstation() > 0 && gps.getInstation() > 0 | |
| 66 | + && !prev.getStopNo().equals(gps.getStopNo())) | |
| 67 | + return true; | |
| 68 | + return false; | |
| 69 | + } | |
| 70 | + | |
| 71 | + private boolean isInStation(GpsEntity gps, GpsEntity prev){ | |
| 72 | + //从站外到站内 | |
| 73 | + if(prev.getInstation() == 0 && gps.getInstation() > 0 | |
| 74 | + /*&& !prev.getStopNo().equals(gps.getStopNo())*/){ | |
| 75 | + return true; | |
| 76 | + } | |
| 77 | + | |
| 78 | + //从站内到另一个站内 | |
| 79 | + if(prev.getInstation() > 0 && gps.getInstation() > 0 | |
| 80 | + && !prev.getStopNo().equals(gps.getStopNo())) | |
| 81 | + return true; | |
| 82 | + return false; | |
| 83 | + } | |
| 84 | + | |
| 85 | + /** | |
| 86 | + * 出站 | |
| 87 | + * @param gps 当前点 | |
| 88 | + * @param prev 上一个点 | |
| 89 | + */ | |
| 90 | + private void outStation(GpsEntity gps, GpsEntity prev) { | |
| 91 | + ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm()); | |
| 92 | + String qdzCode = sch.getQdzCode(); | |
| 93 | + | |
| 94 | + | |
| 95 | + //if(sch.getFcsjActual() != ) | |
| 96 | + | |
| 97 | + //起点发车 | |
| 98 | + if(qdzCode != null && prev.getStopNo().equals(qdzCode) | |
| 99 | + && !willDepart(gps, prev, sch)){ | |
| 100 | + | |
| 101 | + sch.setFcsjActualAll(gps.getTimestamp()); | |
| 102 | + //通知客户端 | |
| 103 | + sendUtils.sendFcsj(sch); | |
| 104 | + //持久化 | |
| 105 | + dayOfSchedule.save(sch); | |
| 106 | + | |
| 107 | + //出站既出场 | |
| 108 | + outStationAndOutPark(sch); | |
| 109 | + logger.info("班次:" + sch.getDfsj() + "发车, 时间:" + sch.getFcsjActual()); | |
| 110 | + } | |
| 111 | + } | |
| 112 | + | |
| 113 | + private void outStationAndOutPark(ScheduleRealInfo sch){ | |
| 114 | + LineConfig config = lineConfigData.get(sch.getXlBm()); | |
| 115 | + if (config != null && config.getOutConfig() == 2) { | |
| 116 | + //出站既出场 | |
| 117 | + ScheduleRealInfo schPrev = dayOfSchedule.prev(sch); | |
| 118 | + if (schPrev != null && schPrev.getBcType().equals("out")) { | |
| 119 | + schPrev.setFcsjActualAll(sch.getFcsjActual()); | |
| 120 | + schPrev.setZdsjActualAll(sch.getFcsjActual()); | |
| 121 | + } | |
| 122 | + } | |
| 123 | + } | |
| 124 | + | |
| 125 | + /** | |
| 126 | + * 进站 | |
| 127 | + * @param gps 当前点 | |
| 128 | + * @param prev 上一个点 | |
| 129 | + */ | |
| 130 | + private void inStation(GpsEntity gps, GpsEntity prev){ | |
| 131 | + ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm()); | |
| 132 | + String zdzCode = sch.getZdzCode(); | |
| 133 | + | |
| 134 | + if(zdzCode != null && gps.getStopNo().equals(zdzCode)){ | |
| 135 | + | |
| 136 | + sch.setZdsjActualAll(gps.getTimestamp()); | |
| 137 | + //已完成班次数 | |
| 138 | + int doneSum = dayOfSchedule.doneSum(sch.getClZbh()); | |
| 139 | + ScheduleRealInfo next = dayOfSchedule.next(sch); | |
| 140 | + //通知客户端 | |
| 141 | + sendUtils.sendZdsj(sch, next, doneSum); | |
| 142 | + //持久化 | |
| 143 | + dayOfSchedule.save(sch); | |
| 144 | + //下发调度指令 | |
| 145 | + //directiveService.send60Dispatch(next, doneSum, "到站@系统"); | |
| 146 | + | |
| 147 | + //准备执行下一个班次 | |
| 148 | + if (next != null) { | |
| 149 | + next.setQdzArrDatesj(sch.getZdsjActual()); | |
| 150 | + dayOfSchedule.addExecPlan(next); | |
| 151 | + | |
| 152 | + //进站既进场 | |
| 153 | + inStationAndInPark(sch, next); | |
| 154 | + | |
| 155 | + //将gps转换为下一个班次走向的站内信号 | |
| 156 | + int updown = Integer.parseInt(next.getXlDir()); | |
| 157 | + List<StationRoute> srs = GeoCacheData.getStationRoute(next.getXlBm(), updown); | |
| 158 | + StationRoute station = GeoUtils.gpsInStation(gps, srs); | |
| 159 | + if (station != null) { | |
| 160 | + gps.setUpDown(updown); | |
| 161 | + gps.setStopNo(station.getCode()); | |
| 162 | + } | |
| 163 | + } | |
| 164 | + } | |
| 165 | + /* //如果出场班次计划终点时间5分钟后还未完成,检查一下车辆轨迹,是否已经在执行线路上班次 | |
| 166 | + else if(sch.getBcType().equals("out") | |
| 167 | + && sch.getZdsj() != null | |
| 168 | + && gps.getTimestamp() - sch.getZdsjT() >= 1000 * 60 * 5){ | |
| 169 | + logger.info("出场班次计划终点时间5分钟后还未完成"); | |
| 170 | + | |
| 171 | + }*/ | |
| 172 | + } | |
| 173 | + | |
| 174 | + /** | |
| 175 | + * 进站既进场 | |
| 176 | + * @param sch | |
| 177 | + */ | |
| 178 | + private void inStationAndInPark(ScheduleRealInfo sch, ScheduleRealInfo next){ | |
| 179 | + LineConfig config = lineConfigData.get(sch.getXlBm()); | |
| 180 | + if (next.getBcType().equals("in") && | |
| 181 | + config != null && config.getOutConfig() == 2) { | |
| 182 | + next.setFcsjActualAll(sch.getZdsjActual()); | |
| 183 | + next.setZdsjActualAll(sch.getZdsjActual()); | |
| 184 | + } | |
| 185 | + } | |
| 186 | + | |
| 187 | + /** | |
| 188 | + * 发车漂移判定(这里出现的误判,由车辆到达中途站的时候补偿) | |
| 189 | + * @param gps | |
| 190 | + * @param prev | |
| 191 | + * @param task | |
| 192 | + * @return | |
| 193 | + */ | |
| 194 | + private boolean willDepart(GpsEntity gps, GpsEntity prev, Object task){ | |
| 195 | + | |
| 196 | +/* ScheduleRealInfo sch = (ScheduleRealInfo) task; | |
| 197 | + ScheduleRealInfo prevTask = dayOfSchedule.prev(sch); | |
| 198 | + if(prevTask == null || prevTask.getBcType().equals("out")) | |
| 199 | + return false; | |
| 200 | + | |
| 201 | + //计划停站时间 | |
| 202 | + int stopTimePlan = (int) (sch.getDfsjT() - prevTask.getZdsjT()); | |
| 203 | + | |
| 204 | + if(stopTimePlan < 1000 * 60 * 10) | |
| 205 | + return false; | |
| 206 | + | |
| 207 | + //实际停站时间 | |
| 208 | + if(prevTask.getZdsjActual() != null){ | |
| 209 | + int actualTime = (int) (gps.getTimestamp() - prevTask.getZdsjActualTime()); | |
| 210 | + | |
| 211 | + if(actualTime < stopTimePlan * 0.8){ | |
| 212 | + logger.info("漂移判定"); | |
| 213 | + | |
| 214 | + return true; | |
| 215 | + } | |
| 216 | + }*/ | |
| 217 | + return false; | |
| 218 | + } | |
| 219 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/handlers/OfflineSignalHandle.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival.handlers; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.GpsEntity; | |
| 4 | +import com.bsth.data.gpsdata.arrival.GeoCacheData; | |
| 5 | +import com.bsth.data.gpsdata.arrival.SignalHandle; | |
| 6 | +import com.bsth.data.gpsdata.arrival.utils.CircleQueue; | |
| 7 | +import org.springframework.stereotype.Component; | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * 信号断线重连处理 | |
| 11 | + * Created by panzhao on 2016/12/27. | |
| 12 | + */ | |
| 13 | +@Component | |
| 14 | +public class OfflineSignalHandle extends SignalHandle{ | |
| 15 | + | |
| 16 | + //断开3分钟,标记为重连信号 | |
| 17 | + private final static int OFFLINE_TIME = 1000 * 60 * 3; | |
| 18 | + | |
| 19 | + //断开70分钟,之前的信号不再有参考价值 | |
| 20 | + private final static int CLEAR_TIME = 1000 * 60 * 70; | |
| 21 | + | |
| 22 | + @Override | |
| 23 | + public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) { | |
| 24 | + //异常信号不管 | |
| 25 | + if(isAbnormal(gps)){ | |
| 26 | + return true; | |
| 27 | + } | |
| 28 | + | |
| 29 | + if(isNotEmpty(prevs)){ | |
| 30 | + GpsEntity prev = prevs.getTail(); | |
| 31 | + int space = (int) (gps.getTimestamp() - prev.getTimestamp()); | |
| 32 | + if(space > OFFLINE_TIME) | |
| 33 | + gps.setSignalState("reconnection"); | |
| 34 | + | |
| 35 | + if(space > CLEAR_TIME){ | |
| 36 | + //清理缓存的信号 | |
| 37 | + GeoCacheData.clear(gps.getNbbm()); | |
| 38 | + } | |
| 39 | + } | |
| 40 | + return true; | |
| 41 | + } | |
| 42 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/handlers/ReverseSignalHandle.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival.handlers; | |
| 2 | + | |
| 3 | +import com.alibaba.fastjson.JSON; | |
| 4 | +import com.bsth.data.gpsdata.GpsEntity; | |
| 5 | +import com.bsth.data.gpsdata.arrival.GeoCacheData; | |
| 6 | +import com.bsth.data.gpsdata.arrival.SignalHandle; | |
| 7 | +import com.bsth.data.gpsdata.arrival.entity.RouteReverse; | |
| 8 | +import com.bsth.data.gpsdata.arrival.entity.StationRoute; | |
| 9 | +import com.bsth.data.gpsdata.arrival.utils.CircleQueue; | |
| 10 | +import com.bsth.data.schedule.DayOfSchedule; | |
| 11 | +import com.bsth.entity.realcontrol.ScheduleRealInfo; | |
| 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 | +/** | |
| 18 | + * 路由反向信号处理 | |
| 19 | + * Created by panzhao on 2016/12/28. | |
| 20 | + */ | |
| 21 | +@Component | |
| 22 | +public class ReverseSignalHandle extends SignalHandle { | |
| 23 | + | |
| 24 | + Logger logger = LoggerFactory.getLogger(this.getClass()); | |
| 25 | + | |
| 26 | + @Autowired | |
| 27 | + DayOfSchedule dayOfSchedule; | |
| 28 | + | |
| 29 | + @Override | |
| 30 | + public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) { | |
| 31 | + if (!isNotEmpty(prevs)) | |
| 32 | + return false; | |
| 33 | + | |
| 34 | + GpsEntity prev = prevs.getTail(); | |
| 35 | + | |
| 36 | + if (isReverse(gps, prev)) { | |
| 37 | + RouteReverse reverse = reverseSearch(prevs, gps); | |
| 38 | + | |
| 39 | + if (reverse.getCount() >= 2) { | |
| 40 | + //切换到下一个班次 | |
| 41 | + ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm()); | |
| 42 | + if (sch.getBcType().equals("out") && sch.getZdsjT() != null && sch.getZdsjT() > gps.getTimestamp()) { | |
| 43 | + return false; | |
| 44 | + } | |
| 45 | + dayOfSchedule.addExecPlan(dayOfSchedule.next(sch)); | |
| 46 | + | |
| 47 | + if (reverse.isClose()) { | |
| 48 | + logger.info("区间掉头,车辆:" + gps.getNbbm() + " -" + JSON.toJSONString(reverse)); | |
| 49 | + } | |
| 50 | + } | |
| 51 | + } | |
| 52 | + return false; | |
| 53 | + } | |
| 54 | + | |
| 55 | + /** | |
| 56 | + * 搜索路由反向详细 | |
| 57 | + * | |
| 58 | + * @param prevs | |
| 59 | + * @param gps | |
| 60 | + * @return | |
| 61 | + */ | |
| 62 | + public RouteReverse reverseSearch(CircleQueue<GpsEntity> prevs, GpsEntity gps) { | |
| 63 | + RouteReverse routeReverse = new RouteReverse(); | |
| 64 | + int count = 0; | |
| 65 | + String path = ""; | |
| 66 | + String turned = null; | |
| 67 | + | |
| 68 | + //当前站点 | |
| 69 | + StationRoute curr = GeoCacheData.getRouteCode(gps), sr; | |
| 70 | + GpsEntity prev; | |
| 71 | + Object[] array = prevs.getQueue(); | |
| 72 | + for (int i = array.length - 1; i > 0; i--) { | |
| 73 | + prev = (GpsEntity) array[i]; | |
| 74 | + | |
| 75 | + if(!prev.getUpDown().equals(gps.getUpDown())) | |
| 76 | + break; | |
| 77 | + | |
| 78 | + if (prev.getInstation() == 1) { | |
| 79 | + sr = GeoCacheData.getRouteCode(prev); | |
| 80 | + | |
| 81 | + if (sr.getRouteSort() > curr.getRouteSort()) { | |
| 82 | + path += (curr.getCode() + ","); | |
| 83 | + count++; | |
| 84 | + } else if (sr.getRouteSort() < curr.getRouteSort()) { | |
| 85 | + path += (curr.getCode() + ","); | |
| 86 | + //掉头点 | |
| 87 | + if (turned == null) | |
| 88 | + turned = prev.getStopNo(); | |
| 89 | + | |
| 90 | + //路径闭合 | |
| 91 | + if (sr.getCode().equals(gps.getStopNo())) { | |
| 92 | + routeReverse.setClose(true); | |
| 93 | + path += sr.getCode(); | |
| 94 | + break; | |
| 95 | + } | |
| 96 | + } | |
| 97 | + | |
| 98 | + curr = sr; | |
| 99 | + } | |
| 100 | + } | |
| 101 | + | |
| 102 | + routeReverse.setCount(count); | |
| 103 | + routeReverse.setDetail(path); | |
| 104 | + routeReverse.setTurned(turned); | |
| 105 | + return routeReverse; | |
| 106 | + } | |
| 107 | + | |
| 108 | + /** | |
| 109 | + * 是否反向 | |
| 110 | + * | |
| 111 | + * @param gps | |
| 112 | + * @param prev | |
| 113 | + * @return | |
| 114 | + */ | |
| 115 | + public boolean isReverse(GpsEntity gps, GpsEntity prev) { | |
| 116 | + if (gps.getInstation() == 1 | |
| 117 | + && | |
| 118 | + gps.getUpDown().equals(prev.getUpDown()) | |
| 119 | + && !gps.getStopNo().equals(prev.getStopNo())) { | |
| 120 | + | |
| 121 | + StationRoute currStation = GeoCacheData.getRouteCode(gps); | |
| 122 | + StationRoute prevStation = GeoCacheData.getRouteCode(prev); | |
| 123 | + | |
| 124 | + if (currStation == null || prevStation == null) | |
| 125 | + return false; | |
| 126 | + | |
| 127 | + if (currStation.getRouteSort() < prevStation.getRouteSort()) | |
| 128 | + return true; | |
| 129 | + } | |
| 130 | + return false; | |
| 131 | + } | |
| 132 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/handlers/StationInsideHandle.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival.handlers; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.GpsEntity; | |
| 4 | +import com.bsth.data.gpsdata.arrival.GeoCacheData; | |
| 5 | +import com.bsth.data.gpsdata.arrival.SignalHandle; | |
| 6 | +import com.bsth.data.gpsdata.arrival.entity.StationRoute; | |
| 7 | +import com.bsth.data.gpsdata.arrival.utils.CircleQueue; | |
| 8 | +import com.bsth.data.gpsdata.arrival.utils.GeoUtils; | |
| 9 | +import org.springframework.stereotype.Component; | |
| 10 | + | |
| 11 | +import java.util.List; | |
| 12 | + | |
| 13 | +/** | |
| 14 | + * 站内站外判定 | |
| 15 | + * Created by panzhao on 2016/12/27. | |
| 16 | + */ | |
| 17 | +@Component | |
| 18 | +public class StationInsideHandle extends SignalHandle { | |
| 19 | + | |
| 20 | + | |
| 21 | + @Override | |
| 22 | + public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) { | |
| 23 | + //是否在场内 | |
| 24 | + String parkCode = GeoUtils.gpsInCarpark(gps); | |
| 25 | + if (parkCode != null) { | |
| 26 | + gps.setInstation(2); | |
| 27 | + gps.setStopNo(parkCode); | |
| 28 | + } | |
| 29 | + | |
| 30 | + //是否在站内 | |
| 31 | + List<StationRoute> srs = GeoCacheData.getStationRoute(gps.getLineId(), gps.getUpDown()); | |
| 32 | + StationRoute station = GeoUtils.gpsInStation(gps, srs); | |
| 33 | + if (station != null) { | |
| 34 | + gps.setInstation(1); | |
| 35 | + gps.setStopNo(station.getCode()); | |
| 36 | + gps.setStation(station); | |
| 37 | + } | |
| 38 | + | |
| 39 | + //在场,站外 | |
| 40 | + if(gps.getInstation() == 0 && isNotEmpty(prevs)){ | |
| 41 | + //继承上一个点的站点编码 | |
| 42 | + GpsEntity prev = prevs.getTail(); | |
| 43 | + gps.setStopNo(prev.getStopNo()); | |
| 44 | + } | |
| 45 | + | |
| 46 | + return true; | |
| 47 | + } | |
| 48 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/utils/CircleQueue.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival.utils; | |
| 2 | + | |
| 3 | +import java.util.Arrays; | |
| 4 | + | |
| 5 | +/** | |
| 6 | + * 循环队列 | |
| 7 | + * Created by panzhao on 2016/12/23. | |
| 8 | + */ | |
| 9 | +public class CircleQueue<T> { | |
| 10 | + | |
| 11 | + /** | |
| 12 | + * (循环队列)数组的容量 | |
| 13 | + */ | |
| 14 | + public int capacity; | |
| 15 | + | |
| 16 | + /** | |
| 17 | + * 数组:保存循环队列的元素 | |
| 18 | + */ | |
| 19 | + public Object[] elementData; | |
| 20 | + | |
| 21 | + /** | |
| 22 | + * 头 | |
| 23 | + */ | |
| 24 | + public int head = 0; | |
| 25 | + | |
| 26 | + /** | |
| 27 | + * 尾 | |
| 28 | + */ | |
| 29 | + public int tail = 0; | |
| 30 | + | |
| 31 | + /** | |
| 32 | + * 以指定长度的数组来创建循环队列 | |
| 33 | + * | |
| 34 | + * @param initSize | |
| 35 | + */ | |
| 36 | + public CircleQueue(final int initSize) { | |
| 37 | + capacity = initSize; | |
| 38 | + elementData = new Object[capacity]; | |
| 39 | + } | |
| 40 | + | |
| 41 | + /** | |
| 42 | + * 获取循环队列的大小 | |
| 43 | + */ | |
| 44 | + public int size() { | |
| 45 | + if (isEmpty()) { | |
| 46 | + return 0; | |
| 47 | + } else if (isFull()) { | |
| 48 | + return capacity; | |
| 49 | + } else { | |
| 50 | + return tail + 1; | |
| 51 | + } | |
| 52 | + } | |
| 53 | + | |
| 54 | + /** | |
| 55 | + * 插入队尾一个元素 | |
| 56 | + */ | |
| 57 | + public void add(final T element) { | |
| 58 | + if (isEmpty()) { | |
| 59 | + elementData[0] = element; | |
| 60 | + } else if (isFull()) { | |
| 61 | + elementData[head] = element; | |
| 62 | + head++; | |
| 63 | + tail++; | |
| 64 | + head = head == capacity ? 0 : head; | |
| 65 | + tail = tail == capacity ? 0 : tail; | |
| 66 | + } else { | |
| 67 | + elementData[tail + 1] = element; | |
| 68 | + tail++; | |
| 69 | + } | |
| 70 | + } | |
| 71 | + | |
| 72 | + public boolean isEmpty() { | |
| 73 | + return tail == head && tail == 0 && elementData[tail] == null; | |
| 74 | + } | |
| 75 | + | |
| 76 | + public boolean isFull() { | |
| 77 | + return head != 0 && head - tail == 1 || head == 0 && tail == capacity - 1; | |
| 78 | + } | |
| 79 | + | |
| 80 | + public void clear() { | |
| 81 | + Arrays.fill(elementData, null); | |
| 82 | + head = 0; | |
| 83 | + tail = 0; | |
| 84 | + } | |
| 85 | + | |
| 86 | + /** | |
| 87 | + * @return 取 循环队列里的值(先进的index=0) | |
| 88 | + */ | |
| 89 | + public Object[] getQueue() { | |
| 90 | + final Object[] elementDataSort; | |
| 91 | + final Object[] elementDataCopy = elementData.clone(); | |
| 92 | + if (isEmpty()) { | |
| 93 | + elementDataSort = new Object[0]; | |
| 94 | + } else if (isFull()) { | |
| 95 | + elementDataSort = new Object[capacity]; | |
| 96 | + int indexMax = capacity; | |
| 97 | + int indexSort = 0; | |
| 98 | + for (int i = head; i < indexMax;) { | |
| 99 | + elementDataSort[indexSort] = elementDataCopy[i]; | |
| 100 | + indexSort++; | |
| 101 | + i++; | |
| 102 | + if (i == capacity) { | |
| 103 | + i = 0; | |
| 104 | + indexMax = head; | |
| 105 | + } | |
| 106 | + } | |
| 107 | + } else { | |
| 108 | + elementDataSort = new Object[tail]; | |
| 109 | + for (int i = 0; i < tail; i++) { | |
| 110 | + elementDataSort[i] = elementDataCopy[i]; | |
| 111 | + } | |
| 112 | + } | |
| 113 | + return elementDataSort; | |
| 114 | + } | |
| 115 | + | |
| 116 | + /** | |
| 117 | + * 取最后一个值 | |
| 118 | + * @return | |
| 119 | + */ | |
| 120 | + public T getTail(){ | |
| 121 | + return elementData[tail] == null?null:(T)elementData[tail]; | |
| 122 | + } | |
| 123 | +} | |
| 0 | 124 | \ No newline at end of file | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/utils/GeoUtils.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival.utils; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.GpsEntity; | |
| 4 | +import com.bsth.data.gpsdata.arrival.GeoCacheData; | |
| 5 | +import com.bsth.data.gpsdata.arrival.entity.StationRoute; | |
| 6 | +import com.vividsolutions.jts.geom.Coordinate; | |
| 7 | +import com.vividsolutions.jts.geom.GeometryFactory; | |
| 8 | +import com.vividsolutions.jts.geom.Point; | |
| 9 | +import com.vividsolutions.jts.geom.Polygon; | |
| 10 | + | |
| 11 | +import java.util.List; | |
| 12 | +import java.util.Map; | |
| 13 | +import java.util.Set; | |
| 14 | + | |
| 15 | +/** | |
| 16 | + * Created by panzhao on 2016/12/23. | |
| 17 | + */ | |
| 18 | +public class GeoUtils { | |
| 19 | + | |
| 20 | + private final static double EARTHRADIUS = 6378137; | |
| 21 | + | |
| 22 | + private static GeometryFactory geometryFactory = new GeometryFactory(); | |
| 23 | + /** | |
| 24 | + * gps是否在路由上的某个站内 | |
| 25 | + * | |
| 26 | + * @param gps | |
| 27 | + * @param srs | |
| 28 | + * @return | |
| 29 | + */ | |
| 30 | + public static StationRoute gpsInStation(GpsEntity gps, List<StationRoute> srs) { | |
| 31 | + Point point = geometryFactory.createPoint(new Coordinate(gps.getLat(), gps.getLon())); | |
| 32 | + double min = -1, distance, distance2; | |
| 33 | + StationRoute stationRoute = null; | |
| 34 | + | |
| 35 | + for (StationRoute sr : srs) { | |
| 36 | + if (sr.getPolygon() == null) { | |
| 37 | + //圆形 | |
| 38 | + distance = getDistance(sr.getPoint(), point);//sr.getPoint().distance(point); | |
| 39 | + | |
| 40 | + if (distance > sr.getRadius()) | |
| 41 | + continue; | |
| 42 | + | |
| 43 | + if (min > distance || min == -1) { | |
| 44 | + min = distance; | |
| 45 | + stationRoute = sr; | |
| 46 | + } | |
| 47 | + } else { | |
| 48 | + //多边形 | |
| 49 | + if (sr.getPolygon().contains(point)) { | |
| 50 | + stationRoute = sr; | |
| 51 | + break; | |
| 52 | + } | |
| 53 | + } | |
| 54 | + } | |
| 55 | + return stationRoute; | |
| 56 | + } | |
| 57 | + | |
| 58 | + public static double getDistance(Point p1, Point p2) { | |
| 59 | + double lng1 = getLoop(p1.getY(), -180, 180), lat1 = getRange( | |
| 60 | + p1.getX(), -74, 74); | |
| 61 | + double lng2 = getLoop(p2.getY(), -180, 180), lat2 = getRange( | |
| 62 | + p2.getX(), -74, 74); | |
| 63 | + | |
| 64 | + double x1, x2, y1, y2; | |
| 65 | + x1 = degreeToRad(lng1); | |
| 66 | + y1 = degreeToRad(lat1); | |
| 67 | + x2 = degreeToRad(lng2); | |
| 68 | + y2 = degreeToRad(lat2); | |
| 69 | + return EARTHRADIUS | |
| 70 | + * Math.acos((Math.sin(y1) * Math.sin(y2) + Math.cos(y1) | |
| 71 | + * Math.cos(y2) * Math.cos(x2 - x1))); | |
| 72 | + } | |
| 73 | + | |
| 74 | + private static double getLoop(double v, double a, double b) { | |
| 75 | + while (v > b) { | |
| 76 | + v -= b - a; | |
| 77 | + } | |
| 78 | + while (v < a) { | |
| 79 | + v += b - a; | |
| 80 | + } | |
| 81 | + return v; | |
| 82 | + } | |
| 83 | + | |
| 84 | + private static double getRange(double v, double a, double b) { | |
| 85 | + v = Math.min(Math.max(v, a), b); | |
| 86 | + return v; | |
| 87 | + } | |
| 88 | + | |
| 89 | + private static double degreeToRad(double degree) { | |
| 90 | + return Math.PI * degree / 180; | |
| 91 | + } | |
| 92 | + | |
| 93 | + | |
| 94 | + /** | |
| 95 | + * gps 是否在某个停车场内 | |
| 96 | + * @param gps | |
| 97 | + * @return | |
| 98 | + */ | |
| 99 | + public static String gpsInCarpark(GpsEntity gps){ | |
| 100 | + Point point = geometryFactory.createPoint(new Coordinate(gps.getLat(), gps.getLon())); | |
| 101 | + | |
| 102 | + Map<String, Polygon> carparkMap = GeoCacheData.tccMap; | |
| 103 | + Set<String> codes = carparkMap.keySet(); | |
| 104 | + Polygon polygon; | |
| 105 | + for(String code : codes){ | |
| 106 | + polygon = carparkMap.get(code); | |
| 107 | + if(point.within(polygon)){ | |
| 108 | + return code; | |
| 109 | + } | |
| 110 | + } | |
| 111 | + return null; | |
| 112 | + } | |
| 113 | + | |
| 114 | + /** | |
| 115 | + * 是否是有效的连续点 | |
| 116 | + * @param prevGps | |
| 117 | + * @param gps | |
| 118 | + * @return | |
| 119 | + */ | |
| 120 | + public static boolean overdue(GpsEntity prevGps, GpsEntity gps) { | |
| 121 | + return gps.getTimestamp() - prevGps.getTimestamp() < 120000; | |
| 122 | + } | |
| 123 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/utils/StationRouteComp.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.arrival.utils; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.arrival.entity.StationRoute; | |
| 4 | + | |
| 5 | +import java.util.Comparator; | |
| 6 | + | |
| 7 | +/** | |
| 8 | + * Created by panzhao on 2016/12/24. | |
| 9 | + */ | |
| 10 | +public class StationRouteComp implements Comparator<StationRoute>{ | |
| 11 | + @Override | |
| 12 | + public int compare(StationRoute s1, StationRoute s2) { | |
| 13 | + return s1.getRouteSort() - s2.getRouteSort(); | |
| 14 | + } | |
| 15 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/recovery/GpsDataRecovery.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.recovery; | |
| 2 | + | |
| 3 | +import com.bsth.data.BasicData; | |
| 4 | +import com.bsth.data.gpsdata.GpsEntity; | |
| 5 | +import com.bsth.data.gpsdata.arrival.GeoCacheData; | |
| 6 | +import com.bsth.data.gpsdata.arrival.handlers.*; | |
| 7 | +import com.bsth.data.gpsdata.arrival.utils.CircleQueue; | |
| 8 | +import com.bsth.util.db.DBUtils_MS; | |
| 9 | +import com.google.common.collect.ArrayListMultimap; | |
| 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.jdbc.core.JdbcTemplate; | |
| 16 | +import org.springframework.jdbc.core.RowMapper; | |
| 17 | +import org.springframework.stereotype.Component; | |
| 18 | + | |
| 19 | +import java.sql.ResultSet; | |
| 20 | +import java.sql.SQLException; | |
| 21 | +import java.util.*; | |
| 22 | +import java.util.concurrent.CountDownLatch; | |
| 23 | +import java.util.concurrent.ExecutorService; | |
| 24 | +import java.util.concurrent.Executors; | |
| 25 | + | |
| 26 | +/** | |
| 27 | + * gps数据恢复 | |
| 28 | + * Created by panzhao on 2016/12/24. | |
| 29 | + */ | |
| 30 | +@Component | |
| 31 | +public class GpsDataRecovery implements ApplicationContextAware{ | |
| 32 | + | |
| 33 | + static Logger logger = LoggerFactory.getLogger(GpsDataRecovery.class); | |
| 34 | + | |
| 35 | + public static boolean run; | |
| 36 | + | |
| 37 | + static ExecutorService threadPool = Executors.newFixedThreadPool(10); | |
| 38 | + | |
| 39 | + static OfflineSignalHandle offlineSignalHandle; | |
| 40 | + static CorrectSignalHandle correctSignalHandle; | |
| 41 | + static StationInsideHandle stationInsideHandle; | |
| 42 | + static InOutStationSignalHandle inOutStationSignalHandle; | |
| 43 | + static ReverseSignalHandle reverseSignalHandle; | |
| 44 | + | |
| 45 | + public void recovery() { | |
| 46 | + List<GpsEntity> list = loadData(); | |
| 47 | + | |
| 48 | + //按车辆分组数据 | |
| 49 | + ArrayListMultimap<String, GpsEntity> listMap = ArrayListMultimap.create(); | |
| 50 | + for (GpsEntity gps : list) { | |
| 51 | + if(gps.getNbbm() != null) | |
| 52 | + listMap.put(gps.getNbbm(), gps); | |
| 53 | + } | |
| 54 | + | |
| 55 | + | |
| 56 | + Set<String> keys = listMap.keySet(); | |
| 57 | + | |
| 58 | + CountDownLatch count = new CountDownLatch(keys.size()); | |
| 59 | + GpsComp comp = new GpsComp(); | |
| 60 | + for (String nbbm : keys) { | |
| 61 | + Collections.sort(listMap.get(nbbm), comp); | |
| 62 | + threadPool.execute(new RecoveryThread(listMap.get(nbbm), count)); | |
| 63 | + } | |
| 64 | + | |
| 65 | + try { | |
| 66 | + count.await(); | |
| 67 | + run = false; | |
| 68 | + logger.info("数据恢复完成...."); | |
| 69 | + } catch (InterruptedException e) { | |
| 70 | + logger.error("", e); | |
| 71 | + } | |
| 72 | + } | |
| 73 | + | |
| 74 | + /** | |
| 75 | + * 加载当天的gps数据 | |
| 76 | + * | |
| 77 | + * @return | |
| 78 | + */ | |
| 79 | + public List<GpsEntity> loadData() { | |
| 80 | + Calendar calendar = Calendar.getInstance(); | |
| 81 | + int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR); | |
| 82 | + | |
| 83 | + String sql = "select DEVICE_ID,LAT,LON,TS,SPEED_GPS,LINE_ID,SERVICE_STATE from bsth_c_gps_info where days_year=" + dayOfYear; | |
| 84 | + JdbcTemplate jdbcTemplate = new JdbcTemplate(DBUtils_MS.getDataSource()); | |
| 85 | + | |
| 86 | + List<GpsEntity> list = | |
| 87 | + jdbcTemplate.query(sql, new RowMapper<GpsEntity>() { | |
| 88 | + @Override | |
| 89 | + public GpsEntity mapRow(ResultSet rs, int rowNum) throws SQLException { | |
| 90 | + GpsEntity gps = new GpsEntity(); | |
| 91 | + | |
| 92 | + gps.setDeviceId(rs.getString("DEVICE_ID")); | |
| 93 | + gps.setNbbm(BasicData.deviceId2NbbmMap.get(gps.getDeviceId())); | |
| 94 | + gps.setSpeed(rs.getFloat("SPEED_GPS")); | |
| 95 | + gps.setLat(rs.getFloat("LAT")); | |
| 96 | + gps.setLon(rs.getFloat("LON")); | |
| 97 | + gps.setLineId(rs.getString("LINE_ID")); | |
| 98 | + gps.setTimestamp(rs.getLong("TS")); | |
| 99 | + gps.setUpDown(getUpOrDown(rs.getLong("SERVICE_STATE"))); | |
| 100 | + return gps; | |
| 101 | + } | |
| 102 | + }); | |
| 103 | + return list; | |
| 104 | + } | |
| 105 | + | |
| 106 | + /** | |
| 107 | + * 王通 2016/6/29 9:23:24 获取车辆线路上下行 | |
| 108 | + * | |
| 109 | + * @return -1无效 0上行 1下行 | |
| 110 | + */ | |
| 111 | + public static int getUpOrDown(long serviceState) { | |
| 112 | + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000 | |
| 113 | + || (serviceState & 0x01000000) == 0x01000000 || (serviceState & 0x08000000) == 0x08000000) | |
| 114 | + return -1; | |
| 115 | + return (((serviceState & 0x10000000) == 0x10000000) ? 1 : 0); | |
| 116 | + } | |
| 117 | + | |
| 118 | + @Override | |
| 119 | + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { | |
| 120 | + offlineSignalHandle = applicationContext.getBean(OfflineSignalHandle.class); | |
| 121 | + correctSignalHandle = applicationContext.getBean(CorrectSignalHandle.class); | |
| 122 | + stationInsideHandle = applicationContext.getBean(StationInsideHandle.class); | |
| 123 | + inOutStationSignalHandle = applicationContext.getBean(InOutStationSignalHandle.class); | |
| 124 | + reverseSignalHandle = applicationContext.getBean(ReverseSignalHandle.class); | |
| 125 | + } | |
| 126 | + | |
| 127 | + public static class GpsComp implements Comparator<GpsEntity>{ | |
| 128 | + | |
| 129 | + @Override | |
| 130 | + public int compare(GpsEntity g1, GpsEntity g2) { | |
| 131 | + return g1.getTimestamp().compareTo(g2.getTimestamp()); | |
| 132 | + } | |
| 133 | + } | |
| 134 | + | |
| 135 | + public static class RecoveryThread implements Runnable{ | |
| 136 | + List<GpsEntity> list; | |
| 137 | + CountDownLatch count; | |
| 138 | + | |
| 139 | + RecoveryThread(List<GpsEntity> list, CountDownLatch count){ | |
| 140 | + this.list = list; | |
| 141 | + this.count = count; | |
| 142 | + } | |
| 143 | + @Override | |
| 144 | + public void run() { | |
| 145 | + try { | |
| 146 | + //循环gps恢复数据 | |
| 147 | + CircleQueue<GpsEntity> prevs; | |
| 148 | + | |
| 149 | + for(GpsEntity gps : list){ | |
| 150 | + prevs = GeoCacheData.getGps(gps.getNbbm()); | |
| 151 | + //掉线处理 | |
| 152 | + offlineSignalHandle.handle(gps, prevs); | |
| 153 | + //状态处理 | |
| 154 | + if(!correctSignalHandle.handle(gps, prevs)) | |
| 155 | + continue; | |
| 156 | + //场,站内外判断 | |
| 157 | + stationInsideHandle.handle(gps, prevs); | |
| 158 | + //反向处理 | |
| 159 | + reverseSignalHandle.handle(gps, prevs); | |
| 160 | + //进出站动作处理 | |
| 161 | + inOutStationSignalHandle.handle(gps, prevs); | |
| 162 | + GeoCacheData.putGps(gps); | |
| 163 | + } | |
| 164 | + }catch (Exception e){ | |
| 165 | + logger.error("", e); | |
| 166 | + } | |
| 167 | + finally { | |
| 168 | + count.countDown(); | |
| 169 | + } | |
| 170 | + } | |
| 171 | + } | |
| 172 | +} | |
| 0 | 173 | \ No newline at end of file | ... | ... |
src/main/java/com/bsth/data/pilot80/PilotReport.java
| 1 | 1 | package com.bsth.data.pilot80; |
| 2 | 2 | |
| 3 | -import java.util.ArrayList; | |
| 4 | -import java.util.Collection; | |
| 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 | 3 | import com.bsth.data.BasicData; |
| 13 | 4 | import com.bsth.data.LineConfigData; |
| 14 | 5 | import com.bsth.data.gpsdata.GpsEntity; |
| ... | ... | @@ -23,6 +14,14 @@ import com.bsth.repository.directive.D80Repository; |
| 23 | 14 | import com.bsth.service.directive.DirectiveService; |
| 24 | 15 | import com.bsth.websocket.handler.SendUtils; |
| 25 | 16 | import com.google.common.collect.ArrayListMultimap; |
| 17 | +import org.slf4j.Logger; | |
| 18 | +import org.slf4j.LoggerFactory; | |
| 19 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 20 | +import org.springframework.stereotype.Component; | |
| 21 | + | |
| 22 | +import java.util.ArrayList; | |
| 23 | +import java.util.Collection; | |
| 24 | +import java.util.List; | |
| 26 | 25 | |
| 27 | 26 | /** |
| 28 | 27 | * |
| ... | ... | @@ -180,7 +179,7 @@ public class PilotReport { |
| 180 | 179 | return; |
| 181 | 180 | |
| 182 | 181 | LineConfig conf = lineConfigData.get(sch.getXlBm()); |
| 183 | - if(conf.getInConfig() == 1){ | |
| 182 | + if(conf.getOutConfig() == 1){ | |
| 184 | 183 | //为相关班次写入进场时间 |
| 185 | 184 | sch.setZdsjActualAll(d80.getTimestamp()); |
| 186 | 185 | ... | ... |
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
| ... | ... | @@ -3,9 +3,11 @@ package com.bsth.data.schedule; |
| 3 | 3 | import com.alibaba.fastjson.JSON; |
| 4 | 4 | import com.alibaba.fastjson.JSONArray; |
| 5 | 5 | import com.bsth.Application; |
| 6 | +import com.bsth.data.BasicData; | |
| 6 | 7 | import com.bsth.data.LineConfigData; |
| 7 | 8 | import com.bsth.data.directive.FirstScheduleCheckThread; |
| 8 | 9 | import com.bsth.data.gpsdata.GpsRealData; |
| 10 | +import com.bsth.data.gpsdata.recovery.GpsDataRecovery; | |
| 9 | 11 | import com.bsth.data.schedule.thread.ScheduleLateThread; |
| 10 | 12 | import com.bsth.data.schedule.thread.SchedulePstThread; |
| 11 | 13 | import com.bsth.data.schedule.thread.ScheduleRefreshThread; |
| ... | ... | @@ -35,484 +37,538 @@ import java.util.*; |
| 35 | 37 | import java.util.concurrent.TimeUnit; |
| 36 | 38 | |
| 37 | 39 | /** |
| 38 | - * | |
| 40 | + * @author PanZhao | |
| 39 | 41 | * @ClassName: DayOfSchedule |
| 40 | 42 | * @Description: TODO(当日实际排班) |
| 41 | - * @author PanZhao | |
| 42 | 43 | * @date 2016年8月15日 上午10:16:12 |
| 43 | - * | |
| 44 | 44 | */ |
| 45 | 45 | @Component |
| 46 | 46 | public class DayOfSchedule implements CommandLineRunner { |
| 47 | 47 | |
| 48 | - Logger logger = LoggerFactory.getLogger(this.getClass()); | |
| 49 | - | |
| 50 | - // 按车辆分组的班次数据 | |
| 51 | - private static ArrayListMultimap<String, ScheduleRealInfo> nbbmScheduleMap; | |
| 52 | - | |
| 53 | - // 班次主键映射 | |
| 54 | - private static Map<Long, ScheduleRealInfo> id2SchedulMap; | |
| 55 | - | |
| 56 | - // 车辆和排班起终点站对照(包括进出的停车场,区间起终点) | |
| 57 | - private static TreeMultimap<String, String> nbbm2SEStationMap; | |
| 58 | - | |
| 59 | - //车辆 ——> 当前执行班次 | |
| 60 | - private static Map<String, ScheduleRealInfo> carExecutePlanMap; | |
| 61 | - | |
| 62 | - // 持久化缓冲区 | |
| 63 | - public static LinkedList<ScheduleRealInfo> pstBuffer; | |
| 64 | - | |
| 65 | - // 排序器 | |
| 66 | - private static ScheduleComparator.FCSJ schFCSJComparator; | |
| 67 | - | |
| 68 | - @Autowired | |
| 69 | - LineConfigData lineConfigData; | |
| 70 | - | |
| 71 | - @Autowired | |
| 72 | - ScheduleRealInfoRepository schRepository; | |
| 73 | - | |
| 74 | - @Autowired | |
| 75 | - SchedulePlanInfoService schPlanService; | |
| 76 | - | |
| 77 | - @Autowired | |
| 78 | - SchAttrCalculator schAttrCalculator; | |
| 79 | - | |
| 80 | - @Autowired | |
| 81 | - SendUtils sendUtils; | |
| 82 | - | |
| 83 | - @Autowired | |
| 84 | - GpsRealData gpsRealData; | |
| 85 | - | |
| 86 | - /** 线路当前使用的排班的日期 */ | |
| 87 | - public static Map<String, String> currSchDateMap; | |
| 88 | - | |
| 89 | - static { | |
| 90 | - nbbmScheduleMap = ArrayListMultimap.create(); | |
| 91 | - id2SchedulMap = new HashMap<>(); | |
| 92 | - pstBuffer = new LinkedList<>(); | |
| 93 | - schFCSJComparator = new ScheduleComparator.FCSJ(); | |
| 94 | - currSchDateMap = new HashMap<>(); | |
| 95 | - nbbm2SEStationMap = TreeMultimap.create(); | |
| 96 | - carExecutePlanMap = new HashMap<>(); | |
| 97 | - } | |
| 98 | - | |
| 99 | - @Autowired | |
| 100 | - ScheduleRefreshThread scheduleRefreshThread; | |
| 101 | - | |
| 102 | - @Autowired | |
| 103 | - SchedulePstThread schedulePstThread; | |
| 104 | - | |
| 105 | - @Autowired | |
| 106 | - FirstScheduleCheckThread firstScheduleCheckThread; | |
| 107 | - | |
| 108 | - @Autowired | |
| 109 | - ScheduleLateThread scheduleLateThread; | |
| 110 | - | |
| 111 | - @Autowired | |
| 112 | - SubmitToTrafficManage submitToTrafficManage; | |
| 113 | - | |
| 114 | - private static DateTimeFormatter fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd") | |
| 115 | - ,fmtHHmm = DateTimeFormat.forPattern("HH:mm"); | |
| 116 | - | |
| 117 | - @Override | |
| 118 | - public void run(String... arg0) throws Exception { | |
| 119 | - //翻班线程 | |
| 120 | - Application.mainServices.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS); | |
| 121 | - //入库 | |
| 122 | -// Application.mainServices.scheduleWithFixedDelay(schedulePstThread, 60, 60, TimeUnit.SECONDS); | |
| 123 | - //首班出场指令补发器 | |
| 124 | -// Application.mainServices.scheduleWithFixedDelay(firstScheduleCheckThread, 30, 240, TimeUnit.SECONDS); | |
| 125 | - //班次误点扫描 | |
| 126 | -// Application.mainServices.scheduleWithFixedDelay(scheduleLateThread, 60, 60, TimeUnit.SECONDS); | |
| 127 | - | |
| 128 | - //每天凌晨2点20提交数据到运管处 | |
| 129 | - long diff = (DateUtils.getTimestamp() + 1000*60*140) - System.currentTimeMillis(); | |
| 130 | - if(diff < 0) | |
| 131 | - diff+=(1000*60*60*24); | |
| 132 | - | |
| 133 | - logger.info(diff/1000/60 + "分钟之后提交到运管处"); | |
| 134 | - //Application.mainServices.scheduleWithFixedDelay(submitToTrafficManage, diff / 1000, 60 * 60 * 24, TimeUnit.SECONDS); | |
| 135 | - } | |
| 136 | - | |
| 137 | - public Map<String, String> getCurrSchDate() { | |
| 138 | - return currSchDateMap; | |
| 139 | - } | |
| 140 | - | |
| 141 | - /** | |
| 142 | - * | |
| 143 | - * @Title: calcSchDateB | |
| 144 | - * @Description: TODO(计算线路当前应该使用的排班日期) | |
| 145 | - */ | |
| 146 | - public String calcSchDate(String lineCode) { | |
| 147 | - LineConfig conf = lineConfigData.get(lineCode); | |
| 148 | - long ct = System.currentTimeMillis(); | |
| 149 | - | |
| 150 | - String schDate = fmtyyyyMMdd.print(ct); | |
| 151 | - // 小于当天起始运营时间,则取前一天的排班 | |
| 152 | - if (ct < conf.getCurrStartTime()) | |
| 153 | - schDate = DateUtils.subtractDay(schDate, 1); | |
| 154 | - | |
| 155 | - return schDate; | |
| 156 | - } | |
| 157 | - | |
| 158 | - /** | |
| 159 | - * @Title: reloadSch | |
| 160 | - * @Title: reloadSch | |
| 161 | - * @Description: TODO(重新载入排班) | |
| 162 | - * @param @param | |
| 163 | - * lineCode 线路编码 | |
| 164 | - * @param @param | |
| 165 | - * schDate 班次日期 yyyy-MM-dd | |
| 166 | - * @param @param | |
| 167 | - * forcePlan 强制从计划调度重新抓取 | |
| 168 | - */ | |
| 169 | - public int reloadSch(String lineCode, String schDate, boolean forcePlan) { | |
| 170 | - try { | |
| 171 | - List<ScheduleRealInfo> list; | |
| 172 | - | |
| 173 | - if (forcePlan) | |
| 174 | - removeRealSch(lineCode, schDate); | |
| 175 | - else | |
| 176 | - clearRAMData(lineCode); | |
| 177 | - | |
| 178 | - if (existRealSch(lineCode, schDate)) | |
| 179 | - list = loadRealSch(lineCode, schDate);// 从实际排班表加载 | |
| 180 | - else { | |
| 181 | - list = loadPlanSch(lineCode, schDate);// 从计划排班表加载 | |
| 182 | - // 写入数据库 | |
| 183 | - batchSave(list); | |
| 184 | - } | |
| 185 | - | |
| 186 | - //更新线路和班次日期对照 | |
| 187 | - currSchDateMap.put(lineCode, schDate); | |
| 188 | - //添加到缓存 | |
| 189 | - putAll(list); | |
| 190 | - | |
| 191 | - Set<String> cars = searchAllCars(list); | |
| 192 | - //计算“起点站应到”时间 | |
| 193 | - for(String nbbm : cars) | |
| 194 | - schAttrCalculator.calcQdzTimePlan(nbbmScheduleMap.get(nbbm)); | |
| 195 | - | |
| 196 | - //是否是出站即出场 | |
| 197 | - LineConfig conf = lineConfigData.get(lineCode); | |
| 198 | - if(conf.getOutConfig() == 2){ | |
| 199 | - for(String nbbm : cars) | |
| 200 | - schAttrCalculator.connectOutSchedule(nbbmScheduleMap.get(nbbm)); | |
| 201 | - } | |
| 202 | - | |
| 203 | - // 页面 翻班通知 | |
| 204 | - sendUtils.shiftSchedule(lineCode); | |
| 205 | - } catch (Exception e) { | |
| 206 | - logger.error("", e); | |
| 207 | - return -1; | |
| 208 | - } | |
| 48 | + Logger logger = LoggerFactory.getLogger(this.getClass()); | |
| 209 | 49 | |
| 210 | - return 0; | |
| 211 | - } | |
| 212 | - | |
| 213 | - /** | |
| 214 | - * | |
| 215 | - * @Title: searchAllCars | |
| 216 | - * @Description: TODO(搜索班次集合中的车辆) | |
| 217 | - */ | |
| 218 | - private Set<String> searchAllCars(List<ScheduleRealInfo> list) { | |
| 219 | - Set<String> cars = new HashSet<>(); | |
| 220 | - for(ScheduleRealInfo sch : list) | |
| 221 | - cars.add(sch.getClZbh()); | |
| 222 | - | |
| 223 | - return cars; | |
| 224 | - } | |
| 225 | - | |
| 226 | - private void putAll(List<ScheduleRealInfo> list) { | |
| 227 | - for (ScheduleRealInfo sch : list) | |
| 228 | - put(sch); | |
| 229 | - } | |
| 230 | - | |
| 231 | - /** | |
| 232 | - * @Title: removeRealSch | |
| 233 | - * @Description: TODO(清除实际排班,包括数据库和内存数据) | |
| 234 | - * @param @param | |
| 235 | - * lineCode 线路编码 | |
| 236 | - * @param @param | |
| 237 | - * schDate 班次日期 yyyy-MM-dd | |
| 238 | - */ | |
| 239 | - public void removeRealSch(String lineCode, String schDate) throws Exception { | |
| 240 | - try { | |
| 241 | - // 清理数据库数据 | |
| 242 | - schRepository.deleteByLineCodeAndDate(lineCode + "", schDate); | |
| 243 | - | |
| 244 | - // 清理内存数据 | |
| 245 | - clearRAMData(lineCode + ""); | |
| 246 | - } catch (Exception e) { | |
| 247 | - logger.error("removeRealSch error, " + lineCode + " -" + schDate, e); | |
| 248 | - throw e; | |
| 249 | - } | |
| 250 | - } | |
| 251 | - | |
| 252 | - /** | |
| 253 | - * | |
| 254 | - * @Title: clearRAMData | |
| 255 | - * @Description: TODO(清理内存数据) | |
| 256 | - */ | |
| 257 | - public void clearRAMData(String lineCode) { | |
| 258 | - int count = 0; | |
| 259 | - List<ScheduleRealInfo> remList = new ArrayList<>(); | |
| 260 | - Collection<ScheduleRealInfo> schs = nbbmScheduleMap.values(); | |
| 261 | - for (ScheduleRealInfo sch : schs) { | |
| 262 | - if (sch.getXlBm().equals(lineCode)) | |
| 263 | - remList.add(sch); | |
| 264 | - } | |
| 265 | - | |
| 266 | - for(ScheduleRealInfo sch : remList){ | |
| 267 | - if(null != sch){ | |
| 268 | - nbbmScheduleMap.remove(sch.getClZbh(), sch); | |
| 269 | - id2SchedulMap.remove(sch.getId()); | |
| 270 | - count ++; | |
| 271 | - } | |
| 272 | - } | |
| 273 | - | |
| 274 | - logger.info(lineCode + "排班清理 " + count); | |
| 275 | - } | |
| 276 | - | |
| 277 | - /** | |
| 278 | - * @Title: existRealSch | |
| 279 | - * @Description: TODO(实际排班是否已存在) | |
| 280 | - */ | |
| 281 | - public boolean existRealSch(String lineCode, String schDate) { | |
| 282 | - int count = schRepository.countByLineCodeAndDate(lineCode, schDate); | |
| 283 | - return count > 0; | |
| 284 | - } | |
| 285 | - | |
| 286 | - /** | |
| 287 | - * @Title: loadRealSch | |
| 288 | - * @Description: TODO(从实际排班表加载数据) | |
| 289 | - */ | |
| 290 | - public List<ScheduleRealInfo> loadRealSch(String lineCode, String schDate) { | |
| 291 | - return schRepository.findByLineCodeAndDate(lineCode, schDate); | |
| 292 | - } | |
| 293 | - | |
| 294 | - /** | |
| 295 | - * @Title: loadPlanSch | |
| 296 | - * @Description: TODO(从计划排班表加载数据) | |
| 297 | - */ | |
| 298 | - public List<ScheduleRealInfo> loadPlanSch(String lineCode, String schDate) { | |
| 299 | - logger.info("从计划排班表恢复排班,lineCode: " + lineCode + ", schDate: " + schDate); | |
| 300 | - List<ScheduleRealInfo> realList = new ArrayList<>(); | |
| 301 | - | |
| 302 | - try { | |
| 303 | - Map<String, Object> data = new HashMap<>(); | |
| 304 | - | |
| 305 | - data.put("scheduleDate_eq", fmtyyyyMMdd.parseDateTime(schDate).toDate()); | |
| 306 | - data.put("xlBm_eq", lineCode); | |
| 307 | - | |
| 308 | - // 查询计划排班 | |
| 309 | - List<SchedulePlanInfo> planItr = cleanSchPlanItr(schPlanService.list(data).iterator()); | |
| 310 | - | |
| 311 | - // 转换为实际排班 | |
| 312 | - realList = JSONArray.parseArray(JSON.toJSONString(planItr), ScheduleRealInfo.class); | |
| 313 | - | |
| 314 | - SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); | |
| 315 | - String fcsj; | |
| 316 | - for (ScheduleRealInfo sch : realList) { | |
| 317 | - sch.setScheduleDateStr(fmtyyyyMMdd.print(sch.getScheduleDate().getTime())); | |
| 318 | - sch.setRealExecDate(sch.getScheduleDateStr()); | |
| 319 | - | |
| 320 | - if(StringUtils.isEmpty(sch.getFcsj())) | |
| 321 | - sch.setFcsj("00:00"); | |
| 322 | - | |
| 323 | - fcsj=sch.getFcsj().trim(); | |
| 324 | - //处理一下发车时间格式没有:号的问题 | |
| 325 | - if(fcsj.indexOf(":") == -1 && fcsj.length() >= 4){ | |
| 326 | - sch.setFcsj(fcsj.substring(0, 2) + ":" + fcsj.substring(2, 4)); | |
| 327 | - } | |
| 328 | - | |
| 329 | - try { | |
| 330 | - sdf.parse(sch.getFcsj()); | |
| 331 | - } catch (ParseException e) { | |
| 332 | - //发车时间仍然校验不过的,直接写成00:00 | |
| 333 | - sch.setFcsj("00:00"); | |
| 334 | - } | |
| 335 | - sch.setDfsj(sch.getFcsj()); | |
| 336 | - | |
| 337 | - // 计划终点时间 | |
| 338 | - if (sch.getBcsj() != null) { | |
| 339 | - sch.setZdsj(fmtHHmm.print(fmtHHmm.parseMillis(sch.getFcsj()) + (sch.getBcsj() * 60 * 1000))); | |
| 340 | - sch.setLate(false); | |
| 341 | - } | |
| 342 | - //计划里程为0,设置NULL | |
| 343 | - if(sch.getJhlc() != null && sch.getJhlc() == 0) | |
| 344 | - sch.setJhlc(null); | |
| 345 | - } | |
| 346 | - } catch (Exception e) { | |
| 347 | - logger.error("", e); | |
| 348 | - } | |
| 349 | - return realList; | |
| 350 | - } | |
| 351 | - | |
| 352 | - /** | |
| 353 | - * @Title: batchSave | |
| 354 | - * @Description: TODO(批量入库) | |
| 355 | - */ | |
| 356 | - private void batchSave(List<ScheduleRealInfo> list) { | |
| 357 | - // 查询数据库最大ID | |
| 358 | - Long id = schRepository.getMaxId(); | |
| 359 | - if (null == id) | |
| 360 | - id = 0L; | |
| 361 | - id++; | |
| 362 | - | |
| 363 | - SimpleDateFormat sdfyyyyMMdd = new SimpleDateFormat("yyyy-MM-dd"); | |
| 364 | - for (ScheduleRealInfo item : list) { | |
| 365 | - item.setSpId(item.getId());// 保留原始的计划ID | |
| 366 | - item.setId(id++);// 设置ID | |
| 367 | - item.setScheduleDateStr(sdfyyyyMMdd.format(item.getScheduleDate())); | |
| 368 | - } | |
| 50 | + // 按车辆分组的班次数据 | |
| 51 | + private static ArrayListMultimap<String, ScheduleRealInfo> nbbmScheduleMap; | |
| 369 | 52 | |
| 370 | - // 入库 | |
| 371 | - new BatchSaveUtils<ScheduleRealInfo>().saveList(list, ScheduleRealInfo.class); | |
| 372 | - } | |
| 53 | + // 班次主键映射 | |
| 54 | + private static Map<Long, ScheduleRealInfo> id2SchedulMap; | |
| 373 | 55 | |
| 374 | - private List<SchedulePlanInfo> cleanSchPlanItr(Iterator<SchedulePlanInfo> itrab) { | |
| 375 | - List<SchedulePlanInfo> list = new ArrayList<>(); | |
| 56 | + // 车辆和排班起终点站对照(包括进出的停车场,区间起终点) | |
| 57 | + private static TreeMultimap<String, String> nbbm2SEStationMap; | |
| 376 | 58 | |
| 377 | - SchedulePlanInfo sp; | |
| 378 | - while (itrab.hasNext()) { | |
| 379 | - sp = itrab.next(); | |
| 380 | - sp.setSchedulePlan(null); | |
| 381 | - list.add(sp); | |
| 382 | - } | |
| 383 | - return list; | |
| 384 | - } | |
| 385 | - | |
| 386 | - /** | |
| 387 | - * | |
| 388 | - * @Title: findByLineCode | |
| 389 | - * @Description: TODO(lineCode 获取班次) | |
| 390 | - */ | |
| 391 | - public List<ScheduleRealInfo> findByLineCode(String lineCode) { | |
| 392 | - List<ScheduleRealInfo> rs = new ArrayList<>(); | |
| 59 | + //车辆 ——> 当前执行班次 | |
| 60 | + private static Map<String, ScheduleRealInfo> carExecutePlanMap; | |
| 393 | 61 | |
| 394 | - Collection<ScheduleRealInfo> schs = nbbmScheduleMap.values(); | |
| 395 | - for (ScheduleRealInfo sch : schs) { | |
| 396 | - if (sch.getXlBm().equals(lineCode)) | |
| 397 | - rs.add(sch); | |
| 398 | - } | |
| 399 | - return rs; | |
| 400 | - } | |
| 401 | - | |
| 402 | - /** | |
| 403 | - * | |
| 404 | - * @Title: findCarByLineCode | |
| 405 | - * @Description: TODO(线路下运营的车辆) | |
| 406 | - */ | |
| 407 | - public Set<String> findCarByLineCode(String lineCode){ | |
| 408 | - Set<String> rs = new HashSet<>(); | |
| 409 | - | |
| 410 | - Collection<ScheduleRealInfo> schs = nbbmScheduleMap.values(); | |
| 411 | - for (ScheduleRealInfo sch : schs) { | |
| 412 | - if (sch.getXlBm().equals(lineCode)) | |
| 413 | - rs.add(sch.getClZbh()); | |
| 414 | - } | |
| 415 | - | |
| 416 | - return rs; | |
| 417 | - } | |
| 418 | - | |
| 419 | - public List<ScheduleRealInfo> findByNbbm(String nbbm) { | |
| 420 | - return nbbmScheduleMap.get(nbbm); | |
| 421 | - } | |
| 422 | - | |
| 423 | - /** | |
| 424 | - * | |
| 425 | - * @Title: findByLineAndUpDown | |
| 426 | - * @Description: TODO(lineCode 和走向获取班次) | |
| 427 | - */ | |
| 428 | - public List<ScheduleRealInfo> findByLineAndUpDown(String lineCode, Integer upDown) { | |
| 429 | - List<ScheduleRealInfo> list = findByLineCode(lineCode), rs = new ArrayList<>(); | |
| 430 | - | |
| 431 | - for (ScheduleRealInfo sch : list) { | |
| 432 | - if (sch.getXlDir().equals(upDown + "")) | |
| 433 | - rs.add(sch); | |
| 434 | - } | |
| 435 | - return rs; | |
| 436 | - } | |
| 62 | + // 持久化缓冲区 | |
| 63 | + public static LinkedList<ScheduleRealInfo> pstBuffer; | |
| 437 | 64 | |
| 438 | - public ScheduleRealInfo get(long id) { | |
| 439 | - return id2SchedulMap.get(id); | |
| 440 | - } | |
| 65 | + // 排序器 | |
| 66 | + private static ScheduleComparator.FCSJ schFCSJComparator; | |
| 441 | 67 | |
| 442 | - public Set<String> getSEStationList(String nbbm) { | |
| 443 | - return nbbm2SEStationMap.get(nbbm); | |
| 444 | - } | |
| 68 | + @Autowired | |
| 69 | + LineConfigData lineConfigData; | |
| 445 | 70 | |
| 446 | - /** | |
| 447 | - * | |
| 448 | - * @Title: next | |
| 449 | - * @Description: TODO(下一个班次) | |
| 450 | - */ | |
| 451 | - public ScheduleRealInfo next(ScheduleRealInfo sch) { | |
| 71 | + @Autowired | |
| 72 | + ScheduleRealInfoRepository schRepository; | |
| 73 | + | |
| 74 | + @Autowired | |
| 75 | + SchedulePlanInfoService schPlanService; | |
| 76 | + | |
| 77 | + @Autowired | |
| 78 | + SchAttrCalculator schAttrCalculator; | |
| 79 | + | |
| 80 | + @Autowired | |
| 81 | + SendUtils sendUtils; | |
| 82 | + | |
| 83 | + @Autowired | |
| 84 | + GpsRealData gpsRealData; | |
| 85 | + | |
| 86 | + /** | |
| 87 | + * 线路当前使用的排班的日期 | |
| 88 | + */ | |
| 89 | + public static Map<String, String> currSchDateMap; | |
| 90 | + | |
| 91 | + static { | |
| 92 | + nbbmScheduleMap = ArrayListMultimap.create(); | |
| 93 | + id2SchedulMap = new HashMap<>(); | |
| 94 | + pstBuffer = new LinkedList<>(); | |
| 95 | + schFCSJComparator = new ScheduleComparator.FCSJ(); | |
| 96 | + currSchDateMap = new HashMap<>(); | |
| 97 | + nbbm2SEStationMap = TreeMultimap.create(); | |
| 98 | + carExecutePlanMap = new HashMap<>(); | |
| 99 | + } | |
| 100 | + | |
| 101 | + @Autowired | |
| 102 | + ScheduleRefreshThread scheduleRefreshThread; | |
| 103 | + | |
| 104 | + @Autowired | |
| 105 | + SchedulePstThread schedulePstThread; | |
| 106 | + | |
| 107 | + @Autowired | |
| 108 | + FirstScheduleCheckThread firstScheduleCheckThread; | |
| 109 | + | |
| 110 | + @Autowired | |
| 111 | + ScheduleLateThread scheduleLateThread; | |
| 112 | + | |
| 113 | + @Autowired | |
| 114 | + SubmitToTrafficManage submitToTrafficManage; | |
| 115 | + | |
| 116 | + @Autowired | |
| 117 | + LineConfigData lineConfigs; | |
| 118 | + | |
| 119 | + @Autowired | |
| 120 | + BasicData.BasicDataLoader dataLoader; | |
| 121 | + | |
| 122 | + @Autowired | |
| 123 | + GpsDataRecovery gpsDataRecovery; | |
| 124 | + | |
| 125 | + private static DateTimeFormatter fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd"), fmtHHmm = DateTimeFormat.forPattern("HH:mm"); | |
| 126 | + | |
| 127 | + @Override | |
| 128 | + public void run(String... arg0) throws Exception { | |
| 129 | + //加载基础数据 | |
| 130 | + dataLoader.loadAllData(); | |
| 131 | + //从数据库恢复排班 | |
| 132 | + dataRecovery(); | |
| 133 | + | |
| 134 | + //翻班线程 | |
| 135 | +// Application.mainServices.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS); | |
| 136 | + //入库 | |
| 137 | +// Application.mainServices.scheduleWithFixedDelay(schedulePstThread, 60, 60, TimeUnit.SECONDS); | |
| 138 | + //首班出场指令补发器 | |
| 139 | +// Application.mainServices.scheduleWithFixedDelay(firstScheduleCheckThread, 30, 240, TimeUnit.SECONDS); | |
| 140 | + //班次误点扫描 | |
| 141 | + Application.mainServices.scheduleWithFixedDelay(scheduleLateThread, 60, 60, TimeUnit.SECONDS); | |
| 142 | + | |
| 143 | + //每天凌晨2点20提交数据到运管处 | |
| 144 | + long diff = (DateUtils.getTimestamp() + 1000 * 60 * 140) - System.currentTimeMillis(); | |
| 145 | + if (diff < 0) | |
| 146 | + diff += (1000 * 60 * 60 * 24); | |
| 147 | + | |
| 148 | + logger.info(diff / 1000 / 60 + "分钟之后提交到运管处"); | |
| 149 | + //Application.mainServices.scheduleWithFixedDelay(submitToTrafficManage, diff / 1000, 60 * 60 * 24, TimeUnit.SECONDS); | |
| 150 | + } | |
| 151 | + | |
| 152 | + //数据恢复 | |
| 153 | + private void dataRecovery() { | |
| 154 | + GpsDataRecovery.run = true; | |
| 155 | + | |
| 156 | + Collection<LineConfig> confs = lineConfigs.getAll(); | |
| 157 | + String lineCode, currSchDate; | |
| 158 | + for (LineConfig conf : confs) { | |
| 159 | + lineCode = conf.getLine().getLineCode(); | |
| 160 | + currSchDate = calcSchDate(lineCode); | |
| 161 | + //加载班次数据 | |
| 162 | + reloadSch(lineCode, currSchDate, false); | |
| 163 | + } | |
| 164 | + | |
| 165 | + //恢复gps数据 | |
| 166 | + gpsDataRecovery.recovery(); | |
| 167 | + } | |
| 168 | + | |
| 169 | + public Map<String, String> getCurrSchDate() { | |
| 170 | + return currSchDateMap; | |
| 171 | + } | |
| 172 | + | |
| 173 | + /** | |
| 174 | + * @Title: calcSchDateB | |
| 175 | + * @Description: TODO(计算线路当前应该使用的排班日期) | |
| 176 | + */ | |
| 177 | + public String calcSchDate(String lineCode) { | |
| 178 | + LineConfig conf = lineConfigData.get(lineCode); | |
| 179 | + long ct = System.currentTimeMillis(); | |
| 180 | + | |
| 181 | + String schDate = fmtyyyyMMdd.print(ct); | |
| 182 | + // 小于当天起始运营时间,则取前一天的排班 | |
| 183 | + if (ct < conf.getCurrStartTime()) | |
| 184 | + schDate = DateUtils.subtractDay(schDate, 1); | |
| 185 | + | |
| 186 | + return schDate; | |
| 187 | + } | |
| 188 | + | |
| 189 | + /** | |
| 190 | + * @param @param lineCode 线路编码 | |
| 191 | + * @param @param schDate 班次日期 yyyy-MM-dd | |
| 192 | + * @param @param forcePlan 强制从计划调度重新抓取 | |
| 193 | + * @Title: reloadSch | |
| 194 | + * @Title: reloadSch | |
| 195 | + * @Description: TODO(重新载入排班) | |
| 196 | + */ | |
| 197 | + public int reloadSch(String lineCode, String schDate, boolean forcePlan) { | |
| 198 | + try { | |
| 199 | + List<ScheduleRealInfo> list; | |
| 200 | + | |
| 201 | + if (forcePlan) | |
| 202 | + removeRealSch(lineCode, schDate); | |
| 203 | + else | |
| 204 | + clearRAMData(lineCode); | |
| 205 | + | |
| 206 | + if (existRealSch(lineCode, schDate)) | |
| 207 | + list = loadRealSch(lineCode, schDate);// 从实际排班表加载 | |
| 208 | + else { | |
| 209 | + list = loadPlanSch(lineCode, schDate);// 从计划排班表加载 | |
| 210 | + // 写入数据库 | |
| 211 | + batchSave(list); | |
| 212 | + } | |
| 213 | + | |
| 214 | + //更新线路和班次日期对照 | |
| 215 | + currSchDateMap.put(lineCode, schDate); | |
| 216 | + //添加到缓存 | |
| 217 | + putAll(list); | |
| 218 | + | |
| 219 | + Set<String> cars = searchAllCars(list); | |
| 220 | + for (String nbbm : cars) { | |
| 221 | + //计算“起点站应到”时间 | |
| 222 | + schAttrCalculator.calcQdzTimePlan(nbbmScheduleMap.get(nbbm)); | |
| 223 | + //车辆 ——> 要执行的班次对照 | |
| 224 | + reCalcExecPlan(nbbm); | |
| 225 | + } | |
| 226 | + | |
| 227 | + //是否是出站即出场 | |
| 228 | + LineConfig conf = lineConfigData.get(lineCode); | |
| 229 | + if (conf.getOutConfig() == 2) { | |
| 230 | + for (String nbbm : cars) | |
| 231 | + schAttrCalculator.connectOutSchedule(nbbmScheduleMap.get(nbbm)); | |
| 232 | + } | |
| 233 | + | |
| 234 | + // 页面 翻班通知 | |
| 235 | + sendUtils.shiftSchedule(lineCode); | |
| 236 | + } catch (Exception e) { | |
| 237 | + logger.error("", e); | |
| 238 | + return -1; | |
| 239 | + } | |
| 240 | + | |
| 241 | + return 0; | |
| 242 | + } | |
| 243 | + | |
| 244 | + /** | |
| 245 | + * @Title: searchAllCars | |
| 246 | + * @Description: TODO(搜索班次集合中的车辆) | |
| 247 | + */ | |
| 248 | + private Set<String> searchAllCars(List<ScheduleRealInfo> list) { | |
| 249 | + Set<String> cars = new HashSet<>(); | |
| 250 | + for (ScheduleRealInfo sch : list) | |
| 251 | + cars.add(sch.getClZbh()); | |
| 252 | + | |
| 253 | + return cars; | |
| 254 | + } | |
| 255 | + | |
| 256 | + private void putAll(List<ScheduleRealInfo> list) { | |
| 257 | + for (ScheduleRealInfo sch : list) | |
| 258 | + put(sch); | |
| 259 | + } | |
| 260 | + | |
| 261 | + /** | |
| 262 | + * @param @param lineCode 线路编码 | |
| 263 | + * @param @param schDate 班次日期 yyyy-MM-dd | |
| 264 | + * @Title: removeRealSch | |
| 265 | + * @Description: TODO(清除实际排班,包括数据库和内存数据) | |
| 266 | + */ | |
| 267 | + public void removeRealSch(String lineCode, String schDate) throws Exception { | |
| 268 | + try { | |
| 269 | + // 清理数据库数据 | |
| 270 | + schRepository.deleteByLineCodeAndDate(lineCode + "", schDate); | |
| 271 | + | |
| 272 | + // 清理内存数据 | |
| 273 | + clearRAMData(lineCode + ""); | |
| 274 | + } catch (Exception e) { | |
| 275 | + logger.error("removeRealSch error, " + lineCode + " -" + schDate, e); | |
| 276 | + throw e; | |
| 277 | + } | |
| 278 | + } | |
| 279 | + | |
| 280 | + /** | |
| 281 | + * @Title: clearRAMData | |
| 282 | + * @Description: TODO(清理内存数据) | |
| 283 | + */ | |
| 284 | + public void clearRAMData(String lineCode) { | |
| 285 | + int count = 0; | |
| 286 | + List<ScheduleRealInfo> remList = new ArrayList<>(); | |
| 287 | + Collection<ScheduleRealInfo> schs = nbbmScheduleMap.values(); | |
| 288 | + for (ScheduleRealInfo sch : schs) { | |
| 289 | + if (sch.getXlBm().equals(lineCode)) | |
| 290 | + remList.add(sch); | |
| 291 | + } | |
| 292 | + | |
| 293 | + for (ScheduleRealInfo sch : remList) { | |
| 294 | + if (null != sch) { | |
| 295 | + nbbmScheduleMap.remove(sch.getClZbh(), sch); | |
| 296 | + id2SchedulMap.remove(sch.getId()); | |
| 297 | + count++; | |
| 298 | + } | |
| 299 | + } | |
| 300 | + | |
| 301 | + logger.info(lineCode + "排班清理 " + count); | |
| 302 | + } | |
| 303 | + | |
| 304 | + /** | |
| 305 | + * @Title: existRealSch | |
| 306 | + * @Description: TODO(实际排班是否已存在) | |
| 307 | + */ | |
| 308 | + public boolean existRealSch(String lineCode, String schDate) { | |
| 309 | + int count = schRepository.countByLineCodeAndDate(lineCode, schDate); | |
| 310 | + return count > 0; | |
| 311 | + } | |
| 312 | + | |
| 313 | + /** | |
| 314 | + * @Title: loadRealSch | |
| 315 | + * @Description: TODO(从实际排班表加载数据) | |
| 316 | + */ | |
| 317 | + public List<ScheduleRealInfo> loadRealSch(String lineCode, String schDate) { | |
| 318 | + return schRepository.findByLineCodeAndDate(lineCode, schDate); | |
| 319 | + } | |
| 320 | + | |
| 321 | + /** | |
| 322 | + * @Title: loadPlanSch | |
| 323 | + * @Description: TODO(从计划排班表加载数据) | |
| 324 | + */ | |
| 325 | + public List<ScheduleRealInfo> loadPlanSch(String lineCode, String schDate) { | |
| 326 | + logger.info("从计划排班表恢复排班,lineCode: " + lineCode + ", schDate: " + schDate); | |
| 327 | + List<ScheduleRealInfo> realList = new ArrayList<>(); | |
| 328 | + | |
| 329 | + try { | |
| 330 | + Map<String, Object> data = new HashMap<>(); | |
| 331 | + | |
| 332 | + data.put("scheduleDate_eq", fmtyyyyMMdd.parseDateTime(schDate).toDate()); | |
| 333 | + data.put("xlBm_eq", lineCode); | |
| 334 | + | |
| 335 | + // 查询计划排班 | |
| 336 | + List<SchedulePlanInfo> planItr = cleanSchPlanItr(schPlanService.list(data).iterator()); | |
| 337 | + | |
| 338 | + // 转换为实际排班 | |
| 339 | + realList = JSONArray.parseArray(JSON.toJSONString(planItr), ScheduleRealInfo.class); | |
| 340 | + | |
| 341 | + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); | |
| 342 | + String fcsj; | |
| 343 | + for (ScheduleRealInfo sch : realList) { | |
| 344 | + sch.setScheduleDateStr(fmtyyyyMMdd.print(sch.getScheduleDate().getTime())); | |
| 345 | + sch.setRealExecDate(sch.getScheduleDateStr()); | |
| 346 | + | |
| 347 | + if (StringUtils.isEmpty(sch.getFcsj())) | |
| 348 | + sch.setFcsj("00:00"); | |
| 349 | + | |
| 350 | + fcsj = sch.getFcsj().trim(); | |
| 351 | + //处理一下发车时间格式没有:号的问题 | |
| 352 | + if (fcsj.indexOf(":") == -1 && fcsj.length() >= 4) { | |
| 353 | + sch.setFcsj(fcsj.substring(0, 2) + ":" + fcsj.substring(2, 4)); | |
| 354 | + } | |
| 355 | + | |
| 356 | + try { | |
| 357 | + sdf.parse(sch.getFcsj()); | |
| 358 | + } catch (ParseException e) { | |
| 359 | + //发车时间仍然校验不过的,直接写成00:00 | |
| 360 | + sch.setFcsj("00:00"); | |
| 361 | + } | |
| 362 | + sch.setDfsj(sch.getFcsj()); | |
| 363 | + | |
| 364 | + // 计划终点时间 | |
| 365 | + if (sch.getBcsj() != null) { | |
| 366 | + sch.setZdsj(fmtHHmm.print(fmtHHmm.parseMillis(sch.getFcsj()) + (sch.getBcsj() * 60 * 1000))); | |
| 367 | + sch.setLate(false); | |
| 368 | + } | |
| 369 | + //计划里程为0,设置NULL | |
| 370 | + if (sch.getJhlc() != null && sch.getJhlc() == 0) | |
| 371 | + sch.setJhlc(null); | |
| 372 | + } | |
| 373 | + } catch (Exception e) { | |
| 374 | + logger.error("", e); | |
| 375 | + } | |
| 376 | + return realList; | |
| 377 | + } | |
| 378 | + | |
| 379 | + /** | |
| 380 | + * @Title: batchSave | |
| 381 | + * @Description: TODO(批量入库) | |
| 382 | + */ | |
| 383 | + private void batchSave(List<ScheduleRealInfo> list) { | |
| 384 | + // 查询数据库最大ID | |
| 385 | + Long id = schRepository.getMaxId(); | |
| 386 | + if (null == id) | |
| 387 | + id = 0L; | |
| 388 | + id++; | |
| 389 | + | |
| 390 | + SimpleDateFormat sdfyyyyMMdd = new SimpleDateFormat("yyyy-MM-dd"); | |
| 391 | + for (ScheduleRealInfo item : list) { | |
| 392 | + item.setSpId(item.getId());// 保留原始的计划ID | |
| 393 | + item.setId(id++);// 设置ID | |
| 394 | + item.setScheduleDateStr(sdfyyyyMMdd.format(item.getScheduleDate())); | |
| 395 | + } | |
| 396 | + | |
| 397 | + // 入库 | |
| 398 | + new BatchSaveUtils<ScheduleRealInfo>().saveList(list, ScheduleRealInfo.class); | |
| 399 | + } | |
| 400 | + | |
| 401 | + private List<SchedulePlanInfo> cleanSchPlanItr(Iterator<SchedulePlanInfo> itrab) { | |
| 402 | + List<SchedulePlanInfo> list = new ArrayList<>(); | |
| 403 | + | |
| 404 | + SchedulePlanInfo sp; | |
| 405 | + while (itrab.hasNext()) { | |
| 406 | + sp = itrab.next(); | |
| 407 | + sp.setSchedulePlan(null); | |
| 408 | + list.add(sp); | |
| 409 | + } | |
| 410 | + return list; | |
| 411 | + } | |
| 412 | + | |
| 413 | + /** | |
| 414 | + * @Title: findByLineCode | |
| 415 | + * @Description: TODO(lineCode 获取班次) | |
| 416 | + */ | |
| 417 | + public List<ScheduleRealInfo> findByLineCode(String lineCode) { | |
| 418 | + List<ScheduleRealInfo> rs = new ArrayList<>(); | |
| 419 | + | |
| 420 | + Collection<ScheduleRealInfo> schs = nbbmScheduleMap.values(); | |
| 421 | + for (ScheduleRealInfo sch : schs) { | |
| 422 | + if (sch.getXlBm().equals(lineCode)) | |
| 423 | + rs.add(sch); | |
| 424 | + } | |
| 425 | + return rs; | |
| 426 | + } | |
| 427 | + | |
| 428 | + /** | |
| 429 | + * @Title: findCarByLineCode | |
| 430 | + * @Description: TODO(线路下运营的车辆) | |
| 431 | + */ | |
| 432 | + public Set<String> findCarByLineCode(String lineCode) { | |
| 433 | + Set<String> rs = new HashSet<>(); | |
| 434 | + | |
| 435 | + Collection<ScheduleRealInfo> schs = nbbmScheduleMap.values(); | |
| 436 | + for (ScheduleRealInfo sch : schs) { | |
| 437 | + if (sch.getXlBm().equals(lineCode)) | |
| 438 | + rs.add(sch.getClZbh()); | |
| 439 | + } | |
| 440 | + | |
| 441 | + return rs; | |
| 442 | + } | |
| 443 | + | |
| 444 | + public List<ScheduleRealInfo> findByNbbm(String nbbm) { | |
| 445 | + return nbbmScheduleMap.get(nbbm); | |
| 446 | + } | |
| 447 | + | |
| 448 | + /** | |
| 449 | + * @Title: findByLineAndUpDown | |
| 450 | + * @Description: TODO(lineCode 和走向获取班次) | |
| 451 | + */ | |
| 452 | + public List<ScheduleRealInfo> findByLineAndUpDown(String lineCode, Integer upDown) { | |
| 453 | + List<ScheduleRealInfo> list = findByLineCode(lineCode), rs = new ArrayList<>(); | |
| 454 | + | |
| 455 | + for (ScheduleRealInfo sch : list) { | |
| 456 | + if (sch.getXlDir().equals(upDown + "")) | |
| 457 | + rs.add(sch); | |
| 458 | + } | |
| 459 | + return rs; | |
| 460 | + } | |
| 461 | + | |
| 462 | + public ScheduleRealInfo get(long id) { | |
| 463 | + return id2SchedulMap.get(id); | |
| 464 | + } | |
| 465 | + | |
| 466 | + public Set<String> getSEStationList(String nbbm) { | |
| 467 | + return nbbm2SEStationMap.get(nbbm); | |
| 468 | + } | |
| 469 | + | |
| 470 | + /** | |
| 471 | + * @Title: next | |
| 472 | + * @Description: TODO(下一个班次) | |
| 473 | + */ | |
| 474 | + public ScheduleRealInfo next(ScheduleRealInfo sch) { | |
| 475 | + | |
| 476 | + List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); | |
| 477 | + int outConfig = -1; | |
| 478 | + LineConfig config = lineConfigData.get(sch.getXlBm()); | |
| 479 | + if (config != null) | |
| 480 | + outConfig = config.getOutConfig(); | |
| 481 | + | |
| 482 | + boolean flag = false; | |
| 483 | + ScheduleRealInfo next = null; | |
| 484 | + for (ScheduleRealInfo temp : list) { | |
| 485 | + if (temp.getId() == sch.getId()) { | |
| 486 | + flag = true; | |
| 487 | + continue; | |
| 488 | + } | |
| 489 | + //忽略烂班 | |
| 490 | + if (temp.isDestroy()) | |
| 491 | + continue; | |
| 492 | + | |
| 493 | + //出站既出场,忽略出场班次 | |
| 494 | + if (outConfig == 2 && temp.getBcType().equals("out")) | |
| 495 | + continue; | |
| 496 | + | |
| 497 | + if (flag) { | |
| 498 | + next = temp; | |
| 499 | + break; | |
| 500 | + } | |
| 501 | + } | |
| 502 | + return next; | |
| 503 | + } | |
| 504 | + | |
| 505 | + /** | |
| 506 | + * 上一个班次 | |
| 507 | + * | |
| 508 | + * @param sch | |
| 509 | + * @return | |
| 510 | + */ | |
| 511 | + public ScheduleRealInfo prev(ScheduleRealInfo sch) { | |
| 512 | + List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); | |
| 513 | + | |
| 514 | + //boolean flag = false; | |
| 515 | + ScheduleRealInfo prev = null; | |
| 516 | + int size = list.size(); | |
| 517 | + | |
| 518 | + for (int i = 0; i < size; i++) { | |
| 519 | + if (list.get(i).isDestroy()) | |
| 520 | + continue; | |
| 521 | + | |
| 522 | + if (list.get(i).getId().equals(sch.getId())) { | |
| 523 | + return prev; | |
| 524 | + } | |
| 525 | + prev = list.get(i); | |
| 526 | + } | |
| 527 | + return prev; | |
| 528 | + } | |
| 529 | + | |
| 530 | + public void put(ScheduleRealInfo sch) { | |
| 531 | + schAttrCalculator | |
| 532 | + .calcRealDate(sch) | |
| 533 | + .calcAllTimeByFcsj(sch); | |
| 534 | + | |
| 535 | + String nbbm = sch.getClZbh(); | |
| 536 | + nbbmScheduleMap.put(nbbm, sch); | |
| 537 | + nbbm2SEStationMap.put(nbbm, sch.getQdzCode()); | |
| 538 | + nbbm2SEStationMap.put(nbbm, sch.getZdzCode()); | |
| 539 | + | |
| 540 | + //主键索引 | |
| 541 | + id2SchedulMap.put(sch.getId(), sch); | |
| 542 | + //跨24点的,再save一次 | |
| 543 | + if (!sch.getRealExecDate().equals(sch.getScheduleDateStr())) | |
| 544 | + save(sch); | |
| 545 | + } | |
| 546 | + | |
| 547 | + public void delete(ScheduleRealInfo sch) { | |
| 548 | + //ScheduleRealInfo sch = id2SchedulMap.get(id); | |
| 549 | + if (!sch.isSflj()) | |
| 550 | + return; | |
| 551 | + | |
| 552 | + nbbmScheduleMap.remove(sch.getClZbh(), sch); | |
| 553 | + id2SchedulMap.remove(sch.getId()); | |
| 554 | + //return sch; | |
| 555 | + } | |
| 452 | 556 | |
| 453 | - List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); | |
| 454 | - | |
| 455 | - boolean flag = false; | |
| 456 | - ScheduleRealInfo next = null; | |
| 457 | - for(ScheduleRealInfo temp : list){ | |
| 458 | - if(temp.getId() == sch.getId()){ | |
| 459 | - flag = true; | |
| 460 | - continue; | |
| 461 | - } | |
| 462 | - //忽略烂班 | |
| 463 | - if(temp.isDestroy()) | |
| 464 | - continue; | |
| 465 | - | |
| 466 | - if(flag){ | |
| 467 | - next = temp; | |
| 468 | - break; | |
| 469 | - } | |
| 470 | - } | |
| 471 | - return next; | |
| 472 | - } | |
| 473 | - | |
| 474 | - public void put(ScheduleRealInfo sch) { | |
| 475 | - schAttrCalculator | |
| 476 | - .calcRealDate(sch) | |
| 477 | - .calcAllTimeByFcsj(sch); | |
| 478 | - | |
| 479 | - String nbbm = sch.getClZbh(); | |
| 480 | - nbbmScheduleMap.put(nbbm, sch); | |
| 481 | - nbbm2SEStationMap.put(nbbm, sch.getQdzCode()); | |
| 482 | - nbbm2SEStationMap.put(nbbm, sch.getZdzCode()); | |
| 483 | - | |
| 484 | - //主键索引 | |
| 485 | - id2SchedulMap.put(sch.getId(), sch); | |
| 486 | - //跨24点的,再save一次 | |
| 487 | - if(!sch.getRealExecDate().equals(sch.getScheduleDateStr())) | |
| 488 | - save(sch); | |
| 489 | - } | |
| 490 | - | |
| 491 | - public void delete(ScheduleRealInfo sch) { | |
| 492 | - //ScheduleRealInfo sch = id2SchedulMap.get(id); | |
| 493 | - if(!sch.isSflj()) | |
| 494 | - return; | |
| 495 | - | |
| 496 | - nbbmScheduleMap.remove(sch.getClZbh(), sch); | |
| 497 | - id2SchedulMap.remove(sch.getId()); | |
| 498 | - //return sch; | |
| 499 | - } | |
| 500 | - | |
| 501 | 557 | // public void calcQdzTimePlan(String nbbm){ |
| 502 | 558 | // schAttrCalculator.calcQdzTimePlan(nbbmScheduleMap.get(nbbm)); |
| 503 | 559 | // } |
| 504 | - | |
| 505 | - public List<ScheduleRealInfo> updateQdzTimePlan(String nbbm){ | |
| 506 | - return schAttrCalculator.updateQdzTimePlan(nbbmScheduleMap.get(nbbm)); | |
| 507 | - } | |
| 508 | - | |
| 509 | - /** | |
| 510 | - * | |
| 511 | - * @Title: nextAll | |
| 512 | - * @Description: TODO(之后的所有班次) | |
| 513 | - */ | |
| 560 | + | |
| 561 | + public List<ScheduleRealInfo> updateQdzTimePlan(String nbbm) { | |
| 562 | + return schAttrCalculator.updateQdzTimePlan(nbbmScheduleMap.get(nbbm)); | |
| 563 | + } | |
| 564 | + | |
| 565 | + /** | |
| 566 | + * | |
| 567 | + * @Title: nextAll | |
| 568 | + * @Description: TODO(之后的所有班次) | |
| 569 | + */ | |
| 514 | 570 | /* public List<ScheduleRealInfo> nextAll(ScheduleRealInfo sch) { |
| 515 | - List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); | |
| 571 | + List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); | |
| 516 | 572 | // 排序 |
| 517 | 573 | Collections.sort(list, schFCSJComparator); |
| 518 | 574 | |
| ... | ... | @@ -527,181 +583,229 @@ public class DayOfSchedule implements CommandLineRunner { |
| 527 | 583 | return rs; |
| 528 | 584 | }*/ |
| 529 | 585 | |
| 530 | - /** | |
| 531 | - * | |
| 532 | - * @Title: doneSum | |
| 533 | - * @Description: TODO(已完成班次总数) | |
| 534 | - */ | |
| 535 | - public int doneSum(String clZbh) { | |
| 536 | - List<ScheduleRealInfo> list = nbbmScheduleMap.get(clZbh); | |
| 537 | - int rs = 0; | |
| 538 | - | |
| 539 | - for(ScheduleRealInfo sch : list){ | |
| 540 | - if(sch.getStatus() == 2 && !sch.isDestroy()) | |
| 541 | - rs ++; | |
| 542 | - } | |
| 543 | - return rs; | |
| 544 | - } | |
| 545 | - | |
| 546 | - /** | |
| 547 | - * | |
| 548 | - * @Title: prveNotExecNum | |
| 549 | - * @Description: TODO(班次之前未执行班次数量) | |
| 550 | - */ | |
| 551 | - public int prveNotExecNum(ScheduleRealInfo sch){ | |
| 552 | - int n = 0; | |
| 553 | - List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); | |
| 554 | - for(ScheduleRealInfo s : list){ | |
| 555 | - if(s.getFcsjActual() == null && !s.isDestroy()) | |
| 556 | - n ++; | |
| 557 | - | |
| 558 | - if(s.getId().equals(sch.getId())) | |
| 559 | - break; | |
| 560 | - } | |
| 561 | - return n; | |
| 562 | - } | |
| 563 | - | |
| 564 | - /** | |
| 565 | - * | |
| 566 | - * @Title: validEndTime | |
| 567 | - * @Description: TODO(是否是有效的到达时间) | |
| 568 | - */ | |
| 569 | - public boolean validEndTime(ScheduleRealInfo sch, Long ts) { | |
| 570 | - if(sch.getFcsjActualTime() != null && sch.getFcsjActualTime() > ts) | |
| 571 | - return false; | |
| 572 | - | |
| 573 | - return validTime(sch, ts); | |
| 574 | - } | |
| 575 | - | |
| 576 | - /** | |
| 577 | - * | |
| 578 | - * @Title: validStartTime | |
| 579 | - * @Description: TODO(是否是合适的发车时间) | |
| 580 | - */ | |
| 581 | - public boolean validStartTime(ScheduleRealInfo sch, Long ts) { | |
| 582 | - if(sch.getZdsjActualTime() != null && sch.getZdsjActualTime() < ts) | |
| 583 | - return false; | |
| 584 | - | |
| 585 | - return validTime(sch, ts); | |
| 586 | - } | |
| 587 | - | |
| 588 | - public boolean validTime(ScheduleRealInfo sch, Long ts){ | |
| 589 | - List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); | |
| 590 | - int ci = list.indexOf(sch); | |
| 591 | - ScheduleRealInfo prve, next; | |
| 592 | - if(ci > 0){ | |
| 593 | - //之前班次实际时间不能大于该时间 | |
| 594 | - for(int i = ci - 1; i >= 0; i --){ | |
| 595 | - prve = list.get(i); | |
| 596 | - if(prve.getZdsjActualTime() != null && prve.getZdsjActualTime() > ts ) | |
| 597 | - return false; | |
| 598 | - | |
| 599 | - if(prve.getFcsjActualTime() != null && prve.getFcsjActualTime() > ts) | |
| 600 | - return false; | |
| 601 | - } | |
| 602 | - } | |
| 603 | - | |
| 604 | - if(ci < list.size() - 1){ | |
| 605 | - //之后班次实际时间不能小于该时间 | |
| 606 | - for(int i = ci + 1; i < list.size(); i ++){ | |
| 607 | - next = list.get(i); | |
| 608 | - if(next.getFcsjActualTime() != null && next.getFcsjActualTime() < ts) | |
| 609 | - return false; | |
| 610 | - | |
| 611 | - if(next.getZdsjActualTime() != null && next.getZdsjActualTime() < ts) | |
| 612 | - return false; | |
| 613 | - } | |
| 614 | - } | |
| 615 | - return true; | |
| 616 | - } | |
| 617 | - | |
| 618 | - public void save(ScheduleRealInfo sch){ | |
| 619 | - //schRepository.save(sch); | |
| 620 | - pstBuffer.add(sch); | |
| 621 | - } | |
| 622 | - | |
| 623 | - | |
| 624 | - /** | |
| 625 | - * | |
| 626 | - * @Title: nextByBcType | |
| 627 | - * @Description: TODO(获取下一个指定班次类型的班次) | |
| 628 | - */ | |
| 629 | - public ScheduleRealInfo nextByBcType(String nbbm, String bcType){ | |
| 630 | - List<ScheduleRealInfo> list = findByBcType(nbbm, bcType); | |
| 631 | - | |
| 632 | - Collections.sort(list, schFCSJComparator); | |
| 633 | - ScheduleRealInfo sch = null; | |
| 634 | - for(ScheduleRealInfo temp : list){ | |
| 635 | - if(temp.getFcsjActual() == null) | |
| 636 | - sch = temp; | |
| 637 | - } | |
| 638 | - | |
| 639 | - return sch; | |
| 640 | - } | |
| 641 | - | |
| 642 | - public List<ScheduleRealInfo> findByBcType(String nbbm, String bcType){ | |
| 643 | - List<ScheduleRealInfo> all = nbbmScheduleMap.get(nbbm) | |
| 644 | - ,outList = new ArrayList<>(); | |
| 645 | - | |
| 646 | - for(ScheduleRealInfo sch : all){ | |
| 647 | - if(sch.getBcType().equals(bcType)) | |
| 648 | - outList.add(sch); | |
| 649 | - } | |
| 650 | - return outList; | |
| 651 | - } | |
| 652 | - | |
| 653 | - public Set<String> allCar(){ | |
| 654 | - return nbbmScheduleMap.keySet(); | |
| 655 | - } | |
| 656 | - | |
| 657 | - public Collection<ScheduleRealInfo> findAll(){ | |
| 658 | - return nbbmScheduleMap.values(); | |
| 659 | - } | |
| 660 | - | |
| 661 | - public void addExecPlan(ScheduleRealInfo sch){ | |
| 662 | - carExecutePlanMap.put(sch.getClZbh(), sch); | |
| 663 | - } | |
| 664 | - | |
| 665 | - public void removeExecPlan(String clzbh){ | |
| 666 | - carExecutePlanMap.remove(clzbh); | |
| 667 | - } | |
| 668 | - | |
| 669 | - public Map<String, ScheduleRealInfo> execPlamMap(){ | |
| 670 | - return carExecutePlanMap; | |
| 671 | - } | |
| 672 | - | |
| 673 | - /** | |
| 674 | - * @Title: changeCar | |
| 675 | - * @Description: TODO(班次换车) 返回有更新的班次 | |
| 676 | - * @param @param sch | |
| 677 | - * @param @param newClZbh 新的车辆自编号 | |
| 678 | - */ | |
| 679 | - public List<ScheduleRealInfo> changeCar(ScheduleRealInfo sch , String newClZbh){ | |
| 680 | - List<ScheduleRealInfo> ups = new ArrayList<>(); | |
| 681 | - String oldClzbh = sch.getClZbh(); | |
| 682 | - if(oldClzbh.equals(newClZbh)) | |
| 683 | - return ups; | |
| 684 | - | |
| 685 | - | |
| 686 | - //变更相关映射信息 | |
| 687 | - nbbmScheduleMap.remove(sch.getClZbh(), sch); | |
| 688 | - | |
| 689 | - sch.setClZbh(newClZbh); | |
| 690 | - nbbmScheduleMap.put(newClZbh, sch); | |
| 691 | - nbbm2SEStationMap.put(newClZbh, sch.getQdzCode()); | |
| 692 | - nbbm2SEStationMap.put(newClZbh, sch.getZdzCode()); | |
| 693 | - | |
| 694 | - //重新计算班次应到时间 | |
| 695 | - ups.addAll(updateQdzTimePlan(oldClzbh)); | |
| 696 | - ups.addAll(updateQdzTimePlan(newClZbh)); | |
| 697 | - return ups; | |
| 698 | - } | |
| 699 | - | |
| 700 | - /** | |
| 701 | - * | |
| 702 | - * @Title: linkToSchPlan | |
| 703 | - * @Description: TODO(车辆关联到班次) | |
| 704 | - */ | |
| 586 | + /** | |
| 587 | + * @Title: doneSum | |
| 588 | + * @Description: TODO(已完成班次总数) | |
| 589 | + */ | |
| 590 | + public int doneSum(String clZbh) { | |
| 591 | + List<ScheduleRealInfo> list = nbbmScheduleMap.get(clZbh); | |
| 592 | + int rs = 0; | |
| 593 | + | |
| 594 | + for (ScheduleRealInfo sch : list) { | |
| 595 | + if (sch.getStatus() == 2 && !sch.isDestroy()) | |
| 596 | + rs++; | |
| 597 | + } | |
| 598 | + return rs; | |
| 599 | + } | |
| 600 | + | |
| 601 | + /** | |
| 602 | + * @Title: prveNotExecNum | |
| 603 | + * @Description: TODO(班次之前未执行班次数量) | |
| 604 | + */ | |
| 605 | + public int prveNotExecNum(ScheduleRealInfo sch) { | |
| 606 | + int n = 0; | |
| 607 | + List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); | |
| 608 | + for (ScheduleRealInfo s : list) { | |
| 609 | + if (s.getFcsjActual() == null && !s.isDestroy()) | |
| 610 | + n++; | |
| 611 | + | |
| 612 | + if (s.getId().equals(sch.getId())) | |
| 613 | + break; | |
| 614 | + } | |
| 615 | + return n; | |
| 616 | + } | |
| 617 | + | |
| 618 | + /** | |
| 619 | + * @Title: validEndTime | |
| 620 | + * @Description: TODO(是否是有效的到达时间) | |
| 621 | + */ | |
| 622 | + public boolean validEndTime(ScheduleRealInfo sch, Long ts) { | |
| 623 | + if (sch.getFcsjActualTime() != null && sch.getFcsjActualTime() > ts) | |
| 624 | + return false; | |
| 625 | + | |
| 626 | + return validTime(sch, ts); | |
| 627 | + } | |
| 628 | + | |
| 629 | + /** | |
| 630 | + * @Title: validStartTime | |
| 631 | + * @Description: TODO(是否是合适的发车时间) | |
| 632 | + */ | |
| 633 | + public boolean validStartTime(ScheduleRealInfo sch, Long ts) { | |
| 634 | + if (sch.getZdsjActualTime() != null && sch.getZdsjActualTime() < ts) | |
| 635 | + return false; | |
| 636 | + | |
| 637 | + return validTime(sch, ts); | |
| 638 | + } | |
| 639 | + | |
| 640 | + public boolean validTime(ScheduleRealInfo sch, Long ts) { | |
| 641 | + List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); | |
| 642 | + int ci = list.indexOf(sch); | |
| 643 | + ScheduleRealInfo prve, next; | |
| 644 | + if (ci > 0) { | |
| 645 | + //之前班次实际时间不能大于该时间 | |
| 646 | + for (int i = ci - 1; i >= 0; i--) { | |
| 647 | + prve = list.get(i); | |
| 648 | + if (prve.getZdsjActualTime() != null && prve.getZdsjActualTime() > ts) | |
| 649 | + return false; | |
| 650 | + | |
| 651 | + if (prve.getFcsjActualTime() != null && prve.getFcsjActualTime() > ts) | |
| 652 | + return false; | |
| 653 | + } | |
| 654 | + } | |
| 655 | + | |
| 656 | + if (ci < list.size() - 1) { | |
| 657 | + //之后班次实际时间不能小于该时间 | |
| 658 | + for (int i = ci + 1; i < list.size(); i++) { | |
| 659 | + next = list.get(i); | |
| 660 | + if (next.getFcsjActualTime() != null && next.getFcsjActualTime() < ts) | |
| 661 | + return false; | |
| 662 | + | |
| 663 | + if (next.getZdsjActualTime() != null && next.getZdsjActualTime() < ts) | |
| 664 | + return false; | |
| 665 | + } | |
| 666 | + } | |
| 667 | + return true; | |
| 668 | + } | |
| 669 | + | |
| 670 | + public void save(ScheduleRealInfo sch) { | |
| 671 | + //schRepository.save(sch); | |
| 672 | + pstBuffer.add(sch); | |
| 673 | + } | |
| 674 | + | |
| 675 | + | |
| 676 | + /** | |
| 677 | + * @Title: nextByBcType | |
| 678 | + * @Description: TODO(获取下一个指定班次类型的班次) | |
| 679 | + */ | |
| 680 | + public ScheduleRealInfo nextByBcType(String nbbm, String bcType) { | |
| 681 | + List<ScheduleRealInfo> list = findByBcType(nbbm, bcType); | |
| 682 | + | |
| 683 | + Collections.sort(list, schFCSJComparator); | |
| 684 | + ScheduleRealInfo sch = null; | |
| 685 | + for (ScheduleRealInfo temp : list) { | |
| 686 | + if (temp.getFcsjActual() == null) | |
| 687 | + sch = temp; | |
| 688 | + } | |
| 689 | + | |
| 690 | + return sch; | |
| 691 | + } | |
| 692 | + | |
| 693 | + public List<ScheduleRealInfo> findByBcType(String nbbm, String bcType) { | |
| 694 | + List<ScheduleRealInfo> all = nbbmScheduleMap.get(nbbm), outList = new ArrayList<>(); | |
| 695 | + | |
| 696 | + for (ScheduleRealInfo sch : all) { | |
| 697 | + if (sch.getBcType().equals(bcType)) | |
| 698 | + outList.add(sch); | |
| 699 | + } | |
| 700 | + return outList; | |
| 701 | + } | |
| 702 | + | |
| 703 | + public Set<String> allCar() { | |
| 704 | + return nbbmScheduleMap.keySet(); | |
| 705 | + } | |
| 706 | + | |
| 707 | + public Collection<ScheduleRealInfo> findAll() { | |
| 708 | + return nbbmScheduleMap.values(); | |
| 709 | + } | |
| 710 | + | |
| 711 | + public void addExecPlan(ScheduleRealInfo sch) { | |
| 712 | + if(sch != null) | |
| 713 | + carExecutePlanMap.put(sch.getClZbh(), sch); | |
| 714 | + } | |
| 715 | + | |
| 716 | + public void removeExecPlan(String clzbh) { | |
| 717 | + carExecutePlanMap.remove(clzbh); | |
| 718 | + } | |
| 719 | + | |
| 720 | + public Map<String, ScheduleRealInfo> execPlanMap() { | |
| 721 | + return carExecutePlanMap; | |
| 722 | + } | |
| 723 | + | |
| 724 | + /** | |
| 725 | + * 车辆当前执行的班次 | |
| 726 | + * | |
| 727 | + * @param nbbm | |
| 728 | + * @return | |
| 729 | + */ | |
| 730 | + public ScheduleRealInfo executeCurr(String nbbm) { | |
| 731 | + return carExecutePlanMap.get(nbbm); | |
| 732 | + } | |
| 733 | + | |
| 734 | + /** | |
| 735 | + * @param @param sch | |
| 736 | + * @param @param newClZbh 新的车辆自编号 | |
| 737 | + * @Title: changeCar | |
| 738 | + * @Description: TODO(班次换车) 返回有更新的班次 | |
| 739 | + */ | |
| 740 | + public List<ScheduleRealInfo> changeCar(ScheduleRealInfo sch, String newClZbh) { | |
| 741 | + List<ScheduleRealInfo> ups = new ArrayList<>(); | |
| 742 | + String oldClzbh = sch.getClZbh(); | |
| 743 | + if (oldClzbh.equals(newClZbh)) | |
| 744 | + return ups; | |
| 745 | + | |
| 746 | + | |
| 747 | + //变更相关映射信息 | |
| 748 | + nbbmScheduleMap.remove(sch.getClZbh(), sch); | |
| 749 | + | |
| 750 | + sch.setClZbh(newClZbh); | |
| 751 | + nbbmScheduleMap.put(newClZbh, sch); | |
| 752 | + nbbm2SEStationMap.put(newClZbh, sch.getQdzCode()); | |
| 753 | + nbbm2SEStationMap.put(newClZbh, sch.getZdzCode()); | |
| 754 | + | |
| 755 | + //重新计算班次应到时间 | |
| 756 | + ups.addAll(updateQdzTimePlan(oldClzbh)); | |
| 757 | + ups.addAll(updateQdzTimePlan(newClZbh)); | |
| 758 | + | |
| 759 | + //重新计算车辆当前执行班次 | |
| 760 | + reCalcExecPlan(newClZbh); | |
| 761 | + reCalcExecPlan(sch.getClZbh()); | |
| 762 | + return ups; | |
| 763 | + } | |
| 764 | + | |
| 765 | + public void reCalcExecPlan(String nbbm){ | |
| 766 | + carExecutePlanMap.put(nbbm, schAttrCalculator.calcCurrentExecSch(nbbmScheduleMap.get(nbbm))); | |
| 767 | + } | |
| 768 | + | |
| 769 | + /** | |
| 770 | + * 是否在执行首班出场 | |
| 771 | + * @param nbbm | |
| 772 | + * @return | |
| 773 | + */ | |
| 774 | + public boolean isExecFirstOut(String nbbm, long time){ | |
| 775 | + try { | |
| 776 | + List<ScheduleRealInfo> list = nbbmScheduleMap.get(nbbm); | |
| 777 | + ScheduleRealInfo second = list.get(2), | |
| 778 | + first = executeCurr(nbbm); | |
| 779 | + | |
| 780 | + if(first.getBcType().equals("out") | |
| 781 | + && first.getDfsjT() < second.getDfsjT() | |
| 782 | + && doneSum(nbbm) == 0 && second.getDfsjT() > time) | |
| 783 | + return true; | |
| 784 | + } catch (Exception e) { | |
| 785 | + logger.error("", e); | |
| 786 | + } | |
| 787 | + | |
| 788 | + return false; | |
| 789 | + } | |
| 790 | + | |
| 791 | + /** | |
| 792 | + * 获取班次的计划停站时间 | |
| 793 | + * @param sch | |
| 794 | + * @return | |
| 795 | + | |
| 796 | + public int stopTimePlan(Object task) { | |
| 797 | + | |
| 798 | + ScheduleRealInfo sch = prev((ScheduleRealInfo) task); | |
| 799 | + | |
| 800 | + sch.getzdsj | |
| 801 | + return -1; | |
| 802 | + }*/ | |
| 803 | + | |
| 804 | + /** | |
| 805 | + * | |
| 806 | + * @Title: linkToSchPlan | |
| 807 | + * @Description: TODO(车辆关联到班次) | |
| 808 | + */ | |
| 705 | 809 | /* public void linkToSchPlan(String nbbm) { |
| 706 | 810 | //当前GPS状态 |
| 707 | 811 | GpsEntity gps = gpsRealData.get(BasicData.deviceId2NbbmMap.inverse().get(nbbm)); | ... | ... |
src/main/java/com/bsth/data/schedule/SchAttrCalculator.java
| ... | ... | @@ -215,4 +215,30 @@ public class SchAttrCalculator { |
| 215 | 215 | if(sch.getZdsjActualTime() == null && sch.getZdsjActual() != null) |
| 216 | 216 | sch.setZdsjActualAll(sch.getZdsjActual()); |
| 217 | 217 | } |
| 218 | + | |
| 219 | + /** | |
| 220 | + * 计算当前要执行的班次 | |
| 221 | + * @param list | |
| 222 | + * @return | |
| 223 | + */ | |
| 224 | + public ScheduleRealInfo calcCurrentExecSch(List<ScheduleRealInfo> list){ | |
| 225 | + String lineCode = list.get(0).getXlBm(); | |
| 226 | + LineConfig conf = lineConfigData.get(lineCode); | |
| 227 | + int outConfig = -1; | |
| 228 | + if(conf != null) | |
| 229 | + outConfig = conf.getOutConfig(); | |
| 230 | + | |
| 231 | + for(ScheduleRealInfo sch : list){ | |
| 232 | + //如果是出站既出场,忽略出场班次 | |
| 233 | + if(outConfig == 2 && sch.getBcType().equals("out")) | |
| 234 | + continue; | |
| 235 | + | |
| 236 | + //已执行 | |
| 237 | + if(StringUtils.isNotEmpty(sch.getZdsjActual())) | |
| 238 | + continue; | |
| 239 | + | |
| 240 | + return sch; | |
| 241 | + } | |
| 242 | + return null; | |
| 243 | + } | |
| 218 | 244 | } | ... | ... |
src/main/java/com/bsth/data/schedule/thread/ScheduleRefreshThread.java
| 1 | 1 | package com.bsth.data.schedule.thread; |
| 2 | 2 | |
| 3 | -import java.util.Collection; | |
| 4 | -import java.util.Set; | |
| 5 | - | |
| 6 | -import org.slf4j.Logger; | |
| 7 | -import org.slf4j.LoggerFactory; | |
| 8 | -import org.springframework.beans.factory.annotation.Autowired; | |
| 9 | -import org.springframework.stereotype.Component; | |
| 10 | - | |
| 11 | 3 | import com.bsth.data.BasicData; |
| 12 | 4 | import com.bsth.data.LineConfigData; |
| 13 | 5 | import com.bsth.data.arrival.ArrivalData_GPS; |
| ... | ... | @@ -15,6 +7,13 @@ import com.bsth.data.directive.DayOfDirectives; |
| 15 | 7 | import com.bsth.data.pilot80.PilotReport; |
| 16 | 8 | import com.bsth.data.schedule.DayOfSchedule; |
| 17 | 9 | import com.bsth.entity.realcontrol.LineConfig; |
| 10 | +import org.slf4j.Logger; | |
| 11 | +import org.slf4j.LoggerFactory; | |
| 12 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 13 | +import org.springframework.stereotype.Component; | |
| 14 | + | |
| 15 | +import java.util.Collection; | |
| 16 | +import java.util.Set; | |
| 18 | 17 | |
| 19 | 18 | /** |
| 20 | 19 | * |
| ... | ... | @@ -57,6 +56,7 @@ public class ScheduleRefreshThread extends Thread{ |
| 57 | 56 | currSchDate = dayOfSchedule.calcSchDate(lineCode); |
| 58 | 57 | |
| 59 | 58 | if(oldSchDate == null || !oldSchDate.equals(currSchDate)){ |
| 59 | + | |
| 60 | 60 | logger.info(lineCode + "开始翻班, " + currSchDate); |
| 61 | 61 | //清除进出站数据 |
| 62 | 62 | arrivalData.clearRAMData(lineCode); | ... | ... |
src/main/java/com/bsth/entity/Cars.java
| ... | ... | @@ -23,7 +23,7 @@ import java.util.Date; |
| 23 | 23 | |
| 24 | 24 | @Entity |
| 25 | 25 | @Table(name = "bsth_c_cars") |
| 26 | -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"}) | |
| 26 | +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) | |
| 27 | 27 | public class Cars extends BEntity implements Serializable { |
| 28 | 28 | |
| 29 | 29 | /** 主键Id */ | ... | ... |
src/main/java/com/bsth/entity/Line.java
| ... | ... | @@ -24,7 +24,7 @@ import java.util.Date; |
| 24 | 24 | |
| 25 | 25 | @Entity |
| 26 | 26 | @Table(name = "bsth_c_line") |
| 27 | -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"}) | |
| 27 | +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) | |
| 28 | 28 | public class Line implements Serializable { |
| 29 | 29 | |
| 30 | 30 | @Id | ... | ... |
src/main/java/com/bsth/entity/Personnel.java
| ... | ... | @@ -21,7 +21,7 @@ import javax.persistence.*; |
| 21 | 21 | |
| 22 | 22 | @Entity |
| 23 | 23 | @Table(name = "bsth_c_personnel") |
| 24 | -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"}) | |
| 24 | +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) | |
| 25 | 25 | public class Personnel extends BEntity { |
| 26 | 26 | |
| 27 | 27 | /** 主键Id */ | ... | ... |
src/main/java/com/bsth/entity/mcy_forms/Changetochange.java
src/main/java/com/bsth/entity/realcontrol/LineConfig.java
| 1 | 1 | package com.bsth.entity.realcontrol; |
| 2 | 2 | |
| 3 | +import com.bsth.entity.Line; | |
| 4 | + | |
| 5 | +import javax.persistence.*; | |
| 3 | 6 | import java.text.ParseException; |
| 4 | 7 | import java.text.SimpleDateFormat; |
| 5 | 8 | import java.util.Date; |
| 6 | 9 | import java.util.HashSet; |
| 7 | 10 | import java.util.Set; |
| 8 | 11 | |
| 9 | -import javax.persistence.CascadeType; | |
| 10 | -import javax.persistence.Entity; | |
| 11 | -import javax.persistence.GeneratedValue; | |
| 12 | -import javax.persistence.Id; | |
| 13 | -import javax.persistence.NamedAttributeNode; | |
| 14 | -import javax.persistence.NamedEntityGraph; | |
| 15 | -import javax.persistence.NamedEntityGraphs; | |
| 16 | -import javax.persistence.OneToMany; | |
| 17 | -import javax.persistence.OneToOne; | |
| 18 | -import javax.persistence.Table; | |
| 19 | -import javax.persistence.Transient; | |
| 20 | - | |
| 21 | -import com.bsth.entity.Line; | |
| 22 | -import com.bsth.util.DateUtils; | |
| 23 | - | |
| 24 | 12 | /** |
| 25 | 13 | * |
| 26 | 14 | * @ClassName: LineConfig |
| ... | ... | @@ -59,9 +47,6 @@ public class LineConfig { |
| 59 | 47 | /** 出场时间设置 0:真实出场(设备离开缓冲区时间) 1:请求出场时间 2:出站即出场 */ |
| 60 | 48 | private int outConfig; |
| 61 | 49 | |
| 62 | - /** 进场时间设置 0:真实进场(设备进入缓冲区时间) 1:请求进场时间 2:出站即出场*/ | |
| 63 | - private int inConfig; | |
| 64 | - | |
| 65 | 50 | /** 短语模板 , 号分隔多个 */ |
| 66 | 51 | private String phraseTemps; |
| 67 | 52 | |
| ... | ... | @@ -111,14 +96,6 @@ public class LineConfig { |
| 111 | 96 | this.outConfig = outConfig; |
| 112 | 97 | } |
| 113 | 98 | |
| 114 | - public int getInConfig() { | |
| 115 | - return inConfig; | |
| 116 | - } | |
| 117 | - | |
| 118 | - public void setInConfig(int inConfig) { | |
| 119 | - this.inConfig = inConfig; | |
| 120 | - } | |
| 121 | - | |
| 122 | 99 | public String getPhraseTemps() { |
| 123 | 100 | return phraseTemps; |
| 124 | 101 | } | ... | ... |
src/main/java/com/bsth/entity/realcontrol/ScheduleType.java
0 → 100644
src/main/java/com/bsth/entity/schedule/CarConfigInfo.java
| ... | ... | @@ -19,7 +19,7 @@ import java.util.Date; |
| 19 | 19 | @NamedAttributeNode("cl") |
| 20 | 20 | }) |
| 21 | 21 | }) |
| 22 | -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"}) | |
| 22 | +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) | |
| 23 | 23 | public class CarConfigInfo extends BEntity implements Serializable { |
| 24 | 24 | |
| 25 | 25 | /** 主健Id */ | ... | ... |
src/main/java/com/bsth/entity/schedule/EmployeeConfigInfo.java
| ... | ... | @@ -22,7 +22,7 @@ import java.io.Serializable; |
| 22 | 22 | @NamedAttributeNode("xl") |
| 23 | 23 | }) |
| 24 | 24 | }) |
| 25 | -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"}) | |
| 25 | +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) | |
| 26 | 26 | public class EmployeeConfigInfo extends BEntity implements Serializable { |
| 27 | 27 | |
| 28 | 28 | /** 主键Id */ | ... | ... |
src/main/java/com/bsth/entity/schedule/GuideboardInfo.java
| ... | ... | @@ -15,7 +15,7 @@ import javax.persistence.*; |
| 15 | 15 | @NamedAttributeNode("xl") |
| 16 | 16 | }) |
| 17 | 17 | }) |
| 18 | -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"}) | |
| 18 | +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) | |
| 19 | 19 | public class GuideboardInfo extends BEntity { |
| 20 | 20 | |
| 21 | 21 | /** 主键Id */ | ... | ... |
src/main/java/com/bsth/entity/schedule/TTInfo.java
| 1 | 1 | package com.bsth.entity.schedule; |
| 2 | 2 | |
| 3 | 3 | import com.bsth.entity.Line; |
| 4 | -import com.bsth.entity.sys.SysUser; | |
| 5 | 4 | |
| 6 | 5 | import javax.persistence.*; |
| 7 | 6 | import java.util.Date; |
| ... | ... | @@ -18,7 +17,7 @@ import java.util.Date; |
| 18 | 17 | @NamedAttributeNode("updateBy") |
| 19 | 18 | }) |
| 20 | 19 | }) |
| 21 | -public class TTInfo { | |
| 20 | +public class TTInfo extends BEntity { | |
| 22 | 21 | |
| 23 | 22 | /** 主键Id */ |
| 24 | 23 | @Id |
| ... | ... | @@ -50,9 +49,9 @@ public class TTInfo { |
| 50 | 49 | |
| 51 | 50 | // TODO:还有很多判定条件,这里先不放 |
| 52 | 51 | |
| 53 | - /** 路牌数 */ | |
| 52 | + /** 路牌数(这两个字段暂时不用) */ | |
| 54 | 53 | private int lpCount; |
| 55 | - /** 圈数 */ | |
| 54 | + /** 圈数(这两个字段暂时不倒) */ | |
| 56 | 55 | private int loopCount; |
| 57 | 56 | |
| 58 | 57 | // TODO:原系统里的分别在,圈后圈进场,意思不知道,再议 |
| ... | ... | @@ -62,19 +61,25 @@ public class TTInfo { |
| 62 | 61 | /** 特殊有效日期(格式:2001-01-01,多个用逗号隔开) */ |
| 63 | 62 | private String special_days; |
| 64 | 63 | |
| 65 | - /** 操作人员关联 */ | |
| 66 | - @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) | |
| 67 | - private SysUser createBy; | |
| 68 | - /** 更新人员关联 */ | |
| 69 | - @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) | |
| 70 | - private SysUser updateBy; | |
| 71 | - // 创建日期 | |
| 72 | - @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") | |
| 73 | - private Date createDate; | |
| 74 | - // 修改日期 | |
| 75 | - @Column(name = "update_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") | |
| 76 | - private Date updateDate; | |
| 77 | - | |
| 64 | + public TTInfo() {} | |
| 65 | + public TTInfo(Object id, Object xlid, Object name, Object nds, Object sds) { | |
| 66 | + if (id != null) { | |
| 67 | + this.id = Long.parseLong(id.toString()); | |
| 68 | + } | |
| 69 | + if (xlid != null) { | |
| 70 | + this.xl = new Line(); | |
| 71 | + this.xl.setId(Integer.valueOf(xlid.toString())); | |
| 72 | + } | |
| 73 | + if (name != null) { | |
| 74 | + this.name = String.valueOf(name); | |
| 75 | + } | |
| 76 | + if (nds != null) { | |
| 77 | + this.rule_days = String.valueOf(nds); | |
| 78 | + } | |
| 79 | + if (sds != null) { | |
| 80 | + this.special_days = String.valueOf(sds); | |
| 81 | + } | |
| 82 | + } | |
| 78 | 83 | |
| 79 | 84 | public Long getId() { |
| 80 | 85 | return id; |
| ... | ... | @@ -164,38 +169,6 @@ public class TTInfo { |
| 164 | 169 | this.special_days = special_days; |
| 165 | 170 | } |
| 166 | 171 | |
| 167 | - public SysUser getCreateBy() { | |
| 168 | - return createBy; | |
| 169 | - } | |
| 170 | - | |
| 171 | - public void setCreateBy(SysUser createBy) { | |
| 172 | - this.createBy = createBy; | |
| 173 | - } | |
| 174 | - | |
| 175 | - public SysUser getUpdateBy() { | |
| 176 | - return updateBy; | |
| 177 | - } | |
| 178 | - | |
| 179 | - public void setUpdateBy(SysUser updateBy) { | |
| 180 | - this.updateBy = updateBy; | |
| 181 | - } | |
| 182 | - | |
| 183 | - public Date getCreateDate() { | |
| 184 | - return createDate; | |
| 185 | - } | |
| 186 | - | |
| 187 | - public void setCreateDate(Date createDate) { | |
| 188 | - this.createDate = createDate; | |
| 189 | - } | |
| 190 | - | |
| 191 | - public Date getUpdateDate() { | |
| 192 | - return updateDate; | |
| 193 | - } | |
| 194 | - | |
| 195 | - public void setUpdateDate(Date updateDate) { | |
| 196 | - this.updateDate = updateDate; | |
| 197 | - } | |
| 198 | - | |
| 199 | 172 | public Boolean getIsCancel() { |
| 200 | 173 | return isCancel; |
| 201 | 174 | } | ... | ... |
src/main/java/com/bsth/entity/schedule/TTInfoDetail.java
| ... | ... | @@ -3,10 +3,8 @@ package com.bsth.entity.schedule; |
| 3 | 3 | import com.bsth.entity.CarPark; |
| 4 | 4 | import com.bsth.entity.Line; |
| 5 | 5 | import com.bsth.entity.Station; |
| 6 | -import com.bsth.entity.sys.SysUser; | |
| 7 | 6 | |
| 8 | 7 | import javax.persistence.*; |
| 9 | -import java.util.Date; | |
| 10 | 8 | |
| 11 | 9 | /** |
| 12 | 10 | * 时刻表明细 |
| ... | ... | @@ -23,7 +21,7 @@ import java.util.Date; |
| 23 | 21 | @NamedAttributeNode("tcc") |
| 24 | 22 | }) |
| 25 | 23 | }) |
| 26 | -public class TTInfoDetail { | |
| 24 | +public class TTInfoDetail extends BEntity { | |
| 27 | 25 | |
| 28 | 26 | /** 主健Id */ |
| 29 | 27 | @Id |
| ... | ... | @@ -85,20 +83,6 @@ public class TTInfoDetail { |
| 85 | 83 | /** 备注 */ |
| 86 | 84 | private String remark; |
| 87 | 85 | |
| 88 | - /** 创建人 */ | |
| 89 | - @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) | |
| 90 | - private SysUser createBy; | |
| 91 | - /** 修改人 */ | |
| 92 | - @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) | |
| 93 | - private SysUser updateBy; | |
| 94 | - | |
| 95 | - /** 创建日期 */ | |
| 96 | - @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") | |
| 97 | - private Date createDate; | |
| 98 | - /** 修改日期 */ | |
| 99 | - @Column(name = "update_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") | |
| 100 | - private Date updateDate; | |
| 101 | - | |
| 102 | 86 | public Long getId() { |
| 103 | 87 | return id; |
| 104 | 88 | } |
| ... | ... | @@ -235,38 +219,6 @@ public class TTInfoDetail { |
| 235 | 219 | this.remark = remark; |
| 236 | 220 | } |
| 237 | 221 | |
| 238 | - public SysUser getCreateBy() { | |
| 239 | - return createBy; | |
| 240 | - } | |
| 241 | - | |
| 242 | - public void setCreateBy(SysUser createBy) { | |
| 243 | - this.createBy = createBy; | |
| 244 | - } | |
| 245 | - | |
| 246 | - public SysUser getUpdateBy() { | |
| 247 | - return updateBy; | |
| 248 | - } | |
| 249 | - | |
| 250 | - public void setUpdateBy(SysUser updateBy) { | |
| 251 | - this.updateBy = updateBy; | |
| 252 | - } | |
| 253 | - | |
| 254 | - public Date getCreateDate() { | |
| 255 | - return createDate; | |
| 256 | - } | |
| 257 | - | |
| 258 | - public void setCreateDate(Date createDate) { | |
| 259 | - this.createDate = createDate; | |
| 260 | - } | |
| 261 | - | |
| 262 | - public Date getUpdateDate() { | |
| 263 | - return updateDate; | |
| 264 | - } | |
| 265 | - | |
| 266 | - public void setUpdateDate(Date updateDate) { | |
| 267 | - this.updateDate = updateDate; | |
| 268 | - } | |
| 269 | - | |
| 270 | 222 | public CarPark getTcc() { |
| 271 | 223 | return tcc; |
| 272 | 224 | } | ... | ... |
src/main/java/com/bsth/entity/schedule/rule/RerunRule.java
| 1 | 1 | package com.bsth.entity.schedule.rule; |
| 2 | 2 | |
| 3 | 3 | import com.bsth.entity.Line; |
| 4 | -import com.bsth.entity.schedule.CarConfigInfo; | |
| 5 | -import com.bsth.entity.schedule.EmployeeConfigInfo; | |
| 6 | -import com.bsth.entity.schedule.GuideboardInfo; | |
| 7 | -import com.bsth.entity.schedule.TTInfo; | |
| 8 | -import com.bsth.entity.sys.SysUser; | |
| 4 | +import com.bsth.entity.schedule.*; | |
| 9 | 5 | |
| 10 | 6 | import javax.persistence.*; |
| 11 | -import java.util.Date; | |
| 12 | 7 | |
| 13 | 8 | /** |
| 14 | 9 | * 套跑规则。 |
| ... | ... | @@ -41,7 +36,7 @@ import java.util.Date; |
| 41 | 36 | }) |
| 42 | 37 | |
| 43 | 38 | |
| 44 | -public class RerunRule { | |
| 39 | +public class RerunRule extends BEntity { | |
| 45 | 40 | /** 主键Id */ |
| 46 | 41 | @Id |
| 47 | 42 | @GeneratedValue |
| ... | ... | @@ -84,19 +79,6 @@ public class RerunRule { |
| 84 | 79 | @Column(nullable = false) |
| 85 | 80 | private Boolean isCancel = false; |
| 86 | 81 | |
| 87 | - /** 创建人 */ | |
| 88 | - @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) | |
| 89 | - private SysUser createBy; | |
| 90 | - /** 修改人 */ | |
| 91 | - @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) | |
| 92 | - private SysUser updateBy; | |
| 93 | - /** 创建日期 */ | |
| 94 | - @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") | |
| 95 | - private Date createDate; | |
| 96 | - /** 修改日期 */ | |
| 97 | - @Column(name = "update_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") | |
| 98 | - private Date updateDate; | |
| 99 | - | |
| 100 | 82 | public Long getId() { |
| 101 | 83 | return id; |
| 102 | 84 | } |
| ... | ... | @@ -177,34 +159,6 @@ public class RerunRule { |
| 177 | 159 | this.useEmployeeConfig = useEmployeeConfig; |
| 178 | 160 | } |
| 179 | 161 | |
| 180 | - public SysUser getCreateBy() { | |
| 181 | - return createBy; | |
| 182 | - } | |
| 183 | - | |
| 184 | - public void setCreateBy(SysUser createBy) { | |
| 185 | - this.createBy = createBy; | |
| 186 | - } | |
| 187 | - | |
| 188 | - public SysUser getUpdateBy() { | |
| 189 | - return updateBy; | |
| 190 | - } | |
| 191 | - | |
| 192 | - public void setUpdateBy(SysUser updateBy) { | |
| 193 | - this.updateBy = updateBy; | |
| 194 | - } | |
| 195 | - | |
| 196 | - public Date getCreateDate() { | |
| 197 | - return createDate; | |
| 198 | - } | |
| 199 | - | |
| 200 | - public void setCreateDate(Date createDate) { | |
| 201 | - this.createDate = createDate; | |
| 202 | - } | |
| 203 | - | |
| 204 | - public Date getUpdateDate() { | |
| 205 | - return updateDate; | |
| 206 | - } | |
| 207 | - | |
| 208 | 162 | public Boolean getIsCancel() { |
| 209 | 163 | return isCancel; |
| 210 | 164 | } |
| ... | ... | @@ -213,7 +167,4 @@ public class RerunRule { |
| 213 | 167 | this.isCancel = isCancel; |
| 214 | 168 | } |
| 215 | 169 | |
| 216 | - public void setUpdateDate(Date updateDate) { | |
| 217 | - this.updateDate = updateDate; | |
| 218 | - } | |
| 219 | 170 | } | ... | ... |
src/main/java/com/bsth/entity/sys/SysUser.java
| ... | ... | @@ -9,7 +9,7 @@ import java.util.Set; |
| 9 | 9 | |
| 10 | 10 | @Entity |
| 11 | 11 | @Table(name = "bsth_c_sys_user") |
| 12 | -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"}) | |
| 12 | +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) | |
| 13 | 13 | public class SysUser { |
| 14 | 14 | |
| 15 | 15 | @Id | ... | ... |
src/main/java/com/bsth/repository/realcontrol/ScheduleRealInfoRepository.java
| ... | ... | @@ -24,6 +24,9 @@ public interface ScheduleRealInfoRepository extends BaseRepository<ScheduleRealI |
| 24 | 24 | @Query(value="select min(s.id), s.jGh,s.clZbh,s.lpName,s.jName from ScheduleRealInfo s where s.xlBm = ?1 and DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?2 GROUP BY s.jGh,s.clZbh,s.lpName ,s.jName order by (lpName+1)") |
| 25 | 25 | List<ScheduleRealInfo> queryUserInfo2(String line,String date); |
| 26 | 26 | |
| 27 | + @Query(value="select min(s.id), s.jGh,s.clZbh,s.lpName,s.jName from ScheduleRealInfo s where s.xlBm = ?1 and DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?2 GROUP BY s.jGh,s.clZbh,s.lpName ,s.jName order by (lpName+1)") | |
| 28 | + List<ScheduleRealInfo> queryUserInfo3(String line,String date); | |
| 29 | + | |
| 27 | 30 | @Query(value="select s from ScheduleRealInfo s where s.jName = ?1 and s.clZbh = ?2 and s.lpName = ?3 order by bcs") |
| 28 | 31 | List<ScheduleRealInfo> exportWaybill(String jName,String clZbh,String lpName); |
| 29 | 32 | ... | ... |
src/main/java/com/bsth/service/BusIntervalService.java
| ... | ... | @@ -8,6 +8,8 @@ public interface BusIntervalService { |
| 8 | 8 | |
| 9 | 9 | List<Map<String, Object>> getDir(Map<String, Object> map); |
| 10 | 10 | |
| 11 | + List<Map<String, Object>> getLp(Map<String, Object> map); | |
| 12 | + | |
| 11 | 13 | List<Map<String, Object>> interval(Map<String, Object> map); |
| 12 | 14 | |
| 13 | 15 | Map<String, Object> timeAndSpeed(Map<String, Object> map); | ... | ... |
src/main/java/com/bsth/service/forms/FormsService.java
| ... | ... | @@ -30,7 +30,7 @@ public interface FormsService { |
| 30 | 30 | |
| 31 | 31 | public List<Singledata> singledata(Map<String, Object> map); |
| 32 | 32 | |
| 33 | - public List<Vehicleloading> vehicleloading(/*String gsdmVehic,String fgsdmVehic,*/String line,String data); | |
| 33 | + public List<Vehicleloading> vehicleloading(String gsdmVehic,String fgsdmVehic,String line,String data); | |
| 34 | 34 | |
| 35 | 35 | public List<Operationservice> operationservice(Map<String, Object> map); |
| 36 | 36 | ... | ... |