Commit 72a500709e371721f9324af6ce7ce0ab2a00d962

Authored by 王通
1 parent 65a3b3b6

1.路单上传道运局和道运中心上传分开,先传道运局后传道运中心,道运局有10次重传

src/main/java/com/bsth/service/impl/TrafficManageServiceImpl.java
... ... @@ -19,6 +19,7 @@ import com.bsth.repository.traffic.SKBUploadLoggerRepository;
19 19 import com.bsth.security.util.SecurityUtils;
20 20 import com.bsth.service.TrafficManageService;
21 21 import com.bsth.service.traffic.YgcBasicDataService;
  22 +import com.bsth.util.IpUtils;
22 23 import com.bsth.util.TimeUtils;
23 24 import com.bsth.util.db.DBUtils_MS;
24 25 import com.bsth.webService.trafficManage.org.tempuri.Results;
... ... @@ -28,9 +29,11 @@ import com.bsth.webService.trafficManage.qp.WebServiceSoap_PortType;
28 29 import org.apache.commons.lang.StringEscapeUtils;
29 30 import org.apache.commons.lang.StringUtils;
30 31 import org.apache.commons.lang.time.DateUtils;
  32 +import org.joda.time.DateTime;
31 33 import org.slf4j.Logger;
32 34 import org.slf4j.LoggerFactory;
33 35 import org.springframework.beans.factory.annotation.Autowired;
  36 +import org.springframework.beans.factory.annotation.Value;
34 37 import org.springframework.data.domain.Sort;
35 38 import org.springframework.data.domain.Sort.Direction;
36 39 import org.springframework.security.core.context.SecurityContextHolder;
... ... @@ -127,6 +130,9 @@ public class TrafficManageServiceImpl implements TrafficManageService{
127 130 @Autowired
128 131 private SendEmailController sendEmailController;
129 132  
  133 + @Autowired
  134 + private LineVersionsRepository lineVersionsRepository;
  135 +
130 136 // 运管处上传接口
131 137 private com.bsth.webService.trafficManage.up.org.tempuri.WebServiceSoap webServiceSoapUp;
132 138 private WebServiceSoap ssop ;
... ... @@ -168,8 +174,11 @@ public class TrafficManageServiceImpl implements TrafficManageService{
168 174 private final String userNameUp = "user";
169 175 // 密码
170 176 private final String passwordUp = "user";
  177 +
171 178 // 接收邮件人
172   - private final String emailSendToAddress = "175912183@qq.com";
  179 + @Value("${waybill.emails}")
  180 + private String[] emails;
  181 +
173 182 // 记录路单上线的成功、失败线路数
174 183 private Integer countSuccess,countFailure;
175 184  
... ... @@ -414,7 +423,8 @@ public class TrafficManageServiceImpl implements TrafficManageService{
414 423 * @return
415 424 */
416 425 public String setLD(String theDate){
417   - return uploadLD(theDate);
  426 + uploadLD(theDate);
  427 + return uploadLD1(theDate);
418 428 }
419 429  
420 430 /**
... ... @@ -422,19 +432,213 @@ public class TrafficManageServiceImpl implements TrafficManageService{
422 432 * @return
423 433 */
424 434 public String setLD(){
425   - return uploadLD(null);
  435 + uploadLD(null);
  436 + return uploadLD1(null);
426 437 }
  438 +
427 439 /**
428 440 * 上传路单
429 441 * @return 上传成功标识
430 442 */
431 443 private String uploadLD(String theDate){
  444 + // 取昨天 的日期
  445 + String date = theDate == null ?sdfnyr.format(DateUtils.addDays(new Date(), -1)) : theDate;
  446 + StringBuffer sf = new StringBuffer();
  447 + Results results = null;
  448 + String str = "", xlbm = null, oldXlbm = null;
  449 + List<Map<String,Object>> listGroup = null;
  450 + int scount = 0, ccount = 0;
  451 + long start = System.currentTimeMillis();
  452 + try {
  453 + // 计数器
  454 + int counter = 0;
  455 + // 每几条线路上传一次路单
  456 + int per = 10;
  457 + List<ScheduleRealInfo> list = scheduleRealInfoRepository.setLD(date);
  458 + listGroup = scheduleRealInfoRepository.setLDGroup(date);
  459 + Map<String,Object> map = new HashMap();
  460 + HashMap<String,String> paramMap;
  461 + HashMap<String,String> otherMap = new HashMap();
  462 +
  463 + // 车辆内部编码和车牌做映射
  464 + Map<String, String> inside2plate = new HashMap<>();
  465 + Iterable<Cars> cars = carsRepository.findAll();
  466 + for (Cars car : cars) {
  467 + inside2plate.put(car.getInsideCode(), car.getCarPlate());
  468 + }
  469 +
  470 + // 线路编码和线路信息映射
  471 + Map<String, Line> code2line = new HashMap<>();
  472 + Iterable<Line> lines = lineRepository.findAll();
  473 + for (Line line : lines) {
  474 + code2line.put(line.getLineCode(), line);
  475 + }
  476 +
  477 + // 线路编码和线路版本映射(电子路单日期)
  478 + Map<String, Integer> code2version = new HashMap<>();
  479 + Iterable<LineVersions> versions = lineVersionsRepository.findLineVersionsByDate((int)(DateTime.parse(date).getMillis() / 1000));
  480 + for (LineVersions version : versions) {
  481 + code2version.put(version.getLineCode(), version.getVersions());
  482 + }
  483 +
  484 + Map<String, Integer> stationNumMap = null;
  485 + for(Map<String,Object> schRealInfo:listGroup){
  486 + if(schRealInfo != null){
  487 + // 获取线路是否使用标识,如果未使用,则不查该线路数据
  488 + String lineCode = schRealInfo.get("xlBm")+"";
  489 + Line line = code2line.get(lineCode);
  490 + if(line == null || line.getInUse() == null || line.getInUse() == 0){
  491 + ccount++;
  492 + continue;
  493 + }
  494 + if(counter % per == 0){
  495 + sf = new StringBuffer();
  496 + sf.append("<DLDS>");
  497 + }
  498 + counter ++;
  499 + xlbm = BasicData.lineCode2ShangHaiCodeMap.get(lineCode);
  500 + if (!xlbm.equals(oldXlbm)) {
  501 + oldXlbm = xlbm;
  502 + Integer ver = code2version.get(lineCode);
  503 + if (ver != null) {
  504 + stationNumMap = getLsStationRoute(lineCode, ver);
  505 + }
  506 + }
  507 +
  508 + sf.append("<DLD>");
  509 + sf.append("<RQ>").append(date).append("</RQ>");
  510 + sf.append("<XLBM>").append(xlbm).append("</XLBM>");
  511 + sf.append("<LPBH>").append(schRealInfo.get("lpName")).append("</LPBH>");
  512 + sf.append("<CPH>").append(inside2plate.get(schRealInfo.get("clZbh"))).append("</CPH>");
  513 + sf.append("<UPDT>").append(sdfnyrsfm.format(new Date())).append("</UPDT>");
  514 + sf.append("<LDList>");
  515 + for(ScheduleRealInfo scheduleRealInfo:list){
  516 + if((schRealInfo.get("xlBm")+"").equals(scheduleRealInfo.getXlBm()) && (schRealInfo.get("lpName")+"")
  517 + .equals(scheduleRealInfo.getLpName())
  518 + && (schRealInfo.get("clZbh")+"").equals(scheduleRealInfo.getClZbh())){
  519 +
  520 + if(scheduleRealInfo.isDestroy()){
  521 + if(scheduleRealInfo.isReissue()){
  522 + scheduleRealInfo.setFcsjActualAll(scheduleRealInfo.getDfsj());
  523 + scheduleRealInfo.setZdsjActualAll(scheduleRealInfo.getZdsj());
  524 + }
  525 + else
  526 + continue;
  527 + }
  528 +
  529 + if(scheduleRealInfo.getBcType().equals("in")
  530 + || scheduleRealInfo.getBcType().equals("out")){
  531 + continue;
  532 + }
  533 +
  534 + sf.append("<LD>");
  535 + sf.append("<SJGH>").append(scheduleRealInfo.getjGh()).append("</SJGH>");
  536 + sf.append("<SXX>").append(scheduleRealInfo.getXlDir()).append("</SXX>");
  537 + sf.append("<FCZDMC>").append(scheduleRealInfo.getQdzName()).append("</FCZDMC>");
  538 + // 起点站的参数
  539 + otherMap.put("stationMark","B");
  540 + paramMap = packageYgcStationNumParam(scheduleRealInfo,otherMap);
  541 + sf.append("<FCZDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,stationNumMap)).append("</FCZDXH>");
  542 + sf.append("<FCZDBM>").append(scheduleRealInfo.getQdzCode()).append("</FCZDBM>");
  543 + sf.append("<JHFCSJ>").append(scheduleRealInfo.getFcsj()).append("</JHFCSJ>");
  544 + sf.append("<DFSJ>").append(scheduleRealInfo.getDfsj()).append("</DFSJ>");
  545 + sf.append("<SJFCSJ>").append(scheduleRealInfo.getFcsjActual()).append("</SJFCSJ>");
  546 + sf.append("<FCZDLX></FCZDLX>");
  547 + sf.append("<DDZDMC>").append(scheduleRealInfo.getZdzName()).append("</DDZDMC>");
  548 + // 终点站的参数
  549 + otherMap.put("stationMark","E");
  550 + paramMap = packageYgcStationNumParam(scheduleRealInfo,otherMap);
  551 + sf.append("<DDZDXH>").append(getYgcStationNumByLineCodeAndDirectionAndStationName(paramMap,stationNumMap)).append("</DDZDXH>");
  552 + sf.append("<DDZDBM>").append(scheduleRealInfo.getZdzCode()).append("</DDZDBM>");
  553 + sf.append("<JHDDSJ>").append(scheduleRealInfo.getZdsj()).append("</JHDDSJ>");
  554 + sf.append("<SJDDSJ>").append(scheduleRealInfo.getZdsjActual()).append("</SJDDSJ>");
  555 + sf.append("<DDZDLX></DDZDLX>");
  556 + sf.append("<LDSCBZ>0</LDSCBZ>");
  557 + sf.append("<DDBZ></DDBZ>");
  558 + sf.append("</LD>");
  559 + }
  560 + }
  561 + sf.append("</LDList>");
  562 + sf.append("</DLD>");
  563 + }
  564 + if(counter % per == per - 1){
  565 + sf.append("</DLDS>");
  566 + // 去掉'号
  567 + str = sf.toString().replace("'","");
  568 + scount += invokeSetLD(str, counter);
  569 + counter = 0;
  570 + }
  571 + }
  572 + // 每per条线路上传后剩下的数据再上传
  573 + if(counter > 0){
  574 + sf.append("</DLDS>");
  575 + // 去掉'号
  576 + str = sf.toString().replace("'","");
  577 + scount += invokeSetLD(str, counter);
  578 + }
  579 + } catch (Exception e) {
  580 + e.printStackTrace();
  581 + logger.error("setLD:", e);
  582 + } finally {
  583 + try {
  584 + for (String email : emails) {
  585 + //发送邮件
  586 + EmailBean mail = new EmailBean();
  587 + mail.setSubject(IpUtils.getLocalIpAddress() +":路单日志数据"+date);
  588 + mail.setContent("总数:" + (listGroup == null ? 0 : listGroup.size()) + "<br/>成功数:" + scount + "<br/>跳过数:" + ccount + "<br/>耗时:" + (System.currentTimeMillis() - start));
  589 + sendEmailController.sendMail(email, mail);
  590 + }
  591 + logger.info("setLD-sendMail:邮件发送成功!");
  592 + } catch (Exception e) {
  593 + e.printStackTrace();
  594 + logger.error("setLD-sendMail:",e);
  595 + }
  596 + }
  597 + return "success";
  598 + }
  599 +
  600 + /**
  601 + * 调用运管处电子路单接口,如果上传失败或有网络问题,最多执行10次
  602 + * @param xml 拼接的xml字符串
  603 + * @param counter 分组数
  604 + * @return 成功返回counter 失败返回0
  605 + */
  606 + private int invokeSetLD(String xml, int counter) {
  607 + for (int i = 0;i < 10;i++) {
  608 + try {
  609 + Results results = ssop.setLD(userNameOther, passwordOther, StringEscapeUtils.unescapeHtml(xml));
  610 + if (results.isSuccess()) {
  611 + logger.info("setLD: " + xml);
  612 + logger.info("setLD: 成功");
  613 + return counter;
  614 + } else if (i == 9) {
  615 + logger.error("setLD: " + xml);
  616 + logger.error("setLD: 失败," + results.getMessage());
  617 + }
  618 + Thread.sleep(2000);
  619 + } catch (Exception e) {
  620 + logger.error("运管处接口调用异常", e);
  621 + try {
  622 + Thread.sleep(2000);
  623 + } catch (InterruptedException ex) {
  624 + ex.printStackTrace();
  625 + }
  626 + }
  627 + }
  628 +
  629 + return 0;
  630 + }
  631 +
  632 + /**
  633 + * 上传路单
  634 + * @return 上传成功标识
  635 + */
  636 + private String uploadLD1(String theDate){
432 637 String result = "failure";
433 638 countSuccess = 0 ;countFailure = 0;
434 639 Line line;
435 640 // 取昨天 的日期
436 641 String date = theDate == null ?sdfnyr.format(DateUtils.addDays(new Date(), -1)) : theDate;
437   - StringBuffer sf = new StringBuffer();
438 642 StringBuffer logSuccess = new StringBuffer("成功:");
439 643 StringBuffer logFailure = new StringBuffer("失败:");
440 644 HashMap logXlbmSuccessMap = new HashMap();
... ... @@ -443,9 +647,6 @@ public class TrafficManageServiceImpl implements TrafficManageService{
443 647 Results results = null;
444 648 String str = "",xlbm;
445 649 try {
446   - int counter = 0; // 计数器
447   - int per = 10; // 每几条线路上传一次路单
448   -
449 650 List<ScheduleRealInfo> list = scheduleRealInfoRepository.setLD(date);
450 651 List<Map<String,Object>> listGroup = scheduleRealInfoRepository.setLDGroup(date);
451 652 Map<String,Object> map = new HashMap();
... ... @@ -467,8 +668,7 @@ public class TrafficManageServiceImpl implements TrafficManageService{
467 668 = qp_ssop.setLD(userNameOther_qp,passwordOther_qp,StringEscapeUtils.unescapeHtml(ygsXml.toString().replace("'","")));
468 669 logger.info("青浦路单是否上传成功:"+res.isSuccess());
469 670 }catch (Exception e){
470   - e.printStackTrace();
471   - continue;
  671 + logger.error("青浦路单上传异常", e);
472 672 }
473 673 }
474 674 // 新起xml标签
... ... @@ -486,11 +686,6 @@ public class TrafficManageServiceImpl implements TrafficManageService{
486 686 if(line == null || line.getInUse() == null || line.getInUse() == 0){
487 687 continue;
488 688 }
489   - if(counter % per == 0){
490   - sf = new StringBuffer();
491   - sf.append("<DLDS>");
492   - }
493   - counter ++;
494 689 xlbm = BasicData.lineCode2ShangHaiCodeMap.get(schRealInfo.get("xlBm")+"");
495 690 // 保存一次路单的线路编码,用于发送邮箱
496 691 if(logXlbmMap.get(xlbm) == null){
... ... @@ -552,35 +747,20 @@ public class TrafficManageServiceImpl implements TrafficManageService{
552 747 }
553 748 sri.append("</LDList>");
554 749 sri.append("</DLD>");
555   - sf.append(sri);
556 750 // 运管所xml加入路单信息
557 751 ygsXml.append(sri);
558 752 }
559   - if(counter % per == per - 1){
560   - counter = 0;
561   - sf.append("</DLDS>");
562   - str = sf.toString().replace("'","");// 去掉'号
563   - results = ssop.setLD(userNameOther, passwordOther, StringEscapeUtils.unescapeHtml(str));
564   - // 记录日志
565   - result = logRecord(results,logXlbmMap,logXlbmSuccessMap,logXlbmFailureMap,logSuccess,logFailure,str);
566   - }
567 753 }
568   - // 每per条线路上传后剩下的数据再上传
569   - if(counter > 0){
570   - // 最后的路单一次上传
571   - ygsXml.append("</DLDS>");
572   - sf.append("</DLDS>");
573   - str = sf.toString().replace("'","");// 去掉'号
574   - results = ssop.setLD(userNameOther, passwordOther, StringEscapeUtils.unescapeHtml(str));
575   - // 发送到青浦运管所
576   - try {
577   - logger.info("xml:"+StringEscapeUtils.unescapeHtml(ygsXml.toString().replace("'","")));
578   - com.bsth.webService.trafficManage.qp.Results res
579   - = qp_ssop.setLD(userNameOther_qp,passwordOther_qp,StringEscapeUtils.unescapeHtml(ygsXml.toString().replace("'","")));
580   - logger.info("青浦路单是否上传成功:"+res.isSuccess());
581   - }catch (Exception e){
582   - e.printStackTrace();
583   - }
  754 + // 最后的路单一次上传
  755 + ygsXml.append("</DLDS>");
  756 + // 发送到青浦运管所
  757 + try {
  758 + logger.info("xml:"+StringEscapeUtils.unescapeHtml(ygsXml.toString().replace("'","")));
  759 + com.bsth.webService.trafficManage.qp.Results res
  760 + = qp_ssop.setLD(userNameOther_qp,passwordOther_qp,StringEscapeUtils.unescapeHtml(ygsXml.toString().replace("'","")));
  761 + logger.info("青浦路单是否上传成功1:"+res.isSuccess());
  762 + }catch (Exception e){
  763 + logger.error("青浦路单上传异常1", e);
584 764 }
585 765 // 记录日志
586 766 result = logRecord(results,logXlbmMap,logXlbmSuccessMap,logXlbmFailureMap,logSuccess,logFailure,str);
... ... @@ -591,19 +771,8 @@ public class TrafficManageServiceImpl implements TrafficManageService{
591 771 logFailure.append("\r\t").append(traceElement);
592 772 }
593 773 e.printStackTrace();
594   - }finally{
595   - try {
596   - //发送邮件
597   - EmailBean mail = new EmailBean();
598   - mail.setSubject(InetAddress.getLocalHost().getHostAddress()+":路单日志数据"+date);
599   - mail.setContent("成功数:"+countSuccess+"<br/>失败数:"+countFailure+"<br/>" +logSuccess + "<br/>"+logFailure);
600   - sendEmailController.sendMail(emailSendToAddress, mail);
601   - logger.info("setLD-sendMail:邮件发送成功!");
602   - }catch (Exception e){
603   - e.printStackTrace();
604   - logger.error("setLD-sendMail:",e);
605   - }
606 774 }
  775 +
607 776 return result;
608 777 }
609 778  
... ...