Commit 668bce7933c9e2f17dff8073b8dd78e8e4bb6101

Authored by 潘钊
2 parents 2f9dd0cc 478e05ff

Merge branch 'pudong' of http://222.66.0.204:8090/panzhaov5/bsth_control into pudong

Showing 32 changed files with 2797 additions and 846 deletions

Too many changes to show.

To preserve performance only 32 of 44 files are displayed.

src/main/java/com/bsth/controller/calc/CalcWaybillController.java
... ... @@ -6,6 +6,7 @@ import java.util.Map;
6 6  
7 7 import com.bsth.common.ResponseCode;
8 8 import com.bsth.controller.BaseController;
  9 +import com.bsth.entity.calc.CalcStatistics;
9 10 import com.bsth.entity.calc.CalcWaybill;
10 11 import com.bsth.service.calc.CalcWaybillService;
11 12  
... ... @@ -26,19 +27,26 @@ public class CalcWaybillController extends BaseController<CalcWaybill, Integer>
26 27  
27 28 @RequestMapping(value="/generateNew")
28 29 public Map<String, Object> generateNews(@RequestParam Map<String, Object> map) throws Exception{
29   - String date = "", line = "";
  30 + String date = "", line = "", key="";
30 31 if(map.get("date")!=null){
31 32 date=map.get("date").toString().trim();
32 33 }
33 34 if(map.get("line")!=null){
34 35 line=map.get("line").toString().trim();
35 36 }
  37 + if(map.get("key")!=null){
  38 + key=map.get("key").toString().trim();
  39 + }
36 40  
37 41 Map<String, Object> m = new HashMap<String, Object>();
38 42 try {
39 43  
40 44 m = calcWaybillService.generateNew(date, line);
41 45  
  46 + if(key.length() == 0){
  47 + m.put("status", calcWaybillService.calcDaily(date, line));
  48 + }
  49 +
42 50 } catch (Exception e) {
43 51 // TODO: handle exception
44 52 e.printStackTrace();
... ... @@ -82,4 +90,61 @@ public class CalcWaybillController extends BaseController&lt;CalcWaybill, Integer&gt;
82 90 return calcWaybillService.statisticsDailyTj(gsdm,fgsdm,line,date,date2,xlName,type);
83 91 }
84 92  
  93 + @RequestMapping(value="/generateDaliy")
  94 + public Map<String, Object> generateDaliy(@RequestParam Map<String, Object> map) throws Exception{
  95 + String date = "", line = "";
  96 + if(map.containsKey("date") && map.get("date")!=null){
  97 + date=map.get("date").toString().trim();
  98 + }
  99 + if(map.containsKey("line") && map.get("line")!=null){
  100 + line=map.get("line").toString().trim();
  101 + }
  102 +
  103 + Map<String, Object> m = new HashMap<String, Object>();
  104 + try {
  105 +
  106 + m.put("status", calcWaybillService.calcDaily(date, line));
  107 +
  108 + } catch (Exception e) {
  109 + // TODO: handle exception
  110 + e.printStackTrace();
  111 + m.put("status", ResponseCode.ERROR);
  112 + return m;
  113 + }
  114 + return m;
  115 + }
  116 +
  117 + @RequestMapping(value="/calcStatisticsDaily")
  118 + public List<CalcStatistics> calcStatisticsDaily(@RequestParam Map<String, Object> map){
  119 + String gsdm="";
  120 + if(map.get("gsdm")!=null){
  121 + gsdm=map.get("gsdm").toString().trim();
  122 + }
  123 + String fgsdm="";
  124 + if(map.get("fgsdm")!=null){
  125 + fgsdm=map.get("fgsdm").toString().trim();
  126 + }
  127 + String line="";
  128 + if(map.get("line")!=null){
  129 + line=map.get("line").toString().trim();
  130 + }
  131 + String date="";
  132 + if(map.get("date")!=null){
  133 + date=map.get("date").toString().trim();
  134 + }
  135 + String date2="";
  136 + if(map.get("date2")!=null){
  137 + date2=map.get("date2").toString().trim();
  138 + }
  139 + String xlName="";
  140 + if(map.get("xlName")!=null){
  141 + xlName=map.get("xlName").toString().trim();
  142 + }
  143 + String type="";
  144 + if(map.get("type")!=null){
  145 + type=map.get("type").toString().trim();
  146 + }
  147 + return calcWaybillService.calcStatisticsDaily(gsdm,fgsdm,line,date,date2,xlName,type);
  148 + }
  149 +
85 150 }
... ...
src/main/java/com/bsth/controller/schedule/core/TTInfoDetailController.java
... ... @@ -6,6 +6,7 @@ import com.bsth.entity.schedule.TTInfoDetail;
6 6 import com.bsth.service.schedule.TTInfoDetailService;
7 7 import com.bsth.service.schedule.datatools.TTInfoDetailForEdit;
8 8 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData;
  9 +import com.bsth.service.schedule.timetable.ExcelFormatType;
9 10 import com.bsth.service.schedule.utils.DataToolsFile;
10 11 import org.springframework.beans.factory.annotation.Autowired;
11 12 import org.springframework.web.bind.annotation.*;
... ... @@ -41,13 +42,14 @@ public class TTInfoDetailController extends BController&lt;TTInfoDetail, Long&gt; {
41 42 */
42 43 @RequestMapping(value = "/validate/sheet", method = RequestMethod.POST)
43 44 public Map<String, Object> validate_sheet(
44   - String filename, String sheetname, Integer lineid, String linename, Integer lineversion) {
  45 + String filename, String sheetname, Integer lineid, String linename, Integer lineversion, String excelFormatType) {
45 46 Map<String, Object> rtn = new HashMap<>();
46 47 try {
47 48 if (lineversion == null) {
48 49 throw new Exception("线路版本未知");
49 50 }
50   - ttInfoDetailService.validateExcelSheet(filename, sheetname, lineid, linename, lineversion);
  51 + ttInfoDetailService.validateExcelSheet(filename, sheetname, lineid, linename, lineversion,
  52 + ExcelFormatType.getEnum(excelFormatType));
51 53 rtn.put("status", ResponseCode.SUCCESS);
52 54 } catch (Exception exp) {
53 55 rtn.put("status", ResponseCode.ERROR);
... ...
src/main/java/com/bsth/data/schedule/thread/CalcOilThread.java
... ... @@ -3,6 +3,7 @@ package com.bsth.data.schedule.thread;
3 3 import com.bsth.data.directive.DayOfDirectives;
4 4 import com.bsth.data.gpsdata_v2.handlers.overspeed.OverspeedProcess;
5 5 import com.bsth.data.gpsdata_v2.thread.GpsDataLoaderThread;
  6 +import com.bsth.service.calc.CalcWaybillService;
6 7 import com.bsth.service.oil.DlbService;
7 8 import com.bsth.data.safe_driv.SafeDrivCenter;
8 9 import com.bsth.service.oil.YlbService;
... ... @@ -31,6 +32,9 @@ public class CalcOilThread extends Thread{
31 32  
32 33 @Autowired
33 34 DayOfDirectives dayOfDirectives;
  35 +
  36 + @Autowired
  37 + CalcWaybillService calcWaybillService;
34 38  
35 39 @Override
36 40 public void run() {
... ... @@ -42,6 +46,9 @@ public class CalcOilThread extends Thread{
42 46 logger.info("开始计算班次准点率....");
43 47 sheetService.saveSheetList("");
44 48 logger.info("计算班次准点率结束!");
  49 + logger.info("开始保存统计日报....");
  50 + calcWaybillService.calcDaily("", "");
  51 + logger.info("统计日报保存完成!");
45 52 } catch(Exception e){
46 53 logger.error("计算路单里程加注量失败",e);
47 54 }
... ...
src/main/java/com/bsth/entity/calc/CalcInterval.java 0 → 100644
  1 +package com.bsth.entity.calc;
  2 +
  3 +import java.util.Date;
  4 +
  5 +import javax.persistence.Entity;
  6 +import javax.persistence.GeneratedValue;
  7 +import javax.persistence.Id;
  8 +import javax.persistence.Table;
  9 +
  10 +@Entity
  11 +@Table(name = "calc_interval")
  12 +public class CalcInterval {
  13 + /* 主键*/
  14 + @Id
  15 + @GeneratedValue
  16 + private Long id;
  17 + /* 公司代码*/
  18 + private String gsdm;
  19 + /* 公司名称*/
  20 + private String gsname;
  21 + /* 分公司代码*/
  22 + private String fgsdm;
  23 + /* 分公司名称*/
  24 + private String fgsname;
  25 + /* 日期*/
  26 + private Date rq;
  27 + /* 日期字符串*/
  28 + private String rqStr;
  29 + /* 线路编码*/
  30 + private String xl;
  31 + /* 线路名称*/
  32 + private String xlName;
  33 + /* 大间隔次数*/
  34 + private int djg;
  35 + /* 大间隔次数(早高峰)*/
  36 + private int djgM;
  37 + /* 大间隔次数(晚高峰)*/
  38 + private int djgA;
  39 + /* 最大大间隔时间*/
  40 + private int djgTime;
  41 + /* 备注*/
  42 + private String remark;
  43 + public Long getId() {
  44 + return id;
  45 + }
  46 + public void setId(Long id) {
  47 + this.id = id;
  48 + }
  49 + public String getGsdm() {
  50 + return gsdm;
  51 + }
  52 + public void setGsdm(String gsdm) {
  53 + this.gsdm = gsdm;
  54 + }
  55 + public String getGsname() {
  56 + return gsname;
  57 + }
  58 + public void setGsname(String gsname) {
  59 + this.gsname = gsname;
  60 + }
  61 + public String getFgsdm() {
  62 + return fgsdm;
  63 + }
  64 + public void setFgsdm(String fgsdm) {
  65 + this.fgsdm = fgsdm;
  66 + }
  67 + public String getFgsname() {
  68 + return fgsname;
  69 + }
  70 + public void setFgsname(String fgsname) {
  71 + this.fgsname = fgsname;
  72 + }
  73 + public Date getRq() {
  74 + return rq;
  75 + }
  76 + public void setRq(Date rq) {
  77 + this.rq = rq;
  78 + }
  79 + public String getRqStr() {
  80 + return rqStr;
  81 + }
  82 + public void setRqStr(String rqStr) {
  83 + this.rqStr = rqStr;
  84 + }
  85 + public String getXl() {
  86 + return xl;
  87 + }
  88 + public void setXl(String xl) {
  89 + this.xl = xl;
  90 + }
  91 + public String getXlName() {
  92 + return xlName;
  93 + }
  94 + public void setXlName(String xlName) {
  95 + this.xlName = xlName;
  96 + }
  97 + public int getDjg() {
  98 + return djg;
  99 + }
  100 + public void setDjg(int djg) {
  101 + this.djg = djg;
  102 + }
  103 + public int getDjgM() {
  104 + return djgM;
  105 + }
  106 + public void setDjgM(int djgM) {
  107 + this.djgM = djgM;
  108 + }
  109 + public int getDjgA() {
  110 + return djgA;
  111 + }
  112 + public void setDjgA(int djgA) {
  113 + this.djgA = djgA;
  114 + }
  115 + public int getDjgTime() {
  116 + return djgTime;
  117 + }
  118 + public void setDjgTime(int djgTime) {
  119 + this.djgTime = djgTime;
  120 + }
  121 + public String getRemark() {
  122 + return remark;
  123 + }
  124 + public void setRemark(String remark) {
  125 + this.remark = remark;
  126 + }
  127 +
  128 +}
... ...
src/main/java/com/bsth/entity/calc/CalcStatistics.java 0 → 100644
  1 +package com.bsth.entity.calc;
  2 +
  3 +import java.util.Date;
  4 +
  5 +import javax.persistence.Entity;
  6 +import javax.persistence.GeneratedValue;
  7 +import javax.persistence.Id;
  8 +import javax.persistence.Table;
  9 +
  10 +@Entity
  11 +@Table(name = "calc_statistics")
  12 +public class CalcStatistics {
  13 + /* 主键*/
  14 + @Id
  15 + @GeneratedValue
  16 + private Long id;
  17 + /* 日期*/
  18 + private Date date;
  19 + /* 日期字符串*/
  20 + private String dateStr;
  21 + /* 线路编码*/
  22 + private String xl;
  23 + /* 线路名称*/
  24 + private String xlName;
  25 + /* 公司代码*/
  26 + private String gsdm;
  27 + /* 分公司代码*/
  28 + private String fgsdm;
  29 + /* 计划总公里*/
  30 + private Double jhzlc;
  31 + /* 计划营运公里*/
  32 + private Double jhyylc;
  33 + /* 计划空驶公里*/
  34 + private Double jhkslc;
  35 + /* 实际总公里*/
  36 + private Double sjzlc;
  37 + /* 实际营运公里*/
  38 + private Double sjyylc;
  39 + /* 实际空驶公里*/
  40 + private Double sjkslc;
  41 + /* 少驶公里*/
  42 + private Double sslc;
  43 + /* 少驶班次*/
  44 + private int ssbc;
  45 + /* 路阻公里*/
  46 + private Double lzlc;
  47 + /* 吊慢公里*/
  48 + private Double dmlc;
  49 + /* 故障公里*/
  50 + private Double gzlc;
  51 + /* 纠纷公里*/
  52 + private Double jflc;
  53 + /* 肇事公里*/
  54 + private Double zslc;
  55 + /* 缺人公里*/
  56 + private Double qrlc;
  57 + /* 缺车公里*/
  58 + private Double qclc;
  59 + /* 客稀公里*/
  60 + private Double kxlc;
  61 + /* 气候公里*/
  62 + private Double qhlc;
  63 + /* 援外公里*/
  64 + private Double ywlc;
  65 + /* 其他公里*/
  66 + private Double qtlc;
  67 + /* 临加公里*/
  68 + private Double ljlc;
  69 + /* 计划班次*/
  70 + private int jhbcq;
  71 + /* 计划班次(早高峰)*/
  72 + private int jhbcz;
  73 + /* 计划班次(晚高峰)*/
  74 + private int jhbcw;
  75 + /* 实际班次*/
  76 + private int sjbcq;
  77 + /* 实际班次(早高峰)*/
  78 + private int sjbcz;
  79 + /* 实际班次(晚高峰)*/
  80 + private int sjbcw;
  81 + /* 临加班次*/
  82 + private int ljbcq;
  83 + /* 临加班次(早高峰)*/
  84 + private int ljbcz;
  85 + /* 临加班次(晚高峰)*/
  86 + private int ljbcw;
  87 + /* 放站班次*/
  88 + private int fzbcq;
  89 + /* 放站班次(早高峰)*/
  90 + private int fzbcz;
  91 + /* 放站班次(晚高峰)*/
  92 + private int fzbcw;
  93 + /* 调头班次*/
  94 + private int dtbcq;
  95 + /* 调头班次(早高峰)*/
  96 + private int dtbcz;
  97 + /* 调头班次(晚高峰)*/
  98 + private int dtbcw;
  99 + /* 大间隔次数*/
  100 + private int djgq;
  101 + /* 大间隔次数(早高峰)*/
  102 + private int djgz;
  103 + /* 大间隔次数(晚高峰)*/
  104 + private int djgw;
  105 + /* 最大大间隔时间*/
  106 + private int djgsj;
  107 + /* 备注*/
  108 + private String remark;
  109 +
  110 +
  111 + public Long getId() {
  112 + return id;
  113 + }
  114 + public void setId(Long id) {
  115 + this.id = id;
  116 + }
  117 + public Date getDate() {
  118 + return date;
  119 + }
  120 + public void setDate(Date date) {
  121 + this.date = date;
  122 + }
  123 + public String getDateStr() {
  124 + return dateStr;
  125 + }
  126 + public void setDateStr(String dateStr) {
  127 + this.dateStr = dateStr;
  128 + }
  129 + public String getXl() {
  130 + return xl;
  131 + }
  132 + public void setXl(String xl) {
  133 + this.xl = xl;
  134 + }
  135 + public String getXlName() {
  136 + return xlName;
  137 + }
  138 + public void setXlName(String xlName) {
  139 + this.xlName = xlName;
  140 + }
  141 + public String getGsdm() {
  142 + return gsdm;
  143 + }
  144 + public void setGsdm(String gsdm) {
  145 + this.gsdm = gsdm;
  146 + }
  147 + public String getFgsdm() {
  148 + return fgsdm;
  149 + }
  150 + public void setFgsdm(String fgsdm) {
  151 + this.fgsdm = fgsdm;
  152 + }
  153 + public Double getJhzlc() {
  154 + return jhzlc;
  155 + }
  156 + public void setJhzlc(Double jhzlc) {
  157 + this.jhzlc = jhzlc;
  158 + }
  159 + public Double getJhyylc() {
  160 + return jhyylc;
  161 + }
  162 + public void setJhyylc(Double jhyylc) {
  163 + this.jhyylc = jhyylc;
  164 + }
  165 + public Double getJhkslc() {
  166 + return jhkslc;
  167 + }
  168 + public void setJhkslc(Double jhkslc) {
  169 + this.jhkslc = jhkslc;
  170 + }
  171 + public Double getSjzlc() {
  172 + return sjzlc;
  173 + }
  174 + public void setSjzlc(Double sjzlc) {
  175 + this.sjzlc = sjzlc;
  176 + }
  177 + public Double getSjyylc() {
  178 + return sjyylc;
  179 + }
  180 + public void setSjyylc(Double sjyylc) {
  181 + this.sjyylc = sjyylc;
  182 + }
  183 + public Double getSjkslc() {
  184 + return sjkslc;
  185 + }
  186 + public void setSjkslc(Double sjkslc) {
  187 + this.sjkslc = sjkslc;
  188 + }
  189 + public Double getSslc() {
  190 + return sslc;
  191 + }
  192 + public void setSslc(Double sslc) {
  193 + this.sslc = sslc;
  194 + }
  195 + public int getSsbc() {
  196 + return ssbc;
  197 + }
  198 + public void setSsbc(int ssbc) {
  199 + this.ssbc = ssbc;
  200 + }
  201 + public Double getLzlc() {
  202 + return lzlc;
  203 + }
  204 + public void setLzlc(Double lzlc) {
  205 + this.lzlc = lzlc;
  206 + }
  207 + public Double getDmlc() {
  208 + return dmlc;
  209 + }
  210 + public void setDmlc(Double dmlc) {
  211 + this.dmlc = dmlc;
  212 + }
  213 + public Double getGzlc() {
  214 + return gzlc;
  215 + }
  216 + public void setGzlc(Double gzlc) {
  217 + this.gzlc = gzlc;
  218 + }
  219 + public Double getJflc() {
  220 + return jflc;
  221 + }
  222 + public void setJflc(Double jflc) {
  223 + this.jflc = jflc;
  224 + }
  225 + public Double getZslc() {
  226 + return zslc;
  227 + }
  228 + public void setZslc(Double zslc) {
  229 + this.zslc = zslc;
  230 + }
  231 + public Double getQrlc() {
  232 + return qrlc;
  233 + }
  234 + public void setQrlc(Double qrlc) {
  235 + this.qrlc = qrlc;
  236 + }
  237 + public Double getQclc() {
  238 + return qclc;
  239 + }
  240 + public void setQclc(Double qclc) {
  241 + this.qclc = qclc;
  242 + }
  243 + public Double getKxlc() {
  244 + return kxlc;
  245 + }
  246 + public void setKxlc(Double kxlc) {
  247 + this.kxlc = kxlc;
  248 + }
  249 + public Double getQhlc() {
  250 + return qhlc;
  251 + }
  252 + public void setQhlc(Double qhlc) {
  253 + this.qhlc = qhlc;
  254 + }
  255 + public Double getYwlc() {
  256 + return ywlc;
  257 + }
  258 + public void setYwlc(Double ywlc) {
  259 + this.ywlc = ywlc;
  260 + }
  261 + public Double getQtlc() {
  262 + return qtlc;
  263 + }
  264 + public void setQtlc(Double qtlc) {
  265 + this.qtlc = qtlc;
  266 + }
  267 + public Double getLjlc() {
  268 + return ljlc;
  269 + }
  270 + public void setLjlc(Double ljlc) {
  271 + this.ljlc = ljlc;
  272 + }
  273 + public int getJhbcq() {
  274 + return jhbcq;
  275 + }
  276 + public void setJhbcq(int jhbcq) {
  277 + this.jhbcq = jhbcq;
  278 + }
  279 + public int getJhbcz() {
  280 + return jhbcz;
  281 + }
  282 + public void setJhbcz(int jhbcz) {
  283 + this.jhbcz = jhbcz;
  284 + }
  285 + public int getJhbcw() {
  286 + return jhbcw;
  287 + }
  288 + public void setJhbcw(int jhbcw) {
  289 + this.jhbcw = jhbcw;
  290 + }
  291 + public int getSjbcq() {
  292 + return sjbcq;
  293 + }
  294 + public void setSjbcq(int sjbcq) {
  295 + this.sjbcq = sjbcq;
  296 + }
  297 + public int getSjbcz() {
  298 + return sjbcz;
  299 + }
  300 + public void setSjbcz(int sjbcz) {
  301 + this.sjbcz = sjbcz;
  302 + }
  303 + public int getSjbcw() {
  304 + return sjbcw;
  305 + }
  306 + public void setSjbcw(int sjbcw) {
  307 + this.sjbcw = sjbcw;
  308 + }
  309 + public int getLjbcq() {
  310 + return ljbcq;
  311 + }
  312 + public void setLjbcq(int ljbcq) {
  313 + this.ljbcq = ljbcq;
  314 + }
  315 + public int getLjbcz() {
  316 + return ljbcz;
  317 + }
  318 + public void setLjbcz(int ljbcz) {
  319 + this.ljbcz = ljbcz;
  320 + }
  321 + public int getLjbcw() {
  322 + return ljbcw;
  323 + }
  324 + public void setLjbcw(int ljbcw) {
  325 + this.ljbcw = ljbcw;
  326 + }
  327 + public int getFzbcq() {
  328 + return fzbcq;
  329 + }
  330 + public void setFzbcq(int fzbcq) {
  331 + this.fzbcq = fzbcq;
  332 + }
  333 + public int getFzbcz() {
  334 + return fzbcz;
  335 + }
  336 + public void setFzbcz(int fzbcz) {
  337 + this.fzbcz = fzbcz;
  338 + }
  339 + public int getFzbcw() {
  340 + return fzbcw;
  341 + }
  342 + public void setFzbcw(int fzbcw) {
  343 + this.fzbcw = fzbcw;
  344 + }
  345 + public int getDtbcq() {
  346 + return dtbcq;
  347 + }
  348 + public void setDtbcq(int dtbcq) {
  349 + this.dtbcq = dtbcq;
  350 + }
  351 + public int getDtbcz() {
  352 + return dtbcz;
  353 + }
  354 + public void setDtbcz(int dtbcz) {
  355 + this.dtbcz = dtbcz;
  356 + }
  357 + public int getDtbcw() {
  358 + return dtbcw;
  359 + }
  360 + public void setDtbcw(int dtbcw) {
  361 + this.dtbcw = dtbcw;
  362 + }
  363 + public int getDjgq() {
  364 + return djgq;
  365 + }
  366 + public void setDjgq(int djgq) {
  367 + this.djgq = djgq;
  368 + }
  369 + public int getDjgz() {
  370 + return djgz;
  371 + }
  372 + public void setDjgz(int djgz) {
  373 + this.djgz = djgz;
  374 + }
  375 + public int getDjgw() {
  376 + return djgw;
  377 + }
  378 + public void setDjgw(int djgw) {
  379 + this.djgw = djgw;
  380 + }
  381 + public int getDjgsj() {
  382 + return djgsj;
  383 + }
  384 + public void setDjgsj(int djgsj) {
  385 + this.djgsj = djgsj;
  386 + }
  387 + public String getRemark() {
  388 + return remark;
  389 + }
  390 + public void setRemark(String remark) {
  391 + this.remark = remark;
  392 + }
  393 +
  394 +}
... ...
src/main/java/com/bsth/repository/calc/CalcIntervalRepository.java 0 → 100644
  1 +package com.bsth.repository.calc;
  2 +
  3 +import java.util.List;
  4 +
  5 +import javax.transaction.Transactional;
  6 +
  7 +import com.bsth.entity.calc.CalcInterval;
  8 +import com.bsth.repository.BaseRepository;
  9 +
  10 +import org.springframework.data.jpa.repository.Modifying;
  11 +import org.springframework.data.jpa.repository.Query;
  12 +import org.springframework.stereotype.Repository;
  13 +
  14 +/**
  15 + *
  16 + */
  17 +@Repository
  18 +public interface CalcIntervalRepository extends BaseRepository<CalcInterval, Integer>{
  19 +
  20 + //按照时间段统计,公司下线路
  21 + @Query(value="select DISTINCT c from CalcInterval c where c.xl like %?1% and c.rqStr between ?2 and ?3 and c.gsdm like %?4% and c.fgsdm like %?5% order by c.xl")
  22 + List<CalcInterval> selectByDateAndLine(String line,String date,String date2,String gsdm,String fgsdm);
  23 +
  24 + //按照时间段统计,单条线路
  25 + @Query(value="select DISTINCT c from CalcInterval c where c.xl = ?1 and c.rqStr between ?2 and ?3 order by c.xl")
  26 + List<CalcInterval> selectByDateAndLine(String line,String date,String date2);
  27 +
  28 + //按照日期和线路删除数据
  29 + @Modifying
  30 + @Transactional
  31 + @Query(value = "delete CalcInterval c where c.rqStr=?1 and c.xl=?2")
  32 + void deleteByDateAndLine(String date, String line);
  33 +
  34 + //按照日期删除数据
  35 + @Modifying
  36 + @Transactional
  37 + @Query(value = "delete CalcInterval c where c.rqStr=?1")
  38 + void deleteByDate(String date);
  39 +
  40 +}
... ...
src/main/java/com/bsth/repository/calc/CalcStatisticsRepository.java 0 → 100644
  1 +package com.bsth.repository.calc;
  2 +
  3 +import java.util.List;
  4 +
  5 +import javax.transaction.Transactional;
  6 +
  7 +import com.bsth.entity.calc.CalcStatistics;
  8 +import com.bsth.entity.calc.CalcWaybill;
  9 +import com.bsth.repository.BaseRepository;
  10 +
  11 +import org.springframework.data.jpa.repository.Modifying;
  12 +import org.springframework.data.jpa.repository.Query;
  13 +import org.springframework.stereotype.Repository;
  14 +
  15 +/**
  16 + *
  17 + */
  18 +@Repository
  19 +public interface CalcStatisticsRepository extends BaseRepository<CalcStatistics, Integer>{
  20 +
  21 + //按照时间段统计,公司下线路
  22 + @Query(value="select DISTINCT c from CalcStatistics c where c.xl like %?1% and c.dateStr between ?2 and ?3 and c.gsdm like %?4% and c.fgsdm like %?5% order by c.xl")
  23 + List<CalcStatistics> selectByDateAndLineTj(String line,String date,String date2,String gsdm,String fgsdm);
  24 +
  25 + //按照时间段统计,单条线路
  26 + @Query(value="select DISTINCT c from CalcStatistics c where c.xl = ?1 and c.dateStr between ?2 and ?3 order by c.xl")
  27 + List<CalcStatistics> selectByDateAndLineTj2(String line,String date,String date2);
  28 +
  29 + //按照日期和线路删除数据
  30 + @Modifying
  31 + @Transactional
  32 + @Query(value = "delete CalcStatistics c where c.dateStr=?1 and c.xl=?2")
  33 + void deleteByDateAndLine(String date, String line);
  34 +
  35 + //按照日期删除数据
  36 + @Modifying
  37 + @Transactional
  38 + @Query(value = "delete CalcStatistics c where c.dateStr=?1")
  39 + void deleteByDate(String date);
  40 +
  41 +}
... ...
src/main/java/com/bsth/service/calc/CalcCulateMileageService.java
1 1 package com.bsth.service.calc;
2 2  
3 3 import java.util.List;
  4 +import java.util.Map;
4 5  
5 6 import com.bsth.entity.realcontrol.ScheduleRealInfo;
  7 +import com.bsth.entity.sys.Interval;
6 8  
7 9  
8 10 public interface CalcCulateMileageService {
... ... @@ -25,6 +27,7 @@ public interface CalcCulateMileageService {
25 27 double culateLbgl(List<ScheduleRealInfo> lists);//烂班公里
26 28 double culateCJLC(List<ScheduleRealInfo> lists,String item);//烂班公里详细
27 29 int culateDtfzbc(List<ScheduleRealInfo> lists,String type,String item);//掉头放站班次
  30 + Map<String, Object> culateDjg(List<ScheduleRealInfo> lists,String line, List<Map<String, Object>> xlList, List<Interval> djgList);//大间隔
28 31  
29 32 }
30 33  
... ...
src/main/java/com/bsth/service/calc/CalcToolService.java
1 1 package com.bsth.service.calc;
2 2  
3 3 import java.util.List;
  4 +import java.util.Map;
4 5  
5 6 import com.bsth.entity.calc.CalcWaybill;
  7 +import com.bsth.entity.sys.Interval;
6 8  
7 9 /**
8 10 * Created by 17/11/16.
9 11 */
10 12 public interface CalcToolService {
11 13  
12   - List<CalcWaybill> findAll(String date, String line);
  14 + List<CalcWaybill> findAll(String date, String line, List<Map<String, Object>> xlList, List<Interval> djgList);
13 15  
14 16 }
... ...
src/main/java/com/bsth/service/calc/CalcWaybillService.java
... ... @@ -3,6 +3,7 @@ package com.bsth.service.calc;
3 3 import java.util.List;
4 4 import java.util.Map;
5 5  
  6 +import com.bsth.entity.calc.CalcStatistics;
6 7 import com.bsth.entity.calc.CalcWaybill;
7 8 import com.bsth.service.BaseService;
8 9  
... ... @@ -14,5 +15,12 @@ public interface CalcWaybillService extends BaseService&lt;CalcWaybill, Integer&gt; {
14 15 Map<String, Object> generateNew(String date, String line) throws Exception;
15 16  
16 17 List<Map<String, Object>> statisticsDailyTj(String gsdm,String fgsdm, String line, String date, String date2, String xlName, String type);
  18 +
  19 + /**
  20 + * @param rq 格式如:2018-03-22(留空""默认当前日期前一天)
  21 + * @param line (留空""默认全部线路)
  22 + */
  23 + String calcDaily(String rq, String line) throws Exception;
17 24  
  25 + List<CalcStatistics> calcStatisticsDaily(String gsdm,String fgsdm, String line, String date, String date2, String xlName, String type);
18 26 }
... ...
src/main/java/com/bsth/service/calc/impl/CalcCulateMileageServiceImpl.java
1 1 package com.bsth.service.calc.impl;
2 2  
  3 +import java.text.DecimalFormat;
  4 +import java.text.ParseException;
  5 +import java.text.SimpleDateFormat;
  6 +import java.util.ArrayList;
  7 +import java.util.Collections;
  8 +import java.util.Comparator;
  9 +import java.util.HashMap;
3 10 import java.util.Iterator;
4 11 import java.util.List;
  12 +import java.util.Map;
5 13 import java.util.Set;
6 14  
7 15 import org.apache.commons.lang.StringUtils;
... ... @@ -11,8 +19,10 @@ import org.springframework.stereotype.Service;
11 19  
12 20 import com.bsth.entity.realcontrol.ChildTaskPlan;
13 21 import com.bsth.entity.realcontrol.ScheduleRealInfo;
  22 +import com.bsth.entity.sys.Interval;
14 23 import com.bsth.service.calc.CalcCulateMileageService;
15 24 import com.bsth.util.Arith;
  25 +import com.bsth.util.ComparableChild;
16 26  
17 27 @Service
18 28 public class CalcCulateMileageServiceImpl implements CalcCulateMileageService{
... ... @@ -234,7 +244,7 @@ public class CalcCulateMileageServiceImpl implements CalcCulateMileageService{
234 244 double sjgl =0;
235 245 for (int i = 0; i < lists.size(); i++) {
236 246 ScheduleRealInfo scheduleRealInfo=lists.get(i);
237   -// if(!scheduleRealInfo.isSflj()){
  247 + if(!scheduleRealInfo.isSflj()){
238 248 Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
239 249 if(childTaskPlans.isEmpty()){
240 250 if (scheduleRealInfo.getBcType().equals("in") || scheduleRealInfo.getBcType().equals("out")
... ... @@ -264,7 +274,7 @@ public class CalcCulateMileageServiceImpl implements CalcCulateMileageService{
264 274 }
265 275 }
266 276 }
267   -// }
  277 + }
268 278 }
269 279 return sjgl;
270 280 }
... ... @@ -670,4 +680,196 @@ public class CalcCulateMileageServiceImpl implements CalcCulateMileageService{
670 680 }
671 681 return bc;
672 682 }
  683 +
  684 + public ScheduleRealInfo checkBc(ScheduleRealInfo s){
  685 + //如果班次有子任务 且 子任务中有属于营运的。把该子任务的发车时间设置成班次的发车时间
  686 + String fcsj=s.getFcsjActual()==null?"":s.getFcsjActual();
  687 + if(fcsj.equals("")){
  688 + Set<ChildTaskPlan> childTaskPlans = s.getcTasks();
  689 + if(!childTaskPlans.isEmpty()){
  690 + List<ChildTaskPlan> listit=new ArrayList<ChildTaskPlan>(childTaskPlans);
  691 + Collections.sort(listit, new ComparableChild());
  692 + for (int i = 0; i < listit.size(); i++) {
  693 + ChildTaskPlan c=listit.get(i);
  694 + if(!c.isDestroy()){
  695 + if(c.getMileageType().equals("service")){
  696 + s.setFcsjActual(c.getStartDate());
  697 + break;
  698 + }
  699 +
  700 + }
  701 + }
  702 + }
  703 + }
  704 + return s;
  705 + }
  706 +
  707 + public Map<String, Object> listDjg(int peak,int trough,List<ScheduleRealInfo> listInfo,String grade){
  708 + DecimalFormat df = new DecimalFormat("#0.00");
  709 + Collections.sort(listInfo, new ComparableAcuals());
  710 + List<ScheduleRealInfo> listInfo0=new ArrayList<ScheduleRealInfo>();
  711 + List<ScheduleRealInfo> listInfo1=new ArrayList<ScheduleRealInfo>();
  712 + for (int i = 0; i < listInfo.size(); i++) {
  713 + ScheduleRealInfo s=listInfo.get(i);
  714 + if(s.getXlDir().equals("0")){
  715 + listInfo0.add(s);
  716 + }else{
  717 + listInfo0.add(s);
  718 + }
  719 + }
  720 + Map<String, Object> map=new HashMap<String,Object>();
  721 + int djgcsz=0;
  722 + int djgcsw=0;
  723 + int djgcsq=0;
  724 + long djcsj=0l;
  725 + for (int i = 0; i < listInfo0.size(); i++) {
  726 + ScheduleRealInfo s=listInfo.get(i);
  727 + Long fcsjTime=s.getFcsjActualTime();
  728 + String time=s.getFcsjActual();
  729 + String[] fcsjStr = time.split(":");
  730 + long fcsj= Long.parseLong(fcsjStr[0])*60+Long.parseLong(fcsjStr[1]);
  731 + if(i<listInfo.size()-1){
  732 + Long djg=0l;
  733 + Long fscjNext=listInfo.get(i+1).getFcsjActualTime();
  734 + if((fcsj>=zgf1&&fcsj<=zgf2)){
  735 + djg = (long) (peak*60*1000);
  736 + if(fscjNext-fcsjTime>djg){
  737 + djgcsz ++;
  738 + djgcsq ++;
  739 + if(fscjNext-fcsjTime>djcsj){
  740 + djcsj=(fscjNext-fcsjTime)/60000;
  741 + }
  742 + }
  743 + }else if((fcsj>=wgf1&&fcsj<=wgf2)){
  744 + djg = (long) (peak*60*1000);
  745 + if(fscjNext-fcsjTime>djg){
  746 + djgcsw ++;
  747 + djgcsq ++;
  748 + if(fscjNext-fcsjTime>djcsj){
  749 + djcsj=(fscjNext-fcsjTime)/60000;
  750 + }
  751 + }
  752 + }else{
  753 + djg = (long) (trough*60*1000);
  754 + if(fscjNext-fcsjTime>djg){
  755 + djgcsq ++;
  756 + if(fscjNext-fcsjTime>djcsj){
  757 + djcsj=(fscjNext-fcsjTime)/60000;
  758 + }
  759 + }
  760 + }
  761 + }
  762 + }
  763 + for (int i = 0; i < listInfo1.size(); i++) {
  764 + ScheduleRealInfo s=listInfo.get(i);
  765 + Long fcsjTime=s.getFcsjActualTime();
  766 + String time=s.getFcsjActual();
  767 + String[] fcsjStr = time.split(":");
  768 + long fcsj= Long.parseLong(fcsjStr[0])*60+Long.parseLong(fcsjStr[1]);
  769 + if(i<listInfo.size()-1){
  770 + Long djg=0l;
  771 + Long fscjNext=listInfo.get(i+1).getFcsjActualTime();
  772 + if(fcsj>=zgf1&&fcsj<=zgf2){
  773 + djg = (long) (peak*60*1000);
  774 + if(fscjNext-fcsjTime>djg){
  775 + djgcsz ++;
  776 + djgcsq ++;
  777 + if(fscjNext-fcsjTime>djcsj){
  778 + djcsj=(fscjNext-fcsjTime)/60000;
  779 + }
  780 + }
  781 + }else if(fcsj>=wgf1&&fcsj<=wgf2){
  782 + djg = (long) (peak*60*1000);
  783 + if(fscjNext-fcsjTime>djg){
  784 + djgcsw ++;
  785 + djgcsq ++;
  786 + if(fscjNext-fcsjTime>djcsj){
  787 + djcsj=(fscjNext-fcsjTime)/60000;
  788 + }
  789 + }
  790 + }else{
  791 + djg = (long) (trough*60*1000);
  792 + if(fscjNext-fcsjTime>djg){
  793 + djgcsq ++;
  794 + if(fscjNext-fcsjTime>djcsj){
  795 + djcsj=(fscjNext-fcsjTime)/60000;
  796 + }
  797 + }
  798 + }
  799 + }
  800 + }
  801 +
  802 + map.put("djgcsz", djgcsz);
  803 + map.put("djgcsw", djgcsw);
  804 + map.put("djgcsq", djgcsq);
  805 + map.put("djgsj", djcsj);
  806 + return map;
  807 + }
  808 +
  809 + @Override
  810 + public Map<String, Object> culateDjg(List<ScheduleRealInfo> lists,
  811 + String line, List<Map<String, Object>> xlList, List<Interval> djgList) {
  812 + // TODO Auto-generated method stub
  813 +
  814 +
  815 + // TODO Auto-generated method stub
  816 + List<ScheduleRealInfo> list=lists;
  817 + Map<String, Object> m=new HashMap<String,Object>();
  818 + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm");
  819 +// Collections.sort(listInfo,new ComparableAcuals());
  820 +
  821 + for (int i = 0; i < xlList.size(); i++) {
  822 + String lineCode=xlList.get(i).get("line").toString();
  823 + String grade =xlList.get(i).get("grade")==null?"1":xlList.get(i).get("grade").toString();
  824 + int peak=0;
  825 + int trough=0;
  826 + for (int j = 0; j < djgList.size(); j++) {
  827 + Interval il=djgList.get(j);
  828 + if(il.getLevel().equals(grade)){
  829 + peak=il.getPeak();
  830 + trough=il.getTrough();
  831 + continue;
  832 + }
  833 + }
  834 + List<ScheduleRealInfo> listInfo=new ArrayList<ScheduleRealInfo>();
  835 + for (int j = 0; j < list.size(); j++) {
  836 + ScheduleRealInfo sinfo=list.get(j);
  837 + try {
  838 + if(sinfo.getXlBm().equals(lineCode)){
  839 + ScheduleRealInfo s=checkBc(sinfo);
  840 + String fcsj=s.getFcsjActual()==null?"":s.getFcsjActual();
  841 + if(!fcsj.equals("")){
  842 + Long fcsjAcual = sdf.parse(s.getRealExecDate() + " " + s.getFcsjActual()).getTime();
  843 + s.setFcsjActualTime(fcsjAcual);
  844 + s.setFcsjActual(fcsj);
  845 + listInfo.add(s);
  846 + }
  847 + }
  848 + } catch (ParseException e) {
  849 + // TODO Auto-generated catch block
  850 + e.printStackTrace();
  851 + }
  852 + }
  853 +
  854 + if(listInfo.size()>0){
  855 + m=listDjg(peak,trough,listInfo,grade);
  856 + }else{
  857 + m.put("djgcsz", "0");
  858 + m.put("djgcsw", "0");
  859 + m.put("djgcsq", "0");
  860 + m.put("djgsj", "0");
  861 + }
  862 + }
  863 + return m;
  864 + }
673 865 }
  866 +
  867 +class ComparableAcuals implements Comparator<ScheduleRealInfo>{
  868 +
  869 + @Override
  870 + public int compare(ScheduleRealInfo o1, ScheduleRealInfo o2) {
  871 + // TODO Auto-generated method stub
  872 + return o1.getFcsjActualTime().compareTo(o2.getFcsjActualTime());
  873 + }
  874 +
  875 +}
674 876 \ No newline at end of file
... ...
src/main/java/com/bsth/service/calc/impl/CalcToolServiceImpl.java
... ... @@ -9,9 +9,14 @@ import java.util.List;
9 9 import java.util.Map;
10 10 import java.util.Set;
11 11  
  12 +import javax.swing.text.Keymap;
  13 +
  14 +import com.bsth.entity.calc.CalcInterval;
12 15 import com.bsth.entity.calc.CalcWaybill;
13 16 import com.bsth.entity.realcontrol.ChildTaskPlan;
14 17 import com.bsth.entity.realcontrol.ScheduleRealInfo;
  18 +import com.bsth.entity.sys.Interval;
  19 +import com.bsth.repository.calc.CalcIntervalRepository;
15 20 import com.bsth.repository.calc.CalcWaybillRepository;
16 21 import com.bsth.service.calc.CalcToolService;
17 22 import com.bsth.service.calc.CalcCulateMileageService;
... ... @@ -35,11 +40,11 @@ public class CalcToolServiceImpl implements CalcToolService {
35 40 private CalcWaybillRepository clacRepository;
36 41  
37 42 @Autowired
38   - private CalcCulateMileageService culateMileageService;
  43 + private CalcIntervalRepository culcIntervalRepository;
39 44  
40 45 @Autowired
41   - private CulateMileageService culateMileageService2;
42   -
  46 + private CalcCulateMileageService culateMileageService;
  47 +
43 48 @Autowired
44 49 JdbcTemplate jdbcTemplate;
45 50  
... ... @@ -48,7 +53,7 @@ public class CalcToolServiceImpl implements CalcToolService {
48 53  
49 54  
50 55 @Override
51   - public List<CalcWaybill> findAll(String rq, String lineCode) {
  56 + public List<CalcWaybill> findAll(String rq, String lineCode, List<Map<String, Object>> xlList, List<Interval> djgList) {
52 57 List<CalcWaybill> listCal=new ArrayList<CalcWaybill>();
53 58 List<ScheduleRealInfo> list = clacRepository.findAllSchedule(rq,lineCode);
54 59 String sql ="select r.j_gh ,r.s_gh,r.cl_zbh,r.xl_bm, r.lp_name FROM"
... ... @@ -104,9 +109,30 @@ public class CalcToolServiceImpl implements CalcToolService {
104 109  
105 110 //计算方法
106 111 if(list_.size()>0){
107   - listCal.addAll(this.cul(list_, lists_));
  112 + listCal.addAll(this.cul(list_, lists_, xlList, djgList));
108 113 }
109 114 }
  115 +
  116 + //按线路计算大间隔
  117 + if(list.size() > 0){
  118 + ScheduleRealInfo s = list.get(0);
  119 + Map<String, Object> culateDjg = culateMileageService.culateDjg(list, lineCode, xlList, djgList);
  120 + CalcInterval interval = new CalcInterval();
  121 + interval.setGsdm(s.getGsBm());
  122 + interval.setGsname(s.getGsName());
  123 + interval.setFgsdm(s.getFgsBm());
  124 + interval.setFgsname(s.getFgsName());
  125 + interval.setRq(s.getScheduleDate());
  126 + interval.setRqStr(s.getScheduleDateStr());
  127 + interval.setXl(s.getXlBm());
  128 + interval.setXlName(s.getXlName());
  129 + interval.setDjg(Integer.valueOf(culateDjg.get("djgcsq").toString()));
  130 + interval.setDjgM(Integer.valueOf(culateDjg.get("djgcsz").toString()));
  131 + interval.setDjgA(Integer.valueOf(culateDjg.get("djgcsw").toString()));
  132 + interval.setDjgTime(Integer.valueOf(culateDjg.get("djgsj").toString()));
  133 + culcIntervalRepository.save(interval);
  134 + }
  135 +
110 136 while(true){
111 137 int i = 0, l = 0;
112 138 boolean flag = false;
... ... @@ -145,7 +171,7 @@ public class CalcToolServiceImpl implements CalcToolService {
145 171 }
146 172  
147 173 //list_ 全部班次 lists_执行了的班次(实到实发不为空)
148   - private List<CalcWaybill> cul(List<ScheduleRealInfo> list_,List<ScheduleRealInfo> lists_){
  174 + private List<CalcWaybill> cul(List<ScheduleRealInfo> list_,List<ScheduleRealInfo> list_s, List<Map<String, Object>> xlList, List<Interval> djgList){
149 175 List<CalcWaybill> list=new ArrayList<CalcWaybill>();
150 176 if(list_.size()>0){
151 177 Date date=list_.get(0).getScheduleDate();
... ... @@ -167,20 +193,20 @@ public class CalcToolServiceImpl implements CalcToolService {
167 193 int jhyybcWgf=culateMileageService.culateJhyybc(list_, "wgf");
168 194 double jhyylc=culateMileageService.culateJhyylc(list_);
169 195 double jhfyylc=culateMileageService.culateJhfyylc(list_);
170   - int sjyybc=culateMileageService.culateSjyybc(lists_, "");
171   - int sjyybcZgf=culateMileageService.culateSjyybc(lists_, "zgf");
172   - int sjyybcWgf=culateMileageService.culateSjyybc(lists_, "wgf");
173   - double sjyylc=culateMileageService.culateSjyylc(lists_);//驾售共有
174   - double sjyylc_j=culateMileageService.culateSjyylc_j(lists_);//无售
175   - double sjfyylc=culateMileageService.culateSjfyylc(lists_);//驾售
176   - double sjfyylc_j=culateMileageService.culateSjfyylc_j(lists_);//无售
177   - int ljbc=culateMileageService.culateLjbc(lists_, "");
178   - int ljbcZgf=culateMileageService.culateLjbc(lists_, "zgf");
179   - int ljbcWgf=culateMileageService.culateLjbc(lists_, "wgf");
180   - double ljyylc=culateMileageService.culateLjyylc(lists_);//驾售
181   - double ljyylc_j=culateMileageService.culateLjyylc_j(lists_);//无售
182   - double ljfyylc=culateMileageService.culateLjfyylc(lists_);//驾售
183   - double ljfyylc_j=culateMileageService.culateLjfyylc_j(lists_);//无售
  196 + int sjyybc=culateMileageService.culateSjyybc(list_s, "");
  197 + int sjyybcZgf=culateMileageService.culateSjyybc(list_s, "zgf");
  198 + int sjyybcWgf=culateMileageService.culateSjyybc(list_s, "wgf");
  199 + double sjyylc=culateMileageService.culateSjyylc(list_s);//驾售共有
  200 + double sjyylc_j=culateMileageService.culateSjyylc_j(list_s);//无售
  201 + double sjfyylc=culateMileageService.culateSjfyylc(list_s);//驾售
  202 + double sjfyylc_j=culateMileageService.culateSjfyylc_j(list_s);//无售
  203 + int ljbc=culateMileageService.culateLjbc(list_s, "");
  204 + int ljbcZgf=culateMileageService.culateLjbc(list_s, "zgf");
  205 + int ljbcWgf=culateMileageService.culateLjbc(list_s, "wgf");
  206 + double ljyylc=culateMileageService.culateLjyylc(list_s);//驾售
  207 + double ljyylc_j=culateMileageService.culateLjyylc_j(list_s);//无售
  208 + double ljfyylc=culateMileageService.culateLjfyylc(list_s);//驾售
  209 + double ljfyylc_j=culateMileageService.culateLjfyylc_j(list_s);//无售
184 210 int lbbc=culateMileageService.culateLbbc(list_);
185 211 double lblc=culateMileageService.culateLbgl(list_);
186 212 double ssgl_lz= culateMileageService.culateCJLC(list_, "路阻");
... ... @@ -199,12 +225,12 @@ public class CalcToolServiceImpl implements CalcToolService {
199 225 double ssgl_cj=culateMileageService.culateCJLC(list_, "抽减");
200 226 double ssgl_qt=culateMileageService.culateCJLC(list_, "其他");
201 227 double ssgl_qtz=Arith.add(Arith.add(ssgl_pc, ssgl_by), Arith.add(ssgl_cj,ssgl_qt));
202   - int fzbc=culateMileageService.culateDtfzbc(lists_, "major", "");//放站
203   - int fzbcZgf=culateMileageService.culateDtfzbc(lists_, "major", "zgf");
204   - int fzbcWgf=culateMileageService.culateDtfzbc(lists_, "major", "wgf");
205   - int zfbc=culateMileageService.culateDtfzbc(lists_, "venting", "");//直放
206   - int zfbcZgf=culateMileageService.culateDtfzbc(lists_, "venting", "zgf");
207   - int zfbcWgf=culateMileageService.culateDtfzbc(lists_, "venting", "wgf");
  228 + int fzbc=culateMileageService.culateDtfzbc(list_s, "major", "");//放站
  229 + int fzbcZgf=culateMileageService.culateDtfzbc(list_s, "major", "zgf");
  230 + int fzbcWgf=culateMileageService.culateDtfzbc(list_s, "major", "wgf");
  231 + int zfbc=culateMileageService.culateDtfzbc(list_s, "venting", "");//直放
  232 + int zfbcZgf=culateMileageService.culateDtfzbc(list_s, "venting", "zgf");
  233 + int zfbcWgf=culateMileageService.culateDtfzbc(list_s, "venting", "wgf");
208 234 CalcWaybill t=new CalcWaybill();
209 235 t.setRq(date);
210 236 t.setRqStr(dateStr);
... ...
src/main/java/com/bsth/service/calc/impl/CalcWaybillServiceImpl.java
... ... @@ -2,9 +2,15 @@ package com.bsth.service.calc.impl;
2 2  
3 3 import java.sql.ResultSet;
4 4 import java.sql.SQLException;
  5 +import java.text.SimpleDateFormat;
5 6 import java.util.ArrayList;
  7 +import java.util.Calendar;
  8 +import java.util.Collections;
  9 +import java.util.Comparator;
  10 +import java.util.Date;
6 11 import java.util.HashMap;
7 12 import java.util.HashSet;
  13 +import java.util.Iterator;
8 14 import java.util.List;
9 15 import java.util.Map;
10 16 import java.util.Set;
... ... @@ -12,13 +18,25 @@ import java.util.Set;
12 18 import javax.transaction.Transactional;
13 19  
14 20 import com.bsth.common.ResponseCode;
  21 +import com.bsth.entity.calc.CalcInterval;
  22 +import com.bsth.entity.calc.CalcStatistics;
15 23 import com.bsth.entity.calc.CalcWaybill;
  24 +import com.bsth.entity.realcontrol.ChildTaskPlan;
  25 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  26 +import com.bsth.entity.sys.Interval;
  27 +import com.bsth.repository.calc.CalcIntervalRepository;
  28 +import com.bsth.repository.calc.CalcStatisticsRepository;
16 29 import com.bsth.repository.calc.CalcWaybillRepository;
  30 +import com.bsth.repository.realcontrol.ScheduleRealInfoRepository;
17 31 import com.bsth.service.calc.CalcToolService;
18 32 import com.bsth.service.calc.CalcWaybillService;
19 33 import com.bsth.service.impl.BaseServiceImpl;
  34 +import com.bsth.service.report.CulateMileageService;
20 35 import com.bsth.util.Arith;
21   -import com.bsth.util.BatchSaveUtils;
  36 +import com.bsth.util.ReportUtils;
  37 +import com.github.stuxuhai.jpinyin.PinyinException;
  38 +import com.github.stuxuhai.jpinyin.PinyinFormat;
  39 +import com.github.stuxuhai.jpinyin.PinyinHelper;
22 40  
23 41 import org.slf4j.Logger;
24 42 import org.slf4j.LoggerFactory;
... ... @@ -34,12 +52,24 @@ import org.springframework.stereotype.Service;
34 52 public class CalcWaybillServiceImpl extends BaseServiceImpl<CalcWaybill, Integer> implements CalcWaybillService {
35 53  
36 54 @Autowired
37   - private CalcWaybillRepository clacRepository;
  55 + private CalcWaybillRepository calcRepository;
38 56  
39 57 @Autowired
40   - private CalcToolService calcToolService;
  58 + private CalcIntervalRepository calcIntervalRepository;
41 59  
42 60 @Autowired
  61 + private CalcStatisticsRepository calcStatisticsRepository;
  62 +
  63 + @Autowired
  64 + private CalcToolService calcToolService;
  65 +
  66 + @Autowired
  67 + private CulateMileageService culateService;
  68 +
  69 + @Autowired
  70 + private ScheduleRealInfoRepository scheduleRealInfoRepository;
  71 +
  72 + @Autowired
43 73 JdbcTemplate jdbcTemplate;
44 74  
45 75  
... ... @@ -54,9 +84,11 @@ public class CalcWaybillServiceImpl extends BaseServiceImpl&lt;CalcWaybill, Integer
54 84 try {
55 85  
56 86 if(date.length() != 0 && line.length() != 0){
57   - clacRepository.deleteByDateAndLine(date, line);
  87 + calcRepository.deleteByDateAndLine(date, line);
  88 + calcIntervalRepository.deleteByDateAndLine(date, line);
58 89 } else if(date.length() != 0){
59   - clacRepository.deleteByDate(date);
  90 + calcRepository.deleteByDate(date);
  91 + calcIntervalRepository.deleteByDate(date);
60 92 } else {
61 93 newMap.put("status", ResponseCode.ERROR);
62 94 logger.error("save erro.", "日期不能为空");
... ... @@ -84,21 +116,60 @@ public class CalcWaybillServiceImpl extends BaseServiceImpl&lt;CalcWaybill, Integer
84 116 m.put("start_opt", rs.getString("start_opt"));
85 117 m.put("line_code", rs.getString("line_code"));
86 118 return m;
87   - }});
88   -
  119 + }});
  120 +
  121 + String xlSql="select line_code,spac_grade from bsth_c_line";
  122 + if(line.length() != 0){
  123 + xlSql += " where line_code ='"+line+"'";
  124 + }
  125 + List<Map<String, Object>> xlList=jdbcTemplate.query(xlSql, new RowMapper<Map<String, Object>>() {
  126 + @Override
  127 + public Map<String, Object> mapRow(ResultSet arg0, int arg1) throws SQLException {
  128 + Map<String, Object> map=new HashMap<String,Object>();
  129 + map.put("line",arg0.getString("line_code"));
  130 + map.put("grade", arg0.getString("spac_grade"));
  131 + return map;
  132 + }});
  133 + Map<String, List<Map<String, Object>>> xlMap = new HashMap<String, List<Map<String, Object>>>();
  134 + for(Map<String, Object> m : xlList){
  135 + if(m.containsKey("line") && m.get("line").toString().trim().length() > 0){
  136 + String key = m.get("line").toString();
  137 + if(!xlMap.containsKey(key))
  138 + xlMap.put(key, new ArrayList<Map<String, Object>>());
  139 + xlMap.get(key).add(m);
  140 + }
  141 + }
  142 + //查询大间隔时间
  143 + String djgSql="select * from bsth_c_interval";
  144 + List<Interval> djgList=jdbcTemplate.query(djgSql, new RowMapper<Interval>() {
  145 + @Override
  146 + public Interval mapRow(ResultSet arg0, int arg1) throws SQLException {
  147 + Interval m=new Interval();
  148 + m.setLevel(arg0.getString("level"));
  149 + m.setPeak(arg0.getInt("peak"));
  150 + m.setTrough(arg0.getInt("trough"));
  151 + return m;
  152 + }});
  153 +
89 154 Set<String> lineSet = new HashSet<String>();
90 155 for (int i = 0; i < listLineConfig.size(); i++) {
91 156 Map<String, Object> m =listLineConfig.get(i);
92 157 String lineCode=m.get("line_code").toString().trim();
93   - String startOpt=m.get("start_opt").toString().trim();
  158 +// String startOpt=m.get("start_opt").toString().trim();
94 159 if(!lineSet.add(lineCode))
95 160 continue;
96 161  
97   - List<CalcWaybill> findAll = calcToolService.findAll(date, lineCode);
  162 + List<Map<String, Object>> tempList = new ArrayList<Map<String, Object>>();
  163 + if(xlMap.containsKey(lineCode) && xlMap.get(lineCode) != null){
  164 + tempList = xlMap.get(lineCode);
  165 + }
98 166  
99   -// new BatchSaveUtils<CalcWaybill>().saveList2(findAll, CalcWaybill.class);
  167 + List<CalcWaybill> findAll = calcToolService.findAll(date, lineCode, tempList, djgList);
100 168  
101   - clacRepository.save(findAll);
  169 +// new BatchSaveUtils<CalcWaybill>().saveList2(findAll, CalcWaybill.class);
  170 +
  171 +// if(xlMap.get(lineCode).size() == 0)
  172 + calcRepository.save(findAll);
102 173 }
103 174  
104 175 newMap.put("status", ResponseCode.SUCCESS);
... ... @@ -116,28 +187,41 @@ public class CalcWaybillServiceImpl extends BaseServiceImpl&lt;CalcWaybill, Integer
116 187 public List<Map<String, Object>> statisticsDailyTj(String gsdm,
117 188 String fgsdm, String line, String date, String date2,
118 189 String xlName, String type) {
119   -
  190 +
  191 + List<String> keyList = new ArrayList<String>();
120 192 List<CalcWaybill> list = new ArrayList<CalcWaybill>();
121 193 List<CalcWaybill> lists = new ArrayList<CalcWaybill>();
  194 + List<CalcInterval> list_ = new ArrayList<CalcInterval>();
122 195 List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
123 196 Map<String, List<CalcWaybill>> keyMap = new HashMap<String, List<CalcWaybill>>();
  197 + Map<String, List<CalcInterval>> keyMap_ = new HashMap<String, List<CalcInterval>>();
124 198  
125 199 if(line.equals("")){
126 200 //查询所有线路
127   - list = clacRepository.scheduleByDateAndLineTj(line,date,date2,gsdm,fgsdm);
  201 + list = calcRepository.scheduleByDateAndLineTj(line,date,date2,gsdm,fgsdm);
  202 + list_ = calcIntervalRepository.selectByDateAndLine(line, date, date2, gsdm, fgsdm);
128 203 }else{
129 204 //查询单条线路
130   - list = clacRepository.scheduleByDateAndLineTj2(line,date,date2);
  205 + list = calcRepository.scheduleByDateAndLineTj2(line,date,date2);
  206 + list_ = calcIntervalRepository.selectByDateAndLine(line, date, date2);
131 207 }
132 208  
133 209 for(CalcWaybill c : list){
134 210 String key = c.getXlName();
135 211 if(!keyMap.containsKey(key)){
136 212 keyMap.put(key, new ArrayList<CalcWaybill>());
  213 + keyList.add(key);
137 214 }
138 215 keyMap.get(key).add(c);
139 216 }
140   - for(String key : keyMap.keySet()){
  217 + for(CalcInterval c : list_){
  218 + String key = c.getXlName();
  219 + if(!keyMap_.containsKey(key))
  220 + keyMap_.put(key, new ArrayList<CalcInterval>());
  221 + keyMap_.get(key).add(c);
  222 + }
  223 + Collections.sort(keyList, new AccountXlbmStr());
  224 + for(String key : keyList){
141 225 CalcWaybill calc = keyMap.get(key).get(0);
142 226 for(int i = 1; i < keyMap.get(key).size(); i++){
143 227 CalcWaybill c= keyMap.get(key).get(i);
... ... @@ -171,15 +255,32 @@ public class CalcWaybillServiceImpl extends BaseServiceImpl&lt;CalcWaybill, Integer
171 255 calc.setFzbc(calc.getFzbc() + c.getFzbc());
172 256 calc.setFzbczgf(calc.getFzbczgf() + c.getFzbczgf());
173 257 calc.setFzbcwgf(calc.getFzbcwgf() + c.getFzbcwgf());
174   - calc.setDtbc(calc.getDtbc() + c.getFzbc());
  258 + calc.setDtbc(calc.getDtbc() + c.getDtbc());
175 259 calc.setDtbczgf(calc.getDtbczgf() + c.getDtbczgf());
176 260 calc.setDtbcwgf(calc.getDtbcwgf() + c.getDtbcwgf());
177   -
178 261 }
179 262 calc.setSjyylc(Arith.add(calc.getSjyylc(), calc.getLjyylc()));
180   - System.out.println();
181 263 lists.add(calc);
182 264 }
  265 + CalcInterval sum_ = new CalcInterval();
  266 + sum_.setXlName("合计");
  267 + sum_.setDjgTime(0);
  268 + for(String key : keyMap_.keySet()){
  269 + CalcInterval calc = keyMap_.get(key).get(0);
  270 + for(int i = 1; i < keyMap_.get(key).size(); i++){
  271 + CalcInterval calc_ = keyMap_.get(key).get(i);
  272 + calc.setDjg(calc.getDjg() + calc_.getDjg());
  273 + calc.setDjgM(calc.getDjgM() + calc_.getDjgM());
  274 + calc.setDjgA(calc.getDjgA() + calc_.getDjgA());
  275 + if(calc_.getDjgTime() > calc.getDjgTime())
  276 + calc.setDjgTime(calc_.getDjgTime());
  277 + }
  278 + sum_.setDjg(sum_.getDjg() + calc.getDjg());
  279 + sum_.setDjgM(sum_.getDjgM() + calc.getDjgM());
  280 + sum_.setDjgA(sum_.getDjgA() + calc.getDjgA());
  281 + if(calc.getDjgTime() > sum_.getDjgTime())
  282 + sum_.setDjgTime(calc.getDjgTime());
  283 + }
183 284  
184 285 CalcWaybill sum = new CalcWaybill();
185 286 sum.setXlName("合计");
... ... @@ -187,7 +288,9 @@ public class CalcWaybillServiceImpl extends BaseServiceImpl&lt;CalcWaybill, Integer
187 288 sum.setJhyylc(Arith.add(sum.getJhyylc()!=null?sum.getJhyylc():0, c.getJhyylc()));
188 289 sum.setJhfyylc(Arith.add(sum.getJhfyylc()!=null?sum.getJhfyylc():0, c.getJhfyylc()));
189 290 sum.setSjyylc(Arith.add(sum.getSjyylc()!=null?sum.getSjyylc():0, c.getSjyylc()));
  291 + sum.setLjyylc(Arith.add(sum.getLjyylc()!=null?sum.getLjyylc():0, c.getLjyylc()));
190 292 sum.setSjfyylc(Arith.add(sum.getSjfyylc()!=null?sum.getSjfyylc():0, c.getSjfyylc()));
  293 + sum.setLjfyylc(Arith.add(sum.getLjfyylc()!=null?sum.getLjfyylc():0, c.getLjfyylc()));
191 294 sum.setLblc(Arith.add(sum.getLblc()!=null?sum.getLblc():0, c.getLblc()));
192 295 sum.setLbbc(sum.getLbbc() + c.getLbbc());
193 296 sum.setLblcLz(Arith.add(sum.getLblcLz()!=null?sum.getLblcLz():0, c.getLblcLz()));
... ... @@ -214,7 +317,7 @@ public class CalcWaybillServiceImpl extends BaseServiceImpl&lt;CalcWaybill, Integer
214 317 sum.setFzbc(sum.getFzbc() + c.getFzbc());
215 318 sum.setFzbczgf(sum.getFzbczgf() + c.getFzbczgf());
216 319 sum.setFzbcwgf(sum.getFzbcwgf() + c.getFzbcwgf());
217   - sum.setDtbc(sum.getDtbc() + c.getFzbc());
  320 + sum.setDtbc(sum.getDtbc() + c.getDtbc());
218 321 sum.setDtbczgf(sum.getDtbczgf() + c.getDtbczgf());
219 322 sum.setDtbcwgf(sum.getDtbcwgf() + c.getDtbcwgf());
220 323 }
... ... @@ -228,9 +331,9 @@ public class CalcWaybillServiceImpl extends BaseServiceImpl&lt;CalcWaybill, Integer
228 331 m.put("jhzlc", Arith.add(c.getJhyylc(), c.getJhfyylc()));
229 332 m.put("jhlc", c.getJhyylc());
230 333 m.put("jcclc", c.getJhfyylc());
231   - m.put("sjzgl", Arith.add(c.getSjyylc(), c.getSjfyylc()));
232   - m.put("sjgl", c.getSjyylc());
233   - m.put("sjksgl", c.getSjfyylc());
  334 + m.put("sjzgl", Arith.add(Arith.add(c.getSjyylc(), c.getLjyylc()), Arith.add(c.getSjfyylc(), c.getLjfyylc())));
  335 + m.put("sjgl", Arith.add(c.getSjyylc(), c.getLjyylc()));
  336 + m.put("sjksgl", Arith.add(c.getSjfyylc(), c.getLjfyylc()));
234 337 m.put("ssgl", c.getLblc());
235 338 m.put("ssbc", c.getLbbc());
236 339 m.put("ssgl_lz", c.getLblcLz());
... ... @@ -260,14 +363,350 @@ public class CalcWaybillServiceImpl extends BaseServiceImpl&lt;CalcWaybill, Integer
260 363 m.put("dtbc", c.getDtbc());
261 364 m.put("dtbc_m", c.getDtbczgf());
262 365 m.put("dtbc_a", c.getDtbcwgf());
263   - m.put("djg", 0);
264   - m.put("djg_m", 0);
265   - m.put("djg_a", 0);
266   - m.put("djg_time", 0);
  366 + if(keyMap_.containsKey(c.getXlName()) || c.getXlName().equals("合计")){
  367 + CalcInterval calc;
  368 + if(c.getXlName().equals("合计"))
  369 + calc = sum_;
  370 + else
  371 + calc = keyMap_.get(c.getXlName()).get(0);
  372 + m.put("djg", calc.getDjg());
  373 + m.put("djg_m", calc.getDjgM());
  374 + m.put("djg_a", calc.getDjgA());
  375 + m.put("djg_time", calc.getDjgTime());
  376 + } else {
  377 + m.put("djg", 0);
  378 + m.put("djg_m", 0);
  379 + m.put("djg_a", 0);
  380 + m.put("djg_time", 0);
  381 + }
267 382 resList.add(m);
268 383 }
269 384  
270 385 return resList;
271 386 }
272 387  
  388 + /**
  389 + * @param rq 格式如:2018-03-22(留空""默认当前日期前一天)
  390 + * @param line (留空""默认全部线路)
  391 + */
  392 + @Transactional
  393 + @Override
  394 + public String calcDaily(String rq, String line) throws Exception{
  395 + String result = "";
  396 + try {
  397 + if(rq == null || rq.trim().length() == 0){
  398 + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  399 + Date dNow = new Date(); //当前时间
  400 + Date dBefore = new Date();
  401 + Calendar calendar = Calendar.getInstance(); //得到日历
  402 + calendar.setTime(dNow);//把当前时间赋给日历
  403 + calendar.add(Calendar.DAY_OF_MONTH, -1); //设置为前一天
  404 + dBefore = calendar.getTime(); //得到前一天的时间
  405 + rq = sdf.format(dBefore);
  406 + } else {
  407 + rq = rq.trim();
  408 + }
  409 + if(line == null || line.trim().length() == 0){
  410 + line = "";
  411 + } else {
  412 + line = line.trim();
  413 + }
  414 +
  415 + List<ScheduleRealInfo> list = new ArrayList<ScheduleRealInfo>();
  416 + List<ScheduleRealInfo> list_s = new ArrayList<ScheduleRealInfo>();
  417 + List<ScheduleRealInfo> lists = new ArrayList<ScheduleRealInfo>();
  418 +
  419 + String xlSql="select gs_bm, fgs_bm from bsth_c_s_sp_info_real where schedule_date_str = '"+rq+"'";
  420 + if(line.trim().length() > 0)
  421 + xlSql += " and xl_bm = '"+line+"'";
  422 + xlSql += " group by gs_bm, fgs_bm";
  423 + List<Map<String, String>> gsList=jdbcTemplate.query(xlSql, new RowMapper<Map<String, String>>() {
  424 + @Override
  425 + public Map<String, String> mapRow(ResultSet arg0, int arg1) throws SQLException {
  426 + Map<String, String> m = new HashMap<String, String>();
  427 + m.put("gsdm", arg0.getString("gs_bm"));
  428 + m.put("fgsdm", arg0.getString("fgs_bm"));
  429 + return m;
  430 + }});
  431 +
  432 + //查询所有线路
  433 + for(Map<String, String> m : gsList){
  434 + list.addAll(scheduleRealInfoRepository.scheduleByDateAndLineTj(line, rq, rq, m.get("gsdm"), m.get("fgsdm")));
  435 + }
  436 +
  437 + for (int i = 0; i < list.size(); i++) {
  438 + ScheduleRealInfo s=list.get(i);
  439 + Set<ChildTaskPlan> cts = s.getcTasks();
  440 + if(cts != null && cts.size() > 0){
  441 + list_s.add(s);
  442 + }else{
  443 + if(s.getZdsjActual()!=null && s.getFcsjActual()!=null){
  444 + list_s.add(s);
  445 + }
  446 + }
  447 + }
  448 + List<CalcStatistics> lMap = new ArrayList<CalcStatistics>();
  449 + for (int i = 0; i < list.size(); i++) {
  450 + if(i<list.size()-1){
  451 + if(list.get(i+1).getXlBm().equals(list.get(i).getXlBm())){
  452 + lists.add(list.get(i));
  453 + }else{
  454 + lists.add(list.get(i));
  455 + CalcStatistics s=staticTj(lists);
  456 + lMap.add(s);
  457 + lists=new ArrayList<ScheduleRealInfo>();
  458 + }
  459 + }else{
  460 + if(list.get(i).getXlBm().equals(list.get(i-1).getXlBm())){
  461 + lists.add(list.get(i));
  462 + CalcStatistics s=staticTj(lists);
  463 + lMap.add(s);
  464 + }else{
  465 + lists=new ArrayList<ScheduleRealInfo>();
  466 + lists.add(list.get(i));
  467 + CalcStatistics s=staticTj(lists);
  468 + lMap.add(s);
  469 + }
  470 + }
  471 + }
  472 +// Collections.sort(lMap,new AccountXlbm());
  473 +
  474 + if(line.trim().length() > 0){
  475 + calcStatisticsRepository.deleteByDateAndLine(rq, line);
  476 + } else {
  477 + calcStatisticsRepository.deleteByDate(rq);
  478 + }
  479 + calcStatisticsRepository.save(lMap);
  480 + result = "success";
  481 + } catch (Exception e) {
  482 + // TODO: handle exception
  483 + throw e;
  484 + }finally{
  485 + logger.info("result:"+result);
  486 + }
  487 + return result;
  488 + }
  489 +
  490 + public final CalcStatistics staticTj(List<ScheduleRealInfo> list){
  491 +
  492 + List<ScheduleRealInfo> lists=new ArrayList<ScheduleRealInfo>();
  493 + for(int i=0;i<list.size();i++){
  494 + ScheduleRealInfo s=list.get(i);
  495 + Set<ChildTaskPlan> cts = s.getcTasks();
  496 + if(cts != null && cts.size() > 0){
  497 + lists.add(s);
  498 + }else{
  499 + if(s.getZdsjActual()!=null&& s.getFcsjActual()!=null){
  500 + lists.add(s);
  501 + }
  502 + }
  503 + }
  504 +// Map<String, Object> map = new HashMap<String, Object>();
  505 + CalcStatistics s = new CalcStatistics();
  506 + if(list.size() > 0){
  507 + ScheduleRealInfo sche = list.get(0);
  508 + s.setXl(sche.getXlBm());
  509 + s.setXlName(sche.getXlName());
  510 + s.setDate(sche.getScheduleDate());
  511 + s.setDateStr(sche.getScheduleDateStr());
  512 + s.setGsdm(sche.getGsBm());
  513 + s.setFgsdm(sche.getFgsBm());
  514 +
  515 + double jhyygl=culateService.culateJhgl(list);//计划营运公里
  516 + double jhjcclc= culateService.culateJhJccgl(list);//计划进出场公里(计划空驶公里)
  517 + s.setJhyylc(jhyygl);
  518 + s.setJhkslc(jhjcclc);
  519 + s.setJhzlc(Arith.add(jhyygl, jhjcclc));
  520 +
  521 + double ljgl= culateService.culateLjgl(lists);
  522 + double sjyygl= culateService.culateSjgl(lists);
  523 + double zyygl= Arith.add(sjyygl,ljgl);
  524 +
  525 + double sjjccgl=culateService.culateJccgl(lists);
  526 + double sjksgl=culateService.culateKsgl(lists);
  527 + double zksgl=Arith.add(sjjccgl, sjksgl);
  528 + s.setSjyylc(zyygl);
  529 + s.setSjkslc(zksgl);
  530 + s.setSjzlc(Arith.add(zyygl, zksgl));
  531 +
  532 + s.setSslc(culateService.culateLbgl(list));
  533 + s.setSsbc(culateService.culateLbbc(list));
  534 +
  535 + //计划+临加-少驶=实驶
  536 +// double jl=Arith.sub(Arith.add(jhyygl, ljgl),ssgl);
  537 +// if(jl==zyygl){
  538 +// map.put("zt", 0);
  539 +// }else{
  540 +// map.put("zt", 1);
  541 +// }
  542 +
  543 + s.setLzlc(culateService.culateCJLC(list, "路阻"));
  544 + s.setDmlc(culateService.culateCJLC(list, "吊慢"));
  545 + s.setGzlc(culateService.culateCJLC(list, "故障"));
  546 + s.setJflc(culateService.culateCJLC(list, "纠纷"));
  547 + s.setZslc(culateService.culateCJLC(list, "肇事"));
  548 + s.setQrlc(culateService.culateCJLC(list, "缺人"));
  549 + s.setQclc(culateService.culateCJLC(list, "缺车"));
  550 + s.setKxlc(culateService.culateCJLC(list, "客稀"));
  551 + s.setQhlc(culateService.culateCJLC(list, "气候"));
  552 + s.setYwlc(culateService.culateCJLC(list, "援外"));
  553 + double ssgl_pc=culateService.culateCJLC(list, "配车");
  554 + double ssgl_by=culateService.culateCJLC(list, "保养");
  555 + double ssgl_cj=culateService.culateCJLC(list, "抽减");
  556 + double ssgl_qt=culateService.culateCJLC(list, "其他");
  557 + s.setQtlc(Arith.add(Arith.add(ssgl_pc, ssgl_by),Arith.add(ssgl_cj, ssgl_qt)));
  558 + s.setLjlc(ljgl);
  559 +
  560 + s.setJhbcq(culateService.culateJhbc(list,""));
  561 + s.setJhbcz(culateService.culateJhbc(list, "zgf"));
  562 + s.setJhbcw(culateService.culateJhbc(list, "wgf"));
  563 + s.setSjbcq(culateService.culateSjbc(lists,""));
  564 + s.setSjbcz(culateService.culateSjbc(lists,"zgf"));
  565 + s.setSjbcw(culateService.culateSjbc(lists,"wgf"));
  566 + s.setLjbcq(culateService.culateLjbc(lists,""));
  567 + s.setLjbcz(culateService.culateLjbc(lists,"zgf"));
  568 + s.setLjbcw(culateService.culateLjbc(lists,"wgf"));
  569 + s.setFzbcq(culateService.culateFzbc(lists, ""));
  570 + s.setFzbcz(culateService.culateFzbc(lists, "zgf"));
  571 + s.setFzbcw(culateService.culateFzbc(lists, "wgf"));
  572 + s.setDtbcq(0);
  573 + s.setDtbcz(0);
  574 + s.setDtbcw(0);
  575 + Map<String, Object> m_=culateService.culateDjg(lists, list.get(0).getXlBm());
  576 + if(m_.containsKey("djgcsq") && m_.get("djgcsq")!=null)
  577 + s.setDjgq(Integer.valueOf(m_.get("djgcsq").toString()));
  578 + else
  579 + s.setDjgq(0);
  580 + if(m_.containsKey("djgcsz") && m_.get("djgcsz")!=null)
  581 + s.setDjgz(Integer.valueOf(m_.get("djgcsz").toString()));
  582 + else
  583 + s.setDjgz(0);
  584 + if(m_.containsKey("djgcsw") && m_.get("djgcsw")!=null)
  585 + s.setDjgw(Integer.valueOf(m_.get("djgcsw").toString()));
  586 + else
  587 + s.setDjgw(0);
  588 + if(m_.containsKey("djgsj") && m_.get("djgsj")!=null)
  589 + s.setDjgsj(Integer.valueOf(m_.get("djgsj").toString()));
  590 + else
  591 + s.setDjgsj(0);
  592 + }
  593 + return s;
  594 + }
  595 +
  596 + class AccountXlbm implements Comparator<Map<String, Object>>{
  597 + @Override
  598 + public int compare(Map<String, Object> o1, Map<String, Object> o2) {
  599 + // TODO Auto-generated method stub
  600 +// PinyinHelper.convertToPinyinString(ppy.getName(),
  601 +// "" , PinyinFormat.WITHOUT_TONE)
  602 + return o1.get("xlNamePy").toString().compareTo(
  603 + o2.get("xlNamePy").toString());
  604 + }
  605 + }
  606 +
  607 + class AccountXlbmStr implements Comparator<String>{
  608 + @Override
  609 + public int compare(String o1, String o2) {
  610 + // TODO Auto-generated method stub
  611 + return o1.compareTo(o2);
  612 + }
  613 + }
  614 +
  615 + @Override
  616 + public List<CalcStatistics> calcStatisticsDaily(String gsdm, String fgsdm,
  617 + String line, String date, String date2, String xlName, String type) {
  618 + // TODO Auto-generated method stub
  619 + List<CalcStatistics> list = new ArrayList<CalcStatistics>();
  620 + if(line.length() > 0){
  621 + list = calcStatisticsRepository.selectByDateAndLineTj2(line, date, date2);
  622 + } else {
  623 + list = calcStatisticsRepository.selectByDateAndLineTj(line, date, date2, gsdm, fgsdm);
  624 + }
  625 +
  626 + List<CalcStatistics> resList = new ArrayList<CalcStatistics>();
  627 + Map<String, List<CalcStatistics>> keyMap = new HashMap<String, List<CalcStatistics>>();
  628 + List<String> keyList = new ArrayList<String>();
  629 +
  630 + for(CalcStatistics s : list){
  631 + try {
  632 + String key = PinyinHelper.convertToPinyinString(s.getXlName(), "" , PinyinFormat.WITHOUT_TONE);
  633 + if(!keyMap.containsKey(key)){
  634 + keyMap.put(key, new ArrayList<CalcStatistics>());
  635 + keyList.add(key);
  636 + }
  637 + keyMap.get(key).add(s);
  638 + } catch (PinyinException e) {
  639 + // TODO Auto-generated catch block
  640 + e.printStackTrace();
  641 + }
  642 + }
  643 + Collections.sort(keyList, new AccountXlbmStr());
  644 +
  645 + for(String key : keyList){
  646 + if(keyMap.get(key).size() > 0){
  647 + CalcStatistics s = keyMap.get(key).get(0);
  648 + if(keyMap.get(key).size() > 1)
  649 + for(int i = 1; i < keyMap.get(key).size(); i++){
  650 + CalcStatistics s_ = keyMap.get(key).get(i);
  651 + s = addStatistics(s, s_);
  652 + }
  653 + resList.add(s);
  654 + }
  655 + }
  656 +
  657 + if(resList.size() > 0){
  658 + CalcStatistics temp = new CalcStatistics();
  659 + temp.setXlName("合计");
  660 + for(CalcStatistics s : resList){
  661 + temp = addStatistics(temp, s);
  662 + }
  663 + resList.add(temp);
  664 + }
  665 +
  666 + return resList;
  667 + }
  668 +
  669 + public CalcStatistics addStatistics(CalcStatistics s, CalcStatistics s_){
  670 + s.setJhzlc(Arith.add(s.getJhzlc()!=null?s.getJhzlc():0, s_.getJhzlc()));
  671 + s.setJhyylc(Arith.add(s.getJhyylc()!=null?s.getJhyylc():0, s_.getJhyylc()));
  672 + s.setJhkslc(Arith.add(s.getJhkslc()!=null?s.getJhkslc():0, s_.getJhkslc()));
  673 + s.setSjzlc(Arith.add(s.getSjzlc()!=null?s.getSjzlc():0, s_.getSjzlc()));
  674 + s.setSjyylc(Arith.add(s.getSjyylc()!=null?s.getSjyylc():0, s_.getSjyylc()));
  675 + s.setSjkslc(Arith.add(s.getSjkslc()!=null?s.getSjkslc():0, s_.getSjkslc()));
  676 + s.setSslc(Arith.add(s.getSslc()!=null?s.getSslc():0, s_.getSslc()));
  677 + s.setSsbc(s.getSsbc() + s_.getSsbc());
  678 + s.setLzlc(Arith.add(s.getLzlc()!=null?s.getLzlc():0, s_.getLzlc()));
  679 + s.setDmlc(Arith.add(s.getDmlc()!=null?s.getDmlc():0, s_.getDmlc()));
  680 + s.setGzlc(Arith.add(s.getGzlc()!=null?s.getGzlc():0, s_.getGzlc()));
  681 + s.setJflc(Arith.add(s.getJflc()!=null?s.getJflc():0, s_.getJflc()));
  682 + s.setZslc(Arith.add(s.getZslc()!=null?s.getZslc():0, s_.getZslc()));
  683 + s.setQrlc(Arith.add(s.getQrlc()!=null?s.getQrlc():0, s_.getQrlc()));
  684 + s.setQclc(Arith.add(s.getQclc()!=null?s.getQclc():0, s_.getQclc()));
  685 + s.setKxlc(Arith.add(s.getKxlc()!=null?s.getKxlc():0, s_.getKxlc()));
  686 + s.setQhlc(Arith.add(s.getQhlc()!=null?s.getQhlc():0, s_.getQhlc()));
  687 + s.setYwlc(Arith.add(s.getYwlc()!=null?s.getYwlc():0, s_.getYwlc()));
  688 + s.setQtlc(Arith.add(s.getQtlc()!=null?s.getQtlc():0, s_.getQtlc()));
  689 + s.setLjlc(Arith.add(s.getLjlc()!=null?s.getLjlc():0, s_.getLjlc()));
  690 + s.setJhbcq(s.getJhbcq() + s_.getJhbcq());
  691 + s.setJhbcz(s.getJhbcz() + s_.getJhbcz());
  692 + s.setJhbcw(s.getJhbcw() + s_.getJhbcw());
  693 + s.setSjbcq(s.getSjbcq() + s_.getSjbcq());
  694 + s.setSjbcz(s.getSjbcz() + s_.getSjbcz());
  695 + s.setSjbcw(s.getSjbcw() + s_.getSjbcw());
  696 + s.setLjbcq(s.getLjbcq() + s_.getLjbcq());
  697 + s.setLjbcz(s.getLjbcz() + s_.getLjbcz());
  698 + s.setLjbcw(s.getLjbcw() + s_.getLjbcw());
  699 + s.setFzbcq(s.getFzbcq() + s_.getFzbcq());
  700 + s.setFzbcz(s.getFzbcz() + s_.getFzbcz());
  701 + s.setFzbcw(s.getFzbcw() + s_.getFzbcw());
  702 + s.setDtbcq(s.getDtbcq() + s_.getDtbcq());
  703 + s.setDtbcz(s.getDtbcz() + s_.getDtbcz());
  704 + s.setDtbcw(s.getDtbcw() + s_.getDtbcw());
  705 + s.setDjgq(s.getDjgq() + s_.getDjgq());
  706 + s.setDjgz(s.getDjgz() + s_.getDjgz());
  707 + s.setDjgw(s.getDjgw() + s_.getDjgw());
  708 + s.setDjgsj(s.getDjgsj()>s_.getDjgsj()?s.getDjgsj():s_.getDjgsj());
  709 + return s;
  710 + }
  711 +
273 712 }
... ...
src/main/java/com/bsth/service/impl/StationRouteServiceImpl.java
... ... @@ -1005,8 +1005,10 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1005 1005 /** 获取路段路由信息 @pararm:<lineId:线路ID;directions:方向> */
1006 1006 List<Object[]> sobje = routeRepository.sectionRouteVector(lineId,directions);
1007 1007 if(sobje.size()==1) {
1008   - int dsleepStr = sobje.get(0)[2] == null || sobje.get(0)[2].equals("") ? 60 : Integer.valueOf(sobje.get(0)[2].toString());
1009   - sleepStr = "\t" + String.valueOf(dsleepStr);
  1008 +// int dsleepStr = sobje.get(0)[2] == null || sobje.get(0)[2].equals("") ? 60 : Integer.valueOf(sobje.get(0)[2].toString());
  1009 +// sleepStr = "\t" + String.valueOf(dsleepStr);
  1010 + double dsleepStrt = sobje.get(0)[2] == null ? 60d : Double.valueOf(sobje.get(0)[2].toString());
  1011 + sleepStr = "\t" + new DecimalFormat("0").format(dsleepStrt);
1010 1012 }else if(sobje.size()>1){
1011 1013 for(int j =0;j<sobje.size();j++) {
1012 1014 double dsleepStrt = sobje.get(j)[2] == null || sobje.get(j)[2].equals("") ? 60d : Double.valueOf(sobje.get(j)[2].toString());
... ...
src/main/java/com/bsth/service/report/impl/ReportServiceImpl.java
... ... @@ -324,37 +324,24 @@ public class ReportServiceImpl implements ReportService{
324 324 }
325 325 return list;
326 326 }
  327 +
327 328 @Override
328 329 public Map<String, Object> tbodyTime1(String line, String ttinfo) {
329 330 DecimalFormat df = new DecimalFormat("#0.00");
  331 + Map<String, Object> map=new HashMap<String,Object>();
330 332 // TODO Auto-generated method stub
  333 +
331 334 //查询配车
332   - String sqlPc=" select count(*) from bsth_c_cars where id in("
333   - + " select cl from bsth_c_s_ccinfo where xl in ( "
334   - + " select id from bsth_c_line where line_code='"+line+"' )"
335   - + " group by equipment_code ) ";
336   -
337   - Map<String, Object> map=new HashMap<String,Object>();
338   -
339   - /*List<Map<String, Object>> listPc= jdbcTemplate.query(sqlPc,
340   - new RowMapper<Map<String, Object>>(){
341   - @Override
342   - public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
343   - Map<String, Object> m=new HashMap<String,Object>();
344   - m.put("zbh", rs.getString("cl_zbh"));
345   - return m;
346   - }
347   - });*/
  335 + String sqlPc=" select count(*) from (select lp, count(*) from"
  336 + + " bsth_c_s_ttinfo_detail where ttinfo ='"+ttinfo+"'"
  337 + + " group by lp ) a";
348 338 //配车
349 339 int pcs=jdbcTemplate.queryForObject(sqlPc, Integer.class);
350 340  
  341 +
351 342 String sqlPlan=" SELECT jhlc,bc_type,fcsj FROM bsth_c_s_ttinfo_detail "
352 343 +" where ttinfo ='"+ttinfo+"' ";
353 344  
354   - //班次
355   - int zgf_0 = 6*60+31,zgf_1 = 8*60+30,wgf_0 = 16*60+1,wgf_1 = 18*60;
356   - int qcBc=0,qjBc=0,zqcBc=0,zqjBc=0,wqcBc=0,wqjBc=0;
357   - double zlc = 0 , yylc = 0,kslc=0;
358 345 //查询班次
359 346 List<Map<String, Object>> listPlan= jdbcTemplate.query(sqlPlan,
360 347 new RowMapper<Map<String, Object>>(){
... ... @@ -368,6 +355,11 @@ public class ReportServiceImpl implements ReportService{
368 355 }
369 356 });
370 357  
  358 + //班次
  359 + int zgf_0 = 6*60+31,zgf_1 = 8*60+30,wgf_0 = 16*60+1,wgf_1 = 18*60;
  360 + int qcBc=0,qjBc=0,zqcBc=0,zqjBc=0,wqcBc=0,wqjBc=0;
  361 + double zlc = 0 , yylc = 0,kslc=0;
  362 +
371 363 for (int i = 0; i < listPlan.size(); i++) {
372 364 Map<String, Object> m=listPlan.get(i);
373 365 double jhlc=Double.parseDouble(m.get("jhlc").toString());
... ... @@ -423,21 +415,23 @@ public class ReportServiceImpl implements ReportService{
423 415 String minfcsj="02:00";
424 416 List<Line> lineList=lineRepository.findLineByCode(line);
425 417 if(lineList.size()>0){
426   - String sqlMinYysj="select start_opt from bsth_c_line_config where "
427   - + " id = ("
428   - + "select max(id) from bsth_c_line_config where line ='"+lineList.get(0).getId() +"'"
429   - + ")";
430   - minfcsj=jdbcTemplate.queryForObject(sqlMinYysj, String.class);
  418 + String sql = "select count(*) from bsth_c_line_config where line = '"+lineList.get(0).getId()+"'";
  419 + if(jdbcTemplate.queryForObject(sql, Integer.class) > 0){
  420 + String sqlMinYysj="select start_opt from bsth_c_line_config where "
  421 + + " id = ("
  422 + + "select max(id) from bsth_c_line_config where line ='"+lineList.get(0).getId() +"'"
  423 + + ")";
  424 + minfcsj=jdbcTemplate.queryForObject(sqlMinYysj, String.class);
  425 + }
431 426 }
432 427 String[] minSjs = minfcsj.split(":");
433 428 int minSj=Integer.parseInt(minSjs[0])*60+Integer.parseInt(minSjs[1]);
434 429 //查询时间里程
435   - String sqlPc=" (SELECT jhlc,fcsj,bc_type,lp,2 as xh, ists FROM bsth_c_s_ttinfo_detail "
  430 + String sqlPc=" (SELECT jhlc,fcsj,bc_type,bcsj,lp,2 as xh, ists FROM bsth_c_s_ttinfo_detail "
436 431 + " where ttinfo ='"+ttinfo+"' and fcsj <='"+minfcsj+"' ) "
437 432 + " union "
438   - + " (SELECT jhlc,fcsj,bc_type,lp,1 as xh, ists FROM bsth_c_s_ttinfo_detail "
439   - + " where ttinfo ='"+ttinfo+"' and fcsj > '"+minfcsj+"') order by lp,xh,fcsj";
440   -
  433 + + " (SELECT jhlc,fcsj,bc_type,bcsj,lp,1 as xh, ists FROM bsth_c_s_ttinfo_detail "
  434 + + " where ttinfo ='"+ttinfo+"' and fcsj > '"+minfcsj+"' ) order by lp,xh,fcsj";
441 435 Map<String, Object> map=new HashMap<String,Object>();
442 436 List<Map<String, Object>> list= jdbcTemplate.query(sqlPc,
443 437 new RowMapper<Map<String, Object>>(){
... ... @@ -447,26 +441,31 @@ public class ReportServiceImpl implements ReportService{
447 441 m.put("fcsj", rs.getString("fcsj"));
448 442 m.put("yygl", rs.getString("jhlc")==null?"0":rs.getString("jhlc"));
449 443 m.put("bcType", rs.getString("bc_type"));
  444 + m.put("bcsj", rs.getString("bcsj"));
450 445 m.put("lp", rs.getString("lp"));
451 446 m.put("ists", rs.getObject("ists")==null?"0":rs.getString("ists"));
452 447 return m;
453 448 }
454 449 });
455   - int yysj=0 ;
  450 +
  451 + int yysj=0;
456 452 double yycs=0 ,yygl=0;
457 453 String lp ="0";
458   - int sj=0;
459   -
  454 + int sj=0, bcsj = 0;
  455 + int temp = 0;
460 456 for(int i=0;i<list.size();i++){
461 457 Map<String, Object> m=list.get(i);
462 458 String time=m.get("fcsj").toString();
463 459 String[] times = time.split(":");
  460 + int sjT = Integer.parseInt(times[0])*60+Integer.parseInt(times[1]);
464 461 if(lp.equals(m.get("lp").toString())){
465   - if(Integer.parseInt(times[0])*60+Integer.parseInt(times[1]) <=minSj){
  462 + if(sjT <= minSj){
466 463 if(m.get("bcType").equals("in") || m.get("bcType").equals("out")){
467 464 if(m.get("bcType").equals("in")){
468 465 if(sj!=0){
469   - yysj +=(Integer.parseInt(times[0])+24)*60+Integer.parseInt(times[1])-sj;
  466 +// yysj += sjT + (24*60) - sj;
  467 + yysj += bcsj;
  468 + bcsj = 0;
470 469 }
471 470 sj=0;
472 471 }
... ... @@ -474,45 +473,62 @@ public class ReportServiceImpl implements ReportService{
474 473 yygl += Double.parseDouble(m.get("yygl").toString());
475 474  
476 475 if(sj==0){
477   - sj=(Integer.parseInt(times[0])+24)*60+Integer.parseInt(times[1]);
  476 + sj = sjT + (24*60);
478 477 }else{
479   - yysj +=(Integer.parseInt(times[0])+24)*60+Integer.parseInt(times[1])-sj;
480   - sj=(Integer.parseInt(times[0])+24)*60+Integer.parseInt(times[1]);
  478 + yysj += sjT + (24*60) - sj;
  479 + if(m.containsKey("ists") && m.get("ists").equals("1")){
  480 + yysj += Integer.valueOf(m.get("bcsj").toString());
  481 + } else {
  482 + sj = sjT + (24*60);
  483 + }
481 484 }
482 485 }
483 486 }else{
484 487 if(m.get("bcType").equals("in") || m.get("bcType").equals("out")){
485 488 if(m.get("bcType").equals("in")){
486 489 if(sj!=0){
487   - yysj +=Integer.parseInt(times[0])*60+Integer.parseInt(times[1])-sj;
  490 +// yysj += sjT - sj;
  491 + yysj += bcsj;
  492 + bcsj = 0;
488 493 }
489 494 sj=0;
490 495 }
491   - }else{
  496 + } else {
492 497 yygl += Double.parseDouble(m.get("yygl").toString());
493 498  
494 499 if(sj==0){
495   - sj=Integer.parseInt(times[0])*60+Integer.parseInt(times[1]);
  500 + sj = sjT;
496 501 }else{
497   - yysj +=Integer.parseInt(times[0])*60+Integer.parseInt(times[1])-sj;
498   - sj=Integer.parseInt(times[0])*60+Integer.parseInt(times[1]);
  502 + yysj += sjT - sj;
  503 + if(m.containsKey("ists") && m.get("ists").equals("1")){
  504 + yysj += Integer.valueOf(m.get("bcsj").toString());
  505 + } else {
  506 + sj = sjT;
  507 + }
499 508 }
500 509 }
501 510 }
502 511 }else{
  512 + if(sj == 0){
  513 + yysj += bcsj;
  514 + bcsj = 0;
  515 + }
503 516 if( !(m.get("bcType").equals("in") || m.get("bcType").equals("out"))){
504 517 yygl += Double.parseDouble(m.get("yygl").toString());
505   - sj =Integer.parseInt(times[0])*60+Integer.parseInt(times[1]);
  518 + sj = sjT;
506 519 }else{
507 520 sj=0;
508 521 }
509 522 lp=m.get("lp").toString();
510   -
511 523 }
  524 +
512 525 if(m.containsKey("ists") && m.get("ists").equals("1")){
513 526 sj = 0;
514 527 }
  528 + if( !(m.get("bcType").equals("in") || m.get("bcType").equals("out")))
  529 + bcsj = Integer.valueOf(m.get("bcsj").toString());
515 530 }
  531 +
516 532 if(yysj>0){
517 533 yycs =yygl/(yysj*1.0/60);
518 534 }
... ... @@ -522,6 +538,7 @@ public class ReportServiceImpl implements ReportService{
522 538 map.put("yysj", hh+":"+mm);
523 539 map.put("yycs", df.format(yycs)+"公里/小时");
524 540 // map.put(key, value)
  541 +
525 542 return map;
526 543 }
527 544  
... ... @@ -529,126 +546,15 @@ public class ReportServiceImpl implements ReportService{
529 546 System.out.println(609360/60);
530 547 System.out.println(609360%60);
531 548 }
532   - /* @Override
533   - public List<Map<String, Object>> tbodyTime3(String line, String ttinfo) {
534   - // TODO Auto-generated method stub
535   - List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();
536   -
537   -
538   -
539   - String sqlZd="select a.qdz_name,COUNT(a.cl_zbh) as cls,'zqc' AS lx from ("
540   - + " select cl_zbh,qdz_name from bsth_c_s_sp_info where tt_info ='"+ttinfo+"' "
541   - + " and bc_type ='normal'"
542   - + " and ((fcsj >'06:31' and fcsj<'08:30') or ( fcsj>'6:31' and fcsj<'8:30'))"
543   - + " group by cl_zbh,qdz_name) a group by a.qdz_name"
544   - + " union "
545   - + " select a.qdz_name,COUNT(a.cl_zbh) as cls,'wqc' AS lx from ("
546   - + " select cl_zbh,qdz_name from bsth_c_s_sp_info where tt_info ='"+ttinfo+"'"
547   - + " and bc_type ='normal' "
548   - + " and fcsj >'16:01' and fcsj<'18:00' group by cl_zbh,qdz_name "
549   - + " ) a group by a.qdz_name "
550   - + " union "
551   - + " select a.qdz_name,COUNT(a.cl_zbh) as cls,'zqj' AS lx from ("
552   - + " select cl_zbh,qdz_name from bsth_c_s_sp_info where tt_info ='"+ttinfo+"'"
553   - + " and bc_type ='region' "
554   - + " and ((fcsj >'06:31' and fcsj<'08:30') or ( fcsj>'6:31' and fcsj<'8:30'))"
555   - + " group by cl_zbh,qdz_name) a group by a.qdz_name"
556   - + " union "
557   - + " select a.qdz_name,COUNT(a.cl_zbh) as cls,'wqj' AS lx from ("
558   - + " select cl_zbh,qdz_name from bsth_c_s_sp_info where tt_info ='"+ttinfo+"'"
559   - + " and bc_type ='region' and fcsj >'16:01' and fcsj<'18:00'"
560   - + " group by cl_zbh,qdz_name) a group by a.qdz_name";
561   - List<Map<String, Object>> lists= jdbcTemplate.query(sqlZd,
562   - new RowMapper<Map<String, Object>>(){
563   - @Override
564   - public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
565   - Map<String, Object> m=new HashMap<String,Object>();
566   - m.put("zdm", rs.getString("qdz_name"));
567   - m.put("cls", rs.getString("cls"));
568   - m.put("lx", rs.getString("lx"));
569   - return m;
570   - }
571   - });
572   - int a=0;
573   - int b=0;
574   - int c=0;
575   - int d=0;
576   - for(int i=0;i<lists.size();i++){
577   - boolean fage=true;
578   - Map<String, Object> newMap= new HashMap<String, Object>();
579   - list.add(newMap);
580   - Map<String, Object> maps=lists.get(i);
581   - if(maps.get("lx").equals("zqc")){
582   - list.get(a).put("zqcZm", maps.get("zdm"));
583   - list.get(a).put("zqcCls", maps.get("cls"));
584   - a++;
585   - fage=false;
586   - }else if(maps.get("lx").equals("wqc")){
587   - list.get(b).put("wqcZm", maps.get("zdm"));
588   - list.get(b).put("wqcCls", maps.get("cls"));
589   - b++;
590   - fage=false;
591   - }else if(maps.get("lx").equals("zqj")){
592   - list.get(c).put("zqjZm", maps.get("zdm"));
593   - list.get(c).put("zqjCls", maps.get("cls"));
594   - c++;
595   - fage=false;
596   - }else if(maps.get("lx").equals("wqj")){
597   - list.get(d).put("wqjZm", maps.get("zdm"));
598   - list.get(d).put("wqjCls", maps.get("cls"));
599   - d++;
600   - fage=false;
601   - }
602   - if(fage){
603   - break;
604   - }
605   - }
606   - boolean status=true;
607   - while (status) {
608   - for (int i = 0; i < list.size(); i++) {
609   - if(list.get(i).isEmpty()){
610   - list.remove(i);
611   - status=true;
612   - }else{
613   - status=false;
614   - }
615   - }
616   -
617   - }
618   - return list;
619   - }*/
  549 +
620 550 @Override
621 551 public List<Map<String, Object>> tbodyTime3(String line, String ttinfo) {
622 552 // TODO Auto-generated method stub
623 553 List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();
624 554 List<Map<String, Object>> list_s=new ArrayList<Map<String,Object>>();
625 555  
626   -
627   - /*String sqlZd="select a.qdz_name,COUNT(a.cl_zbh) as cls,'zqc' AS lx from ("
628   - + " select cl_zbh,qdz_name from bsth_c_s_sp_info where tt_info ='"+ttinfo+"' "
629   - + " and bc_type ='normal'"
630   - + " and ((fcsj >'06:31' and fcsj<'08:30') or ( fcsj>'6:31' and fcsj<'8:30'))"
631   - + " group by cl_zbh,qdz_name) a group by a.qdz_name"
632   - + " union "
633   - + " select a.qdz_name,COUNT(a.cl_zbh) as cls,'wqc' AS lx from ("
634   - + " select cl_zbh,qdz_name from bsth_c_s_sp_info where tt_info ='"+ttinfo+"'"
635   - + " and bc_type ='normal' "
636   - + " and fcsj >'16:01' and fcsj<'18:00' group by cl_zbh,qdz_name "
637   - + " ) a group by a.qdz_name "
638   - + " union "
639   - + " select a.qdz_name,COUNT(a.cl_zbh) as cls,'zqj' AS lx from ("
640   - + " select cl_zbh,qdz_name from bsth_c_s_sp_info where tt_info ='"+ttinfo+"'"
641   - + " and bc_type ='region' "
642   - + " and ((fcsj >'06:31' and fcsj<'08:30') or ( fcsj>'6:31' and fcsj<'8:30'))"
643   - + " group by cl_zbh,qdz_name) a group by a.qdz_name"
644   - + " union "
645   - + " select a.qdz_name,COUNT(a.cl_zbh) as cls,'wqj' AS lx from ("
646   - + " select cl_zbh,qdz_name from bsth_c_s_sp_info where tt_info ='"+ttinfo+"'"
647   - + " and bc_type ='region' and fcsj >'16:01' and fcsj<'18:00'"
648   - + " group by cl_zbh,qdz_name) a group by a.qdz_name";*/
649   -
650   - String sqlCl="SELECT cl_zbh,qdz_name,bc_type,fcsj,bcsj FROM"
651   - + " bsth_c_s_sp_info WHERE tt_info = '"+ttinfo+"' "
  556 + String sqlCl="SELECT lp cl_zbh,qdz_name,bc_type,fcsj,bcsj FROM"
  557 + + " bsth_c_s_ttinfo_detail WHERE ttinfo = '"+ttinfo+"' "
652 558 + " AND (bc_type = 'normal' or bc_type='region') order by qdz_name";
653 559  
654 560 List<Map<String, Object>> listj= jdbcTemplate.query(sqlCl,
... ... @@ -665,7 +571,7 @@ public class ReportServiceImpl implements ReportService{
665 571 }
666 572 });
667 573  
668   - String sqlZd="select qdz_name ,bc_type from bsth_c_s_sp_info WHERE tt_info = '"+ttinfo+"' "
  574 + String sqlZd="select qdz_name,bc_type from bsth_c_s_ttinfo_detail WHERE ttinfo = '"+ttinfo+"' "
669 575 + " AND (bc_type = 'normal' or bc_type='region') group by qdz_name ,bc_type "
670 576 + " order by qdz_name";
671 577 List<Map<String, Object>> lists= jdbcTemplate.query(sqlZd,
... ... @@ -807,6 +713,8 @@ public class ReportServiceImpl implements ReportService{
807 713 }
808 714 boolean status=true;
809 715 while (status) {
  716 + if(list.size() == 0)
  717 + break;
810 718 for (int i = 0; i < list.size(); i++) {
811 719 if(list.get(i).isEmpty()){
812 720 list.remove(i);
... ... @@ -815,8 +723,8 @@ public class ReportServiceImpl implements ReportService{
815 723 status=false;
816 724 }
817 725 }
818   -
819 726 }
  727 +
820 728 return list;
821 729 }
822 730  
... ... @@ -828,11 +736,14 @@ public class ReportServiceImpl implements ReportService{
828 736 String minfcsj="02:00";
829 737 List<Line> lineList=lineRepository.findLineByCode(line);
830 738 if(lineList.size()>0){
831   - String sqlMinYysj="select start_opt from bsth_c_line_config where "
832   - + " id = ("
833   - + "select max(id) from bsth_c_line_config where line ='"+lineList.get(0).getId() +"'"
834   - + ")";
835   - minfcsj=jdbcTemplate.queryForObject(sqlMinYysj, String.class);
  739 + String sql = "select count(*) from bsth_c_line_config where line = '"+lineList.get(0).getId()+"'";
  740 + if(jdbcTemplate.queryForObject(sql, Integer.class) > 0){
  741 + String sqlMinYysj="select start_opt from bsth_c_line_config where "
  742 + + " id = ("
  743 + + "select max(id) from bsth_c_line_config where line ='"+lineList.get(0).getId() +"'"
  744 + + ")";
  745 + minfcsj=jdbcTemplate.queryForObject(sqlMinYysj, String.class);
  746 + }
836 747 }
837 748  
838 749 //查询全程
... ... @@ -917,11 +828,14 @@ public class ReportServiceImpl implements ReportService{
917 828 String minfcsj="02:00";
918 829 List<Line> lineList=lineRepository.findLineByCode(line);
919 830 if(lineList.size()>0){
920   - String sqlMinYysj="select start_opt from bsth_c_line_config where "
921   - + " id = ("
922   - + "select max(id) from bsth_c_line_config where line ='"+lineList.get(0).getId() +"'"
923   - + ")";
924   - minfcsj= jdbcTemplate.queryForObject(sqlMinYysj, String.class);
  831 + String sql = "select count(*) from bsth_c_line_config where line = '"+lineList.get(0).getId()+"'";
  832 + if(jdbcTemplate.queryForObject(sql, Integer.class) > 0){
  833 + String sqlMinYysj="select start_opt from bsth_c_line_config where "
  834 + + " id = ("
  835 + + "select max(id) from bsth_c_line_config where line ='"+lineList.get(0).getId() +"'"
  836 + + ")";
  837 + minfcsj= jdbcTemplate.queryForObject(sqlMinYysj, String.class);
  838 + }
925 839 }
926 840 String[] minSjs = minfcsj.split(":");
927 841 int minSj=Integer.parseInt(minSjs[0])*60+Integer.parseInt(minSjs[1]);
... ...
src/main/java/com/bsth/service/schedule/TTInfoDetailService.java
... ... @@ -4,6 +4,7 @@ import com.bsth.entity.schedule.TTInfoDetail;
4 4 import com.bsth.service.schedule.datatools.TTInfoDetailForEdit;
5 5 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData;
6 6 import com.bsth.service.schedule.exception.ScheduleException;
  7 +import com.bsth.service.schedule.timetable.ExcelFormatType;
7 8 import com.bsth.service.schedule.utils.DataToolsFile;
8 9  
9 10 import java.util.List;
... ... @@ -45,13 +46,15 @@ public interface TTInfoDetailService extends BService&lt;TTInfoDetail, Long&gt; {
45 46 * @param sheetname sheet名字
46 47 * @param lineid 线路id
47 48 * @param lineversion 线路版本
  49 + * @param excelFormatType 版本
48 50 */
49 51 void validateExcelSheet(
50 52 String filename,
51 53 String sheetname,
52 54 Integer lineid,
53 55 String linename,
54   - Integer lineversion) throws ScheduleException;
  56 + Integer lineversion,
  57 + ExcelFormatType excelFormatType) throws ScheduleException;
55 58  
56 59 /**
57 60 * 验证关联的线路标准信息(以后放到规则引擎里去做)。
... ...
src/main/java/com/bsth/service/schedule/datatools/TTInfoDetailDataToolsImpl.java
1 1 package com.bsth.service.schedule.datatools;
2 2  
3   -import com.bsth.entity.Station;
4   -import com.bsth.service.StationService;
  3 +import com.bsth.entity.StationRoute;
  4 +import com.bsth.service.StationRouteService;
5 5 import com.bsth.service.schedule.exception.ScheduleException;
  6 +import com.bsth.service.schedule.timetable.ExcelFormatType;
6 7 import com.bsth.service.schedule.utils.*;
7 8 import jxl.Sheet;
8 9 import jxl.Workbook;
... ... @@ -14,10 +15,13 @@ import org.apache.poi.ss.usermodel.Cell;
14 15 import org.apache.poi.ss.usermodel.Row;
15 16 import org.apache.poi.ss.util.CellRangeAddress;
16 17 import org.apache.poi.ss.util.WorkbookUtil;
  18 +import org.apache.poi.xssf.usermodel.XSSFCell;
17 19 import org.apache.poi.xssf.usermodel.XSSFRow;
18 20 import org.apache.poi.xssf.usermodel.XSSFSheet;
19 21 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
20 22 import org.joda.time.DateTime;
  23 +import org.joda.time.LocalTime;
  24 +import org.joda.time.format.DateTimeFormat;
21 25 import org.slf4j.Logger;
22 26 import org.slf4j.LoggerFactory;
23 27 import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -42,9 +46,8 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
42 46 /** 日志记录器 */
43 47 private final static Logger LOGGER = LoggerFactory.getLogger(TTInfoDetailDataToolsImpl.class);
44 48  
45   - // TODO:之后改了
46 49 @Autowired
47   - private StationService stationService;
  50 + private StationRouteService stationRouteService;
48 51  
49 52 @Autowired
50 53 @Qualifier(value = "dataToolsServiceImpl")
... ... @@ -98,7 +101,8 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
98 101 Integer lineid = Integer.valueOf(String.valueOf(params.get("lineinfo"))); // 线路标准id
99 102 String xlname = String.valueOf(params.get("xlname")); // 线路名字
100 103 String ttname = String.valueOf(params.get("ttname")); // 时刻表名字
101   - Integer lineversion = Integer.valueOf(params.get("lineversion").toString());
  104 + Integer lineversion = Integer.valueOf(params.get("lineversion").toString()); // 线路路由版本
  105 + ExcelFormatType excelFormatType = ExcelFormatType.getEnum(String.valueOf(params.get("excelFormatType"))); // 格式
102 106  
103 107 LOGGER.info("参数1, xls文件名={},sheet名字={}", filename, sheetname);
104 108 LOGGER.info("参数2, 线路id={},线路名字={}", xlid, xlname);
... ... @@ -175,6 +179,10 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
175 179 // 实际数据ktr
176 180 File ktrFile2_version = new File(this.getClass().getResource(
177 181 dataToolsProperties.getTtinfodetailDatainputktr2version()).toURI());
  182 + // 实际数据ktr2
  183 + File ktrFile2_version2 = new File(this.getClass().getResource(
  184 + dataToolsProperties.getTtinfodetailDatainputktr2version2()).toURI());
  185 +
178 186  
179 187 // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径
180 188 ktrParms.put("transpath", mktrFile.getAbsolutePath());
... ... @@ -182,7 +190,14 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
182 190 ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());
183 191  
184 192 // 附加参数
185   - ktrParms.put("injectktrfile", ktrFile2_version.getAbsolutePath()); // 注入元数据的ktr文件
  193 + if (excelFormatType == ExcelFormatType.Normal) {
  194 + ktrParms.put("injectktrfile", ktrFile2_version.getAbsolutePath()); // 注入元数据的ktr文件
  195 + } else if (excelFormatType == ExcelFormatType.Dynamic) {
  196 + ktrParms.put("injectktrfile", ktrFile2_version2.getAbsolutePath()); // 注入元数据的ktr文件
  197 + } else {
  198 + throw new ScheduleException("未知ExcelFormatType");
  199 + }
  200 +
186 201 ktrParms.put("sheetname", sheetname); // sheet工作区的名字
187 202 ktrParms.put("lineinfoid", lineid); // 线路标准id
188 203 ktrParms.put("xlname", xlname); // 线路名称
... ... @@ -441,8 +456,8 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
441 456  
442 457 // 构造表头
443 458 PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short)0, "路牌", new Color(0x96b9d7));
444   - Station station1 = stationService.findById(lpObjList.get(0).getStationRouteId1());
445   - Station station2 = stationService.findById(lpObjList.get(1).getStationRouteId2());
  459 + StationRoute station1 = stationRouteService.findById(lpObjList.get(0).getStationRouteId1());
  460 + StationRoute station2 = stationRouteService.findById(lpObjList.get(1).getStationRouteId2());
446 461 for (int i = 0; i < groupCount; i++) {
447 462 PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (i * 2 + 1),
448 463 station1.getStationName(), new Color(0x96b9d7));
... ... @@ -553,8 +568,8 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
553 568  
554 569 // 构造表头,添加一个进场,添加一个出场
555 570 PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short)0, "路牌", new Color(0x96b9d7));
556   - Station station1 = stationService.findById(lpObjList.get(0).getStationRouteId1());
557   - Station station2 = stationService.findById(lpObjList.get(1).getStationRouteId2());
  571 + StationRoute station1 = stationRouteService.findById(lpObjList.get(0).getStationRouteId1());
  572 + StationRoute station2 = stationRouteService.findById(lpObjList.get(1).getStationRouteId2());
558 573 PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (1),
559 574 "报到", new Color(0x96b9d7));
560 575 PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (2),
... ... @@ -565,8 +580,12 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
565 580 PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (i * 2 + 2),
566 581 station2.getStationName(), new Color(0x96b9d7));
567 582 }
  583 +
  584 + // 最后一个进场需要变成三个班次
  585 + // 1个分班进场班次插入到前面的班次
  586 + // 后面添加两个班次,1个到场班次,1个离场班次
568 587 PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 3),
569   - "场", new Color(0x96b9d7));
  588 + "场", new Color(0x96b9d7));
570 589 PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 4),
571 590 "离场", new Color(0x96b9d7));
572 591  
... ... @@ -589,56 +608,74 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
589 608 LpObj lpObj = lpObjList.get(i);
590 609 XSSFRow lpRow = sheet.createRow((short) (i + 1));
591 610 PoiUtils.createStringXSSFCell(wb, lpRow, (short) 0, lpObj.getLpname());
592   - PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (1));
593   - PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (2));
594   - for (int j = 1; j <= groupCount; j++) {
595   - PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (j * 2 + 1));
596   - PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (j * 2 + 2));
597   - }
598 611  
599   - PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (groupCount * 2 + 3));
600   - PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (groupCount * 2 + 4));
  612 + // 创建空白单元格,并设置字符串格式
  613 + XSSFCell xssfCell = null;
601 614  
602   - for (BcObj bcObj : lpObj.getBcObjList()) {
603   - if (bcObj.getBcType() == BcType.NORMAL) {
604   - Cell cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
605   - cell.setCellValue(bcObj.getFcsj());
  615 + xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (1));
  616 + PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
606 617  
607   - } else if (bcObj.getBcType() == BcType.BD) {
608   - if (bcObj.getGroupNo() == -1) {
609   - Cell cell = lpRow.getCell((short) 1);
610   - cell.setCellValue(bcObj.getFcsj());
611   - } else if (bcObj.getGroupNo() > 0) { // 分班报到
612   - Cell cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
613   - cell.setCellValue("报" + bcObj.getFcsj());
  618 + xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (2));
  619 + PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
614 620  
615   - }
616   -
617   - } else if (bcObj.getBcType() == BcType.OUT) {
618   - if (bcObj.getGroupNo() == -1) {
619   - Cell cell = lpRow.getCell((short) (2));
620   - cell.setCellValue(bcObj.getFcsj());
621   - } else if (bcObj.getGroupNo() > 0) { // 分班出场
622   - Cell cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
623   - cell.setCellValue("出" + bcObj.getFcsj());
624   - }
  621 + for (int j = 1; j <= groupCount; j++) {
  622 + xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (j * 2 + 1));
  623 + PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
  624 + xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (j * 2 + 2));
  625 + PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
  626 + }
625 627  
626   - } else if (bcObj.getBcType() == BcType.IN) {
627   - if (bcObj.getGroupNo() == -2) {
628   - Cell cell = lpRow.getCell((short) (groupCount * 2 + 3));
  628 + xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (groupCount * 2 + 3));
  629 + PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
  630 + xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (groupCount * 2 + 4));
  631 + PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
  632 +
  633 + for (int j = 0; j < lpObj.getBcObjList().size(); j++) {
  634 + BcObj bcObj = lpObj.getBcObjList().get(j); // 当前班次
  635 + Cell cell = null; // 待处理的单元格
  636 +
  637 + switch (bcObj.getBcType()) {
  638 + case BD: // 报到班次
  639 + if (bcObj.getIsFb()) { // 分班-两个车次链
  640 + cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
  641 + cell.setCellValue("报" + bcObj.getFcsj());
  642 + } else { // 一个车次链
  643 + cell = lpRow.getCell((short) 1);
  644 + cell.setCellValue(bcObj.getFcsj());
  645 + }
  646 + break;
  647 + case OUT: // 出场班次
  648 + if (bcObj.getIsFb()) { // 分班-两个车次链
  649 + cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
  650 + cell.setCellValue("出" + bcObj.getFcsj());
  651 + } else { // 一个车次链
  652 + cell = lpRow.getCell((short) (2));
  653 + cell.setCellValue(bcObj.getFcsj());
  654 + }
  655 + break;
  656 + case NORMAL: // 正常班次
  657 + cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
629 658 cell.setCellValue(bcObj.getFcsj());
630   - } else if (bcObj.getGroupNo() > 0) { //分班进场
631   - Cell cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
632   - // 停驶用 ※
633   - cell.setCellValue(bcObj.getFcsj() + "X");
634   - }
635   -
636   - } else if (bcObj.getBcType() == BcType.LC) {
637   - if (bcObj.getGroupNo() == -2) {
638   - Cell cell = lpRow.getCell((short) (groupCount * 2 + 4));
  659 + break;
  660 + case IN: // 进场班次
  661 + if (bcObj.getIsFb()) { // 分班-两个车次链
  662 + cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
  663 + // TODO:停驶用 ※
  664 + cell.setCellValue(bcObj.getFcsj() + "X");
  665 + } else { // 一个车次链
  666 + cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
  667 + cell.setCellValue(bcObj.getFcsj() + "X");
  668 + }
  669 + break;
  670 + case LC:
  671 + // 这个是到场,准备离场班次
  672 + cell = lpRow.getCell((short) (groupCount * 2 + 3));
639 673 cell.setCellValue(bcObj.getFcsj());
640   - }
641   -
  674 + // 加10分钟表示真正离场时间
  675 + cell = lpRow.getCell((short) (groupCount * 2 + 4));
  676 + LocalTime localTime = LocalTime.parse(bcObj.getFcsj(), DateTimeFormat.forPattern("HH:mm"));
  677 + cell.setCellValue(localTime.plusMinutes(10).toString(DateTimeFormat.forPattern("HH:mm")));
  678 + break;
642 679 }
643 680 }
644 681  
... ... @@ -647,9 +684,9 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
647 684 PoiUtils.createDoubleXSSFCell(wb, lpRow, (short) (groupCount * 2 + 6), lpObj.getYylc());
648 685 PoiUtils.createDoubleXSSFCell(wb, lpRow, (short) (groupCount * 2 + 7), lpObj.getKslc());
649 686 PoiUtils.createStringXSSFCell(wb, lpRow, (short) (groupCount * 2 + 8),
650   - String.format("%d小时%d分钟", (int) (lpObj.getZgs() / 60), (int) (lpObj.getZgs() % 60)));
  687 + String.format("%d%s%d", (int) (lpObj.getZgs() / 60), ":", (int) (lpObj.getZgs() % 60)));
651 688 PoiUtils.createStringXSSFCell(wb, lpRow, (short) (groupCount * 2 + 9),
652   - String.format("%d小时%d分钟", (int) (lpObj.getYygs() / 60), (int) (lpObj.getYygs() % 60)));
  689 + String.format("%d%s%d", (int) (lpObj.getYygs() / 60), ":", (int) (lpObj.getYygs() % 60)));
653 690 PoiUtils.createIntegerXSSFCell(wb, lpRow, (short) (groupCount * 2 + 10), lpObj.getYybc());
654 691  
655 692 }
... ...
src/main/java/com/bsth/service/schedule/datatools/TTinfoDetailDynamicData.java
... ... @@ -54,6 +54,9 @@ public interface TTinfoDetailDynamicData {
54 54 /** 是否上行 */
55 55 private Boolean isUp;
56 56  
  57 + /** 是否分班 */
  58 + private Boolean isFb;
  59 +
57 60 /** 班次类型 */
58 61 private BcType bcType;
59 62 /** 发车时刻 */
... ... @@ -154,14 +157,6 @@ public interface TTinfoDetailDynamicData {
154 157 this.groupBcNo = groupBcNo;
155 158 }
156 159  
157   - public Boolean getUp() {
158   - return isUp;
159   - }
160   -
161   - public void setUp(Boolean up) {
162   - isUp = up;
163   - }
164   -
165 160 public String getFcsjDesc() {
166 161 return fcsjDesc;
167 162 }
... ... @@ -169,6 +164,14 @@ public interface TTinfoDetailDynamicData {
169 164 public void setFcsjDesc(String fcsjDesc) {
170 165 this.fcsjDesc = fcsjDesc;
171 166 }
  167 +
  168 + public Boolean getIsFb() {
  169 + return isFb;
  170 + }
  171 +
  172 + public void setIsFb(Boolean fb) {
  173 + isFb = fb;
  174 + }
172 175 }
173 176  
174 177 public static class LpObj { // 路牌对象
... ... @@ -314,6 +317,7 @@ public interface TTinfoDetailDynamicData {
314 317 public void setYybc(Integer yybc) {
315 318 this.yybc = yybc;
316 319 }
  320 +
317 321 }
318 322  
319 323 public static class StatInfo { // 统计数据对象
... ...
src/main/java/com/bsth/service/schedule/impl/PeopleCarPlanServiceImpl.java
... ... @@ -565,7 +565,10 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
565 565 }
566 566 try {
567 567  
568   - String sql = "select * from bsth_c_s_sp_info_real where schedule_date_str >= '"+startDate+"' and schedule_date_str <= '"+endDate+"'";
  568 + String sql = "select schedule_date_str,xl_name,bc_type,gs_name,fgs_name,bcs,fcno,"
  569 + +"fcsj,fcsj_actual,zdsj,zdsj_actual,bcsj,qdz_name,sp_id,cc_service"
  570 + +" from bsth_c_s_sp_info_real where schedule_date_str >= '"+startDate
  571 + +"' and schedule_date_str <= '"+endDate+"'";
569 572 if(line.length() != 0){
570 573 sql += " and xl_bm = '"+line+"'";
571 574 }
... ... @@ -636,8 +639,8 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
636 639  
637 640 if(model.length() != 0){
638 641 // sql = "select * from bsth_c_s_ttinfo_detail where ttinfo = '"+model+"' and bc_type != 'in' and bc_type != 'out'";
639   - sql = "select id from bsth_c_s_sp_info where tt_info = '" + model + "' and bc_type != 'in' and bc_type != 'out'" +
640   - " and bc_type != 'ldks' and schedule_date >= '"+startDate+"' and schedule_date <= '"+endDate+"'";
  642 + sql = "select id from bsth_c_s_sp_info where tt_info = '" + model + "' and bc_type != 'in' and bc_type != 'out'"
  643 + + " and bc_type != 'ldks' and schedule_date >= '"+startDate+"' and schedule_date <= '"+endDate+"'";
641 644 if(line.length() != 0){
642 645 sql += " and xl_bm = '"+line+"'";
643 646 }
... ... @@ -656,21 +659,21 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
656 659 e.printStackTrace();
657 660 }
658 661  
  662 + Set<Long> ttSet = new HashSet<Long>();
  663 + for(Long tt : ttList){
  664 + ttSet.add(tt);
  665 + }
659 666 //分组计算 同时判断是否所选时刻信息
660 667 for(ScheduleRealInfo schedule : list){
661 668 if(schedule.isCcService()){
662 669 continue;
663 670 }
664   - DO:{
665 671 if(model.length() != 0){
666   - for(Long tt : ttList){
667   - if((long)tt == (long)schedule.getSpId()){
668   - String key = schedule.getXlName()+"/"+schedule.getQdzName()+"/"+schedule.getFcsj();
669   - if(!keyMap.containsKey(key))
670   - keyMap.put(key, new ArrayList<ScheduleRealInfo>());
671   - keyMap.get(key).add(schedule);
672   - break DO;
673   - }
  672 + if(ttSet.contains(schedule.getSpId())){
  673 + String key = schedule.getXlName()+"/"+schedule.getQdzName()+"/"+schedule.getFcsj();
  674 + if(!keyMap.containsKey(key))
  675 + keyMap.put(key, new ArrayList<ScheduleRealInfo>());
  676 + keyMap.get(key).add(schedule);
674 677 }
675 678 } else {
676 679 String key = schedule.getXlName()+"/"+schedule.getQdzName()+"/"+schedule.getFcsj();
... ... @@ -678,7 +681,6 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
678 681 keyMap.put(key, new ArrayList<ScheduleRealInfo>());
679 682 keyMap.get(key).add(schedule);
680 683 }
681   - }
682 684 }
683 685 String companyName = "", subCompanyName = "";
684 686 for(String key : keyMap.keySet()){
... ... @@ -800,7 +802,8 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
800 802 if(page.length() != 0 && type.equals("query")){
801 803 int currPage = Integer.valueOf(page);
802 804 modelMap.put("totalPage", resList.size()%10>0?(resList.size()/10 + 1):resList.size()/10);
803   - modelMap.put("dataList", resList.subList(currPage*10,((currPage+1)*10)>=resList.size()?resList.size():(currPage+1)*10));
  805 +// modelMap.put("dataList", resList.subList(currPage*10,((currPage+1)*10)>=resList.size()?resList.size():(currPage+1)*10));
  806 + modelMap.put("dataList", resList);
804 807 } else {
805 808 modelMap.put("dataList", resList);
806 809 }
... ...
src/main/java/com/bsth/service/schedule/impl/SchedulePlanServiceImpl.java
1 1 package com.bsth.service.schedule.impl;
2 2  
3   -import com.bsth.entity.Line;
4 3 import com.bsth.entity.schedule.SchedulePlan;
5   -import com.bsth.entity.schedule.SchedulePlanInfo;
6 4 import com.bsth.entity.schedule.TTInfo;
7   -import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
8 5 import com.bsth.repository.BusinessRepository;
9 6 import com.bsth.repository.LineRepository;
10 7 import com.bsth.repository.schedule.*;
11 8 import com.bsth.service.schedule.SchedulePlanService;
12 9 import com.bsth.service.schedule.exception.ScheduleException;
  10 +import com.bsth.service.schedule.plan.DroolsSchedulePlan;
13 11 import com.bsth.service.schedule.rules.ScheduleRuleService;
14   -import com.bsth.service.schedule.rules.plan.PlanCalcuParam_input;
15   -import com.bsth.service.schedule.rules.plan.PlanResult;
16   -import com.bsth.service.schedule.rules.rerun.RerunRule_input;
17   -import com.bsth.service.schedule.rules.rerun.RerunRule_param;
18   -import com.bsth.service.schedule.rules.shiftloop.ScheduleCalcuParam_input;
19   -import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;
20   -import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;
21   -import com.bsth.service.schedule.rules.ttinfo.*;
22 12 import com.bsth.service.schedule.rules.ttinfo2.CalcuParam;
23 13 import com.bsth.service.schedule.rules.ttinfo2.Result;
24   -import com.bsth.service.schedule.rules.validate.ValidateParam;
25   -import com.bsth.service.schedule.rules.validate.ValidateResults_output;
26   -import org.apache.commons.lang3.StringUtils;
27 14 import org.joda.time.DateTime;
28 15 import org.kie.api.KieBase;
29 16 import org.kie.api.runtime.KieSession;
... ... @@ -37,6 +24,9 @@ import org.springframework.transaction.annotation.Propagation;
37 24 import org.springframework.transaction.annotation.Transactional;
38 25  
39 26 import java.util.*;
  27 +import java.util.concurrent.ConcurrentHashMap;
  28 +import java.util.concurrent.TimeUnit;
  29 +import java.util.concurrent.locks.ReentrantLock;
40 30  
41 31 /**
42 32 * Created by xu on 16/6/16.
... ... @@ -44,12 +34,12 @@ import java.util.*;
44 34 @Service
45 35 public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> implements SchedulePlanService {
46 36 @Autowired
47   - @Qualifier("kb1")
48   - private KieBase kieBase;
  37 + @Qualifier("coreKBase")
  38 + private KieBase coreKBase;
49 39  
50 40 @Autowired
51   - @Qualifier("kb2")
52   - private KieBase kieBase2;
  41 + @Qualifier("preKBase")
  42 + private KieBase preKBase;
53 43  
54 44 @Autowired
55 45 private ScheduleRule1FlatRepository scheduleRule1FlatRepository;
... ... @@ -73,398 +63,62 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im
73 63 /** 日志记录器 */
74 64 private Logger logger = LoggerFactory.getLogger(SchedulePlanServiceImpl.class);
75 65  
76   - /**
77   - * 计算规则输入。
78   - * @param schedulePlan
79   - * @return
80   - */
81   - private List<ScheduleRule_input> calcuSrfList(SchedulePlan schedulePlan) {
82   - // 1-1、构造drools规则输入数据,输出数据
83   - // 全局计算参数
84   - ScheduleCalcuParam_input scheduleCalcuParam_input = new ScheduleCalcuParam_input(schedulePlan);
85   -
86   - // 规则输出数据
87   - List<ScheduleRule_input> scheduleRule_inputs = new ArrayList<>();
88   -
89   - // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
90   - // 创建session,内部配置的是stateful
91   - KieSession session = kieBase2.newKieSession();
92   - // 设置gloable对象,在drl中通过别名使用
93   - session.setGlobal("sriList", scheduleRule_inputs);
94   - session.setGlobal("log", logger); // 设置日志
95   -
96   - session.setGlobal("srf", scheduleRule1FlatRepository);
97   - session.setGlobal("rrr", rerunRuleRepository);
98   - session.setGlobal("srservice", scheduleRuleService);
99   -
100   - // 载入数据
101   - session.insert(scheduleCalcuParam_input);
102   -
103   - // 执行rule
104   - session.fireAllRules();
105   -
106   - // 执行完毕销毁,有日志的也要关闭
107   - session.dispose();
108   -
109   - return scheduleRule_inputs;
110   - }
111   -
112   - /**
113   - * 循环规则输出。
114   - * @param schedulePlan 排班计划对象
115   - * @param lpInfoResults_output 时刻表每日路牌的情况
116   - */
117   - private ScheduleResults_output loopRuleOutput(
118   - SchedulePlan schedulePlan,
119   - LpInfoResults_output lpInfoResults_output) {
120   - // 1-1、构造drools规则输入数据,输出数据
121   - // 全局计算参数
122   - ScheduleCalcuParam_input scheduleCalcuParam_input = new ScheduleCalcuParam_input(schedulePlan);
123   - // 每个规则对应的输入参数
124   - List<ScheduleRule_input> scheduleRule_inputs = calcuSrfList(schedulePlan);
125   -
126   - // 规则输出数据
127   - ScheduleResults_output scheduleResults_output = new ScheduleResults_output();
128   -
129   - // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
130   - // 创建session,内部配置的是stateful
131   - KieSession session = kieBase.newKieSession();
132   - // 设置gloable对象,在drl中通过别名使用
133   - session.setGlobal("scheduleResult", scheduleResults_output);
134   - session.setGlobal("log", logger); // 设置日志
135   - session.setGlobal("scheduleRuleService", scheduleRuleService);
136   -
137   - // 载入数据
138   - session.insert(scheduleCalcuParam_input);
139   - for (ScheduleRule_input scheduleRule_input : scheduleRule_inputs) {
140   - session.insert(scheduleRule_input);
141   - }
142   - // 每日时刻表路牌数据
143   - for (LpInfoResult_output lpInfoResult_output: lpInfoResults_output.getLpInfoResult_outputs()) {
144   - session.insert(lpInfoResult_output);
145   - }
146   - // 执行rule
147   - session.fireAllRules();
148   -
149   - // 执行完毕销毁,有日志的也要关闭
150   - session.dispose();
151   -
152   - // 保存循环规则结果数据
153   - scheduleRuleService.generateRuleResult(scheduleResults_output.getSchedulePlanRuleResults());
154   -
155   -// logger.info("循环规则输出={}", scheduleResults_output.showGuideboardDesc1());
156   -
157   - return scheduleResults_output;
158   - }
159   -
160   - /**
161   - * 时刻表选择(判定每天使用的时刻表,以及路牌数据输出)。
162   - * @param schedulePlan 排班计划对象
163   - * @return TTInfoResults_output, LpInfoResults_output
164   - */
165   - private Object[] ttInfoOutput(SchedulePlan schedulePlan) {
166   - // 获取线路的所有未作废的时刻表
167   - List<TTInfo> ttInfos = ttInfoRepository.findInCanceledByXl(schedulePlan.getXl());
168   -
169   - // 1-1、构造drools规则输入数据,输出数据
170   - // 全局计算参数
171   - TTInfoCalcuParam_input ttInfoCalcuParam_input =
172   - new TTInfoCalcuParam_input(
173   - new DateTime(schedulePlan.getScheduleFromTime()),
174   - new DateTime(schedulePlan.getScheduleToTime()),
175   - String.valueOf(schedulePlan.getXl().getId())
176   - );
177   - // 规则输出数据
178   - TTInfoResults_output ttInfoResults_output = new TTInfoResults_output();
179   - LpInfoResults_output lpInfoResults_output = new LpInfoResults_output();
180   -
181   - // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
182   - // 创建session,内部配置的是stateful
183   - KieSession session = kieBase.newKieSession();
184   -
185   - // 设置gloable对象,在drl中通过别名使用
186   - session.setGlobal("results", ttInfoResults_output);
187   - session.setGlobal("lpInfoResults_output", lpInfoResults_output);
188   - session.setGlobal("log", logger); // 设置日志
189   - session.setGlobal("tTInfoDetailRepository", ttInfoDetailRepository);
190   -
191   - // 载入数据
192   - session.insert(ttInfoCalcuParam_input);
193   - for (TTInfo ttInfo : ttInfos) {
194   - TTInfo_input ttInfo_input = new TTInfo_input(ttInfo);
195   - session.insert(ttInfo_input);
196   - }
197   -
198   - // 载入数据2(计算规则最早启用时间)
199   - List<ScheduleRule1Flat> scheduleRule1Flats = scheduleRule1FlatRepository.findByXl(schedulePlan.getXl());
200   -
201   - for (ScheduleRule1Flat scheduleRule1Flat: scheduleRule1Flats) {
202   - ScheduleRule_input scheduleRule_input = new ScheduleRule_input(scheduleRule1Flat);
203   - session.insert(scheduleRule_input);
204   - }
205   -
206   - // 执行rule
207   - session.fireAllRules();
208   -
209   - // 执行完毕销毁,有日志的也要关闭
210   - session.dispose();
211   -
212   - return new Object[] {ttInfoResults_output, lpInfoResults_output};
213   -
214   - }
215   -
216   - /**
217   - * 排班生成。
218   - * @param schedulePlan 排班计划对象
219   - * @param scheduleResults_output loopRuleOutput方法规则输出
220   - * @param ttInfoResults_output ttInfoOutput方法规则输出
221   - * @return PlanResult
222   - */
223   - private PlanResult planResultOutput(
224   - SchedulePlan schedulePlan,
225   - ScheduleResults_output scheduleResults_output,
226   - TTInfoResults_output ttInfoResults_output) {
227   -
228   - // 1-1、构造drools规则输入数据,输出数据
229   - PlanCalcuParam_input planCalcuParam_input = new PlanCalcuParam_input(
230   - schedulePlan,
231   - scheduleResults_output,
232   - ttInfoResults_output
233   - );
234   - // 规则输出数据
235   - PlanResult planResult = new PlanResult();
236   - planResult.setXlId(schedulePlan.getXl().getId().toString());
237   -
238   - // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
239   - // 创建session,内部配置的是stateful
240   - KieSession session = kieBase.newKieSession();
241   -
242   - // 设置gloable对象,在drl中通过别名使用
243   - session.setGlobal("planResult", planResult);
244   - session.setGlobal("log", logger); // 设置日志
245   -
246   - session.setGlobal("tTInfoDetailRepository", ttInfoDetailRepository);
247   - session.setGlobal("carConfigInfoRepository", carConfigInfoRepository);
248   - session.setGlobal("employeeConfigInfoRepository", employeeConfigInfoRepository);
249   - session.setGlobal("lineRepository", lineRepository);
250   - session.setGlobal("businessRepository", businessRepository);
251   -
252   - // 载入数据
253   - session.insert(planCalcuParam_input);
254   -
255   - // 执行rule
256   - session.fireAllRules();
257   -
258   - // 执行完毕销毁,有日志的也要关闭
259   - session.dispose();
260   -
261   - return planResult;
262   -
263   - }
264   -
265   - /**
266   - * 生成线路排班(不含套跑规则)。
267   - * @param schedulePlan
268   - * @return
269   - */
270   - private PlanResult schedulePlanWithOutRerun(SchedulePlan schedulePlan) {
271   - // 1、时刻表数据及每日路牌数据计算
272   - Date start1 = new Date();
273   - Object[] ttInfoRets = ttInfoOutput(schedulePlan);
274   - TTInfoResults_output ttInfoResults_output = (TTInfoResults_output) ttInfoRets[0];
275   - LpInfoResults_output lpInfoResults_output = (LpInfoResults_output) ttInfoRets[1];
276   - Date end1 = new Date();
277   - // 2、循环规则计算输出
278   - Date start2 = new Date();
279   - ScheduleResults_output scheduleResults_output = loopRuleOutput(schedulePlan, lpInfoResults_output);
280   - Date end2 = new Date();
281   -
282   - logger.info("规则计算结果={}", scheduleResults_output.showGuideboardDesc1());
283   -
284   - // 3、计划输出
285   - Date start3 = new Date();
286   - PlanResult planResult = planResultOutput(schedulePlan, scheduleResults_output, ttInfoResults_output);
287   - Date end3 = new Date();
288   -
289   - logger.info("drool时刻表每日路牌计算 {} ms,drool循环规则计算 {} ms,drool计划数据 {} ms",
290   - end1.getTime() - start1.getTime(),
291   - end2.getTime() - start2.getTime(),
292   - end3.getTime() - start3.getTime());
293   -
294   - // TODO:将lpInfoResults_output 也要返回
295   -
296   - return planResult;
297   - }
298   -
299   - /**
300   - * 套跑计划排班数据。
301   - * @param planResult
302   - */
303   - private void rerunPlanResult(PlanResult planResult, SchedulePlan schedulePlan) {
304   - List<RerunRule_input> rerunRule_inputs = scheduleRuleService.findRerunrule(Integer.parseInt(planResult.getXlId()));
305   - logger.info("套跑数量 {} 组", rerunRule_inputs.size());
306   -
307   - // 主线路id
308   - Integer mainXlId = schedulePlan.getXl().getId();
309   -
310   - if (rerunRule_inputs.size() > 0) {
311   - // 找出是对应路牌类型的线路,计算循环规则输出
312   - Set<String> xlids = new HashSet<>();
313   - for (RerunRule_input rerunRule_input: rerunRule_inputs) {
314   - if ("dylp".equals(rerunRule_input.getType())) {
315   - xlids.add(rerunRule_input.getS_xl()); // 参与套跑的线路
316   - }
317   - }
318   -
319   - List<ScheduleResults_output> scheduleResults_outputs = new ArrayList<>();
320   - Date start1 = new Date();
321   - for (String xlid: xlids) {
322   - schedulePlan.getXl().setId(Integer.parseInt(xlid)); // 套跑的线路默认跟着主线路设定走
323   - // 获取套跑线路的循环规则计算输出
324   - Object[] ttInfoRets = ttInfoOutput(schedulePlan);
325   - LpInfoResults_output lpInfoResults_output = (LpInfoResults_output) ttInfoRets[1];
326   - ScheduleResults_output scheduleResults_output = loopRuleOutput(schedulePlan, lpInfoResults_output);
327   - scheduleResults_outputs.add(scheduleResults_output);
328   - }
329   -
330   - // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
331   - // 创建session,内部配置的是stateful
332   - KieSession session = kieBase.newKieSession();
333   -
334   - // 设置gloable对象,在drl中通过别名使用
335   - session.setGlobal("planResult", planResult);
336   - session.setGlobal("log", logger); // 设置日志
337   -
338   - session.setGlobal("carConfigInfoRepository", carConfigInfoRepository);
339   - session.setGlobal("employeeConfigInfoRepository", employeeConfigInfoRepository);
340   -
341   - // 载入数据
342   - RerunRule_param rerunRule_param = new RerunRule_param();
343   - rerunRule_param.setMxlid(planResult.getXlId());
344   - rerunRule_param.setXlIds_dylp(xlids);
345   - session.insert(rerunRule_param);
346   - for (RerunRule_input rri: rerunRule_inputs) {
347   - session.insert(rri);
348   - }
349   - for (SchedulePlanInfo spi: planResult.getSchedulePlanInfos()) {
350   - session.insert(spi);
  66 + /** 线路独占锁 */
  67 + private ConcurrentHashMap<Integer, ReentrantLock> lineXLatchMaps = new ConcurrentHashMap<>();
  68 + private ReentrantLock getLineXLatch(Integer xlid) {
  69 + ReentrantLock lineXLatch = lineXLatchMaps.get(xlid);
  70 + if (lineXLatch == null) {
  71 + lineXLatch = new ReentrantLock();
  72 + ReentrantLock pre = lineXLatchMaps.putIfAbsent(xlid, lineXLatch);
  73 + if (pre != null) {
  74 + lineXLatch = pre;
351 75 }
352   - for (ScheduleResults_output sro: scheduleResults_outputs) {
353   - session.insert(sro);
354   - }
355   -
356   - // 执行rule
357   - session.fireAllRules();
358   -
359   - // 执行完毕销毁,有日志的也要关闭
360   - session.dispose();
361   -
362   - Date end1 = new Date();
363   - logger.info("套跑规则计算,耗时 {} ms", end1.getTime() - start1.getTime());
364   -
365   - schedulePlan.getXl().setId(mainXlId);
366   -
367   - }
368   -
369   - }
370   -
371   - /**
372   - * 验证排班结果。
373   - * @param planResult
374   - * @param schedulePlan
375   - */
376   - public void validPlanResult(PlanResult planResult, SchedulePlan schedulePlan) {
377   - // 1-1、构造drools规则输入数据,输出数据
378   - ValidateParam validateParam = new ValidateParam(
379   - new DateTime(schedulePlan.getScheduleFromTime()),
380   - new DateTime(schedulePlan.getScheduleToTime())
381   - );
382   - // 规则输出数据
383   - ValidateResults_output result = new ValidateResults_output();
384   -
385   - // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
386   - // 创建session,内部配置的是stateful
387   - KieSession session = kieBase.newKieSession();
388   -
389   - // 设置gloable对象,在drl中通过别名使用
390   - session.setGlobal("validResult", result);
391   - session.setGlobal("log", logger); // 设置日志
392   -
393   - // 载入数据
394   - session.insert(validateParam);
395   - for (SchedulePlanInfo schedulePlanInfo: planResult.getSchedulePlanInfos()) {
396   - session.insert(schedulePlanInfo);
397   - }
398   -
399   - // 执行rule
400   - session.fireAllRules();
401   -
402   - // 执行完毕销毁,有日志的也要关闭
403   - session.dispose();
404   -
405   -// logger.info("错误总数={}", result.getInfos().size());
406   -// for (ValidateResults_output.ValidInfo validInfo: result.getInfos()) {
407   -// logger.info(validInfo.getDesc());
408   -// }
409   -
410   - // 取10条错误
411   - int size = result.getInfos().size() > 10 ? 10: result.getInfos().size();
412   - List<String> desclist = new ArrayList<>();
413   - for (int i = 0; i < size; i++) {
414   - desclist.add(result.getInfos().get(i).getDesc());
415   - }
416   - if (desclist.size() > 0) {
417   - schedulePlan.setPlanResult(StringUtils.join(desclist, "</br>"));
418   - } else {
419   - schedulePlan.setPlanResult("ok");
420 76 }
421   -
422   - // TODO:设定错误信息
  77 + return lineXLatch;
423 78 }
424 79  
425 80 @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
426 81 public SchedulePlan save(SchedulePlan schedulePlan) {
427   - // pre、如果排班的数据之前已经有了,删除之前的数据
428   - Date startpre = new Date();
429   - scheduleRuleService.deleteSchedulePlanInfo(
430   - schedulePlan.getXl().getLineCode(),
431   - schedulePlan.getScheduleFromTime(),
432   - schedulePlan.getScheduleToTime());
433   - Date endpre = new Date();
434   -
435   - // 1、查找线路,这是主线路
436   - Line xl = lineRepository.findOne(schedulePlan.getXl().getId());
437   - logger.info("<--- 排班master线路 id={}, name={}, 开始排班", xl.getId(), xl.getName());
438   -
439   - // 2、确定主线路排班(包含完全套跑路牌规则,所谓完全套跑路牌规则指整个路牌的班次都是套跑规则指定的)
440   - PlanResult planResult = schedulePlanWithOutRerun(schedulePlan);
441   -
442   - // 3、确定套跑规则
443   - rerunPlanResult(planResult, schedulePlan);
444   -
445   - // TODO:3-1、验证排班结果
446   - validPlanResult(planResult, schedulePlan);
  82 + ReentrantLock lineXLatch = getLineXLatch(schedulePlan.getXl().getId());
  83 + try {
  84 + if (lineXLatch.tryLock(1, TimeUnit.SECONDS)) {
  85 + // pre、如果排班的数据之前已经有了,删除之前的数据
  86 + Date startPre = new Date();
  87 + scheduleRuleService.deleteSchedulePlanInfo(
  88 + schedulePlan.getXl().getLineCode(),
  89 + schedulePlan.getScheduleFromTime(),
  90 + schedulePlan.getScheduleToTime());
  91 + Date endPre = new Date();
  92 + logger.info("删除数据 {} ms --->", endPre.getTime() - startPre.getTime());
  93 +
  94 + // core、生成排班计划
  95 + DroolsSchedulePlan droolsSchedulePlan = new DroolsSchedulePlan(
  96 + schedulePlan,
  97 + lineRepository, scheduleRule1FlatRepository,
  98 + ttInfoRepository, ttInfoDetailRepository,
  99 + carConfigInfoRepository, employeeConfigInfoRepository,
  100 + rerunRuleRepository, businessRepository,
  101 + scheduleRuleService,
  102 + preKBase, coreKBase,
  103 + logger
  104 + );
  105 + droolsSchedulePlan.generatePlan();
447 106  
448   - // TODO:3-2、去除完全套跑遗漏班次(以后放到规则中执行)
449   - Iterator<SchedulePlanInfo> infoIterator = planResult.getSchedulePlanInfos().iterator();
450   - while (infoIterator.hasNext()) {
451   - SchedulePlanInfo schedulePlanInfo = infoIterator.next();
452   - if (schedulePlanInfo.getCl() == null) {
453   - infoIterator.remove();
  107 + return new SchedulePlan();
  108 + } else {
  109 + throw new ScheduleException("当前线路正在排班,请稍后再操作...");
454 110 }
455   - }
  111 + } catch (Exception exp) {
  112 + throw new RuntimeException(exp);
  113 + } finally {
  114 + try {
  115 + lineXLatch.unlock();
  116 + } catch (Exception exp2) {
456 117  
457   - // 4、保存数据(jdbcTemplate 批量插入)
458   - Date start4 = new Date();
459   - scheduleRuleService.generateSchedulePlan(schedulePlan, planResult.getSchedulePlanInfos());
460   - Date end4 = new Date();
  118 + }
461 119  
462   - logger.info("删除数据 {} ms,保存主线路数据 {} 条 耗时 {} ms --->",
463   - endpre.getTime() - startpre.getTime(),
464   - planResult.getSchedulePlanInfos().size(),
465   - end4.getTime() - start4.getTime());
  120 + }
466 121  
467   - return new SchedulePlan();
468 122 }
469 123  
470 124 @Override
... ... @@ -475,10 +129,12 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im
475 129 @Override
476 130 public SchedulePlan findSchedulePlanTommorw() {
477 131 DateTime today = new DateTime(new Date());
478   - DateTime tommorw = new DateTime(today.getYear(), today.getMonthOfYear(), today.getDayOfMonth(), 0, 0).plusDays(1);
  132 + DateTime tommorw = new DateTime(
  133 + today.getYear(), today.getMonthOfYear(),
  134 + today.getDayOfMonth(), 0, 0).plusDays(1);
479 135 Map<String, Object> param = new HashMap<>();
480 136 param.put("scheduleFromTime_le", tommorw.toDate());
481   - param.put("scheduleToTime_ge", tommorw.toDate() );
  137 + param.put("scheduleToTime_ge", tommorw.toDate());
482 138 Iterator<SchedulePlan> schedulePlanIterator = this.list(param).iterator();
483 139 if (schedulePlanIterator.hasNext()) {
484 140 return schedulePlanIterator.next();
... ... @@ -490,7 +146,7 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im
490 146 public Result validateTTInfo(Integer xlid, Date from, Date to) {
491 147 // 构造drools session->载入数据->启动规则->计算->销毁session
492 148 // 创建session,内部配置的是stateful
493   - KieSession session = kieBase.newKieSession();
  149 + KieSession session = coreKBase.newKieSession();
494 150 // 设置gloable对象,在drl中通过别名使用
495 151 session.setGlobal("log", logger);
496 152 session.setGlobal("lineRepository", lineRepository);
... ... @@ -513,7 +169,6 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im
513 169 // 执行完毕销毁,有日志的也要关闭
514 170 session.dispose();
515 171  
516   -
517 172 return rs;
518 173 }
519 174 }
... ...
src/main/java/com/bsth/service/schedule/impl/TTInfoDetailServiceImpl.java
... ... @@ -15,12 +15,15 @@ import com.bsth.repository.schedule.TTInfoRepository;
15 15 import com.bsth.repository.sys.SysUserRepository;
16 16 import com.bsth.service.CarParkService;
17 17 import com.bsth.service.LineInformationService;
  18 +import com.bsth.service.LineService;
18 19 import com.bsth.service.StationRouteService;
19 20 import com.bsth.service.schedule.GuideboardInfoService;
20 21 import com.bsth.service.schedule.TTInfoDetailService;
21 22 import com.bsth.service.schedule.datatools.TTInfoDetailForEdit;
22 23 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData;
23 24 import com.bsth.service.schedule.exception.ScheduleException;
  25 +import com.bsth.service.schedule.timetable.ExcelData;
  26 +import com.bsth.service.schedule.timetable.ExcelFormatType;
24 27 import com.bsth.service.schedule.utils.DataToolsFile;
25 28 import com.bsth.service.schedule.utils.DataToolsFileType;
26 29 import com.bsth.service.schedule.utils.DataToolsService;
... ... @@ -77,6 +80,8 @@ public class TTInfoDetailServiceImpl extends BServiceImpl&lt;TTInfoDetail, Long&gt; im
77 80 private SysUserRepository sysUserRepository;
78 81 @Autowired
79 82 private GuideboardInfoRepository guideboardInfoRepository;
  83 + @Autowired
  84 + private LineService lineService;
80 85  
81 86 @Autowired
82 87 @Qualifier(value = "ttInfoDetail_dataTool")
... ... @@ -155,130 +160,13 @@ public class TTInfoDetailServiceImpl extends BServiceImpl&lt;TTInfoDetail, Long&gt; im
155 160 }
156 161  
157 162 @Override
158   - public void validateExcelSheet(String filename, String sheetname, Integer lineid, String linename, Integer lineversion) throws ScheduleException {
159   - try {
160   - File file = new File(filename);
161   - Workbook workbook;
162   -
163   - if (DataToolsFileType.XLS.isThisType(file)) {
164   - workbook = DataToolsFileType.XLS.getWorkBook(file);
165   - } else if (DataToolsFileType.XLSX.isThisType(file)) {
166   - workbook = DataToolsFileType.XLSX.getWorkBook(file);
167   - } else {
168   - throw new Exception("不是xls xlsx文件!");
169   - }
170   -
171   - Sheet sheet = workbook.getSheet(sheetname);
172   - int rowNums = sheet.getLastRowNum() + 1; // 基于0 base的,长度加1
173   - int colNums = sheet.getRow(0).getLastCellNum(); // 不需要加1,就是长度
174   -
175   - if (rowNums == 0 || colNums == 0) { // 工作区是否为空
176   - throw new Exception(String.format("%s 工作区没有数据!", sheetname));
177   - } else {
178   - if (rowNums <= 1 || rowNums <= 1) {
179   - throw new Exception(String.format("工作区至少包含2行2列的数据"));
180   - } else {
181   - Row firstRow = sheet.getRow(0); // 获取第一行数据列
182   - for (int i = 0; i < colNums; i++) {
183   - String cell_con = StringUtils.trimToEmpty(PoiUtils.getStringValueFromCell(firstRow.getCell(i))); // trimToEmpty
184   -
185   - if (StringUtils.isEmpty(cell_con)) {
186   - throw new Exception(String.format("第1行,第%d列数据不能为空", i + 1));
187   - } else {
188   - // 正则表达式去除右侧数字
189   -// cell_con = cell_con.replaceAll("[\\d+]", "");
190   -// cell_con = cell_con.replaceAll("(\\d+)$", "");
191   -
192   - // 如果站名中有类似->{数字},使用正则表达式过滤掉
193   - cell_con = cell_con.replaceAll("(->\\d+)", "");
194   -
195   - if (i == 0) { // 第一列必须是路牌2个字
196   - if (!"路牌".equals(cell_con.trim())) {
197   - throw new Exception("第1行,第1列数据必须是路牌2个字");
198   - }
199   - } else { // 排除出场,进场,其余内容到站点路由里查询,以各个方向的起点站为查询依据
200   - if ((!"出场".equals(cell_con.trim())) &&
201   - (!"进场".equals(cell_con.trim()))) {
202   - Map<String, Object> p1 = new HashMap<>();
203   - p1.put("line.id_eq", lineid);
204   - p1.put("stationName_eq", cell_con.trim());
205   - p1.put("stationMark_eq", "B"); // 起点站
206   - p1.put("destroy_eq", 0); // 未撤销
207   - p1.put("versions_eq", lineversion); // 带线路版本
208   -
209   - List<LsStationRoute> lsStationRoutes = (List<LsStationRoute>) stationRouteService.list_ls(p1);
210   - if (CollectionUtils.isEmpty(lsStationRoutes)) {
211   - throw new Exception(String.format("第1行,第%d列数据%s在%s站点路由中不是起点站", i + 1, cell_con.trim(), linename));
212   - } else if (lsStationRoutes.size() > 1) {
213   - throw new Exception(String.format("第1行,第%d列数据%s在%s站点路由中上下行都是起点站", i + 1, cell_con.trim(), linename));
214   - } else if (StringUtils.isEmpty(lsStationRoutes.get(0).getStationCode())) {
215   - throw new Exception(String.format("第1行,第%d列数据%s在%s站点路由中没有站点编码", i + 1, cell_con.trim(), linename));
216   - }
217   -
218   - }
219   -
220   - }
221   - }
222   - }
223   -
224   - // 验证路牌内容
225   - Map<String, Integer> gbindexmap = new HashMap<>(); // 记录每个路牌在第几行
226   - for (int i = 1; i < rowNums; i++) { // 从第2行开始验证数据
227   - Cell cell = sheet.getRow(i).getCell(0); // 获取第1列
228   - String bcell_con = StringUtils.trimToEmpty(PoiUtils.getStringValueFromCell(cell)); // trimToEmpty
229   - if (StringUtils.isEmpty(bcell_con)) {
230   - throw new Exception(String.format("第%d行,第1列路牌无数据", i + 1));
231   - } else if (gbindexmap.get(bcell_con.trim()) != null) {
232   - throw new Exception(String.format("第%d行,第1列的路牌数据与第%d行,第1列数据重复",
233   - i + 1,
234   - gbindexmap.get(bcell_con.trim())));
235   - } else {
236   - Map<String, Object> p2 = new HashMap<>();
237   - p2.put("xl.id_eq", lineid);
238   - p2.put("lpName_eq", bcell_con.trim());
239   - p2.put("isCancel_eq", false);
240   - List<GuideboardInfo> guideboardInfoList = (List<GuideboardInfo>) guideboardInfoService.list(p2);
241   - if (CollectionUtils.isEmpty(guideboardInfoList)) {
242   - throw new Exception(String.format("第%d行,第1列的路牌在%s中不存在", i + 1, linename));
243   - } else if (guideboardInfoList.size() > 1) {
244   - throw new Exception(String.format("第%d行,第1列的路牌在%s中重复", i + 1, linename));
245   - } else {
246   - gbindexmap.put(bcell_con.trim(), i + 1);
247   - }
248   - }
249   - }
250   -
251   - // 班次时间验证,正则表达式,格式hh:mm或者hhmm
252   - String rex1 = "^([01]?[0-9]|2[0-3]):[0-5][0-9]$"; // hh:mm格式
253   - String rex2 = "^([01]?[0-9]|2[0-3]),[0-5][0-9]$"; // hh,mm格式
254   - String rex3 = "^([01]?[0-9]|2[0-3])[0-5][0-9]$"; // hhmm格式
255   - Pattern p1 = Pattern.compile(rex1);
256   - Pattern p2 = Pattern.compile(rex2);
257   - Pattern p3 = Pattern.compile(rex3);
258   -
259   - for (int i = 1; i < rowNums; i++) { // 从第2行开始验证数据
260   - Row row = sheet.getRow(i);
261   - for (int j = 1; j < colNums; j++) { // 从第2列开始
262   - String bcell_con = StringUtils.trimToEmpty(PoiUtils.getStringValueFromCell(row.getCell(j))).replaceAll("\\s*", ""); // trimToEmpty
263   - if (StringUtils.isNotEmpty(bcell_con)) {
264   - Matcher m1 = p1.matcher(bcell_con.trim());
265   - Matcher m2 = p2.matcher(bcell_con.trim());
266   - Matcher m3 = p3.matcher(bcell_con.trim());
267   - if ((!m1.matches()) && (!m2.matches()) && (!m3.matches())) {
268   - throw new Exception(String.format("第%d行,第%d列的发车时间格式不正确,格式应为hh:mm或hh,mm或hhmm", i + 1, j + 1));
269   - }
270   - }
271   - }
272   - }
273   - }
274   -
275   - }
276   -
277   - } catch (Exception exp) {
278   - exp.printStackTrace();
279   - throw new ScheduleException(exp.getMessage());
280   - }
281   -
  163 + public void validateExcelSheet(String filename, String sheetname, Integer lineid, String linename, Integer lineversion, ExcelFormatType excelFormatType) throws ScheduleException {
  164 + ExcelData excelData = new ExcelData(
  165 + filename, sheetname, lineid,
  166 + lineService, guideboardInfoService,
  167 + lineversion, stationRouteService,
  168 + excelFormatType);
  169 + excelData.validateExcelSheet();
282 170 }
283 171  
284 172 @Override
... ...
src/main/java/com/bsth/service/schedule/plan/DroolsSchedulePlan.java 0 → 100644
  1 +package com.bsth.service.schedule.plan;
  2 +
  3 +import com.bsth.entity.Line;
  4 +import com.bsth.entity.schedule.SchedulePlan;
  5 +import com.bsth.entity.schedule.SchedulePlanInfo;
  6 +import com.bsth.entity.schedule.TTInfo;
  7 +import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
  8 +import com.bsth.repository.BusinessRepository;
  9 +import com.bsth.repository.LineRepository;
  10 +import com.bsth.repository.schedule.*;
  11 +import com.bsth.service.schedule.rules.ScheduleRuleService;
  12 +import com.bsth.service.schedule.rules.plan.PlanCalcuParam_input;
  13 +import com.bsth.service.schedule.rules.plan.PlanResult;
  14 +import com.bsth.service.schedule.rules.rerun.RerunRule_input;
  15 +import com.bsth.service.schedule.rules.rerun.RerunRule_param;
  16 +import com.bsth.service.schedule.rules.shiftloop.ScheduleCalcuParam_input;
  17 +import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;
  18 +import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;
  19 +import com.bsth.service.schedule.rules.ttinfo.*;
  20 +import com.bsth.service.schedule.rules.validate.ValidateParam;
  21 +import com.bsth.service.schedule.rules.validate.ValidateResults_output;
  22 +import org.apache.commons.lang3.StringUtils;
  23 +import org.joda.time.DateTime;
  24 +import org.kie.api.KieBase;
  25 +import org.kie.api.runtime.KieSession;
  26 +import org.slf4j.Logger;
  27 +
  28 +import java.util.*;
  29 +
  30 +/**
  31 + * 排班计划(使用Drools)。
  32 + */
  33 +public class DroolsSchedulePlan {
  34 + /** 主线路 */
  35 + private Line mainLine;
  36 + /** 套跑辅线路规则 */
  37 + private List<RerunRule_input> rerunRule_inputs;
  38 +
  39 + /** 开始排班时间 */
  40 + private Date from;
  41 + /** 结束排班时间 */
  42 + private Date to;
  43 + /** 排班计划entity */
  44 + private SchedulePlan schedulePlan;
  45 +
  46 + //-------------------- 相关的Repo,service服务 --------------------//
  47 + /** 线路Repo */
  48 + private LineRepository lineRepository;
  49 + /** 排班规则Repo */
  50 + private ScheduleRule1FlatRepository scheduleRule1FlatRepository;
  51 + /** 时刻表Repo */
  52 + private TTInfoRepository ttInfoRepository;
  53 + /** 时刻表明细Repo */
  54 + private TTInfoDetailRepository ttInfoDetailRepository;
  55 + /** 车辆配置Repo */
  56 + private CarConfigInfoRepository carConfigInfoRepository;
  57 + /** 人员配置Repo */
  58 + private EmployeeConfigInfoRepository employeeConfigInfoRepository;
  59 + /** 套跑规则Repo */
  60 + private RerunRuleRepository rerunRuleRepository;
  61 + /** 营运状态Repo */
  62 + private BusinessRepository businessRepository;
  63 +
  64 + /** 排班规则service */
  65 + private ScheduleRuleService scheduleRuleService;
  66 +
  67 + //-------------------- Drools KBase实例 ------------------//
  68 + /** 排班预处理KBase */
  69 + private KieBase preKBase;
  70 + /** 排班核心KBase */
  71 + private KieBase coreKBase;
  72 +
  73 + //-------------------- 日志记录器 ---------------------//
  74 + private Logger logger;
  75 +
  76 + public DroolsSchedulePlan(
  77 + SchedulePlan schedulePlan,
  78 + LineRepository lineRepository, ScheduleRule1FlatRepository scheduleRule1FlatRepository,
  79 + TTInfoRepository ttInfoRepository, TTInfoDetailRepository ttInfoDetailRepository,
  80 + CarConfigInfoRepository carConfigInfoRepository,
  81 + EmployeeConfigInfoRepository employeeConfigInfoRepository,
  82 + RerunRuleRepository rerunRuleRepository,
  83 + BusinessRepository businessRepository,
  84 + ScheduleRuleService scheduleRuleService,
  85 + KieBase preKBase, KieBase coreKBase,
  86 + Logger logger) {
  87 +
  88 + // 验证SchedulePlan实体
  89 + if (schedulePlan == null) {
  90 + throw new RuntimeException("排班用SchedulePlan为空!");
  91 + }
  92 + if (schedulePlan.getXl() == null) {
  93 + throw new RuntimeException("排班线路为空!");
  94 + } else {
  95 + // 获取主线路
  96 + this.mainLine = lineRepository.findOne(schedulePlan.getXl().getId());
  97 + if (this.mainLine == null) {
  98 + throw new RuntimeException("线路id=" + schedulePlan.getXl().getId() + "不存在!");
  99 + }
  100 + // 获取主线路套跑信息
  101 + this.rerunRule_inputs = scheduleRuleService.findRerunrule(this.mainLine.getId());
  102 + }
  103 + if (schedulePlan.getScheduleFromTime() == null) {
  104 + throw new RuntimeException("排班开始时间为空!");
  105 + }
  106 + if (schedulePlan.getScheduleToTime() == null) {
  107 + throw new RuntimeException("排班结束时间为空!");
  108 + }
  109 + this.from = schedulePlan.getScheduleFromTime();
  110 + this.to = schedulePlan.getScheduleToTime();
  111 + if (schedulePlan.getTtInfoIds() == null) {
  112 + throw new RuntimeException("排班关联的时刻表ids为空!");
  113 + }
  114 + if (schedulePlan.getTtInfoNames() == null) {
  115 + throw new RuntimeException("排班关联的时刻表名字s为空!");
  116 + }
  117 + this.schedulePlan = schedulePlan;
  118 +
  119 + this.lineRepository = lineRepository;
  120 + this.scheduleRule1FlatRepository = scheduleRule1FlatRepository;
  121 + this.ttInfoRepository = ttInfoRepository;
  122 + this.ttInfoDetailRepository = ttInfoDetailRepository;
  123 + this.carConfigInfoRepository = carConfigInfoRepository;
  124 + this.employeeConfigInfoRepository = employeeConfigInfoRepository;
  125 + this.rerunRuleRepository = rerunRuleRepository;
  126 + this.businessRepository = businessRepository;
  127 + this.scheduleRuleService = scheduleRuleService;
  128 + this.preKBase = preKBase;
  129 + this.coreKBase = coreKBase;
  130 +
  131 + this.logger = logger;
  132 +
  133 + }
  134 +
  135 + public void generatePlan() {
  136 + logger.info("<--- 排班master线路 id={}, name={}, 开始排班",
  137 + this.mainLine.getId(), this.mainLine.getName());
  138 +
  139 + // 1、确定主线路排班(包含完全套跑路牌规则,所谓完全套跑路牌规则指整个路牌的班次都是套跑规则指定的)
  140 + PlanResult planResult = this.schedulePlanWithOutRerun();
  141 +
  142 + // 2、确定套跑规则
  143 + this.rerunPlanResult(planResult);
  144 +
  145 + // TODO:3-1、验证排班结果
  146 + this.validPlanResult(planResult);
  147 +
  148 + // TODO:3-2、去除完全套跑遗漏班次(以后放到规则中执行)
  149 + Iterator<SchedulePlanInfo> infoIterator = planResult.getSchedulePlanInfos().iterator();
  150 + while (infoIterator.hasNext()) {
  151 + SchedulePlanInfo schedulePlanInfo = infoIterator.next();
  152 + if (schedulePlanInfo.getCl() == null) {
  153 + infoIterator.remove();
  154 + }
  155 + }
  156 +
  157 + // 4、保存数据(jdbcTemplate 批量插入)
  158 + Date start4 = new Date();
  159 + this.scheduleRuleService.generateSchedulePlan(
  160 + this.schedulePlan, planResult.getSchedulePlanInfos());
  161 + Date end4 = new Date();
  162 +
  163 + this.logger.info("保存主线路数据 {} 条 耗时 {} ms --->",
  164 + planResult.getSchedulePlanInfos().size(),
  165 + end4.getTime() - start4.getTime());
  166 + }
  167 +
  168 + /**
  169 + * 计算规则输入。
  170 + * @return
  171 + */
  172 + private List<ScheduleRule_input> calcuSrfList(Line line) {
  173 + // 1-1、构造drools规则输入数据,输出数据
  174 + // 全局计算参数
  175 + SchedulePlan schedulePlan = new SchedulePlan();
  176 + schedulePlan.setXl(line);
  177 + schedulePlan.setScheduleFromTime(this.from);
  178 + schedulePlan.setScheduleToTime(this.to);
  179 + ScheduleCalcuParam_input scheduleCalcuParam_input = new ScheduleCalcuParam_input(schedulePlan);
  180 +
  181 + // 规则输出数据
  182 + List<ScheduleRule_input> scheduleRule_inputs = new ArrayList<>();
  183 +
  184 + // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
  185 + // 创建session,内部配置的是stateful
  186 + KieSession session = preKBase.newKieSession();
  187 + // 设置gloable对象,在drl中通过别名使用
  188 + session.setGlobal("sriList", scheduleRule_inputs);
  189 + session.setGlobal("log", logger); // 设置日志
  190 +
  191 + session.setGlobal("srf", scheduleRule1FlatRepository);
  192 + session.setGlobal("rrr", rerunRuleRepository);
  193 + session.setGlobal("srservice", scheduleRuleService);
  194 +
  195 + // 载入数据
  196 + session.insert(scheduleCalcuParam_input);
  197 +
  198 + // 执行rule
  199 + session.fireAllRules();
  200 +
  201 + // 执行完毕销毁,有日志的也要关闭
  202 + session.dispose();
  203 +
  204 + return scheduleRule_inputs;
  205 + }
  206 +
  207 + /**
  208 + * 时刻表选择(判定每天使用的时刻表,以及路牌数据输出)。
  209 + * @return [TTInfoResults_output, LpInfoResults_output]
  210 + */
  211 + private Object[] ttInfoOutput(Line line) {
  212 + // 获取线路的所有未作废的时刻表
  213 + List<TTInfo> ttInfos = ttInfoRepository.findInCanceledByXl(line);
  214 +
  215 + // 1-1、构造drools规则输入数据,输出数据
  216 + // 全局计算参数
  217 + TTInfoCalcuParam_input ttInfoCalcuParam_input =
  218 + new TTInfoCalcuParam_input(
  219 + new DateTime(this.from),
  220 + new DateTime(this.to),
  221 + String.valueOf(line.getId())
  222 + );
  223 + // 规则输出数据
  224 + TTInfoResults_output ttInfoResults_output = new TTInfoResults_output();
  225 + LpInfoResults_output lpInfoResults_output = new LpInfoResults_output();
  226 +
  227 + // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
  228 + // 创建session,内部配置的是stateful
  229 + KieSession session = coreKBase.newKieSession();
  230 +
  231 + // 设置gloable对象,在drl中通过别名使用
  232 + session.setGlobal("results", ttInfoResults_output);
  233 + session.setGlobal("lpInfoResults_output", lpInfoResults_output);
  234 + session.setGlobal("log", logger); // 设置日志
  235 + session.setGlobal("tTInfoDetailRepository", ttInfoDetailRepository);
  236 +
  237 + // 载入数据
  238 + session.insert(ttInfoCalcuParam_input);
  239 + for (TTInfo ttInfo : ttInfos) {
  240 + TTInfo_input ttInfo_input = new TTInfo_input(ttInfo);
  241 + session.insert(ttInfo_input);
  242 + }
  243 +
  244 + // 载入数据2(计算规则最早启用时间)
  245 + List<ScheduleRule1Flat> scheduleRule1Flats = scheduleRule1FlatRepository.findByXl(line);
  246 +
  247 + for (ScheduleRule1Flat scheduleRule1Flat: scheduleRule1Flats) {
  248 + ScheduleRule_input scheduleRule_input = new ScheduleRule_input(scheduleRule1Flat);
  249 + session.insert(scheduleRule_input);
  250 + }
  251 +
  252 + // 执行rule
  253 + session.fireAllRules();
  254 +
  255 + // 执行完毕销毁,有日志的也要关闭
  256 + session.dispose();
  257 +
  258 + return new Object[] {ttInfoResults_output, lpInfoResults_output};
  259 +
  260 + }
  261 +
  262 + /**
  263 + * 循环规则输出。
  264 + * @param lpInfoResults_output 时刻表每日路牌的情况
  265 + */
  266 + private ScheduleResults_output loopRuleOutput(Line line, LpInfoResults_output lpInfoResults_output) {
  267 + // 1-1、构造drools规则输入数据,输出数据
  268 + // 全局计算参数
  269 + SchedulePlan schedulePlan = new SchedulePlan();
  270 + schedulePlan.setXl(line);
  271 + schedulePlan.setScheduleFromTime(this.from);
  272 + schedulePlan.setScheduleToTime(this.to);
  273 + schedulePlan.setIsHistoryPlanFirst(this.schedulePlan.getIsHistoryPlanFirst());
  274 + schedulePlan.setCreateBy(this.schedulePlan.getCreateBy());
  275 + ScheduleCalcuParam_input scheduleCalcuParam_input = new ScheduleCalcuParam_input(schedulePlan);
  276 + // 每个规则对应的输入参数
  277 + List<ScheduleRule_input> scheduleRule_inputs = this.calcuSrfList(line);
  278 +
  279 + // 规则输出数据
  280 + ScheduleResults_output scheduleResults_output = new ScheduleResults_output();
  281 +
  282 + // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
  283 + // 创建session,内部配置的是stateful
  284 + KieSession session = coreKBase.newKieSession();
  285 + // 设置gloable对象,在drl中通过别名使用
  286 + session.setGlobal("scheduleResult", scheduleResults_output);
  287 + session.setGlobal("log", logger); // 设置日志
  288 + session.setGlobal("scheduleRuleService", scheduleRuleService);
  289 +
  290 + // 载入数据
  291 + session.insert(scheduleCalcuParam_input);
  292 + for (ScheduleRule_input scheduleRule_input : scheduleRule_inputs) {
  293 + session.insert(scheduleRule_input);
  294 + }
  295 + // 每日时刻表路牌数据
  296 + for (LpInfoResult_output lpInfoResult_output: lpInfoResults_output.getLpInfoResult_outputs()) {
  297 + session.insert(lpInfoResult_output);
  298 + }
  299 + // 执行rule
  300 + session.fireAllRules();
  301 +
  302 + // 执行完毕销毁,有日志的也要关闭
  303 + session.dispose();
  304 +
  305 + // 保存循环规则结果数据
  306 + scheduleRuleService.generateRuleResult(scheduleResults_output.getSchedulePlanRuleResults());
  307 +
  308 +// logger.info("循环规则输出={}", scheduleResults_output.showGuideboardDesc1());
  309 +
  310 + return scheduleResults_output;
  311 + }
  312 +
  313 + /**
  314 + * 排班生成。
  315 + * @param scheduleResults_output loopRuleOutput方法规则输出
  316 + * @param ttInfoResults_output ttInfoOutput方法规则输出
  317 + * @return PlanResult
  318 + */
  319 + private PlanResult planResultOutput(
  320 + Line line,
  321 + ScheduleResults_output scheduleResults_output,
  322 + TTInfoResults_output ttInfoResults_output) {
  323 +
  324 + SchedulePlan schedulePlan = new SchedulePlan();
  325 + schedulePlan.setXl(line);
  326 + schedulePlan.setScheduleFromTime(this.from);
  327 + schedulePlan.setScheduleToTime(this.to);
  328 + schedulePlan.setCreateBy(this.schedulePlan.getCreateBy());
  329 + schedulePlan.setUpdateBy(this.schedulePlan.getUpdateBy());
  330 +
  331 + // 1-1、构造drools规则输入数据,输出数据
  332 + PlanCalcuParam_input planCalcuParam_input = new PlanCalcuParam_input(
  333 + schedulePlan,
  334 + scheduleResults_output,
  335 + ttInfoResults_output
  336 + );
  337 + // 规则输出数据
  338 + PlanResult planResult = new PlanResult();
  339 + planResult.setXlId(schedulePlan.getXl().getId().toString());
  340 +
  341 + // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
  342 + // 创建session,内部配置的是stateful
  343 + KieSession session = this.coreKBase.newKieSession();
  344 +
  345 + // 设置gloable对象,在drl中通过别名使用
  346 + session.setGlobal("planResult", planResult);
  347 + session.setGlobal("log", this.logger); // 设置日志
  348 +
  349 + session.setGlobal("tTInfoDetailRepository", this.ttInfoDetailRepository);
  350 + session.setGlobal("carConfigInfoRepository", this.carConfigInfoRepository);
  351 + session.setGlobal("employeeConfigInfoRepository", this.employeeConfigInfoRepository);
  352 + session.setGlobal("lineRepository", this.lineRepository);
  353 + session.setGlobal("businessRepository", this.businessRepository);
  354 +
  355 + // 载入数据
  356 + session.insert(planCalcuParam_input);
  357 +
  358 + // 执行rule
  359 + session.fireAllRules();
  360 +
  361 + // 执行完毕销毁,有日志的也要关闭
  362 + session.dispose();
  363 +
  364 + return planResult;
  365 +
  366 + }
  367 +
  368 + /**
  369 + * 生成线路排班(不含套跑规则)。
  370 + * @param schedulePlan
  371 + * @return
  372 + */
  373 + private PlanResult schedulePlanWithOutRerun() {
  374 + // 1、时刻表数据及每日路牌数据计算
  375 + Date start1 = new Date();
  376 + Object[] ttInfoRets = this.ttInfoOutput(this.mainLine);
  377 + TTInfoResults_output ttInfoResults_output = (TTInfoResults_output) ttInfoRets[0];
  378 + LpInfoResults_output lpInfoResults_output = (LpInfoResults_output) ttInfoRets[1];
  379 + Date end1 = new Date();
  380 + // 2、循环规则计算输出
  381 + Date start2 = new Date();
  382 + ScheduleResults_output scheduleResults_output = this.loopRuleOutput(
  383 + this.mainLine, lpInfoResults_output);
  384 + Date end2 = new Date();
  385 +
  386 + logger.info("规则计算结果={}", scheduleResults_output.showGuideboardDesc1());
  387 +
  388 + // 3、计划输出
  389 + Date start3 = new Date();
  390 + PlanResult planResult = planResultOutput(
  391 + this.mainLine, scheduleResults_output, ttInfoResults_output);
  392 + Date end3 = new Date();
  393 +
  394 + logger.info("drool时刻表每日路牌计算 {} ms,drool循环规则计算 {} ms,drool计划数据 {} ms",
  395 + end1.getTime() - start1.getTime(),
  396 + end2.getTime() - start2.getTime(),
  397 + end3.getTime() - start3.getTime());
  398 +
  399 + // TODO:将lpInfoResults_output 也要返回
  400 +
  401 + return planResult;
  402 + }
  403 +
  404 + /**
  405 + * 套跑计划排班数据。
  406 + * @param planResult
  407 + */
  408 + private void rerunPlanResult(PlanResult planResult) {
  409 + logger.info("套跑数量 {} 组", this.rerunRule_inputs.size());
  410 +
  411 + if (this.rerunRule_inputs.size() > 0) {
  412 + // 找出是对应路牌类型的线路,计算循环规则输出
  413 + Set<String> dylpxlids = new HashSet<>();
  414 + for (RerunRule_input rerunRule_input: rerunRule_inputs) {
  415 + if ("dylp".equals(rerunRule_input.getType())) {
  416 + dylpxlids.add(rerunRule_input.getS_xl()); // 参与套跑的线路
  417 + }
  418 + }
  419 +
  420 + List<ScheduleResults_output> scheduleResults_outputs = new ArrayList<>();
  421 + Date start1 = new Date();
  422 + for (String xlid: dylpxlids) {
  423 + Line dylpline = new Line(); // 套跑的线路默认跟着主线路设定走
  424 + dylpline.setId(Integer.parseInt(xlid));
  425 + // 获取套跑线路的循环规则计算输出
  426 + Object[] ttInfoRets = this.ttInfoOutput(dylpline);
  427 + LpInfoResults_output lpInfoResults_output = (LpInfoResults_output) ttInfoRets[1];
  428 + ScheduleResults_output scheduleResults_output = this.loopRuleOutput(
  429 + dylpline, lpInfoResults_output);
  430 + scheduleResults_outputs.add(scheduleResults_output);
  431 + }
  432 +
  433 + // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
  434 + // 创建session,内部配置的是stateful
  435 + KieSession session = this.coreKBase.newKieSession();
  436 +
  437 + // 设置gloable对象,在drl中通过别名使用
  438 + session.setGlobal("planResult", planResult);
  439 + session.setGlobal("log", this.logger); // 设置日志
  440 +
  441 + session.setGlobal("carConfigInfoRepository", this.carConfigInfoRepository);
  442 + session.setGlobal("employeeConfigInfoRepository", this.employeeConfigInfoRepository);
  443 +
  444 + // 载入数据
  445 + RerunRule_param rerunRule_param = new RerunRule_param();
  446 + rerunRule_param.setMxlid(planResult.getXlId());
  447 + rerunRule_param.setXlIds_dylp(dylpxlids);
  448 + session.insert(rerunRule_param);
  449 + for (RerunRule_input rri: this.rerunRule_inputs) {
  450 + session.insert(rri);
  451 + }
  452 + for (SchedulePlanInfo spi: planResult.getSchedulePlanInfos()) {
  453 + session.insert(spi);
  454 + }
  455 + for (ScheduleResults_output sro: scheduleResults_outputs) {
  456 + session.insert(sro);
  457 + }
  458 +
  459 + // 执行rule
  460 + session.fireAllRules();
  461 +
  462 + // 执行完毕销毁,有日志的也要关闭
  463 + session.dispose();
  464 +
  465 + Date end1 = new Date();
  466 + logger.info("套跑规则计算,耗时 {} ms", end1.getTime() - start1.getTime());
  467 +
  468 + }
  469 +
  470 + }
  471 +
  472 + /**
  473 + * 验证排班结果。
  474 + * @param planResult
  475 + * @param schedulePlan
  476 + */
  477 + public void validPlanResult(PlanResult planResult) {
  478 + // 1-1、构造drools规则输入数据,输出数据
  479 + ValidateParam validateParam = new ValidateParam(
  480 + new DateTime(this.from), new DateTime(this.to));
  481 + // 规则输出数据
  482 + ValidateResults_output result = new ValidateResults_output();
  483 +
  484 + // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
  485 + // 创建session,内部配置的是stateful
  486 + KieSession session = this.coreKBase.newKieSession();
  487 +
  488 + // 设置gloable对象,在drl中通过别名使用
  489 + session.setGlobal("validResult", result);
  490 + session.setGlobal("log", this.logger); // 设置日志
  491 +
  492 + // 载入数据
  493 + session.insert(validateParam);
  494 + for (SchedulePlanInfo schedulePlanInfo: planResult.getSchedulePlanInfos()) {
  495 + session.insert(schedulePlanInfo);
  496 + }
  497 +
  498 + // 执行rule
  499 + session.fireAllRules();
  500 +
  501 + // 执行完毕销毁,有日志的也要关闭
  502 + session.dispose();
  503 +
  504 +// logger.info("错误总数={}", result.getInfos().size());
  505 +// for (ValidateResults_output.ValidInfo validInfo: result.getInfos()) {
  506 +// logger.info(validInfo.getDesc());
  507 +// }
  508 +
  509 + // 取10条错误
  510 + int size = result.getInfos().size() > 10 ? 10: result.getInfos().size();
  511 + List<String> desclist = new ArrayList<>();
  512 + for (int i = 0; i < size; i++) {
  513 + desclist.add(result.getInfos().get(i).getDesc());
  514 + }
  515 + if (desclist.size() > 0) {
  516 + this.schedulePlan.setPlanResult(StringUtils.join(desclist, "</br>"));
  517 + } else {
  518 + this.schedulePlan.setPlanResult("ok");
  519 + }
  520 +
  521 + // TODO:设定错误信息
  522 + }
  523 +
  524 +}
... ...
src/main/java/com/bsth/service/schedule/rules/MyDroolsConfiguration.java
... ... @@ -28,7 +28,7 @@ public class MyDroolsConfiguration {
28 28 * 返回一个kiebase知识库,直接冲文件系统读入drl规则文件,
29 29 * TODO:以后需要从数据库读入规则文件,并重新创建kbase知识库。
30 30 */
31   - @Bean(name = "kb1")
  31 + @Bean(name = "coreKBase")
32 32 public KieBase myKieBase() {
33 33 // Drools 6开始引入kie统一接口(jboss的jbpm工作流也使用kie接口了),整个定义方式和5差别很大
34 34 // 这里使用全api方式创建知识库对象,不使用xml的方式,提供最大的灵活性
... ... @@ -105,7 +105,7 @@ public class MyDroolsConfiguration {
105 105 * 返回一个kiebase知识库,直接冲文件系统读入drl规则文件,
106 106 * TODO:以后需要从数据库读入规则文件,并重新创建kbase知识库。
107 107 */
108   - @Bean(name = "kb2")
  108 + @Bean(name = "preKBase")
109 109 public KieBase myKieBase2() {
110 110 // Drools 6开始引入kie统一接口(jboss的jbpm工作流也使用kie接口了),整个定义方式和5差别很大
111 111 // 这里使用全api方式创建知识库对象,不使用xml的方式,提供最大的灵活性
... ...
src/main/java/com/bsth/service/schedule/timetable/ExcelData.java 0 → 100644
  1 +package com.bsth.service.schedule.timetable;
  2 +
  3 +import com.bsth.entity.Line;
  4 +import com.bsth.entity.LsStationRoute;
  5 +import com.bsth.entity.schedule.GuideboardInfo;
  6 +import com.bsth.service.LineService;
  7 +import com.bsth.service.StationRouteService;
  8 +import com.bsth.service.schedule.GuideboardInfoService;
  9 +import com.bsth.service.schedule.exception.ScheduleException;
  10 +import com.bsth.service.schedule.utils.DataToolsFile;
  11 +import com.bsth.service.schedule.utils.DataToolsFileType;
  12 +import com.bsth.service.schedule.utils.PoiUtils;
  13 +import org.apache.commons.lang3.StringUtils;
  14 +import org.apache.poi.ss.usermodel.Cell;
  15 +import org.apache.poi.ss.usermodel.Row;
  16 +import org.apache.poi.ss.usermodel.Sheet;
  17 +import org.apache.poi.ss.usermodel.Workbook;
  18 +import org.springframework.util.CollectionUtils;
  19 +
  20 +import java.io.File;
  21 +import java.util.ArrayList;
  22 +import java.util.HashMap;
  23 +import java.util.List;
  24 +import java.util.Map;
  25 +import java.util.regex.Matcher;
  26 +import java.util.regex.Pattern;
  27 +
  28 +/**
  29 + * 时刻表Excel数据类。
  30 + */
  31 +public class ExcelData {
  32 +
  33 + /** 导入后的Excel文件对象 */
  34 + private DataToolsFile dataToolsFile;
  35 + /** 数据sheet名 */
  36 + private String sheetName;
  37 + /** 线路 */
  38 + private Line line;
  39 + /** 线路路由列表(包含上下行的起终点站) */
  40 + private List<LsStationRoute> lsStationRouteList;
  41 + /** 路牌列表 */
  42 + private List<GuideboardInfo> guideboardInfoList;
  43 + /** excel数据格式 */
  44 + private ExcelFormatType excelFormatType;
  45 +
  46 + public DataToolsFile getDataToolsFile() {
  47 + return dataToolsFile;
  48 + }
  49 +
  50 + public void setDataToolsFile(DataToolsFile dataToolsFile) {
  51 + this.dataToolsFile = dataToolsFile;
  52 + }
  53 +
  54 + public String getSheetName() {
  55 + return sheetName;
  56 + }
  57 +
  58 + public void setSheetName(String sheetName) {
  59 + this.sheetName = sheetName;
  60 + }
  61 +
  62 + public Line getLine() {
  63 + return line;
  64 + }
  65 +
  66 + public void setLine(Line line) {
  67 + this.line = line;
  68 + }
  69 +
  70 + public List<LsStationRoute> getLsStationRouteList() {
  71 + return lsStationRouteList;
  72 + }
  73 +
  74 + public void setLsStationRouteList(List<LsStationRoute> lsStationRouteList) {
  75 + this.lsStationRouteList = lsStationRouteList;
  76 + }
  77 +
  78 + public List<GuideboardInfo> getGuideboardInfoList() {
  79 + return guideboardInfoList;
  80 + }
  81 +
  82 + public void setGuideboardInfoList(List<GuideboardInfo> guideboardInfoList) {
  83 + this.guideboardInfoList = guideboardInfoList;
  84 + }
  85 +
  86 + public ExcelFormatType getExcelFormatType() {
  87 + return excelFormatType;
  88 + }
  89 +
  90 + public void setExcelFormatType(ExcelFormatType excelFormatType) {
  91 + this.excelFormatType = excelFormatType;
  92 + }
  93 +
  94 + /**
  95 + * 构造函数
  96 + * @param filePath 文件路径
  97 + * @param sheetName sheet名字
  98 + * @param lineId 线路Id
  99 + * @param lineService LineServiceImpl
  100 + * @param guideboardInfoService GuideboardInfoServiceImpl
  101 + * @param lineRouteVersion 线路路由版本
  102 + * @param stationRouteService StationRouteServiceImpl
  103 + * @param excelFormatType excel数据格式
  104 + * @throws ScheduleException
  105 + * @see com.bsth.service.impl.LineServiceImpl
  106 + * @see com.bsth.service.schedule.impl.GuideboardInfoServiceImpl
  107 + * @see com.bsth.service.impl.StationRouteServiceImpl
  108 + */
  109 + public ExcelData(
  110 + String filePath, String sheetName,
  111 + Integer lineId, LineService lineService, GuideboardInfoService guideboardInfoService,
  112 + Integer lineRouteVersion, StationRouteService stationRouteService,
  113 + ExcelFormatType excelFormatType) throws ScheduleException {
  114 + // 获取Excel文件对象,类型
  115 + File file = new File(filePath);
  116 + this.dataToolsFile = new DataToolsFile();
  117 + this.dataToolsFile.setFile(file);
  118 + if (DataToolsFileType.XLS.isThisType(file)) {
  119 + this.dataToolsFile.setFileType(DataToolsFileType.XLS);
  120 + } else if (DataToolsFileType.XLSX.isThisType(file)) {
  121 + this.dataToolsFile.setFileType(DataToolsFileType.XLSX);
  122 + } else {
  123 + throw new ScheduleException("不是xls xlsx文件!");
  124 + }
  125 +
  126 + // sheet名字
  127 + this.sheetName = sheetName;
  128 + // 线路
  129 + this.line = lineService.findById(lineId);
  130 + // 线路路由列表
  131 + Map<String, Object> p1 = new HashMap<>();
  132 + p1.put("line.id_eq", lineId);
  133 + p1.put("stationMark_in", "B,E"); // 起点站
  134 + p1.put("destroy_eq", 0); // 未撤销
  135 + p1.put("versions_eq", lineRouteVersion); // 带线路版本
  136 + lsStationRouteList = (List<LsStationRoute>) stationRouteService.list_ls(p1);
  137 + // 路牌列表
  138 + p1.clear();
  139 + p1.put("xl.id_eq", lineId);
  140 + p1.put("isCancel_eq", false);
  141 + guideboardInfoList = guideboardInfoService.list(p1);
  142 +
  143 + // excel数据格式
  144 + this.excelFormatType = excelFormatType;
  145 + }
  146 +
  147 + /**
  148 + * 验证路由名字。
  149 + * @param colNum 列标号(从0开始)
  150 + * @param routeName 路由名字
  151 + * @throws ScheduleException
  152 + */
  153 + private void validateRouteName(int colNum, String routeName) throws ScheduleException {
  154 + List<LsStationRoute> lsStationRoutes = new ArrayList<>();
  155 + for (LsStationRoute lsStationRoute : this.lsStationRouteList) {
  156 + if ("B".equals(lsStationRoute.getStationMark()) && routeName.equals(lsStationRoute.getStationName())) {
  157 + lsStationRoutes.add(lsStationRoute);
  158 + }
  159 + }
  160 +
  161 + if (CollectionUtils.isEmpty(lsStationRoutes)) {
  162 + throw new ScheduleException(String.format("第1行,第%d列数据%s在%s站点路由中不是起点站",
  163 + colNum + 1, routeName, this.line.getName()));
  164 + } else if (lsStationRoutes.size() > 1) {
  165 + throw new ScheduleException(String.format("第1行,第%d列数据%s在%s站点路由中上下行都是起点站",
  166 + colNum + 1, routeName, this.line.getName()));
  167 + } else if (StringUtils.isEmpty(lsStationRoutes.get(0).getStationCode())) {
  168 + throw new ScheduleException(String.format("第1行,第%d列数据%s在%s站点路由中没有站点编码",
  169 + colNum + 1, routeName, this.line.getName()));
  170 + }
  171 +
  172 + }
  173 +
  174 + /**
  175 + * 验证路牌名字。
  176 + * @param colNum excelSheet 列index
  177 + * @param guideboardName 路牌名字
  178 + * @throws ScheduleException
  179 + */
  180 + private void validateGuideboardName(int colNum, String guideboardName) throws ScheduleException {
  181 + List<GuideboardInfo> guideboardInfos = new ArrayList<>();
  182 + for (GuideboardInfo guideboardInfo : this.guideboardInfoList) {
  183 + if (guideboardName.equals(guideboardInfo.getLpName())) {
  184 + guideboardInfos.add(guideboardInfo);
  185 + }
  186 + }
  187 +
  188 + if (CollectionUtils.isEmpty(guideboardInfos)) {
  189 + throw new ScheduleException(String.format("第%d行,第1列的路牌在%s中不存在",
  190 + colNum + 1, this.line.getName()));
  191 + } else if (guideboardInfos.size() > 1) {
  192 + throw new ScheduleException(String.format("第%d行,第1列的路牌在%s中重复",
  193 + colNum + 1, this.line.getName()));
  194 + }
  195 + }
  196 +
  197 + /**
  198 + * 验证发车时间内容。
  199 + * @param rowNum excelSheet 行index
  200 + * @param colNum excelSheet 列index
  201 + * @param fcsjContent 发车时间内容
  202 + * @throws ScheduleException
  203 + */
  204 + private void validateFcsjContent(int rowNum, int colNum, String fcsjContent) throws ScheduleException {
  205 + if (this.excelFormatType == ExcelFormatType.Normal) {
  206 + // 班次时间验证,正则表达式,格式hh:mm或者hhmm
  207 + String rex1 = "^([01]?[0-9]|2[0-3]):[0-5][0-9]$"; // hh:mm格式
  208 + String rex2 = "^([01]?[0-9]|2[0-3]),[0-5][0-9]$"; // hh,mm格式
  209 + String rex3 = "^([01]?[0-9]|2[0-3])[0-5][0-9]$"; // hhmm格式
  210 + Pattern p1 = Pattern.compile(rex1);
  211 + Pattern p2 = Pattern.compile(rex2);
  212 + Pattern p3 = Pattern.compile(rex3);
  213 +
  214 + Matcher m1 = p1.matcher(fcsjContent.trim());
  215 + Matcher m2 = p2.matcher(fcsjContent.trim());
  216 + Matcher m3 = p3.matcher(fcsjContent.trim());
  217 + if ((!m1.matches()) && (!m2.matches()) && (!m3.matches())) {
  218 + throw new ScheduleException(String.format("第%d行,第%d列的发车时间格式不正确,格式应为hh:mm或hh,mm或hhmm",
  219 + rowNum + 1, colNum + 1));
  220 + }
  221 + } else if (this.excelFormatType == ExcelFormatType.Dynamic) {
  222 + String rex1 = "^(\u62a5|\u51fa)?([01]?[0-9]|2[0-3]):[0-5][0-9]$"; // (报|出)hh:mm格式
  223 + String rex2 = "^([01]?[0-9]|2[0-3]):[0-5][0-9](X|\u203b)?$"; // hh:mm(X|※)格式
  224 + Pattern p1 = Pattern.compile(rex1);
  225 + Pattern p2 = Pattern.compile(rex2);
  226 + Matcher m1 = p1.matcher(fcsjContent.trim());
  227 + Matcher m2 = p2.matcher(fcsjContent.trim());
  228 + if ((!m1.matches()) && (!m2.matches())) {
  229 + throw new ScheduleException(String.format(
  230 + "第%d行,第%d列的发车时间格式不正确,格式应为(报|出)hh:mm或hh:mm(X|※)",
  231 + rowNum + 1, colNum + 1));
  232 + }
  233 + } else {
  234 + throw new ScheduleException("未知ExcelFormatType");
  235 + }
  236 +
  237 + }
  238 +
  239 + private List<Integer> calcuExcelSheetColIndexList(Workbook workbook) throws ScheduleException {
  240 + // 有些列不需要参与计算,找出参与计算的列
  241 + List<Integer> colIndexList = new ArrayList<>();
  242 + Sheet sheet = workbook.getSheet(this.sheetName);
  243 + Row firstRow = sheet.getRow(0); // 获取第一行数据列
  244 + for (int i = 0; i < firstRow.getLastCellNum(); i++) {
  245 + if (excelFormatType == ExcelFormatType.Normal) {
  246 + colIndexList.add(i);
  247 + } else if (excelFormatType == ExcelFormatType.Dynamic) {
  248 + String cell_con = StringUtils.trimToEmpty(
  249 + PoiUtils.getStringValueFromCell(firstRow.getCell(i))); // trimToEmpty
  250 + if ("报到".equals(cell_con) ||
  251 + "到场".equals(cell_con) ||
  252 + "离场".equals(cell_con) ||
  253 + "总公里".equals(cell_con) ||
  254 + "营业公里".equals(cell_con) ||
  255 + "空驶公里".equals(cell_con) ||
  256 + "总工时".equals(cell_con) ||
  257 + "营业工时".equals(cell_con) ||
  258 + "营运班次".equals(cell_con)) {
  259 + // 这些列全部祛除
  260 + continue;
  261 + } else {
  262 + colIndexList.add(i);
  263 + }
  264 + } else {
  265 + throw new ScheduleException("未知excelFormatType");
  266 + }
  267 + }
  268 + return colIndexList;
  269 + }
  270 +
  271 + /**
  272 + * 验证老系统ExcelSheet格式。
  273 + * @throws ScheduleException
  274 + */
  275 + public void validateExcelSheet() throws ScheduleException {
  276 + try {
  277 + Workbook workbook = this.dataToolsFile.getFileType().getWorkBook(
  278 + this.dataToolsFile.getFile()
  279 + );
  280 +
  281 + Sheet sheet = workbook.getSheet(this.sheetName);
  282 + int rowNums = sheet.getLastRowNum() + 1; // 基于0 base的,长度加1
  283 + int colNums = sheet.getRow(0).getLastCellNum(); // 不需要加1,就是长度
  284 +
  285 + if (rowNums == 0 || colNums == 0) { // 工作区是否为空
  286 + throw new Exception(String.format("%s 工作区没有数据!", this.sheetName));
  287 + } else {
  288 + if (rowNums <= 1 || rowNums <= 1) {
  289 + throw new Exception(String.format("工作区至少包含2行2列的数据"));
  290 + } else {
  291 + List<Integer> colIndexList = this.calcuExcelSheetColIndexList(workbook);
  292 + Row firstRow = sheet.getRow(0); // 获取第一行数据列
  293 + for (int n = 0; n < colIndexList.size(); n++) {
  294 + int i = colIndexList.get(n);
  295 + String cell_con = StringUtils.trimToEmpty(
  296 + PoiUtils.getStringValueFromCell(firstRow.getCell(i))); // trimToEmpty
  297 +
  298 + if (StringUtils.isEmpty(cell_con)) {
  299 + throw new Exception(String.format("第1行,第%d列数据不能为空", i + 1));
  300 + } else {
  301 + // 正则表达式去除右侧数字
  302 +// cell_con = cell_con.replaceAll("[\\d+]", "");
  303 +// cell_con = cell_con.replaceAll("(\\d+)$", "");
  304 +
  305 + // 如果站名中有类似->{数字},使用正则表达式过滤掉
  306 + cell_con = cell_con.replaceAll("(->\\d+)", "");
  307 +
  308 + if (i == 0) { // 第一列必须是路牌2个字
  309 + if (!"路牌".equals(cell_con.trim())) {
  310 + throw new Exception("第1行,第1列数据必须是路牌2个字");
  311 + }
  312 + } else { // 排除出场,进场,其余内容到站点路由里查询,以各个方向的起点站为查询依据
  313 + if ((!"出场".equals(cell_con.trim())) &&
  314 + (!"进场".equals(cell_con.trim()))) {
  315 + validateRouteName(i, cell_con.trim()); // 验证路由名字
  316 + }
  317 +
  318 + }
  319 + }
  320 + }
  321 +
  322 + // 验证路牌内容
  323 + Map<String, Integer> gbindexmap = new HashMap<>(); // 记录每个路牌在第几行
  324 + for (int i = 1; i < rowNums; i++) { // 从第2行开始验证数据
  325 + Cell cell = sheet.getRow(i).getCell(0); // 获取第1列
  326 + String bcell_con = StringUtils.trimToEmpty(
  327 + PoiUtils.getStringValueFromCell(cell)); // trimToEmpty
  328 + if (StringUtils.isEmpty(bcell_con)) {
  329 + throw new Exception(String.format("第%d行,第1列路牌无数据", i + 1));
  330 + } else if (gbindexmap.get(bcell_con.trim()) != null) {
  331 + throw new Exception(String.format("第%d行,第1列的路牌数据与第%d行,第1列数据重复",
  332 + i + 1,
  333 + gbindexmap.get(bcell_con.trim())));
  334 + } else {
  335 + validateGuideboardName(i, bcell_con.trim()); // 验证路牌名字
  336 + gbindexmap.put(bcell_con.trim(), i + 1);
  337 + }
  338 + }
  339 +
  340 + // 验证发车时间格式
  341 + for (int i = 1; i < rowNums; i++) { // 从第2行开始验证数据
  342 + Row row = sheet.getRow(i);
  343 + for (int n = 1; n < colIndexList.size(); n++) { // 从第2列开始
  344 + int j = colIndexList.get(n);
  345 + String bcell_con = StringUtils.trimToEmpty(
  346 + PoiUtils.getStringValueFromCell(
  347 + row.getCell(j))).replaceAll("\\s*", ""); // trimToEmpty
  348 + if (StringUtils.isNotEmpty(bcell_con)) {
  349 + validateFcsjContent(i, j, bcell_con);
  350 + }
  351 + }
  352 + }
  353 + }
  354 +
  355 + }
  356 +
  357 + } catch (Exception exp) {
  358 + exp.printStackTrace();
  359 + throw new ScheduleException(exp.getMessage());
  360 + }
  361 + }
  362 +
  363 +}
... ...
src/main/java/com/bsth/service/schedule/timetable/ExcelFormatType.java 0 → 100644
  1 +package com.bsth.service.schedule.timetable;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonCreator;
  4 +import com.fasterxml.jackson.annotation.JsonValue;
  5 +
  6 +/**
  7 + * 导入时刻表时,excel的数据格式类型。
  8 + */
  9 +public enum ExcelFormatType {
  10 + Normal("normal"), // 老系统格式
  11 + Dynamic("dynamic"); // 自动生成的导出格式
  12 +
  13 + private String flag;
  14 +
  15 + @JsonCreator
  16 + ExcelFormatType(String flag) {
  17 + this.flag = flag;
  18 + }
  19 +
  20 + @JsonValue
  21 + public String getFlag() {
  22 + return flag;
  23 + }
  24 +
  25 + public void setFlag(String flag) {
  26 + this.flag = flag;
  27 + }
  28 +
  29 + public static ExcelFormatType getEnum(String str) {
  30 + if ("normal".equals(str)) {
  31 + return Normal;
  32 + } else if ("dynamic".equals(str)) {
  33 + return Dynamic;
  34 + } else {
  35 + throw new IllegalArgumentException("未知ExcelFormatType");
  36 + }
  37 + }
  38 +}
... ...
src/main/java/com/bsth/service/schedule/utils/DataToolsFileType.java
... ... @@ -76,7 +76,8 @@ public enum DataToolsFileType {
76 76  
77 77 // application/x-tika-ooxml
78 78 if ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet".equals(type) ||
79   - "application/x-tika-ooxml".equals(type)) {
  79 + "application/x-tika-ooxml".equals(type) ||
  80 + "application/zip".equals(type)) {
80 81 // .xlsx 2007之后的格式
81 82 return true;
82 83 } else {
... ...
src/main/java/com/bsth/service/schedule/utils/DataToolsProperties.java
... ... @@ -81,6 +81,9 @@ public class DataToolsProperties {
81 81 /** 时刻表明细信息导入2(带版本) */
82 82 @NotNull
83 83 private String ttinfodetailDatainputktr2version;
  84 + /** 时刻表明细信息导入2(带版本),使用生成时刻表格式 */
  85 + @NotNull
  86 + private String ttinfodetailDatainputktr2version2;
84 87 /** 排班规则信息导入 */
85 88 @NotNull
86 89 private String scheduleruleDatainputktr;
... ... @@ -353,4 +356,12 @@ public class DataToolsProperties {
353 356 public void setTransTemplatedir(String transTemplatedir) {
354 357 this.transTemplatedir = transTemplatedir;
355 358 }
  359 +
  360 + public String getTtinfodetailDatainputktr2version2() {
  361 + return ttinfodetailDatainputktr2version2;
  362 + }
  363 +
  364 + public void setTtinfodetailDatainputktr2version2(String ttinfodetailDatainputktr2version2) {
  365 + this.ttinfodetailDatainputktr2version2 = ttinfodetailDatainputktr2version2;
  366 + }
356 367 }
... ...
src/main/java/com/bsth/service/schedule/utils/PoiUtils.java
... ... @@ -2,7 +2,6 @@ package com.bsth.service.schedule.utils;
2 2  
3 3 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
4 4 import org.apache.poi.ss.usermodel.*;
5   -import org.apache.poi.ss.util.WorkbookUtil;
6 5 import org.apache.poi.xssf.usermodel.*;
7 6  
8 7 import java.awt.Color;
... ... @@ -58,7 +57,7 @@ public class PoiUtils {
58 57 public static XSSFCell createStringXSSFCell(
59 58 XSSFWorkbook xssfWorkbook, XSSFRow xssfRow, short column, String value,
60 59 Color backgroundColor) {
61   - return createXSSFCell(
  60 + XSSFCell xssfCell = createXSSFCell(
62 61 xssfWorkbook, xssfRow, column,
63 62 value, XSSFCell.CELL_TYPE_STRING,
64 63 HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
... ... @@ -66,11 +65,14 @@ public class PoiUtils {
66 65 (short) 13, new Color(0x2765A7), "宋体",
67 66 backgroundColor, FillPatternType.SOLID_FOREGROUND
68 67 );
  68 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  69 + xssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("@"));
  70 + return xssfCell;
69 71 }
70 72  
71 73 public static XSSFCell createStringXSSFCell(
72 74 XSSFWorkbook xssfWorkbook, XSSFRow xssfRow, short column, String value) {
73   - return createXSSFCell(
  75 + XSSFCell xssfCell = createXSSFCell(
74 76 xssfWorkbook, xssfRow, column,
75 77 value, XSSFCell.CELL_TYPE_STRING,
76 78 HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
... ... @@ -78,6 +80,9 @@ public class PoiUtils {
78 80 (short) 13, new Color(0x2765A7), "宋体",
79 81 new Color(0xffffff), FillPatternType.SOLID_FOREGROUND
80 82 );
  83 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  84 + xssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("@"));
  85 + return xssfCell;
81 86 }
82 87  
83 88 public static XSSFCell createDoubleXSSFCell(
... ... @@ -120,6 +125,12 @@ public class PoiUtils {
120 125 );
121 126 }
122 127  
  128 + public static XSSFCell setStringStyleXSSFCellStyle(XSSFWorkbook xssfWorkbook, XSSFCell xssfCell) {
  129 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  130 + xssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("@"));
  131 + return xssfCell;
  132 + }
  133 +
123 134 public static XSSFCell setIntegerStyleXSSFCellStyle(XSSFWorkbook xssfWorkbook, XSSFCell xssfCell) {
124 135 CreationHelper creationHelper = xssfWorkbook.getCreationHelper();
125 136 XSSFCellStyle xssfCellStyle = xssfCell.getCellStyle();
... ... @@ -150,8 +161,9 @@ public class PoiUtils {
150 161  
151 162 // 设定值
152 163 if (valueType == XSSFCell.CELL_TYPE_STRING) {
153   - cell.setCellValue(creationHelper.createRichTextString(
154   - WorkbookUtil.createSafeSheetName(String.valueOf(value))));
  164 +// cell.setCellValue(creationHelper.createRichTextString(
  165 +// WorkbookUtil.createSafeSheetName(String.valueOf(value))));
  166 + cell.setCellValue(creationHelper.createRichTextString(String.valueOf(value)));
155 167 } else if (valueType == XSSFCell.CELL_TYPE_NUMERIC) {
156 168 if (value instanceof Date) { // 日期
157 169 cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-mm-dd"));
... ...
src/main/java/com/bsth/service/traffic/impl/VehicleInoutStopServiceImpl.java
... ... @@ -8,7 +8,6 @@ import com.bsth.util.DateUtils;
8 8 import com.bsth.util.db.DBUtils_MS;
9 9 import org.slf4j.Logger;
10 10 import org.slf4j.LoggerFactory;
11   -import org.springframework.beans.factory.annotation.Autowired;
12 11 import org.springframework.jdbc.core.JdbcTemplate;
13 12 import org.springframework.stereotype.Service;
14 13  
... ...
src/main/java/com/bsth/util/db/DBUtils_traffic.java 0 → 100644
  1 +package com.bsth.util.db;
  2 +
  3 +import com.mchange.v2.c3p0.DataSources;
  4 +import org.apache.log4j.Logger;
  5 +
  6 +import javax.sql.DataSource;
  7 +import java.io.FileNotFoundException;
  8 +import java.io.IOException;
  9 +import java.sql.Connection;
  10 +import java.sql.ResultSet;
  11 +import java.sql.SQLException;
  12 +import java.sql.Statement;
  13 +import java.util.HashMap;
  14 +import java.util.Map;
  15 +import java.util.Properties;
  16 +
  17 +/**
  18 + * 网关ms库连接池
  19 + * @author PanZhao
  20 + *
  21 + */
  22 +//@Component
  23 +public class DBUtils_traffic {
  24 +
  25 + private static String url = null;
  26 +
  27 + private static String username = null;
  28 +
  29 + private static String pwd = null;
  30 +
  31 + private static DataSource ds_pooled;
  32 +
  33 + static Logger logger = Logger.getLogger(DBUtils_traffic.class);
  34 +
  35 + static {
  36 + Properties env = new Properties();
  37 +
  38 + try {
  39 + env.load(DBUtils_traffic.class.getClassLoader().getResourceAsStream("traffic-jdbc.properties"));
  40 + // 1. 加载驱动类
  41 + Class.forName(env.getProperty("ms.mysql.driver"));
  42 +
  43 + url = env.getProperty("ms.mysql.url");
  44 + username = env.getProperty("ms.mysql.username");
  45 + pwd = env.getProperty("ms.mysql.password");
  46 +
  47 + // 设置连接数据库的配置信息
  48 + DataSource ds_unpooled = DataSources.unpooledDataSource(url,
  49 + username, pwd);
  50 +
  51 + Map<String, Object> pool_conf = new HashMap<String, Object>();
  52 + // 设置最大连接数
  53 + pool_conf.put("maxPoolSize", 10);
  54 +
  55 + pool_conf.put("testConnectionOnCheckout", false);
  56 + //异步检测连接的有效性
  57 + pool_conf.put("testConnectionOnCheckin", true);
  58 + //30秒检测一次
  59 + pool_conf.put("idleConnectionTestPeriod", 30);
  60 + ds_pooled = DataSources.pooledDataSource(ds_unpooled, pool_conf);
  61 + } catch (FileNotFoundException e) {
  62 + logger.error(e.toString());
  63 + e.printStackTrace();
  64 + } catch (IOException e) {
  65 + logger.error(e.toString());
  66 + e.printStackTrace();
  67 + } catch (ClassNotFoundException e) {
  68 + logger.error(e.toString());
  69 + e.printStackTrace();
  70 + } catch (SQLException e) {
  71 + logger.error(e.toString());
  72 + e.printStackTrace();
  73 + }
  74 + }
  75 +
  76 + /**
  77 + * 获取连接对象
  78 + */
  79 + public static Connection getConnection() throws SQLException {
  80 + return ds_pooled.getConnection();
  81 + }
  82 +
  83 + /**
  84 + * 释放连接池资源
  85 + */
  86 + public static void clearup() {
  87 + if (ds_pooled != null) {
  88 + try {
  89 + DataSources.destroy(ds_pooled);
  90 + } catch (SQLException e) {
  91 + logger.error(e.toString());
  92 + e.printStackTrace();
  93 + }
  94 + }
  95 + }
  96 +
  97 + /**
  98 + * 资源关闭
  99 + *
  100 + * @param rs
  101 + * @param stmt
  102 + * @param conn
  103 + */
  104 + public static void close(ResultSet rs, Statement stmt, Connection conn) {
  105 + if (rs != null) {
  106 + try {
  107 + rs.close();
  108 + } catch (SQLException e) {
  109 + logger.error(e.toString());
  110 + e.printStackTrace();
  111 + }
  112 + }
  113 +
  114 + if (stmt != null) {
  115 + try {
  116 + stmt.close();
  117 + } catch (SQLException e) {
  118 + logger.error(e.toString());
  119 + e.printStackTrace();
  120 + }
  121 + }
  122 +
  123 + if (conn != null) {
  124 + try {
  125 + conn.close();
  126 + } catch (SQLException e) {
  127 + logger.error(e.toString());
  128 + e.printStackTrace();
  129 + }
  130 + }
  131 + }
  132 +
  133 + public static DataSource getDataSource(){
  134 + return ds_pooled;
  135 + }
  136 +}
... ...
src/main/resources/datatools/config-dev.properties
... ... @@ -10,7 +10,7 @@ datatools.kvars_dbuname=root
10 10 #数据库密码
11 11 datatools.kvars_dbpwd=
12 12 #数据库库名
13   -datatools.kvars_dbdname=control
  13 +datatools.kvars_dbdname=test_control
14 14  
15 15 # 3、上传数据配置信息
16 16 # 上传文件目录配置(根据不同的环境需要修正)
... ... @@ -41,6 +41,8 @@ datatools.ttinfodetail_datainputktr=/datatools/ktrs/ttinfodetailDataInput.ktr
41 41 datatools.ttinfodetail_datainputktr2=/datatools/ktrs/ttinfodetailDataInput2.ktr
42 42 # 时刻表明细信息导入2(版本化)
43 43 datatools.ttinfodetail_datainputktr2version=/datatools/ktrs/ttinfodetailDataInput2_version.ktr
  44 +# 时刻表明细信息导入2(版本化),使用生成时刻表格式
  45 +datatools.ttinfodetail_datainputktr2version2=/datatools/ktrs/ttinfodetailDataInput2_version_2.ktr
44 46  
45 47 # 车辆配置信息导入
46 48 datatools.carsconfig_datainputktr=/datatools/ktrs/carsConfigDataInput.ktr
... ...
src/main/resources/datatools/config-prod.properties
... ... @@ -42,6 +42,8 @@ datatools.ttinfodetail_datainputktr=/datatools/ktrs/ttinfodetailDataInput.ktr
42 42 datatools.ttinfodetail_datainputktr2=/datatools/ktrs/ttinfodetailDataInput2.ktr
43 43 # 时刻表明细信息导入2(版本化)
44 44 datatools.ttinfodetail_datainputktr2version=/datatools/ktrs/ttinfodetailDataInput2_version.ktr
  45 +# 时刻表明细信息导入2(版本化),使用生成时刻表格式
  46 +datatools.ttinfodetail_datainputktr2version2=/datatools/ktrs/ttinfodetailDataInput2_version_2.ktr
45 47  
46 48 # 车辆配置信息导入
47 49 datatools.carsconfig_datainputktr=/datatools/ktrs/carsConfigDataInput.ktr
... ...