Commit 3c3735ee0e582e0d7607b402c3f5ffd5d7c821a4

Authored by 王通
1 parent 9c177a12

1.电子路单上传bug(最新依赖于版本),变量使用错误,修正

src/main/java/com/bsth/service/impl/TrafficManageServiceImpl.java
1   -package com.bsth.service.impl;
2   -
3   -import com.bsth.data.BasicData;
4   -import com.bsth.email.SendEmailController;
5   -import com.bsth.email.entity.EmailBean;
6   -import com.bsth.entity.*;
7   -import com.bsth.entity.realcontrol.ChildTaskPlan;
8   -import com.bsth.entity.realcontrol.ScheduleRealInfo;
9   -import com.bsth.entity.schedule.SchedulePlanInfo;
10   -import com.bsth.entity.schedule.TTInfo;
11   -import com.bsth.entity.schedule.TTInfoDetail;
12   -import com.bsth.entity.search.CustomerSpecs;
13   -import com.bsth.entity.sys.SysUser;
14   -import com.bsth.entity.traffic.SKBUploadLogger;
15   -import com.bsth.repository.*;
16   -import com.bsth.repository.realcontrol.ScheduleRealInfoRepository;
17   -import com.bsth.repository.schedule.*;
18   -import com.bsth.repository.traffic.SKBUploadLoggerRepository;
19   -import com.bsth.security.util.SecurityUtils;
20   -import com.bsth.service.TrafficManageService;
21   -import com.bsth.service.traffic.YgcBasicDataService;
22   -import com.bsth.util.TimeUtils;
23   -import com.bsth.util.db.DBUtils_MS;
24   -import com.bsth.webService.trafficManage.org.tempuri.Results;
25   -import com.bsth.webService.trafficManage.org.tempuri.WebServiceLocator;
26   -import com.bsth.webService.trafficManage.org.tempuri.WebServiceSoap;
27   -import org.apache.commons.lang.StringEscapeUtils;
28   -import org.apache.commons.lang.StringUtils;
29   -import org.apache.commons.lang.time.DateUtils;
30   -import org.joda.time.DateTime;
31   -import org.slf4j.Logger;
32   -import org.slf4j.LoggerFactory;
33   -import org.springframework.beans.factory.annotation.Autowired;
34   -import org.springframework.data.domain.Sort;
35   -import org.springframework.data.domain.Sort.Direction;
36   -import org.springframework.security.core.context.SecurityContextHolder;
37   -import org.springframework.stereotype.Service;
38   -
39   -import java.io.*;
40   -import java.net.InetAddress;
41   -import java.sql.Connection;
42   -import java.sql.PreparedStatement;
43   -import java.sql.ResultSet;
44   -import java.text.DecimalFormat;
45   -import java.text.SimpleDateFormat;
46   -import java.util.*;
47   -import java.util.regex.Matcher;
48   -import java.util.regex.Pattern;
49   -
50   -/**
51   - *
52   - * @ClassName: TrafficManageServiceImpl(运管处接口service业务层实现类)
53   - *
54   - * @Extends : BaseService
55   - *
56   - * @Description: TODO(运管处接口service业务层)
57   - *
58   - * @Author bsth@zq
59   - *
60   - * @Date 2016年10月28日 上午9:21:17
61   - *
62   - * @Version 公交调度系统BS版 0.1
63   - *
64   - */
65   -
66   -@Service
67   -public class TrafficManageServiceImpl implements TrafficManageService{
68   -
69   - Logger logger = LoggerFactory.getLogger(this.getClass());
70   - // 运管处上传日志类型
71   - public static final String UPLOAD_TYPE_SKB = "1";
72   - public static final String UPLOAD_TYPE_XL = "2";
73   - public static final String UPLOAD_TYPE_LD = "3";
74   -
75   - // 线路repository
76   - @Autowired
77   - private LineRepository lineRepository;
78   -
79   - @Autowired
80   - private LineInformationRepository lineInformationRepository;
81   -
82   - // 站点路由repository
83   - @Autowired
84   - private StationRouteRepository stationRouteRepository;
85   -
86   - // 历史站点路由repository
87   - @Autowired
88   - private LsStationRouteRepository lsStationRouteRepository;
89   -
90   - @Autowired
91   - private SectionRepository sectionRepository;
92   -
93   - // 车辆repository
94   - @Autowired
95   - private CarsRepository carsRepository;
96   -
97   - // 人员repository
98   - @Autowired
99   - private PersonnelRepository personnelRepository;
100   -
101   - // 时刻模板repository
102   - @Autowired
103   - private TTInfoRepository ttInfoRepository;
104   -
105   - // 时刻模板明细repository
106   - @Autowired
107   - private TTInfoDetailRepository ttInfoDetailRepository;
108   -
109   - // 排班计划明细repository
110   - @Autowired
111   - private SchedulePlanInfoRepository schedulePlanInfoRepository;
112   -
113   - // 实际排班计划明细repository
114   - @Autowired
115   - private ScheduleRealInfoRepository scheduleRealInfoRepository;
116   -
117   - // 时刻表上传记录repository
118   - @Autowired
119   - private SKBUploadLoggerRepository skbUploadLoggerRepository;
120   -
121   - // 线路站点repository
122   - @Autowired
123   - private YgcBasicDataService ygcBasicDataService;
124   -
125   - // 发送邮件
126   - @Autowired
127   - private SendEmailController sendEmailController;
128   -
129   - /**
130   - * 线路版本repository
131   - */
132   - @Autowired
133   - private LineVersionsRepository lineVersionsRepository;
134   -
135   - // 运管处上传接口
136   - private com.bsth.webService.trafficManage.up.org.tempuri.WebServiceSoap webServiceSoapUp;
137   - private WebServiceSoap ssop ;
138   - {
139   - try {
140   - ssop = new WebServiceLocator().getWebServiceSoap();
141   - } catch (Exception e) {
142   - e.printStackTrace();
143   - }
144   - }
145   - // 格式化 年月日时分秒 nyrsfm是年月日时分秒的拼音首字母
146   - private SimpleDateFormat sdfnyrsfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
147   -
148   - // 格式化 年月日
149   - private SimpleDateFormat sdfnyr = new SimpleDateFormat("yyyy-MM-dd");
150   -
151   - // 数字格式化
152   - DecimalFormat format = new DecimalFormat("0.00");
153   -
154   - // 用户名
155   - private final String userNameOther = "user";
156   - // 密码
157   - private final String passwordOther = "user";
158   -
159   - // 用户名
160   - private final String userNameUp = "user";
161   - // 密码
162   - private final String passwordUp = "user";
163   - // 接收邮件人
164   - private final String emailSendToAddress = "113252620@qq.com";
165   - // 记录路单上线的成功、失败线路数
166   - private Integer countSuccess,countFailure;
167   -
168   - private synchronized com.bsth.webService.trafficManage.up.org.tempuri.WebServiceSoap getWebServiceSoapUp(){
169   - try {
170   - if(webServiceSoapUp == null){
171   - webServiceSoapUp = new com.bsth.webService.trafficManage.up.org.tempuri.WebServiceLocator().getWebServiceSoap();
172   - }
173   - }catch (Exception e){
174   - e.printStackTrace();
175   - }finally {
176   - return webServiceSoapUp;
177   - }
178   - }
179   - /**
180   - * 上传线路信息
181   - */
182   - @Override
183   - public String setXL(String ids) {
184   - String result = "failure";
185   - String xml ;
186   - String[] idArray = ids.split(",");
187   - try {
188   - for (String id : idArray) {
189   - if(id == null || id.trim().equals("")){
190   - continue;
191   - }
192   - Map<String,Object> map = new HashMap<>();
193   - map.put("lineCode_eq", id);
194   - Line line ;
195   - LineInformation lineInformation;
196   - Optional<Line> optionalLine = lineRepository.findOne(new CustomerSpecs<Line>(map));
197   - line = optionalLine.isPresent() ? optionalLine.get() : null;
198   - if(line == null){
199   - continue;
200   - }
201   - if(BasicData.lineId2ShangHaiCodeMap.get(line.getId()) == null){
202   - return result;
203   - }
204   - map = new HashMap<>();
205   - map.put("line.id_eq",line.getId());
206   - Optional<LineInformation> optionalLineInformation = lineInformationRepository.findOne(new CustomerSpecs<LineInformation>(map));
207   - lineInformation = optionalLineInformation.isPresent() ? optionalLineInformation.get() : null;
208   - if(lineInformation == null){
209   - continue;
210   - }
211   - // 取得封装好的xml
212   - xml = getSetXlXml(line,lineInformation);
213   - // 站点序号不能为0,如果为0,则返回错误
214   - if(xml.indexOf("<ZDXH>0</ZDXH>") != -1){
215   - return "0";
216   - }
217   - String state;// 是否上传成功
218   - // 调用上传方法
219   - if(getWebServiceSoapUp().setXL(userNameUp,passwordUp,xml).isSuccess()){
220   - result = "success";
221   - state = "1";
222   - }else{
223   - result = "failure";
224   - state = "0";
225   - }
226   - logger.info("setXL:"+xml);
227   - logger.info("setXL:"+result);
228   - // 保存运管处上传记录
229   - saveYgcUploadLog(line,xml,TrafficManageServiceImpl.UPLOAD_TYPE_XL,state);
230   - }
231   - } catch (Exception e) {
232   - logger.error("setXL:",e);
233   - e.printStackTrace();
234   - }
235   - return result;
236   - }
237   -
238   - /**
239   - * 加载运管处的站点及序号
240   - * 上行从1开始,下行顺序续编
241   - */
242   - private Map<String, Integer> getStationName2YgcNumberMap (String lineCode){
243   - Map<String, Integer> resultMap = new HashMap<>();
244   - List<Map<String, String>> ygcLines = stationRouteRepository.findLineWithYgcByLine(lineCode);
245   - if(ygcLines != null && ygcLines.size() > 0){
246   - int size = ygcLines.size();
247   - Map<String, String> tempMap ;
248   - int num = 1;
249   - String key;
250   - for (int i = 0; i < size; i ++){
251   - tempMap = ygcLines.get(i);
252   - key = tempMap.get("lineCode") + "_"+String.valueOf(tempMap.get("directions"))
253   - + "_"+tempMap.get("stationCode")+ "_"+tempMap.get("stationMark");
254   - resultMap.put(key,num++);
255   - }
256   - }
257   - return resultMap;
258   - }
259   -
260   - /**
261   - * 上传线路信息(按in_use上传)
262   - */
263   - @Override
264   - public String setXLByInUse(String inUse) {
265   - StringBuffer result = new StringBuffer();
266   - try {
267   - Map<String,Object> map = new HashMap<>();
268   - if(inUse != null && inUse.equals("1")){
269   - map.put("inUse_eq", inUse);
270   - }
271   - List<Line> lines ;
272   - Line line;
273   - lines = lineRepository.findAll(new CustomerSpecs<Line>(map));
274   - if(lines != null && lines.size() > 0){
275   - for(int i = 0 ; i < lines.size() ; i ++){
276   - line = lines.get(i);
277   - if(line != null && line.getId() != null){
278   - result.append(line.getLineCode()).append(":").append(setXL(line.getLineCode())).append(";");
279   - }
280   - }
281   - }
282   - } catch (Exception e) {
283   - result.append("failure");
284   - logger.error("setXLByInUse:",e);
285   - e.printStackTrace();
286   - }
287   - return result.toString();
288   - }
289   -
290   - /**
291   - * 上传车辆信息
292   - */
293   - @Override
294   - public String setCL() {
295   - String result = "failure";
296   - StringBuffer sBuffer =new StringBuffer();
297   - try {
298   - sBuffer.append("<CLs>");
299   - Cars cars = null;
300   - String company;
301   - Iterator<Cars> carsIterator = carsRepository.findAll().iterator();
302   - while(carsIterator.hasNext()){
303   - cars = carsIterator.next();
304   - sBuffer.append("<CL>");
305   - company = cars.getCompany();
306   - setCompanyName(company);// 统一公司名称
307   - sBuffer.append("<GSJC>").append(company).append("</GSJC>");
308   - sBuffer.append("<NBH>").append(cars.getInsideCode()).append("</NBH>");
309   - sBuffer.append("<CPH>").append(cars.getCarPlate()).append("</CPH>");
310   - sBuffer.append("<YYZBH>").append(cars.getServiceNo()).append("</YYZBH>");
311   - sBuffer.append("<CZCPH>").append(cars.getCarPlate()).append("</CZCPH>");//******这个数据没有***********
312   - sBuffer.append("<CZZDBH>").append(cars.getEquipmentCode()).append("</CZZDBH>");
313   - sBuffer.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
314   - sBuffer.append("</CL>");
315   - }
316   - sBuffer.append("</CLs>");
317   - if(ssop.setCL(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
318   - result = "success";
319   - }
320   - } catch (Exception e) {
321   - logger.error("setCL:",e);
322   - e.printStackTrace();
323   - }finally{
324   - logger.info("setCL:"+sBuffer.toString());
325   - logger.info("setCL:"+result);
326   - }
327   - return result;
328   - }
329   -
330   - /**
331   - * 上传司机信息
332   - */
333   - @Override
334   - public String setSJ() {
335   - String result = "failure";
336   - StringBuffer sBuffer =new StringBuffer();
337   - try {
338   - sBuffer.append("<SJs>");
339   - Personnel personnel = null;
340   - String company;
341   - Iterator<Personnel> personIterator = personnelRepository.findAll().iterator();
342   - while(personIterator.hasNext()){
343   - personnel = personIterator.next();
344   - sBuffer.append("<SJ>");
345   - company = personnel.getCompany();
346   - setCompanyName(company);// 统一公司名称
347   - sBuffer.append("<GSJC>").append(company).append("</GSJC>");
348   - sBuffer.append("<SJGH>").append(personnel.getJobCode()).append("</SJGH>");
349   - sBuffer.append("<CYZGZH>").append(personnel.getPapersCode()).append("</CYZGZH>");//***********
350   - sBuffer.append("<XM>").append(personnel.getPersonnelName()).append("</XM>");
351   - sBuffer.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
352   - sBuffer.append("</SJ>");
353   - }
354   - sBuffer.append("</SJs>");
355   - if(ssop.setSJ(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
356   - result = "success";
357   - };
358   - } catch (Exception e) {
359   - logger.error("setSJ:",e);
360   - e.printStackTrace();
361   - }finally{
362   - logger.info("setSJ:"+sBuffer.toString());
363   - logger.info("setSJ:"+result);
364   - }
365   - return result;
366   - }
367   -
368   - /**
369   - * 上传路单 指定日期 yyyy-MM-dd
370   - * @param theDate
371   - * @return
372   - */
373   - public String setLD(String theDate){
374   - return uploadLD(theDate);
375   - }
376   -
377   - /**
378   - * 上传路单 上传前一天的路单
379   - * @return
380   - */
381   - public String setLD(){
382   - return uploadLD(null);
383   - }
384   - /**
385   - * 上传路单
386   - * @return 上传成功标识
387   - */
388   - private String uploadLD(String theDate){
389   - // 取昨天 的日期
390   - String date = theDate == null ?sdfnyr.format(DateUtils.addDays(new Date(), -1)) : theDate;
391   - StringBuffer sf = new StringBuffer();
392   - Results results = null;
393   - String str = "", xlbm = null, oldXlbm = null;
394   - List<Map<String,Object>> listGroup = null;
395   - int scount = 0, ccount = 0;
396   - long start = System.currentTimeMillis();
397   - try {
398   - // 计数器
399   - int counter = 0;
400   - // 每几条线路上传一次路单
401   - int per = 10;
402   - List<ScheduleRealInfo> list = scheduleRealInfoRepository.setLD(date);
403   - listGroup = scheduleRealInfoRepository.setLDGroup(date);
404   - Map<String,Object> map = new HashMap();
405   - HashMap<String,String> paramMap;
406   - HashMap<String,String> otherMap = new HashMap();
407   -
408   - // 车辆内部编码和车牌做映射
409   - Map<String, String> inside2plate = new HashMap<>();
410   - Iterable<Cars> cars = carsRepository.findAll();
411   - for (Cars car : cars) {
412   - inside2plate.put(car.getInsideCode(), car.getCarPlate());
413   - }
414   -
415   - // 线路编码和线路信息映射
416   - Map<String, Line> code2line = new HashMap<>();
417   - Iterable<Line> lines = lineRepository.findAll();
418   - for (Line line : lines) {
419   - code2line.put(line.getLineCode(), line);
420   - }
421   -
422   - // 线路编码和线路版本映射(电子路单日期)
423   - Map<String, Integer> code2version = new HashMap<>();
424   - Iterable<LineVersions> versions = lineVersionsRepository.findLineVersionsByDate((int)(DateTime.parse(theDate).getMillis() / 1000));
425   - for (LineVersions version : versions) {
426   - code2version.put(version.getLineCode(), version.getVersions());
427   - }
428   -
429   - Map<String, Integer> stationNumMap = null;
430   - for(Map<String,Object> schRealInfo:listGroup){
431   - if(schRealInfo != null){
432   - // 获取线路是否使用标识,如果未使用,则不查该线路数据
433   - String lineCode = schRealInfo.get("xlBm")+"";
434   - Line line = code2line.get(lineCode);
435   - if(line == null || line.getInUse() == null || line.getInUse() == 0){
436   - ccount++;
437   - continue;
438   - }
439   - if(counter % per == 0){
440   - sf = new StringBuffer();
441   - sf.append("<DLDS>");
442   - }
443   - counter ++;
444   - xlbm = BasicData.lineCode2ShangHaiCodeMap.get(lineCode);
445   - if (!xlbm.equals(oldXlbm)) {
446   - oldXlbm = xlbm;
447   - Integer ver = code2version.get(lineCode);
448   - if (ver != null) {
449   - stationNumMap = getLsStationRoute(lineCode, ver);
450   - }
451   - }
452   -
453   - sf.append("<DLD>");
454   - sf.append("<RQ>").append(date).append("</RQ>");
455   - sf.append("<XLBM>").append(xlbm).append("</XLBM>");
456   - sf.append("<LPBH>").append(schRealInfo.get("lpName")).append("</LPBH>");
457   - sf.append("<CPH>").append(inside2plate.get(schRealInfo.get("clZbh"))).append("</CPH>");
458   - sf.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
459   - sf.append("<LDList>");
460   - for(ScheduleRealInfo scheduleRealInfo:list){
461   - if((schRealInfo.get("xlBm")+"").equals(scheduleRealInfo.getXlBm()) && (schRealInfo.get("lpName")+"")
462   - .equals(scheduleRealInfo.getLpName())
463   - && (schRealInfo.get("clZbh")+"").equals(scheduleRealInfo.getClZbh())){
464   -
465   - if(scheduleRealInfo.isDestroy()){
466   - if(scheduleRealInfo.isReissue()){
467   - scheduleRealInfo.setFcsjActualAll(scheduleRealInfo.getDfsj());
468   - scheduleRealInfo.setZdsjActualAll(scheduleRealInfo.getZdsj());
469   - }
470   - else
471   - continue;
472   - }
473   -
474   - if(scheduleRealInfo.getBcType().equals("in")
475   - || scheduleRealInfo.getBcType().equals("out")){
476   - continue;
477   - }
478   -
479   - sf.append("<LD>");
480   - sf.append("<SJGH>").append(scheduleRealInfo.getjGh()).append("</SJGH>");
481   - sf.append("<SXX>").append(scheduleRealInfo.getXlDir()).append("</SXX>");
482   - sf.append("<FCZDMC>").append(scheduleRealInfo.getQdzName()).append("</FCZDMC>");
483   - // 起点站的参数
484   - otherMap.put("stationMark","B");
485   - paramMap = packageYgcStationNumParam(scheduleRealInfo,otherMap);
486   - sf.append("<FCZDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,stationNumMap)).append("</FCZDXH>");
487   - sf.append("<FCZDBM>").append(scheduleRealInfo.getQdzCode()).append("</FCZDBM>");
488   - sf.append("<JHFCSJ>").append(scheduleRealInfo.getFcsj()).append("</JHFCSJ>");
489   - sf.append("<DFSJ>").append(scheduleRealInfo.getDfsj()).append("</DFSJ>");
490   - sf.append("<SJFCSJ>").append(scheduleRealInfo.getFcsjActual()).append("</SJFCSJ>");
491   - sf.append("<FCZDLX></FCZDLX>");
492   - sf.append("<DDZDMC>").append(scheduleRealInfo.getZdzName()).append("</DDZDMC>");
493   - // 终点站的参数
494   - otherMap.put("stationMark","E");
495   - paramMap = packageYgcStationNumParam(scheduleRealInfo,otherMap);
496   - sf.append("<DDZDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,stationNumMap)).append("</DDZDXH>");
497   - sf.append("<DDZDBM>").append(scheduleRealInfo.getZdzCode()).append("</DDZDBM>");
498   - sf.append("<JHDDSJ>").append(scheduleRealInfo.getZdsj()).append("</JHDDSJ>");
499   - sf.append("<SJDDSJ>").append(scheduleRealInfo.getZdsjActual()).append("</SJDDSJ>");
500   - sf.append("<DDZDLX></DDZDLX>");
501   - sf.append("<LDSCBZ>0</LDSCBZ>");
502   - sf.append("<DDBZ>").append(scheduleRealInfo.getRemarks()).append("</DDBZ>");
503   - sf.append("</LD>");
504   - }
505   - }
506   - sf.append("</LDList>");
507   - sf.append("</DLD>");
508   - }
509   - if(counter % per == per - 1){
510   - sf.append("</DLDS>");
511   - // 去掉'号
512   - str = sf.toString().replace("'","");
513   - scount += invokeSetLD(str, counter);
514   - counter = 0;
515   - }
516   - }
517   - // 每per条线路上传后剩下的数据再上传
518   - if(counter > 0){
519   - sf.append("</DLDS>");
520   - // 去掉'号
521   - str = sf.toString().replace("'","");
522   - scount += invokeSetLD(str, counter);
523   - }
524   - } catch (Exception e) {
525   - e.printStackTrace();
526   - logger.error("setLD:", e);
527   - } finally {
528   - try {
529   - //发送邮件
530   - EmailBean mail = new EmailBean();
531   - mail.setSubject(InetAddress.getLocalHost().getHostAddress()+":路单日志数据"+date);
532   - mail.setContent("总数:" + (listGroup == null ? 0 : listGroup.size()) + "<br/>成功数:" + scount + "<br/>跳过数:" + ccount + "<br/>耗时:" + (System.currentTimeMillis() - start));
533   - sendEmailController.sendMail(emailSendToAddress, mail);
534   - logger.info("setLD-sendMail:邮件发送成功!");
535   - } catch (Exception e) {
536   - e.printStackTrace();
537   - logger.error("setLD-sendMail:",e);
538   - }
539   - }
540   - return "success";
541   - }
542   -
543   - /**
544   - * 调用运管处电子路单接口,如果上传失败或有网络问题,最多执行10次
545   - * @param xml 拼接的xml字符串
546   - * @param counter 分组数
547   - * @return 成功返回counter 失败返回0
548   - */
549   - private int invokeSetLD(String xml, int counter) {
550   - for (int i = 0;i < 10;i++) {
551   - try {
552   - Results results = ssop.setLD(userNameOther, passwordOther, StringEscapeUtils.unescapeHtml(xml));
553   - if (results.isSuccess()) {
554   - logger.info("setLD: " + xml);
555   - logger.info("setLD: 成功");
556   - return counter;
557   - }
558   - Thread.sleep(2000);
559   - } catch (Exception e) {
560   - logger.error("运管处接口调用异常", e);
561   - try {
562   - Thread.sleep(2000);
563   - } catch (InterruptedException ex) {
564   - ex.printStackTrace();
565   - }
566   - }
567   - }
568   -
569   - return 0;
570   - }
571   -
572   - /**
573   - * 上传路单 xml来自文件
574   - * @return 上传成功标识
575   - */
576   - public String setLDFile(){
577   - String result = "failure";
578   - try {
579   - String tmp = readXmlFromFile("E:/ld.txt");
580   - Results rss = ssop.setLD(userNameOther, passwordOther, StringEscapeUtils.unescapeHtml(tmp));
581   - if(rss.isSuccess()){
582   - result = "success";
583   - }
584   - } catch (Exception e) {
585   - logger.error("setLD:",e);
586   - e.printStackTrace();
587   - }finally{
588   -
589   - }
590   - return result;
591   - }
592   -
593   - /**
594   - * 从文件中读取xml
595   - * @param fileName 例:D:/test.txt
596   - * @return
597   - * @throws Exception
598   - */
599   - private String readXmlFromFile(String fileName) throws Exception {
600   - StringBuffer sf = new StringBuffer("");
601   - File file = new File(fileName);
602   - InputStreamReader reader = new InputStreamReader(new FileInputStream(file),"GBK");
603   - BufferedReader bufferedReader = new BufferedReader(reader);
604   - String lineTxt = "";
605   - while((lineTxt = bufferedReader.readLine()) != null){
606   - sf.append(lineTxt);
607   - }
608   - reader.close();
609   - return sf.toString().replaceAll("\t","");
610   - }
611   - /**
612   - * 上传里程油耗
613   - * @return 上传成功标识
614   - */
615   - public String setLCYH(){
616   - String result = "failure";
617   - // 取昨天 的日期
618   - String date = sdfnyr.format(DateUtils.addDays(new Date(), -1));
619   - StringBuffer sf = new StringBuffer();
620   - try {
621   - sf.append("<LCYHS>");
622   - List<Map<String,Object>> listGroup = scheduleRealInfoRepository.setLCYHGroup(date);
623   - List<ScheduleRealInfo> list = scheduleRealInfoRepository.findByDate(date);
624   - Map<String,Object> map = new HashMap<String,Object>();
625   - for(Map<String,Object> schRealInfo:listGroup){
626   - if(schRealInfo != null){
627   - map.put("insideCode_eq", schRealInfo.get("clZbh")+"");
628   - Optional<Cars> optionalCars = carsRepository.findOne(new CustomerSpecs<Cars>(map));
629   - Cars car = optionalCars.isPresent() ? optionalCars.get() : null;
630   - /**
631   - * 如果car==null,则说明该车辆是从线调中换车功能中加进去的,
632   - * 在cars基础信息中查不到车辆的信息,所以忽略该车辆
633   - */
634   - if(car == null){
635   - continue;
636   - }
637   - //计算总公里和空驶公里,营运公里=总公里-空驶公里
638   - double totalKilometers = 0,emptyKilometers =0;
639   - sf.append("<LCYH>");
640   - sf.append("<RQ>"+date+"</RQ>");
641   - sf.append("<XLBM>"+BasicData.lineCode2ShangHaiCodeMap.get(schRealInfo.get("xlBm"))+"</XLBM>");
642   - sf.append("<CPH>"+car.getCarPlate()+"</CPH>");
643   - if(list != null && list.size() > 0){
644   - for(ScheduleRealInfo scheduleRealInfo:list){
645   - if((schRealInfo.get("xlBm")+"").equals(scheduleRealInfo.getXlBm()) && (schRealInfo.get("clZbh")+"")
646   - .equals(scheduleRealInfo.getClZbh())){
647   - Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
648   - //如果没有子任务,里程就是已执行(Status=2);有子任务的,忽略主任务,子任务的烂班
649   - if(childTaskPlans.isEmpty()){
650   - if(scheduleRealInfo.getStatus() == 2){
651   - totalKilometers += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();
652   - if(scheduleRealInfo.getBcType().equals("in") || scheduleRealInfo.getBcType().equals("out")
653   - || scheduleRealInfo.getBcType().equals("venting")){
654   - emptyKilometers += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();
655   - }
656   - }
657   - }else{
658   - Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
659   - while(it.hasNext()){
660   - ChildTaskPlan childTaskPlan = it.next();
661   - if(!childTaskPlan.isDestroy()){
662   - totalKilometers += childTaskPlan.getMileage()==null?0.0:childTaskPlan.getMileage();
663   - if(childTaskPlan.getMileageType().equals("empty")){
664   - emptyKilometers += childTaskPlan.getMileage()==null?0.0:childTaskPlan.getMileage();;
665   - }
666   - }
667   - }
668   - }
669   - }
670   - }
671   - }
672   - sf.append("<ZLC>"+totalKilometers+"</ZLC>");
673   - sf.append("<YYLC>"+emptyKilometers+"</YYLC>");
674   - sf.append("<YH>"+""+"</YH>");
675   - sf.append("<JZYL>"+""+"</JZYL>");
676   - sf.append("<DH>"+""+"</DH>");
677   - sf.append("<UPDT>"+sdfnyrsfm.format(new Date())+"</UPDT>");
678   - sf.append("<BBSCBZ>"+0+"</BBSCBZ>");
679   - sf.append("</LCYH>");
680   - }
681   - }
682   - sf.append("</LCYHS>");
683   - if(ssop.setLCYH(userNameOther, passwordOther, sf.toString()).isSuccess()){
684   - result = "success";
685   - }
686   - } catch (Exception e) {
687   - logger.error("setLCYH:",e);
688   - e.printStackTrace();
689   - }finally{
690   - logger.info("setLCYH:"+sf.toString());
691   - logger.info("setLCYH:"+result);
692   - }
693   - return result;
694   - }
695   -
696   - /**
697   - * 上传线路调度日报
698   - * @return
699   - */
700   - public String setDDRB(){
701   - String result = "failure";
702   - // 取昨天 的日期
703   - String date = sdfnyr.format(DateUtils.addDays(new Date(), -1));
704   - StringBuffer sf = new StringBuffer();
705   - try {
706   - sf.append("<DDRBS>");
707   - List<Map<String,Object>> listGroup = scheduleRealInfoRepository.setDDRBGroup(date);
708   - List<ScheduleRealInfo> list = scheduleRealInfoRepository.findByDate(date);
709   - for(Map<String,Object> schRealInfo:listGroup){
710   - if(schRealInfo != null){
711   - double jhlc = 0,zlc = 0,jhkslc = 0,sjkslc = 0;
712   - int jhbc = 0,sjbc = 0,jhzgfbc = 0,sjzgfbc = 0,jhwgfbc = 0,sjwgfbc = 0;
713   - sf.append("<DDRB>");
714   - sf.append("<RQ>"+date+"</RQ>");
715   - sf.append("<XLBM>"+BasicData.lineCode2ShangHaiCodeMap.get(schRealInfo.get("xlBm"))+"</XLBM>");
716   - for(ScheduleRealInfo scheduleRealInfo:list){
717   - if(scheduleRealInfo != null){
718   - if((schRealInfo.get("xlBm")+"").equals(scheduleRealInfo.getXlBm())){
719   - //计划
720   - if(!scheduleRealInfo.isSflj()){
721   - jhlc += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();
722   - //计划空驶
723   - if(scheduleRealInfo.getBcType().equals("in") || scheduleRealInfo.getBcType().equals("out")){
724   - jhkslc += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();
725   - }
726   - //计划早高峰,计划晚高峰
727   - if(TimeUtils.morningPeak(scheduleRealInfo.getFcsj())){
728   - jhzgfbc++;
729   - } else if(TimeUtils.evenignPeak(scheduleRealInfo.getFcsj())){
730   - jhwgfbc++;
731   - }
732   - }
733   - jhbc++;
734   -
735   - //实际
736   - Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
737   - //如果没有子任务,里程就是已执行(Status=2);有子任务的,忽略主任务,子任务的烂班
738   - if(childTaskPlans.isEmpty()){
739   - if(scheduleRealInfo.getStatus() == 2){
740   - sjbc++;
741   - zlc += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();
742   - if(scheduleRealInfo.getBcType().equals("in") || scheduleRealInfo.getBcType().equals("out")
743   - || scheduleRealInfo.getBcType().equals("venting")){
744   - sjkslc += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();;
745   - }
746   - }
747   - }else{
748   - sjbc++;
749   - Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
750   - while(it.hasNext()){
751   - ChildTaskPlan childTaskPlan = it.next();
752   - if(!childTaskPlan.isDestroy()){
753   - zlc += childTaskPlan.getMileage()==null?0.0:childTaskPlan.getMileage();
754   - if(childTaskPlan.getMileageType().equals("empty")){
755   - sjkslc += childTaskPlan.getMileage()==null?0.0:childTaskPlan.getMileage();;
756   - }
757   - }
758   - }
759   - }
760   - //实际早高峰,计划晚高峰
761   - if(scheduleRealInfo.getFcsjActual() != null){
762   - if(TimeUtils.morningPeak(scheduleRealInfo.getFcsj())){
763   - sjzgfbc++;
764   - } else if(TimeUtils.evenignPeak(scheduleRealInfo.getFcsj())){
765   - sjwgfbc++;
766   - }
767   - }
768   - }
769   - }
770   - }
771   - sf.append("<JHLC>"+format.format(jhlc)+"</JHLC>");
772   - sf.append("<SSLC>"+format.format((zlc-sjkslc))+"</SSLC>");
773   - sf.append("<JHKSLC>"+format.format(jhkslc)+"</JHKSLC>");
774   - sf.append("<SJKSLC>"+format.format(sjkslc)+"</SJKSLC>");
775   - sf.append("<JHBC>"+jhbc+"</JHBC>");
776   - sf.append("<SJBC>"+sjbc+"</SJBC>");
777   - sf.append("<JHZGFBC>"+jhzgfbc+"</JHZGFBC>");
778   - sf.append("<SJZGFBC>"+sjzgfbc+"</SJZGFBC>");
779   - sf.append("<JHWGFBC>"+jhwgfbc+"</JHWGFBC>");
780   - sf.append("<SJWGFBC>"+sjwgfbc+"</SJWGFBC>");
781   - sf.append("<UPDT>"+sdfnyrsfm.format(new Date())+"</UPDT>");
782   - sf.append("<RBSCBZ>"+0+"</RBSCBZ>");
783   - sf.append("</DDRB>");
784   - }
785   - }
786   - sf.append("</DDRBS>");
787   - if(ssop.setDDRB(userNameOther, passwordOther, sf.toString()).isSuccess()){
788   - result = "success";
789   - }
790   - } catch (Exception e) {
791   - logger.error("setDDRB:",e);
792   - e.printStackTrace();
793   - }finally{
794   - logger.info("setDDRB:"+sf.toString());
795   - logger.info("setDDRB:"+result);
796   - }
797   - return result;
798   - }
799   -
800   - /**
801   - * 上传计划班次 指定日期 yyyy-MM-dd
802   - * @param theDate
803   - * @return
804   - */
805   - public String setJHBC(String theDate){
806   - return uploadJHBC(theDate);
807   - }
808   -
809   - /**
810   - * 上传计划班次
811   - * @return
812   - */
813   - public String setJHBC(){
814   - return uploadJHBC(null);
815   - }
816   - /**
817   - * 上传线路计划班次表
818   - */
819   -
820   - private String uploadJHBC(String theDate) {
821   - String result = "failure";
822   - Line line;
823   - StringBuffer sBuffer =new StringBuffer();
824   - try {
825   - sBuffer.append("<JHBCs>");
826   - // 声明变量
827   - SchedulePlanInfo schedulePlanInfo;
828   - String xlbm,zbh = "";
829   - Long lp = 0L;
830   - // 取得计划班次时间
831   - String tomorrow = theDate == null ? sdfnyr.format(DateUtils.addDays(new Date(), +1)) : theDate;
832   - // 查询所有班次
833   - List<SchedulePlanInfo> schedulePlanList = schedulePlanInfoRepository.findLineScheduleBc(tomorrow);
834   - int j = 0; // 初始化标识
835   - if(schedulePlanList != null ){
836   - HashMap<String,String> paramMap;
837   - HashMap<String,String> otherMap = new HashMap<String, String>();
838   - int size = schedulePlanList.size();
839   - for (int i = 0; i < size; i++) {
840   - schedulePlanInfo = schedulePlanList.get(i);
841   - xlbm = schedulePlanInfo.getXlBm();
842   - // 获取线路是否使用标识,如果未使用,则不查该线路数据
843   - line = lineRepository.findByLineCode(xlbm);
844   - if(line.getInUse() == null || line.getInUse() == 0){
845   - continue;
846   - }
847   - if(++j == 1){// 第一次,则初始化值
848   - zbh = schedulePlanInfo.getClZbh();
849   - lp = schedulePlanInfo.getLp();
850   - // 拼装XML
851   - assembleJHBC(sBuffer, schedulePlanInfo, xlbm, zbh, lp);
852   - }
853   - // 比较是否为同一条线路同一辆车
854   - if(xlbm.equals(schedulePlanInfo.getXlBm())
855   - && zbh.equals(schedulePlanInfo.getClZbh())
856   - && lp == schedulePlanInfo.getLp()){
857   - if(schedulePlanInfo.getBcType().equals("in") || schedulePlanInfo.getBcType().equals("out")){
858   - continue;
859   - }
860   - sBuffer.append("<BC>");
861   - sBuffer.append("<SJGH>").append(schedulePlanInfo.getjGh()).append("</SJGH>");
862   - sBuffer.append("<SXX>").append(schedulePlanInfo.getXlDir()).append("</SXX>");
863   - sBuffer.append("<FCZDMC>").append(schedulePlanInfo.getQdzName()).append("</FCZDMC>");
864   - // 起点站的参数
865   - otherMap.put("stationMark","B");
866   - paramMap = packageYgcStationNumParam(schedulePlanInfo,otherMap);
867   - sBuffer.append("<ZDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,null)).append("</ZDXH>");
868   - sBuffer.append("<JHFCSJ>").append(schedulePlanInfo.getFcsj()).append("</JHFCSJ>");
869   - sBuffer.append("<DDZDMC>").append(schedulePlanInfo.getZdzName()).append("</DDZDMC>");
870   - // 起点站的参数
871   - otherMap.put("stationMark","E");
872   - paramMap = packageYgcStationNumParam(schedulePlanInfo,otherMap);
873   - sBuffer.append("<DDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,null)).append("</DDXH>");
874   - sBuffer.append("<JHDDSJ>").append(calcDdsj(schedulePlanInfo.getFcsj(),schedulePlanInfo.getBcsj()))
875   - .append("</JHDDSJ>");
876   - sBuffer.append("</BC>");
877   - if(i == size -1 ){
878   - sBuffer.append("</BCList>");
879   - sBuffer.append("</JHBC>");
880   - }
881   - }else{
882   - zbh = schedulePlanInfo.getClZbh();
883   - lp = schedulePlanInfo.getLp();
884   - sBuffer.append("</BCList>");
885   - sBuffer.append("</JHBC>");
886   - // 拼装XML
887   - assembleJHBC(sBuffer, schedulePlanInfo, xlbm, zbh, lp);
888   - }
889   - }
890   - }
891   - // 判断XML是否以</BCList>结尾,如果不是,则加上
892   - String regex = "^*</JHBC>$";
893   - Pattern p = Pattern.compile(regex);
894   - Matcher m = p.matcher(sBuffer);
895   - boolean isEndWithTrueFlag = false;
896   - while (m.find()) {
897   - isEndWithTrueFlag = true;
898   - }
899   - // 加上缺失的标签
900   - if(!isEndWithTrueFlag){
901   - sBuffer.append("</BCList>");
902   - sBuffer.append("</JHBC>");
903   - }
904   - sBuffer.append("</JHBCs>");
905   - if(ssop.setJHBC(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
906   - result = "success";
907   - }
908   - } catch (Exception e) {
909   - logger.error("setJHBC:",e);
910   - e.printStackTrace();
911   - }finally{
912   - logger.info("setJHBC:"+sBuffer.toString());
913   - logger.info("setJHBC:"+result);
914   - }
915   - return result;
916   - }
917   -
918   - /**
919   - * 上传线路班次时刻表数据
920   - */
921   - @Override
922   - public String setSKB(String ids) {
923   - String result = "上传失败,";
924   - StringBuffer sBuffer = new StringBuffer("<SKBs>");
925   - DecimalFormat df = new DecimalFormat("######0.000");
926   - Map<String,String> lsStationCode2NameMap = null;
927   - Map<String, Integer> lsStationName2YgcNumber = null;
928   - try {
929   - String[] idArray = ids.split(",");
930   - StringBuffer sBufferA ,sBufferB ,sBufferC ;
931   - double zlc,yylc,singleLc,emptyLc;// 总里程、营运里程、单程、空放里程
932   - String bcType,sxx;// 班次类型、上下行
933   - // 上传的时刻表集合
934   - List<TTInfo> ttinfoList = new ArrayList<>();
935   - TTInfo ttInfo;
936   - TTInfoDetail ttInfoDetail;
937   - LineInformation lineInformation;
938   - Iterator<TTInfoDetail> ttInfoDetailIterator;
939   - HashMap<String,Object> param ;
940   - HashMap<String,String> paramMap;
941   - HashMap<String,String> otherMap = new HashMap<>();
942   - // 线路编码、周几执行、发车站点名称、发车站点序号、到达站点名称、到达站点序号
943   - String xlbm,zjzx,fczdmc,zdxh,ddzdmc,ddxh;
944   - // 得到时刻表版本号
945   - int lineVersion;
946   - long ttinfoId;
947   - // 是否输出站点信息
948   - boolean isLogStation;
949   - for (int i = 0; i < idArray.length; i++) {
950   - ttinfoId = Long.valueOf(idArray[i]);
951   - Optional<TTInfo> optionalTTInfo = ttInfoRepository.findById(ttinfoId);
952   - ttInfo = optionalTTInfo.isPresent() ? optionalTTInfo.get() : null;
953   - if(ttInfo == null)
954   - continue;
955   - ttinfoList.add(ttInfo); // 保存时刻表
956   - // 得到时刻表版本号
957   - lineVersion = ttInfo.getLineVersion();
958   - // 查询历史站点路由
959   - lsStationCode2NameMap = getLsStationCode(ttInfo.getXl().getLineCode(),lineVersion);
960   - // 查询历史站点路由
961   - lsStationName2YgcNumber = getLsStationRoute(ttInfo.getXl().getLineCode(),lineVersion);
962   - zlc = 0.0f;
963   - yylc = 0.0f;
964   - // 获得时刻表
965   - param = new HashMap();
966   - param.put("ttinfo.id_eq", ttInfo.getId());
967   - ttInfoDetailIterator = ttInfoDetailRepository.findAll(new CustomerSpecs<TTInfoDetail>(param),
968   - new Sort(Direction.ASC, "xlDir")).iterator();
969   - // 获得lineInformation
970   - param = new HashMap();
971   - param.put("line.id_eq", ttInfo.getXl().getId());
972   - Optional<LineInformation> optionalLineInformation = lineInformationRepository.findOne(new CustomerSpecs<LineInformation>(param));
973   - lineInformation = optionalLineInformation.isPresent() ? optionalLineInformation.get() : null;
974   - // 初始化
975   - isLogStation = true;
976   - if(ttInfoDetailIterator.hasNext()){
977   - // 得到线路信息
978   - Optional<Line> optionalLine = lineRepository.findById(ttInfo.getXl().getId());
979   - Line line = optionalLine.isPresent() ? optionalLine.get() : null;
980   - if(line == null){
981   - result += "未找到相应的线路信息,请设置线路信息后再上传";
982   - return result;
983   - }
984   - // 得到上海市线路编码
985   - xlbm = line.getShanghaiLinecode();
986   - if("".equals(xlbm) || "null".equals(xlbm)){
987   - result += "线路编码为空,请设置线路编码后再上传";
988   - return result;
989   - }
990   - // 拿到周几执行
991   - zjzx = changeRuleDay(ttInfo.getRule_days());
992   - if("".equals(zjzx) || "null".equals(zjzx)){
993   - result += "时刻表执行时间为空,请设置执行时间后再上传";
994   - return result;
995   - }
996   - sBuffer.append("<SKB>");
997   - sBuffer.append("<XLBM>").append(xlbm).append("</XLBM>");
998   - sBufferB = new StringBuffer();
999   - sBufferC = new StringBuffer();
1000   - sBufferB.append("<KSRQ>").append(sdfnyr.format(ttInfo.getQyrq())).append("</KSRQ>");
1001   - // 结束日期暂时不要,节假日的班次表才需要,如春节的班次表
1002   - sBufferB.append("<JSRQ>").append("").append("</JSRQ>");
1003   - sBufferB.append("<ZJZX>").append(zjzx).append("</ZJZX>");
1004   - sBufferB.append("<TBYY>").append("").append("</TBYY>");
1005   - sBufferB.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
1006   - sBufferB.append("<BCList>");
1007   - while (ttInfoDetailIterator.hasNext()) {
1008   - ttInfoDetail = ttInfoDetailIterator.next();
1009   - bcType = ttInfoDetail.getBcType();
1010   - sxx = ttInfoDetail.getXlDir();
1011   - // 进出场班次的里程,加入总里程
1012   - if(bcType.equals("in") || bcType.equals("out")){
1013   - // 进出班次的计划里程,算空驶里程
1014   - emptyLc = ttInfoDetail.getJhlc();
1015   - // 总里程需要加上空驶里程
1016   - zlc += emptyLc;
1017   - continue;
1018   - }
1019   - // 不是正常班次,不传到运管处
1020   - if(!bcType.equals("normal")){
1021   - continue;
1022   - }
1023   - // 如果发车时间格式错误,忽略此条
1024   - if(changeTimeFormat(ttInfoDetail) == null){
1025   - continue;
1026   - }
1027   - // 发生站点名称
1028   - fczdmc = lsStationCode2NameMap.get(ttInfoDetail.getXl().getLineCode()+"_"+ttInfoDetail.getXlDir()+"_"+ttInfoDetail.getQdzCode());
1029   - if("".equals(fczdmc) || "null".equals(fczdmc)){
1030   - result += "发车站点名称为空,请根据时刻表当前的版本号设置好历史站点路由再上传";
1031   - return result;
1032   - }
1033   - sBufferC.append("<BC>");
1034   - sBufferC.append("<LPBH>").append(ttInfoDetail.getLp().getLpNo()).append("</LPBH>");
1035   - sBufferC.append("<SXX>").append(sxx).append("</SXX>");
1036   - sBufferC.append("<FCZDMC>").append(fczdmc).append("</FCZDMC>");
1037   - // 起点站的参数
1038   - otherMap.put("stationMark","B");
1039   - paramMap = packageYgcStationNumParam(ttInfoDetail,otherMap);
1040   - if(isLogStation){// 输出起点站信息
1041   - logger.info("setSKB:"+"起点站信息:"+paramMap);
1042   - }
1043   - // 发车站点序号
1044   - zdxh = String.valueOf(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,lsStationName2YgcNumber));
1045   - if("".equals(zdxh) || "null".equals(zdxh) || "0".equals(zdxh)){
1046   - result += "发车站点序号为空,请根据时刻表当前的版本号设置好历史站点路由再上传";
1047   - return result;
1048   - }
1049   - // 到达站点名称
1050   - ddzdmc = lsStationCode2NameMap.get(ttInfoDetail.getXl().getLineCode()+"_"+ttInfoDetail.getXlDir()+"_"+ttInfoDetail.getZdzCode());
1051   - if("".equals(ddzdmc) || "null".equals(ddzdmc)){
1052   - result += "到达站点名称为空,请根据时刻表当前的版本号设置好历史站点路由再上传";
1053   - return result;
1054   - }
1055   - sBufferC.append("<ZDXH>").append(zdxh).append("</ZDXH>");
1056   - sBufferC.append("<JHFCSJ>").append(changeTimeFormat(ttInfoDetail)).append("</JHFCSJ>");
1057   - sBufferC.append("<DDZDMC>").append(ddzdmc).append("</DDZDMC>");
1058   - // 终点站的参数
1059   - otherMap.put("stationMark","E");
1060   - paramMap = packageYgcStationNumParam(ttInfoDetail,otherMap);
1061   - if(isLogStation){// 输出终点站信息
1062   - logger.info("setSKB:"+"终点站信息:"+paramMap);
1063   - }
1064   - // 到达站点序号
1065   - ddxh = String.valueOf(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,lsStationName2YgcNumber));
1066   - if("".equals(ddxh) || "null".equals(ddxh) || "0".equals(ddxh)){
1067   - result += "到达站点序号为空,请根据时刻表当前的版本号设置好历史站点路由再上传";
1068   - return result;
1069   - }
1070   - isLogStation = false; // 一条线路只输出一次,后面的不输出了
1071   - sBufferC.append("<DDXH>").append(ddxh).append("</DDXH>");
1072   - sBufferC.append("<JHDDSJ>").append(calcDdsj(ttInfoDetail.getFcsj(),ttInfoDetail.getBcsj())).append("</JHDDSJ>");
1073   - sBufferC.append("</BC>");
1074   - // 0:上行;1:下行
1075   - if("0".equals(sxx)){
1076   - singleLc = lineInformation.getUpMileage();
1077   - }else{
1078   - singleLc = lineInformation.getDownMileage();
1079   - }
1080   - zlc += singleLc ;
1081   - yylc += singleLc;
1082   - }
1083   - sBufferC.append("</BCList>");
1084   - sBufferC.append("</SKB>");
1085   - sBufferA = new StringBuffer();
1086   - sBufferA.append("<JHZLC>").append(df.format(zlc)).append("</JHZLC>");
1087   - sBufferA.append("<JHYYLC>").append(df.format(yylc)).append("</JHYYLC>");
1088   - sBuffer.append(sBufferA).append(sBufferB).append(sBufferC);
1089   - }
1090   - logger.info("setSKB:"+"ttinfoId:"+ttinfoId+";当前站点版本号:"+lineVersion+";查询历史站点路由:"+lsStationCode2NameMap+";查询历史站点编号:"+lsStationName2YgcNumber);
1091   - }
1092   - sBuffer.append("</SKBs>");
1093   - String state;// 是否上传成功
1094   - if(ssop.setSKB(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
1095   - result = "上传成功";
1096   - state = "1";
1097   - }else{// 上传失败
1098   - result = "上传失败";
1099   - state = "0";
1100   - }
1101   - // 保存运管处上传记录
1102   - saveYgcUploadLog(ttinfoList,sBuffer.toString(),TrafficManageServiceImpl.UPLOAD_TYPE_SKB,state);
1103   - } catch (Exception e) {
1104   - logger.error("setSKB:", e);
1105   - e.printStackTrace();
1106   - }finally{
1107   - logger.info("setSKB:"+sBuffer.toString());
1108   - logger.info("setSKB:"+result);
1109   - }
1110   - return result;
1111   - }
1112   -
1113   - /**
1114   - * 保存上传运管处的日志
1115   - * @param obj 参数
1116   - * @param type 日志类型
1117   - * @param xml 上传参数
1118   - */
1119   - private void saveYgcUploadLog(Object obj,String xml,String type,String state){
1120   - SKBUploadLogger skbUploadLogger = new SKBUploadLogger();
1121   - SysUser user;
1122   - // 如果不是人为上传,SysUser则为空,设置上传人员为管理员
1123   - if(SecurityContextHolder.getContext() == null || SecurityContextHolder.getContext().getAuthentication() == null){
1124   - user = new SysUser();
1125   - user.setId(1);
1126   - }else{// 获取上传人员
1127   - user = SecurityUtils.getCurrentUser();
1128   - }
1129   - // 最大的字符长度
1130   - int maxLength = 60000;
1131   - int cutLength = 50000;// 需要截取的字符长度
1132   - String xml_sub = null;
1133   - skbUploadLogger.setType(type);// 设置类型
1134   - // 判断xml是否超长,如果超长,则截取
1135   - if(xml != null && xml.length() > maxLength){
1136   - int xmlLength = xml.length();
1137   - int cutCount = xmlLength / cutLength + (xmlLength % cutLength > 0 ? 1 : 0);
1138   - if(cutCount > 2){
1139   - xml = "由于上传参数内容超长,请查看服务器的系统日志";
1140   - }else if(cutCount == 2){
1141   - xml_sub =xml.substring(cutLength);
1142   - xml = xml.substring(0,cutLength);
1143   - }else{
1144   - // 不做处理
1145   - }
1146   - }
1147   -// skbUploadLogger.setUploadXml(xml);// 上传的参数
1148   -// skbUploadLogger.setUploadXmlSub(xml_sub);
1149   - skbUploadLogger.setState(state);// 状态:是否成功
1150   - skbUploadLogger.setUser(user);
1151   - // 时刻表
1152   - if(type.equals(TrafficManageServiceImpl.UPLOAD_TYPE_SKB)){
1153   - List<TTInfo> ttInfoList = (List<TTInfo>)obj;
1154   - String name = "";
1155   - Line line = null;
1156   - for(TTInfo ttInfo : ttInfoList){
1157   - name += ttInfo.getName() + " ";
1158   - line = ttInfo.getXl();
1159   - }
1160   - skbUploadLogger.setLine(line);
1161   - skbUploadLogger.setUser(user);
1162   - skbUploadLogger.setName(name);
1163   - skbUploadLoggerRepository.save(skbUploadLogger);
1164   - }else{
1165   - if(type.equals(TrafficManageServiceImpl.UPLOAD_TYPE_XL)){
1166   - Line line = (Line) obj;
1167   - String name = line.getName() + "线路停靠站上传";
1168   - skbUploadLogger.setLine(line);
1169   - skbUploadLogger.setName(name);
1170   - skbUploadLoggerRepository.save(skbUploadLogger);
1171   - }else if(type.equals(TrafficManageServiceImpl.UPLOAD_TYPE_LD)){
1172   - Map<String ,Line> logLineMap = (Map<String ,Line> )obj;
1173   - for (String key : logLineMap.keySet()) {
1174   - Line line = logLineMap.get(key);
1175   - String name = line.getName() + "路单上传";
1176   - skbUploadLogger = new SKBUploadLogger();
1177   - skbUploadLogger.setType(type);// 设置类型
1178   -// skbUploadLogger.setUploadXml(xml);// 上传的参数
1179   -// skbUploadLogger.setUploadXmlSub(xml_sub);
1180   - skbUploadLogger.setState(state);// 状态:是否成功
1181   - skbUploadLogger.setUser(user);
1182   - skbUploadLogger.setLine(line);
1183   - skbUploadLogger.setName(name);
1184   -// skbUploadLoggerRepository.save(skbUploadLogger);
1185   - }
1186   - }
1187   - }
1188   - }
1189   - /**
1190   - * 上传线路人员车辆配置信息
1191   - */
1192   - @Override
1193   - public String setXLPC() {
1194   - String result = "failure";
1195   - StringBuffer sBuffer =new StringBuffer();
1196   - try {
1197   - sBuffer.append("<XLPCs>");
1198   - // 声明变量
1199   - Line line = null;
1200   - Cars cars = null;
1201   - List<Personnel> personnelList = null;
1202   - List<Cars> carsList = null;
1203   - int totalPersonnel,totalCar ;// 人员数量。车辆数量
1204   - // 查询所有线路
1205   - Iterator<Line> lineIterator = lineRepository.findAll().iterator();
1206   - // 循环查找线路下的信息
1207   - while(lineIterator.hasNext()){
1208   - line = lineIterator.next();
1209   - sBuffer.append("<XLPC>");
1210   - sBuffer.append("<XLBM>").append(BasicData.lineId2ShangHaiCodeMap.get(line.getId())).append("</XLBM>");
1211   - // 查询驾驶员数量
1212   - personnelList = personnelRepository.findJsysByLineId(line.getId());
1213   - totalPersonnel = personnelList != null ? personnelList.size():0;
1214   - sBuffer.append("<SJRS>").append(totalPersonnel).append("</SJRS>");
1215   - // 查询售票员人员数量
1216   - personnelList = personnelRepository.findSpysByLineId(line.getId());
1217   - totalPersonnel = personnelList != null ? personnelList.size():0;
1218   - sBuffer.append("<SPYRS>").append(totalPersonnel).append("</SPYRS>");
1219   - // 查询车辆
1220   - carsList = carsRepository.findCarsByLineId(line.getId());
1221   - totalCar = carsList != null ? carsList.size():0;
1222   - sBuffer.append("<PCSL>").append(totalCar).append("</PCSL>");
1223   - sBuffer.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
1224   - int carsNum = 0;
1225   - // 取车牌号
1226   - if(carsList != null){
1227   - carsNum = carsList.size();
1228   - sBuffer.append("<CPHList>");
1229   - for (int i = 0; i < carsNum; i++) {
1230   - cars = carsList.get(i);
1231   - sBuffer.append("<CPH>").append("沪").append(cars.getCarCode()).append("</CPH>");
1232   - }
1233   - sBuffer.append("</CPHList>");
1234   - }
1235   - sBuffer.append("</XLPC>");
1236   - }
1237   - sBuffer.append("</XLPCs>");
1238   - if(ssop.setXLPC(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
1239   - result = "success";
1240   - }
1241   - } catch (Exception e) {
1242   - logger.error("setXLPC:",e);
1243   - e.printStackTrace();
1244   - }finally{
1245   - logger.info("setXLPC:"+sBuffer.toString());
1246   - logger.info("setXLPC:"+result);
1247   - }
1248   - return result;
1249   - }
1250   -
1251   -
1252   - /**
1253   - * 上传超速数据
1254   - */
1255   - @Override
1256   - public String setCS() {
1257   - String result = "failure";
1258   - StringBuffer sBuffer =new StringBuffer();
1259   - sBuffer.append("<CSs>");
1260   - String sql = "SELECT * FROM bsth_c_speeding where DATE_FORMAT(create_date,'%Y-%m-%d') = ? order by create_date ";
1261   - Connection conn = null;
1262   - PreparedStatement ps = null;
1263   - ResultSet rs = null;
1264   - // 取昨天 的日期
1265   - String yesterday = sdfnyr.format(DateUtils.addDays(new Date(), -1));
1266   - try {
1267   - conn = DBUtils_MS.getConnection();
1268   - ps = conn.prepareStatement(sql);
1269   - ps.setString(1, yesterday);
1270   - rs = ps.executeQuery();
1271   - Float lon, lat;
1272   - String kssk;
1273   - String speed;
1274   - while (rs.next()) {
1275   - kssk = sdfnyrsfm.format(rs.getLong("TIMESTAMP"));
1276   - speed = rs.getString("SPEED");
1277   - // 经纬度
1278   - lon = rs.getFloat("LON");
1279   - lat = rs.getFloat("LAT");
1280   - sBuffer.append("<CS>");
1281   - sBuffer.append("<RQ>").append(sdfnyr.format(rs.getDate("CREATE_DATE"))).append("</RQ>");
1282   - sBuffer.append("<XLBM>").append(BasicData.lineCode2ShangHaiCodeMap.get(rs.getString("LINE"))).append("</XLBM>");////////
1283   - sBuffer.append("<CPH>").append(rs.getString("VEHICLE")).append("</CPH>");
1284   - sBuffer.append("<KSSK>").append(kssk).append("</KSSK>");
1285   - sBuffer.append("<KSDDJD>").append(lon).append("</KSDDJD>");
1286   - sBuffer.append("<KSDDWD>").append(lat).append("</KSDDWD>");
1287   - sBuffer.append("<KSLD>").append("").append("</KSLD>");//**********************
1288   - sBuffer.append("<JSSK>").append(kssk).append("</JSSK>");
1289   - sBuffer.append("<JSDDJD>").append(lon).append("</JSDDJD>");
1290   - sBuffer.append("<JSDDWD>").append(lat).append("</JSDDWD>");
1291   - sBuffer.append("<JSLD>").append("").append("</JSLD>");//**********************
1292   - sBuffer.append("<PJSD>").append(speed).append("</PJSD>");
1293   - sBuffer.append("<ZGSS>").append(speed).append("</ZGSS>");
1294   - sBuffer.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
1295   - sBuffer.append("</CS>");
1296   - }
1297   - sBuffer.append("</CSs>");
1298   - if(ssop.setCS(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
1299   - result = "success";
1300   - }
1301   - } catch (Exception e) {
1302   - logger.error("setCS:",e);
1303   - e.printStackTrace();
1304   - } finally {
1305   - logger.info("setCS:"+sBuffer.toString());
1306   - logger.info("setCS:"+result);
1307   - DBUtils_MS.close(rs, ps, conn);
1308   - }
1309   - return result;
1310   - }
1311   -
1312   -
1313   - /**
1314   - * 下载全量的公交基础数据
1315   - */
1316   - public String getDownLoadAllDataFile() {
1317   - String result = "failure";
1318   - try {
1319   - try {
1320   - if(ygcBasicDataService.download("admin","000000","abc.zip")){
1321   - result = "success";
1322   - }
1323   - } catch (Exception e) {
1324   - e.printStackTrace();
1325   - }
1326   - } catch (Exception e) {
1327   - e.printStackTrace();
1328   - }
1329   -
1330   - return result;
1331   - }
1332   -
1333   - /**
1334   - * 下载增量的公交基础数据
1335   - */
1336   - public String getDownLoadIncreaseDataFile() {
1337   - String result = "success";
1338   - try {
1339   - //System.out.println(portType.downloadIncreaseDataFile(args0, args1, args2));
1340   - } catch (Exception e) {
1341   - e.printStackTrace();
1342   - }
1343   -
1344   - return result;
1345   - }
1346   -
1347   - /**
1348   - * 指定线路查询方式公交基础数据下载
1349   - */
1350   - public String getDownLoadWarrantsBusLineStation() {
1351   - String result = "success";
1352   - try {
1353   -
1354   - //portType.setXL(userNameXl, passwordXl, sBuffer.toString());
1355   - } catch (Exception e) {
1356   - e.printStackTrace();
1357   - }
1358   -
1359   - return result;
1360   - }
1361   -
1362   - /**
1363   - * 计算结束时间
1364   - * @param fcsj 发车时间
1365   - * @param bcsj 班次历时
1366   - * @return
1367   - */
1368   - private String calcDdsj(String fcsj,Integer bcsj){
1369   - String result = "";
1370   - if(fcsj.indexOf(":") != -1){
1371   - if(bcsj == null){
1372   - return fcsj;
1373   - }
1374   - // 时和分隔开
1375   - String[] fcsjArray = fcsj.split(":");
1376   - // 分和历时时间相加
1377   - Integer fullTime = Integer.valueOf(fcsjArray[1])+ bcsj;
1378   - int hour,min,sumHour;
1379   - hour = fullTime / 60;
1380   - min = fullTime % 60;
1381   - sumHour = Integer.valueOf(fcsjArray[0])+hour;
1382   - if(sumHour >= 24){
1383   - result = String.format("%02d",sumHour - 24);
1384   - }else{
1385   - result = String.format("%02d",sumHour);;
1386   - }
1387   - result +=":"+String.format("%02d", min);
1388   - }else{
1389   - result = fcsj;
1390   - }
1391   - return result;
1392   - }
1393   -
1394   - /**
1395   - * 改变时间格式
1396   - * @param ttInfoDetail 时刻表详细
1397   - * @return xx:yy
1398   - */
1399   - private String changeTimeFormat(TTInfoDetail ttInfoDetail){
1400   - String result = "00:00";
1401   - String fcsj = ttInfoDetail.getFcsj();
1402   - if(fcsj.indexOf(":") != -1){
1403   - // 时和分隔开
1404   - String[] fcsjArray = fcsj.split(":");
1405   - result = String.format("%02d", Integer.valueOf(fcsjArray[0]))+":";
1406   - result +=String.format("%02d", Integer.valueOf(fcsjArray[1]));
1407   - }else{
1408   - result = null;
1409   - logger.info("setSKB:发车时间错误:ttInfoDetail.id="+ttInfoDetail.getId());
1410   - }
1411   - return result;
1412   - }
1413   -
1414   - /**
1415   - * 拼装线路计划班次表的XML
1416   - * @param sBuffer
1417   - * @param schedulePlanInfo
1418   - * @param xlbm
1419   - * @param zbh
1420   - * @param lp
1421   - */
1422   - private void assembleJHBC(StringBuffer sBuffer,SchedulePlanInfo schedulePlanInfo,String xlbm,String zbh,Long lp){
1423   - sBuffer.append("<JHBC>");
1424   - sBuffer.append("<RQ>").append(sdfnyr.format(schedulePlanInfo.getScheduleDate())).append("</RQ>");
1425   - sBuffer.append("<XLBM>").append(BasicData.lineCode2ShangHaiCodeMap.get(xlbm)).append("</XLBM>");
1426   - sBuffer.append("<CPH>").append("沪"+zbh).append("</CPH>");
1427   - sBuffer.append("<LPBH>").append(lp).append("</LPBH>");
1428   - sBuffer.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
1429   - sBuffer.append("<BCList>");
1430   - }
1431   - /**
1432   - * 转换排班规则
1433   - * @param ruleDay
1434   - * @return
1435   - */
1436   - private String changeRuleDay(String ruleDay){
1437   - String result = "";
1438   - int flag ;
1439   - String[] ruleDayArray = ruleDay.split(",");
1440   - for (int i = 0; i < ruleDayArray.length; i++) {
1441   - if(ruleDayArray[i].equals("1")){
1442   - flag = i+1;
1443   - }else{
1444   - flag = 0;
1445   - }
1446   - if(flag > 0){
1447   - result += flag + ",";
1448   - }
1449   - }
1450   - // 去掉最后一个字符
1451   - if(StringUtils.endsWith(result,",")){
1452   - result = StringUtils.removeEnd(result,",");
1453   - }
1454   - return result;
1455   - }
1456   - /**
1457   - * 设置统一的公司名称
1458   - * @param company
1459   - */
1460   - private void setCompanyName(String company){
1461   - if(company.equals("闵行公司")){
1462   - company = "浦东闵行公交公司";
1463   - }else if(company.equals("杨高公司")){
1464   - company = "浦东杨高公交公司";
1465   - }else if(company.equals("上南公司")){
1466   - company = "浦东上南公交公司";
1467   - }else if(company.equals("金高公司")){
1468   - company = "浦东金高公交公司";
1469   - }else if(company.equals("南汇公司")){
1470   - company = "浦东南汇公交公司";
1471   - }else if(company.equals("青浦公交")){
1472   - company = "浦东青浦公交公司";
1473   - }
1474   - }
1475   - /**
1476   - * @param stationsList 站点路由集
1477   - * @param sBuffer sBuffer
1478   - * @param startId 站点序号起始ID
1479   - *
1480   - * @return 站点序号累加后的ID
1481   - */
1482   - private int packagStationXml(List<StationRoute> stationsList,StringBuffer sBuffer,int startId,Map<String, Integer> stationNumMap){
1483   - int size = stationsList.size();
1484   - StationRoute srRoute;
1485   - HashMap<String,String> paraMap;
1486   - String zdlx ;// 站点类型:0:起点站、1:终点站、2:中途站
1487   - for (int i = 0; i < size; i++) {
1488   - srRoute = stationsList.get(i);
1489   - zdlx = srRoute.getStationMark();
1490   - if(zdlx.equals("B")){
1491   - zdlx = "0";
1492   - }else if(zdlx.equals("E")){
1493   - zdlx = "1";
1494   - }else{
1495   - zdlx = "2";
1496   - }
1497   - paraMap = packageYgcStationNumParam(srRoute,null);
1498   - sBuffer.append("<Station>");
1499   - sBuffer.append("<ZDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paraMap,stationNumMap)).append("</ZDXH>");
1500   - sBuffer.append("<SXX>").append(srRoute.getDirections()).append("</SXX>");
1501   - sBuffer.append("<ZDMC>").append(srRoute.getStationName()).append("</ZDMC>");
1502   - sBuffer.append("<ZDBM>").append(srRoute.getStationCode()).append("</ZDBM>");
1503   - sBuffer.append("<ZDJD>").append(srRoute.getStation().getgLonx()).append("</ZDJD>");
1504   - sBuffer.append("<ZDWD>").append(srRoute.getStation().getgLaty()).append("</ZDWD>");
1505   - sBuffer.append("<ZZ>").append(srRoute.getStation().getAddr() == null ? "" : srRoute.getStation().getAddr()).append("</ZZ>");
1506   - sBuffer.append("<ZDLX>").append(zdlx).append("</ZDLX>");
1507   - sBuffer.append("<ZJLC>").append(srRoute.getDistances()).append("</ZJLC>");
1508   - sBuffer.append("</Station>");
1509   - startId++;
1510   - }
1511   - return startId;
1512   - }
1513   -
1514   - /**
1515   - * @param pointList 站点点位集
1516   - * @param sBuffer sBuffer
1517   - * @param startId 站点序号起始ID
1518   - *
1519   - * @return 站点序号累加后的ID
1520   - */
1521   - private int packagStationPointXml(List<Object[]> pointList,StringBuffer sBuffer,int startId){
1522   - int size = pointList.size();
1523   - Object[] objs;
1524   - String bsection,dir,section;
1525   - String[] sections ;
1526   - for (int i = 0; i < size; i++) {
1527   - objs = pointList.get(i);
1528   - bsection = objs[0]+"";
1529   - dir = objs[1]+"";
1530   - // 取括号内的内容
1531   - Pattern pattern = Pattern.compile("(?<=\\()(.+?)(?=\\))");
1532   - Matcher matcher = pattern.matcher(bsection);
1533   - if(matcher.find()){
1534   - sections = matcher.group().split(",");
1535   - for (int j = 0 ; j < sections.length ; j ++){
1536   - section = sections[j];
1537   - sBuffer.append("<LinePoint>");
1538   - sBuffer.append("<ZDXH>").append(startId).append("</ZDXH>");
1539   - sBuffer.append("<SXX>").append(dir).append("</SXX>");
1540   - sBuffer.append("<ZDJD>").append(section.split(" ")[0]).append("</ZDJD>");
1541   - sBuffer.append("<ZDWD>").append(section.split(" ")[1]).append("</ZDWD>");
1542   - sBuffer.append("</LinePoint>");
1543   - startId++;
1544   - }
1545   - }
1546   - }
1547   - return startId;
1548   - }
1549   -
1550   - /**
1551   - * 获取运管处站点序号
1552   - * @param map
1553   - * @return 运管处站点序号
1554   - */
1555   - private Integer getYgcStationNumByLineCodeAndDirectionAndStationName(HashMap<String,String> map,Map<String, Integer> stationNumMap){
1556   - // 线路编码
1557   - String lineCode = map.get("lineCode");
1558   - // 线路走向 0:上行 1:下行
1559   - String direction = map.get("direction");
1560   - // 站点编码
1561   - String stationCode = map.get("stationCode");
1562   - // 站点类型:B:起点站 Z:中途站 E:终点站 T:停车场
1563   - String stationMark = map.get("stationMark");
1564   - String[] marks = null;
1565   - // 起点站,先从起点找,找不到再从中途站找,最后从终点找
1566   - if(stationMark.equals("B")){
1567   - marks= new String[]{"B","Z","E"};
1568   - }else if(stationMark.equals("E")){// 终点站相反
1569   - marks= new String[]{"E","Z","B"};
1570   - }else if(stationMark.equals("Z")){
1571   - marks= new String[]{"Z"};
1572   - }
1573   - // 默认从缓存BasicData.stationName2YgcNumber
1574   - Map<String, Integer> tempMap = BasicData.stationName2YgcNumber;
1575   - // 如果传入的stationNumMap不为空,则不是缓存取,而从stationNumMap取
1576   - if(stationNumMap != null){
1577   - tempMap = stationNumMap;
1578   - }
1579   - Integer number = null;
1580   - for (int i = 0 ;i < marks.length ; i ++){
1581   - number = tempMap.get(lineCode+"_"+direction+"_"+stationCode+"_"+marks[i]);
1582   - if(number != null){
1583   - break;
1584   - }
1585   - }
1586   - return number == null ? 0 : number;
1587   - }
1588   -
1589   - /**
1590   - * 封装查询站序条件
1591   - * @param obj
1592   - * @return
1593   - */
1594   - private HashMap packageYgcStationNumParam(Object obj,HashMap<String,String> otherParam){
1595   - HashMap<String,String> map = new HashMap<String,String>();
1596   - String lineCode = "",direction = "",stationCode = "",stationMark = "";
1597   - // 站点路由
1598   - if(obj instanceof StationRoute){
1599   - StationRoute sr = (StationRoute)obj;
1600   - lineCode = sr.getLineCode();
1601   - direction = String.valueOf(sr.getDirections());
1602   - stationCode = sr.getStationCode();
1603   - stationMark = sr.getStationMark();
1604   - }else if(obj instanceof ScheduleRealInfo){ //实际排班计划明细。
1605   - ScheduleRealInfo sri = (ScheduleRealInfo)obj;
1606   - lineCode = sri.getXlBm();
1607   - direction = sri.getXlDir();
1608   - if(otherParam != null && otherParam.get("stationMark") != null){
1609   - stationMark = otherParam.get("stationMark");
1610   - if(stationMark.equals("B")){ // 起点站
1611   - stationCode = sri.getQdzCode();
1612   - }else if(stationMark.equals("E")){ // 终点站
1613   - stationCode = sri.getZdzCode();
1614   - }
1615   - }
1616   - }else if(obj instanceof SchedulePlanInfo){ //排班计划明细
1617   - SchedulePlanInfo spi = (SchedulePlanInfo)obj;
1618   - lineCode = spi.getXlBm();
1619   - direction = spi.getXlDir();
1620   - if(otherParam != null && otherParam.get("stationMark") != null){
1621   - stationMark = otherParam.get("stationMark");
1622   - if(stationMark.equals("B")){ // 起点站
1623   - stationCode = spi.getQdzCode();
1624   - }else if(stationMark.equals("E")){ // 终点站
1625   - stationCode = spi.getZdzCode();
1626   - }
1627   - }
1628   - }else if(obj instanceof TTInfoDetail){ //时刻表明细
1629   - TTInfoDetail ttid = (TTInfoDetail)obj;
1630   - lineCode = ttid.getXl().getLineCode();
1631   - direction = ttid.getXlDir();
1632   - if(otherParam != null && otherParam.get("stationMark") != null){
1633   - stationMark = otherParam.get("stationMark");
1634   - if(stationMark.equals("B")){ // 起点站
1635   - stationCode = ttid.getQdzCode();
1636   - }else if(stationMark.equals("E")){ // 终点站
1637   - stationCode = ttid.getZdzCode();
1638   - }
1639   - }
1640   - }
1641   - map.put("lineCode",lineCode);// 站点编码
1642   - map.put("direction",direction); // 上下行
1643   - map.put("stationCode",stationCode); // 站点编号
1644   - map.put("stationMark",stationMark); // 站点类型
1645   - return map;
1646   - }
1647   -
1648   - /**
1649   - * 取得历史站点编码和站点名称的对应关系
1650   - * @return
1651   - */
1652   - private Map<String, String> getLsStationCode(String lineCode,int lineVersion){
1653   - Map<String,Object> map = new HashMap<>();
1654   - map.put("lineCode_eq", lineCode);
1655   - map.put("versions_eq",lineVersion);
1656   - LsStationRoute lsroute;
1657   - Iterator<LsStationRoute> iterator = lsStationRouteRepository.findAll(new CustomerSpecs<LsStationRoute>(map)).iterator();
1658   - Map<String, String> stationCode2Name = new HashMap<>();
1659   - while (iterator.hasNext()) {
1660   - lsroute = iterator.next();
1661   - stationCode2Name.put(lsroute.getLineCode() + "_" + lsroute.getDirections() + "_" + lsroute.getStationCode(), lsroute.getStationName());
1662   - }
1663   - return stationCode2Name;
1664   - }
1665   -
1666   - private Map<String, Integer> getLsStationRoute(String xlbm,int lineVersion){
1667   - Map<String, Integer> tempStationName2YgcNumber = new HashMap<String, Integer>();
1668   - /**
1669   - * 加载运管处的站点及序号
1670   - * 上行从1开始,下行顺序续编
1671   - */
1672   - List<Map<String, String>> ygcLines = lsStationRouteRepository.findLineWithLineCode4Ygc(xlbm,lineVersion);
1673   - if(ygcLines != null && ygcLines.size() > 0){
1674   - int size = ygcLines.size();
1675   - Map<String, String> tempMap ;
1676   - int num = 1;
1677   - String key;
1678   - String lineCode = "";
1679   - for (int i = 0; i < size; i ++){
1680   - tempMap = ygcLines.get(i);
1681   - if(lineCode.equals("")){
1682   - lineCode = tempMap.get("lineCode");
1683   - }else if(!lineCode.equals(tempMap.get("lineCode"))){
1684   - num = 1;
1685   - lineCode = tempMap.get("lineCode");
1686   - }
1687   - key = tempMap.get("lineCode") + "_"+String.valueOf(tempMap.get("directions"))
1688   - + "_"+tempMap.get("stationCode")+ "_"+tempMap.get("stationMark");
1689   - tempStationName2YgcNumber.put(key,num++);
1690   - }
1691   - }
1692   - return tempStationName2YgcNumber;
1693   - }
1694   -
1695   - private String getSetXlXml(Line line,LineInformation lineInformation){
1696   - StringBuffer sBuffer = new StringBuffer();
1697   - List<StationRoute> upStationsList ;// 上行站点路由集
1698   - List<StationRoute> downStationsList;// 下行站点路由集
1699   - List<Object[]> downPointList;// 下行站点集
1700   - List<Object[]> upPointList;// 上行站点集
1701   - sBuffer.append("<XLs>");
1702   - sBuffer.append("<XL>");
1703   - sBuffer.append("<XLBM>").append(BasicData.lineId2ShangHaiCodeMap.get(line.getId())).append("</XLBM>");
1704   - sBuffer.append("<XLMC>").append(line.getName()).append("</XLMC>");
1705   - sBuffer.append("<QDZ>").append(line.getStartStationName()).append("</QDZ>");
1706   - sBuffer.append("<ZDZ>").append(line.getEndStationName()).append("</ZDZ>");
1707   - sBuffer.append("<QZLC>").append(lineInformation.getUpMileage()).append("</QZLC>");
1708   - sBuffer.append("<ZQLC>").append(lineInformation.getDownMileage()).append("</ZQLC>");
1709   - sBuffer.append("<XLGH>").append(line.getLinePlayType()).append("</XLGH>");
1710   - sBuffer.append("<UPDATE_DATE>").append(sdfnyr.format(new Date())).append("</UPDATE_DATE>");
1711   - // 循环添加站点信息
1712   - sBuffer.append("<StationList>");
1713   - // 先查上行
1714   - upStationsList = stationRouteRepository.findByLine(line.getLineCode(), 0);
1715   - Map<String, Integer> stationNumMap = getStationName2YgcNumberMap(line.getLineCode());
1716   - int startId = 1;
1717   - startId = packagStationXml(upStationsList, sBuffer, startId,stationNumMap);
1718   - // 环线不查下行
1719   - if(line.getLinePlayType() != 1){
1720   - // 再查下行
1721   - downStationsList = stationRouteRepository.findByLine(line.getLineCode(), 1);
1722   - packagStationXml(downStationsList, sBuffer, startId,stationNumMap);
1723   - }
1724   - sBuffer.append("</StationList>");
1725   - // 循环添加站点点位信息
1726   - sBuffer.append("<LinePointList>");
1727   - upPointList = sectionRepository.getSectionDirByLineId(line.getId(),0);
1728   - startId = 1;
1729   - startId = packagStationPointXml(upPointList, sBuffer, startId);
1730   - // 环线不查下行
1731   - if(line.getLinePlayType() != 1){
1732   - downPointList = sectionRepository.getSectionDirByLineId(line.getId(),1);
1733   - packagStationPointXml(downPointList, sBuffer, startId);
1734   - }
1735   - sBuffer.append("</LinePointList>");
1736   - sBuffer.append("</XL>");
1737   - sBuffer.append("</XLs>");
1738   - return sBuffer.toString();
1739   - }
1740   -}
  1 +package com.bsth.service.impl;
  2 +
  3 +import com.bsth.data.BasicData;
  4 +import com.bsth.email.SendEmailController;
  5 +import com.bsth.email.entity.EmailBean;
  6 +import com.bsth.entity.*;
  7 +import com.bsth.entity.realcontrol.ChildTaskPlan;
  8 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  9 +import com.bsth.entity.schedule.SchedulePlanInfo;
  10 +import com.bsth.entity.schedule.TTInfo;
  11 +import com.bsth.entity.schedule.TTInfoDetail;
  12 +import com.bsth.entity.search.CustomerSpecs;
  13 +import com.bsth.entity.sys.SysUser;
  14 +import com.bsth.entity.traffic.SKBUploadLogger;
  15 +import com.bsth.repository.*;
  16 +import com.bsth.repository.realcontrol.ScheduleRealInfoRepository;
  17 +import com.bsth.repository.schedule.*;
  18 +import com.bsth.repository.traffic.SKBUploadLoggerRepository;
  19 +import com.bsth.security.util.SecurityUtils;
  20 +import com.bsth.service.TrafficManageService;
  21 +import com.bsth.service.traffic.YgcBasicDataService;
  22 +import com.bsth.util.TimeUtils;
  23 +import com.bsth.util.db.DBUtils_MS;
  24 +import com.bsth.webService.trafficManage.org.tempuri.Results;
  25 +import com.bsth.webService.trafficManage.org.tempuri.WebServiceLocator;
  26 +import com.bsth.webService.trafficManage.org.tempuri.WebServiceSoap;
  27 +import org.apache.commons.lang.StringEscapeUtils;
  28 +import org.apache.commons.lang.StringUtils;
  29 +import org.apache.commons.lang.time.DateUtils;
  30 +import org.joda.time.DateTime;
  31 +import org.slf4j.Logger;
  32 +import org.slf4j.LoggerFactory;
  33 +import org.springframework.beans.factory.annotation.Autowired;
  34 +import org.springframework.data.domain.Sort;
  35 +import org.springframework.data.domain.Sort.Direction;
  36 +import org.springframework.security.core.context.SecurityContextHolder;
  37 +import org.springframework.stereotype.Service;
  38 +
  39 +import java.io.*;
  40 +import java.net.InetAddress;
  41 +import java.sql.Connection;
  42 +import java.sql.PreparedStatement;
  43 +import java.sql.ResultSet;
  44 +import java.text.DecimalFormat;
  45 +import java.text.SimpleDateFormat;
  46 +import java.util.*;
  47 +import java.util.regex.Matcher;
  48 +import java.util.regex.Pattern;
  49 +
  50 +/**
  51 + *
  52 + * @ClassName: TrafficManageServiceImpl(运管处接口service业务层实现类)
  53 + *
  54 + * @Extends : BaseService
  55 + *
  56 + * @Description: TODO(运管处接口service业务层)
  57 + *
  58 + * @Author bsth@zq
  59 + *
  60 + * @Date 2016年10月28日 上午9:21:17
  61 + *
  62 + * @Version 公交调度系统BS版 0.1
  63 + *
  64 + */
  65 +
  66 +@Service
  67 +public class TrafficManageServiceImpl implements TrafficManageService{
  68 +
  69 + Logger logger = LoggerFactory.getLogger(this.getClass());
  70 + // 运管处上传日志类型
  71 + public static final String UPLOAD_TYPE_SKB = "1";
  72 + public static final String UPLOAD_TYPE_XL = "2";
  73 + public static final String UPLOAD_TYPE_LD = "3";
  74 +
  75 + // 线路repository
  76 + @Autowired
  77 + private LineRepository lineRepository;
  78 +
  79 + @Autowired
  80 + private LineInformationRepository lineInformationRepository;
  81 +
  82 + // 站点路由repository
  83 + @Autowired
  84 + private StationRouteRepository stationRouteRepository;
  85 +
  86 + // 历史站点路由repository
  87 + @Autowired
  88 + private LsStationRouteRepository lsStationRouteRepository;
  89 +
  90 + @Autowired
  91 + private SectionRepository sectionRepository;
  92 +
  93 + // 车辆repository
  94 + @Autowired
  95 + private CarsRepository carsRepository;
  96 +
  97 + // 人员repository
  98 + @Autowired
  99 + private PersonnelRepository personnelRepository;
  100 +
  101 + // 时刻模板repository
  102 + @Autowired
  103 + private TTInfoRepository ttInfoRepository;
  104 +
  105 + // 时刻模板明细repository
  106 + @Autowired
  107 + private TTInfoDetailRepository ttInfoDetailRepository;
  108 +
  109 + // 排班计划明细repository
  110 + @Autowired
  111 + private SchedulePlanInfoRepository schedulePlanInfoRepository;
  112 +
  113 + // 实际排班计划明细repository
  114 + @Autowired
  115 + private ScheduleRealInfoRepository scheduleRealInfoRepository;
  116 +
  117 + // 时刻表上传记录repository
  118 + @Autowired
  119 + private SKBUploadLoggerRepository skbUploadLoggerRepository;
  120 +
  121 + // 线路站点repository
  122 + @Autowired
  123 + private YgcBasicDataService ygcBasicDataService;
  124 +
  125 + // 发送邮件
  126 + @Autowired
  127 + private SendEmailController sendEmailController;
  128 +
  129 + /**
  130 + * 线路版本repository
  131 + */
  132 + @Autowired
  133 + private LineVersionsRepository lineVersionsRepository;
  134 +
  135 + // 运管处上传接口
  136 + private com.bsth.webService.trafficManage.up.org.tempuri.WebServiceSoap webServiceSoapUp;
  137 + private WebServiceSoap ssop ;
  138 + {
  139 + try {
  140 + ssop = new WebServiceLocator().getWebServiceSoap();
  141 + } catch (Exception e) {
  142 + e.printStackTrace();
  143 + }
  144 + }
  145 + // 格式化 年月日时分秒 nyrsfm是年月日时分秒的拼音首字母
  146 + private SimpleDateFormat sdfnyrsfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  147 +
  148 + // 格式化 年月日
  149 + private SimpleDateFormat sdfnyr = new SimpleDateFormat("yyyy-MM-dd");
  150 +
  151 + // 数字格式化
  152 + DecimalFormat format = new DecimalFormat("0.00");
  153 +
  154 + // 用户名
  155 + private final String userNameOther = "user";
  156 + // 密码
  157 + private final String passwordOther = "user";
  158 +
  159 + // 用户名
  160 + private final String userNameUp = "user";
  161 + // 密码
  162 + private final String passwordUp = "user";
  163 + // 接收邮件人
  164 + private final String emailSendToAddress = "113252620@qq.com";
  165 + // 记录路单上线的成功、失败线路数
  166 + private Integer countSuccess,countFailure;
  167 +
  168 + private synchronized com.bsth.webService.trafficManage.up.org.tempuri.WebServiceSoap getWebServiceSoapUp(){
  169 + try {
  170 + if(webServiceSoapUp == null){
  171 + webServiceSoapUp = new com.bsth.webService.trafficManage.up.org.tempuri.WebServiceLocator().getWebServiceSoap();
  172 + }
  173 + }catch (Exception e){
  174 + e.printStackTrace();
  175 + }finally {
  176 + return webServiceSoapUp;
  177 + }
  178 + }
  179 + /**
  180 + * 上传线路信息
  181 + */
  182 + @Override
  183 + public String setXL(String ids) {
  184 + String result = "failure";
  185 + String xml ;
  186 + String[] idArray = ids.split(",");
  187 + try {
  188 + for (String id : idArray) {
  189 + if(id == null || id.trim().equals("")){
  190 + continue;
  191 + }
  192 + Map<String,Object> map = new HashMap<>();
  193 + map.put("lineCode_eq", id);
  194 + Line line ;
  195 + LineInformation lineInformation;
  196 + Optional<Line> optionalLine = lineRepository.findOne(new CustomerSpecs<Line>(map));
  197 + line = optionalLine.isPresent() ? optionalLine.get() : null;
  198 + if(line == null){
  199 + continue;
  200 + }
  201 + if(BasicData.lineId2ShangHaiCodeMap.get(line.getId()) == null){
  202 + return result;
  203 + }
  204 + map = new HashMap<>();
  205 + map.put("line.id_eq",line.getId());
  206 + Optional<LineInformation> optionalLineInformation = lineInformationRepository.findOne(new CustomerSpecs<LineInformation>(map));
  207 + lineInformation = optionalLineInformation.isPresent() ? optionalLineInformation.get() : null;
  208 + if(lineInformation == null){
  209 + continue;
  210 + }
  211 + // 取得封装好的xml
  212 + xml = getSetXlXml(line,lineInformation);
  213 + // 站点序号不能为0,如果为0,则返回错误
  214 + if(xml.indexOf("<ZDXH>0</ZDXH>") != -1){
  215 + return "0";
  216 + }
  217 + String state;// 是否上传成功
  218 + // 调用上传方法
  219 + if(getWebServiceSoapUp().setXL(userNameUp,passwordUp,xml).isSuccess()){
  220 + result = "success";
  221 + state = "1";
  222 + }else{
  223 + result = "failure";
  224 + state = "0";
  225 + }
  226 + logger.info("setXL:"+xml);
  227 + logger.info("setXL:"+result);
  228 + // 保存运管处上传记录
  229 + saveYgcUploadLog(line,xml,TrafficManageServiceImpl.UPLOAD_TYPE_XL,state);
  230 + }
  231 + } catch (Exception e) {
  232 + logger.error("setXL:",e);
  233 + e.printStackTrace();
  234 + }
  235 + return result;
  236 + }
  237 +
  238 + /**
  239 + * 加载运管处的站点及序号
  240 + * 上行从1开始,下行顺序续编
  241 + */
  242 + private Map<String, Integer> getStationName2YgcNumberMap (String lineCode){
  243 + Map<String, Integer> resultMap = new HashMap<>();
  244 + List<Map<String, String>> ygcLines = stationRouteRepository.findLineWithYgcByLine(lineCode);
  245 + if(ygcLines != null && ygcLines.size() > 0){
  246 + int size = ygcLines.size();
  247 + Map<String, String> tempMap ;
  248 + int num = 1;
  249 + String key;
  250 + for (int i = 0; i < size; i ++){
  251 + tempMap = ygcLines.get(i);
  252 + key = tempMap.get("lineCode") + "_"+String.valueOf(tempMap.get("directions"))
  253 + + "_"+tempMap.get("stationCode")+ "_"+tempMap.get("stationMark");
  254 + resultMap.put(key,num++);
  255 + }
  256 + }
  257 + return resultMap;
  258 + }
  259 +
  260 + /**
  261 + * 上传线路信息(按in_use上传)
  262 + */
  263 + @Override
  264 + public String setXLByInUse(String inUse) {
  265 + StringBuffer result = new StringBuffer();
  266 + try {
  267 + Map<String,Object> map = new HashMap<>();
  268 + if(inUse != null && inUse.equals("1")){
  269 + map.put("inUse_eq", inUse);
  270 + }
  271 + List<Line> lines ;
  272 + Line line;
  273 + lines = lineRepository.findAll(new CustomerSpecs<Line>(map));
  274 + if(lines != null && lines.size() > 0){
  275 + for(int i = 0 ; i < lines.size() ; i ++){
  276 + line = lines.get(i);
  277 + if(line != null && line.getId() != null){
  278 + result.append(line.getLineCode()).append(":").append(setXL(line.getLineCode())).append(";");
  279 + }
  280 + }
  281 + }
  282 + } catch (Exception e) {
  283 + result.append("failure");
  284 + logger.error("setXLByInUse:",e);
  285 + e.printStackTrace();
  286 + }
  287 + return result.toString();
  288 + }
  289 +
  290 + /**
  291 + * 上传车辆信息
  292 + */
  293 + @Override
  294 + public String setCL() {
  295 + String result = "failure";
  296 + StringBuffer sBuffer =new StringBuffer();
  297 + try {
  298 + sBuffer.append("<CLs>");
  299 + Cars cars = null;
  300 + String company;
  301 + Iterator<Cars> carsIterator = carsRepository.findAll().iterator();
  302 + while(carsIterator.hasNext()){
  303 + cars = carsIterator.next();
  304 + sBuffer.append("<CL>");
  305 + company = cars.getCompany();
  306 + setCompanyName(company);// 统一公司名称
  307 + sBuffer.append("<GSJC>").append(company).append("</GSJC>");
  308 + sBuffer.append("<NBH>").append(cars.getInsideCode()).append("</NBH>");
  309 + sBuffer.append("<CPH>").append(cars.getCarPlate()).append("</CPH>");
  310 + sBuffer.append("<YYZBH>").append(cars.getServiceNo()).append("</YYZBH>");
  311 + sBuffer.append("<CZCPH>").append(cars.getCarPlate()).append("</CZCPH>");//******这个数据没有***********
  312 + sBuffer.append("<CZZDBH>").append(cars.getEquipmentCode()).append("</CZZDBH>");
  313 + sBuffer.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
  314 + sBuffer.append("</CL>");
  315 + }
  316 + sBuffer.append("</CLs>");
  317 + if(ssop.setCL(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
  318 + result = "success";
  319 + }
  320 + } catch (Exception e) {
  321 + logger.error("setCL:",e);
  322 + e.printStackTrace();
  323 + }finally{
  324 + logger.info("setCL:"+sBuffer.toString());
  325 + logger.info("setCL:"+result);
  326 + }
  327 + return result;
  328 + }
  329 +
  330 + /**
  331 + * 上传司机信息
  332 + */
  333 + @Override
  334 + public String setSJ() {
  335 + String result = "failure";
  336 + StringBuffer sBuffer =new StringBuffer();
  337 + try {
  338 + sBuffer.append("<SJs>");
  339 + Personnel personnel = null;
  340 + String company;
  341 + Iterator<Personnel> personIterator = personnelRepository.findAll().iterator();
  342 + while(personIterator.hasNext()){
  343 + personnel = personIterator.next();
  344 + sBuffer.append("<SJ>");
  345 + company = personnel.getCompany();
  346 + setCompanyName(company);// 统一公司名称
  347 + sBuffer.append("<GSJC>").append(company).append("</GSJC>");
  348 + sBuffer.append("<SJGH>").append(personnel.getJobCode()).append("</SJGH>");
  349 + sBuffer.append("<CYZGZH>").append(personnel.getPapersCode()).append("</CYZGZH>");//***********
  350 + sBuffer.append("<XM>").append(personnel.getPersonnelName()).append("</XM>");
  351 + sBuffer.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
  352 + sBuffer.append("</SJ>");
  353 + }
  354 + sBuffer.append("</SJs>");
  355 + if(ssop.setSJ(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
  356 + result = "success";
  357 + };
  358 + } catch (Exception e) {
  359 + logger.error("setSJ:",e);
  360 + e.printStackTrace();
  361 + }finally{
  362 + logger.info("setSJ:"+sBuffer.toString());
  363 + logger.info("setSJ:"+result);
  364 + }
  365 + return result;
  366 + }
  367 +
  368 + /**
  369 + * 上传路单 指定日期 yyyy-MM-dd
  370 + * @param theDate
  371 + * @return
  372 + */
  373 + public String setLD(String theDate){
  374 + return uploadLD(theDate);
  375 + }
  376 +
  377 + /**
  378 + * 上传路单 上传前一天的路单
  379 + * @return
  380 + */
  381 + public String setLD(){
  382 + return uploadLD(null);
  383 + }
  384 + /**
  385 + * 上传路单
  386 + * @return 上传成功标识
  387 + */
  388 + private String uploadLD(String theDate){
  389 + // 取昨天 的日期
  390 + String date = theDate == null ?sdfnyr.format(DateUtils.addDays(new Date(), -1)) : theDate;
  391 + StringBuffer sf = new StringBuffer();
  392 + Results results = null;
  393 + String str = "", xlbm = null, oldXlbm = null;
  394 + List<Map<String,Object>> listGroup = null;
  395 + int scount = 0, ccount = 0;
  396 + long start = System.currentTimeMillis();
  397 + try {
  398 + // 计数器
  399 + int counter = 0;
  400 + // 每几条线路上传一次路单
  401 + int per = 10;
  402 + List<ScheduleRealInfo> list = scheduleRealInfoRepository.setLD(date);
  403 + listGroup = scheduleRealInfoRepository.setLDGroup(date);
  404 + Map<String,Object> map = new HashMap();
  405 + HashMap<String,String> paramMap;
  406 + HashMap<String,String> otherMap = new HashMap();
  407 +
  408 + // 车辆内部编码和车牌做映射
  409 + Map<String, String> inside2plate = new HashMap<>();
  410 + Iterable<Cars> cars = carsRepository.findAll();
  411 + for (Cars car : cars) {
  412 + inside2plate.put(car.getInsideCode(), car.getCarPlate());
  413 + }
  414 +
  415 + // 线路编码和线路信息映射
  416 + Map<String, Line> code2line = new HashMap<>();
  417 + Iterable<Line> lines = lineRepository.findAll();
  418 + for (Line line : lines) {
  419 + code2line.put(line.getLineCode(), line);
  420 + }
  421 +
  422 + // 线路编码和线路版本映射(电子路单日期)
  423 + Map<String, Integer> code2version = new HashMap<>();
  424 + Iterable<LineVersions> versions = lineVersionsRepository.findLineVersionsByDate((int)(DateTime.parse(date).getMillis() / 1000));
  425 + for (LineVersions version : versions) {
  426 + code2version.put(version.getLineCode(), version.getVersions());
  427 + }
  428 +
  429 + Map<String, Integer> stationNumMap = null;
  430 + for(Map<String,Object> schRealInfo:listGroup){
  431 + if(schRealInfo != null){
  432 + // 获取线路是否使用标识,如果未使用,则不查该线路数据
  433 + String lineCode = schRealInfo.get("xlBm")+"";
  434 + Line line = code2line.get(lineCode);
  435 + if(line == null || line.getInUse() == null || line.getInUse() == 0){
  436 + ccount++;
  437 + continue;
  438 + }
  439 + if(counter % per == 0){
  440 + sf = new StringBuffer();
  441 + sf.append("<DLDS>");
  442 + }
  443 + counter ++;
  444 + xlbm = BasicData.lineCode2ShangHaiCodeMap.get(lineCode);
  445 + if (!xlbm.equals(oldXlbm)) {
  446 + oldXlbm = xlbm;
  447 + Integer ver = code2version.get(lineCode);
  448 + if (ver != null) {
  449 + stationNumMap = getLsStationRoute(lineCode, ver);
  450 + }
  451 + }
  452 +
  453 + sf.append("<DLD>");
  454 + sf.append("<RQ>").append(date).append("</RQ>");
  455 + sf.append("<XLBM>").append(xlbm).append("</XLBM>");
  456 + sf.append("<LPBH>").append(schRealInfo.get("lpName")).append("</LPBH>");
  457 + sf.append("<CPH>").append(inside2plate.get(schRealInfo.get("clZbh"))).append("</CPH>");
  458 + sf.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
  459 + sf.append("<LDList>");
  460 + for(ScheduleRealInfo scheduleRealInfo:list){
  461 + if((schRealInfo.get("xlBm")+"").equals(scheduleRealInfo.getXlBm()) && (schRealInfo.get("lpName")+"")
  462 + .equals(scheduleRealInfo.getLpName())
  463 + && (schRealInfo.get("clZbh")+"").equals(scheduleRealInfo.getClZbh())){
  464 +
  465 + if(scheduleRealInfo.isDestroy()){
  466 + if(scheduleRealInfo.isReissue()){
  467 + scheduleRealInfo.setFcsjActualAll(scheduleRealInfo.getDfsj());
  468 + scheduleRealInfo.setZdsjActualAll(scheduleRealInfo.getZdsj());
  469 + }
  470 + else
  471 + continue;
  472 + }
  473 +
  474 + if(scheduleRealInfo.getBcType().equals("in")
  475 + || scheduleRealInfo.getBcType().equals("out")){
  476 + continue;
  477 + }
  478 +
  479 + sf.append("<LD>");
  480 + sf.append("<SJGH>").append(scheduleRealInfo.getjGh()).append("</SJGH>");
  481 + sf.append("<SXX>").append(scheduleRealInfo.getXlDir()).append("</SXX>");
  482 + sf.append("<FCZDMC>").append(scheduleRealInfo.getQdzName()).append("</FCZDMC>");
  483 + // 起点站的参数
  484 + otherMap.put("stationMark","B");
  485 + paramMap = packageYgcStationNumParam(scheduleRealInfo,otherMap);
  486 + sf.append("<FCZDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,stationNumMap)).append("</FCZDXH>");
  487 + sf.append("<FCZDBM>").append(scheduleRealInfo.getQdzCode()).append("</FCZDBM>");
  488 + sf.append("<JHFCSJ>").append(scheduleRealInfo.getFcsj()).append("</JHFCSJ>");
  489 + sf.append("<DFSJ>").append(scheduleRealInfo.getDfsj()).append("</DFSJ>");
  490 + sf.append("<SJFCSJ>").append(scheduleRealInfo.getFcsjActual()).append("</SJFCSJ>");
  491 + sf.append("<FCZDLX></FCZDLX>");
  492 + sf.append("<DDZDMC>").append(scheduleRealInfo.getZdzName()).append("</DDZDMC>");
  493 + // 终点站的参数
  494 + otherMap.put("stationMark","E");
  495 + paramMap = packageYgcStationNumParam(scheduleRealInfo,otherMap);
  496 + sf.append("<DDZDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,stationNumMap)).append("</DDZDXH>");
  497 + sf.append("<DDZDBM>").append(scheduleRealInfo.getZdzCode()).append("</DDZDBM>");
  498 + sf.append("<JHDDSJ>").append(scheduleRealInfo.getZdsj()).append("</JHDDSJ>");
  499 + sf.append("<SJDDSJ>").append(scheduleRealInfo.getZdsjActual()).append("</SJDDSJ>");
  500 + sf.append("<DDZDLX></DDZDLX>");
  501 + sf.append("<LDSCBZ>0</LDSCBZ>");
  502 + sf.append("<DDBZ>").append(scheduleRealInfo.getRemarks()).append("</DDBZ>");
  503 + sf.append("</LD>");
  504 + }
  505 + }
  506 + sf.append("</LDList>");
  507 + sf.append("</DLD>");
  508 + }
  509 + if(counter % per == per - 1){
  510 + sf.append("</DLDS>");
  511 + // 去掉'号
  512 + str = sf.toString().replace("'","");
  513 + scount += invokeSetLD(str, counter);
  514 + counter = 0;
  515 + }
  516 + }
  517 + // 每per条线路上传后剩下的数据再上传
  518 + if(counter > 0){
  519 + sf.append("</DLDS>");
  520 + // 去掉'号
  521 + str = sf.toString().replace("'","");
  522 + scount += invokeSetLD(str, counter);
  523 + }
  524 + } catch (Exception e) {
  525 + e.printStackTrace();
  526 + logger.error("setLD:", e);
  527 + } finally {
  528 + try {
  529 + //发送邮件
  530 + EmailBean mail = new EmailBean();
  531 + mail.setSubject(InetAddress.getLocalHost().getHostAddress()+":路单日志数据"+date);
  532 + mail.setContent("总数:" + (listGroup == null ? 0 : listGroup.size()) + "<br/>成功数:" + scount + "<br/>跳过数:" + ccount + "<br/>耗时:" + (System.currentTimeMillis() - start));
  533 + sendEmailController.sendMail(emailSendToAddress, mail);
  534 + logger.info("setLD-sendMail:邮件发送成功!");
  535 + } catch (Exception e) {
  536 + e.printStackTrace();
  537 + logger.error("setLD-sendMail:",e);
  538 + }
  539 + }
  540 + return "success";
  541 + }
  542 +
  543 + /**
  544 + * 调用运管处电子路单接口,如果上传失败或有网络问题,最多执行10次
  545 + * @param xml 拼接的xml字符串
  546 + * @param counter 分组数
  547 + * @return 成功返回counter 失败返回0
  548 + */
  549 + private int invokeSetLD(String xml, int counter) {
  550 + for (int i = 0;i < 10;i++) {
  551 + try {
  552 + Results results = ssop.setLD(userNameOther, passwordOther, StringEscapeUtils.unescapeHtml(xml));
  553 + if (results.isSuccess()) {
  554 + logger.info("setLD: " + xml);
  555 + logger.info("setLD: 成功");
  556 + return counter;
  557 + }
  558 + Thread.sleep(2000);
  559 + } catch (Exception e) {
  560 + logger.error("运管处接口调用异常", e);
  561 + try {
  562 + Thread.sleep(2000);
  563 + } catch (InterruptedException ex) {
  564 + ex.printStackTrace();
  565 + }
  566 + }
  567 + }
  568 +
  569 + return 0;
  570 + }
  571 +
  572 + /**
  573 + * 上传路单 xml来自文件
  574 + * @return 上传成功标识
  575 + */
  576 + public String setLDFile(){
  577 + String result = "failure";
  578 + try {
  579 + String tmp = readXmlFromFile("E:/ld.txt");
  580 + Results rss = ssop.setLD(userNameOther, passwordOther, StringEscapeUtils.unescapeHtml(tmp));
  581 + if(rss.isSuccess()){
  582 + result = "success";
  583 + }
  584 + } catch (Exception e) {
  585 + logger.error("setLD:",e);
  586 + e.printStackTrace();
  587 + }finally{
  588 +
  589 + }
  590 + return result;
  591 + }
  592 +
  593 + /**
  594 + * 从文件中读取xml
  595 + * @param fileName 例:D:/test.txt
  596 + * @return
  597 + * @throws Exception
  598 + */
  599 + private String readXmlFromFile(String fileName) throws Exception {
  600 + StringBuffer sf = new StringBuffer("");
  601 + File file = new File(fileName);
  602 + InputStreamReader reader = new InputStreamReader(new FileInputStream(file),"GBK");
  603 + BufferedReader bufferedReader = new BufferedReader(reader);
  604 + String lineTxt = "";
  605 + while((lineTxt = bufferedReader.readLine()) != null){
  606 + sf.append(lineTxt);
  607 + }
  608 + reader.close();
  609 + return sf.toString().replaceAll("\t","");
  610 + }
  611 + /**
  612 + * 上传里程油耗
  613 + * @return 上传成功标识
  614 + */
  615 + public String setLCYH(){
  616 + String result = "failure";
  617 + // 取昨天 的日期
  618 + String date = sdfnyr.format(DateUtils.addDays(new Date(), -1));
  619 + StringBuffer sf = new StringBuffer();
  620 + try {
  621 + sf.append("<LCYHS>");
  622 + List<Map<String,Object>> listGroup = scheduleRealInfoRepository.setLCYHGroup(date);
  623 + List<ScheduleRealInfo> list = scheduleRealInfoRepository.findByDate(date);
  624 + Map<String,Object> map = new HashMap<String,Object>();
  625 + for(Map<String,Object> schRealInfo:listGroup){
  626 + if(schRealInfo != null){
  627 + map.put("insideCode_eq", schRealInfo.get("clZbh")+"");
  628 + Optional<Cars> optionalCars = carsRepository.findOne(new CustomerSpecs<Cars>(map));
  629 + Cars car = optionalCars.isPresent() ? optionalCars.get() : null;
  630 + /**
  631 + * 如果car==null,则说明该车辆是从线调中换车功能中加进去的,
  632 + * 在cars基础信息中查不到车辆的信息,所以忽略该车辆
  633 + */
  634 + if(car == null){
  635 + continue;
  636 + }
  637 + //计算总公里和空驶公里,营运公里=总公里-空驶公里
  638 + double totalKilometers = 0,emptyKilometers =0;
  639 + sf.append("<LCYH>");
  640 + sf.append("<RQ>"+date+"</RQ>");
  641 + sf.append("<XLBM>"+BasicData.lineCode2ShangHaiCodeMap.get(schRealInfo.get("xlBm"))+"</XLBM>");
  642 + sf.append("<CPH>"+car.getCarPlate()+"</CPH>");
  643 + if(list != null && list.size() > 0){
  644 + for(ScheduleRealInfo scheduleRealInfo:list){
  645 + if((schRealInfo.get("xlBm")+"").equals(scheduleRealInfo.getXlBm()) && (schRealInfo.get("clZbh")+"")
  646 + .equals(scheduleRealInfo.getClZbh())){
  647 + Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
  648 + //如果没有子任务,里程就是已执行(Status=2);有子任务的,忽略主任务,子任务的烂班
  649 + if(childTaskPlans.isEmpty()){
  650 + if(scheduleRealInfo.getStatus() == 2){
  651 + totalKilometers += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();
  652 + if(scheduleRealInfo.getBcType().equals("in") || scheduleRealInfo.getBcType().equals("out")
  653 + || scheduleRealInfo.getBcType().equals("venting")){
  654 + emptyKilometers += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();
  655 + }
  656 + }
  657 + }else{
  658 + Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
  659 + while(it.hasNext()){
  660 + ChildTaskPlan childTaskPlan = it.next();
  661 + if(!childTaskPlan.isDestroy()){
  662 + totalKilometers += childTaskPlan.getMileage()==null?0.0:childTaskPlan.getMileage();
  663 + if(childTaskPlan.getMileageType().equals("empty")){
  664 + emptyKilometers += childTaskPlan.getMileage()==null?0.0:childTaskPlan.getMileage();;
  665 + }
  666 + }
  667 + }
  668 + }
  669 + }
  670 + }
  671 + }
  672 + sf.append("<ZLC>"+totalKilometers+"</ZLC>");
  673 + sf.append("<YYLC>"+emptyKilometers+"</YYLC>");
  674 + sf.append("<YH>"+""+"</YH>");
  675 + sf.append("<JZYL>"+""+"</JZYL>");
  676 + sf.append("<DH>"+""+"</DH>");
  677 + sf.append("<UPDT>"+sdfnyrsfm.format(new Date())+"</UPDT>");
  678 + sf.append("<BBSCBZ>"+0+"</BBSCBZ>");
  679 + sf.append("</LCYH>");
  680 + }
  681 + }
  682 + sf.append("</LCYHS>");
  683 + if(ssop.setLCYH(userNameOther, passwordOther, sf.toString()).isSuccess()){
  684 + result = "success";
  685 + }
  686 + } catch (Exception e) {
  687 + logger.error("setLCYH:",e);
  688 + e.printStackTrace();
  689 + }finally{
  690 + logger.info("setLCYH:"+sf.toString());
  691 + logger.info("setLCYH:"+result);
  692 + }
  693 + return result;
  694 + }
  695 +
  696 + /**
  697 + * 上传线路调度日报
  698 + * @return
  699 + */
  700 + public String setDDRB(){
  701 + String result = "failure";
  702 + // 取昨天 的日期
  703 + String date = sdfnyr.format(DateUtils.addDays(new Date(), -1));
  704 + StringBuffer sf = new StringBuffer();
  705 + try {
  706 + sf.append("<DDRBS>");
  707 + List<Map<String,Object>> listGroup = scheduleRealInfoRepository.setDDRBGroup(date);
  708 + List<ScheduleRealInfo> list = scheduleRealInfoRepository.findByDate(date);
  709 + for(Map<String,Object> schRealInfo:listGroup){
  710 + if(schRealInfo != null){
  711 + double jhlc = 0,zlc = 0,jhkslc = 0,sjkslc = 0;
  712 + int jhbc = 0,sjbc = 0,jhzgfbc = 0,sjzgfbc = 0,jhwgfbc = 0,sjwgfbc = 0;
  713 + sf.append("<DDRB>");
  714 + sf.append("<RQ>"+date+"</RQ>");
  715 + sf.append("<XLBM>"+BasicData.lineCode2ShangHaiCodeMap.get(schRealInfo.get("xlBm"))+"</XLBM>");
  716 + for(ScheduleRealInfo scheduleRealInfo:list){
  717 + if(scheduleRealInfo != null){
  718 + if((schRealInfo.get("xlBm")+"").equals(scheduleRealInfo.getXlBm())){
  719 + //计划
  720 + if(!scheduleRealInfo.isSflj()){
  721 + jhlc += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();
  722 + //计划空驶
  723 + if(scheduleRealInfo.getBcType().equals("in") || scheduleRealInfo.getBcType().equals("out")){
  724 + jhkslc += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();
  725 + }
  726 + //计划早高峰,计划晚高峰
  727 + if(TimeUtils.morningPeak(scheduleRealInfo.getFcsj())){
  728 + jhzgfbc++;
  729 + } else if(TimeUtils.evenignPeak(scheduleRealInfo.getFcsj())){
  730 + jhwgfbc++;
  731 + }
  732 + }
  733 + jhbc++;
  734 +
  735 + //实际
  736 + Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
  737 + //如果没有子任务,里程就是已执行(Status=2);有子任务的,忽略主任务,子任务的烂班
  738 + if(childTaskPlans.isEmpty()){
  739 + if(scheduleRealInfo.getStatus() == 2){
  740 + sjbc++;
  741 + zlc += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();
  742 + if(scheduleRealInfo.getBcType().equals("in") || scheduleRealInfo.getBcType().equals("out")
  743 + || scheduleRealInfo.getBcType().equals("venting")){
  744 + sjkslc += scheduleRealInfo.getJhlc()==null?0.0:scheduleRealInfo.getJhlc();;
  745 + }
  746 + }
  747 + }else{
  748 + sjbc++;
  749 + Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
  750 + while(it.hasNext()){
  751 + ChildTaskPlan childTaskPlan = it.next();
  752 + if(!childTaskPlan.isDestroy()){
  753 + zlc += childTaskPlan.getMileage()==null?0.0:childTaskPlan.getMileage();
  754 + if(childTaskPlan.getMileageType().equals("empty")){
  755 + sjkslc += childTaskPlan.getMileage()==null?0.0:childTaskPlan.getMileage();;
  756 + }
  757 + }
  758 + }
  759 + }
  760 + //实际早高峰,计划晚高峰
  761 + if(scheduleRealInfo.getFcsjActual() != null){
  762 + if(TimeUtils.morningPeak(scheduleRealInfo.getFcsj())){
  763 + sjzgfbc++;
  764 + } else if(TimeUtils.evenignPeak(scheduleRealInfo.getFcsj())){
  765 + sjwgfbc++;
  766 + }
  767 + }
  768 + }
  769 + }
  770 + }
  771 + sf.append("<JHLC>"+format.format(jhlc)+"</JHLC>");
  772 + sf.append("<SSLC>"+format.format((zlc-sjkslc))+"</SSLC>");
  773 + sf.append("<JHKSLC>"+format.format(jhkslc)+"</JHKSLC>");
  774 + sf.append("<SJKSLC>"+format.format(sjkslc)+"</SJKSLC>");
  775 + sf.append("<JHBC>"+jhbc+"</JHBC>");
  776 + sf.append("<SJBC>"+sjbc+"</SJBC>");
  777 + sf.append("<JHZGFBC>"+jhzgfbc+"</JHZGFBC>");
  778 + sf.append("<SJZGFBC>"+sjzgfbc+"</SJZGFBC>");
  779 + sf.append("<JHWGFBC>"+jhwgfbc+"</JHWGFBC>");
  780 + sf.append("<SJWGFBC>"+sjwgfbc+"</SJWGFBC>");
  781 + sf.append("<UPDT>"+sdfnyrsfm.format(new Date())+"</UPDT>");
  782 + sf.append("<RBSCBZ>"+0+"</RBSCBZ>");
  783 + sf.append("</DDRB>");
  784 + }
  785 + }
  786 + sf.append("</DDRBS>");
  787 + if(ssop.setDDRB(userNameOther, passwordOther, sf.toString()).isSuccess()){
  788 + result = "success";
  789 + }
  790 + } catch (Exception e) {
  791 + logger.error("setDDRB:",e);
  792 + e.printStackTrace();
  793 + }finally{
  794 + logger.info("setDDRB:"+sf.toString());
  795 + logger.info("setDDRB:"+result);
  796 + }
  797 + return result;
  798 + }
  799 +
  800 + /**
  801 + * 上传计划班次 指定日期 yyyy-MM-dd
  802 + * @param theDate
  803 + * @return
  804 + */
  805 + public String setJHBC(String theDate){
  806 + return uploadJHBC(theDate);
  807 + }
  808 +
  809 + /**
  810 + * 上传计划班次
  811 + * @return
  812 + */
  813 + public String setJHBC(){
  814 + return uploadJHBC(null);
  815 + }
  816 + /**
  817 + * 上传线路计划班次表
  818 + */
  819 +
  820 + private String uploadJHBC(String theDate) {
  821 + String result = "failure";
  822 + Line line;
  823 + StringBuffer sBuffer =new StringBuffer();
  824 + try {
  825 + sBuffer.append("<JHBCs>");
  826 + // 声明变量
  827 + SchedulePlanInfo schedulePlanInfo;
  828 + String xlbm,zbh = "";
  829 + Long lp = 0L;
  830 + // 取得计划班次时间
  831 + String tomorrow = theDate == null ? sdfnyr.format(DateUtils.addDays(new Date(), +1)) : theDate;
  832 + // 查询所有班次
  833 + List<SchedulePlanInfo> schedulePlanList = schedulePlanInfoRepository.findLineScheduleBc(tomorrow);
  834 + int j = 0; // 初始化标识
  835 + if(schedulePlanList != null ){
  836 + HashMap<String,String> paramMap;
  837 + HashMap<String,String> otherMap = new HashMap<String, String>();
  838 + int size = schedulePlanList.size();
  839 + for (int i = 0; i < size; i++) {
  840 + schedulePlanInfo = schedulePlanList.get(i);
  841 + xlbm = schedulePlanInfo.getXlBm();
  842 + // 获取线路是否使用标识,如果未使用,则不查该线路数据
  843 + line = lineRepository.findByLineCode(xlbm);
  844 + if(line.getInUse() == null || line.getInUse() == 0){
  845 + continue;
  846 + }
  847 + if(++j == 1){// 第一次,则初始化值
  848 + zbh = schedulePlanInfo.getClZbh();
  849 + lp = schedulePlanInfo.getLp();
  850 + // 拼装XML
  851 + assembleJHBC(sBuffer, schedulePlanInfo, xlbm, zbh, lp);
  852 + }
  853 + // 比较是否为同一条线路同一辆车
  854 + if(xlbm.equals(schedulePlanInfo.getXlBm())
  855 + && zbh.equals(schedulePlanInfo.getClZbh())
  856 + && lp == schedulePlanInfo.getLp()){
  857 + if(schedulePlanInfo.getBcType().equals("in") || schedulePlanInfo.getBcType().equals("out")){
  858 + continue;
  859 + }
  860 + sBuffer.append("<BC>");
  861 + sBuffer.append("<SJGH>").append(schedulePlanInfo.getjGh()).append("</SJGH>");
  862 + sBuffer.append("<SXX>").append(schedulePlanInfo.getXlDir()).append("</SXX>");
  863 + sBuffer.append("<FCZDMC>").append(schedulePlanInfo.getQdzName()).append("</FCZDMC>");
  864 + // 起点站的参数
  865 + otherMap.put("stationMark","B");
  866 + paramMap = packageYgcStationNumParam(schedulePlanInfo,otherMap);
  867 + sBuffer.append("<ZDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,null)).append("</ZDXH>");
  868 + sBuffer.append("<JHFCSJ>").append(schedulePlanInfo.getFcsj()).append("</JHFCSJ>");
  869 + sBuffer.append("<DDZDMC>").append(schedulePlanInfo.getZdzName()).append("</DDZDMC>");
  870 + // 起点站的参数
  871 + otherMap.put("stationMark","E");
  872 + paramMap = packageYgcStationNumParam(schedulePlanInfo,otherMap);
  873 + sBuffer.append("<DDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,null)).append("</DDXH>");
  874 + sBuffer.append("<JHDDSJ>").append(calcDdsj(schedulePlanInfo.getFcsj(),schedulePlanInfo.getBcsj()))
  875 + .append("</JHDDSJ>");
  876 + sBuffer.append("</BC>");
  877 + if(i == size -1 ){
  878 + sBuffer.append("</BCList>");
  879 + sBuffer.append("</JHBC>");
  880 + }
  881 + }else{
  882 + zbh = schedulePlanInfo.getClZbh();
  883 + lp = schedulePlanInfo.getLp();
  884 + sBuffer.append("</BCList>");
  885 + sBuffer.append("</JHBC>");
  886 + // 拼装XML
  887 + assembleJHBC(sBuffer, schedulePlanInfo, xlbm, zbh, lp);
  888 + }
  889 + }
  890 + }
  891 + // 判断XML是否以</BCList>结尾,如果不是,则加上
  892 + String regex = "^*</JHBC>$";
  893 + Pattern p = Pattern.compile(regex);
  894 + Matcher m = p.matcher(sBuffer);
  895 + boolean isEndWithTrueFlag = false;
  896 + while (m.find()) {
  897 + isEndWithTrueFlag = true;
  898 + }
  899 + // 加上缺失的标签
  900 + if(!isEndWithTrueFlag){
  901 + sBuffer.append("</BCList>");
  902 + sBuffer.append("</JHBC>");
  903 + }
  904 + sBuffer.append("</JHBCs>");
  905 + if(ssop.setJHBC(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
  906 + result = "success";
  907 + }
  908 + } catch (Exception e) {
  909 + logger.error("setJHBC:",e);
  910 + e.printStackTrace();
  911 + }finally{
  912 + logger.info("setJHBC:"+sBuffer.toString());
  913 + logger.info("setJHBC:"+result);
  914 + }
  915 + return result;
  916 + }
  917 +
  918 + /**
  919 + * 上传线路班次时刻表数据
  920 + */
  921 + @Override
  922 + public String setSKB(String ids) {
  923 + String result = "上传失败,";
  924 + StringBuffer sBuffer = new StringBuffer("<SKBs>");
  925 + DecimalFormat df = new DecimalFormat("######0.000");
  926 + Map<String,String> lsStationCode2NameMap = null;
  927 + Map<String, Integer> lsStationName2YgcNumber = null;
  928 + try {
  929 + String[] idArray = ids.split(",");
  930 + StringBuffer sBufferA ,sBufferB ,sBufferC ;
  931 + double zlc,yylc,singleLc,emptyLc;// 总里程、营运里程、单程、空放里程
  932 + String bcType,sxx;// 班次类型、上下行
  933 + // 上传的时刻表集合
  934 + List<TTInfo> ttinfoList = new ArrayList<>();
  935 + TTInfo ttInfo;
  936 + TTInfoDetail ttInfoDetail;
  937 + LineInformation lineInformation;
  938 + Iterator<TTInfoDetail> ttInfoDetailIterator;
  939 + HashMap<String,Object> param ;
  940 + HashMap<String,String> paramMap;
  941 + HashMap<String,String> otherMap = new HashMap<>();
  942 + // 线路编码、周几执行、发车站点名称、发车站点序号、到达站点名称、到达站点序号
  943 + String xlbm,zjzx,fczdmc,zdxh,ddzdmc,ddxh;
  944 + // 得到时刻表版本号
  945 + int lineVersion;
  946 + long ttinfoId;
  947 + // 是否输出站点信息
  948 + boolean isLogStation;
  949 + for (int i = 0; i < idArray.length; i++) {
  950 + ttinfoId = Long.valueOf(idArray[i]);
  951 + Optional<TTInfo> optionalTTInfo = ttInfoRepository.findById(ttinfoId);
  952 + ttInfo = optionalTTInfo.isPresent() ? optionalTTInfo.get() : null;
  953 + if(ttInfo == null)
  954 + continue;
  955 + ttinfoList.add(ttInfo); // 保存时刻表
  956 + // 得到时刻表版本号
  957 + lineVersion = ttInfo.getLineVersion();
  958 + // 查询历史站点路由
  959 + lsStationCode2NameMap = getLsStationCode(ttInfo.getXl().getLineCode(),lineVersion);
  960 + // 查询历史站点路由
  961 + lsStationName2YgcNumber = getLsStationRoute(ttInfo.getXl().getLineCode(),lineVersion);
  962 + zlc = 0.0f;
  963 + yylc = 0.0f;
  964 + // 获得时刻表
  965 + param = new HashMap();
  966 + param.put("ttinfo.id_eq", ttInfo.getId());
  967 + ttInfoDetailIterator = ttInfoDetailRepository.findAll(new CustomerSpecs<TTInfoDetail>(param),
  968 + new Sort(Direction.ASC, "xlDir")).iterator();
  969 + // 获得lineInformation
  970 + param = new HashMap();
  971 + param.put("line.id_eq", ttInfo.getXl().getId());
  972 + Optional<LineInformation> optionalLineInformation = lineInformationRepository.findOne(new CustomerSpecs<LineInformation>(param));
  973 + lineInformation = optionalLineInformation.isPresent() ? optionalLineInformation.get() : null;
  974 + // 初始化
  975 + isLogStation = true;
  976 + if(ttInfoDetailIterator.hasNext()){
  977 + // 得到线路信息
  978 + Optional<Line> optionalLine = lineRepository.findById(ttInfo.getXl().getId());
  979 + Line line = optionalLine.isPresent() ? optionalLine.get() : null;
  980 + if(line == null){
  981 + result += "未找到相应的线路信息,请设置线路信息后再上传";
  982 + return result;
  983 + }
  984 + // 得到上海市线路编码
  985 + xlbm = line.getShanghaiLinecode();
  986 + if("".equals(xlbm) || "null".equals(xlbm)){
  987 + result += "线路编码为空,请设置线路编码后再上传";
  988 + return result;
  989 + }
  990 + // 拿到周几执行
  991 + zjzx = changeRuleDay(ttInfo.getRule_days());
  992 + if("".equals(zjzx) || "null".equals(zjzx)){
  993 + result += "时刻表执行时间为空,请设置执行时间后再上传";
  994 + return result;
  995 + }
  996 + sBuffer.append("<SKB>");
  997 + sBuffer.append("<XLBM>").append(xlbm).append("</XLBM>");
  998 + sBufferB = new StringBuffer();
  999 + sBufferC = new StringBuffer();
  1000 + sBufferB.append("<KSRQ>").append(sdfnyr.format(ttInfo.getQyrq())).append("</KSRQ>");
  1001 + // 结束日期暂时不要,节假日的班次表才需要,如春节的班次表
  1002 + sBufferB.append("<JSRQ>").append("").append("</JSRQ>");
  1003 + sBufferB.append("<ZJZX>").append(zjzx).append("</ZJZX>");
  1004 + sBufferB.append("<TBYY>").append("").append("</TBYY>");
  1005 + sBufferB.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
  1006 + sBufferB.append("<BCList>");
  1007 + while (ttInfoDetailIterator.hasNext()) {
  1008 + ttInfoDetail = ttInfoDetailIterator.next();
  1009 + bcType = ttInfoDetail.getBcType();
  1010 + sxx = ttInfoDetail.getXlDir();
  1011 + // 进出场班次的里程,加入总里程
  1012 + if(bcType.equals("in") || bcType.equals("out")){
  1013 + // 进出班次的计划里程,算空驶里程
  1014 + emptyLc = ttInfoDetail.getJhlc();
  1015 + // 总里程需要加上空驶里程
  1016 + zlc += emptyLc;
  1017 + continue;
  1018 + }
  1019 + // 不是正常班次,不传到运管处
  1020 + if(!bcType.equals("normal")){
  1021 + continue;
  1022 + }
  1023 + // 如果发车时间格式错误,忽略此条
  1024 + if(changeTimeFormat(ttInfoDetail) == null){
  1025 + continue;
  1026 + }
  1027 + // 发生站点名称
  1028 + fczdmc = lsStationCode2NameMap.get(ttInfoDetail.getXl().getLineCode()+"_"+ttInfoDetail.getXlDir()+"_"+ttInfoDetail.getQdzCode());
  1029 + if("".equals(fczdmc) || "null".equals(fczdmc)){
  1030 + result += "发车站点名称为空,请根据时刻表当前的版本号设置好历史站点路由再上传";
  1031 + return result;
  1032 + }
  1033 + sBufferC.append("<BC>");
  1034 + sBufferC.append("<LPBH>").append(ttInfoDetail.getLp().getLpNo()).append("</LPBH>");
  1035 + sBufferC.append("<SXX>").append(sxx).append("</SXX>");
  1036 + sBufferC.append("<FCZDMC>").append(fczdmc).append("</FCZDMC>");
  1037 + // 起点站的参数
  1038 + otherMap.put("stationMark","B");
  1039 + paramMap = packageYgcStationNumParam(ttInfoDetail,otherMap);
  1040 + if(isLogStation){// 输出起点站信息
  1041 + logger.info("setSKB:"+"起点站信息:"+paramMap);
  1042 + }
  1043 + // 发车站点序号
  1044 + zdxh = String.valueOf(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,lsStationName2YgcNumber));
  1045 + if("".equals(zdxh) || "null".equals(zdxh) || "0".equals(zdxh)){
  1046 + result += "发车站点序号为空,请根据时刻表当前的版本号设置好历史站点路由再上传";
  1047 + return result;
  1048 + }
  1049 + // 到达站点名称
  1050 + ddzdmc = lsStationCode2NameMap.get(ttInfoDetail.getXl().getLineCode()+"_"+ttInfoDetail.getXlDir()+"_"+ttInfoDetail.getZdzCode());
  1051 + if("".equals(ddzdmc) || "null".equals(ddzdmc)){
  1052 + result += "到达站点名称为空,请根据时刻表当前的版本号设置好历史站点路由再上传";
  1053 + return result;
  1054 + }
  1055 + sBufferC.append("<ZDXH>").append(zdxh).append("</ZDXH>");
  1056 + sBufferC.append("<JHFCSJ>").append(changeTimeFormat(ttInfoDetail)).append("</JHFCSJ>");
  1057 + sBufferC.append("<DDZDMC>").append(ddzdmc).append("</DDZDMC>");
  1058 + // 终点站的参数
  1059 + otherMap.put("stationMark","E");
  1060 + paramMap = packageYgcStationNumParam(ttInfoDetail,otherMap);
  1061 + if(isLogStation){// 输出终点站信息
  1062 + logger.info("setSKB:"+"终点站信息:"+paramMap);
  1063 + }
  1064 + // 到达站点序号
  1065 + ddxh = String.valueOf(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,lsStationName2YgcNumber));
  1066 + if("".equals(ddxh) || "null".equals(ddxh) || "0".equals(ddxh)){
  1067 + result += "到达站点序号为空,请根据时刻表当前的版本号设置好历史站点路由再上传";
  1068 + return result;
  1069 + }
  1070 + isLogStation = false; // 一条线路只输出一次,后面的不输出了
  1071 + sBufferC.append("<DDXH>").append(ddxh).append("</DDXH>");
  1072 + sBufferC.append("<JHDDSJ>").append(calcDdsj(ttInfoDetail.getFcsj(),ttInfoDetail.getBcsj())).append("</JHDDSJ>");
  1073 + sBufferC.append("</BC>");
  1074 + // 0:上行;1:下行
  1075 + if("0".equals(sxx)){
  1076 + singleLc = lineInformation.getUpMileage();
  1077 + }else{
  1078 + singleLc = lineInformation.getDownMileage();
  1079 + }
  1080 + zlc += singleLc ;
  1081 + yylc += singleLc;
  1082 + }
  1083 + sBufferC.append("</BCList>");
  1084 + sBufferC.append("</SKB>");
  1085 + sBufferA = new StringBuffer();
  1086 + sBufferA.append("<JHZLC>").append(df.format(zlc)).append("</JHZLC>");
  1087 + sBufferA.append("<JHYYLC>").append(df.format(yylc)).append("</JHYYLC>");
  1088 + sBuffer.append(sBufferA).append(sBufferB).append(sBufferC);
  1089 + }
  1090 + logger.info("setSKB:"+"ttinfoId:"+ttinfoId+";当前站点版本号:"+lineVersion+";查询历史站点路由:"+lsStationCode2NameMap+";查询历史站点编号:"+lsStationName2YgcNumber);
  1091 + }
  1092 + sBuffer.append("</SKBs>");
  1093 + String state;// 是否上传成功
  1094 + if(ssop.setSKB(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
  1095 + result = "上传成功";
  1096 + state = "1";
  1097 + }else{// 上传失败
  1098 + result = "上传失败";
  1099 + state = "0";
  1100 + }
  1101 + // 保存运管处上传记录
  1102 + saveYgcUploadLog(ttinfoList,sBuffer.toString(),TrafficManageServiceImpl.UPLOAD_TYPE_SKB,state);
  1103 + } catch (Exception e) {
  1104 + logger.error("setSKB:", e);
  1105 + e.printStackTrace();
  1106 + }finally{
  1107 + logger.info("setSKB:"+sBuffer.toString());
  1108 + logger.info("setSKB:"+result);
  1109 + }
  1110 + return result;
  1111 + }
  1112 +
  1113 + /**
  1114 + * 保存上传运管处的日志
  1115 + * @param obj 参数
  1116 + * @param type 日志类型
  1117 + * @param xml 上传参数
  1118 + */
  1119 + private void saveYgcUploadLog(Object obj,String xml,String type,String state){
  1120 + SKBUploadLogger skbUploadLogger = new SKBUploadLogger();
  1121 + SysUser user;
  1122 + // 如果不是人为上传,SysUser则为空,设置上传人员为管理员
  1123 + if(SecurityContextHolder.getContext() == null || SecurityContextHolder.getContext().getAuthentication() == null){
  1124 + user = new SysUser();
  1125 + user.setId(1);
  1126 + }else{// 获取上传人员
  1127 + user = SecurityUtils.getCurrentUser();
  1128 + }
  1129 + // 最大的字符长度
  1130 + int maxLength = 60000;
  1131 + int cutLength = 50000;// 需要截取的字符长度
  1132 + String xml_sub = null;
  1133 + skbUploadLogger.setType(type);// 设置类型
  1134 + // 判断xml是否超长,如果超长,则截取
  1135 + if(xml != null && xml.length() > maxLength){
  1136 + int xmlLength = xml.length();
  1137 + int cutCount = xmlLength / cutLength + (xmlLength % cutLength > 0 ? 1 : 0);
  1138 + if(cutCount > 2){
  1139 + xml = "由于上传参数内容超长,请查看服务器的系统日志";
  1140 + }else if(cutCount == 2){
  1141 + xml_sub =xml.substring(cutLength);
  1142 + xml = xml.substring(0,cutLength);
  1143 + }else{
  1144 + // 不做处理
  1145 + }
  1146 + }
  1147 +// skbUploadLogger.setUploadXml(xml);// 上传的参数
  1148 +// skbUploadLogger.setUploadXmlSub(xml_sub);
  1149 + skbUploadLogger.setState(state);// 状态:是否成功
  1150 + skbUploadLogger.setUser(user);
  1151 + // 时刻表
  1152 + if(type.equals(TrafficManageServiceImpl.UPLOAD_TYPE_SKB)){
  1153 + List<TTInfo> ttInfoList = (List<TTInfo>)obj;
  1154 + String name = "";
  1155 + Line line = null;
  1156 + for(TTInfo ttInfo : ttInfoList){
  1157 + name += ttInfo.getName() + " ";
  1158 + line = ttInfo.getXl();
  1159 + }
  1160 + skbUploadLogger.setLine(line);
  1161 + skbUploadLogger.setUser(user);
  1162 + skbUploadLogger.setName(name);
  1163 + skbUploadLoggerRepository.save(skbUploadLogger);
  1164 + }else{
  1165 + if(type.equals(TrafficManageServiceImpl.UPLOAD_TYPE_XL)){
  1166 + Line line = (Line) obj;
  1167 + String name = line.getName() + "线路停靠站上传";
  1168 + skbUploadLogger.setLine(line);
  1169 + skbUploadLogger.setName(name);
  1170 + skbUploadLoggerRepository.save(skbUploadLogger);
  1171 + }else if(type.equals(TrafficManageServiceImpl.UPLOAD_TYPE_LD)){
  1172 + Map<String ,Line> logLineMap = (Map<String ,Line> )obj;
  1173 + for (String key : logLineMap.keySet()) {
  1174 + Line line = logLineMap.get(key);
  1175 + String name = line.getName() + "路单上传";
  1176 + skbUploadLogger = new SKBUploadLogger();
  1177 + skbUploadLogger.setType(type);// 设置类型
  1178 +// skbUploadLogger.setUploadXml(xml);// 上传的参数
  1179 +// skbUploadLogger.setUploadXmlSub(xml_sub);
  1180 + skbUploadLogger.setState(state);// 状态:是否成功
  1181 + skbUploadLogger.setUser(user);
  1182 + skbUploadLogger.setLine(line);
  1183 + skbUploadLogger.setName(name);
  1184 +// skbUploadLoggerRepository.save(skbUploadLogger);
  1185 + }
  1186 + }
  1187 + }
  1188 + }
  1189 + /**
  1190 + * 上传线路人员车辆配置信息
  1191 + */
  1192 + @Override
  1193 + public String setXLPC() {
  1194 + String result = "failure";
  1195 + StringBuffer sBuffer =new StringBuffer();
  1196 + try {
  1197 + sBuffer.append("<XLPCs>");
  1198 + // 声明变量
  1199 + Line line = null;
  1200 + Cars cars = null;
  1201 + List<Personnel> personnelList = null;
  1202 + List<Cars> carsList = null;
  1203 + int totalPersonnel,totalCar ;// 人员数量。车辆数量
  1204 + // 查询所有线路
  1205 + Iterator<Line> lineIterator = lineRepository.findAll().iterator();
  1206 + // 循环查找线路下的信息
  1207 + while(lineIterator.hasNext()){
  1208 + line = lineIterator.next();
  1209 + sBuffer.append("<XLPC>");
  1210 + sBuffer.append("<XLBM>").append(BasicData.lineId2ShangHaiCodeMap.get(line.getId())).append("</XLBM>");
  1211 + // 查询驾驶员数量
  1212 + personnelList = personnelRepository.findJsysByLineId(line.getId());
  1213 + totalPersonnel = personnelList != null ? personnelList.size():0;
  1214 + sBuffer.append("<SJRS>").append(totalPersonnel).append("</SJRS>");
  1215 + // 查询售票员人员数量
  1216 + personnelList = personnelRepository.findSpysByLineId(line.getId());
  1217 + totalPersonnel = personnelList != null ? personnelList.size():0;
  1218 + sBuffer.append("<SPYRS>").append(totalPersonnel).append("</SPYRS>");
  1219 + // 查询车辆
  1220 + carsList = carsRepository.findCarsByLineId(line.getId());
  1221 + totalCar = carsList != null ? carsList.size():0;
  1222 + sBuffer.append("<PCSL>").append(totalCar).append("</PCSL>");
  1223 + sBuffer.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
  1224 + int carsNum = 0;
  1225 + // 取车牌号
  1226 + if(carsList != null){
  1227 + carsNum = carsList.size();
  1228 + sBuffer.append("<CPHList>");
  1229 + for (int i = 0; i < carsNum; i++) {
  1230 + cars = carsList.get(i);
  1231 + sBuffer.append("<CPH>").append("沪").append(cars.getCarCode()).append("</CPH>");
  1232 + }
  1233 + sBuffer.append("</CPHList>");
  1234 + }
  1235 + sBuffer.append("</XLPC>");
  1236 + }
  1237 + sBuffer.append("</XLPCs>");
  1238 + if(ssop.setXLPC(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
  1239 + result = "success";
  1240 + }
  1241 + } catch (Exception e) {
  1242 + logger.error("setXLPC:",e);
  1243 + e.printStackTrace();
  1244 + }finally{
  1245 + logger.info("setXLPC:"+sBuffer.toString());
  1246 + logger.info("setXLPC:"+result);
  1247 + }
  1248 + return result;
  1249 + }
  1250 +
  1251 +
  1252 + /**
  1253 + * 上传超速数据
  1254 + */
  1255 + @Override
  1256 + public String setCS() {
  1257 + String result = "failure";
  1258 + StringBuffer sBuffer =new StringBuffer();
  1259 + sBuffer.append("<CSs>");
  1260 + String sql = "SELECT * FROM bsth_c_speeding where DATE_FORMAT(create_date,'%Y-%m-%d') = ? order by create_date ";
  1261 + Connection conn = null;
  1262 + PreparedStatement ps = null;
  1263 + ResultSet rs = null;
  1264 + // 取昨天 的日期
  1265 + String yesterday = sdfnyr.format(DateUtils.addDays(new Date(), -1));
  1266 + try {
  1267 + conn = DBUtils_MS.getConnection();
  1268 + ps = conn.prepareStatement(sql);
  1269 + ps.setString(1, yesterday);
  1270 + rs = ps.executeQuery();
  1271 + Float lon, lat;
  1272 + String kssk;
  1273 + String speed;
  1274 + while (rs.next()) {
  1275 + kssk = sdfnyrsfm.format(rs.getLong("TIMESTAMP"));
  1276 + speed = rs.getString("SPEED");
  1277 + // 经纬度
  1278 + lon = rs.getFloat("LON");
  1279 + lat = rs.getFloat("LAT");
  1280 + sBuffer.append("<CS>");
  1281 + sBuffer.append("<RQ>").append(sdfnyr.format(rs.getDate("CREATE_DATE"))).append("</RQ>");
  1282 + sBuffer.append("<XLBM>").append(BasicData.lineCode2ShangHaiCodeMap.get(rs.getString("LINE"))).append("</XLBM>");////////
  1283 + sBuffer.append("<CPH>").append(rs.getString("VEHICLE")).append("</CPH>");
  1284 + sBuffer.append("<KSSK>").append(kssk).append("</KSSK>");
  1285 + sBuffer.append("<KSDDJD>").append(lon).append("</KSDDJD>");
  1286 + sBuffer.append("<KSDDWD>").append(lat).append("</KSDDWD>");
  1287 + sBuffer.append("<KSLD>").append("").append("</KSLD>");//**********************
  1288 + sBuffer.append("<JSSK>").append(kssk).append("</JSSK>");
  1289 + sBuffer.append("<JSDDJD>").append(lon).append("</JSDDJD>");
  1290 + sBuffer.append("<JSDDWD>").append(lat).append("</JSDDWD>");
  1291 + sBuffer.append("<JSLD>").append("").append("</JSLD>");//**********************
  1292 + sBuffer.append("<PJSD>").append(speed).append("</PJSD>");
  1293 + sBuffer.append("<ZGSS>").append(speed).append("</ZGSS>");
  1294 + sBuffer.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
  1295 + sBuffer.append("</CS>");
  1296 + }
  1297 + sBuffer.append("</CSs>");
  1298 + if(ssop.setCS(userNameOther, passwordOther, sBuffer.toString()).isSuccess()){
  1299 + result = "success";
  1300 + }
  1301 + } catch (Exception e) {
  1302 + logger.error("setCS:",e);
  1303 + e.printStackTrace();
  1304 + } finally {
  1305 + logger.info("setCS:"+sBuffer.toString());
  1306 + logger.info("setCS:"+result);
  1307 + DBUtils_MS.close(rs, ps, conn);
  1308 + }
  1309 + return result;
  1310 + }
  1311 +
  1312 +
  1313 + /**
  1314 + * 下载全量的公交基础数据
  1315 + */
  1316 + public String getDownLoadAllDataFile() {
  1317 + String result = "failure";
  1318 + try {
  1319 + try {
  1320 + if(ygcBasicDataService.download("admin","000000","abc.zip")){
  1321 + result = "success";
  1322 + }
  1323 + } catch (Exception e) {
  1324 + e.printStackTrace();
  1325 + }
  1326 + } catch (Exception e) {
  1327 + e.printStackTrace();
  1328 + }
  1329 +
  1330 + return result;
  1331 + }
  1332 +
  1333 + /**
  1334 + * 下载增量的公交基础数据
  1335 + */
  1336 + public String getDownLoadIncreaseDataFile() {
  1337 + String result = "success";
  1338 + try {
  1339 + //System.out.println(portType.downloadIncreaseDataFile(args0, args1, args2));
  1340 + } catch (Exception e) {
  1341 + e.printStackTrace();
  1342 + }
  1343 +
  1344 + return result;
  1345 + }
  1346 +
  1347 + /**
  1348 + * 指定线路查询方式公交基础数据下载
  1349 + */
  1350 + public String getDownLoadWarrantsBusLineStation() {
  1351 + String result = "success";
  1352 + try {
  1353 +
  1354 + //portType.setXL(userNameXl, passwordXl, sBuffer.toString());
  1355 + } catch (Exception e) {
  1356 + e.printStackTrace();
  1357 + }
  1358 +
  1359 + return result;
  1360 + }
  1361 +
  1362 + /**
  1363 + * 计算结束时间
  1364 + * @param fcsj 发车时间
  1365 + * @param bcsj 班次历时
  1366 + * @return
  1367 + */
  1368 + private String calcDdsj(String fcsj,Integer bcsj){
  1369 + String result = "";
  1370 + if(fcsj.indexOf(":") != -1){
  1371 + if(bcsj == null){
  1372 + return fcsj;
  1373 + }
  1374 + // 时和分隔开
  1375 + String[] fcsjArray = fcsj.split(":");
  1376 + // 分和历时时间相加
  1377 + Integer fullTime = Integer.valueOf(fcsjArray[1])+ bcsj;
  1378 + int hour,min,sumHour;
  1379 + hour = fullTime / 60;
  1380 + min = fullTime % 60;
  1381 + sumHour = Integer.valueOf(fcsjArray[0])+hour;
  1382 + if(sumHour >= 24){
  1383 + result = String.format("%02d",sumHour - 24);
  1384 + }else{
  1385 + result = String.format("%02d",sumHour);;
  1386 + }
  1387 + result +=":"+String.format("%02d", min);
  1388 + }else{
  1389 + result = fcsj;
  1390 + }
  1391 + return result;
  1392 + }
  1393 +
  1394 + /**
  1395 + * 改变时间格式
  1396 + * @param ttInfoDetail 时刻表详细
  1397 + * @return xx:yy
  1398 + */
  1399 + private String changeTimeFormat(TTInfoDetail ttInfoDetail){
  1400 + String result = "00:00";
  1401 + String fcsj = ttInfoDetail.getFcsj();
  1402 + if(fcsj.indexOf(":") != -1){
  1403 + // 时和分隔开
  1404 + String[] fcsjArray = fcsj.split(":");
  1405 + result = String.format("%02d", Integer.valueOf(fcsjArray[0]))+":";
  1406 + result +=String.format("%02d", Integer.valueOf(fcsjArray[1]));
  1407 + }else{
  1408 + result = null;
  1409 + logger.info("setSKB:发车时间错误:ttInfoDetail.id="+ttInfoDetail.getId());
  1410 + }
  1411 + return result;
  1412 + }
  1413 +
  1414 + /**
  1415 + * 拼装线路计划班次表的XML
  1416 + * @param sBuffer
  1417 + * @param schedulePlanInfo
  1418 + * @param xlbm
  1419 + * @param zbh
  1420 + * @param lp
  1421 + */
  1422 + private void assembleJHBC(StringBuffer sBuffer,SchedulePlanInfo schedulePlanInfo,String xlbm,String zbh,Long lp){
  1423 + sBuffer.append("<JHBC>");
  1424 + sBuffer.append("<RQ>").append(sdfnyr.format(schedulePlanInfo.getScheduleDate())).append("</RQ>");
  1425 + sBuffer.append("<XLBM>").append(BasicData.lineCode2ShangHaiCodeMap.get(xlbm)).append("</XLBM>");
  1426 + sBuffer.append("<CPH>").append("沪"+zbh).append("</CPH>");
  1427 + sBuffer.append("<LPBH>").append(lp).append("</LPBH>");
  1428 + sBuffer.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
  1429 + sBuffer.append("<BCList>");
  1430 + }
  1431 + /**
  1432 + * 转换排班规则
  1433 + * @param ruleDay
  1434 + * @return
  1435 + */
  1436 + private String changeRuleDay(String ruleDay){
  1437 + String result = "";
  1438 + int flag ;
  1439 + String[] ruleDayArray = ruleDay.split(",");
  1440 + for (int i = 0; i < ruleDayArray.length; i++) {
  1441 + if(ruleDayArray[i].equals("1")){
  1442 + flag = i+1;
  1443 + }else{
  1444 + flag = 0;
  1445 + }
  1446 + if(flag > 0){
  1447 + result += flag + ",";
  1448 + }
  1449 + }
  1450 + // 去掉最后一个字符
  1451 + if(StringUtils.endsWith(result,",")){
  1452 + result = StringUtils.removeEnd(result,",");
  1453 + }
  1454 + return result;
  1455 + }
  1456 + /**
  1457 + * 设置统一的公司名称
  1458 + * @param company
  1459 + */
  1460 + private void setCompanyName(String company){
  1461 + if(company.equals("闵行公司")){
  1462 + company = "浦东闵行公交公司";
  1463 + }else if(company.equals("杨高公司")){
  1464 + company = "浦东杨高公交公司";
  1465 + }else if(company.equals("上南公司")){
  1466 + company = "浦东上南公交公司";
  1467 + }else if(company.equals("金高公司")){
  1468 + company = "浦东金高公交公司";
  1469 + }else if(company.equals("南汇公司")){
  1470 + company = "浦东南汇公交公司";
  1471 + }else if(company.equals("青浦公交")){
  1472 + company = "浦东青浦公交公司";
  1473 + }
  1474 + }
  1475 + /**
  1476 + * @param stationsList 站点路由集
  1477 + * @param sBuffer sBuffer
  1478 + * @param startId 站点序号起始ID
  1479 + *
  1480 + * @return 站点序号累加后的ID
  1481 + */
  1482 + private int packagStationXml(List<StationRoute> stationsList,StringBuffer sBuffer,int startId,Map<String, Integer> stationNumMap){
  1483 + int size = stationsList.size();
  1484 + StationRoute srRoute;
  1485 + HashMap<String,String> paraMap;
  1486 + String zdlx ;// 站点类型:0:起点站、1:终点站、2:中途站
  1487 + for (int i = 0; i < size; i++) {
  1488 + srRoute = stationsList.get(i);
  1489 + zdlx = srRoute.getStationMark();
  1490 + if(zdlx.equals("B")){
  1491 + zdlx = "0";
  1492 + }else if(zdlx.equals("E")){
  1493 + zdlx = "1";
  1494 + }else{
  1495 + zdlx = "2";
  1496 + }
  1497 + paraMap = packageYgcStationNumParam(srRoute,null);
  1498 + sBuffer.append("<Station>");
  1499 + sBuffer.append("<ZDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paraMap,stationNumMap)).append("</ZDXH>");
  1500 + sBuffer.append("<SXX>").append(srRoute.getDirections()).append("</SXX>");
  1501 + sBuffer.append("<ZDMC>").append(srRoute.getStationName()).append("</ZDMC>");
  1502 + sBuffer.append("<ZDBM>").append(srRoute.getStationCode()).append("</ZDBM>");
  1503 + sBuffer.append("<ZDJD>").append(srRoute.getStation().getgLonx()).append("</ZDJD>");
  1504 + sBuffer.append("<ZDWD>").append(srRoute.getStation().getgLaty()).append("</ZDWD>");
  1505 + sBuffer.append("<ZZ>").append(srRoute.getStation().getAddr() == null ? "" : srRoute.getStation().getAddr()).append("</ZZ>");
  1506 + sBuffer.append("<ZDLX>").append(zdlx).append("</ZDLX>");
  1507 + sBuffer.append("<ZJLC>").append(srRoute.getDistances()).append("</ZJLC>");
  1508 + sBuffer.append("</Station>");
  1509 + startId++;
  1510 + }
  1511 + return startId;
  1512 + }
  1513 +
  1514 + /**
  1515 + * @param pointList 站点点位集
  1516 + * @param sBuffer sBuffer
  1517 + * @param startId 站点序号起始ID
  1518 + *
  1519 + * @return 站点序号累加后的ID
  1520 + */
  1521 + private int packagStationPointXml(List<Object[]> pointList,StringBuffer sBuffer,int startId){
  1522 + int size = pointList.size();
  1523 + Object[] objs;
  1524 + String bsection,dir,section;
  1525 + String[] sections ;
  1526 + for (int i = 0; i < size; i++) {
  1527 + objs = pointList.get(i);
  1528 + bsection = objs[0]+"";
  1529 + dir = objs[1]+"";
  1530 + // 取括号内的内容
  1531 + Pattern pattern = Pattern.compile("(?<=\\()(.+?)(?=\\))");
  1532 + Matcher matcher = pattern.matcher(bsection);
  1533 + if(matcher.find()){
  1534 + sections = matcher.group().split(",");
  1535 + for (int j = 0 ; j < sections.length ; j ++){
  1536 + section = sections[j];
  1537 + sBuffer.append("<LinePoint>");
  1538 + sBuffer.append("<ZDXH>").append(startId).append("</ZDXH>");
  1539 + sBuffer.append("<SXX>").append(dir).append("</SXX>");
  1540 + sBuffer.append("<ZDJD>").append(section.split(" ")[0]).append("</ZDJD>");
  1541 + sBuffer.append("<ZDWD>").append(section.split(" ")[1]).append("</ZDWD>");
  1542 + sBuffer.append("</LinePoint>");
  1543 + startId++;
  1544 + }
  1545 + }
  1546 + }
  1547 + return startId;
  1548 + }
  1549 +
  1550 + /**
  1551 + * 获取运管处站点序号
  1552 + * @param map
  1553 + * @return 运管处站点序号
  1554 + */
  1555 + private Integer getYgcStationNumByLineCodeAndDirectionAndStationName(HashMap<String,String> map,Map<String, Integer> stationNumMap){
  1556 + // 线路编码
  1557 + String lineCode = map.get("lineCode");
  1558 + // 线路走向 0:上行 1:下行
  1559 + String direction = map.get("direction");
  1560 + // 站点编码
  1561 + String stationCode = map.get("stationCode");
  1562 + // 站点类型:B:起点站 Z:中途站 E:终点站 T:停车场
  1563 + String stationMark = map.get("stationMark");
  1564 + String[] marks = null;
  1565 + // 起点站,先从起点找,找不到再从中途站找,最后从终点找
  1566 + if(stationMark.equals("B")){
  1567 + marks= new String[]{"B","Z","E"};
  1568 + }else if(stationMark.equals("E")){// 终点站相反
  1569 + marks= new String[]{"E","Z","B"};
  1570 + }else if(stationMark.equals("Z")){
  1571 + marks= new String[]{"Z"};
  1572 + }
  1573 + // 默认从缓存BasicData.stationName2YgcNumber
  1574 + Map<String, Integer> tempMap = BasicData.stationName2YgcNumber;
  1575 + // 如果传入的stationNumMap不为空,则不是缓存取,而从stationNumMap取
  1576 + if(stationNumMap != null){
  1577 + tempMap = stationNumMap;
  1578 + }
  1579 + Integer number = null;
  1580 + for (int i = 0 ;i < marks.length ; i ++){
  1581 + number = tempMap.get(lineCode+"_"+direction+"_"+stationCode+"_"+marks[i]);
  1582 + if(number != null){
  1583 + break;
  1584 + }
  1585 + }
  1586 + return number == null ? 0 : number;
  1587 + }
  1588 +
  1589 + /**
  1590 + * 封装查询站序条件
  1591 + * @param obj
  1592 + * @return
  1593 + */
  1594 + private HashMap packageYgcStationNumParam(Object obj,HashMap<String,String> otherParam){
  1595 + HashMap<String,String> map = new HashMap<String,String>();
  1596 + String lineCode = "",direction = "",stationCode = "",stationMark = "";
  1597 + // 站点路由
  1598 + if(obj instanceof StationRoute){
  1599 + StationRoute sr = (StationRoute)obj;
  1600 + lineCode = sr.getLineCode();
  1601 + direction = String.valueOf(sr.getDirections());
  1602 + stationCode = sr.getStationCode();
  1603 + stationMark = sr.getStationMark();
  1604 + }else if(obj instanceof ScheduleRealInfo){ //实际排班计划明细。
  1605 + ScheduleRealInfo sri = (ScheduleRealInfo)obj;
  1606 + lineCode = sri.getXlBm();
  1607 + direction = sri.getXlDir();
  1608 + if(otherParam != null && otherParam.get("stationMark") != null){
  1609 + stationMark = otherParam.get("stationMark");
  1610 + if(stationMark.equals("B")){ // 起点站
  1611 + stationCode = sri.getQdzCode();
  1612 + }else if(stationMark.equals("E")){ // 终点站
  1613 + stationCode = sri.getZdzCode();
  1614 + }
  1615 + }
  1616 + }else if(obj instanceof SchedulePlanInfo){ //排班计划明细
  1617 + SchedulePlanInfo spi = (SchedulePlanInfo)obj;
  1618 + lineCode = spi.getXlBm();
  1619 + direction = spi.getXlDir();
  1620 + if(otherParam != null && otherParam.get("stationMark") != null){
  1621 + stationMark = otherParam.get("stationMark");
  1622 + if(stationMark.equals("B")){ // 起点站
  1623 + stationCode = spi.getQdzCode();
  1624 + }else if(stationMark.equals("E")){ // 终点站
  1625 + stationCode = spi.getZdzCode();
  1626 + }
  1627 + }
  1628 + }else if(obj instanceof TTInfoDetail){ //时刻表明细
  1629 + TTInfoDetail ttid = (TTInfoDetail)obj;
  1630 + lineCode = ttid.getXl().getLineCode();
  1631 + direction = ttid.getXlDir();
  1632 + if(otherParam != null && otherParam.get("stationMark") != null){
  1633 + stationMark = otherParam.get("stationMark");
  1634 + if(stationMark.equals("B")){ // 起点站
  1635 + stationCode = ttid.getQdzCode();
  1636 + }else if(stationMark.equals("E")){ // 终点站
  1637 + stationCode = ttid.getZdzCode();
  1638 + }
  1639 + }
  1640 + }
  1641 + map.put("lineCode",lineCode);// 站点编码
  1642 + map.put("direction",direction); // 上下行
  1643 + map.put("stationCode",stationCode); // 站点编号
  1644 + map.put("stationMark",stationMark); // 站点类型
  1645 + return map;
  1646 + }
  1647 +
  1648 + /**
  1649 + * 取得历史站点编码和站点名称的对应关系
  1650 + * @return
  1651 + */
  1652 + private Map<String, String> getLsStationCode(String lineCode,int lineVersion){
  1653 + Map<String,Object> map = new HashMap<>();
  1654 + map.put("lineCode_eq", lineCode);
  1655 + map.put("versions_eq",lineVersion);
  1656 + LsStationRoute lsroute;
  1657 + Iterator<LsStationRoute> iterator = lsStationRouteRepository.findAll(new CustomerSpecs<LsStationRoute>(map)).iterator();
  1658 + Map<String, String> stationCode2Name = new HashMap<>();
  1659 + while (iterator.hasNext()) {
  1660 + lsroute = iterator.next();
  1661 + stationCode2Name.put(lsroute.getLineCode() + "_" + lsroute.getDirections() + "_" + lsroute.getStationCode(), lsroute.getStationName());
  1662 + }
  1663 + return stationCode2Name;
  1664 + }
  1665 +
  1666 + private Map<String, Integer> getLsStationRoute(String xlbm,int lineVersion){
  1667 + Map<String, Integer> tempStationName2YgcNumber = new HashMap<String, Integer>();
  1668 + /**
  1669 + * 加载运管处的站点及序号
  1670 + * 上行从1开始,下行顺序续编
  1671 + */
  1672 + List<Map<String, String>> ygcLines = lsStationRouteRepository.findLineWithLineCode4Ygc(xlbm,lineVersion);
  1673 + if(ygcLines != null && ygcLines.size() > 0){
  1674 + int size = ygcLines.size();
  1675 + Map<String, String> tempMap ;
  1676 + int num = 1;
  1677 + String key;
  1678 + String lineCode = "";
  1679 + for (int i = 0; i < size; i ++){
  1680 + tempMap = ygcLines.get(i);
  1681 + if(lineCode.equals("")){
  1682 + lineCode = tempMap.get("lineCode");
  1683 + }else if(!lineCode.equals(tempMap.get("lineCode"))){
  1684 + num = 1;
  1685 + lineCode = tempMap.get("lineCode");
  1686 + }
  1687 + key = tempMap.get("lineCode") + "_"+String.valueOf(tempMap.get("directions"))
  1688 + + "_"+tempMap.get("stationCode")+ "_"+tempMap.get("stationMark");
  1689 + tempStationName2YgcNumber.put(key,num++);
  1690 + }
  1691 + }
  1692 + return tempStationName2YgcNumber;
  1693 + }
  1694 +
  1695 + private String getSetXlXml(Line line,LineInformation lineInformation){
  1696 + StringBuffer sBuffer = new StringBuffer();
  1697 + List<StationRoute> upStationsList ;// 上行站点路由集
  1698 + List<StationRoute> downStationsList;// 下行站点路由集
  1699 + List<Object[]> downPointList;// 下行站点集
  1700 + List<Object[]> upPointList;// 上行站点集
  1701 + sBuffer.append("<XLs>");
  1702 + sBuffer.append("<XL>");
  1703 + sBuffer.append("<XLBM>").append(BasicData.lineId2ShangHaiCodeMap.get(line.getId())).append("</XLBM>");
  1704 + sBuffer.append("<XLMC>").append(line.getName()).append("</XLMC>");
  1705 + sBuffer.append("<QDZ>").append(line.getStartStationName()).append("</QDZ>");
  1706 + sBuffer.append("<ZDZ>").append(line.getEndStationName()).append("</ZDZ>");
  1707 + sBuffer.append("<QZLC>").append(lineInformation.getUpMileage()).append("</QZLC>");
  1708 + sBuffer.append("<ZQLC>").append(lineInformation.getDownMileage()).append("</ZQLC>");
  1709 + sBuffer.append("<XLGH>").append(line.getLinePlayType()).append("</XLGH>");
  1710 + sBuffer.append("<UPDATE_DATE>").append(sdfnyr.format(new Date())).append("</UPDATE_DATE>");
  1711 + // 循环添加站点信息
  1712 + sBuffer.append("<StationList>");
  1713 + // 先查上行
  1714 + upStationsList = stationRouteRepository.findByLine(line.getLineCode(), 0);
  1715 + Map<String, Integer> stationNumMap = getStationName2YgcNumberMap(line.getLineCode());
  1716 + int startId = 1;
  1717 + startId = packagStationXml(upStationsList, sBuffer, startId,stationNumMap);
  1718 + // 环线不查下行
  1719 + if(line.getLinePlayType() != 1){
  1720 + // 再查下行
  1721 + downStationsList = stationRouteRepository.findByLine(line.getLineCode(), 1);
  1722 + packagStationXml(downStationsList, sBuffer, startId,stationNumMap);
  1723 + }
  1724 + sBuffer.append("</StationList>");
  1725 + // 循环添加站点点位信息
  1726 + sBuffer.append("<LinePointList>");
  1727 + upPointList = sectionRepository.getSectionDirByLineId(line.getId(),0);
  1728 + startId = 1;
  1729 + startId = packagStationPointXml(upPointList, sBuffer, startId);
  1730 + // 环线不查下行
  1731 + if(line.getLinePlayType() != 1){
  1732 + downPointList = sectionRepository.getSectionDirByLineId(line.getId(),1);
  1733 + packagStationPointXml(downPointList, sBuffer, startId);
  1734 + }
  1735 + sBuffer.append("</LinePointList>");
  1736 + sBuffer.append("</XL>");
  1737 + sBuffer.append("</XLs>");
  1738 + return sBuffer.toString();
  1739 + }
  1740 +}
... ...