Commit cca5d02726e5f892e25ca05521a4b86af0f0c0e5

Authored by 徐烜
1 parent 831ec122

智能时刻表发车间隔报表

src/main/java/com/bsth/controller/schedule/core/TTInfoDetailController.java
@@ -128,6 +128,32 @@ public class TTInfoDetailController extends BController<TTInfoDetail, Long> { @@ -128,6 +128,32 @@ public class TTInfoDetailController extends BController<TTInfoDetail, Long> {
128 return ttInfoDetailService.skbDetailMxSave(entities); 128 return ttInfoDetailService.skbDetailMxSave(entities);
129 } 129 }
130 130
  131 + @RequestMapping(value = "/exportDTDFile2", method = RequestMethod.POST)
  132 + public void exportFile2(@RequestBody TTinfoDetailDynamicData.LineHeadWayInfo lineHeadWayInfo,
  133 + HttpServletResponse response) throws Exception {
  134 + DataToolsFile dataToolsFile = ttInfoDetailService.exportHeadwayTTinfo(lineHeadWayInfo);
  135 +
  136 + // 流输出导出文件
  137 + response.setHeader("content-type", "application/octet-stream");
  138 + response.setHeader("Content-Disposition", "attachment; filename=" + dataToolsFile.getFile().getName());
  139 + response.setContentType("application/octet-stream");
  140 +
  141 + OutputStream os = response.getOutputStream();
  142 + BufferedOutputStream bos = new BufferedOutputStream(os);
  143 +
  144 + InputStream is = new FileInputStream(dataToolsFile.getFile());
  145 + BufferedInputStream bis = new BufferedInputStream(is);
  146 +
  147 + int length = 0;
  148 + byte[] temp = new byte[1 * 1024 * 10];
  149 + while ((length = bis.read(temp)) != -1) {
  150 + bos.write(temp, 0, length);
  151 + }
  152 + bos.flush();
  153 + bis.close();
  154 + bos.close();
  155 + is.close();
  156 + }
131 157
132 @RequestMapping(value = "/exportDTDFile/{type}", method = RequestMethod.POST) 158 @RequestMapping(value = "/exportDTDFile/{type}", method = RequestMethod.POST)
133 public void exportFile( 159 public void exportFile(
src/main/java/com/bsth/service/schedule/TTInfoDetailService.java
@@ -34,6 +34,14 @@ public interface TTInfoDetailService extends BService<TTInfoDetail, Long> { @@ -34,6 +34,14 @@ public interface TTInfoDetailService extends BService<TTInfoDetail, Long> {
34 DataToolsFile exportDynamicTTinfo(TTinfoDetailDynamicData.DTInfos dtInfos, DataToolsFileType type) throws ScheduleException; 34 DataToolsFile exportDynamicTTinfo(TTinfoDetailDynamicData.DTInfos dtInfos, DataToolsFileType type) throws ScheduleException;
35 35
36 /** 36 /**
  37 + * 导出班次发车间隔信息。
  38 + * @param lineHeadWayInfo
  39 + * @return
  40 + * @throws ScheduleException
  41 + */
  42 + DataToolsFile exportHeadwayTTinfo(TTinfoDetailDynamicData.LineHeadWayInfo lineHeadWayInfo) throws ScheduleException;
  43 +
  44 + /**
37 * 获取时刻表最大发车顺序号 45 * 获取时刻表最大发车顺序号
38 * @param xlid 线路id 46 * @param xlid 线路id
39 * @param ttinfoid 时刻表id 47 * @param ttinfoid 时刻表id
src/main/java/com/bsth/service/schedule/datatools/TTInfoDetailDataToolsImpl.java
@@ -800,4 +800,82 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail @@ -800,4 +800,82 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
800 } 800 }
801 801
802 } 802 }
  803 +
  804 + @Override
  805 + public DataToolsFile exportHeadwayTTinfo(LineHeadWayInfo lineHeadWayInfo) throws ScheduleException {
  806 + try {
  807 + // 输出2007版本
  808 + ExcelPoiOperator excelPoiOperator = new Excel2007PoiOperator();
  809 +
  810 + // 使用POI,创建xlsx文件
  811 + org.apache.poi.ss.usermodel.Workbook wb = excelPoiOperator.createWorkBook();
  812 + // 一个sheet写上下行间隔信息
  813 + org.apache.poi.ss.usermodel.Sheet sheet = excelPoiOperator.createWorkBookSheet(wb, "时刻表发车间隔信息_统计");
  814 +
  815 + // 构建第一行数据
  816 + Row lpHeadRow = excelPoiOperator.createSheetRow(sheet, 0);
  817 + // 构建上行发车间隔表头
  818 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) 0, "路牌", new Color(0x96b9d7));
  819 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) 1, "发车时间", new Color(0x96b9d7));
  820 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) 2, "发车间隔", new Color(0x96b9d7));
  821 + // 构造下行发车间隔表头
  822 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) 6, "路牌", new Color(0x96b9d7));
  823 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) 7, "发车时间", new Color(0x96b9d7));
  824 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) 8, "发车间隔", new Color(0x96b9d7));
  825 +
  826 + // 构造行
  827 + int maxRow = Math.max(lineHeadWayInfo.getUpBcList().size(), lineHeadWayInfo.getDownBcList().size());
  828 + List<Row> rowList = new ArrayList<>();
  829 + for (int i = 1; i <= maxRow; i++) {
  830 + Row row = excelPoiOperator.createSheetRow(sheet, i);
  831 + rowList.add(row);
  832 + }
  833 +
  834 + // 构造上行发车间隔信息
  835 + for (int i = 0; i < lineHeadWayInfo.getUpBcList().size(); i++) {
  836 + BcHeadWayInfo bcHeadWayInfo = lineHeadWayInfo.getUpBcList().get(i);
  837 + excelPoiOperator.createStringCell(wb, rowList.get(i), (short) 0, bcHeadWayInfo.getLpName());
  838 + excelPoiOperator.createStringCell(wb, rowList.get(i), (short) 1, bcHeadWayInfo.getFcsj());
  839 + excelPoiOperator.createStringCell(wb, rowList.get(i), (short) 2, bcHeadWayInfo.getHeadway());
  840 + }
  841 + // 构造下行发车间隔信息
  842 + for (int i = 0; i < lineHeadWayInfo.getDownBcList().size(); i++) {
  843 + BcHeadWayInfo bcHeadWayInfo = lineHeadWayInfo.getDownBcList().get(i);
  844 + excelPoiOperator.createStringCell(wb, rowList.get(i), (short) 6, bcHeadWayInfo.getLpName());
  845 + excelPoiOperator.createStringCell(wb, rowList.get(i), (short) 7, bcHeadWayInfo.getFcsj());
  846 + excelPoiOperator.createStringCell(wb, rowList.get(i), (short) 8, bcHeadWayInfo.getHeadway());
  847 + }
  848 +
  849 + // 自适应单元格长宽
  850 + sheet.autoSizeColumn(0);
  851 + sheet.autoSizeColumn(1);
  852 + sheet.autoSizeColumn(2);
  853 + sheet.autoSizeColumn(6);
  854 + sheet.autoSizeColumn(7);
  855 + sheet.autoSizeColumn(8);
  856 +
  857 + // wb内存写入文件
  858 + String filepath = dataToolsProperties.getFileoutputDir() +
  859 + File.separator +
  860 + "动态时刻表发车间隔信息-" +
  861 + new DateTime().toString("yyyyMMddHHmmss") + ".xlsx";
  862 + File file = new File(filepath);
  863 + excelPoiOperator.writeExcel(file, wb);
  864 +
  865 + DataToolsFile dataToolsFile = new DataToolsFile();
  866 + dataToolsFile.setFileType(DataToolsFileType.XLSX);
  867 + dataToolsFile.setFile(file);
  868 +
  869 + return dataToolsFile;
  870 +
  871 + } catch (Exception exp) {
  872 + LOGGER.info("//---------------- 动态时刻表发车间隔信息输出 failed... ----------------//");
  873 +
  874 + StringWriter sw = new StringWriter();
  875 + exp.printStackTrace(new PrintWriter(sw));
  876 + LOGGER.info(sw.toString());
  877 +
  878 + throw new ScheduleException(exp);
  879 + }
  880 + }
803 } 881 }
src/main/java/com/bsth/service/schedule/datatools/TTinfoDetailDynamicData.java
@@ -400,6 +400,62 @@ public interface TTinfoDetailDynamicData { @@ -400,6 +400,62 @@ public interface TTinfoDetailDynamicData {
400 } 400 }
401 } 401 }
402 402
  403 + class BcHeadWayInfo { // 班次发车间隔信息
  404 + /** 路牌名字 */
  405 + private String lpName;
  406 + /** 发车时间 */
  407 + private String fcsj;
  408 + /** 发车间隔 */
  409 + private String headway;
  410 +
  411 + public String getLpName() {
  412 + return lpName;
  413 + }
  414 +
  415 + public void setLpName(String lpName) {
  416 + this.lpName = lpName;
  417 + }
  418 +
  419 + public String getFcsj() {
  420 + return fcsj;
  421 + }
  422 +
  423 + public void setFcsj(String fcsj) {
  424 + this.fcsj = fcsj;
  425 + }
  426 +
  427 + public String getHeadway() {
  428 + return headway;
  429 + }
  430 +
  431 + public void setHeadway(String headway) {
  432 + this.headway = headway;
  433 + }
  434 + }
  435 +
  436 + class LineHeadWayInfo { // 线路发车间隔信息
  437 + /** 上行班次发车间隔信息 */
  438 + private List<BcHeadWayInfo> upBcList;
  439 + /** 下行班次发车间隔信息 */
  440 + private List<BcHeadWayInfo> downBcList;
  441 +
  442 + public List<BcHeadWayInfo> getUpBcList() {
  443 + return upBcList;
  444 + }
  445 +
  446 + public void setUpBcList(List<BcHeadWayInfo> upBcList) {
  447 + this.upBcList = upBcList;
  448 + }
  449 +
  450 + public List<BcHeadWayInfo> getDownBcList() {
  451 + return downBcList;
  452 + }
  453 +
  454 + public void setDownBcList(List<BcHeadWayInfo> downBcList) {
  455 + this.downBcList = downBcList;
  456 + }
  457 + }
  458 +
403 //---------------------- 生成时刻表用对象(以上) ---------------------// 459 //---------------------- 生成时刻表用对象(以上) ---------------------//
404 460
405 /** 461 /**
@@ -409,4 +465,12 @@ public interface TTinfoDetailDynamicData { @@ -409,4 +465,12 @@ public interface TTinfoDetailDynamicData {
409 * @throws ScheduleException 465 * @throws ScheduleException
410 */ 466 */
411 DataToolsFile exportDynamicTTinfo(DTInfos dtInfos, DataToolsFileType type) throws ScheduleException; 467 DataToolsFile exportDynamicTTinfo(DTInfos dtInfos, DataToolsFileType type) throws ScheduleException;
  468 +
  469 + /**
  470 + * 导出班次发车间隔信息。
  471 + * @param lineHeadWayInfo
  472 + * @return
  473 + * @throws ScheduleException
  474 + */
  475 + DataToolsFile exportHeadwayTTinfo(LineHeadWayInfo lineHeadWayInfo) throws ScheduleException;
412 } 476 }
src/main/java/com/bsth/service/schedule/impl/SchedulePlanServiceImpl.java
@@ -8,18 +8,17 @@ import com.bsth.repository.LineRepository; @@ -8,18 +8,17 @@ import com.bsth.repository.LineRepository;
8 import com.bsth.repository.schedule.*; 8 import com.bsth.repository.schedule.*;
9 import com.bsth.service.schedule.SchedulePlanService; 9 import com.bsth.service.schedule.SchedulePlanService;
10 import com.bsth.service.schedule.exception.ScheduleException; 10 import com.bsth.service.schedule.exception.ScheduleException;
  11 +import com.bsth.service.schedule.impl.plan.DroolsSchedulePlan;
  12 +import com.bsth.service.schedule.impl.plan.ScheduleRuleService;
11 import com.bsth.service.schedule.impl.plan.kBase3.validate.rule.ValidateRuleResult; 13 import com.bsth.service.schedule.impl.plan.kBase3.validate.rule.ValidateRuleResult;
12 import com.bsth.service.schedule.impl.plan.kBase3.validate.timetable.CalcuParam; 14 import com.bsth.service.schedule.impl.plan.kBase3.validate.timetable.CalcuParam;
13 import com.bsth.service.schedule.impl.plan.kBase3.validate.timetable.Result; 15 import com.bsth.service.schedule.impl.plan.kBase3.validate.timetable.Result;
14 -import com.bsth.service.schedule.impl.plan.DroolsSchedulePlan;  
15 -import com.bsth.service.schedule.impl.plan.ScheduleRuleService;  
16 import org.joda.time.DateTime; 16 import org.joda.time.DateTime;
17 import org.kie.api.KieBase; 17 import org.kie.api.KieBase;
18 import org.kie.api.runtime.KieSession; 18 import org.kie.api.runtime.KieSession;
19 import org.slf4j.Logger; 19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory; 20 import org.slf4j.LoggerFactory;
21 import org.springframework.beans.factory.annotation.Autowired; 21 import org.springframework.beans.factory.annotation.Autowired;
22 -import org.springframework.beans.factory.annotation.Qualifier;  
23 import org.springframework.stereotype.Service; 22 import org.springframework.stereotype.Service;
24 import org.springframework.transaction.annotation.Isolation; 23 import org.springframework.transaction.annotation.Isolation;
25 import org.springframework.transaction.annotation.Propagation; 24 import org.springframework.transaction.annotation.Propagation;
@@ -35,16 +34,16 @@ import java.util.concurrent.locks.ReentrantLock; @@ -35,16 +34,16 @@ import java.util.concurrent.locks.ReentrantLock;
35 */ 34 */
36 @Service 35 @Service
37 public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> implements SchedulePlanService { 36 public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> implements SchedulePlanService {
38 - @Autowired  
39 - @Qualifier("coreKBase") 37 +// @Autowired
  38 +// @Qualifier("coreKBase")
40 private KieBase coreKBase; 39 private KieBase coreKBase;
41 40
42 - @Autowired  
43 - @Qualifier("preKBase") 41 +// @Autowired
  42 +// @Qualifier("preKBase")
44 private KieBase preKBase; 43 private KieBase preKBase;
45 44
46 - @Autowired  
47 - @Qualifier("KBase3") 45 +// @Autowired
  46 +// @Qualifier("KBase3")
48 private KieBase validateKBase; 47 private KieBase validateKBase;
49 48
50 @Autowired 49 @Autowired
src/main/java/com/bsth/service/schedule/impl/TTInfoDetailServiceImpl.java
@@ -145,6 +145,11 @@ public class TTInfoDetailServiceImpl extends BServiceImpl&lt;TTInfoDetail, Long&gt; im @@ -145,6 +145,11 @@ public class TTInfoDetailServiceImpl extends BServiceImpl&lt;TTInfoDetail, Long&gt; im
145 } 145 }
146 146
147 @Override 147 @Override
  148 + public DataToolsFile exportHeadwayTTinfo(TTinfoDetailDynamicData.LineHeadWayInfo lineHeadWayInfo) throws ScheduleException {
  149 + return tTinfoDetailDynamicData.exportHeadwayTTinfo(lineHeadWayInfo);
  150 + }
  151 +
  152 + @Override
148 public DataToolsFile exportDynamicTTinfo(TTinfoDetailDynamicData.DTInfos dtInfos, DataToolsFileType type) throws ScheduleException { 153 public DataToolsFile exportDynamicTTinfo(TTinfoDetailDynamicData.DTInfos dtInfos, DataToolsFileType type) throws ScheduleException {
149 return tTinfoDetailDynamicData.exportDynamicTTinfo(dtInfos, type); 154 return tTinfoDetailDynamicData.exportDynamicTTinfo(dtInfos, type);
150 } 155 }
src/main/java/com/bsth/service/schedule/impl/plan/MyDroolsConfiguration.java
@@ -14,12 +14,11 @@ import org.kie.api.runtime.conf.ClockTypeOption; @@ -14,12 +14,11 @@ import org.kie.api.runtime.conf.ClockTypeOption;
14 import org.slf4j.Logger; 14 import org.slf4j.Logger;
15 import org.slf4j.LoggerFactory; 15 import org.slf4j.LoggerFactory;
16 import org.springframework.context.annotation.Bean; 16 import org.springframework.context.annotation.Bean;
17 -import org.springframework.context.annotation.Configuration;  
18 17
19 /** 18 /**
20 * Drools 6配置类。 19 * Drools 6配置类。
21 */ 20 */
22 -@Configuration 21 +//@Configuration
23 public class MyDroolsConfiguration { 22 public class MyDroolsConfiguration {
24 /** 日志记录器 */ 23 /** 日志记录器 */
25 private static final Logger logger = LoggerFactory.getLogger(MyDroolsConfiguration.class); 24 private static final Logger logger = LoggerFactory.getLogger(MyDroolsConfiguration.class);
src/main/resources/static/pages/base/timesmodel/gantt.html
@@ -78,6 +78,13 @@ @@ -78,6 +78,13 @@
78 Excel2007 xlsx 78 Excel2007 xlsx
79 </a> 79 </a>
80 </li> 80 </li>
  81 +
  82 + <li>
  83 + <a href="javascript:" class="tool-action exportHeadWayXlsx">
  84 + <i class="fa fa-file-excel-o"></i>
  85 + 发车间隔信息xlsx
  86 + </a>
  87 + </li>
81 </ul> 88 </ul>
82 </div> 89 </div>
83 90
src/main/resources/static/pages/base/timesmodel/js/gantt.js
@@ -180,7 +180,9 @@ @@ -180,7 +180,9 @@
180 qdz: _gObj[13], 180 qdz: _gObj[13],
181 zdz: _gObj[14], 181 zdz: _gObj[14],
182 STOPTIME: _gObj[15], 182 STOPTIME: _gObj[15],
183 - isfb: _gObj[16] 183 + isfb: _gObj[16],
  184 +
  185 + fcsj_time: _gObj[1] // 原始时间,用于排序
184 }); 186 });
185 } 187 }
186 188
src/main/resources/static/pages/base/timesmodel/js/v2_2/Main_v2_2_ExcelObj.js
@@ -966,6 +966,76 @@ var Main_v2_2_ExcelObj = (function() { @@ -966,6 +966,76 @@ var Main_v2_2_ExcelObj = (function() {
966 return _celb.fnGenerateExcelLpBcList(); 966 return _celb.fnGenerateExcelLpBcList();
967 }; 967 };
968 968
  969 + /**
  970 + * 获取班次发车间隔数据。
  971 + * @return {*}
  972 + */
  973 + InternalExcelObj.prototype.fnGetBcHeadWayInfoList = function() {
  974 + // 甘特图班次数据
  975 + var aGanttBc = this._fnBc();
  976 +
  977 + var i;
  978 + var oHeadWayBc = {};
  979 + // 构造上行班次间隔数据,normal班次,时间排序
  980 + var upBcList = [];
  981 + for (i = 0; i < aGanttBc.length; i++) {
  982 + oHeadWayBc = {};
  983 + if (aGanttBc[i].xlDir == 'relationshipGraph-up' && aGanttBc[i].bcType == 'normal') {
  984 + oHeadWayBc.lpName = aGanttBc[i].lpName; // 路牌
  985 + oHeadWayBc.fcsj = aGanttBc[i].fcsj; // 发车时间
  986 + oHeadWayBc.fcsj_time = aGanttBc[i].fcsj_time; // 发车时间(毫秒)
  987 + upBcList.push(oHeadWayBc);
  988 + }
  989 + }
  990 + upBcList.sort(function(t1, t2) {
  991 + return t1.fcsj_time - t2.fcsj_time;
  992 + });
  993 + // 计算发车间隔时间
  994 + for (i = 0; i < upBcList.length; i++) {
  995 + if (i == 0) {
  996 + upBcList[i].headway = 0;
  997 + } else {
  998 + upBcList[i].headway = (upBcList[i].fcsj_time - upBcList[i - 1].fcsj_time) / 1000 / 60
  999 + }
  1000 + }
  1001 +
  1002 + // 构造下行班次间隔数据,normal班次,时间排序
  1003 + var downBcList = [];
  1004 + for (i = 0; i < aGanttBc.length; i++) {
  1005 + oHeadWayBc = {};
  1006 + if (aGanttBc[i].xlDir == 'relationshipGraph-down' && aGanttBc[i].bcType == 'normal') {
  1007 + oHeadWayBc.lpName = aGanttBc[i].lpName; // 路牌
  1008 + oHeadWayBc.fcsj = aGanttBc[i].fcsj; // 发车时间
  1009 + oHeadWayBc.fcsj_time = aGanttBc[i].fcsj_time; // 发车时间(毫秒)
  1010 + downBcList.push(oHeadWayBc);
  1011 + }
  1012 + }
  1013 + downBcList.sort(function(t1, t2) {
  1014 + return t1.fcsj_time - t2.fcsj_time;
  1015 + });
  1016 + // 计算发车间隔时间
  1017 + for (i = 0; i < downBcList.length; i++) {
  1018 + if (i == 0) {
  1019 + downBcList[i].headway = 0;
  1020 + } else {
  1021 + downBcList[i].headway = (downBcList[i].fcsj_time - downBcList[i - 1].fcsj_time) / 1000 / 60
  1022 + }
  1023 + }
  1024 +
  1025 + // 删除 fcsj_time 属性
  1026 + for (i = 0; i < upBcList.length; i++) {
  1027 + delete upBcList[i].fcsj_time;
  1028 + }
  1029 + for (i = 0; i < downBcList.length; i++) {
  1030 + delete downBcList[i].fcsj_time;
  1031 + }
  1032 +
  1033 + return {
  1034 + upBcList : upBcList,
  1035 + downBcList : downBcList
  1036 + };
  1037 + };
  1038 +
969 return InternalExcelObj; 1039 return InternalExcelObj;
970 1040
971 } ()); 1041 } ());
972 \ No newline at end of file 1042 \ No newline at end of file
src/main/resources/static/pages/base/timesmodel/js/v2_2/main_v2_2.js
@@ -69,6 +69,39 @@ var Main_v2_2 = function() { @@ -69,6 +69,39 @@ var Main_v2_2 = function() {
69 69
70 $('.exportAddXls').off('click'); 70 $('.exportAddXls').off('click');
71 $('.exportAddXlsx').off('click'); 71 $('.exportAddXlsx').off('click');
  72 + $('.exportHeadWayXlsx').off('click');
  73 +
  74 + $('.exportHeadWayXlsx').on('click', function() {
  75 + // TOD:获取发车间隔信息
  76 + var lineHeadWayInfo = oExcel.fnGetBcHeadWayInfoList();
  77 +
  78 + console.log(lineHeadWayInfo);
  79 +
  80 + $(".exportAdd").addClass("disabled");
  81 + $(".exportAddSpan").html("正在导出...");
  82 +
  83 + // 提交
  84 + $.ajax({
  85 + type: 'POST',
  86 + url: "/tidc/exportDTDFile2",
  87 + dataType: 'binary',
  88 + contentType: "application/json",
  89 + data: JSON.stringify(lineHeadWayInfo),
  90 + success: function(data){
  91 + oExcel.downloadFile(data, "application/octet-stream", "时刻表发车间隔信息.xls");
  92 +
  93 + $(".exportAdd").removeClass("disabled");
  94 + $(".exportAddSpan").html(" 导出数据");
  95 + },
  96 + error: function(xhr, type){
  97 + alert('错误:TODO');
  98 +
  99 + $(".exportAdd").removeClass("disabled");
  100 + $(".exportAddSpan").html(" 导出数据");
  101 + }
  102 + });
  103 + });
  104 +
72 105
73 $('.exportAddXls').on('click', function() { 106 $('.exportAddXls').on('click', function() {
74 107