Commit 1171b75a948a9795eb7a723fdb8c685063e69a7e

Authored by zq
2 parents 9b08286f f02cd88a

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

Showing 80 changed files with 2338 additions and 1509 deletions

Too many changes to show.

To preserve performance only 80 of 124 files are displayed.

... ... @@ -155,6 +155,12 @@
155 155 <version>2.1.8</version>
156 156 </dependency>
157 157  
  158 + <dependency>
  159 + <groupId>org.apache.tika</groupId>
  160 + <artifactId>tika-core</artifactId>
  161 + <version>1.7</version>
  162 + </dependency>
  163 +
158 164 <!-- pentaho kettle 依赖 -->
159 165 <dependency>
160 166 <groupId>com.pentaho.kettle</groupId>
... ...
src/main/java/com/bsth/controller/DownloadController.java
... ... @@ -2,6 +2,7 @@ package com.bsth.controller;
2 2  
3 3 import java.io.File;
4 4 import java.io.IOException;
  5 +import java.net.URLDecoder;
5 6  
6 7 import org.apache.commons.io.FileUtils;
7 8 import org.springframework.context.annotation.Scope;
... ... @@ -35,7 +36,7 @@ public class DownloadController
35 36 File file=new File(moudelPath);
36 37 HttpHeaders headers = new HttpHeaders();
37 38 String realFileName=new String(fileName.getBytes("UTF-8"),"iso-8859-1");//为了解决中文名称乱码问题
38   - headers.setContentDispositionFormData("attachment", realFileName);
  39 + headers.setContentDispositionFormData("attachment", URLDecoder.decode(realFileName,"utf-8"));
39 40 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
40 41 return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
41 42 headers, HttpStatus.CREATED);
... ...
src/main/java/com/bsth/controller/oil/YlbController.java
... ... @@ -106,24 +106,24 @@ public class YlbController extends BaseController&lt;Ylb, Integer&gt;{
106 106 @RequestParam(defaultValue = "DESC") String direction){
107 107  
108 108 Direction d;
109   - try {
  109 +// try {
110 110 String rq=map.get("rq").toString();
111 111 if(!(rq=="")){
112   -
113   - SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
114   - Calendar calendar = new GregorianCalendar();
115   - calendar.setTime(sdf.parse(rq));
116   - calendar.add(calendar.DATE,1);
117   - Date date=calendar.getTime();
118   - map.put("rq_ge", rq);
119   - map.put("rq_le", sdf.format(date));
120   - System.out.println(rq);
121   - System.out.println(sdf.format(date));
122   - }
123   - } catch (ParseException e) {
124   - // TODO Auto-generated catch block
125   - e.printStackTrace();
  112 +//
  113 +// SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  114 +// Calendar calendar = new GregorianCalendar();
  115 +// calendar.setTime(sdf.parse(rq));
  116 +// calendar.add(calendar.DATE,1);
  117 +// Date date=calendar.getTime();
  118 + map.put("rq_eq", rq);
  119 +// map.put("rq_lt", sdf.format(date));
  120 +// System.out.println(rq);
  121 +// System.out.println(sdf.format(date));
126 122 }
  123 +// } catch (ParseException e) {
  124 +// // TODO Auto-generated catch block
  125 +// e.printStackTrace();
  126 +// }
127 127 if(null != direction && direction.equals("ASC"))
128 128 d = Direction.ASC;
129 129 else
... ...
src/main/java/com/bsth/controller/realcontrol/RealMapController.java
... ... @@ -59,4 +59,14 @@ public class RealMapController {
59 59 public Map<String, Object> findRouteAndStationByLine(@RequestParam String lineCode){
60 60 return realMapService.findRouteAndStationByLine(lineCode);
61 61 }
  62 +
  63 + /**
  64 + * 获取多个线路的路段信息(为前端越界计算提供数据)
  65 + * @param codeIdx
  66 + * @return
  67 + */
  68 + @RequestMapping(value = "/multiSectionRoute")
  69 + public Map<String, Object> multiSectionRoute(@RequestParam String codeIdx){
  70 + return realMapService.multiSectionRoute(codeIdx);
  71 + }
62 72 }
... ...
src/main/java/com/bsth/controller/realcontrol/ScheduleRealInfoController.java
... ... @@ -310,8 +310,8 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo,
310 310  
311 311 @RequestMapping(value = "/historyMessage")
312 312 public List<Object[]> historyMessage(@RequestParam String line, @RequestParam String date,
313   - @RequestParam String code) {
314   - return scheduleRealInfoService.historyMessage(line, date, code);
  313 + @RequestParam String code, @RequestParam String type) {
  314 + return scheduleRealInfoService.historyMessage(line, date, code, type);
315 315 }
316 316  
317 317 @RequestMapping(value="/findLine")
... ... @@ -332,14 +332,14 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo,
332 332  
333 333 @RequestMapping(value = "/account")
334 334 public List<Map<String,Object>> account(@RequestParam String line, @RequestParam String date,
335   - @RequestParam String code,@RequestParam String xlName) {
336   - return scheduleRealInfoService.account(line, date, code,xlName);
  335 + @RequestParam String code,@RequestParam String xlName, @RequestParam String type) {
  336 + return scheduleRealInfoService.account(line, date, code, xlName, type);
337 337 }
338 338  
339 339 @RequestMapping(value = "/correctForm")
340 340 public List<ScheduleRealInfo> correctForm(@RequestParam String line, @RequestParam String startDate,
341   - @RequestParam String endDate,@RequestParam String lpName,@RequestParam String code) {
342   - return scheduleRealInfoService.correctForm(line, startDate, endDate, lpName, code);
  341 + @RequestParam String endDate, @RequestParam String lpName, @RequestParam String code, @RequestParam String type) {
  342 + return scheduleRealInfoService.correctForm(line, startDate, endDate, lpName, code, type);
343 343 }
344 344 /**
345 345 * @Title queryListWaybill
... ...
src/main/java/com/bsth/controller/schedule/BController.java
... ... @@ -5,16 +5,21 @@ import com.bsth.common.ResponseCode;
5 5 import com.bsth.entity.schedule.BEntity;
6 6 import com.bsth.entity.sys.SysUser;
7 7 import com.bsth.service.schedule.BService;
8   -import com.bsth.service.schedule.ScheduleException;
  8 +import com.bsth.service.schedule.exception.ScheduleException;
9 9 import com.bsth.service.sys.SysUserService;
10 10 import com.google.common.base.Splitter;
  11 +import jxl.Sheet;
  12 +import jxl.Workbook;
  13 +import org.apache.commons.lang3.StringUtils;
11 14 import org.springframework.beans.factory.annotation.Autowired;
12 15 import org.springframework.data.domain.PageRequest;
13 16 import org.springframework.data.domain.Sort;
14 17 import org.springframework.web.bind.annotation.*;
  18 +import org.springframework.web.multipart.MultipartFile;
15 19  
  20 +import javax.servlet.http.HttpServletResponse;
16 21 import javax.servlet.http.HttpSession;
17   -import java.io.Serializable;
  22 +import java.io.*;
18 23 import java.util.*;
19 24  
20 25 /**
... ... @@ -26,7 +31,7 @@ public class BController&lt;T, ID extends Serializable&gt; {
26 31 @Autowired
27 32 private SysUserService sysUserService;
28 33  
29   - // CRUD 操作
  34 + //---------------- CRUD 操作 ----------------//
30 35 // Create操作
31 36 @RequestMapping(method = RequestMethod.POST)
32 37 public Map<String, Object> save(@RequestBody T t, HttpSession httpSession) {
... ... @@ -73,6 +78,7 @@ public class BController&lt;T, ID extends Serializable&gt; {
73 78 rtn.put("data", t);
74 79 return rtn;
75 80 }
  81 + // 查询所有操作
76 82 @RequestMapping(value = "/all", method = RequestMethod.GET)
77 83 public Map<String, Object> list(@RequestParam Map<String, Object> param) {
78 84 List<T> tList = bService.list(param);
... ... @@ -81,6 +87,7 @@ public class BController&lt;T, ID extends Serializable&gt; {
81 87 rtn.put("data", tList);
82 88 return rtn;
83 89 }
  90 + // 分页查询操作
84 91 @RequestMapping(method = RequestMethod.GET)
85 92 public Map<String, Object> list(
86 93 @RequestParam Map<String, Object> map,
... ... @@ -138,4 +145,99 @@ public class BController&lt;T, ID extends Serializable&gt; {
138 145 return rtn;
139 146 }
140 147  
  148 + //---------------- 数据服务操作 ----------------//
  149 + // 上传excel文件
  150 + @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
  151 + public Map<String, Object> uploadFile(MultipartFile file) {
  152 + Map<String, Object> rtn = new HashMap<>();
  153 + try {
  154 + File file1 = bService.uploadFile(file.getOriginalFilename(), file.getBytes());
  155 + // excel文件名
  156 + String fileName = file1.getAbsolutePath();
  157 + // excel文件sheet
  158 + List<String> sheetnames = new ArrayList<>();
  159 + Workbook book = Workbook.getWorkbook(file1);
  160 + for (Sheet sheet : book.getSheets()) {
  161 + sheetnames.add(sheet.getName());
  162 + }
  163 +
  164 + rtn.put("status", ResponseCode.SUCCESS);
  165 + rtn.put("filename", fileName);
  166 + rtn.put("sheetnames", StringUtils.join(sheetnames, ","));
  167 + } catch (Exception exp) {
  168 + rtn.put("status", ResponseCode.ERROR);
  169 + rtn.put("msg", exp.getMessage());
  170 + }
  171 + return rtn;
  172 + }
  173 +
  174 + // 导入excel文件
  175 + @RequestMapping(value = "/importFile", method = RequestMethod.POST)
  176 + public Map<String, Object> importFile(@RequestParam Map<String, Object> params) {
  177 + Map<String, Object> rtn = new HashMap<>();
  178 +
  179 + try {
  180 + File file = new File(String.valueOf(params.get("filename")));
  181 + if (!file.exists()) {
  182 + throw new Exception("导入文件不存在!");
  183 + }
  184 + bService.importData(file, params);
  185 +
  186 + rtn.put("status", ResponseCode.SUCCESS);
  187 + rtn.put("msg", "导入文件成功");
  188 + } catch (Exception exp) {
  189 + rtn.put("status", ResponseCode.ERROR);
  190 + rtn.put("msg", exp.getMessage());
  191 + }
  192 +
  193 + return rtn;
  194 + }
  195 +
  196 + // 上传并导入excel文件
  197 + @RequestMapping(value = "/uploadAndImportFile", method = RequestMethod.POST)
  198 + public Map<String, Object> uploadAndImportFile(MultipartFile file) {
  199 + Map<String, Object> rtn = new HashMap<>();
  200 +
  201 + try {
  202 + File file1 = bService.uploadFile(file.getOriginalFilename(), file.getBytes());
  203 + Map<String, Object> params = new HashMap<>();
  204 + bService.importData(file1, params);
  205 +
  206 + rtn.put("status", ResponseCode.SUCCESS);
  207 + rtn.put("msg", "上传&导入文件成功");
  208 + } catch (Exception exp) {
  209 + rtn.put("status", ResponseCode.ERROR);
  210 + rtn.put("msg", exp.getMessage());
  211 + }
  212 +
  213 + return rtn;
  214 + }
  215 +
  216 + // 导出数据到xls文件
  217 + @RequestMapping(value = "/exportFile", method = RequestMethod.GET)
  218 + public void exportFile(HttpServletResponse response,
  219 + @RequestParam Map<String, Object> params) throws Exception {
  220 + File file = bService.exportData(params);
  221 + // 流输出导出文件
  222 + response.setHeader("content-type", "application/octet-stream");
  223 + response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
  224 + response.setContentType("application/octet-stream");
  225 +
  226 + OutputStream os = response.getOutputStream();
  227 + BufferedOutputStream bos = new BufferedOutputStream(os);
  228 +
  229 + InputStream is = new FileInputStream(file);
  230 + BufferedInputStream bis = new BufferedInputStream(is);
  231 +
  232 + int length = 0;
  233 + byte[] temp = new byte[1 * 1024 * 10];
  234 + while ((length = bis.read(temp)) != -1) {
  235 + bos.write(temp, 0, length);
  236 + }
  237 + bos.flush();
  238 + bis.close();
  239 + bos.close();
  240 + is.close();
  241 + }
  242 +
141 243 }
... ...
src/main/java/com/bsth/controller/schedule/TTInfoDetailController.java deleted 100644 → 0
1   -package com.bsth.controller.schedule;
2   -
3   -import com.bsth.common.ResponseCode;
4   -import com.bsth.controller.BaseController2;
5   -import com.bsth.entity.CarPark;
6   -import com.bsth.entity.LineInformation;
7   -import com.bsth.entity.StationRoute;
8   -import com.bsth.entity.schedule.GuideboardInfo;
9   -import com.bsth.entity.schedule.TTInfoDetail;
10   -import com.bsth.repository.schedule.TTInfoDetailRepository;
11   -import com.bsth.service.CarParkService;
12   -import com.bsth.service.LineInformationService;
13   -import com.bsth.service.StationRouteService;
14   -import com.bsth.service.schedule.GuideboardInfoService;
15   -import com.bsth.service.schedule.TTInfoDetailService;
16   -import com.bsth.service.schedule.utils.DataImportExportService;
17   -import com.bsth.service.schedule.utils.DataToolsProperties;
18   -import jxl.Cell;
19   -import jxl.Sheet;
20   -import jxl.Workbook;
21   -import jxl.write.Label;
22   -import jxl.write.WritableSheet;
23   -import jxl.write.WritableWorkbook;
24   -import org.apache.commons.lang3.StringUtils;
25   -import org.springframework.beans.factory.annotation.Autowired;
26   -import org.springframework.util.CollectionUtils;
27   -import org.springframework.web.bind.annotation.*;
28   -import org.springframework.web.multipart.MultipartFile;
29   -
30   -import javax.servlet.http.HttpServletResponse;
31   -import java.io.File;
32   -import java.util.*;
33   -import java.util.regex.Matcher;
34   -import java.util.regex.Pattern;
35   -
36   -/**
37   - * Created by xu on 16/7/2.
38   - */
39   -@RestController
40   -@RequestMapping("tidc")
41   -public class TTInfoDetailController extends BaseController2<TTInfoDetail, Long> {
42   - @Autowired
43   - private TTInfoDetailService ttInfoDetailService;
44   - @Autowired
45   - private CarParkService carParkService;
46   - @Autowired
47   - private LineInformationService lineInformationService;
48   - @Autowired
49   - private TTInfoDetailRepository ttInfoDetailRepository;
50   - @Autowired
51   - private DataImportExportService dataImportExportService;
52   - @Autowired
53   - private StationRouteService stationRouteService;
54   - @Autowired
55   - private GuideboardInfoService guideboardInfoService;
56   - @Autowired
57   - private DataToolsProperties dataToolsProperties;
58   -
59   - /**
60   - * 1、上传Excel文件,返回文件全路径名,工作区名称列表。
61   - * @param file
62   - * @return
63   - * @throws Exception
64   - */
65   -
66   -
67   - /**
68   - * 2、验证sheet(以后放到规则引擎里去做)。
69   - * @param filename excel文件全路径名
70   - * @param sheetname sheet名字
71   - * @param lineid 线路id
72   - * @param linename 线路名称
73   - * @return
74   - */
75   - @RequestMapping(value = "/validate/sheet", method = RequestMethod.POST)
76   - public Map<String, Object> validateSheet(String filename, String sheetname, Integer lineid, String linename) throws Exception {
77   - Map<String, Object> rtn = new HashMap<>();
78   - Workbook book = Workbook.getWorkbook(new File(filename));
79   - Sheet sheet = book.getSheet(sheetname);
80   - if (sheet.getRows() == 0 || sheet.getColumns() == 0) { // 工作区是否为空
81   - rtn.put("status", ResponseCode.ERROR);
82   - rtn.put("msg", String.format("%s 工作区没有数据!", sheetname));
83   - return rtn;
84   - } else {
85   - if (sheet.getRows() <= 1 || sheet.getColumns() <= 1) {
86   - rtn.put("status", ResponseCode.ERROR);
87   - rtn.put("msg", String.format("工作区至少包含2行2列的数据"));
88   - return rtn;
89   - } else {
90   - Cell[] cells = sheet.getRow(0); // 获取第一行数据列
91   - for (int i = 0; i < cells.length; i++) {
92   - String cell_con = cells[i].getContents();
93   -
94   - if (StringUtils.isEmpty(cell_con)) {
95   - rtn.put("status", ResponseCode.ERROR);
96   - rtn.put("msg", String.format("第1行,第%d列数据不能为空", i + 1));
97   - return rtn;
98   - } else {
99   - // 正则表达式去除数字
100   - cell_con = cell_con.replaceAll("[\\d+]", "");
101   -
102   - if (i == 0) { // 第一列必须是路牌2个字
103   - if (!"路牌".equals(cell_con.trim())) {
104   - rtn.put("status", ResponseCode.ERROR);
105   - rtn.put("msg", "第1行,第1列数据必须是路牌2个字");
106   - return rtn;
107   - }
108   - } else { // 排除出场,进场,其余内容到站点路由里查询,以各个方向的起点站为查询依据
109   - if ((!"出场".equals(cell_con.trim())) &&
110   - (!"进场".equals(cell_con.trim()))) {
111   - Map<String, Object> p1 = new HashMap<>();
112   - p1.put("line.id_eq", lineid);
113   - p1.put("stationName_eq", cell_con.trim());
114   - p1.put("stationMark_eq", "B");
115   -
116   -
117   - // TODO:这里要修改(起点站有启用撤销的标志的)
118   -
119   - List<StationRoute> stationRouteList = (List<StationRoute>) stationRouteService.list(p1);
120   - if (CollectionUtils.isEmpty(stationRouteList)) {
121   - rtn.put("status", ResponseCode.ERROR);
122   - rtn.put("msg", String.format("第1行,第%d列数据%s在%s站点路由中不是起点站", i + 1, cell_con.trim(), linename));
123   - return rtn;
124   - } else if (stationRouteList.size() > 1) {
125   - rtn.put("status", ResponseCode.ERROR);
126   - rtn.put("msg", String.format("第1行,第%d列数据%s在%s站点路由中上下行都是起点站", i + 1, cell_con.trim(), linename));
127   - return rtn;
128   - }
129   - }
130   -
131   - }
132   - }
133   - }
134   -
135   - // 验证路牌内容
136   - Map<String, Integer> gbindexmap = new HashMap<>(); // 记录每个路牌在第几行
137   - for (int i = 1; i < sheet.getRows(); i++) { // 从第2行开始验证数据
138   - Cell bcell = sheet.getRow(i)[0]; // 获取第1列
139   - String bcell_con = bcell.getContents();
140   - if (StringUtils.isEmpty(bcell_con)) {
141   - rtn.put("status", ResponseCode.ERROR);
142   - rtn.put("msg", String.format("第%d行,第1列路牌无数据", i + 1));
143   - return rtn;
144   - } else if (gbindexmap.get(bcell_con.trim()) != null) {
145   - rtn.put("status", ResponseCode.ERROR);
146   - rtn.put("msg", String.format("第%d行,第1列的路牌数据与第%d行,第1列数据重复",
147   - i + 1,
148   - gbindexmap.get(bcell_con.trim())));
149   - return rtn;
150   - } else {
151   - Map<String, Object> p2 = new HashMap<>();
152   - p2.put("xl.id_eq", lineid);
153   - p2.put("lpName_eq", bcell_con.trim());
154   - List<GuideboardInfo> guideboardInfoList = (List<GuideboardInfo>) guideboardInfoService.list(p2);
155   - if (CollectionUtils.isEmpty(guideboardInfoList)) {
156   - rtn.put("status", ResponseCode.ERROR);
157   - rtn.put("msg", String.format("第%d行,第1列的路牌在%s中不存在", i + 1, linename));
158   - return rtn;
159   - } else if (guideboardInfoList.size() > 1) {
160   - rtn.put("status", ResponseCode.ERROR);
161   - rtn.put("msg", String.format("第%d行,第1列的路牌在%s中重复", i + 1, linename));
162   - return rtn;
163   - } else {
164   - gbindexmap.put(bcell_con.trim(), i + 1);
165   - }
166   - }
167   - }
168   -
169   - // 班次时间验证,正则表达式,格式hh:mm或者hhmm
170   - String el = "^(([0-1]\\d)|(2[0-4])):[0-5]\\d$"; // hh:mm格式
171   - String el2 = "^(([0-1]\\d)|(2[0-4]))[0-5]\\d$"; // hhmm格式
172   - Pattern p = Pattern.compile(el);
173   - Pattern p2 = Pattern.compile(el2);
174   -
175   - for (int i = 1; i < sheet.getRows(); i++) { // 从第2行开始验证数据
176   - Cell[] bcells = sheet.getRow(i);
177   - for (int j = 1; j < bcells.length; j++) { // 从第2列开始
178   - String bcell_con = bcells[j].getContents();
179   - if (StringUtils.isNotEmpty(bcell_con)) {
180   - Matcher m = p.matcher(bcell_con.trim());
181   - Matcher m2 = p2.matcher(bcell_con.trim());
182   - if ((!m.matches()) && (!m2.matches())) {
183   - rtn.put("status", ResponseCode.ERROR);
184   - rtn.put("msg", String.format("第%d行,第%d列的发车时间格式不正确,格式应为hh:mm或hhmm", i + 1, j + 1));
185   - return rtn;
186   - }
187   - }
188   - }
189   - }
190   - }
191   -
192   - }
193   -
194   - rtn.put("status", ResponseCode.SUCCESS);
195   - return rtn;
196   - }
197   -
198   - /**
199   - * 3、验证关联的线路标准信息(以后放到规则引擎里去做)。
200   - * @param lineinfoid
201   - * @return
202   - */
203   - @RequestMapping(value = "/validate/lineinfo", method = RequestMethod.GET)
204   - public Map<String, Object> validateAssoLineInfo(Integer lineinfoid) {
205   - Map<String, Object> rtn = new HashMap<>();
206   - LineInformation lineInformation = lineInformationService.findById(lineinfoid);
207   - if (lineInformation.getUpInMileage() == null) {
208   - rtn.put("status", ResponseCode.ERROR);
209   - rtn.put("msg", "上行进场里程为空");
210   - return rtn;
211   - } else if (lineInformation.getUpInTimer() == null) {
212   - rtn.put("status", ResponseCode.ERROR);
213   - rtn.put("msg", "上行进场时间为空");
214   - return rtn;
215   - } else if (lineInformation.getUpOutMileage() == null) {
216   - rtn.put("status", ResponseCode.ERROR);
217   - rtn.put("msg", "上行出场里程为空");
218   - return rtn;
219   - } else if (lineInformation.getUpOutTimer() == null) {
220   - rtn.put("status", ResponseCode.ERROR);
221   - rtn.put("msg", "上行出场时间为空");
222   - return rtn;
223   - } else if (lineInformation.getUpMileage() == null) {
224   - rtn.put("status", ResponseCode.ERROR);
225   - rtn.put("msg", "上行班次里程为空");
226   - return rtn;
227   - } else if (lineInformation.getUpTravelTime() == null) {
228   - rtn.put("status", ResponseCode.ERROR);
229   - rtn.put("msg", "上行班次时间为空");
230   - return rtn;
231   - } else if (lineInformation.getDownInMileage() == null) {
232   - rtn.put("status", ResponseCode.ERROR);
233   - rtn.put("msg", "下行进场里程为空");
234   - return rtn;
235   - } else if (lineInformation.getDownInTimer() == null) {
236   - rtn.put("status", ResponseCode.ERROR);
237   - rtn.put("msg", "下行进场时间为空");
238   - return rtn;
239   - } else if (lineInformation.getDownOutMileage() == null) {
240   - rtn.put("status", ResponseCode.ERROR);
241   - rtn.put("msg", "下行出场里程为空");
242   - return rtn;
243   - } else if (lineInformation.getDownOutTimer() == null) {
244   - rtn.put("status", ResponseCode.ERROR);
245   - rtn.put("msg", "下行出场时间为空");
246   - return rtn;
247   - } else if (lineInformation.getDownMileage() == null) {
248   - rtn.put("status", ResponseCode.ERROR);
249   - rtn.put("msg", "下行班次里程为空");
250   - return rtn;
251   - } else if (lineInformation.getDownTravelTime() == null) {
252   - rtn.put("status", ResponseCode.ERROR);
253   - rtn.put("msg", "下行班次时间为空");
254   - return rtn;
255   - } else if (StringUtils.isEmpty(lineInformation.getCarPark())) {
256   - rtn.put("status", ResponseCode.ERROR);
257   - rtn.put("msg", "停车场必须选择");
258   - return rtn;
259   - }
260   -
261   - // 单独验证停车场信息
262   - String tcccode = lineInformation.getCarPark();
263   - Map<String, Object> p1 = new HashMap<>();
264   - p1.put("parkCode_eq", tcccode);
265   - List<CarPark> carParkList = (List<CarPark>) carParkService.list(p1);
266   - if (CollectionUtils.isEmpty(carParkList)) {
267   - rtn.put("status", ResponseCode.ERROR);
268   - rtn.put("msg", String.format("线路标准里的停车场code=%s,在停车场信息中未找到", tcccode));
269   - return rtn;
270   - } else if (carParkList.size() > 1) {
271   - rtn.put("status", ResponseCode.ERROR);
272   - rtn.put("msg", String.format("线路标准里的停车场code=%s,在停车场信息中有重复数据", tcccode));
273   - return rtn;
274   - } else {
275   - CarPark carPark = carParkList.get(0);
276   - if (StringUtils.isEmpty(carPark.getParkName())) {
277   - rtn.put("status", ResponseCode.ERROR);
278   - rtn.put("msg", String.format("线路标准里的停车场code=%s,在停车场信息中没有停车场名字", tcccode));
279   - return rtn;
280   - }
281   - }
282   -
283   - rtn.put("status", ResponseCode.SUCCESS);
284   - return rtn;
285   - }
286   -
287   - /**
288   - * 4、导入时刻表明细数据。
289   - * @param form
290   - * @return
291   - */
292   - @RequestMapping(value = "/importfile", method = RequestMethod.POST)
293   - public Map<String, Object> importTTinfo(@RequestParam Map<String, Object> form) throws Exception {
294   - Map<String, Object> rtn = new HashMap<>();
295   -
296   - // 1、修改已经上传的excel文件,在每个起点站后标示数字,表示第几个班次
297   - // 2、由于格式问题,需要把内容都转换成字符串
298   - String filename = (String) form.get("filename");
299   - List<String> colList = new ArrayList<>();
300   - Workbook workbook = Workbook.getWorkbook(new File(filename));
301   - Sheet sheet = workbook.getSheet((String) form.get("sheetname"));
302   - Cell[] cells = sheet.getRow(0);
303   - for (int i = 0; i < cells.length; i++) {
304   - if (i == 0) {
305   - colList.add(cells[i].getContents().trim());
306   - } else {
307   - colList.add(cells[i].getContents() + i);
308   - }
309   - }
310   -
311   - WritableWorkbook writableWorkbook = Workbook.createWorkbook(new File(filename + "_temp.xls"), workbook);
312   - WritableSheet sheet1 = writableWorkbook.getSheet((String) form.get("sheetname"));
313   - for (int i = 0; i < sheet1.getColumns(); i++) { // 第一行数据
314   - sheet1.addCell(new Label(i, 0, colList.get(i)));
315   - }
316   - for (int i = 1; i < sheet1.getRows(); i++) { // 第二行开始
317   - Cell[] cells1 = sheet.getRow(i);
318   - for (int j = 0; j < cells1.length; j++) {
319   - sheet1.addCell(new Label(j, i, cells1[j].getContents()));
320   - }
321   - }
322   - writableWorkbook.write();
323   - writableWorkbook.close();
324   -
325   - // 2、删除原有数据
326   - ttInfoDetailService.deleteByTtinfo(Long.valueOf(form.get("ttid").toString()));
327   -
328   - // 3、导入时刻表
329   - // 获取停车场名字
330   - LineInformation lineInformation = lineInformationService.findById(Integer.valueOf(form.get("lineinfo").toString()));
331   - Map<String, Object> p1 = new HashMap<>();
332   - p1.put("parkCode_eq", lineInformation.getCarPark());
333   - List<CarPark> carParkList = (List<CarPark>) carParkService.list(p1);
334   - String tccname = carParkList.get(0).getParkName();
335   -
336   - ttInfoDetailService.fileDataImport(
337   - new File(filename + "_temp.xls"),
338   - (String) form.get("sheetname"),
339   - (String) form.get("xlname"),
340   - (String) form.get("ttname"),
341   - tccname
342   - );
343   -
344   - return rtn;
345   - }
346   -
347   - //------------- 旧版本 --------------//
348   - @RequestMapping(value = "/dataImportExtend", method = RequestMethod.POST)
349   - public Map<String, Object> uploadDataAndImport(
350   - MultipartFile file, String xlmc, String ttinfoname) throws Exception {
351   - Map<String, Object> resultMap = new HashMap<>();
352   -
353   - try {
354   - // 查找lineinformation对象,没有报错
355   - Map<String, Object> param = new HashMap<>();
356   - param.put("line.name_eq", xlmc);
357   - Iterator<LineInformation> lineInformationIterator = lineInformationService.list(param).iterator();
358   - if (!lineInformationIterator.hasNext()) {
359   - // 没有lineinformation,报错
360   - resultMap.put("status", ResponseCode.ERROR);
361   - resultMap.put("msg", "没有lineinfomation,线路名称=" + xlmc);
362   - } else {
363   - String tcccode = lineInformationIterator.next().getCarPark();
364   - if (StringUtils.isEmpty(tcccode)) {
365   - // 没有停车场code,报错
366   - resultMap.put("status", ResponseCode.ERROR);
367   - resultMap.put("msg", "线路lineinfomation没有停车场code信息,线路名称=" + xlmc);
368   - } else {
369   - // 使用停车场code查找停车场
370   - param.clear();;
371   - param.put("parkCode_eq", tcccode);
372   - Iterator<CarPark> carParkIterator = carParkService.list(param).iterator();
373   - if (!carParkIterator.hasNext()) {
374   - // 指定的停车场code没有找到停车场信息,报错
375   - resultMap.put("status", ResponseCode.ERROR);
376   - resultMap.put("msg", "没有找到停车场信息,停车场code=" + tcccode);
377   - } else {
378   - String tccname = carParkIterator.next().getParkName();
379   - if (StringUtils.isEmpty(tccname)) {
380   - // 没有停车场名字,报错
381   - resultMap.put("status", ResponseCode.ERROR);
382   - resultMap.put("msg", "停车场信息没有停车场名字,停车场code=" + tcccode);
383   - } else {
384   - ttInfoDetailService.fileDataImport(file, xlmc, ttinfoname, tccname);
385   - resultMap.put("status", ResponseCode.SUCCESS);
386   - resultMap.put("msg", "导入成功");
387   - }
388   - }
389   - }
390   - }
391   - } catch (Exception exp) {
392   - exp.printStackTrace();
393   - throw exp;
394   - }
395   -
396   - return resultMap;
397   - }
398   -
399   - @RequestMapping(value = "/edit/{xlid}/{ttid}", method = RequestMethod.GET)
400   - public Object getEditInfo(
401   - @PathVariable("xlid") Integer xlid,
402   - @PathVariable("ttid") Long ttid) throws Exception {
403   - // TODO:返回类型需要修正
404   - return ttInfoDetailService.getEditInfo(xlid, ttid);
405   - }
406   -
407   - @Override
408   - public TTInfoDetail findById(@PathVariable("id") Long aLong) {
409   - return ttInfoDetailRepository.findOneExtend(aLong);
410   - }
411   -
412   - @RequestMapping(value = "/bcdetail", method = RequestMethod.GET)
413   - public List<TTInfoDetail> findBcdetails(Integer xlId, Long ttinfoId, Long lpId) {
414   - return ttInfoDetailRepository.findBcdetails(xlId, ttinfoId, lpId);
415   - }
416   -
417   - @Override
418   - public void dataExport(HttpServletResponse response, @RequestParam Map<String, Object> param) throws Exception {
419   - // 获取injectktr
420   - File ktrFile2 = new File(this.getClass().getResource(
421   - dataToolsProperties.getTtinfodetailOutput()).toURI());
422   - param.put("injectktrfile", ktrFile2.getAbsolutePath());
423   - param.put("ttinfoid", param.get("ttinfoid"));
424   -
425   - super.dataExport(response, param);
426   - }
427   -
428   - @Override
429   - protected String getDataExportKtrClasspath() {
430   - return dataToolsProperties.getTtinfodetailMetaoutput();
431   - }
432   -
433   - @Override
434   - protected String getDataExportFilename() {
435   - return "时刻表";
436   - }
437   -}
src/main/java/com/bsth/controller/schedule/basicinfo/CarDeviceController.java
... ... @@ -4,7 +4,7 @@ import com.bsth.common.ResponseCode;
4 4 import com.bsth.controller.schedule.BController;
5 5 import com.bsth.entity.CarDevice;
6 6 import com.bsth.service.schedule.CarDeviceService;
7   -import com.bsth.service.schedule.ScheduleException;
  7 +import com.bsth.service.schedule.exception.ScheduleException;
8 8 import org.springframework.beans.factory.annotation.Autowired;
9 9 import org.springframework.web.bind.annotation.RequestMapping;
10 10 import org.springframework.web.bind.annotation.RequestMethod;
... ...
src/main/java/com/bsth/controller/schedule/basicinfo/CarsController.java
... ... @@ -4,7 +4,7 @@ import com.bsth.common.ResponseCode;
4 4 import com.bsth.controller.schedule.BController;
5 5 import com.bsth.entity.Cars;
6 6 import com.bsth.service.schedule.CarsService;
7   -import com.bsth.service.schedule.ScheduleException;
  7 +import com.bsth.service.schedule.exception.ScheduleException;
8 8 import org.springframework.beans.factory.annotation.Autowired;
9 9 import org.springframework.web.bind.annotation.RequestMapping;
10 10 import org.springframework.web.bind.annotation.RequestMethod;
... ...
src/main/java/com/bsth/controller/schedule/basicinfo/EmployeeController.java
... ... @@ -4,7 +4,7 @@ import com.bsth.common.ResponseCode;
4 4 import com.bsth.controller.schedule.BController;
5 5 import com.bsth.entity.Personnel;
6 6 import com.bsth.service.schedule.EmployeeService;
7   -import com.bsth.service.schedule.ScheduleException;
  7 +import com.bsth.service.schedule.exception.ScheduleException;
8 8 import org.springframework.beans.factory.annotation.Autowired;
9 9 import org.springframework.web.bind.annotation.RequestMapping;
10 10 import org.springframework.web.bind.annotation.RequestMethod;
... ...
src/main/java/com/bsth/controller/schedule/core/CarConfigInfoController.java
... ... @@ -5,7 +5,7 @@ import com.bsth.controller.schedule.BController;
5 5 import com.bsth.entity.schedule.CarConfigInfo;
6 6 import com.bsth.repository.schedule.CarConfigInfoRepository;
7 7 import com.bsth.service.schedule.CarConfigInfoService;
8   -import com.bsth.service.schedule.ScheduleException;
  8 +import com.bsth.service.schedule.exception.ScheduleException;
9 9 import org.springframework.beans.factory.annotation.Autowired;
10 10 import org.springframework.web.bind.annotation.RequestMapping;
11 11 import org.springframework.web.bind.annotation.RequestMethod;
... ...
src/main/java/com/bsth/controller/schedule/core/EmployeeConfigInfoController.java
... ... @@ -5,7 +5,7 @@ import com.bsth.controller.schedule.BController;
5 5 import com.bsth.entity.schedule.EmployeeConfigInfo;
6 6 import com.bsth.repository.schedule.EmployeeConfigInfoRepository;
7 7 import com.bsth.service.schedule.EmployeeConfigInfoService;
8   -import com.bsth.service.schedule.ScheduleException;
  8 +import com.bsth.service.schedule.exception.ScheduleException;
9 9 import org.springframework.beans.factory.annotation.Autowired;
10 10 import org.springframework.web.bind.annotation.RequestMapping;
11 11 import org.springframework.web.bind.annotation.RequestMethod;
... ...
src/main/java/com/bsth/controller/schedule/core/GuideboardInfoController.java
... ... @@ -5,7 +5,7 @@ import com.bsth.controller.schedule.BController;
5 5 import com.bsth.entity.schedule.GuideboardInfo;
6 6 import com.bsth.repository.schedule.GuideboardInfoRepository;
7 7 import com.bsth.service.schedule.GuideboardInfoService;
8   -import com.bsth.service.schedule.ScheduleException;
  8 +import com.bsth.service.schedule.exception.ScheduleException;
9 9 import com.bsth.service.schedule.utils.DataToolsProperties;
10 10 import org.springframework.beans.factory.annotation.Autowired;
11 11 import org.springframework.boot.context.properties.EnableConfigurationProperties;
... ...
src/main/java/com/bsth/controller/schedule/core/TTInfoController.java
... ... @@ -3,7 +3,7 @@ package com.bsth.controller.schedule.core;
3 3 import com.bsth.common.ResponseCode;
4 4 import com.bsth.controller.schedule.BController;
5 5 import com.bsth.entity.schedule.TTInfo;
6   -import com.bsth.service.schedule.ScheduleException;
  6 +import com.bsth.service.schedule.exception.ScheduleException;
7 7 import com.bsth.service.schedule.TTInfoService;
8 8 import org.springframework.beans.factory.annotation.Autowired;
9 9 import org.springframework.web.bind.annotation.RequestMapping;
... ...
src/main/java/com/bsth/controller/schedule/core/TTInfoDetailController.java 0 → 100644
  1 +package com.bsth.controller.schedule.core;
  2 +
  3 +import com.bsth.common.ResponseCode;
  4 +import com.bsth.controller.schedule.BController;
  5 +import com.bsth.entity.schedule.TTInfoDetail;
  6 +import com.bsth.service.schedule.TTInfoDetailService;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.web.bind.annotation.PathVariable;
  9 +import org.springframework.web.bind.annotation.RequestMapping;
  10 +import org.springframework.web.bind.annotation.RequestMethod;
  11 +import org.springframework.web.bind.annotation.RestController;
  12 +
  13 +import java.util.HashMap;
  14 +import java.util.List;
  15 +import java.util.Map;
  16 +
  17 +/**
  18 + * Created by xu on 17/1/4.
  19 + */
  20 +@RestController
  21 +@RequestMapping("tidc")
  22 +public class TTInfoDetailController extends BController<TTInfoDetail, Long> {
  23 + @Autowired
  24 + private TTInfoDetailService ttInfoDetailService;
  25 +
  26 + @RequestMapping(value = "/bcdetail", method = RequestMethod.GET)
  27 + public List<TTInfoDetail> findBcdetails(Integer xlId, Long ttinfoId, Long lpId) {
  28 + return ttInfoDetailService.findBcdetails(xlId, ttinfoId, lpId);
  29 + }
  30 +
  31 + /**
  32 + * 验证sheet(以后放到规则引擎里去做)。
  33 + * @param filename excel文件全路径名
  34 + * @param sheetname sheet名字
  35 + * @param lineid 线路id
  36 + * @param linename 线路名称
  37 + * @return
  38 + */
  39 + @RequestMapping(value = "/validate/sheet", method = RequestMethod.POST)
  40 + public Map<String, Object> validate_sheet(String filename, String sheetname, Integer lineid, String linename) {
  41 + Map<String, Object> rtn = new HashMap<>();
  42 + try {
  43 + ttInfoDetailService.validateExcelSheet(filename, sheetname, lineid, linename);
  44 + rtn.put("status", ResponseCode.SUCCESS);
  45 + } catch (Exception exp) {
  46 + rtn.put("status", ResponseCode.ERROR);
  47 + rtn.put("msg", exp.getMessage());
  48 + }
  49 + return rtn;
  50 + }
  51 +
  52 + /**
  53 + * 验证关联的线路标准信息(以后放到规则引擎里去做)。
  54 + * @param lineinfoid
  55 + * @return
  56 + */
  57 + @RequestMapping(value = "/validate/lineinfo", method = RequestMethod.GET)
  58 + public Map<String, Object> validate_lineInfo(Integer lineinfoid) {
  59 + Map<String, Object> rtn = new HashMap<>();
  60 + try {
  61 + ttInfoDetailService.validateAssoLineInfo(lineinfoid);
  62 + rtn.put("status", ResponseCode.SUCCESS);
  63 + } catch (Exception exp) {
  64 + rtn.put("status", ResponseCode.ERROR);
  65 + rtn.put("msg", exp.getMessage());
  66 + }
  67 + return rtn;
  68 + }
  69 +
  70 + /**
  71 + * 获取时刻表明细编辑信息。
  72 + * @param xlid 线路id
  73 + * @param ttid 时刻表id
  74 + * @return
  75 + */
  76 + @RequestMapping(value = "/edit/{xlid}/{ttid}", method = RequestMethod.GET)
  77 + public Map<String, Object> getEditInfo(@PathVariable("xlid") Integer xlid,
  78 + @PathVariable("ttid") Long ttid) {
  79 + Map<String, Object> rtn = new HashMap<>();
  80 + try {
  81 + TTInfoDetailService.EditInfo editInfo = ttInfoDetailService.getEditInfo(xlid, ttid);
  82 + rtn.put("status", ResponseCode.SUCCESS);
  83 + rtn.put("data", editInfo);
  84 + } catch (Exception exp) {
  85 + rtn.put("status", ResponseCode.ERROR);
  86 + rtn.put("msg", exp.getMessage());
  87 + }
  88 + return rtn;
  89 + }
  90 +
  91 +}
... ...
src/main/java/com/bsth/controller/sys/DutyEmployeeController.java 0 → 100644
  1 +package com.bsth.controller.sys;
  2 +
  3 +import com.bsth.controller.BaseController;
  4 +import com.bsth.entity.sys.DutyEmployee;
  5 +import com.bsth.service.sys.DutyEmployeeService;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.web.bind.annotation.RequestMapping;
  8 +import org.springframework.web.bind.annotation.RequestParam;
  9 +import org.springframework.web.bind.annotation.RestController;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * Created by panzhao on 2017/1/5.
  15 + */
  16 +@RestController
  17 +@RequestMapping("dutyEmployee")
  18 +public class DutyEmployeeController extends BaseController<DutyEmployee, Long> {
  19 +
  20 + @Autowired
  21 + DutyEmployeeService dutyEmployeeService;
  22 +
  23 + @RequestMapping(value = "queryByLineAndTime")
  24 + public List<DutyEmployee> getDutyEmployee(@RequestParam String lineCode, @RequestParam String startTime, @RequestParam String endTime) {
  25 + return dutyEmployeeService.getDutyEmployee(lineCode, startTime, endTime);
  26 + }
  27 +}
... ...
src/main/java/com/bsth/data/arrival/ArrivalData_GPS.java
1 1 package com.bsth.data.arrival;
2 2  
3   -import com.bsth.data.match.Arrival2Schedule;
4 3 import com.bsth.data.schedule.DayOfSchedule;
5 4 import com.google.common.collect.ArrayListMultimap;
6 5 import com.google.common.collect.ListMultimap;
... ... @@ -59,7 +58,7 @@ public class ArrivalData_GPS implements CommandLineRunner{
59 58  
60 59 @Override
61 60 public void run() {
62   - try{
  61 + /*try{
63 62 logger.info("开始加载到离站数据, " + System.currentTimeMillis());
64 63 List<ArrivalEntity> arrSets = dataLoader.load();
65 64 if(null == arrSets || arrSets.size() == 0)
... ... @@ -86,7 +85,7 @@ public class ArrivalData_GPS implements CommandLineRunner{
86 85 Arrival2Schedule.start(carSet);
87 86 }catch(Exception e){
88 87 logger.error("", e);
89   - }
  88 + }*/
90 89 }
91 90 }
92 91  
... ...
src/main/java/com/bsth/data/forecast/ForecastRealServer.java
1 1 package com.bsth.data.forecast;
2 2  
  3 +import com.bsth.Application;
3 4 import com.bsth.data.forecast.entity.ForecastResult;
4 5 import com.bsth.data.forecast.entity.ForecastResult.ForecastResultItem;
5 6 import com.bsth.data.forecast.entity.SimpleRoute;
... ... @@ -20,6 +21,7 @@ import java.util.ArrayList;
20 21 import java.util.HashMap;
21 22 import java.util.List;
22 23 import java.util.Map;
  24 +import java.util.concurrent.TimeUnit;
23 25  
24 26 /**
25 27 *
... ... @@ -58,7 +60,7 @@ public class ForecastRealServer implements CommandLineRunner {
58 60 @Override
59 61 public void run(String... arg0) throws Exception {
60 62 //2小时更新一次站点间耗时数据
61   - //Application.mainServices.scheduleWithFixedDelay(dataLoader, 12, 120 * 60, TimeUnit.SECONDS);
  63 + Application.mainServices.scheduleWithFixedDelay(dataLoader, 12, 120 * 60, TimeUnit.SECONDS);
62 64 }
63 65  
64 66 /**
... ...
src/main/java/com/bsth/data/gpsdata/GpsRealData.java
... ... @@ -66,7 +66,7 @@ public class GpsRealData implements CommandLineRunner {
66 66 @Override
67 67 public void run(String... arg0) throws Exception {
68 68 logger.info("gpsDataLoader,20,5");
69   - //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 30, TimeUnit.SECONDS);
  69 + //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 5, TimeUnit.SECONDS);
70 70 }
71 71  
72 72 public void put(GpsEntity gps) {
... ...
src/main/java/com/bsth/data/gpsdata/arrival/entity/SignalState.java
... ... @@ -37,8 +37,8 @@ public class SignalState {
37 37 * @return
38 38 */
39 39 public static SignalState reverseSignalSTate(ScheduleRealInfo sch, RouteReverse reverse) {
40   - if(reverse.isVague())
41   - return null;
  40 + /*if(reverse.isVague())
  41 + return null;*/
42 42  
43 43 SignalState state = new SignalState();
44 44 state.setSchId(sch.getId());
... ...
src/main/java/com/bsth/data/gpsdata/arrival/handlers/InOutStationSignalHandle.java
1   -package com.bsth.data.gpsdata.arrival.handlers;
2   -
3   -import com.bsth.data.LineConfigData;
4   -import com.bsth.data.gpsdata.GpsEntity;
5   -import com.bsth.data.gpsdata.arrival.SignalHandle;
6   -import com.bsth.data.gpsdata.arrival.utils.CircleQueue;
7   -import com.bsth.data.gpsdata.arrival.utils.ScheduleSignalState;
8   -import com.bsth.data.gpsdata.arrival.utils.SignalSchPlanMatcher;
9   -import com.bsth.data.schedule.DayOfSchedule;
10   -import com.bsth.entity.realcontrol.LineConfig;
11   -import com.bsth.entity.realcontrol.ScheduleRealInfo;
12   -import com.bsth.service.directive.DirectiveService;
13   -import com.bsth.websocket.handler.SendUtils;
14   -import org.apache.commons.lang3.StringUtils;
15   -import org.slf4j.Logger;
16   -import org.slf4j.LoggerFactory;
17   -import org.springframework.beans.factory.annotation.Autowired;
18   -import org.springframework.stereotype.Component;
19   -
20   -/**
21   - * 进出站动作处理
22   - * Created by panzhao on 2016/12/27.
23   - */
24   -@Component
25   -public class InOutStationSignalHandle extends SignalHandle{
26   -
27   - Logger logger = LoggerFactory.getLogger(this.getClass());
28   -
29   - @Autowired
30   - DayOfSchedule dayOfSchedule;
31   -
32   - @Autowired
33   - LineConfigData lineConfigData;
34   -
35   - @Autowired
36   - SendUtils sendUtils;
37   -
38   - @Autowired
39   - DirectiveService directiveService;
40   -
41   - @Autowired
42   - ScheduleSignalState scheduleSignalState;
43   -
44   - @Autowired
45   - SignalSchPlanMatcher signalSchPlanMatcher;
46   -
47   - private final static int MAX_BEFORE_TIME = 1000 * 60 * 72;
48   -
49   - @Override
50   - public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) {
51   - //忽略漂移信号
52   - if(isDriftSignal(gps))
53   - return false;
54   -
55   - //从异常状态恢复的第一个信号
56   - if(abnormalRecovery(gps, prevs)){
57   - //回溯一下之前的轨迹
58   - scheduleSignalState.signalRetrospect(gps);
59   - }
60   -
61   - if(isNotEmpty(prevs)){
62   - GpsEntity prev = prevs.getTail();
63   - if(isOutStation(gps, prev))
64   - outStation(gps, prev);
65   -
66   -
67   - if(isInStation(gps, prev))
68   - inStation(gps, prev);
69   - }
70   -
71   - return true;
72   - }
73   -
74   - private boolean isOutStation(GpsEntity gps, GpsEntity prev){
75   - //从站内到站外
76   - if(prev.getInstation() > 0 && gps.getInstation() == 0)
77   - return true;
78   -
79   - //从站内到另一个站内
80   - if(prev.getInstation() > 0 && gps.getInstation() > 0
81   - && !prev.getStopNo().equals(gps.getStopNo()))
82   - return true;
83   - return false;
84   - }
85   -
86   - private boolean isInStation(GpsEntity gps, GpsEntity prev){
87   - //从站外到站内
88   - if(prev.getInstation() == 0 && gps.getInstation() > 0
89   - /*&& !prev.getStopNo().equals(gps.getStopNo())*/){
90   - return true;
91   - }
92   -
93   - //从站内到另一个站内
94   - if(prev.getInstation() > 0 && gps.getInstation() > 0
95   - && !prev.getStopNo().equals(gps.getStopNo()))
96   - return true;
97   - return false;
98   - }
99   -
100   - /**
101   - * 出站
102   - * @param gps 当前点
103   - * @param prev 上一个点
104   - */
105   - private void outStation(GpsEntity gps, GpsEntity prev) {
106   - ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
107   - String qdzCode = sch.getQdzCode();
108   -
109   - //首班出场最多提前1.2小时
110   - if(dayOfSchedule.isFirstOut(sch) && sch.getDfsjT() - gps.getTimestamp() > MAX_BEFORE_TIME)
111   - return;
112   -
113   - //起点发车
114   - if(qdzCode != null && prev.getStopNo().equals(qdzCode)
115   - && !willDepart(gps, prev, sch)){
116   -
117   - //发车班次匹配
118   - signalSchPlanMatcher.outMatch(gps, sch);
119   - sch = dayOfSchedule.executeCurr(gps.getNbbm());
120   -
121   - //实发时间不覆盖
122   - if(StringUtils.isNotEmpty(sch.getFcsjActual()))
123   - return;
124   -
125   - //实发时间
126   - sch.setFcsjActualAll(gps.getTimestamp());
127   - //通知客户端
128   - sendUtils.sendFcsj(sch);
129   - //持久化
130   - dayOfSchedule.save(sch);
131   -
132   - //出站既出场
133   - outStationAndOutPark(sch);
134   - logger.info("班次:" + sch.getDfsj() + "发车, 时间:" + sch.getFcsjActual());
135   - }
136   - else if(sch.getBcType().equals("out")){
137   - ScheduleRealInfo next = dayOfSchedule.nextSame(sch);
138   - if(prev.getStopNo().equals(next.getQdzCode())){
139   - //发下一个班次
140   - dayOfSchedule.addExecPlan(next);
141   - outStation(gps, prev);
142   - }
143   - }
144   - }
145   -
146   -
147   - private void outStationAndOutPark(ScheduleRealInfo sch){
148   - LineConfig config = lineConfigData.get(sch.getXlBm());
149   - if (config != null && config.getOutConfig() == 2) {
150   - //出站既出场
151   - ScheduleRealInfo schPrev = dayOfSchedule.prev(sch);
152   - if (schPrev != null && schPrev.getBcType().equals("out")) {
153   - schPrev.setFcsjActualAll(sch.getFcsjActualTime());
154   - schPrev.setZdsjActualAll(sch.getFcsjActualTime());
155   -
156   - sendUtils.refreshSch(schPrev);
157   - }
158   - }
159   - }
160   -
161   - /**
162   - * 进站
163   - * @param gps 当前点
164   - * @param prev 上一个点
165   - */
166   - private void inStation(GpsEntity gps, GpsEntity prev){
167   - ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
168   -
169   - if(gps.getStopNo().equals(sch.getZdzCode())){
170   -
171   - //实达时间不覆盖
172   - if(StringUtils.isNotEmpty(sch.getZdsjActual()))
173   - return;
174   -
175   - sch.setZdsjActualAll(gps.getTimestamp());
176   - //已完成班次数
177   - int doneSum = dayOfSchedule.doneSum(sch.getClZbh());
178   - ScheduleRealInfo next = dayOfSchedule.next(sch);
179   - //通知客户端
180   - sendUtils.sendZdsj(sch, next, doneSum);
181   - //持久化
182   - dayOfSchedule.save(sch);
183   - //下发调度指令
184   - //directiveService.send60Dispatch(next, doneSum, "到站@系统");
185   -
186   - //准备执行下一个班次
187   - if (next != null) {
188   - next.setQdzArrDatesj(sch.getZdsjActual());
189   - dayOfSchedule.addExecPlan(next);
190   - //进站既进场
191   - inStationAndInPark(sch, next);
192   - //将gps转换为下一个班次走向的站内信号
193   - transformUpdown(gps, sch);
194   - }
195   - }
196   - else if(sch.getFcsjActual() == null){
197   - //有进站,但班次没有实发,向前追溯一下信号
198   - scheduleSignalState.signalRetrospect(gps, sch);
199   - }
200   - }
201   -
202   - /**
203   - * 进站既进场
204   - * @param sch
205   - */
206   - private void inStationAndInPark(ScheduleRealInfo sch, ScheduleRealInfo next){
207   - LineConfig config = lineConfigData.get(sch.getXlBm());
208   - if (next.getBcType().equals("in") &&
209   - config != null && config.getOutConfig() == 2) {
210   - next.setFcsjActualAll(sch.getZdsjActualTime());
211   - next.setZdsjActualAll(sch.getZdsjActualTime());
212   -
213   - sendUtils.refreshSch(next);
214   - }
215   - }
216   -
217   - /**
218   - * 发车漂移判定(这里出现的误判,由车辆到达中途站的时候补偿)
219   - * @param gps
220   - * @param prev
221   - * @param task
222   - * @return
223   - */
224   - private boolean willDepart(GpsEntity gps, GpsEntity prev, Object task){
225   -
226   - /*ScheduleRealInfo sch = (ScheduleRealInfo) task;
227   - ScheduleRealInfo prevTask = dayOfSchedule.prev(sch);
228   - if(prevTask == null || prevTask.getBcType().equals("out"))
229   - return false;
230   -
231   - //计划停站时间
232   - int stopTimePlan = (int) (sch.getDfsjT() - prevTask.getZdsjT());
233   -
234   - if(stopTimePlan < 1000 * 60 * 10)
235   - return false;
236   -
237   - //实际停站时间
238   - if(prevTask.getZdsjActual() != null){
239   - int actualTime = (int) (gps.getTimestamp() - prevTask.getZdsjActualTime());
240   -
241   - if(actualTime < stopTimePlan * 0.8){
242   - logger.info("漂移判定");
243   -
244   - return true;
245   - }
246   - }*/
247   - return false;
248   - }
  1 +package com.bsth.data.gpsdata.arrival.handlers;
  2 +
  3 +import com.bsth.data.LineConfigData;
  4 +import com.bsth.data.gpsdata.GpsEntity;
  5 +import com.bsth.data.gpsdata.arrival.SignalHandle;
  6 +import com.bsth.data.gpsdata.arrival.utils.CircleQueue;
  7 +import com.bsth.data.gpsdata.arrival.utils.ScheduleSignalState;
  8 +import com.bsth.data.gpsdata.arrival.utils.SignalSchPlanMatcher;
  9 +import com.bsth.data.schedule.DayOfSchedule;
  10 +import com.bsth.entity.realcontrol.LineConfig;
  11 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  12 +import com.bsth.service.directive.DirectiveService;
  13 +import com.bsth.websocket.handler.SendUtils;
  14 +import org.apache.commons.lang3.StringUtils;
  15 +import org.slf4j.Logger;
  16 +import org.slf4j.LoggerFactory;
  17 +import org.springframework.beans.factory.annotation.Autowired;
  18 +import org.springframework.stereotype.Component;
  19 +
  20 +/**
  21 + * 进出站动作处理
  22 + * Created by panzhao on 2016/12/27.
  23 + */
  24 +@Component
  25 +public class InOutStationSignalHandle extends SignalHandle{
  26 +
  27 + Logger logger = LoggerFactory.getLogger(this.getClass());
  28 +
  29 + @Autowired
  30 + DayOfSchedule dayOfSchedule;
  31 +
  32 + @Autowired
  33 + LineConfigData lineConfigData;
  34 +
  35 + @Autowired
  36 + SendUtils sendUtils;
  37 +
  38 + @Autowired
  39 + DirectiveService directiveService;
  40 +
  41 + @Autowired
  42 + ScheduleSignalState scheduleSignalState;
  43 +
  44 + @Autowired
  45 + SignalSchPlanMatcher signalSchPlanMatcher;
  46 +
  47 + private final static int MAX_BEFORE_TIME = 1000 * 60 * 72;
  48 +
  49 + @Override
  50 + public boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs) {
  51 + //忽略漂移信号
  52 + if(isDriftSignal(gps))
  53 + return false;
  54 +
  55 + //从异常状态恢复的第一个信号
  56 + if(abnormalRecovery(gps, prevs)){
  57 + //回溯一下之前的轨迹
  58 + scheduleSignalState.signalRetrospect(gps);
  59 + }
  60 +
  61 + if(isNotEmpty(prevs)){
  62 + GpsEntity prev = prevs.getTail();
  63 + if(isOutStation(gps, prev))
  64 + outStation(gps, prev);
  65 +
  66 +
  67 + if(isInStation(gps, prev))
  68 + inStation(gps, prev);
  69 + }
  70 +
  71 + return true;
  72 + }
  73 +
  74 + private boolean isOutStation(GpsEntity gps, GpsEntity prev){
  75 + //从站内到站外
  76 + if(prev.getInstation() > 0 && gps.getInstation() == 0)
  77 + return true;
  78 +
  79 + //从站内到另一个站内
  80 + if(prev.getInstation() > 0 && gps.getInstation() > 0
  81 + && !prev.getStopNo().equals(gps.getStopNo()))
  82 + return true;
  83 + return false;
  84 + }
  85 +
  86 + private boolean isInStation(GpsEntity gps, GpsEntity prev){
  87 + //从站外到站内
  88 + if(prev.getInstation() == 0 && gps.getInstation() > 0
  89 + /*&& !prev.getStopNo().equals(gps.getStopNo())*/){
  90 + return true;
  91 + }
  92 +
  93 + //从站内到另一个站内
  94 + if(prev.getInstation() > 0 && gps.getInstation() > 0
  95 + && !prev.getStopNo().equals(gps.getStopNo()))
  96 + return true;
  97 + return false;
  98 + }
  99 +
  100 + /**
  101 + * 出站
  102 + * @param gps 当前点
  103 + * @param prev 上一个点
  104 + */
  105 + private void outStation(GpsEntity gps, GpsEntity prev) {
  106 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
  107 + String qdzCode = sch.getQdzCode();
  108 +
  109 + //首班出场最多提前1.2小时
  110 + if(dayOfSchedule.isFirstOut(sch) && sch.getDfsjT() - gps.getTimestamp() > MAX_BEFORE_TIME)
  111 + return;
  112 +
  113 + //起点发车
  114 + if(qdzCode != null && prev.getStopNo().equals(qdzCode)
  115 + && !willDepart(gps, prev, sch)){
  116 +
  117 + //发车班次匹配
  118 + signalSchPlanMatcher.outMatch(gps, sch);
  119 + sch = dayOfSchedule.executeCurr(gps.getNbbm());
  120 +
  121 + //实发时间不覆盖
  122 + if(StringUtils.isNotEmpty(sch.getFcsjActual()))
  123 + return;
  124 +
  125 + //实发时间
  126 + sch.setFcsjActualAll(gps.getTimestamp());
  127 + //通知客户端
  128 + sendUtils.sendFcsj(sch);
  129 + //持久化
  130 + dayOfSchedule.save(sch);
  131 +
  132 + //出站既出场
  133 + outStationAndOutPark(sch);
  134 + logger.info("班次:" + sch.getDfsj() + "发车, 时间:" + sch.getFcsjActual());
  135 + }
  136 + else if(sch.getBcType().equals("out")){
  137 + ScheduleRealInfo next = dayOfSchedule.nextSame(sch);
  138 + if(prev.getStopNo().equals(next.getQdzCode())){
  139 + //发下一个班次
  140 + dayOfSchedule.addExecPlan(next);
  141 + outStation(gps, prev);
  142 + }
  143 + }
  144 + }
  145 +
  146 +
  147 + private void outStationAndOutPark(ScheduleRealInfo sch){
  148 + LineConfig config = lineConfigData.get(sch.getXlBm());
  149 + if (config != null && config.getOutConfig() == 2) {
  150 + //出站既出场
  151 + ScheduleRealInfo schPrev = dayOfSchedule.prev(sch);
  152 + if (schPrev != null && schPrev.getBcType().equals("out")) {
  153 + schPrev.setFcsjActualAll(sch.getFcsjActualTime());
  154 + schPrev.setZdsjActualAll(sch.getFcsjActualTime());
  155 +
  156 + sendUtils.refreshSch(schPrev);
  157 + dayOfSchedule.save(schPrev);
  158 + }
  159 + }
  160 + }
  161 +
  162 + /**
  163 + * 进站
  164 + * @param gps 当前点
  165 + * @param prev 上一个点
  166 + */
  167 + private void inStation(GpsEntity gps, GpsEntity prev){
  168 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
  169 +
  170 + if(gps.getStopNo().equals(sch.getZdzCode())){
  171 +
  172 + //实达时间不覆盖
  173 + if(StringUtils.isNotEmpty(sch.getZdsjActual()))
  174 + return;
  175 +
  176 + sch.setZdsjActualAll(gps.getTimestamp());
  177 + //已完成班次数
  178 + int doneSum = dayOfSchedule.doneSum(sch.getClZbh());
  179 + ScheduleRealInfo next = dayOfSchedule.next(sch);
  180 + //通知客户端
  181 + sendUtils.sendZdsj(sch, next, doneSum);
  182 + //持久化
  183 + dayOfSchedule.save(sch);
  184 + //下发调度指令
  185 + directiveService.send60Dispatch(next, doneSum, "到站@系统");
  186 +
  187 + //准备执行下一个班次
  188 + if (next != null) {
  189 + next.setQdzArrDatesj(sch.getZdsjActual());
  190 + dayOfSchedule.addExecPlan(next);
  191 + //进站既进场
  192 + inStationAndInPark(sch, next);
  193 + //将gps转换为下一个班次走向的站内信号
  194 + transformUpdown(gps, sch);
  195 + }
  196 + }
  197 + else if(sch.getFcsjActual() == null){
  198 + //有进站,但班次没有实发,向前追溯一下信号
  199 + scheduleSignalState.signalRetrospect(gps, sch);
  200 + }
  201 + }
  202 +
  203 + /**
  204 + * 进站既进场
  205 + * @param sch
  206 + */
  207 + private void inStationAndInPark(ScheduleRealInfo sch, ScheduleRealInfo next){
  208 + LineConfig config = lineConfigData.get(sch.getXlBm());
  209 + if (next.getBcType().equals("in") &&
  210 + config != null && config.getOutConfig() == 2) {
  211 + next.setFcsjActualAll(sch.getZdsjActualTime());
  212 + next.setZdsjActualAll(sch.getZdsjActualTime());
  213 +
  214 + sendUtils.refreshSch(next);
  215 + dayOfSchedule.save(next);
  216 + }
  217 + }
  218 +
  219 + /**
  220 + * 发车漂移判定(这里出现的误判,由车辆到达中途站的时候补偿)
  221 + * @param gps
  222 + * @param prev
  223 + * @param task
  224 + * @return
  225 + */
  226 + private boolean willDepart(GpsEntity gps, GpsEntity prev, Object task){
  227 +
  228 + /*ScheduleRealInfo sch = (ScheduleRealInfo) task;
  229 + ScheduleRealInfo prevTask = dayOfSchedule.prev(sch);
  230 + if(prevTask == null || prevTask.getBcType().equals("out"))
  231 + return false;
  232 +
  233 + //计划停站时间
  234 + int stopTimePlan = (int) (sch.getDfsjT() - prevTask.getZdsjT());
  235 +
  236 + if(stopTimePlan < 1000 * 60 * 10)
  237 + return false;
  238 +
  239 + //实际停站时间
  240 + if(prevTask.getZdsjActual() != null){
  241 + int actualTime = (int) (gps.getTimestamp() - prevTask.getZdsjActualTime());
  242 +
  243 + if(actualTime < stopTimePlan * 0.8){
  244 + logger.info("漂移判定");
  245 +
  246 + return true;
  247 + }
  248 + }*/
  249 + return false;
  250 + }
249 251 }
250 252 \ No newline at end of file
... ...
src/main/java/com/bsth/data/gpsdata/arrival/handlers/ReverseSignalHandle.java
... ... @@ -38,7 +38,7 @@ public class ReverseSignalHandle extends SignalHandle {
38 38 if (isReverse(gps, prev)) {
39 39 RouteReverse reverse = reverseSearch(prevs, gps);
40 40  
41   - if (reverse.getCount() >= 4
  41 + if (reverse.getCount() >= 3
42 42 && reverse.isClose()
43 43 && !GeoCacheData.isEndStation(gps.getLineId(), gps.getUpDown(), reverse.getTurned())) {
44 44 scheduleSignalState.reverseAnalyse(reverse);
... ...
src/main/java/com/bsth/data/gpsdata/arrival/utils/ScheduleSignalState.java
1   -package com.bsth.data.gpsdata.arrival.utils;
2   -
3   -import com.bsth.data.LineConfigData;
4   -import com.bsth.data.gpsdata.GpsEntity;
5   -import com.bsth.data.gpsdata.SignalStateData;
6   -import com.bsth.data.gpsdata.arrival.GeoCacheData;
7   -import com.bsth.data.gpsdata.arrival.entity.RouteReverse;
8   -import com.bsth.data.gpsdata.arrival.entity.SignalAbnormal;
9   -import com.bsth.data.gpsdata.arrival.entity.SignalState;
10   -import com.bsth.data.schedule.DayOfSchedule;
11   -import com.bsth.entity.realcontrol.LineConfig;
12   -import com.bsth.entity.realcontrol.ScheduleRealInfo;
13   -import org.slf4j.Logger;
14   -import org.slf4j.LoggerFactory;
15   -import org.springframework.beans.factory.annotation.Autowired;
16   -import org.springframework.stereotype.Component;
17   -
18   -/**
19   - * 班次信号状态分析
20   - * Created by panzhao on 2016/12/29.
21   - */
22   -@Component
23   -public class ScheduleSignalState {
24   -
25   - @Autowired
26   - DayOfSchedule dayOfSchedule;
27   -
28   - Logger logger = LoggerFactory.getLogger(this.getClass());
29   -
30   - @Autowired
31   - LineConfigData lineConfigData;
32   -
33   - @Autowired
34   - SignalStateData signalStateData;
35   -
36   - /**
37   - * 路由反向分析
38   - */
39   - public void reverseAnalyse(RouteReverse reverse) {
40   - ScheduleRealInfo sch = dayOfSchedule.executeCurr(reverse.getNbbm());
41   -
42   - String bcType = sch.getBcType();
43   -
44   - switch (bcType) {
45   - case "out":
46   - outReverseAnalyse(sch, reverse);
47   - break;
48   - case "normal":
49   - normalReverseAnalyse(sch, reverse);
50   - break;
51   - }
52   - }
53   -
54   - /**
55   - * 出场班次路由反向分析
56   - *
57   - * @param sch
58   - */
59   - private void outReverseAnalyse(ScheduleRealInfo sch, RouteReverse reverse) {
60   - long t = reverse.getCt();
61   - //出场班次终点时间前,允许反向轨迹
62   - if (sch.getZdsjT() != null && sch.getZdsjT() > t) {
63   - return;
64   - }
65   -
66   - int rt;
67   - //从实发 到 当前时间 < 计划运送时间 * 0.9
68   - if (sch.getFcsjActual() != null && sch.getBcsj() != null) {
69   - rt = (int) (t - sch.getFcsjActualTime());
70   - if (rt < sch.getBcsj() * 0.9)
71   - return;
72   - }
73   -
74   - ScheduleRealInfo next = dayOfSchedule.next(sch);
75   - if (next.getXlDir().equals(sch.getXlDir()))
76   - return;
77   -
78   - //时间足够下一个班次待发时间运行到当前站
79   - int runTime = reverse.getCount() * 1500 * 60;
80   - if (next.getDfsjT() + runTime < t) {
81   - //跳到下一个班次
82   - dayOfSchedule.addExecPlan(next);
83   - }
84   - }
85   -
86   - /**
87   - * 正常班次路由反向分析
88   - *
89   - * @param sch
90   - * @param reverse
91   - */
92   - private void normalReverseAnalyse(ScheduleRealInfo sch, RouteReverse reverse) {
93   - LineConfig conf = lineConfigData.get(sch.getXlBm());
94   -
95   - if (conf.isReadReverse()) {
96   - //跳下一个班次
97   - ScheduleRealInfo next = dayOfSchedule.next(sch);
98   - if (next != null)
99   - dayOfSchedule.addExecPlan(next);
100   -
101   - //记录信号状态
102   - SignalState signalState = SignalState.reverseSignalSTate(sch, reverse);
103   - if(signalState != null)
104   - signalStateData.put(signalState);
105   - }
106   - }
107   -
108   - public void signalRetrospect(GpsEntity gps) {
109   - signalRetrospect(gps, dayOfSchedule.executeCurr(gps.getNbbm()));
110   - }
111   -
112   - /**
113   - * 信号追溯
114   - *
115   - * @param gps
116   - * @param sch
117   - */
118   - public void signalRetrospect(GpsEntity gps, ScheduleRealInfo sch) {
119   - //回放数据,是否有掉线或者漂移
120   - CircleQueue<GpsEntity> queue = GeoCacheData.getGps(gps.getNbbm());
121   - if (queue == null || queue.size() == 0 /*|| gps.getInstation() == 0*/)
122   - return;
123   -
124   - //起始时间点
125   - long st = 0;
126   - ScheduleRealInfo prev = dayOfSchedule.prev(sch);
127   -
128   - if (prev != null) {
129   - if (prev.getZdsjActual() != null)
130   - st = prev.getZdsjActualTime();
131   - else
132   - st = (GeoCacheData.midwayStation(gps.getLineId(), gps.getUpDown(), sch.getQdzCode(), gps.getStopNo()).size() + 1) * (1000 * 60 * 5);
133   - }
134   -
135   - Object[] tempArray = queue.getQueue();
136   - int len = tempArray.length;
137   -
138   - Object[] array = new Object[len + 1];
139   - System.arraycopy(tempArray, 0, array, 0, len);
140   - array[len] = gps;
141   -
142   - String gpsState = "";
143   - GpsEntity tempGps, nearGps = null;
144   - int i = len - 1;
145   - for (; i >= 0; i--) {
146   - tempGps = (GpsEntity) array[i];
147   -
148   - gpsState = tempGps.getSignalState();
149   - if (gpsState.equals("truncation"))
150   - break;
151   - else if (gpsState.equals("drift")) {
152   - nearGps = (GpsEntity) array[i + 1];
153   - break;
154   - } else if (gpsState.equals("reconnection")) {
155   - nearGps = tempGps;
156   - break;
157   - }
158   -
159   - if (tempGps.getTimestamp() < st)
160   - break;
161   - }
162   -
163   - if (nearGps != null && i > 0) {
164   - createSignalAbnormal(gpsState, nearGps, i, array, sch);
165   - }
166   - }
167   -
168   - private void createSignalAbnormal(String gpsState, GpsEntity nearGps, int i, Object[] array, ScheduleRealInfo sch) {
169   - switch (gpsState) {
170   - case "drift":
171   - driftSignalAbnormal(nearGps, i, array, sch);
172   - break;
173   - case "reconnection":
174   - offlineSignalAbnormal(nearGps, ((GpsEntity) array[i - 1]), sch);
175   - break;
176   - }
177   - }
178   -
179   - /**
180   - * 掉线异常状态记录
181   - *
182   - * @param e
183   - * @param s
184   - */
185   - private void offlineSignalAbnormal(GpsEntity e, GpsEntity s, ScheduleRealInfo sch) {
186   - long st = s.getTimestamp(), et = e.getTimestamp();
187   -
188   - //掉线超过10分钟才记录
189   - if (et - st < (1000 * 60 * 10))
190   - return;
191   -
192   - SignalAbnormal signalAbnormal = new SignalAbnormal();
193   - signalAbnormal.setSt(st);
194   - signalAbnormal.setEt(et);
195   - signalAbnormal.setAbnormalType("reconnection");
196   - signalAbnormal.setDestCode(sch.getQdzCode());
197   - signalAbnormal.setOutOrIn(0);
198   -
199   - //截断GPS
200   - e.setSignalState("truncation");
201   -
202   - //记录信号状态
203   - SignalState signalState = SignalState.abnormalSignalSTate(sch, signalAbnormal);
204   - signalStateData.put(signalState);
205   - }
206   -
207   - /**
208   - * 漂移异常状态记录
209   - *
210   - * @param nearGps
211   - * @param i
212   - * @param array
213   - */
214   - private void driftSignalAbnormal(GpsEntity nearGps, int i, Object[] array, ScheduleRealInfo sch) {
215   - GpsEntity gps, s = null;
216   - //找到漂移开始时间
217   - for (; i >= 0; i--) {
218   - gps = (GpsEntity) array[i];
219   -
220   - if (!gps.getSignalState().equals("drift") || i == 0
221   - || gps.getSignalState().equals("truncation")) {
222   - s = gps;
223   - break;
224   - }
225   - }
226   -
227   - long st = s.getTimestamp(), et = nearGps.getTimestamp();
228   - if (et - st < (1000 * 60 * 3))
229   - return;
230   - /*if (s != null){
231   - st = s.getTimestamp();
232   - //漂移小于3分钟
233   - if(et - st < (1000 * 60 * 3))
234   - return;
235   - }*/
236   -
237   -
238   - SignalAbnormal signalAbnormal = new SignalAbnormal();
239   - signalAbnormal.setSt(st);
240   - signalAbnormal.setEt(et);
241   - signalAbnormal.setAbnormalType("drift");
242   - signalAbnormal.setDestCode(sch.getQdzCode());
243   - signalAbnormal.setOutOrIn(0);
244   -
245   - //截断GPS
246   - nearGps.setSignalState("truncation");
247   -
248   - //记录信号状态
249   - SignalState signalState = SignalState.abnormalSignalSTate(sch, signalAbnormal);
250   - signalStateData.put(signalState);
251   - }
  1 +package com.bsth.data.gpsdata.arrival.utils;
  2 +
  3 +import com.bsth.data.LineConfigData;
  4 +import com.bsth.data.gpsdata.GpsEntity;
  5 +import com.bsth.data.gpsdata.SignalStateData;
  6 +import com.bsth.data.gpsdata.arrival.GeoCacheData;
  7 +import com.bsth.data.gpsdata.arrival.entity.RouteReverse;
  8 +import com.bsth.data.gpsdata.arrival.entity.SignalAbnormal;
  9 +import com.bsth.data.gpsdata.arrival.entity.SignalState;
  10 +import com.bsth.data.schedule.DayOfSchedule;
  11 +import com.bsth.entity.realcontrol.LineConfig;
  12 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  13 +import org.slf4j.Logger;
  14 +import org.slf4j.LoggerFactory;
  15 +import org.springframework.beans.factory.annotation.Autowired;
  16 +import org.springframework.stereotype.Component;
  17 +
  18 +/**
  19 + * 班次信号状态分析
  20 + * Created by panzhao on 2016/12/29.
  21 + */
  22 +@Component
  23 +public class ScheduleSignalState {
  24 +
  25 + @Autowired
  26 + DayOfSchedule dayOfSchedule;
  27 +
  28 + Logger logger = LoggerFactory.getLogger(this.getClass());
  29 +
  30 + @Autowired
  31 + LineConfigData lineConfigData;
  32 +
  33 + @Autowired
  34 + SignalStateData signalStateData;
  35 +
  36 + /**
  37 + * 路由反向分析
  38 + */
  39 + public void reverseAnalyse(RouteReverse reverse) {
  40 + ScheduleRealInfo sch = dayOfSchedule.executeCurr(reverse.getNbbm());
  41 +
  42 + String bcType = sch.getBcType();
  43 +
  44 + switch (bcType) {
  45 + case "out":
  46 + outReverseAnalyse(sch, reverse);
  47 + break;
  48 + case "normal":
  49 + normalReverseAnalyse(sch, reverse);
  50 + break;
  51 + }
  52 + }
  53 +
  54 + /**
  55 + * 出场班次路由反向分析
  56 + *
  57 + * @param sch
  58 + */
  59 + private void outReverseAnalyse(ScheduleRealInfo sch, RouteReverse reverse) {
  60 + long t = reverse.getCt();
  61 + //出场班次终点时间前,允许反向轨迹
  62 + if (sch.getZdsjT() != null && sch.getZdsjT() > t) {
  63 + return;
  64 + }
  65 +
  66 + int rt;
  67 + //从实发 到 当前时间 < 计划运送时间 * 0.9
  68 + if (sch.getFcsjActual() != null && sch.getBcsj() != null) {
  69 + rt = (int) (t - sch.getFcsjActualTime());
  70 + if (rt < sch.getBcsj() * 0.9)
  71 + return;
  72 + }
  73 +
  74 + ScheduleRealInfo next = dayOfSchedule.next(sch);
  75 + if (next.getXlDir().equals(sch.getXlDir()))
  76 + return;
  77 +
  78 + //时间足够下一个班次待发时间运行到当前站
  79 + int runTime = reverse.getCount() * 1500 * 60;
  80 + if (next.getDfsjT() + runTime < t) {
  81 + //跳到下一个班次
  82 + dayOfSchedule.addExecPlan(next);
  83 + }
  84 + }
  85 +
  86 + /**
  87 + * 正常班次路由反向分析
  88 + *
  89 + * @param sch
  90 + * @param reverse
  91 + */
  92 + private void normalReverseAnalyse(ScheduleRealInfo sch, RouteReverse reverse) {
  93 + LineConfig conf = lineConfigData.get(sch.getXlBm());
  94 +
  95 + if (conf.isReadReverse()) {
  96 + //跳下一个班次
  97 + ScheduleRealInfo next = dayOfSchedule.next(sch);
  98 + if (next != null)
  99 + dayOfSchedule.addExecPlan(next);
  100 +
  101 + //记录信号状态
  102 + SignalState signalState = SignalState.reverseSignalSTate(sch, reverse);
  103 + if(signalState != null)
  104 + signalStateData.put(signalState);
  105 + }
  106 + }
  107 +
  108 + public void signalRetrospect(GpsEntity gps) {
  109 + signalRetrospect(gps, dayOfSchedule.executeCurr(gps.getNbbm()));
  110 + }
  111 +
  112 + /**
  113 + * 信号追溯
  114 + *
  115 + * @param gps
  116 + * @param sch
  117 + */
  118 + public void signalRetrospect(GpsEntity gps, ScheduleRealInfo sch) {
  119 + //回放数据,是否有掉线或者漂移
  120 + CircleQueue<GpsEntity> queue = GeoCacheData.getGps(gps.getNbbm());
  121 + if (queue == null || queue.size() == 0 /*|| gps.getInstation() == 0*/)
  122 + return;
  123 +
  124 + //起始时间点
  125 + long st = 0;
  126 + ScheduleRealInfo prev = dayOfSchedule.prev(sch);
  127 +
  128 + if (prev != null) {
  129 + if (prev.getZdsjActual() != null)
  130 + st = prev.getZdsjActualTime();
  131 + else
  132 + st = (GeoCacheData.midwayStation(gps.getLineId(), gps.getUpDown(), sch.getQdzCode(), gps.getStopNo()).size() + 1) * (1000 * 60 * 5);
  133 + }
  134 +
  135 + Object[] tempArray = queue.getQueue();
  136 + int len = tempArray.length;
  137 +
  138 + Object[] array = new Object[len + 1];
  139 + System.arraycopy(tempArray, 0, array, 0, len);
  140 + array[len] = gps;
  141 +
  142 + String gpsState = "";
  143 + GpsEntity tempGps, nearGps = null;
  144 + int i = len - 1;
  145 + for (; i >= 0; i--) {
  146 + tempGps = (GpsEntity) array[i];
  147 +
  148 + gpsState = tempGps.getSignalState();
  149 + if (gpsState.equals("truncation"))
  150 + break;
  151 + else if (gpsState.equals("drift")) {
  152 + nearGps = (GpsEntity) array[i + 1];
  153 + break;
  154 + } else if (gpsState.equals("reconnection")) {
  155 + nearGps = tempGps;
  156 + break;
  157 + }
  158 +
  159 + if (tempGps.getTimestamp() < st)
  160 + break;
  161 + }
  162 +
  163 + if (nearGps != null && i > 0) {
  164 + createSignalAbnormal(gpsState, nearGps, i, array, sch);
  165 + }
  166 + }
  167 +
  168 + private void createSignalAbnormal(String gpsState, GpsEntity nearGps, int i, Object[] array, ScheduleRealInfo sch) {
  169 + switch (gpsState) {
  170 + case "drift":
  171 + driftSignalAbnormal(nearGps, i, array, sch);
  172 + break;
  173 + case "reconnection":
  174 + offlineSignalAbnormal(nearGps, ((GpsEntity) array[i - 1]), sch);
  175 + break;
  176 + }
  177 + }
  178 +
  179 + /**
  180 + * 掉线异常状态记录
  181 + *
  182 + * @param e
  183 + * @param s
  184 + */
  185 + private void offlineSignalAbnormal(GpsEntity e, GpsEntity s, ScheduleRealInfo sch) {
  186 + long st = s.getTimestamp(), et = e.getTimestamp();
  187 +
  188 + //掉线超过10分钟才记录
  189 + if (et - st < (1000 * 60 * 10))
  190 + return;
  191 +
  192 + SignalAbnormal signalAbnormal = new SignalAbnormal();
  193 + signalAbnormal.setSt(st);
  194 + signalAbnormal.setEt(et);
  195 + signalAbnormal.setAbnormalType("reconnection");
  196 + signalAbnormal.setDestCode(sch.getQdzCode());
  197 + signalAbnormal.setOutOrIn(0);
  198 +
  199 + //截断GPS
  200 + e.setSignalState("truncation");
  201 +
  202 + //记录信号状态
  203 + SignalState signalState = SignalState.abnormalSignalSTate(sch, signalAbnormal);
  204 + signalStateData.put(signalState);
  205 + }
  206 +
  207 + /**
  208 + * 漂移异常状态记录
  209 + *
  210 + * @param nearGps
  211 + * @param i
  212 + * @param array
  213 + */
  214 + private void driftSignalAbnormal(GpsEntity nearGps, int i, Object[] array, ScheduleRealInfo sch) {
  215 + GpsEntity gps, s = null;
  216 + //找到漂移开始时间
  217 + for (; i >= 0; i--) {
  218 + gps = (GpsEntity) array[i];
  219 +
  220 + if (!gps.getSignalState().equals("drift") || i == 0
  221 + || gps.getSignalState().equals("truncation")) {
  222 + s = gps;
  223 + break;
  224 + }
  225 + }
  226 +
  227 + long st = s.getTimestamp(), et = nearGps.getTimestamp();
  228 + if (et - st < (1000 * 60 * 3))
  229 + return;
  230 + /*if (s != null){
  231 + st = s.getTimestamp();
  232 + //漂移小于3分钟
  233 + if(et - st < (1000 * 60 * 3))
  234 + return;
  235 + }*/
  236 +
  237 +
  238 + SignalAbnormal signalAbnormal = new SignalAbnormal();
  239 + signalAbnormal.setSt(st);
  240 + signalAbnormal.setEt(et);
  241 + signalAbnormal.setAbnormalType("drift");
  242 + signalAbnormal.setDestCode(sch.getQdzCode());
  243 + signalAbnormal.setOutOrIn(0);
  244 +
  245 + //截断GPS
  246 + nearGps.setSignalState("truncation");
  247 +
  248 + //记录信号状态
  249 + SignalState signalState = SignalState.abnormalSignalSTate(sch, signalAbnormal);
  250 + signalStateData.put(signalState);
  251 + }
252 252 }
253 253 \ No newline at end of file
... ...
src/main/java/com/bsth/data/gpsdata/recovery/GpsDataRecovery.java
... ... @@ -60,7 +60,7 @@ public class GpsDataRecovery implements ApplicationContextAware {
60 60 for (String nbbm : keys) {
61 61 Collections.sort(listMap.get(nbbm), comp);
62 62 threadPool.execute(new RecoveryThread(listMap.get(nbbm), count));
63   - /*if(nbbm.equals("YT-CD008"))
  63 + /*if(nbbm.equals("W9H-003"))
64 64 new RecoveryThread(listMap.get(nbbm), count).run();*/
65 65 }
66 66  
... ...
src/main/java/com/bsth/data/pilot80/PilotReport.java
... ... @@ -84,6 +84,8 @@ public class PilotReport {
84 84  
85 85 //下发调度指令
86 86 directiveService.send60Dispatch(outSch, dayOfSchedule.doneSum(nbbm), "请出@系统");
  87 + //下发线路切换指令
  88 + directiveService.lineChange(outSch.getClZbh(), outSch.getXlBm(), "请出@系统");
87 89 /* d80.setRemarks("计划出场时间:" + outSch.getDfsj());
88 90 //当前GPS位置
89 91 GpsEntity gps = gpsRealData.get(d80.getDeviceId());
... ...
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
... ... @@ -130,12 +130,12 @@ public class DayOfSchedule implements CommandLineRunner {
130 130 public void run(String... arg0) throws Exception {
131 131 basicDataLoader.loadAllData();
132 132 //从数据库恢复排班
133   - dataRecovery();
  133 + //dataRecovery();
134 134  
135 135 //翻班线程
136 136 Application.mainServices.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS);
137 137 //入库
138   - Application.mainServices.scheduleWithFixedDelay(schedulePstThread, 60, 60, TimeUnit.SECONDS);
  138 +// Application.mainServices.scheduleWithFixedDelay(schedulePstThread, 60, 60, TimeUnit.SECONDS);
139 139 //首班出场指令补发器
140 140 // Application.mainServices.scheduleWithFixedDelay(firstScheduleCheckThread, 30, 240, TimeUnit.SECONDS);
141 141 //班次误点扫描
... ... @@ -563,7 +563,7 @@ public class DayOfSchedule implements CommandLineRunner {
563 563 */
564 564 public boolean isFirstOut(ScheduleRealInfo sch){
565 565 List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh());
566   - if(list.get(0).equals(sch) && sch.getBcType().equals("out"))
  566 + if(list.get(0) == sch && sch.getBcType().equals("out"))
567 567 return true;
568 568 return false;
569 569 }
... ...
src/main/java/com/bsth/entity/CarPark.java
1 1 package com.bsth.entity;
2 2  
3   -import java.util.Date;
  3 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4 4  
5   -import javax.persistence.Column;
6   -import javax.persistence.Entity;
7   -import javax.persistence.GeneratedValue;
8   -import javax.persistence.Id;
9   -import javax.persistence.Table;
  5 +import javax.persistence.*;
  6 +import java.util.Date;
10 7  
11 8  
12 9 /**
... ... @@ -25,6 +22,7 @@ import javax.persistence.Table;
25 22  
26 23 @Entity
27 24 @Table(name = "bsth_c_car_park")
  25 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
28 26 public class CarPark {
29 27  
30 28 @Id
... ...
src/main/java/com/bsth/entity/Cars.java
... ... @@ -23,7 +23,7 @@ import java.util.Date;
23 23  
24 24 @Entity
25 25 @Table(name = "bsth_c_cars")
26   -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"})
  26 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
27 27 public class Cars extends BEntity implements Serializable {
28 28  
29 29 /** 主键Id */
... ...
src/main/java/com/bsth/entity/Line.java
... ... @@ -24,7 +24,7 @@ import java.util.Date;
24 24  
25 25 @Entity
26 26 @Table(name = "bsth_c_line")
27   -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"})
  27 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
28 28 public class Line implements Serializable {
29 29  
30 30 @Id
... ...
src/main/java/com/bsth/entity/Personnel.java
... ... @@ -21,7 +21,7 @@ import javax.persistence.*;
21 21  
22 22 @Entity
23 23 @Table(name = "bsth_c_personnel")
24   -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"})
  24 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
25 25 public class Personnel extends BEntity {
26 26  
27 27 /** 主键Id */
... ...
src/main/java/com/bsth/entity/Station.java
1 1 package com.bsth.entity;
2 2  
3   -import java.util.Date;
  3 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4 4  
5 5 import javax.persistence.Column;
6 6 import javax.persistence.Entity;
7   -import javax.persistence.GeneratedValue;
8   -import javax.persistence.GenerationType;
9 7 import javax.persistence.Id;
10 8 import javax.persistence.Table;
  9 +import java.util.Date;
11 10  
12 11  
13 12 /**
... ... @@ -26,6 +25,7 @@ import javax.persistence.Table;
26 25  
27 26 @Entity
28 27 @Table(name = "bsth_c_station")
  28 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
29 29 public class Station {
30 30  
31 31 @Id
... ...
src/main/java/com/bsth/entity/schedule/CarConfigInfo.java
... ... @@ -19,7 +19,7 @@ import java.util.Date;
19 19 @NamedAttributeNode("cl")
20 20 })
21 21 })
22   -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"})
  22 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
23 23 public class CarConfigInfo extends BEntity implements Serializable {
24 24  
25 25 /** 主健Id */
... ...
src/main/java/com/bsth/entity/schedule/EmployeeConfigInfo.java
... ... @@ -22,7 +22,7 @@ import java.io.Serializable;
22 22 @NamedAttributeNode("xl")
23 23 })
24 24 })
25   -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"})
  25 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
26 26 public class EmployeeConfigInfo extends BEntity implements Serializable {
27 27  
28 28 /** 主键Id */
... ...
src/main/java/com/bsth/entity/schedule/GuideboardInfo.java
... ... @@ -15,7 +15,7 @@ import javax.persistence.*;
15 15 @NamedAttributeNode("xl")
16 16 })
17 17 })
18   -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"})
  18 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
19 19 public class GuideboardInfo extends BEntity {
20 20  
21 21 /** 主键Id */
... ...
src/main/java/com/bsth/entity/schedule/TTInfo.java
1 1 package com.bsth.entity.schedule;
2 2  
3 3 import com.bsth.entity.Line;
  4 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4 5  
5 6 import javax.persistence.*;
6 7 import java.util.Date;
... ... @@ -17,6 +18,7 @@ import java.util.Date;
17 18 @NamedAttributeNode("updateBy")
18 19 })
19 20 })
  21 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
20 22 public class TTInfo extends BEntity {
21 23  
22 24 /** 主键Id */
... ...
src/main/java/com/bsth/entity/schedule/TTInfoDetail.java
... ... @@ -3,6 +3,7 @@ package com.bsth.entity.schedule;
3 3 import com.bsth.entity.CarPark;
4 4 import com.bsth.entity.Line;
5 5 import com.bsth.entity.Station;
  6 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
6 7  
7 8 import javax.persistence.*;
8 9  
... ... @@ -21,6 +22,7 @@ import javax.persistence.*;
21 22 @NamedAttributeNode("tcc")
22 23 })
23 24 })
  25 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
24 26 public class TTInfoDetail extends BEntity {
25 27  
26 28 /** 主健Id */
... ...
src/main/java/com/bsth/entity/sys/DutyEmployee.java 0 → 100644
  1 +package com.bsth.entity.sys;
  2 +
  3 +import javax.persistence.*;
  4 +
  5 +/**
  6 + * 当班调度员
  7 + * Created by panzhao on 2017/1/5.
  8 + */
  9 +@Entity
  10 +@Table(name = "bsth_c_sys_duty_employee")
  11 +public class DutyEmployee {
  12 +
  13 + @Id
  14 + @GeneratedValue
  15 + private Long id;
  16 +
  17 + /**
  18 + * 员工ID
  19 + */
  20 + private Integer uId;
  21 +
  22 + /**
  23 + * 员工姓名
  24 + */
  25 + private String uName;
  26 +
  27 + /**
  28 + * 线路编码 ,号分割多个
  29 + */
  30 + private String codeIdx;
  31 +
  32 + /**
  33 + * 登入线调时间
  34 + */
  35 + private Long ts;
  36 +
  37 + /**
  38 + * 是否主调模式进入
  39 + */
  40 + private boolean main;
  41 +
  42 + public Integer getuId() {
  43 + return uId;
  44 + }
  45 +
  46 + public void setuId(Integer uId) {
  47 + this.uId = uId;
  48 + }
  49 +
  50 + public String getuName() {
  51 + return uName;
  52 + }
  53 +
  54 + public void setuName(String uName) {
  55 + this.uName = uName;
  56 + }
  57 +
  58 + public String getCodeIdx() {
  59 + return codeIdx;
  60 + }
  61 +
  62 + public void setCodeIdx(String codeIdx) {
  63 + this.codeIdx = codeIdx;
  64 + }
  65 +
  66 + public Long getTs() {
  67 + return ts;
  68 + }
  69 +
  70 + public void setTs(Long ts) {
  71 + this.ts = ts;
  72 + }
  73 +
  74 + public boolean isMain() {
  75 + return main;
  76 + }
  77 +
  78 + public void setMain(boolean main) {
  79 + this.main = main;
  80 + }
  81 +
  82 + public Long getId() {
  83 + return id;
  84 + }
  85 +
  86 + public void setId(Long id) {
  87 + this.id = id;
  88 + }
  89 +}
... ...
src/main/java/com/bsth/entity/sys/SessionLog.java deleted 100644 → 0
1   -package com.bsth.entity.sys;
2   -
3   -import java.util.Date;
4   -
5   -import javax.persistence.Column;
6   -import javax.persistence.Entity;
7   -import javax.persistence.GeneratedValue;
8   -import javax.persistence.GenerationType;
9   -import javax.persistence.Id;
10   -import javax.persistence.ManyToOne;
11   -import javax.persistence.Table;
12   -
13   -/**
14   - *
15   - * @ClassName: SessionLog
16   - * @Description: TODO(session日志)
17   - * @author PanZhao
18   - * @date 2016年7月20日 下午4:46:27
19   - *
20   - */
21   -@Entity
22   -@Table(name = "bsth_c_sys_sessionlog")
23   -public class SessionLog {
24   -
25   - @Id
26   - @GeneratedValue(strategy = GenerationType.IDENTITY)
27   - private Integer id;
28   -
29   - @ManyToOne
30   - private SysUser user;
31   -
32   - /** 登录时间 */
33   - private Date loginDate;
34   -
35   - @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
36   - private Date createDate;
37   -
38   - /** 登出时间 */
39   - private Date logoutDate;
40   -
41   - /** 登出方式 0:主动登出, -1:其他 */
42   - private int logoutType;
43   -
44   - /** 登录IP */
45   - private String ip;
46   -
47   - public Integer getId() {
48   - return id;
49   - }
50   -
51   - public void setId(Integer id) {
52   - this.id = id;
53   - }
54   -
55   - public SysUser getUser() {
56   - return user;
57   - }
58   -
59   - public void setUser(SysUser user) {
60   - this.user = user;
61   - }
62   -
63   - public Date getLoginDate() {
64   - return loginDate;
65   - }
66   -
67   - public void setLoginDate(Date loginDate) {
68   - this.loginDate = loginDate;
69   - }
70   -
71   - public Date getCreateDate() {
72   - return createDate;
73   - }
74   -
75   - public void setCreateDate(Date createDate) {
76   - this.createDate = createDate;
77   - }
78   -
79   - public Date getLogoutDate() {
80   - return logoutDate;
81   - }
82   -
83   - public void setLogoutDate(Date logoutDate) {
84   - this.logoutDate = logoutDate;
85   - }
86   -
87   - public int getLogoutType() {
88   - return logoutType;
89   - }
90   -
91   - public void setLogoutType(int logoutType) {
92   - this.logoutType = logoutType;
93   - }
94   -
95   - public String getIp() {
96   - return ip;
97   - }
98   -
99   - public void setIp(String ip) {
100   - this.ip = ip;
101   - }
102   -}
src/main/java/com/bsth/entity/sys/SignControl.java deleted 100644 → 0
1   -package com.bsth.entity.sys;
2   -
3   -import java.util.Date;
4   -
5   -import javax.persistence.Entity;
6   -import javax.persistence.GeneratedValue;
7   -import javax.persistence.GenerationType;
8   -import javax.persistence.Id;
9   -import javax.persistence.ManyToOne;
10   -import javax.persistence.Table;
11   -
12   -/**
13   - *
14   - * @ClassName: SignControl
15   - * @Description: TODO(进出线调记录)
16   - * @author PanZhao
17   - * @date 2016年7月20日 下午4:50:50
18   - *
19   - */
20   -@Entity
21   -@Table(name = "bsth_c_sys_sign")
22   -public class SignControl {
23   -
24   - @Id
25   - @GeneratedValue(strategy = GenerationType.IDENTITY)
26   - private Integer id;
27   -
28   - @ManyToOne
29   - private SessionLog session;
30   -
31   - /** 登出线调时间 */
32   - private Date outDate;
33   -
34   - /** 在线时长 */
35   - private Long onLineTimel;
36   -
37   - /** 0: 主调模式, 1:监控模式 */
38   - private int signType;
39   -
40   - /** 用户名 */
41   - private String userName;
42   -
43   - public Integer getId() {
44   - return id;
45   - }
46   -
47   - public void setId(Integer id) {
48   - this.id = id;
49   - }
50   -
51   - public SessionLog getSession() {
52   - return session;
53   - }
54   -
55   - public void setSession(SessionLog session) {
56   - this.session = session;
57   - }
58   -
59   - public Date getOutDate() {
60   - return outDate;
61   - }
62   -
63   - public void setOutDate(Date outDate) {
64   - this.outDate = outDate;
65   - }
66   -
67   - public Long getOnLineTimel() {
68   - return onLineTimel;
69   - }
70   -
71   - public void setOnLineTimel(Long onLineTimel) {
72   - this.onLineTimel = onLineTimel;
73   - }
74   -
75   - public int getSignType() {
76   - return signType;
77   - }
78   -
79   - public void setSignType(int signType) {
80   - this.signType = signType;
81   - }
82   -
83   - public String getUserName() {
84   - return userName;
85   - }
86   -
87   - public void setUserName(String userName) {
88   - this.userName = userName;
89   - }
90   -}
src/main/java/com/bsth/entity/sys/SysUser.java
... ... @@ -9,7 +9,8 @@ import java.util.Set;
9 9  
10 10 @Entity
11 11 @Table(name = "bsth_c_sys_user")
12   -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"})
  12 +//@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"})
  13 +@JsonIgnoreProperties(ignoreUnknown = true)
13 14 public class SysUser {
14 15  
15 16 @Id
... ...
src/main/java/com/bsth/repository/realcontrol/ScheduleRealInfoRepository.java
... ... @@ -71,7 +71,7 @@ public interface ScheduleRealInfoRepository extends BaseRepository&lt;ScheduleRealI
71 71 @Query(value="select count(jName) from ScheduleRealInfo s where s.jName = ?1 and s.clZbh = ?2 and s.lpName = ?3 and sflj != 0")
72 72 int findLjbc(String jName,String clZbh,String lpName);
73 73  
74   - @Query(value="SELECT c.company,r.request_code,FROM_UNIXTIME(r.timestamp/1000,'%Y-%m-%d %T') FROM bsth_v_report_80 r LEFT JOIN bsth_c_cars c ON c.equipment_code = r.device_id where FROM_UNIXTIME(r.timestamp/1000,'%Y-%m-%d') = ?2 and r.line_id = ?1 and c.inside_code = ?3",nativeQuery=true)
  74 + @Query(value="SELECT c.company,r.request_code,FROM_UNIXTIME(r.timestamp/1000,'%Y-%m-%d %T'),c.inside_code FROM bsth_v_report_80 r LEFT JOIN bsth_c_cars c ON c.equipment_code = r.device_id where FROM_UNIXTIME(r.timestamp/1000,'%Y-%m-%d') = ?2 and r.line_id = ?1 and c.inside_code = ?3",nativeQuery=true)
75 75 List<Object[]> account(String line,String date,String code);
76 76  
77 77 @Query(value="select s from ScheduleRealInfo s where s.xlBm = ?1 and s.scheduleDate >= str_to_date(?2,'%Y-%m-%d') "
... ... @@ -110,7 +110,7 @@ public interface ScheduleRealInfoRepository extends BaseRepository&lt;ScheduleRealI
110 110 @Query(value="select s from ScheduleRealInfo s where s.xlBm like %?1% and DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?2")
111 111 List<ScheduleRealInfo> scheduleByDateAndLine(String line,String date);
112 112  
113   - @Query(value="select new map(s.scheduleDate as scheduleDate,s.xlBm as xlBm,s.clZbh as clZbh,s.jGh as jGh) from ScheduleRealInfo s where s.xlBm like %?1% and DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?2 GROUP BY xlBm,clZbh,jGh,scheduleDate,jGh ORDER BY xlBm,clZbh")
  113 + @Query(value="select new map(s.scheduleDate as scheduleDate,s.xlBm as xlBm,s.clZbh as clZbh,s.jGh as jGh) from ScheduleRealInfo s where s.xlBm like %?1% and DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?2 GROUP BY xlBm,clZbh,jGh,scheduleDate,jGh ORDER BY realExecDate,fcsj,xlBm,clZbh")
114 114 List<Map<String,Object>> yesterdayDataList(String line,String date);
115 115  
116 116 @Query(value="select s from ScheduleRealInfo s where DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?1 ORDER BY xlBm,lpName,clZbh,xlDir")
... ...
src/main/java/com/bsth/repository/schedule/TTInfoDetailRepository.java
... ... @@ -34,7 +34,10 @@ public interface TTInfoDetailRepository extends BaseRepository&lt;TTInfoDetail, Lon
34 34 @Query("select cc from TTInfoDetail cc where cc.id=?1")
35 35 TTInfoDetail findOneExtend(Long aLong);
36 36  
37   - void deleteByTtinfoId(Long ttid);
  37 +// TODO:在findOne中 @EntityGraph 无效
  38 +// @EntityGraph(value = "tTInfoDetail_xl_lp_qdz_zdz_tcc", type = EntityGraph.EntityGraphType.FETCH)
  39 +// @Override
  40 +// TTInfoDetail findOne(Long aLong);
38 41  
39 42 @Query(value = "select max(tt.fcno) as mx from bsth_c_s_ttinfo_detail tt where tt.xl =?1 and tt.ttinfo =?2", nativeQuery = true)
40 43 Long findMaxFcno(Integer xlid, Long ttinfoid);
... ... @@ -44,6 +47,6 @@ public interface TTInfoDetailRepository extends BaseRepository&lt;TTInfoDetail, Lon
44 47  
45 48 @Modifying
46 49 @Query(value = "delete from TTInfoDetail t where t.ttinfo.id = ?1")
47   - void deleteByTtinfo(Long ttinfoid);
  50 + void deleteByTtinfoIdWithModify(Long ttinfoid);
48 51  
49 52 }
... ...
src/main/java/com/bsth/repository/sys/DutyEmployeeRepository.java 0 → 100644
  1 +package com.bsth.repository.sys;
  2 +
  3 +import com.bsth.entity.sys.DutyEmployee;
  4 +import com.bsth.repository.BaseRepository;
  5 +import org.springframework.data.jpa.repository.Query;
  6 +import org.springframework.stereotype.Repository;
  7 +
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * Created by panzhao on 2017/1/5.
  12 + */
  13 +@Repository
  14 +public interface DutyEmployeeRepository extends BaseRepository<DutyEmployee, Long>{
  15 +
  16 + @Query("select t from DutyEmployee t where t.codeIdx like %?1% and t.ts > ?2 and t.ts < ?3")
  17 + List<DutyEmployee> findByLineAndTime(String lineCode, long st, long et);
  18 +}
... ...
src/main/java/com/bsth/repository/sys/SessionLogRepository.java deleted 100644 → 0
1   -package com.bsth.repository.sys;
2   -
3   -import org.springframework.stereotype.Repository;
4   -
5   -import com.bsth.entity.sys.SessionLog;
6   -import com.bsth.repository.BaseRepository;
7   -
8   -@Repository
9   -public interface SessionLogRepository extends BaseRepository<SessionLog, Integer>{
10   -
11   -}
src/main/java/com/bsth/service/gps/GpsServiceImpl.java
... ... @@ -58,7 +58,7 @@ public class GpsServiceImpl implements GpsService {
58 58  
59 59 int dayOfYear = sCal.get(Calendar.DAY_OF_YEAR);
60 60 /*
61   - * if(dayOfYear != eCal.get(Calendar.DAY_OF_YEAR)){
  61 + * if(dayOfYear != eCal.get(Calendar.DAY_OF_YEAR)){
62 62 * System.out.println("暂时不支持跨天查询..."); return null; }
63 63 */
64 64  
... ... @@ -195,7 +195,7 @@ public class GpsServiceImpl implements GpsService {
195 195 inv = inv.substring(0, inv.length() - 1);
196 196  
197 197 // 查询到离站数据
198   - //Map<String, ArrivalEntity> arrivalMap = findArrivalByTs(weekOfYear/* 30 */, st, et, inv);
  198 + Map<String, ArrivalEntity> arrivalMap = findArrivalByTs(weekOfYear/* 30 */, st, et, inv);
199 199  
200 200 String sql = "select DEVICE_ID,LON,LAT,TS,INOUT_STOP,SERVICE_STATE ,STOP_NO,DIRECTION,LINE_ID,SPEED_GPS from bsth_c_gps_info where days_year=? and device_id in ("
201 201 + inv + ") and ts > ? and ts < ?";
... ... @@ -239,11 +239,12 @@ public class GpsServiceImpl implements GpsService {
239 239 inOutStop = rs.getInt("INOUT_STOP");
240 240 map.put("inout_stop", inOutStop);
241 241  
242   - /*analyse = arrivalMap.get(rs.getString("DEVICE_ID") + "_" + rs.getLong("TS"));
243   - if (analyse != null) {
244   - map.put("inout_stop_info", analyse);
245   - map.put("inout_stop", analyse.getInOut());
246   - }*/
  242 + arrival = arrivalMap.get(rs.getString("DEVICE_ID") + "_" + rs.getLong("TS"));
  243 + if (arrival != null) {
  244 + map.put("inout_stop_info", arrival);
  245 + map.put("inout_stop", arrival.getInOut());
  246 + }
  247 +
247 248 map.put("nbbm", BasicData.deviceId2NbbmMap.get(rs.getString("DEVICE_ID")));
248 249 map.put("state", 0);
249 250 // 上下行
... ... @@ -272,11 +273,17 @@ public class GpsServiceImpl implements GpsService {
272 273  
273 274 rs = ps.executeQuery();
274 275 ArrivalEntity arr;
275   - int inOut;
  276 + int inOut, updown;
  277 + String prefix, stationName, lineId;
276 278 while (rs.next()) {
277   - arr = new ArrivalEntity(rs.getString("DEVICE_ID"), rs.getLong("TS"), rs.getString("LINE_ID"),
278   - rs.getInt("UP_DOWN"), rs.getString("STOP_NO"), rs.getInt("IN_OUT"), rs.getLong("CREATE_DATE"),
279   - rs.getInt("WEEKS_YEAR"), BasicData.stationCode2NameMap.get(rs.getString("STOP_NO")));
  279 + lineId = rs.getString("LINE_ID");
  280 + updown = rs.getInt("UP_DOWN");
  281 + prefix = lineId + "_" + updown + "_";
  282 + stationName = BasicData.getStationNameByCode(rs.getString("STOP_NO"), prefix);
  283 +
  284 + arr = new ArrivalEntity(rs.getString("DEVICE_ID"), rs.getLong("TS"), lineId,
  285 + updown, rs.getString("STOP_NO"), rs.getInt("IN_OUT"), rs.getLong("CREATE_DATE"),
  286 + rs.getInt("WEEKS_YEAR"), stationName);
280 287  
281 288 // 设备号_时间戳_进出状态 为key
282 289 // 反转进出状态
... ... @@ -382,7 +389,7 @@ public class GpsServiceImpl implements GpsService {
382 389  
383 390 gpsRealData.remove(device);
384 391 rs.put("status", ResponseCode.SUCCESS);
385   - }catch (Exception e){
  392 + } catch (Exception e) {
386 393 rs.put("status", ResponseCode.ERROR);
387 394 }
388 395 return rs;
... ...
src/main/java/com/bsth/service/oil/impl/YlbServiceImpl.java
... ... @@ -132,7 +132,7 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
132 132 t.setJcsx(Integer.parseInt(map.get("seqNumber").toString()));
133 133 t.setSsgsdm(map.get("company")==null?"":map.get("company").toString());
134 134 t.setFgsdm(map.get("bCompany")==null?"":map.get("bCompany").toString());
135   - t.setRq(dBefore);
  135 + t.setRq(sdf.parse(rq));
136 136 repository.save(t);
137 137 result = "success";
138 138 } catch (Exception e) {
... ...
src/main/java/com/bsth/service/realcontrol/RealMapService.java
... ... @@ -13,4 +13,6 @@ public interface RealMapService {
13 13 Map<String,Object> findRouteByLine(String lineCode);
14 14  
15 15 Map<String,Object> findRouteAndStationByLine(String lineCode);
  16 +
  17 + Map<String,Object> multiSectionRoute(String codeIdx);
16 18 }
... ...
src/main/java/com/bsth/service/realcontrol/ScheduleRealInfoService.java
... ... @@ -65,7 +65,7 @@ public interface ScheduleRealInfoService extends BaseService&lt;ScheduleRealInfo, L
65 65  
66 66 List<Map<String,Object>> dailyInfo(String line,String date,String type);
67 67  
68   - List<Object[]> historyMessage(String line,String date,String code);
  68 + List<Object[]> historyMessage(String line,String date,String code, String type);
69 69  
70 70 Map<Integer, Integer> trustStatus(String lineCodes);
71 71  
... ... @@ -93,9 +93,9 @@ public interface ScheduleRealInfoService extends BaseService&lt;ScheduleRealInfo, L
93 93  
94 94 List<Map<String,String>> findLpName(String lpName);
95 95  
96   - List<Map<String,Object>> account(String line,String date,String code,String xlName);
  96 + List<Map<String,Object>> account(String line,String date,String code,String xlName, String type);
97 97  
98   - List<ScheduleRealInfo> correctForm(String line,String startDate,String endDate,String lpName,String code);
  98 + List<ScheduleRealInfo> correctForm(String line,String startDate,String endDate,String lpName,String code, String type);
99 99  
100 100 List<ScheduleRealInfo> queryListWaybill(String jName,String clZbh,String lpName,String date,String type);
101 101  
... ...
src/main/java/com/bsth/service/realcontrol/impl/ChildTaskPlanServiceImpl.java
... ... @@ -43,7 +43,6 @@ public class ChildTaskPlanServiceImpl extends BaseServiceImpl&lt;ChildTaskPlan, Lon
43 43 ScheduleRealInfo sch = dayOfSchedule.get(t.getSchedule().getId());
44 44 Map<String, Object> rs;
45 45 //保存起终点名称
46   - Map<String, String> map = BasicData.stationCode2NameMap;
47 46 String prefix = sch.getXlBm() + "_" + sch.getXlDir() + "_";
48 47  
49 48 t.setStartStationName(BasicData.getStationNameByCode(t.getStartStation(), prefix));
... ...
src/main/java/com/bsth/service/realcontrol/impl/RealMapServiceImpl.java
... ... @@ -122,7 +122,7 @@ public class RealMapServiceImpl implements RealMapService {
122 122 rs.put("section", secList);
123 123  
124 124 //查询站点信息
125   - sql="select r.STATION_NAME,r.STATION_ROUTE_CODE,r.LINE_CODE,r.STATION_CODE,r.STATION_MARK,s.G_LONX,s.G_LATY, r.DIRECTIONS from bsth_c_stationroute r INNER JOIN bsth_c_station s on r.station=s.id and r.line_code=? and r.destroy=0";
  125 + sql = "select r.STATION_NAME,r.STATION_ROUTE_CODE,r.LINE_CODE,r.STATION_CODE,r.STATION_MARK,s.G_LONX,s.G_LATY, r.DIRECTIONS from bsth_c_stationroute r INNER JOIN bsth_c_station s on r.station=s.id and r.line_code=? and r.destroy=0";
126 126 List<Map<String, Object>> stationList = jdbcTemplate.queryForList(sql, lineCode);
127 127 rs.put("station", stationList);
128 128  
... ... @@ -134,6 +134,31 @@ public class RealMapServiceImpl implements RealMapService {
134 134 return rs;
135 135 }
136 136  
  137 + @Override
  138 + public Map<String, Object> multiSectionRoute(String codeIdx) {
  139 + Map<String, Object> rs = new HashMap<>();
  140 + try {
  141 + List<String> idArray = Splitter.on(",").splitToList(codeIdx);
  142 + //拼接in语句
  143 + String inStr = "";
  144 + for (String code : idArray) {
  145 + inStr += (",'" + code + "'");
  146 + }
  147 + inStr = " (" + inStr.substring(1) + ")";
  148 +
  149 + String sql = "SELECT r.LINE_CODE,r.SECTION_CODE,r.SECTIONROUTE_CODE,s.SECTION_NAME,ST_AsText (s.GSECTION_VECTOR) AS GSECTION_VECTOR,r.DIRECTIONS FROM bsth_c_sectionroute r INNER JOIN bsth_c_section s ON r.section = s.id WHERE r.line_code in " + inStr + " AND r.destroy = 0 order by r.line_code, r.directions,r.sectionroute_code";
  150 +
  151 + List<Map<String, Object>> secList = jdbcTemplate.queryForList(sql);
  152 + rs.put("section", secList);
  153 + rs.put("status", ResponseCode.SUCCESS);
  154 + } catch (DataAccessException e) {
  155 + logger.error("", e);
  156 + rs.put("status", ResponseCode.ERROR);
  157 + }
  158 +
  159 + return rs;
  160 + }
  161 +
137 162 /**
138 163 * wgs 坐标数组转 百度
139 164 *
... ...
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
... ... @@ -46,6 +46,7 @@ import org.slf4j.LoggerFactory;
46 46 import org.springframework.beans.factory.annotation.Autowired;
47 47 import org.springframework.stereotype.Service;
48 48  
  49 +import java.net.URLEncoder;
49 50 import java.text.DecimalFormat;
50 51 import java.text.ParseException;
51 52 import java.text.SimpleDateFormat;
... ... @@ -286,6 +287,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
286 287 t.setCreateBy(user);
287 288 t.setSflj(true);
288 289 t.setLate(false);
  290 + t.setDfsj(t.getFcsj());
289 291 t.setZdsjT(sdfyyyyMMddHHmm.parse(schDate + t.getZdsj()).getTime());
290 292  
291 293  
... ... @@ -293,8 +295,9 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
293 295 t.setBcsj(DateUtils.calcHHmmDiff(t.getFcsj(), t.getZdsj()) / 1000 / 60);
294 296  
295 297 //起终点名称
296   - t.setQdzName(BasicData.stationCode2NameMap.get(t.getQdzCode()));
297   - t.setZdzName(BasicData.stationCode2NameMap.get(t.getZdzCode()));
  298 + String prefix = t.getXlBm() + "_" + t.getXlDir() + "_";
  299 + t.setQdzName(BasicData.getStationNameByCode(t.getQdzCode(), prefix));
  300 + t.setZdzName(BasicData.getStationNameByCode(t.getZdzCode(), prefix));
298 301  
299 302 //计算班次实际时间
300 303 schAttrCalculator.calcRealDate(t).calcAllTimeByFcsj(t);
... ... @@ -617,7 +620,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
617 620 }
618 621  
619 622 @Override
620   - public List<Object[]> historyMessage(String line, String date, String code) {
  623 + public List<Object[]> historyMessage(String line, String date, String code, String type) {
621 624 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
622 625 long d= 0;
623 626 long t=0;
... ... @@ -639,6 +642,36 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
639 642 obj[4] = BasicData.lineCode2NameMap.get(line);
640 643 }
641 644 }
  645 +
  646 + if(type != null && type.length() != 0 && type.equals("export")){
  647 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  648 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  649 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  650 + Map<String,Object> m = new HashMap<String, Object>();
  651 + ReportUtils ee = new ReportUtils();
  652 + List<Map<String, Object>> newList = new ArrayList<Map<String, Object>>();
  653 + for(int i = 0; i < list.size(); i++){
  654 + Map<String, Object> map = new HashMap<String, Object>();
  655 + Object[] obj = list.get(i);
  656 + map.put("num", i + 1);
  657 + map.put("line", obj[4]);
  658 + map.put("clZbh", obj[0]);
  659 + map.put("sender", obj[1]);
  660 + map.put("date", obj[3]);
  661 + map.put("text", obj[2]);
  662 + newList.add(map);
  663 + }
  664 + try {
  665 + listI.add(newList.iterator());
  666 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  667 + ee.excelReplace(listI, new Object[] { m }, path+"mould\\historyMessage.xls",
  668 + path+"export\\调度历史消息" + sdfSimple.format(sdfMonth.parse(date)) + ".xls");
  669 + } catch (Exception e) {
  670 + // TODO: handle exception
  671 + e.printStackTrace();
  672 + }
  673 + }
  674 +
642 675 return list;
643 676 }
644 677  
... ... @@ -1218,13 +1251,15 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1218 1251  
1219 1252 @Override
1220 1253 public List<Map<String, Object>> account(String line, String date,
1221   - String code,String xlName) {
  1254 + String code,String xlName, String type) {
1222 1255 List<Object[]> lsitObj = scheduleRealInfoRepository.account(line,date,code);
1223 1256 List<Map<String,Object>> listMap = new ArrayList<Map<String,Object>>();
1224 1257 Map<String,Object> map;
  1258 + int i = 1;
1225 1259 for(Object[] obj : lsitObj){
1226 1260 if(obj != null){
1227 1261 map = new HashMap<String,Object>();
  1262 + map.put("num", i++);
1228 1263 map.put("xlName", xlName);
1229 1264 map.put("clZbh", obj[3]);
1230 1265 map.put("company", obj[0]);
... ... @@ -1233,13 +1268,65 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1233 1268 listMap.add(map);
1234 1269 }
1235 1270 }
  1271 +
  1272 + if(type != null && type.length() != 0 && type.equals("export")){
  1273 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  1274 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  1275 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  1276 + Map<String,Object> m = new HashMap<String, Object>();
  1277 + ReportUtils ee = new ReportUtils();
  1278 + Map<String, Object> typeMap = new HashMap<String, Object>();
  1279 + typeMap.put("0xA1", "请求恢复运营");
  1280 + typeMap.put("0xA2", "申请调档");
  1281 + typeMap.put("0xA3", "出场请求");
  1282 + typeMap.put("0xA5", "进场请求");
  1283 + typeMap.put("0xA7", "加油请求");
  1284 + typeMap.put("0x50", "车辆故障");
  1285 + typeMap.put("0x70", "路阻报告");
  1286 + typeMap.put("0x60", "事故报告");
  1287 + typeMap.put("0x11", "扣证纠纷");
  1288 + typeMap.put("0x12", "报警");
  1289 + for(Map<String, Object> map1 : listMap){
  1290 + map1.put("requestText", typeMap.get(map1.get("requestType")));
  1291 + }
  1292 + try {
  1293 + listI.add(listMap.iterator());
  1294 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  1295 + ee.excelReplace(listI, new Object[] { m }, path+"mould\\account.xls",
  1296 + path+"export\\驾驶员请求台账" + sdfSimple.format(sdfMonth.parse(date)) + ".xls");
  1297 + } catch (Exception e) {
  1298 + // TODO: handle exception
  1299 + e.printStackTrace();
  1300 + }
  1301 + }
  1302 +
1236 1303 return listMap;
1237 1304 }
1238 1305  
1239 1306 @Override
1240 1307 public List<ScheduleRealInfo> correctForm(String line, String startDate,
1241   - String endDate, String lpName, String code) {
  1308 + String endDate, String lpName, String code, String type) {
1242 1309 List<ScheduleRealInfo> list = scheduleRealInfoRepository.correctForm(line,startDate,endDate,lpName,code);
  1310 +
  1311 + if(type != null && type.length() != 0 && type.equals("export")){
  1312 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  1313 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  1314 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  1315 + Map<String,Object> m = new HashMap<String, Object>();
  1316 + ReportUtils ee = new ReportUtils();
  1317 + m.put("startDate", startDate);
  1318 + m.put("endDate", endDate);
  1319 + try {
  1320 + listI.add(list.iterator());
  1321 + String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
  1322 + ee.excelReplace(listI, new Object[] { m }, path+"mould\\correctForm.xls",
  1323 + path+"export\\" + URLEncoder.encode("修正报表", "UTF-8") + sdfSimple.format(sdfMonth.parse(startDate)) + "-" + sdfSimple.format(sdfMonth.parse(endDate)) + ".xls");
  1324 + } catch (Exception e) {
  1325 + // TODO: handle exception
  1326 + e.printStackTrace();
  1327 + }
  1328 + }
  1329 +
1243 1330 return list;
1244 1331 }
1245 1332  
... ... @@ -1566,7 +1653,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1566 1653  
1567 1654 @Override
1568 1655 public List<ScheduleRealInfo> realScheduleList(String line, String date) {
1569   - List<ScheduleRealInfo> listInfo = scheduleRealInfoRepository.queryUserInfo(line, date);
  1656 + /*List<ScheduleRealInfo> listInfo = scheduleRealInfoRepository.queryUserInfo(line, date);
1570 1657 List<ScheduleRealInfo> listTotal = scheduleRealInfoRepository.scheduleByDateAndLine(line, date);
1571 1658 for(ScheduleRealInfo info:listInfo){
1572 1659 for(ScheduleRealInfo total:listTotal){
... ... @@ -1574,7 +1661,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1574 1661  
1575 1662 }
1576 1663 }
1577   - }
  1664 + }*/
1578 1665 return scheduleRealInfoRepository.scheduleByDateAndLine(line, date);
1579 1666 }
1580 1667  
... ... @@ -1584,8 +1671,84 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1584 1671 // String date = sdfMonth.format(org.apache.commons.lang.time.DateUtils.addDays(new Date(), -1));
1585 1672 // String date = "2016-09-20";
1586 1673 List<Map<String,Object>> yesterdayDataList = scheduleRealInfoRepository.yesterdayDataList(line, date);
1587   - List<ScheduleRealInfo> list = scheduleRealInfoRepository.scheduleByDateAndLine(line, date);
1588   - for(ScheduleRealInfo scheduleRealInfo:list){
  1674 +// List<ScheduleRealInfo> list = scheduleRealInfoRepository.scheduleByDateAndLine(line, date);
  1675 + for(int x=0;x<yesterdayDataList.size();x++){
  1676 + String jName=yesterdayDataList.get(x).get("jGh").toString();
  1677 + String clZbh=yesterdayDataList.get(x).get("clZbh").toString();
  1678 + List<ScheduleRealInfo> lists=scheduleRealInfoRepository.queryListWaybill3(jName, clZbh, date);
  1679 + double jhlc = 0, yygl = 0, ksgl = 0,tempJhlc = 0,jcclc=0;
  1680 + float addMileage = 0l,remMileage = 0l;
  1681 + Map<String,Object> map = new HashMap<String, Object>();
  1682 + boolean fage=true;
  1683 + for(ScheduleRealInfo scheduleRealInfo : lists){
  1684 + if(fage){
  1685 + //根据线路代码获取公司
  1686 + Line li = lineRepository.findByLineCode(scheduleRealInfo.getXlBm());
  1687 + yesterdayDataList.get(x).put("company", li.getCompany());
  1688 + yesterdayDataList.get(x).put("bCompany", li.getBrancheCompany());
  1689 + fage=false;
  1690 + }
  1691 + if(scheduleRealInfo != null){
  1692 + //计划里程(主任务过滤掉临加班次),
  1693 + //烂班里程(主任务烂班),
  1694 + //临加里程(主任务临加),
  1695 + //计划班次,烂班班次,增加班次
  1696 + tempJhlc = scheduleRealInfo.getJhlc()==null?0:scheduleRealInfo.getJhlc();
  1697 + if(scheduleRealInfo.isSflj()){
  1698 + addMileage += tempJhlc;
  1699 + }else{
  1700 + if( !(scheduleRealInfo.getBcType().equals("in")
  1701 + ||scheduleRealInfo.getBcType().equals("out")) ){
  1702 + jhlc += tempJhlc;
  1703 + }
  1704 +
  1705 + if(scheduleRealInfo.getStatus() == -1){
  1706 + remMileage += tempJhlc;
  1707 + }
  1708 + }
  1709 + Set<ChildTaskPlan> childTaskPlans = scheduleRealInfo.getcTasks();
  1710 + //计算营运里程,空驶里程
  1711 + if(childTaskPlans.isEmpty()){
  1712 + if(scheduleRealInfo.getBcType().equals("in") ||
  1713 + scheduleRealInfo.getBcType().equals("out")){
  1714 + jcclc +=tempJhlc;
  1715 + }
  1716 + //主任务 放空班次属于营运
  1717 +// else if(scheduleRealInfo.getBcType().equals("venting")){
  1718 +// ksgl += tempJhlc;
  1719 +// }
  1720 + else{
  1721 + if(scheduleRealInfo.getStatus() != -1){
  1722 + yygl += tempJhlc;
  1723 + }
  1724 + }
  1725 + }else{
  1726 + Iterator<ChildTaskPlan> it = childTaskPlans.iterator();
  1727 + while(it.hasNext()){
  1728 + ChildTaskPlan childTaskPlan = it.next();
  1729 + if(childTaskPlan.getMileageType().equals("empty")){
  1730 + if(childTaskPlan.isDestroy()){
  1731 + remMileage += childTaskPlan.getMileage()==null?0:childTaskPlan.getMileage();
  1732 + }else{
  1733 + ksgl += childTaskPlan.getMileage()==null?0:childTaskPlan.getMileage();
  1734 + }
  1735 + }else{
  1736 + if(childTaskPlan.isDestroy()){
  1737 + remMileage += childTaskPlan.getMileage()==null?0:childTaskPlan.getMileage();
  1738 + }else{
  1739 + yygl += childTaskPlan.getMileage()==null?0:childTaskPlan.getMileage();
  1740 + }
  1741 + }
  1742 + }
  1743 + }
  1744 + }
  1745 + }
  1746 +
  1747 + yesterdayDataList.get(x).put("totalKilometers", yygl+ksgl+jcclc);
  1748 +
  1749 + }
  1750 +
  1751 + /* for(ScheduleRealInfo scheduleRealInfo:list){
1589 1752 if(scheduleRealInfo != null){
1590 1753 for(int i=0;i<yesterdayDataList.size();i++){
1591 1754 if(scheduleRealInfo.getXlBm().equals(yesterdayDataList.get(i).get("xlBm")) && scheduleRealInfo.getClZbh().equals(yesterdayDataList.get(i).get("clZbh"))
... ... @@ -1613,7 +1776,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1613 1776 }
1614 1777 }
1615 1778 }
1616   - }
  1779 + }*/
1617 1780 //增加顺序号
1618 1781 for(int i=0;i<yesterdayDataList.size();i++){
1619 1782 if(i == 0){
... ...
src/main/java/com/bsth/service/schedule/BService.java
1 1 package com.bsth.service.schedule;
2 2  
  3 +import com.bsth.service.schedule.exception.ScheduleException;
  4 +import com.bsth.service.schedule.utils.DataToolsService;
3 5 import org.springframework.data.domain.Page;
4 6 import org.springframework.data.domain.Pageable;
5 7  
... ... @@ -10,8 +12,8 @@ import java.util.Map;
10 12 /**
11 13 * 基础service接口。
12 14 */
13   -public interface BService<T, ID extends Serializable> {
14   - // CRUD 操作
  15 +public interface BService<T, ID extends Serializable> extends DataToolsService {
  16 + //---------------- CRUD 操作 ----------------//
15 17 // Create,Update操作
16 18 T save(T t);
17 19 <S extends T> List<S> bulkSave(List<S> entities); // 批量保存(TODO:待测试)
... ... @@ -22,4 +24,5 @@ public interface BService&lt;T, ID extends Serializable&gt; {
22 24 List<T> list(Map<String, Object> param);
23 25 // Delete操作
24 26 void delete(ID id) throws ScheduleException;
  27 +
25 28 }
... ...
src/main/java/com/bsth/service/schedule/CarConfigInfoService.java
1 1 package com.bsth.service.schedule;
2 2  
3 3 import com.bsth.entity.schedule.CarConfigInfo;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5  
5 6 /**
6 7 * Created by xu on 16/5/9.
... ...
src/main/java/com/bsth/service/schedule/CarDeviceService.java
1 1 package com.bsth.service.schedule;
2 2  
3 3 import com.bsth.entity.CarDevice;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5  
5 6 /**
6 7 * Created by xu on 16/12/15.
... ...
src/main/java/com/bsth/service/schedule/CarsService.java
1 1 package com.bsth.service.schedule;
2 2  
3 3 import com.bsth.entity.Cars;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5  
5 6 /**
6 7 * Created by xu on 16/12/8.
... ...
src/main/java/com/bsth/service/schedule/EmployeeConfigInfoService.java
1 1 package com.bsth.service.schedule;
2 2  
3 3 import com.bsth.entity.schedule.EmployeeConfigInfo;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5  
5 6 /**
6 7 * Created by xu on 16/5/10.
... ...
src/main/java/com/bsth/service/schedule/EmployeeService.java
1 1 package com.bsth.service.schedule;
2 2  
3 3 import com.bsth.entity.Personnel;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5  
5 6 /**
6 7 * Created by xu on 16/12/15.
... ...
src/main/java/com/bsth/service/schedule/GuideboardInfoService.java
1 1 package com.bsth.service.schedule;
2 2  
3 3 import com.bsth.entity.schedule.GuideboardInfo;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5  
5 6 /**
6 7 * Created by xu on 16/5/11.
... ...
src/main/java/com/bsth/service/schedule/PeopleCarPlanServiceImpl.java
1 1 package com.bsth.service.schedule;
2 2  
3 3 import java.math.BigDecimal;
  4 +import java.net.URLEncoder;
4 5 import java.sql.ResultSet;
5 6 import java.sql.SQLException;
6 7 import java.text.DecimalFormat;
... ... @@ -463,7 +464,7 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
463 464 listI.add(resList.iterator());
464 465 String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
465 466 ee.excelReplace(listI, new Object[] { m }, path+"mould\\workDaily.xls",
466   - path+"export\\营运服务日报表" + sdfSimple.format(sdfMonth.parse(date)) + ".xls");
  467 + path+"export\\营运服务日报表"+ sdfSimple.format(sdfMonth.parse(date))+".xls");
467 468 } catch (Exception e) {
468 469 // TODO: handle exception
469 470 e.printStackTrace();
... ... @@ -937,7 +938,7 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
937 938 tempMap.put("sjfcFirst0", "/");
938 939 tempMap.put("delayFirst0", "/");
939 940 }
940   - if(moban0.getZdsjActual() != null){
  941 + if(moban0.getFcsjActual() != null){
941 942 String[] split = moban0.getFcsjActual().split(":");
942 943 long min = Integer.valueOf(split[0])*60 + Integer.valueOf(split[1]);
943 944 long delay = moban0.getFcsjT() - min;
... ... @@ -963,7 +964,7 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
963 964 tempMap.put("sjfcFirst1", "/");
964 965 tempMap.put("delayFirst1", "/");
965 966 }
966   - if(moban1.getZdsjActual() != null){
  967 + if(moban1.getFcsjActual() != null){
967 968 String[] split = moban1.getFcsjActual().split(":");
968 969 long min = Integer.valueOf(split[0])*60 + Integer.valueOf(split[1]);
969 970 long delay = moban1.getFcsjT() - min;
... ...
src/main/java/com/bsth/service/schedule/TTInfoDetailService.java
1 1 package com.bsth.service.schedule;
2 2  
3 3 import com.bsth.entity.schedule.TTInfoDetail;
4   -import com.bsth.service.BaseService;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
5 5 import org.apache.commons.lang3.StringUtils;
6   -import org.springframework.web.multipart.MultipartFile;
7 6  
8   -import java.io.File;
9 7 import java.util.ArrayList;
10 8 import java.util.List;
11 9  
12 10 /**
13 11 * Created by xu on 16/7/2.
14 12 */
15   -public interface TTInfoDetailService extends BaseService<TTInfoDetail, Long> {
16   -
17   - void deleteByTtinfo(Long ttinfoid);
  13 +public interface TTInfoDetailService extends BService<TTInfoDetail, Long> {
18 14  
19 15 /**
20 16 * 发车信息内部类。
... ... @@ -34,7 +30,12 @@ public interface TTInfoDetailService extends BaseService&lt;TTInfoDetail, Long&gt; {
34 30 public FcInfo() {
35 31 }
36 32  
37   - public FcInfo(String ttdid_str, String bc_type, String fcsj, String xldir, String isfb) {
  33 + public FcInfo(
  34 + String ttdid_str,
  35 + String bc_type,
  36 + String fcsj,
  37 + String xldir,
  38 + String isfb) {
38 39 this.ttdid = StringUtils.isEmpty(ttdid_str) ? null : Long.valueOf(ttdid_str);
39 40 this.bc_type = bc_type;
40 41 this.fcsj = fcsj;
... ... @@ -98,6 +99,9 @@ public interface TTInfoDetailService extends BaseService&lt;TTInfoDetail, Long&gt; {
98 99 /** 内容数据 */
99 100 private List<List<FcInfo>> contents = new ArrayList<>();
100 101  
  102 + /** 营运描述 */
  103 + private String yy_desc;
  104 +
101 105 public List<String> getHeader() {
102 106 return header;
103 107 }
... ... @@ -113,6 +117,14 @@ public interface TTInfoDetailService extends BaseService&lt;TTInfoDetail, Long&gt; {
113 117 public void setContents(List<List<FcInfo>> contents) {
114 118 this.contents = contents;
115 119 }
  120 +
  121 + public String getYy_desc() {
  122 + return yy_desc;
  123 + }
  124 +
  125 + public void setYy_desc(String yy_desc) {
  126 + this.yy_desc = yy_desc;
  127 + }
116 128 }
117 129  
118 130 /**
... ... @@ -121,22 +133,28 @@ public interface TTInfoDetailService extends BaseService&lt;TTInfoDetail, Long&gt; {
121 133 * @param ttid 时刻表id
122 134 * @return
123 135 */
124   - EditInfo getEditInfo(Integer xlid, Long ttid) throws Exception;
  136 + EditInfo getEditInfo(Integer xlid, Long ttid) throws ScheduleException;
  137 +
  138 + /**
  139 + * 验证sheet(以后放到规则引擎里去做)。
  140 + * @param filename excel文件全路径名
  141 + * @param sheetname sheet名字
  142 + * @param lineid 线路id
  143 + */
  144 + void validateExcelSheet(
  145 + String filename,
  146 + String sheetname,
  147 + Integer lineid,
  148 + String linename) throws ScheduleException;
125 149  
126 150 /**
127   - * 上传并导入数据,和DataImportExportService的同名方法有差别。
128   - * @param datafile form上传文件
129   - * @param xlmc 线路名称
130   - * @param ttinfoname 时刻表名字
131   - * @param tccname 停车场名字
132   - * @throws Exception
  151 + * 验证关联的线路标准信息(以后放到规则引擎里去做)。
  152 + * @param lineinfoid 线路id
133 153 */
134   - void fileDataImport(MultipartFile datafile,
135   - String xlmc,
136   - String ttinfoname,
137   - String tccname) throws Exception;
  154 + void validateAssoLineInfo(Integer lineinfoid) throws ScheduleException;
138 155  
139   - void fileDataImport(File file, String sheetname, String xlmc, String ttinfoname, String tccname) throws Exception;
  156 + // TODO:这个方法可以用通用方法解决,以后改
  157 + List<TTInfoDetail> findBcdetails(Integer xlId, Long ttinfoId, Long lpId);
140 158  
141 159  
142 160 }
... ...
src/main/java/com/bsth/service/schedule/TTInfoDetailServiceImpl.java deleted 100644 → 0
1   -package com.bsth.service.schedule;
2   -
3   -import com.bsth.entity.schedule.TTInfoDetail;
4   -import com.bsth.repository.schedule.TTInfoDetailRepository;
5   -import com.bsth.service.impl.BaseServiceImpl;
6   -import com.bsth.service.schedule.utils.DataImportExportService;
7   -import com.bsth.service.schedule.utils.DataToolsProperties;
8   -import jxl.Sheet;
9   -import jxl.Workbook;
10   -import org.apache.commons.lang3.StringUtils;
11   -import org.joda.time.DateTime;
12   -import org.pentaho.di.trans.Trans;
13   -import org.pentaho.di.trans.TransMeta;
14   -import org.springframework.beans.factory.annotation.Autowired;
15   -import org.springframework.boot.context.properties.EnableConfigurationProperties;
16   -import org.springframework.stereotype.Service;
17   -import org.springframework.transaction.annotation.Isolation;
18   -import org.springframework.transaction.annotation.Propagation;
19   -import org.springframework.transaction.annotation.Transactional;
20   -import org.springframework.web.multipart.MultipartFile;
21   -
22   -import java.io.File;
23   -import java.util.ArrayList;
24   -import java.util.Arrays;
25   -import java.util.List;
26   -
27   -/**
28   - * Created by xu on 16/7/2.
29   - */
30   -@Service
31   -@EnableConfigurationProperties(DataToolsProperties.class)
32   -public class TTInfoDetailServiceImpl extends BaseServiceImpl<TTInfoDetail, Long> implements TTInfoDetailService {
33   - @Autowired
34   - private DataImportExportService dataImportExportService;
35   - @Autowired
36   - private DataToolsProperties dataToolsProperties;
37   - @Autowired
38   - private TTInfoDetailRepository ttInfoDetailRepository;
39   -
40   - @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
41   - @Override
42   - public void deleteByTtinfo(Long ttinfoid) {
43   - ttInfoDetailRepository.deleteByTtinfo(ttinfoid);
44   - }
45   -
46   - /**
47   - * 获取待编辑的数据。
48   - * @param xlid 线路id
49   - * @param ttid 时刻表id
50   - * @return
51   - */
52   - @Override
53   - public EditInfo getEditInfo(Integer xlid, Long ttid) throws Exception {
54   - // 1、使用ktr转换获取输出文件
55   - // 1.1、获取转换用ktr
56   - File ktrFile = new File(this.getClass().getResource(
57   - dataToolsProperties.getTtinfodetailForeditktr()).toURI());
58   - TransMeta transMeta = new TransMeta(ktrFile.getAbsolutePath());
59   - Trans trans = new Trans(transMeta);
60   -// trans.setLogLevel(LogLevel.DEBUG);
61   - // 1.2、设定命名参数,TODO:之后还要添加其他命名参数
62   - String outputFilePath = "ttinfodetail_" + new DateTime().toString("yyyy-MM-dd_HH-mm-ss");
63   - trans.setParameterValue("tempfilepath", dataToolsProperties.getTransTempdir() + File.separator + outputFilePath); // 数据输出文件路径
64   - trans.setParameterValue("xlid", String.valueOf(xlid));
65   - trans.setParameterValue("ttid", String.valueOf(ttid));
66   - // 1.3、执行转换
67   - trans.execute(null);
68   - // 1.4、等待转换结束
69   - trans.waitUntilFinished();
70   -
71   - // 1.5、判定ktr错误数,注意这种错误代表部分数据错误,不会终止转换执行,一般设计ktr的时候,会有错误输出文件,TODO:以后考虑使用日志实时输出
72   - if (trans.getErrors() > 0) {
73   - throw new Exception("转换数据部分错误,请查看相关错误输出文件!");
74   - }
75   -
76   - // 1.6、获取最大的发车数,用于输出数据的数量
77   - Long maxfcno = ttInfoDetailRepository.findMaxFcno(xlid, ttid);
78   - if (maxfcno == null)
79   - return new EditInfo();
80   -
81   - // 2、读取ktr生成的excel数据,组织编辑用数据返回
82   - // 2-1、读取Excel文件
83   - Workbook book = Workbook.getWorkbook(new File(dataToolsProperties.getTransTempdir() +
84   - File.separator + outputFilePath + ".xls"));
85   - Sheet sheet = book.getSheet(0);
86   - EditInfo editInfo = new EditInfo();
87   - // 2-2、处理数据
88   - String[] headarrays = new String[maxfcno.intValue() + 1];
89   - headarrays[0] = "路牌";
90   - for (int r = 1; r < sheet.getRows(); r++) {
91   - List<FcInfo> fcInfos = new ArrayList<>();
92   - // 每行第一列都是路牌
93   - fcInfos.add(new FcInfo(null, null, sheet.getCell(0, r).getContents(), null, null)); // 用fcsj放置路牌显示
94   - for (int c = 1; c <= maxfcno * 6; ) {
95   - String ttdid_str = sheet.getCell(c, r).getContents(); // 时刻表明细id
96   - String fcsj = sheet.getCell(c + 1, r).getContents(); // 发车时间
97   - String fzdname = sheet.getCell(c + 2, r).getContents(); // 发车站点名称
98   - String bctype = sheet.getCell(c + 3, r).getContents(); // 班次类型
99   - String xldir = sheet.getCell(c + 4, r).getContents(); // 线路上下行
100   - String isfb = sheet.getCell(c + 5, r).getContents(); // 是否分班
101   -
102   - FcInfo fcInfo = new FcInfo(ttdid_str, bctype, fcsj, xldir, isfb);
103   -
104   - if (StringUtils.isNotEmpty(fzdname))
105   - headarrays[(int)(c / 6) + 1] = fzdname;
106   - fcInfos.add(fcInfo);
107   -
108   - c += 6;
109   - }
110   - editInfo.getContents().add(fcInfos);
111   - }
112   - editInfo.getHeader().addAll(Arrays.asList(headarrays));
113   -
114   - return editInfo;
115   - }
116   -
117   - @Override
118   - /**
119   - * 上传并导入数据,和DataImportExportService的同名方法有差别。
120   - * @param datafile form上传文件
121   - * @param xlmc 线路名称
122   - * @param ttinfoname 时刻表名字
123   - * @param tccname 停车场名字
124   - * @throws Exception
125   - */
126   - public void fileDataImport(MultipartFile datafile,
127   - String xlmc,
128   - String ttinfoname,
129   - String tccname) throws Exception {
130   - // 上传数据文件
131   - File uploadFile = dataImportExportService.uploadFile(datafile);
132   - fileDataImport(uploadFile, "工作表1", xlmc, ttinfoname, tccname);
133   -
134   - }
135   -
136   - @Override
137   - public void fileDataImport(File uploadFile, String sheetname, String xlmc, String ttinfoname, String tccname) throws Exception {
138   - // 1、上传数据文件
139   - System.out.println("线路名称:" + xlmc);
140   - System.out.println("时刻表名称:" + ttinfoname);
141   - System.out.println("停车场名字:" + tccname);
142   - System.out.println("时刻表明细上传文件:" + uploadFile);
143   -
144   - // 2、jexcelapi读取excel文件
145   - Workbook book = Workbook.getWorkbook(uploadFile);
146   - Sheet sheet = book.getSheet(0);
147   - List<String> columnames = new ArrayList<>();
148   - for (int i = 0; i < sheet.getColumns(); i++) { // 获取第一行,数据,作为列名
149   - columnames.add(sheet.getCell(i, 0).getContents());
150   - }
151   -
152   - System.out.println("表头1:" + StringUtils.join(columnames.toArray(), ","));
153   -
154   - // 2、使用kettle运行封装数据导入逻辑的ktr转换文件
155   - // 2.1、初始化kettle(组件初始化已经做了)
156   - // 2.2、创建转换元数据,转换
157   - File ktrFile = new File(this.getClass().getResource(
158   - dataToolsProperties.getTtinfodetailMetadatainputktr()).toURI());
159   - File ktrFile2 = new File(this.getClass().getResource(
160   - dataToolsProperties.getTtinfodetailDatainputktr()).toURI());
161   - TransMeta transMeta = new TransMeta(ktrFile.getAbsolutePath());
162   - Trans trans = new Trans(transMeta);
163   - // 2.3、设定命名参数,用于指定数据文件,注意每个ktr必须都有以下指定的命名参数
164   - trans.setParameterValue("injectktrfile", ktrFile2.getAbsolutePath()); // 注入元数据的ktr文件
165   - trans.setParameterValue("filepath", uploadFile.getAbsolutePath()); // 指定导入数据文件的位置
166   - trans.setParameterValue("sheetname", sheetname); // sheet工作区的名字
167   - trans.setParameterValue("erroroutputdir", dataToolsProperties.getTransErrordir()); // ktr转换错误输出目录
168   - trans.setParameterValue("xlname", xlmc); // 线路名称
169   - trans.setParameterValue("ttinfoname", ttinfoname); // 时刻表名称
170   - trans.setParameterValue("tccname", tccname); // 停车场名字
171   - trans.setParameterValue("excelfieldnames", StringUtils.join(columnames.toArray(), ",")); // 时刻表excel输入字段名,以逗号连接
172   - columnames.remove(0);
173   - trans.setParameterValue("normalizefieldnames", StringUtils.join(columnames.toArray(), ",")); // 数据范式化字段名,以逗号连接
174   -
175   - // TODO:可以考虑设定日志输出
176   - // 2.4、执行转换
177   - trans.execute(null);
178   - // 2.5、等待转换结束
179   - trans.waitUntilFinished();
180   -
181   - // 3、判定ktr错误数,注意这种错误代表部分数据错误,不会终止转换执行,一般设计ktr的时候,会有错误输出文件,TODO:以后考虑使用日志实时输出
182   - if (trans.getErrors() > 0) {
183   - throw new Exception("转换数据部分错误,请查看相关错误输出文件!");
184   - }
185   - }
186   -}
src/main/java/com/bsth/service/schedule/TTInfoService.java
1 1 package com.bsth.service.schedule;
2 2  
3 3 import com.bsth.entity.schedule.TTInfo;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5  
5 6 /**
6 7 * Created by xu on 16/5/12.
... ...
src/main/java/com/bsth/service/schedule/ScheduleException.java renamed to src/main/java/com/bsth/service/schedule/exception/ScheduleException.java
1   -package com.bsth.service.schedule;
  1 +package com.bsth.service.schedule.exception;
2 2  
3 3 /**
4 4 * Created by xu on 16/12/5.
... ...
src/main/java/com/bsth/service/schedule/impl/BServiceImpl.java
... ... @@ -3,16 +3,19 @@ package com.bsth.service.schedule.impl;
3 3 import com.bsth.entity.search.CustomerSpecs;
4 4 import com.bsth.repository.BaseRepository;
5 5 import com.bsth.service.schedule.BService;
6   -import com.bsth.service.schedule.ScheduleException;
  6 +import com.bsth.service.schedule.exception.ScheduleException;
  7 +import com.bsth.service.schedule.utils.DataToolsService;
7 8 import org.slf4j.Logger;
8 9 import org.slf4j.LoggerFactory;
9 10 import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.beans.factory.annotation.Qualifier;
10 12 import org.springframework.beans.factory.annotation.Value;
11 13 import org.springframework.data.domain.Page;
12 14 import org.springframework.data.domain.Pageable;
13 15 import org.springframework.data.jpa.domain.Specification;
14 16  
15 17 import javax.persistence.EntityManager;
  18 +import java.io.File;
16 19 import java.io.Serializable;
17 20 import java.util.ArrayList;
18 21 import java.util.List;
... ... @@ -29,6 +32,10 @@ public class BServiceImpl&lt;T, ID extends Serializable&gt; implements BService&lt;T, ID&gt;
29 32 @Value("${hibernate.jdbc.batch_size}")
30 33 private int batchSize;
31 34  
  35 + @Autowired
  36 + @Qualifier(value = "dataToolsServiceImpl")
  37 + private DataToolsService dataToolsService;
  38 +
32 39 /** 日志记录器 */
33 40 protected Logger logger = LoggerFactory.getLogger(this.getClass());
34 41  
... ... @@ -108,4 +115,19 @@ public class BServiceImpl&lt;T, ID extends Serializable&gt; implements BService&lt;T, ID&gt;
108 115  
109 116 baseRepository.delete(id);
110 117 }
  118 +
  119 + @Override
  120 + public File uploadFile(String filename, byte[] filedata) throws ScheduleException {
  121 + return dataToolsService.uploadFile(filename, filedata);
  122 + }
  123 +
  124 + @Override
  125 + public void importData(File file, Map<String, Object> params) throws ScheduleException {
  126 + dataToolsService.importData(file, params);
  127 + }
  128 +
  129 + @Override
  130 + public File exportData(Map<String, Object> params) throws ScheduleException {
  131 + return dataToolsService.exportData(params);
  132 + }
111 133 }
... ...
src/main/java/com/bsth/service/schedule/impl/CarConfigInfoServiceImpl.java
... ... @@ -3,7 +3,7 @@ package com.bsth.service.schedule.impl;
3 3 import com.bsth.entity.schedule.CarConfigInfo;
4 4 import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
5 5 import com.bsth.service.schedule.CarConfigInfoService;
6   -import com.bsth.service.schedule.ScheduleException;
  6 +import com.bsth.service.schedule.exception.ScheduleException;
7 7 import com.bsth.service.schedule.ScheduleRule1FlatService;
8 8 import org.springframework.beans.factory.annotation.Autowired;
9 9 import org.springframework.stereotype.Service;
... ...
src/main/java/com/bsth/service/schedule/impl/CarDeviceServiceImpl.java
... ... @@ -4,7 +4,7 @@ import com.bsth.entity.CarDevice;
4 4 import com.bsth.entity.Cars;
5 5 import com.bsth.service.CarsService;
6 6 import com.bsth.service.schedule.CarDeviceService;
7   -import com.bsth.service.schedule.ScheduleException;
  7 +import com.bsth.service.schedule.exception.ScheduleException;
8 8 import org.springframework.beans.factory.annotation.Autowired;
9 9 import org.springframework.stereotype.Service;
10 10 import org.springframework.transaction.annotation.Transactional;
... ...
src/main/java/com/bsth/service/schedule/impl/CarsServiceImpl.java
... ... @@ -2,19 +2,91 @@ package com.bsth.service.schedule.impl;
2 2  
3 3 import com.bsth.entity.Cars;
4 4 import com.bsth.service.schedule.CarsService;
5   -import com.bsth.service.schedule.ScheduleException;
  5 +import com.bsth.service.schedule.exception.ScheduleException;
  6 +import com.bsth.service.schedule.utils.DataToolsProperties;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
6 11 import org.springframework.stereotype.Service;
7 12 import org.springframework.transaction.annotation.Transactional;
8 13 import org.springframework.util.CollectionUtils;
9 14  
  15 +import java.io.File;
  16 +import java.io.PrintWriter;
  17 +import java.io.StringWriter;
10 18 import java.util.HashMap;
11 19 import java.util.Map;
12 20  
13 21 /**
14 22 * Created by xu on 16/12/8.
15 23 */
  24 +@EnableConfigurationProperties(DataToolsProperties.class)
16 25 @Service(value = "carsServiceImpl_sc")
17 26 public class CarsServiceImpl extends BServiceImpl<Cars, Integer> implements CarsService {
  27 + /** 日志记录器 */
  28 + private static final Logger LOGGER = LoggerFactory.getLogger(CarsServiceImpl.class);
  29 +
  30 + @Autowired
  31 + private DataToolsProperties dataToolsProperties;
  32 +
  33 + @Override
  34 + public void importData(File file, Map<String, Object> params) throws ScheduleException {
  35 + try {
  36 + LOGGER.info("//---------------- 导入车辆基础信息 start... ----------------//");
  37 + // 创建ktr转换所需参数
  38 + Map<String, Object> ktrParms = new HashMap<>();
  39 + File ktrFile = new File(this.getClass().getResource(
  40 + dataToolsProperties.getCarsDatainputktr()).toURI());
  41 +
  42 + // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径
  43 + ktrParms.put("transpath", ktrFile.getAbsolutePath());
  44 + ktrParms.put("filepath", file.getAbsolutePath());
  45 + ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());
  46 +
  47 + super.importData(file, ktrParms);
  48 +
  49 + LOGGER.info("//---------------- 导入车辆基础信息 success... ----------------//");
  50 + } catch (Exception exp) {
  51 + LOGGER.info("//---------------- 导入车辆基础信息 failed... ----------------//");
  52 +
  53 + StringWriter sw = new StringWriter();
  54 + exp.printStackTrace(new PrintWriter(sw));
  55 + LOGGER.info(sw.toString());
  56 +
  57 + throw new ScheduleException(exp.getMessage());
  58 + }
  59 + }
  60 +
  61 + @Override
  62 + public File exportData(Map<String, Object> params) throws ScheduleException {
  63 + try {
  64 + LOGGER.info("//---------------- 导出车辆基础信息 start... ----------------//");
  65 + // 创建ktr转换所需参数
  66 + Map<String, Object> ktrParms = new HashMap<>();
  67 + File ktrFile = new File(this.getClass().getResource(
  68 + dataToolsProperties.getCarsDataoutputktr()).toURI());
  69 +
  70 + // 通用参数,转换文件路径,excel输出文件名
  71 + ktrParms.put("transpath", ktrFile.getAbsolutePath());
  72 + ktrParms.put("filename", "车辆基础信息_download-");
  73 +
  74 + File file = super.exportData(ktrParms);
  75 +
  76 + LOGGER.info("//---------------- 导出车辆基础信息 success... ----------------//");
  77 +
  78 + return file;
  79 +
  80 + } catch (Exception exp) {
  81 + LOGGER.info("//---------------- 导出车辆基础信息 failed... ----------------//");
  82 +
  83 + StringWriter sw = new StringWriter();
  84 + exp.printStackTrace(new PrintWriter(sw));
  85 + LOGGER.info(sw.toString());
  86 +
  87 + throw new ScheduleException(exp.getMessage());
  88 + }
  89 + }
18 90  
19 91 @Override
20 92 @Transactional
... ...
src/main/java/com/bsth/service/schedule/impl/EmployeeConfigInfoServiceImpl.java
... ... @@ -3,7 +3,7 @@ package com.bsth.service.schedule.impl;
3 3 import com.bsth.entity.schedule.EmployeeConfigInfo;
4 4 import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
5 5 import com.bsth.service.schedule.EmployeeConfigInfoService;
6   -import com.bsth.service.schedule.ScheduleException;
  6 +import com.bsth.service.schedule.exception.ScheduleException;
7 7 import com.bsth.service.schedule.ScheduleRule1FlatService;
8 8 import org.springframework.beans.factory.annotation.Autowired;
9 9 import org.springframework.stereotype.Service;
... ...
src/main/java/com/bsth/service/schedule/impl/EmployeeServiceImpl.java
... ... @@ -2,19 +2,92 @@ package com.bsth.service.schedule.impl;
2 2  
3 3 import com.bsth.entity.Personnel;
4 4 import com.bsth.service.schedule.EmployeeService;
5   -import com.bsth.service.schedule.ScheduleException;
  5 +import com.bsth.service.schedule.exception.ScheduleException;
  6 +import com.bsth.service.schedule.utils.DataToolsProperties;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
6 11 import org.springframework.stereotype.Service;
7 12 import org.springframework.transaction.annotation.Transactional;
8 13 import org.springframework.util.CollectionUtils;
9 14  
  15 +import java.io.File;
  16 +import java.io.PrintWriter;
  17 +import java.io.StringWriter;
10 18 import java.util.HashMap;
11 19 import java.util.Map;
12 20  
13 21 /**
14 22 * Created by xu on 16/12/15.
15 23 */
  24 +@EnableConfigurationProperties(DataToolsProperties.class)
16 25 @Service
17 26 public class EmployeeServiceImpl extends BServiceImpl<Personnel, Integer> implements EmployeeService {
  27 + /** 日志记录器 */
  28 + private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeServiceImpl.class);
  29 +
  30 + @Autowired
  31 + private DataToolsProperties dataToolsProperties;
  32 +
  33 + @Override
  34 + public void importData(File file, Map<String, Object> params) throws ScheduleException {
  35 + try {
  36 + LOGGER.info("//---------------- 导入人员基础信息 start... ----------------//");
  37 + // 创建ktr转换所需参数
  38 + Map<String, Object> ktrParms = new HashMap<>();
  39 + File ktrFile = new File(this.getClass().getResource(
  40 + dataToolsProperties.getEmployeesDatainputktr()).toURI());
  41 +
  42 + // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径
  43 + ktrParms.put("transpath", ktrFile.getAbsolutePath());
  44 + ktrParms.put("filepath", file.getAbsolutePath());
  45 + ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());
  46 +
  47 + super.importData(file, ktrParms);
  48 +
  49 + LOGGER.info("//---------------- 导入人员基础信息 success... ----------------//");
  50 + } catch (Exception exp) {
  51 + LOGGER.info("//---------------- 导入人员基础信息 failed... ----------------//");
  52 +
  53 + StringWriter sw = new StringWriter();
  54 + exp.printStackTrace(new PrintWriter(sw));
  55 + LOGGER.info(sw.toString());
  56 +
  57 + throw new ScheduleException(exp.getMessage());
  58 + }
  59 + }
  60 +
  61 + @Override
  62 + public File exportData(Map<String, Object> params) throws ScheduleException {
  63 + try {
  64 + LOGGER.info("//---------------- 导出人员基础信息 start... ----------------//");
  65 + // 创建ktr转换所需参数
  66 + Map<String, Object> ktrParms = new HashMap<>();
  67 + File ktrFile = new File(this.getClass().getResource(
  68 + dataToolsProperties.getEmployeesDataoutputktr()).toURI());
  69 +
  70 + // 通用参数,转换文件路径,excel输出文件名
  71 + ktrParms.put("transpath", ktrFile.getAbsolutePath());
  72 + ktrParms.put("filename", "人员基础信息_download-");
  73 +
  74 + File file = super.exportData(ktrParms);
  75 +
  76 + LOGGER.info("//---------------- 导出人员基础信息 success... ----------------//");
  77 +
  78 + return file;
  79 +
  80 + } catch (Exception exp) {
  81 + LOGGER.info("//---------------- 导出人员基础信息 failed... ----------------//");
  82 +
  83 + StringWriter sw = new StringWriter();
  84 + exp.printStackTrace(new PrintWriter(sw));
  85 + LOGGER.info(sw.toString());
  86 +
  87 + throw new ScheduleException(exp.getMessage());
  88 + }
  89 + }
  90 +
18 91 @Override
19 92 @Transactional
20 93 public void validate_gh(Personnel personnel) throws ScheduleException {
... ...
src/main/java/com/bsth/service/schedule/impl/GuideboardInfoServiceImpl.java
... ... @@ -3,7 +3,7 @@ package com.bsth.service.schedule.impl;
3 3 import com.bsth.entity.schedule.GuideboardInfo;
4 4 import com.bsth.entity.schedule.TTInfoDetail;
5 5 import com.bsth.service.schedule.GuideboardInfoService;
6   -import com.bsth.service.schedule.ScheduleException;
  6 +import com.bsth.service.schedule.exception.ScheduleException;
7 7 import com.bsth.service.schedule.TTInfoDetailService;
8 8 import org.springframework.beans.factory.annotation.Autowired;
9 9 import org.springframework.stereotype.Service;
... ...
src/main/java/com/bsth/service/schedule/impl/RerunServiceImpl.java
... ... @@ -2,7 +2,7 @@ package com.bsth.service.schedule.impl;
2 2  
3 3 import com.bsth.entity.schedule.rule.RerunRule;
4 4 import com.bsth.service.schedule.RerunService;
5   -import com.bsth.service.schedule.ScheduleException;
  5 +import com.bsth.service.schedule.exception.ScheduleException;
6 6 import org.springframework.stereotype.Service;
7 7 import org.springframework.transaction.annotation.Transactional;
8 8  
... ...
src/main/java/com/bsth/service/schedule/impl/TTInfoDetailServiceImpl.java 0 → 100644
  1 +package com.bsth.service.schedule.impl;
  2 +
  3 +import com.bsth.entity.CarPark;
  4 +import com.bsth.entity.LineInformation;
  5 +import com.bsth.entity.StationRoute;
  6 +import com.bsth.entity.schedule.GuideboardInfo;
  7 +import com.bsth.entity.schedule.TTInfoDetail;
  8 +import com.bsth.repository.schedule.TTInfoDetailRepository;
  9 +import com.bsth.service.CarParkService;
  10 +import com.bsth.service.LineInformationService;
  11 +import com.bsth.service.StationRouteService;
  12 +import com.bsth.service.schedule.GuideboardInfoService;
  13 +import com.bsth.service.schedule.TTInfoDetailService;
  14 +import com.bsth.service.schedule.exception.ScheduleException;
  15 +import com.bsth.service.schedule.utils.DataToolsProperties;
  16 +import jxl.Cell;
  17 +import jxl.Sheet;
  18 +import jxl.Workbook;
  19 +import jxl.write.Label;
  20 +import jxl.write.WritableSheet;
  21 +import jxl.write.WritableWorkbook;
  22 +import org.apache.commons.lang3.StringUtils;
  23 +import org.joda.time.DateTime;
  24 +import org.slf4j.Logger;
  25 +import org.slf4j.LoggerFactory;
  26 +import org.springframework.beans.factory.annotation.Autowired;
  27 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  28 +import org.springframework.stereotype.Service;
  29 +import org.springframework.util.CollectionUtils;
  30 +
  31 +import java.io.File;
  32 +import java.io.PrintWriter;
  33 +import java.io.StringWriter;
  34 +import java.util.*;
  35 +import java.util.regex.Matcher;
  36 +import java.util.regex.Pattern;
  37 +
  38 +/**
  39 + * Created by xu on 17/1/3.
  40 + */
  41 +@Service
  42 +@EnableConfigurationProperties(DataToolsProperties.class)
  43 +public class TTInfoDetailServiceImpl extends BServiceImpl<TTInfoDetail, Long> implements TTInfoDetailService {
  44 + /** 日志记录器 */
  45 + private static final Logger LOGGER = LoggerFactory.getLogger(TTInfoDetailServiceImpl.class);
  46 +
  47 + @Autowired
  48 + private GuideboardInfoService guideboardInfoService;
  49 + @Autowired
  50 + private StationRouteService stationRouteService;
  51 + @Autowired
  52 + private LineInformationService lineInformationService;
  53 + @Autowired
  54 + private CarParkService carParkService;
  55 + @Autowired
  56 + private TTInfoDetailRepository ttInfoDetailRepository;
  57 + @Autowired
  58 + private DataToolsProperties dataToolsProperties;
  59 +
  60 + @Override
  61 + public TTInfoDetail findById(Long aLong) {
  62 + return ttInfoDetailRepository.findOneExtend(aLong);
  63 + }
  64 +
  65 + @Override
  66 + public void importData(
  67 + File file,
  68 + Map<String, Object> params) throws ScheduleException {
  69 +
  70 + try {
  71 + LOGGER.info("//---------------- 导入时刻表明细 start... ----------------//");
  72 +
  73 + String filename = file.getAbsolutePath(); // xls文件名
  74 + String sheetname = String.valueOf(params.get("sheetname")); // sheet名字
  75 + Long ttid = Long.valueOf(String.valueOf(params.get("ttid"))); // 时刻表id
  76 + Long xlid = Long.valueOf(String.valueOf(params.get("xlid"))); // 线路id
  77 + Integer lineid = Integer.valueOf(String.valueOf(params.get("lineinfo"))); // 线路标准id
  78 + String xlname = String.valueOf(params.get("xlname")); // 线路名字
  79 + String ttname = String.valueOf(params.get("ttname")); // 时刻表名字
  80 +
  81 + LOGGER.info("参数1, xls文件名={},sheet名字={}", filename, sheetname);
  82 + LOGGER.info("参数2, 线路id={},线路名字={}", xlid, xlname);
  83 + LOGGER.info("参数3, 时刻表id={},时刻表名字={}", ttid, ttname);
  84 +
  85 + LOGGER.info("转换xls文件格式成文本格式...");
  86 + // 1、修改已经上传的excel文件,在每个起点站后标示数字,表示第几个班次
  87 + // 2、由于格式问题,需要把内容都转换成字符串
  88 + List<String> colList = new ArrayList<>();
  89 + Workbook workbook = Workbook.getWorkbook(new File(filename));
  90 + Sheet sheet = workbook.getSheet(sheetname);
  91 + Cell[] cells = sheet.getRow(0);
  92 + for (int i = 0; i < cells.length; i++) {
  93 + if (i == 0) {
  94 + colList.add(cells[i].getContents().trim());
  95 + } else {
  96 + colList.add(cells[i].getContents() + i);
  97 + }
  98 + }
  99 +
  100 + File fileCal = new File(filename + "_stringType.xls");
  101 + WritableWorkbook writableWorkbook = Workbook.createWorkbook(fileCal, workbook);
  102 + WritableSheet sheet1 = writableWorkbook.getSheet(sheetname);
  103 + for (int i = 0; i < sheet1.getColumns(); i++) { // 第一行数据
  104 + sheet1.addCell(new Label(i, 0, colList.get(i)));
  105 + }
  106 + for (int i = 1; i < sheet1.getRows(); i++) { // 第二行开始
  107 + Cell[] cells1 = sheet.getRow(i);
  108 + for (int j = 0; j < cells1.length; j++) {
  109 + sheet1.addCell(new Label(j, i, cells1[j].getContents()));
  110 + }
  111 + }
  112 + writableWorkbook.write();
  113 + writableWorkbook.close();
  114 +
  115 + // 2、删除原有数据
  116 + // 操作在ktr内部执行
  117 +
  118 + // 3、导入时刻表
  119 + // 获取停车场名字
  120 + LOGGER.info("获取停车场名字...");
  121 + LineInformation lineInformation = lineInformationService.findById(lineid);
  122 + Map<String, Object> p1 = new HashMap<>();
  123 + p1.put("parkCode_eq", lineInformation.getCarPark());
  124 + List<CarPark> carParkList = (List<CarPark>) carParkService.list(p1);
  125 + String tccname = carParkList.get(0).getParkName();
  126 + LOGGER.info("停车场名字={}", tccname);
  127 +
  128 +
  129 + // 计算表头参数
  130 + Workbook book = Workbook.getWorkbook(fileCal);
  131 + Sheet sheet_exp = book.getSheet(sheetname);
  132 + List<String> columnames = new ArrayList<>();
  133 + for (int i = 0; i < sheet_exp.getColumns(); i++) { // 获取第一行,数据,作为列名
  134 + columnames.add(sheet_exp.getCell(i, 0).getContents());
  135 + }
  136 + LOGGER.info("表头={}", StringUtils.join(columnames.toArray(), ","));
  137 +
  138 + // 创建ktr转换所需参数
  139 + Map<String, Object> ktrParms = new HashMap<>();
  140 + File ktrFile = new File(this.getClass().getResource(
  141 + dataToolsProperties.getTtinfodetailMetadatainputktr()).toURI());
  142 + File ktrFile2 = new File(this.getClass().getResource(
  143 + dataToolsProperties.getTtinfodetailDatainputktr()).toURI());
  144 +
  145 + // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径
  146 + ktrParms.put("transpath", ktrFile.getAbsolutePath());
  147 + ktrParms.put("filepath", fileCal.getAbsolutePath());
  148 + ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());
  149 +
  150 + // 附加参数
  151 + ktrParms.put("injectktrfile", ktrFile2.getAbsolutePath()); // 注入元数据的ktr文件
  152 + ktrParms.put("sheetname", sheetname); // sheet工作区的名字
  153 + ktrParms.put("xlname", xlname); // 线路名称
  154 + ktrParms.put("ttinfoname", ttname); // 时刻表名称
  155 + ktrParms.put("ttid", ttid.intValue()); // 时刻表id
  156 + ktrParms.put("tccname", tccname); // 停车场名字
  157 + ktrParms.put("excelfieldnames", StringUtils.join(columnames.toArray(), ",")); // 时刻表excel输入字段名,以逗号连接
  158 + columnames.remove(0);
  159 + ktrParms.put("normalizefieldnames", StringUtils.join(columnames.toArray(), ",")); // 数据范式化字段名,以逗号连接
  160 +
  161 + super.importData(fileCal, ktrParms);
  162 +
  163 + LOGGER.info("//---------------- 导入时刻表明细 success... ----------------//");
  164 + } catch (Exception exp) {
  165 + LOGGER.info("//---------------- 导入时刻表明细 failed... ----------------//");
  166 +
  167 + StringWriter sw = new StringWriter();
  168 + exp.printStackTrace(new PrintWriter(sw));
  169 + LOGGER.info(sw.toString());
  170 +
  171 + throw new ScheduleException(exp.getMessage());
  172 + }
  173 + }
  174 +
  175 + @Override
  176 + public File exportData(Map<String, Object> params) throws ScheduleException {
  177 + try {
  178 + LOGGER.info("//---------------- 导出时刻表明细 start... ----------------//");
  179 +
  180 + // 创建ktr转换所需参数
  181 + Map<String, Object> ktrParms = new HashMap<>();
  182 + File ktrFile = new File(this.getClass().getResource(
  183 + dataToolsProperties.getTtinfodetailMetaoutput()).toURI());
  184 + File ktrFile2 = new File(this.getClass().getResource(
  185 + dataToolsProperties.getTtinfodetailOutput()).toURI());
  186 +
  187 + // 通用参数,转换文件路径,excel输出文件名
  188 + ktrParms.put("transpath", ktrFile.getAbsolutePath());
  189 + ktrParms.put("filename", String.format("时刻表_(id=%s)_download-", String.valueOf(params.get("ttinfoid"))));
  190 +
  191 + // 附加参数
  192 + ktrParms.put("injectktrfile", ktrFile2.getAbsolutePath()); // 注入元数据的ktr文件
  193 + ktrParms.put("ttinfoid", String.valueOf(params.get("ttinfoid")));
  194 +
  195 + File file = super.exportData(ktrParms);
  196 +
  197 + LOGGER.info("//---------------- 导出时刻表明细 success... ----------------//");
  198 +
  199 + return file;
  200 + } catch (Exception exp) {
  201 + LOGGER.info("//---------------- 导出时刻表明细 failed... ----------------//");
  202 +
  203 + StringWriter sw = new StringWriter();
  204 + exp.printStackTrace(new PrintWriter(sw));
  205 + LOGGER.info(sw.toString());
  206 +
  207 + throw new ScheduleException(exp.getMessage());
  208 + }
  209 + }
  210 +
  211 + @Override
  212 + public EditInfo getEditInfo(Integer xlid, Long ttid) throws ScheduleException {
  213 + try {
  214 + LOGGER.info("//---------------- 时刻表编辑用数据输出 start... ----------------//");
  215 +
  216 + // 创建ktr转换所需参数
  217 + Map<String, Object> ktrParms = new HashMap<>();
  218 + File ktrFile = new File(this.getClass().getResource(
  219 + dataToolsProperties.getTtinfodetailForeditktr()).toURI());
  220 +
  221 + // 通用参数,转换文件路径,excel输出文件名,错误输出文件路径
  222 + ktrParms.put("transpath", ktrFile.getAbsolutePath());
  223 + ktrParms.put("filename", "todo");
  224 +
  225 + // 附加参数
  226 + String outputFilePath = String.format("ttinfodetail_(id=%s)_foredit-%s",
  227 + String.valueOf(ttid), new DateTime().toString("yyyyMMddHHmmss"));
  228 +
  229 + ktrParms.put("tempfilepath", dataToolsProperties.getTransTempdir() + File.separator + outputFilePath); // 数据输出文件路径
  230 + ktrParms.put("xlid", String.valueOf(xlid));
  231 + ktrParms.put("ttid", String.valueOf(ttid));
  232 +
  233 + super.exportData(ktrParms);
  234 +
  235 + // 1.6、获取最大的发车数,用于输出数据的数量
  236 + Long maxfcno = ttInfoDetailRepository.findMaxFcno(xlid, ttid);
  237 + if (maxfcno == null)
  238 + return new EditInfo();
  239 +
  240 + // 2、读取ktr生成的excel数据,组织编辑用数据返回
  241 + // 2-1、读取Excel文件
  242 + Workbook book = Workbook.getWorkbook(new File(dataToolsProperties.getTransTempdir() +
  243 + File.separator + outputFilePath + ".xls"));
  244 + Sheet sheet = book.getSheet(0);
  245 + EditInfo editInfo = new EditInfo();
  246 + // 2-2、处理数据
  247 + int all_bc = 0; // 总班次
  248 + double all_lc_ks = 0; // 总空驶里程
  249 + double all_lc_yy = 0; // 总营运里程
  250 +
  251 + String[] headarrays = new String[maxfcno.intValue() + 3];
  252 + headarrays[0] = "路牌";
  253 + headarrays[maxfcno.intValue() + 1] = "空驶班次/空驶里程";
  254 + headarrays[maxfcno.intValue() + 2] = "运营班次/运营里程";
  255 +
  256 + for (int r = 1; r < sheet.getRows(); r++) {
  257 + List<FcInfo> fcInfos = new ArrayList<>();
  258 + // 每行第一列都是路牌
  259 + fcInfos.add(new FcInfo(null, null, sheet.getCell(0, r).getContents(), null, null)); // 用fcsj放置路牌显示
  260 +
  261 + int bc_ks = 0; // 空驶班次
  262 + int bc_yy = 0; // 营运班次
  263 + double lc_ks = 0; // 空驶里程
  264 + double lc_yy = 0; // 营运里程
  265 +
  266 + for (int c = 1; c <= maxfcno * 7; ) {
  267 + String ttdid_str = sheet.getCell(c, r).getContents(); // 时刻表明细id
  268 + String fcsj = sheet.getCell(c + 1, r).getContents(); // 发车时间
  269 + String jhlc = sheet.getCell(c + 2, r).getContents(); // 计划里程
  270 + String fzdname = sheet.getCell(c + 3, r).getContents(); // 发车站点名称
  271 + String bctype = sheet.getCell(c + 4, r).getContents(); // 班次类型
  272 + String xldir = sheet.getCell(c + 5, r).getContents(); // 线路上下行
  273 + String isfb = sheet.getCell(c + 6, r).getContents(); // 是否分班
  274 +
  275 + FcInfo fcInfo = new FcInfo(ttdid_str, bctype, fcsj, xldir, isfb);
  276 +
  277 + if (StringUtils.isNotEmpty(fzdname))
  278 + headarrays[(int)(c / 7) + 1] = fzdname;
  279 + fcInfos.add(fcInfo);
  280 +
  281 + c += 7;
  282 +
  283 + // 计算班次里程
  284 + if (StringUtils.isNotEmpty(jhlc)) {
  285 + if ("in".equals(bctype) || "out".equals(bctype)) {
  286 + bc_ks += 1;
  287 + lc_ks += Double.valueOf(jhlc);
  288 +
  289 + all_bc += 1;
  290 + all_lc_ks += Double.valueOf(jhlc);
  291 +
  292 + } else {
  293 + bc_yy += 1;
  294 + lc_yy += Double.valueOf(jhlc);
  295 +
  296 + all_bc += 1;
  297 + all_lc_yy += Double.valueOf(jhlc);
  298 + }
  299 + }
  300 +
  301 + }
  302 +
  303 + // 添加一列 空驶班次/空驶里程,fcsj放置数据
  304 + fcInfos.add(new FcInfo(null, null, String.format("%d/%.2f", bc_ks, lc_ks), null, null));
  305 +
  306 + // 添加一列 营运班次/营运里程,fcsj放置数据
  307 + fcInfos.add(new FcInfo(null, null, String.format("%d/%.2f", bc_yy, lc_yy), null, null));
  308 +
  309 + editInfo.getContents().add(fcInfos);
  310 + }
  311 + editInfo.getHeader().addAll(Arrays.asList(headarrays));
  312 +
  313 + editInfo.setYy_desc(String.format("班次=%d,空驶里程=%.2f,营运里程=%.2f", all_bc, all_lc_ks, all_lc_yy));
  314 +
  315 + LOGGER.info("//---------------- 时刻表编辑用数据输出 success... ----------------//");
  316 +
  317 + return editInfo;
  318 + } catch (Exception exp) {
  319 + LOGGER.info("//---------------- 时刻表编辑用数据输出 failed... ----------------//");
  320 +
  321 + StringWriter sw = new StringWriter();
  322 + exp.printStackTrace(new PrintWriter(sw));
  323 + LOGGER.info(sw.toString());
  324 +
  325 + throw new ScheduleException(exp.getMessage());
  326 + }
  327 + }
  328 +
  329 +
  330 +
  331 + @Override
  332 + public void validateExcelSheet(String filename, String sheetname, Integer lineid, String linename) throws ScheduleException {
  333 + try {
  334 + Workbook book = Workbook.getWorkbook(new File(filename));
  335 + Sheet sheet = book.getSheet(sheetname);
  336 + if (sheet.getRows() == 0 || sheet.getColumns() == 0) { // 工作区是否为空
  337 + throw new Exception(String.format("%s 工作区没有数据!", sheetname));
  338 + } else {
  339 + if (sheet.getRows() <= 1 || sheet.getColumns() <= 1) {
  340 + throw new Exception(String.format("工作区至少包含2行2列的数据"));
  341 + } else {
  342 + Cell[] cells = sheet.getRow(0); // 获取第一行数据列
  343 + for (int i = 0; i < cells.length; i++) {
  344 + String cell_con = cells[i].getContents();
  345 +
  346 + if (StringUtils.isEmpty(cell_con)) {
  347 + throw new Exception(String.format("第1行,第%d列数据不能为空", i + 1));
  348 + } else {
  349 + // 正则表达式去除数字
  350 + cell_con = cell_con.replaceAll("[\\d+]", "");
  351 +
  352 + if (i == 0) { // 第一列必须是路牌2个字
  353 + if (!"路牌".equals(cell_con.trim())) {
  354 + throw new Exception("第1行,第1列数据必须是路牌2个字");
  355 + }
  356 + } else { // 排除出场,进场,其余内容到站点路由里查询,以各个方向的起点站为查询依据
  357 + if ((!"出场".equals(cell_con.trim())) &&
  358 + (!"进场".equals(cell_con.trim()))) {
  359 + Map<String, Object> p1 = new HashMap<>();
  360 + p1.put("line.id_eq", lineid);
  361 + p1.put("stationName_eq", cell_con.trim());
  362 + p1.put("stationMark_eq", "B");
  363 +
  364 +
  365 + // TODO:这里要修改(起点站有启用撤销的标志的)
  366 +
  367 + List<StationRoute> stationRouteList = (List<StationRoute>) stationRouteService.list(p1);
  368 + if (CollectionUtils.isEmpty(stationRouteList)) {
  369 + throw new Exception(String.format("第1行,第%d列数据%s在%s站点路由中不是起点站", i + 1, cell_con.trim(), linename));
  370 + } else if (stationRouteList.size() > 1) {
  371 + throw new Exception(String.format("第1行,第%d列数据%s在%s站点路由中上下行都是起点站", i + 1, cell_con.trim(), linename));
  372 + }
  373 + }
  374 +
  375 + }
  376 + }
  377 + }
  378 +
  379 + // 验证路牌内容
  380 + Map<String, Integer> gbindexmap = new HashMap<>(); // 记录每个路牌在第几行
  381 + for (int i = 1; i < sheet.getRows(); i++) { // 从第2行开始验证数据
  382 + Cell bcell = sheet.getRow(i)[0]; // 获取第1列
  383 + String bcell_con = bcell.getContents();
  384 + if (StringUtils.isEmpty(bcell_con)) {
  385 + throw new Exception(String.format("第%d行,第1列路牌无数据", i + 1));
  386 + } else if (gbindexmap.get(bcell_con.trim()) != null) {
  387 + throw new Exception(String.format("第%d行,第1列的路牌数据与第%d行,第1列数据重复",
  388 + i + 1,
  389 + gbindexmap.get(bcell_con.trim())));
  390 + } else {
  391 + Map<String, Object> p2 = new HashMap<>();
  392 + p2.put("xl.id_eq", lineid);
  393 + p2.put("lpName_eq", bcell_con.trim());
  394 + List<GuideboardInfo> guideboardInfoList = (List<GuideboardInfo>) guideboardInfoService.list(p2);
  395 + if (CollectionUtils.isEmpty(guideboardInfoList)) {
  396 + throw new Exception(String.format("第%d行,第1列的路牌在%s中不存在", i + 1, linename));
  397 + } else if (guideboardInfoList.size() > 1) {
  398 + throw new Exception(String.format("第%d行,第1列的路牌在%s中重复", i + 1, linename));
  399 + } else {
  400 + gbindexmap.put(bcell_con.trim(), i + 1);
  401 + }
  402 + }
  403 + }
  404 +
  405 + // 班次时间验证,正则表达式,格式hh:mm或者hhmm
  406 + String el = "^(([0-1]\\d)|(2[0-4])):[0-5]\\d$"; // hh:mm格式
  407 + String el2 = "^(([0-1]\\d)|(2[0-4]))[0-5]\\d$"; // hhmm格式
  408 + Pattern p = Pattern.compile(el);
  409 + Pattern p2 = Pattern.compile(el2);
  410 +
  411 + for (int i = 1; i < sheet.getRows(); i++) { // 从第2行开始验证数据
  412 + Cell[] bcells = sheet.getRow(i);
  413 + for (int j = 1; j < bcells.length; j++) { // 从第2列开始
  414 + String bcell_con = bcells[j].getContents();
  415 + if (StringUtils.isNotEmpty(bcell_con)) {
  416 + Matcher m = p.matcher(bcell_con.trim());
  417 + Matcher m2 = p2.matcher(bcell_con.trim());
  418 + if ((!m.matches()) && (!m2.matches())) {
  419 + throw new Exception(String.format("第%d行,第%d列的发车时间格式不正确,格式应为hh:mm或hhmm", i + 1, j + 1));
  420 + }
  421 + }
  422 + }
  423 + }
  424 + }
  425 +
  426 + }
  427 + } catch (Exception exp) {
  428 + throw new ScheduleException(exp.getMessage());
  429 + }
  430 +
  431 + }
  432 +
  433 + @Override
  434 + public void validateAssoLineInfo(Integer lineinfoid) throws ScheduleException {
  435 + LineInformation lineInformation = lineInformationService.findById(lineinfoid);
  436 + if (lineInformation.getUpInMileage() == null) {
  437 + throw new ScheduleException("上行进场里程为空");
  438 + } else if (lineInformation.getUpInTimer() == null) {
  439 + throw new ScheduleException("上行进场时间为空");
  440 + } else if (lineInformation.getUpOutMileage() == null) {
  441 + throw new ScheduleException("上行出场里程为空");
  442 + } else if (lineInformation.getUpOutTimer() == null) {
  443 + throw new ScheduleException("上行出场时间为空");
  444 + } else if (lineInformation.getUpMileage() == null) {
  445 + throw new ScheduleException("上行班次里程为空");
  446 + } else if (lineInformation.getUpTravelTime() == null) {
  447 + throw new ScheduleException("上行班次时间为空");
  448 + } else if (lineInformation.getDownInMileage() == null) {
  449 + throw new ScheduleException("下行进场里程为空");
  450 + } else if (lineInformation.getDownInTimer() == null) {
  451 + throw new ScheduleException("下行进场时间为空");
  452 + } else if (lineInformation.getDownOutMileage() == null) {
  453 + throw new ScheduleException("下行出场里程为空");
  454 + } else if (lineInformation.getDownOutTimer() == null) {
  455 + throw new ScheduleException("下行出场时间为空");
  456 + } else if (lineInformation.getDownMileage() == null) {
  457 + throw new ScheduleException("下行班次里程为空");
  458 + } else if (lineInformation.getDownTravelTime() == null) {
  459 + throw new ScheduleException("下行班次时间为空");
  460 + } else if (StringUtils.isEmpty(lineInformation.getCarPark())) {
  461 + throw new ScheduleException("停车场必须选择");
  462 + }
  463 +
  464 + // 单独验证停车场信息
  465 + String tcccode = lineInformation.getCarPark();
  466 + Map<String, Object> p1 = new HashMap<>();
  467 + p1.put("parkCode_eq", tcccode);
  468 + List<CarPark> carParkList = (List<CarPark>) carParkService.list(p1);
  469 + if (CollectionUtils.isEmpty(carParkList)) {
  470 + throw new ScheduleException(String.format("线路标准里的停车场code=%s,在停车场信息中未找到", tcccode));
  471 + } else if (carParkList.size() > 1) {
  472 + throw new ScheduleException(String.format("线路标准里的停车场code=%s,在停车场信息中有重复数据", tcccode));
  473 + } else {
  474 + CarPark carPark = carParkList.get(0);
  475 + if (StringUtils.isEmpty(carPark.getParkName())) {
  476 + throw new ScheduleException(String.format("线路标准里的停车场code=%s,在停车场信息中没有停车场名字", tcccode));
  477 + }
  478 + }
  479 +
  480 + }
  481 +
  482 + @Override
  483 + public List<TTInfoDetail> findBcdetails(Integer xlId, Long ttinfoId, Long lpId) {
  484 + return ttInfoDetailRepository.findBcdetails(xlId, ttinfoId, lpId);
  485 + }
  486 +}
... ...
src/main/java/com/bsth/service/schedule/impl/TTInfoServiceImpl.java
1 1 package com.bsth.service.schedule.impl;
2 2  
3 3 import com.bsth.entity.schedule.TTInfo;
4   -import com.bsth.service.schedule.ScheduleException;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
5 5 import com.bsth.service.schedule.TTInfoService;
6 6 import org.apache.commons.lang3.StringUtils;
7 7 import org.springframework.stereotype.Service;
... ...
src/main/java/com/bsth/service/schedule/utils/DataToolsService.java 0 → 100644
  1 +package com.bsth.service.schedule.utils;
  2 +
  3 +import com.bsth.service.schedule.exception.ScheduleException;
  4 +
  5 +import java.io.File;
  6 +import java.util.Map;
  7 +
  8 +/**
  9 + * 数据服务接口。
  10 + */
  11 +public interface DataToolsService {
  12 + //----------------- 数据服务操作 --------------//
  13 + // 上传文件
  14 + File uploadFile(String filename, byte[] filedata) throws ScheduleException;
  15 + // 导入数据
  16 + void importData(File file, Map<String, Object> params) throws ScheduleException;
  17 + // 导出数据
  18 + File exportData(Map<String, Object> params) throws ScheduleException;
  19 +}
... ...
src/main/java/com/bsth/service/schedule/utils/DataToolsServiceImpl.java 0 → 100644
  1 +package com.bsth.service.schedule.utils;
  2 +
  3 +import com.bsth.service.schedule.exception.ScheduleException;
  4 +import com.google.common.io.Files;
  5 +import org.apache.tika.Tika;
  6 +import org.joda.time.DateTime;
  7 +import org.pentaho.di.core.KettleEnvironment;
  8 +import org.pentaho.di.core.logging.KettleLogStore;
  9 +import org.pentaho.di.core.logging.LoggingBuffer;
  10 +import org.pentaho.di.core.logging.LoggingRegistry;
  11 +import org.pentaho.di.core.util.EnvUtil;
  12 +import org.pentaho.di.trans.Trans;
  13 +import org.pentaho.di.trans.TransMeta;
  14 +import org.slf4j.Logger;
  15 +import org.slf4j.LoggerFactory;
  16 +import org.springframework.beans.factory.InitializingBean;
  17 +import org.springframework.beans.factory.annotation.Autowired;
  18 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  19 +import org.springframework.stereotype.Service;
  20 +
  21 +import java.io.File;
  22 +import java.io.PrintWriter;
  23 +import java.io.StringWriter;
  24 +import java.util.HashMap;
  25 +import java.util.Map;
  26 +import java.util.Properties;
  27 +
  28 +/**
  29 + * Created by xu on 17/1/3.
  30 + */
  31 +@Service
  32 +@EnableConfigurationProperties(DataToolsProperties.class)
  33 +public class DataToolsServiceImpl implements DataToolsService, InitializingBean {
  34 + /** 日志记录器 */
  35 + private static final Logger LOGGER = LoggerFactory.getLogger(DataToolsServiceImpl.class);
  36 +
  37 + @Autowired
  38 + private DataToolsProperties dataToolsProperties;
  39 +
  40 + /**
  41 + * 自定义kettle环境初始化定义。
  42 + */
  43 + private void ktrEnvironmentInit() throws Exception {
  44 + // 由于kettle.properties可能没有(没有安装过kettle),
  45 + // 导致 EnvUtil.environmentInit() 报找不到kettle.properties文件
  46 + // 所以这里重写 EnvUtil.environmentInit() 方法
  47 +
  48 + if (Thread.currentThread().getContextClassLoader() == null) {
  49 + Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader());
  50 + }
  51 +
  52 + // 获取配置文件
  53 + File file = new File(getClass().getResource(dataToolsProperties.getKettleProperties()).toURI());
  54 + Properties kettleProperties = EnvUtil.readProperties(file.getAbsolutePath());
  55 + EnvUtil.applyKettleProperties(kettleProperties);
  56 + System.getProperties().put("Internal.Cluster.Size", "1");
  57 + System.getProperties().put("Internal.Slave.Transformation.Number", "0");
  58 + System.getProperties().put("Internal.Slave.Server.Name", "slave-trans-name");
  59 + System.getProperties().put("Internal.Step.CopyNr", "0");
  60 + System.getProperties().put("Internal.Step.Name", "step-name");
  61 + System.getProperties().put("Internal.Step.Partition.ID", "partition-id");
  62 + System.getProperties().put("Internal.Step.Partition.Number", "0");
  63 + System.getProperties().put("Internal.Step.Unique.Count", "1");
  64 + System.getProperties().put("Internal.Step.Unique.Number", "0");
  65 + if (!kettleProperties.containsKey("vfs.sftp.org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder.USER_DIR_IS_ROOT")) {
  66 + System.getProperties().put("vfs.sftp.org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder.USER_DIR_IS_ROOT", "false");
  67 + }
  68 +
  69 + }
  70 +
  71 + @Override
  72 + public void afterPropertiesSet() throws Exception {
  73 + // 初始化kettle环境(自定义)
  74 + ktrEnvironmentInit();
  75 +
  76 + // 添加全局ktr变量,并覆盖原来的设置
  77 + Map<String, String> kvars = new HashMap<>();
  78 + kvars.put("v_db_ip", dataToolsProperties.getKvarsDbip());
  79 + kvars.put("v_db_uname", dataToolsProperties.getKvarsDbuname());
  80 + kvars.put("v_db_pwd", dataToolsProperties.getKvarsDbpwd());
  81 + kvars.put("v_db_dname", dataToolsProperties.getKvarsDbdname());
  82 + EnvUtil.applyKettleProperties(kvars, true);
  83 + KettleEnvironment.init();
  84 + }
  85 +
  86 + @Override
  87 + public File uploadFile(String filename, byte[] filedata) throws ScheduleException {
  88 + // 上传文件
  89 + try {
  90 + LOGGER.info("start uploadFile...originalFilename={}", filename);
  91 + File newFile = new File(dataToolsProperties.getFileuploadDir() + File.separator +
  92 + filename + "-upload-" + new DateTime().toString("yyyyMMddHHmmss") + ".xls");
  93 + // TODO:判定是否excel数据
  94 + Tika tika = new Tika();
  95 + String type = tika.detect(filedata);
  96 + // application/x-tika-msoffice
  97 + LOGGER.info("文件格式={}", type);
  98 + if ("application/vnd.ms-excel".equals(type) || "application/x-tika-msoffice".equals(type)) {
  99 + // .xls 2007的格式
  100 + Files.write(filedata, newFile);
  101 + } else if ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet".equals(type)) {
  102 + // .xlsx 2007之后的格式
  103 + throw new Exception("暂时不支持.xlsx格式文件!");
  104 + } else {
  105 + // 非excel文件
  106 + throw new Exception("非.xls格式文件!");
  107 + }
  108 +
  109 + LOGGER.info("uploadFile success...newFilename={}", newFile.getAbsolutePath());
  110 +
  111 + return newFile;
  112 + } catch (Exception exp) {
  113 + LOGGER.info("uploadFile failed...stackTrace...");
  114 +
  115 + StringWriter sw = new StringWriter();
  116 + exp.printStackTrace(new PrintWriter(sw));
  117 + LOGGER.info(sw.toString());
  118 +
  119 + throw new ScheduleException("上传文件错误!");
  120 + }
  121 + }
  122 +
  123 + @Override
  124 + public void importData(File file, Map<String, Object> params) throws ScheduleException {
  125 + // 导入数据
  126 + String transLogId = "";
  127 + String transMetaLogId = "";
  128 + try {
  129 + LOGGER.info("start importData...originalFilename={}", file.getAbsolutePath());
  130 + // 检查参数
  131 + String transpath = String.valueOf(params.get("transpath"));
  132 + if ("null".equals(transpath)) {
  133 + throw new Exception(
  134 + "没有指定transpath参数值,无法确定ktr转换文件!");
  135 + }
  136 + File ktrFile = new File(transpath);
  137 + // 设置文件路径,错误输出文件路径参数
  138 + params.put("filepath", file.getAbsolutePath());
  139 + params.put("erroroutputdir", dataToolsProperties.getTransErrordir());
  140 +
  141 + // 2、使用kettle运行封装数据导入逻辑的ktr转换文件
  142 + // 2.1、初始化kettle(组件初始化已经做了)
  143 + // 2.2、创建转换元数据,转换
  144 + TransMeta transMeta = new TransMeta(ktrFile.getAbsolutePath());
  145 + Trans trans = new Trans(transMeta);
  146 + // 2.3、设定命名参数,用于指定数据文件,注意每个ktr必须都有以下指定的命名参数
  147 + for (String key : params.keySet()) {
  148 + trans.setParameterValue(key, String.valueOf(params.get(key)));
  149 + }
  150 + // 2.4、执行转换
  151 + trans.execute(null);
  152 + // 2.5、等待转换结束
  153 + trans.waitUntilFinished();
  154 +
  155 + // 获取日志
  156 + transLogId = trans.getLogChannelId();
  157 + transMetaLogId = transMeta.getLogChannelId();
  158 +
  159 + LoggingBuffer loggingBuffer = KettleLogStore.getAppender();
  160 + StringBuffer stringBuffer = loggingBuffer.getBuffer(
  161 + trans.getLogChannelId(), false
  162 + );
  163 + if (trans.getErrors() > 0) {
  164 + throw new Exception(stringBuffer.toString());
  165 + }
  166 + LOGGER.info(stringBuffer.toString());
  167 + LOGGER.info("importData success...");
  168 +
  169 + } catch (Exception exp) {
  170 + LOGGER.info("importData failed...statckTrace...");
  171 +
  172 + StringWriter sw = new StringWriter();
  173 + exp.printStackTrace(new PrintWriter(sw));
  174 + LOGGER.info(sw.toString());
  175 +
  176 + throw new ScheduleException("导入数据错误!");
  177 + } finally {
  178 + // 清除日志操作
  179 + KettleLogStore.discardLines(transLogId, true);
  180 + KettleLogStore.discardLines(transMetaLogId, true);
  181 + LoggingRegistry.getInstance().removeIncludingChildren(transLogId);
  182 + }
  183 + }
  184 +
  185 + @Override
  186 + public File exportData(Map<String, Object> params) throws ScheduleException {
  187 + // 导出数据
  188 + String transLogId = "";
  189 + String transMetaLogId = "";
  190 + try {
  191 + LOGGER.info("start exportData...");
  192 + // 检查参数
  193 + String filename = String.valueOf(params.get("filename"));
  194 + if ("null".equals(filename)) {
  195 + filename = "temp";
  196 + }
  197 + String transpath = String.valueOf(params.get("transpath"));
  198 + if ("null".equals(transpath)) {
  199 + throw new Exception(
  200 + "没有指定transpath参数值,无法确定ktr转换文件!");
  201 + }
  202 + File ktrFile = new File(transpath);
  203 + // 设置文件路径参数
  204 + String filepath = dataToolsProperties.getFileoutputDir() +
  205 + File.separator +
  206 + filename +
  207 + new DateTime().toString("yyyyMMddHHmmss") + ".xls";
  208 + params.put("filepath", filepath);
  209 +
  210 + // 2、使用kettle运行封装数据导入逻辑的ktr转换文件
  211 + // 2.1、初始化kettle(组件初始化已经做了)
  212 + // 2.2、创建转换元数据,转换
  213 + TransMeta transMeta = new TransMeta(ktrFile.getAbsolutePath());
  214 + Trans trans = new Trans(transMeta);
  215 + // 2.3、设定命名参数,用于指定数据文件,注意每个ktr必须都有以下指定的命名参数
  216 + for (String key : params.keySet()) {
  217 + trans.setParameterValue(key, String.valueOf(params.get(key)));
  218 + }
  219 + // 2.4、执行转换
  220 + trans.execute(null);
  221 + // 2.5、等待转换结束
  222 + trans.waitUntilFinished();
  223 +
  224 + // 获取日志
  225 + transLogId = trans.getLogChannelId();
  226 + transMetaLogId = transMeta.getLogChannelId();
  227 +
  228 + LoggingBuffer loggingBuffer = KettleLogStore.getAppender();
  229 + StringBuffer stringBuffer = loggingBuffer.getBuffer(
  230 + trans.getLogChannelId(), false
  231 + );
  232 + if (trans.getErrors() > 0) {
  233 + throw new Exception(stringBuffer.toString());
  234 + }
  235 + LOGGER.info(stringBuffer.toString());
  236 + LOGGER.info("exportData success...");
  237 +
  238 + return new File(filepath);
  239 + } catch (Exception exp) {
  240 + LOGGER.info("exportData failed...statckTrace...");
  241 +
  242 + StringWriter sw = new StringWriter();
  243 + exp.printStackTrace(new PrintWriter(sw));
  244 + LOGGER.info(sw.toString());
  245 +
  246 + throw new ScheduleException("导出数据错误!");
  247 + } finally {
  248 + // 清除日志操作
  249 + KettleLogStore.discardLines(transLogId, true);
  250 + KettleLogStore.discardLines(transMetaLogId, true);
  251 + LoggingRegistry.getInstance().removeIncludingChildren(transLogId);
  252 + }
  253 + }
  254 +}
... ...
src/main/java/com/bsth/service/sys/DutyEmployeeService.java 0 → 100644
  1 +package com.bsth.service.sys;
  2 +
  3 +import com.bsth.entity.sys.DutyEmployee;
  4 +import com.bsth.service.BaseService;
  5 +
  6 +import java.util.List;
  7 +
  8 +/**
  9 + * Created by panzhao on 2017/1/5.
  10 + */
  11 +public interface DutyEmployeeService extends BaseService<DutyEmployee, Long> {
  12 +
  13 + List<DutyEmployee> getDutyEmployee(String lineCode, String startTime, String endTime);
  14 +}
... ...
src/main/java/com/bsth/service/sys/impl/DutyEmployeeServiceImpl.java 0 → 100644
  1 +package com.bsth.service.sys.impl;
  2 +
  3 +import com.bsth.entity.sys.DutyEmployee;
  4 +import com.bsth.repository.sys.DutyEmployeeRepository;
  5 +import com.bsth.service.impl.BaseServiceImpl;
  6 +import com.bsth.service.sys.DutyEmployeeService;
  7 +import org.joda.time.format.DateTimeFormat;
  8 +import org.joda.time.format.DateTimeFormatter;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.stereotype.Service;
  11 +
  12 +import java.util.List;
  13 +import java.util.Map;
  14 +
  15 +/**
  16 + * Created by panzhao on 2017/1/5.
  17 + */
  18 +@Service
  19 +public class DutyEmployeeServiceImpl extends BaseServiceImpl<DutyEmployee, Long> implements DutyEmployeeService {
  20 +
  21 + @Autowired
  22 + DutyEmployeeRepository dutyEmployeeRepository;
  23 +
  24 + @Override
  25 + public Map<String, Object> save(DutyEmployee dutyEmployee) {
  26 + //登入时间,当前时间 - 10分钟
  27 + dutyEmployee.setTs(System.currentTimeMillis() - (1000 * 60 * 10));
  28 + return super.save(dutyEmployee);
  29 + }
  30 +
  31 +
  32 + /**
  33 + * 获取当班调度
  34 + *
  35 + * @param lineCode 线路编码
  36 + * @param startTime 开始时间 yyyy-MM-ddHH:mm
  37 + * @param endTime 结束时间 yyyy-MM-ddHH:mm
  38 + * @return
  39 + */
  40 + public List<DutyEmployee> getDutyEmployee(String lineCode, String startTime, String endTime) {
  41 + DateTimeFormatter fmtyyyyMMddHHmm = DateTimeFormat.forPattern("yyyy-MM-ddHH:mm");
  42 + return dutyEmployeeRepository.findByLineAndTime(lineCode + ",", fmtyyyyMMddHHmm.parseMillis(startTime), fmtyyyyMMddHHmm.parseMillis(endTime));
  43 + }
  44 +}
... ...
src/main/resources/datatools/config-prod.properties
... ... @@ -15,11 +15,11 @@ datatools.kvars_dbdname=control
15 15  
16 16 # 3、上传数据配置信息
17 17 # 上传文件目录配置(根据不同的环境需要修正)
18   -datatools.fileupload_dir=/opt/bsth_control_u_d_files
  18 +datatools.fileupload_dir=/home/bsth_control_u_d_files
19 19 # ktr转换文件,中配置的错误输出目录(根据不同的环境需要修正)
20   -datatools.trans_errordir=/opt/bsth_control_u_d_files/erroroutput
  20 +datatools.trans_errordir=/home/bsth_control_u_d_files/erroroutput
21 21 # 临时输出文件目录
22   -datatools.trans_tempdir=/opt/bsth_control_u_d_files/temp
  22 +datatools.trans_tempdir=/home/bsth_control_u_d_files/temp
23 23  
24 24 ##---------------------------- 导入数据ktr ----------------------------##
25 25 # 测试temp的ktr转换文件
... ... @@ -49,7 +49,7 @@ datatools.employeesconfig_datainputktr=/datatools/ktrs/employeesConfigDataInput.
49 49  
50 50 # 4、数据导出配置信息
51 51 # 导出数据文件目录配置(根据不同的环境需要修正)
52   -datatools.fileoutput_dir=/opt/bsth_control_u_d_files
  52 +datatools.fileoutput_dir=/home/bsth_control_u_d_files
53 53  
54 54 ##---------------------------- 导出数据ktr -----------------------------##
55 55 # 车辆信息导出ktr转换
... ...
src/main/resources/datatools/ktrs/ttinfodetailDataInput.ktr
... ... @@ -1182,7 +1182,7 @@
1182 1182 <name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</name>
1183 1183 <type>ExcelInput</type>
1184 1184 <description/>
1185   - <distribute>Y</distribute>
  1185 + <distribute>N</distribute>
1186 1186 <custom_distribution/>
1187 1187 <copies>1</copies>
1188 1188 <partitioning>
... ... @@ -1837,6 +1837,12 @@
1837 1837 <condition>&#x3d;</condition>
1838 1838 <name2/>
1839 1839 </key>
  1840 + <key>
  1841 + <name>iscanceled</name>
  1842 + <field>is_cancel</field>
  1843 + <condition>&#x3d;</condition>
  1844 + <name2/>
  1845 + </key>
1840 1846 <value>
1841 1847 <name>id</name>
1842 1848 <rename>lpid</rename>
... ... @@ -2662,6 +2668,18 @@
2662 2668 </step>
2663 2669  
2664 2670 <step_error_handling>
  2671 + <error>
  2672 + <source_step>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_s_ttinfo_detail</source_step>
  2673 + <target_step>Excel&#x8f93;&#x51fa;</target_step>
  2674 + <is_enabled>Y</is_enabled>
  2675 + <nr_valuename>c1</nr_valuename>
  2676 + <descriptions_valuename>c2</descriptions_valuename>
  2677 + <fields_valuename>c3</fields_valuename>
  2678 + <codes_valuename>c4</codes_valuename>
  2679 + <max_errors/>
  2680 + <max_pct_errors/>
  2681 + <min_pct_rows/>
  2682 + </error>
2665 2683 </step_error_handling>
2666 2684 <slave-step-copy-partition-distribution>
2667 2685 </slave-step-copy-partition-distribution>
... ...
src/main/resources/datatools/ktrs/ttinfodetailMetaData.ktr
... ... @@ -37,7 +37,7 @@
37 37 <parameter>
38 38 <name>sheetname</name>
39 39 <default_value>&#x5de5;&#x4f5c;&#x8868;1</default_value>
40   - <description/>
  40 + <description>xls sheet&#x540d;&#x5b57;</description>
41 41 </parameter>
42 42 <parameter>
43 43 <name>tccname</name>
... ... @@ -45,6 +45,11 @@
45 45 <description>&#x505c;&#x8f66;&#x573a;&#x540d;&#x5b57;</description>
46 46 </parameter>
47 47 <parameter>
  48 + <name>ttid</name>
  49 + <default_value>1</default_value>
  50 + <description>&#x65f6;&#x523b;&#x8868;id</description>
  51 + </parameter>
  52 + <parameter>
48 53 <name>ttinfoname</name>
49 54 <default_value>&#x8868;2</default_value>
50 55 <description>&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;</description>
... ... @@ -133,6 +138,7 @@
133 138 <data_tablespace/>
134 139 <index_tablespace/>
135 140 <attributes>
  141 + <attribute><code>EXTRA_OPTION_MYSQL.characterEncoding</code><attribute>utf8</attribute></attribute>
136 142 <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
137 143 <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
138 144 <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
... ... @@ -294,13 +300,14 @@
294 300 <hop> <from>&#x83b7;&#x53d6;&#x505c;&#x8f66;&#x573a;&#x540d;&#x79f0;</from><to>&#x589e;&#x52a0;&#x505c;&#x8f66;&#x573a;&#x540d;&#x79f0;metadata</to><enabled>Y</enabled> </hop>
295 301 <hop> <from>&#x589e;&#x52a0;&#x505c;&#x8f66;&#x573a;&#x540d;&#x79f0;metadata</from><to>&#x66ff;&#x6362;&#x505c;&#x8f66;&#x5382;&#x540d;&#x5b57; </to><enabled>Y</enabled> </hop>
296 302 <hop> <from>&#x66ff;&#x6362;&#x505c;&#x8f66;&#x5382;&#x540d;&#x5b57; </from><to>&#x505c;&#x8f66;&#x573a;&#x540d;&#x79f0;metadata&#x5b57;&#x6bb5;</to><enabled>Y</enabled> </hop>
297   - <hop> <from>&#x83b7;&#x53d6;&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;&#x540d;&#x79f0;</from><to>&#x589e;&#x52a0;&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;metadata</to><enabled>Y</enabled> </hop>
  303 + <hop> <from>&#x83b7;&#x53d6;&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;</from><to>&#x589e;&#x52a0;&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;metadata</to><enabled>Y</enabled> </hop>
298 304 <hop> <from>&#x589e;&#x52a0;&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;metadata</from><to>&#x66ff;&#x6362;&#x65f6;&#x523b;&#x8868;&#x540d;&#x5b57;</to><enabled>Y</enabled> </hop>
299 305 <hop> <from>&#x66ff;&#x6362;&#x65f6;&#x523b;&#x8868;&#x540d;&#x5b57;</from><to>&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;metadata&#x5b57;&#x6bb5;</to><enabled>Y</enabled> </hop>
300 306 <hop> <from>&#x7ebf;&#x8def;&#x540d;&#x79f0;metadata&#x5b57;&#x6bb5;</from><to>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</to><enabled>Y</enabled> </hop>
301 307 <hop> <from>&#x505c;&#x8f66;&#x573a;&#x540d;&#x79f0;metadata&#x5b57;&#x6bb5;</from><to>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</to><enabled>Y</enabled> </hop>
302 308 <hop> <from>&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;metadata&#x5b57;&#x6bb5;</from><to>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</to><enabled>Y</enabled> </hop>
303 309 <hop> <from>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</from><to>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</to><enabled>Y</enabled> </hop>
  310 + <hop> <from>&#x83b7;&#x53d6;&#x65f6;&#x523b;&#x8868;id</from><to>&#x5220;&#x9664;&#x4e4b;&#x524d;&#x7684;&#x660e;&#x7ec6;&#x4fe1;&#x606f;</to><enabled>Y</enabled> </hop>
304 311 </order>
305 312 <step>
306 313 <name>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</name>
... ... @@ -343,56 +350,6 @@
343 350 <target_detail>Y</target_detail>
344 351 <source_step>&#x83b7;&#x53d6;excel&#x6587;&#x4ef6;&#x540d;</source_step>
345 352 <source_field>filepath_</source_field>
346   - </mapping> <mapping> <target_step_name>&#x884c;&#x8f6c;&#x5217;</target_step_name>
347   - <target_attribute_key>NAME</target_attribute_key>
348   - <target_detail>Y</target_detail>
349   - <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c; 2</source_step>
350   - <source_field>fieldName</source_field>
351   - </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name>
352   - <target_attribute_key>NAME</target_attribute_key>
353   - <target_detail>Y</target_detail>
354   - <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step>
355   - <source_field>fieldname</source_field>
356   - </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name>
357   - <target_attribute_key>SHEET_NAME</target_attribute_key>
358   - <target_detail>Y</target_detail>
359   - <source_step>&#x83b7;&#x53d6;excel&#x6587;&#x4ef6;&#x540d;</source_step>
360   - <source_field>sheetname_</source_field>
361   - </mapping> <mapping> <target_step_name>&#x589e;&#x52a0;&#x65f6;&#x523b;&#x8868;&#x540d;&#x5b57;&#xff0c;&#x7ebf;&#x8def;&#x540d;&#x5b57;&#xff0c;&#x505c;&#x8f66;&#x573a;&#x540d;&#x5b57;</target_step_name>
362   - <target_attribute_key>NAME</target_attribute_key>
363   - <target_detail>Y</target_detail>
364   - <source_step>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</source_step>
365   - <source_field>col_name</source_field>
366   - </mapping> <mapping> <target_step_name>Excel&#x8f93;&#x5165;</target_step_name>
367   - <target_attribute_key>NAME</target_attribute_key>
368   - <target_detail>Y</target_detail>
369   - <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c;</source_step>
370   - <source_field>fieldName</source_field>
371   - </mapping> <mapping> <target_step_name>Excel&#x8f93;&#x5165;</target_step_name>
372   - <target_attribute_key>TRIM_TYPE</target_attribute_key>
373   - <target_detail>Y</target_detail>
374   - <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c;</source_step>
375   - <source_field>trim_type</source_field>
376   - </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name>
377   - <target_attribute_key>REPEAT</target_attribute_key>
378   - <target_detail>Y</target_detail>
379   - <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step>
380   - <source_field>repeat</source_field>
381   - </mapping> <mapping> <target_step_name>&#x73ed;&#x6b21;&#x6570;&#x636e;&#x8303;&#x5f0f;&#x5316;</target_step_name>
382   - <target_attribute_key>NORMALISED</target_attribute_key>
383   - <target_detail>Y</target_detail>
384   - <source_step>&#x589e;&#x52a0;normalize&#x5143;&#x6570;&#x636e;</source_step>
385   - <source_field>valuefield</source_field>
386   - </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name>
387   - <target_attribute_key>FORMAT</target_attribute_key>
388   - <target_detail>Y</target_detail>
389   - <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step>
390   - <source_field>format</source_field>
391   - </mapping> <mapping> <target_step_name>&#x73ed;&#x6b21;&#x6570;&#x636e;&#x8303;&#x5f0f;&#x5316;</target_step_name>
392   - <target_attribute_key>VALUE</target_attribute_key>
393   - <target_detail>Y</target_detail>
394   - <source_step>&#x589e;&#x52a0;normalize&#x5143;&#x6570;&#x636e;</source_step>
395   - <source_field>nfieldname</source_field>
396 353 </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name>
397 354 <target_attribute_key>PRECISION</target_attribute_key>
398 355 <target_detail>Y</target_detail>
... ... @@ -418,6 +375,16 @@
418 375 <target_detail>Y</target_detail>
419 376 <source_step>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</source_step>
420 377 <source_field>col_type</source_field>
  378 + </mapping> <mapping> <target_step_name>&#x884c;&#x8f6c;&#x5217;</target_step_name>
  379 + <target_attribute_key>NAME</target_attribute_key>
  380 + <target_detail>Y</target_detail>
  381 + <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c; 2</source_step>
  382 + <source_field>fieldName</source_field>
  383 + </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name>
  384 + <target_attribute_key>NAME</target_attribute_key>
  385 + <target_detail>Y</target_detail>
  386 + <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step>
  387 + <source_field>fieldname</source_field>
421 388 </mapping> <mapping> <target_step_name>&#x73ed;&#x6b21;&#x6570;&#x636e;&#x8303;&#x5f0f;&#x5316;</target_step_name>
422 389 <target_attribute_key>NAME</target_attribute_key>
423 390 <target_detail>Y</target_detail>
... ... @@ -429,20 +396,60 @@
429 396 <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step>
430 397 <source_field>length</source_field>
431 398 </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name>
  399 + <target_attribute_key>SHEET_NAME</target_attribute_key>
  400 + <target_detail>Y</target_detail>
  401 + <source_step>&#x83b7;&#x53d6;excel&#x6587;&#x4ef6;&#x540d;</source_step>
  402 + <source_field>sheetname_</source_field>
  403 + </mapping> <mapping> <target_step_name>&#x589e;&#x52a0;&#x65f6;&#x523b;&#x8868;&#x540d;&#x5b57;&#xff0c;&#x7ebf;&#x8def;&#x540d;&#x5b57;&#xff0c;&#x505c;&#x8f66;&#x573a;&#x540d;&#x5b57;</target_step_name>
  404 + <target_attribute_key>NAME</target_attribute_key>
  405 + <target_detail>Y</target_detail>
  406 + <source_step>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</source_step>
  407 + <source_field>col_name</source_field>
  408 + </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name>
432 409 <target_attribute_key>TYPE</target_attribute_key>
433 410 <target_detail>Y</target_detail>
434 411 <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step>
435 412 <source_field>fieldtype</source_field>
  413 + </mapping> <mapping> <target_step_name>Excel&#x8f93;&#x5165;</target_step_name>
  414 + <target_attribute_key>NAME</target_attribute_key>
  415 + <target_detail>Y</target_detail>
  416 + <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c;</source_step>
  417 + <source_field>fieldName</source_field>
436 418 </mapping> <mapping> <target_step_name>&#x884c;&#x8f6c;&#x5217;</target_step_name>
437 419 <target_attribute_key>VALUE</target_attribute_key>
438 420 <target_detail>Y</target_detail>
439 421 <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c; 2</source_step>
440 422 <source_field>fieldName</source_field>
  423 + </mapping> <mapping> <target_step_name>Excel&#x8f93;&#x5165;</target_step_name>
  424 + <target_attribute_key>TRIM_TYPE</target_attribute_key>
  425 + <target_detail>Y</target_detail>
  426 + <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c;</source_step>
  427 + <source_field>trim_type</source_field>
441 428 </mapping> <mapping> <target_step_name>&#x884c;&#x8f6c;&#x5217;</target_step_name>
442 429 <target_attribute_key>NORMALISED</target_attribute_key>
443 430 <target_detail>Y</target_detail>
444 431 <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c; 2</source_step>
445 432 <source_field>value</source_field>
  433 + </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name>
  434 + <target_attribute_key>REPEAT</target_attribute_key>
  435 + <target_detail>Y</target_detail>
  436 + <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step>
  437 + <source_field>repeat</source_field>
  438 + </mapping> <mapping> <target_step_name>&#x73ed;&#x6b21;&#x6570;&#x636e;&#x8303;&#x5f0f;&#x5316;</target_step_name>
  439 + <target_attribute_key>NORMALISED</target_attribute_key>
  440 + <target_detail>Y</target_detail>
  441 + <source_step>&#x589e;&#x52a0;normalize&#x5143;&#x6570;&#x636e;</source_step>
  442 + <source_field>valuefield</source_field>
  443 + </mapping> <mapping> <target_step_name>&#x73ed;&#x6b21;&#x6570;&#x636e;&#x8303;&#x5f0f;&#x5316;</target_step_name>
  444 + <target_attribute_key>VALUE</target_attribute_key>
  445 + <target_detail>Y</target_detail>
  446 + <source_step>&#x589e;&#x52a0;normalize&#x5143;&#x6570;&#x636e;</source_step>
  447 + <source_field>nfieldname</source_field>
  448 + </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name>
  449 + <target_attribute_key>FORMAT</target_attribute_key>
  450 + <target_detail>Y</target_detail>
  451 + <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step>
  452 + <source_field>format</source_field>
446 453 </mapping> <mapping> <target_step_name>Excel&#x8f93;&#x5165;</target_step_name>
447 454 <target_attribute_key>PRECISION</target_attribute_key>
448 455 <target_detail>Y</target_detail>
... ... @@ -1100,7 +1107,7 @@
1100 1107 </step>
1101 1108  
1102 1109 <step>
1103   - <name>&#x83b7;&#x53d6;&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;&#x540d;&#x79f0;</name>
  1110 + <name>&#x83b7;&#x53d6;&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;</name>
1104 1111 <type>GetVariable</type>
1105 1112 <description/>
1106 1113 <distribute>Y</distribute>
... ... @@ -1217,6 +1224,72 @@
1217 1224 </GUI>
1218 1225 </step>
1219 1226  
  1227 + <step>
  1228 + <name>&#x83b7;&#x53d6;&#x65f6;&#x523b;&#x8868;id</name>
  1229 + <type>GetVariable</type>
  1230 + <description/>
  1231 + <distribute>Y</distribute>
  1232 + <custom_distribution/>
  1233 + <copies>1</copies>
  1234 + <partitioning>
  1235 + <method>none</method>
  1236 + <schema_name/>
  1237 + </partitioning>
  1238 + <fields>
  1239 + <field>
  1240 + <name>ttid_</name>
  1241 + <variable>&#x24;&#x7b;ttid&#x7d;</variable>
  1242 + <type>Integer</type>
  1243 + <format/>
  1244 + <currency/>
  1245 + <decimal/>
  1246 + <group/>
  1247 + <length>-1</length>
  1248 + <precision>-1</precision>
  1249 + <trim_type>none</trim_type>
  1250 + </field>
  1251 + </fields>
  1252 + <cluster_schema/>
  1253 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1254 + <xloc>427</xloc>
  1255 + <yloc>26</yloc>
  1256 + <draw>Y</draw>
  1257 + </GUI>
  1258 + </step>
  1259 +
  1260 + <step>
  1261 + <name>&#x5220;&#x9664;&#x4e4b;&#x524d;&#x7684;&#x660e;&#x7ec6;&#x4fe1;&#x606f;</name>
  1262 + <type>ExecSQL</type>
  1263 + <description/>
  1264 + <distribute>Y</distribute>
  1265 + <custom_distribution/>
  1266 + <copies>1</copies>
  1267 + <partitioning>
  1268 + <method>none</method>
  1269 + <schema_name/>
  1270 + </partitioning>
  1271 + <connection>bus_control_variable</connection>
  1272 + <execute_each_row>Y</execute_each_row>
  1273 + <single_statement>N</single_statement>
  1274 + <replace_variables>N</replace_variables>
  1275 + <quoteString>N</quoteString>
  1276 + <sql>delete from bsth_c_s_ttinfo_detail where ttinfo &#x3d; &#x3f;</sql>
  1277 + <set_params>N</set_params>
  1278 + <insert_field/>
  1279 + <update_field/>
  1280 + <delete_field/>
  1281 + <read_field/>
  1282 + <arguments>
  1283 + <argument><name>ttid_</name></argument>
  1284 + </arguments>
  1285 + <cluster_schema/>
  1286 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1287 + <xloc>627</xloc>
  1288 + <yloc>26</yloc>
  1289 + <draw>Y</draw>
  1290 + </GUI>
  1291 + </step>
  1292 +
1220 1293 <step_error_handling>
1221 1294 </step_error_handling>
1222 1295 <slave-step-copy-partition-distribution>
... ...