Commit 2793b1ce90249ca79ab55a1ccfd60ed31e42c209

Authored by 王通
1 parent 6e47d285

1.电子路单上传加入重试机制

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