Commit 72a500709e371721f9324af6ce7ce0ab2a00d962
1 parent
65a3b3b6
1.路单上传道运局和道运中心上传分开,先传道运局后传道运中心,道运局有10次重传
Showing
1 changed file
with
220 additions
and
51 deletions
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 | ... | ... |