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 124 changed files with 4286 additions and 2257 deletions
@@ -155,6 +155,12 @@ @@ -155,6 +155,12 @@
155 <version>2.1.8</version> 155 <version>2.1.8</version>
156 </dependency> 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 <!-- pentaho kettle 依赖 --> 164 <!-- pentaho kettle 依赖 -->
159 <dependency> 165 <dependency>
160 <groupId>com.pentaho.kettle</groupId> 166 <groupId>com.pentaho.kettle</groupId>
src/main/java/com/bsth/controller/DownloadController.java
@@ -2,6 +2,7 @@ package com.bsth.controller; @@ -2,6 +2,7 @@ package com.bsth.controller;
2 2
3 import java.io.File; 3 import java.io.File;
4 import java.io.IOException; 4 import java.io.IOException;
  5 +import java.net.URLDecoder;
5 6
6 import org.apache.commons.io.FileUtils; 7 import org.apache.commons.io.FileUtils;
7 import org.springframework.context.annotation.Scope; 8 import org.springframework.context.annotation.Scope;
@@ -35,7 +36,7 @@ public class DownloadController @@ -35,7 +36,7 @@ public class DownloadController
35 File file=new File(moudelPath); 36 File file=new File(moudelPath);
36 HttpHeaders headers = new HttpHeaders(); 37 HttpHeaders headers = new HttpHeaders();
37 String realFileName=new String(fileName.getBytes("UTF-8"),"iso-8859-1");//为了解决中文名称乱码问题 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 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 40 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
40 return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), 41 return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
41 headers, HttpStatus.CREATED); 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,24 +106,24 @@ public class YlbController extends BaseController&lt;Ylb, Integer&gt;{
106 @RequestParam(defaultValue = "DESC") String direction){ 106 @RequestParam(defaultValue = "DESC") String direction){
107 107
108 Direction d; 108 Direction d;
109 - try { 109 +// try {
110 String rq=map.get("rq").toString(); 110 String rq=map.get("rq").toString();
111 if(!(rq=="")){ 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 if(null != direction && direction.equals("ASC")) 127 if(null != direction && direction.equals("ASC"))
128 d = Direction.ASC; 128 d = Direction.ASC;
129 else 129 else
src/main/java/com/bsth/controller/realcontrol/RealMapController.java
@@ -59,4 +59,14 @@ public class RealMapController { @@ -59,4 +59,14 @@ public class RealMapController {
59 public Map<String, Object> findRouteAndStationByLine(@RequestParam String lineCode){ 59 public Map<String, Object> findRouteAndStationByLine(@RequestParam String lineCode){
60 return realMapService.findRouteAndStationByLine(lineCode); 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,8 +310,8 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo,
310 310
311 @RequestMapping(value = "/historyMessage") 311 @RequestMapping(value = "/historyMessage")
312 public List<Object[]> historyMessage(@RequestParam String line, @RequestParam String date, 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 @RequestMapping(value="/findLine") 317 @RequestMapping(value="/findLine")
@@ -332,14 +332,14 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo, @@ -332,14 +332,14 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo,
332 332
333 @RequestMapping(value = "/account") 333 @RequestMapping(value = "/account")
334 public List<Map<String,Object>> account(@RequestParam String line, @RequestParam String date, 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 @RequestMapping(value = "/correctForm") 339 @RequestMapping(value = "/correctForm")
340 public List<ScheduleRealInfo> correctForm(@RequestParam String line, @RequestParam String startDate, 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 * @Title queryListWaybill 345 * @Title queryListWaybill
src/main/java/com/bsth/controller/schedule/BController.java
@@ -5,16 +5,21 @@ import com.bsth.common.ResponseCode; @@ -5,16 +5,21 @@ import com.bsth.common.ResponseCode;
5 import com.bsth.entity.schedule.BEntity; 5 import com.bsth.entity.schedule.BEntity;
6 import com.bsth.entity.sys.SysUser; 6 import com.bsth.entity.sys.SysUser;
7 import com.bsth.service.schedule.BService; 7 import com.bsth.service.schedule.BService;
8 -import com.bsth.service.schedule.ScheduleException; 8 +import com.bsth.service.schedule.exception.ScheduleException;
9 import com.bsth.service.sys.SysUserService; 9 import com.bsth.service.sys.SysUserService;
10 import com.google.common.base.Splitter; 10 import com.google.common.base.Splitter;
  11 +import jxl.Sheet;
  12 +import jxl.Workbook;
  13 +import org.apache.commons.lang3.StringUtils;
11 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.data.domain.PageRequest; 15 import org.springframework.data.domain.PageRequest;
13 import org.springframework.data.domain.Sort; 16 import org.springframework.data.domain.Sort;
14 import org.springframework.web.bind.annotation.*; 17 import org.springframework.web.bind.annotation.*;
  18 +import org.springframework.web.multipart.MultipartFile;
15 19
  20 +import javax.servlet.http.HttpServletResponse;
16 import javax.servlet.http.HttpSession; 21 import javax.servlet.http.HttpSession;
17 -import java.io.Serializable; 22 +import java.io.*;
18 import java.util.*; 23 import java.util.*;
19 24
20 /** 25 /**
@@ -26,7 +31,7 @@ public class BController&lt;T, ID extends Serializable&gt; { @@ -26,7 +31,7 @@ public class BController&lt;T, ID extends Serializable&gt; {
26 @Autowired 31 @Autowired
27 private SysUserService sysUserService; 32 private SysUserService sysUserService;
28 33
29 - // CRUD 操作 34 + //---------------- CRUD 操作 ----------------//
30 // Create操作 35 // Create操作
31 @RequestMapping(method = RequestMethod.POST) 36 @RequestMapping(method = RequestMethod.POST)
32 public Map<String, Object> save(@RequestBody T t, HttpSession httpSession) { 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,6 +78,7 @@ public class BController&lt;T, ID extends Serializable&gt; {
73 rtn.put("data", t); 78 rtn.put("data", t);
74 return rtn; 79 return rtn;
75 } 80 }
  81 + // 查询所有操作
76 @RequestMapping(value = "/all", method = RequestMethod.GET) 82 @RequestMapping(value = "/all", method = RequestMethod.GET)
77 public Map<String, Object> list(@RequestParam Map<String, Object> param) { 83 public Map<String, Object> list(@RequestParam Map<String, Object> param) {
78 List<T> tList = bService.list(param); 84 List<T> tList = bService.list(param);
@@ -81,6 +87,7 @@ public class BController&lt;T, ID extends Serializable&gt; { @@ -81,6 +87,7 @@ public class BController&lt;T, ID extends Serializable&gt; {
81 rtn.put("data", tList); 87 rtn.put("data", tList);
82 return rtn; 88 return rtn;
83 } 89 }
  90 + // 分页查询操作
84 @RequestMapping(method = RequestMethod.GET) 91 @RequestMapping(method = RequestMethod.GET)
85 public Map<String, Object> list( 92 public Map<String, Object> list(
86 @RequestParam Map<String, Object> map, 93 @RequestParam Map<String, Object> map,
@@ -138,4 +145,99 @@ public class BController&lt;T, ID extends Serializable&gt; { @@ -138,4 +145,99 @@ public class BController&lt;T, ID extends Serializable&gt; {
138 return rtn; 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,7 +4,7 @@ import com.bsth.common.ResponseCode;
4 import com.bsth.controller.schedule.BController; 4 import com.bsth.controller.schedule.BController;
5 import com.bsth.entity.CarDevice; 5 import com.bsth.entity.CarDevice;
6 import com.bsth.service.schedule.CarDeviceService; 6 import com.bsth.service.schedule.CarDeviceService;
7 -import com.bsth.service.schedule.ScheduleException; 7 +import com.bsth.service.schedule.exception.ScheduleException;
8 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.web.bind.annotation.RequestMapping; 9 import org.springframework.web.bind.annotation.RequestMapping;
10 import org.springframework.web.bind.annotation.RequestMethod; 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,7 +4,7 @@ import com.bsth.common.ResponseCode;
4 import com.bsth.controller.schedule.BController; 4 import com.bsth.controller.schedule.BController;
5 import com.bsth.entity.Cars; 5 import com.bsth.entity.Cars;
6 import com.bsth.service.schedule.CarsService; 6 import com.bsth.service.schedule.CarsService;
7 -import com.bsth.service.schedule.ScheduleException; 7 +import com.bsth.service.schedule.exception.ScheduleException;
8 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.web.bind.annotation.RequestMapping; 9 import org.springframework.web.bind.annotation.RequestMapping;
10 import org.springframework.web.bind.annotation.RequestMethod; 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,7 +4,7 @@ import com.bsth.common.ResponseCode;
4 import com.bsth.controller.schedule.BController; 4 import com.bsth.controller.schedule.BController;
5 import com.bsth.entity.Personnel; 5 import com.bsth.entity.Personnel;
6 import com.bsth.service.schedule.EmployeeService; 6 import com.bsth.service.schedule.EmployeeService;
7 -import com.bsth.service.schedule.ScheduleException; 7 +import com.bsth.service.schedule.exception.ScheduleException;
8 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.web.bind.annotation.RequestMapping; 9 import org.springframework.web.bind.annotation.RequestMapping;
10 import org.springframework.web.bind.annotation.RequestMethod; 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,7 +5,7 @@ import com.bsth.controller.schedule.BController;
5 import com.bsth.entity.schedule.CarConfigInfo; 5 import com.bsth.entity.schedule.CarConfigInfo;
6 import com.bsth.repository.schedule.CarConfigInfoRepository; 6 import com.bsth.repository.schedule.CarConfigInfoRepository;
7 import com.bsth.service.schedule.CarConfigInfoService; 7 import com.bsth.service.schedule.CarConfigInfoService;
8 -import com.bsth.service.schedule.ScheduleException; 8 +import com.bsth.service.schedule.exception.ScheduleException;
9 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.web.bind.annotation.RequestMapping; 10 import org.springframework.web.bind.annotation.RequestMapping;
11 import org.springframework.web.bind.annotation.RequestMethod; 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,7 +5,7 @@ import com.bsth.controller.schedule.BController;
5 import com.bsth.entity.schedule.EmployeeConfigInfo; 5 import com.bsth.entity.schedule.EmployeeConfigInfo;
6 import com.bsth.repository.schedule.EmployeeConfigInfoRepository; 6 import com.bsth.repository.schedule.EmployeeConfigInfoRepository;
7 import com.bsth.service.schedule.EmployeeConfigInfoService; 7 import com.bsth.service.schedule.EmployeeConfigInfoService;
8 -import com.bsth.service.schedule.ScheduleException; 8 +import com.bsth.service.schedule.exception.ScheduleException;
9 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.web.bind.annotation.RequestMapping; 10 import org.springframework.web.bind.annotation.RequestMapping;
11 import org.springframework.web.bind.annotation.RequestMethod; 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,7 +5,7 @@ import com.bsth.controller.schedule.BController;
5 import com.bsth.entity.schedule.GuideboardInfo; 5 import com.bsth.entity.schedule.GuideboardInfo;
6 import com.bsth.repository.schedule.GuideboardInfoRepository; 6 import com.bsth.repository.schedule.GuideboardInfoRepository;
7 import com.bsth.service.schedule.GuideboardInfoService; 7 import com.bsth.service.schedule.GuideboardInfoService;
8 -import com.bsth.service.schedule.ScheduleException; 8 +import com.bsth.service.schedule.exception.ScheduleException;
9 import com.bsth.service.schedule.utils.DataToolsProperties; 9 import com.bsth.service.schedule.utils.DataToolsProperties;
10 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.boot.context.properties.EnableConfigurationProperties; 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,7 +3,7 @@ package com.bsth.controller.schedule.core;
3 import com.bsth.common.ResponseCode; 3 import com.bsth.common.ResponseCode;
4 import com.bsth.controller.schedule.BController; 4 import com.bsth.controller.schedule.BController;
5 import com.bsth.entity.schedule.TTInfo; 5 import com.bsth.entity.schedule.TTInfo;
6 -import com.bsth.service.schedule.ScheduleException; 6 +import com.bsth.service.schedule.exception.ScheduleException;
7 import com.bsth.service.schedule.TTInfoService; 7 import com.bsth.service.schedule.TTInfoService;
8 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.web.bind.annotation.RequestMapping; 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 package com.bsth.data.arrival; 1 package com.bsth.data.arrival;
2 2
3 -import com.bsth.data.match.Arrival2Schedule;  
4 import com.bsth.data.schedule.DayOfSchedule; 3 import com.bsth.data.schedule.DayOfSchedule;
5 import com.google.common.collect.ArrayListMultimap; 4 import com.google.common.collect.ArrayListMultimap;
6 import com.google.common.collect.ListMultimap; 5 import com.google.common.collect.ListMultimap;
@@ -59,7 +58,7 @@ public class ArrivalData_GPS implements CommandLineRunner{ @@ -59,7 +58,7 @@ public class ArrivalData_GPS implements CommandLineRunner{
59 58
60 @Override 59 @Override
61 public void run() { 60 public void run() {
62 - try{ 61 + /*try{
63 logger.info("开始加载到离站数据, " + System.currentTimeMillis()); 62 logger.info("开始加载到离站数据, " + System.currentTimeMillis());
64 List<ArrivalEntity> arrSets = dataLoader.load(); 63 List<ArrivalEntity> arrSets = dataLoader.load();
65 if(null == arrSets || arrSets.size() == 0) 64 if(null == arrSets || arrSets.size() == 0)
@@ -86,7 +85,7 @@ public class ArrivalData_GPS implements CommandLineRunner{ @@ -86,7 +85,7 @@ public class ArrivalData_GPS implements CommandLineRunner{
86 Arrival2Schedule.start(carSet); 85 Arrival2Schedule.start(carSet);
87 }catch(Exception e){ 86 }catch(Exception e){
88 logger.error("", e); 87 logger.error("", e);
89 - } 88 + }*/
90 } 89 }
91 } 90 }
92 91
src/main/java/com/bsth/data/forecast/ForecastRealServer.java
1 package com.bsth.data.forecast; 1 package com.bsth.data.forecast;
2 2
  3 +import com.bsth.Application;
3 import com.bsth.data.forecast.entity.ForecastResult; 4 import com.bsth.data.forecast.entity.ForecastResult;
4 import com.bsth.data.forecast.entity.ForecastResult.ForecastResultItem; 5 import com.bsth.data.forecast.entity.ForecastResult.ForecastResultItem;
5 import com.bsth.data.forecast.entity.SimpleRoute; 6 import com.bsth.data.forecast.entity.SimpleRoute;
@@ -20,6 +21,7 @@ import java.util.ArrayList; @@ -20,6 +21,7 @@ import java.util.ArrayList;
20 import java.util.HashMap; 21 import java.util.HashMap;
21 import java.util.List; 22 import java.util.List;
22 import java.util.Map; 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,7 +60,7 @@ public class ForecastRealServer implements CommandLineRunner {
58 @Override 60 @Override
59 public void run(String... arg0) throws Exception { 61 public void run(String... arg0) throws Exception {
60 //2小时更新一次站点间耗时数据 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,7 +66,7 @@ public class GpsRealData implements CommandLineRunner {
66 @Override 66 @Override
67 public void run(String... arg0) throws Exception { 67 public void run(String... arg0) throws Exception {
68 logger.info("gpsDataLoader,20,5"); 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 public void put(GpsEntity gps) { 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,8 +37,8 @@ public class SignalState {
37 * @return 37 * @return
38 */ 38 */
39 public static SignalState reverseSignalSTate(ScheduleRealInfo sch, RouteReverse reverse) { 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 SignalState state = new SignalState(); 43 SignalState state = new SignalState();
44 state.setSchId(sch.getId()); 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 \ No newline at end of file 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,7 +38,7 @@ public class ReverseSignalHandle extends SignalHandle {
38 if (isReverse(gps, prev)) { 38 if (isReverse(gps, prev)) {
39 RouteReverse reverse = reverseSearch(prevs, gps); 39 RouteReverse reverse = reverseSearch(prevs, gps);
40 40
41 - if (reverse.getCount() >= 4 41 + if (reverse.getCount() >= 3
42 && reverse.isClose() 42 && reverse.isClose()
43 && !GeoCacheData.isEndStation(gps.getLineId(), gps.getUpDown(), reverse.getTurned())) { 43 && !GeoCacheData.isEndStation(gps.getLineId(), gps.getUpDown(), reverse.getTurned())) {
44 scheduleSignalState.reverseAnalyse(reverse); 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 \ No newline at end of file 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,7 +60,7 @@ public class GpsDataRecovery implements ApplicationContextAware {
60 for (String nbbm : keys) { 60 for (String nbbm : keys) {
61 Collections.sort(listMap.get(nbbm), comp); 61 Collections.sort(listMap.get(nbbm), comp);
62 threadPool.execute(new RecoveryThread(listMap.get(nbbm), count)); 62 threadPool.execute(new RecoveryThread(listMap.get(nbbm), count));
63 - /*if(nbbm.equals("YT-CD008")) 63 + /*if(nbbm.equals("W9H-003"))
64 new RecoveryThread(listMap.get(nbbm), count).run();*/ 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,6 +84,8 @@ public class PilotReport {
84 84
85 //下发调度指令 85 //下发调度指令
86 directiveService.send60Dispatch(outSch, dayOfSchedule.doneSum(nbbm), "请出@系统"); 86 directiveService.send60Dispatch(outSch, dayOfSchedule.doneSum(nbbm), "请出@系统");
  87 + //下发线路切换指令
  88 + directiveService.lineChange(outSch.getClZbh(), outSch.getXlBm(), "请出@系统");
87 /* d80.setRemarks("计划出场时间:" + outSch.getDfsj()); 89 /* d80.setRemarks("计划出场时间:" + outSch.getDfsj());
88 //当前GPS位置 90 //当前GPS位置
89 GpsEntity gps = gpsRealData.get(d80.getDeviceId()); 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,12 +130,12 @@ public class DayOfSchedule implements CommandLineRunner {
130 public void run(String... arg0) throws Exception { 130 public void run(String... arg0) throws Exception {
131 basicDataLoader.loadAllData(); 131 basicDataLoader.loadAllData();
132 //从数据库恢复排班 132 //从数据库恢复排班
133 - dataRecovery(); 133 + //dataRecovery();
134 134
135 //翻班线程 135 //翻班线程
136 Application.mainServices.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS); 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 // Application.mainServices.scheduleWithFixedDelay(firstScheduleCheckThread, 30, 240, TimeUnit.SECONDS); 140 // Application.mainServices.scheduleWithFixedDelay(firstScheduleCheckThread, 30, 240, TimeUnit.SECONDS);
141 //班次误点扫描 141 //班次误点扫描
@@ -563,7 +563,7 @@ public class DayOfSchedule implements CommandLineRunner { @@ -563,7 +563,7 @@ public class DayOfSchedule implements CommandLineRunner {
563 */ 563 */
564 public boolean isFirstOut(ScheduleRealInfo sch){ 564 public boolean isFirstOut(ScheduleRealInfo sch){
565 List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); 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 return true; 567 return true;
568 return false; 568 return false;
569 } 569 }
src/main/java/com/bsth/entity/CarPark.java
1 package com.bsth.entity; 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,6 +22,7 @@ import javax.persistence.Table;
25 22
26 @Entity 23 @Entity
27 @Table(name = "bsth_c_car_park") 24 @Table(name = "bsth_c_car_park")
  25 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
28 public class CarPark { 26 public class CarPark {
29 27
30 @Id 28 @Id
src/main/java/com/bsth/entity/Cars.java
@@ -23,7 +23,7 @@ import java.util.Date; @@ -23,7 +23,7 @@ import java.util.Date;
23 23
24 @Entity 24 @Entity
25 @Table(name = "bsth_c_cars") 25 @Table(name = "bsth_c_cars")
26 -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) 26 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
27 public class Cars extends BEntity implements Serializable { 27 public class Cars extends BEntity implements Serializable {
28 28
29 /** 主键Id */ 29 /** 主键Id */
src/main/java/com/bsth/entity/Line.java
@@ -24,7 +24,7 @@ import java.util.Date; @@ -24,7 +24,7 @@ import java.util.Date;
24 24
25 @Entity 25 @Entity
26 @Table(name = "bsth_c_line") 26 @Table(name = "bsth_c_line")
27 -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) 27 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
28 public class Line implements Serializable { 28 public class Line implements Serializable {
29 29
30 @Id 30 @Id
src/main/java/com/bsth/entity/Personnel.java
@@ -21,7 +21,7 @@ import javax.persistence.*; @@ -21,7 +21,7 @@ import javax.persistence.*;
21 21
22 @Entity 22 @Entity
23 @Table(name = "bsth_c_personnel") 23 @Table(name = "bsth_c_personnel")
24 -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) 24 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
25 public class Personnel extends BEntity { 25 public class Personnel extends BEntity {
26 26
27 /** 主键Id */ 27 /** 主键Id */
src/main/java/com/bsth/entity/Station.java
1 package com.bsth.entity; 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; 5 import javax.persistence.Column;
6 import javax.persistence.Entity; 6 import javax.persistence.Entity;
7 -import javax.persistence.GeneratedValue;  
8 -import javax.persistence.GenerationType;  
9 import javax.persistence.Id; 7 import javax.persistence.Id;
10 import javax.persistence.Table; 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,6 +25,7 @@ import javax.persistence.Table;
26 25
27 @Entity 26 @Entity
28 @Table(name = "bsth_c_station") 27 @Table(name = "bsth_c_station")
  28 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
29 public class Station { 29 public class Station {
30 30
31 @Id 31 @Id
src/main/java/com/bsth/entity/schedule/CarConfigInfo.java
@@ -19,7 +19,7 @@ import java.util.Date; @@ -19,7 +19,7 @@ import java.util.Date;
19 @NamedAttributeNode("cl") 19 @NamedAttributeNode("cl")
20 }) 20 })
21 }) 21 })
22 -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) 22 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
23 public class CarConfigInfo extends BEntity implements Serializable { 23 public class CarConfigInfo extends BEntity implements Serializable {
24 24
25 /** 主健Id */ 25 /** 主健Id */
src/main/java/com/bsth/entity/schedule/EmployeeConfigInfo.java
@@ -22,7 +22,7 @@ import java.io.Serializable; @@ -22,7 +22,7 @@ import java.io.Serializable;
22 @NamedAttributeNode("xl") 22 @NamedAttributeNode("xl")
23 }) 23 })
24 }) 24 })
25 -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) 25 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
26 public class EmployeeConfigInfo extends BEntity implements Serializable { 26 public class EmployeeConfigInfo extends BEntity implements Serializable {
27 27
28 /** 主键Id */ 28 /** 主键Id */
src/main/java/com/bsth/entity/schedule/GuideboardInfo.java
@@ -15,7 +15,7 @@ import javax.persistence.*; @@ -15,7 +15,7 @@ import javax.persistence.*;
15 @NamedAttributeNode("xl") 15 @NamedAttributeNode("xl")
16 }) 16 })
17 }) 17 })
18 -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) 18 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
19 public class GuideboardInfo extends BEntity { 19 public class GuideboardInfo extends BEntity {
20 20
21 /** 主键Id */ 21 /** 主键Id */
src/main/java/com/bsth/entity/schedule/TTInfo.java
1 package com.bsth.entity.schedule; 1 package com.bsth.entity.schedule;
2 2
3 import com.bsth.entity.Line; 3 import com.bsth.entity.Line;
  4 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4 5
5 import javax.persistence.*; 6 import javax.persistence.*;
6 import java.util.Date; 7 import java.util.Date;
@@ -17,6 +18,7 @@ import java.util.Date; @@ -17,6 +18,7 @@ import java.util.Date;
17 @NamedAttributeNode("updateBy") 18 @NamedAttributeNode("updateBy")
18 }) 19 })
19 }) 20 })
  21 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
20 public class TTInfo extends BEntity { 22 public class TTInfo extends BEntity {
21 23
22 /** 主键Id */ 24 /** 主键Id */
src/main/java/com/bsth/entity/schedule/TTInfoDetail.java
@@ -3,6 +3,7 @@ package com.bsth.entity.schedule; @@ -3,6 +3,7 @@ package com.bsth.entity.schedule;
3 import com.bsth.entity.CarPark; 3 import com.bsth.entity.CarPark;
4 import com.bsth.entity.Line; 4 import com.bsth.entity.Line;
5 import com.bsth.entity.Station; 5 import com.bsth.entity.Station;
  6 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
6 7
7 import javax.persistence.*; 8 import javax.persistence.*;
8 9
@@ -21,6 +22,7 @@ import javax.persistence.*; @@ -21,6 +22,7 @@ import javax.persistence.*;
21 @NamedAttributeNode("tcc") 22 @NamedAttributeNode("tcc")
22 }) 23 })
23 }) 24 })
  25 +@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
24 public class TTInfoDetail extends BEntity { 26 public class TTInfoDetail extends BEntity {
25 27
26 /** 主健Id */ 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,7 +9,8 @@ import java.util.Set;
9 9
10 @Entity 10 @Entity
11 @Table(name = "bsth_c_sys_user") 11 @Table(name = "bsth_c_sys_user")
12 -@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"}) 12 +//@JsonIgnoreProperties(value={"hibernateLazyInitializer","handlers","fieldHandler"})
  13 +@JsonIgnoreProperties(ignoreUnknown = true)
13 public class SysUser { 14 public class SysUser {
14 15
15 @Id 16 @Id
src/main/java/com/bsth/repository/realcontrol/ScheduleRealInfoRepository.java
@@ -71,7 +71,7 @@ public interface ScheduleRealInfoRepository extends BaseRepository&lt;ScheduleRealI @@ -71,7 +71,7 @@ public interface ScheduleRealInfoRepository extends BaseRepository&lt;ScheduleRealI
71 @Query(value="select count(jName) from ScheduleRealInfo s where s.jName = ?1 and s.clZbh = ?2 and s.lpName = ?3 and sflj != 0") 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 int findLjbc(String jName,String clZbh,String lpName); 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 List<Object[]> account(String line,String date,String code); 75 List<Object[]> account(String line,String date,String code);
76 76
77 @Query(value="select s from ScheduleRealInfo s where s.xlBm = ?1 and s.scheduleDate >= str_to_date(?2,'%Y-%m-%d') " 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,7 +110,7 @@ public interface ScheduleRealInfoRepository extends BaseRepository&lt;ScheduleRealI
110 @Query(value="select s from ScheduleRealInfo s where s.xlBm like %?1% and DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?2") 110 @Query(value="select s from ScheduleRealInfo s where s.xlBm like %?1% and DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?2")
111 List<ScheduleRealInfo> scheduleByDateAndLine(String line,String date); 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 List<Map<String,Object>> yesterdayDataList(String line,String date); 114 List<Map<String,Object>> yesterdayDataList(String line,String date);
115 115
116 @Query(value="select s from ScheduleRealInfo s where DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?1 ORDER BY xlBm,lpName,clZbh,xlDir") 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,7 +34,10 @@ public interface TTInfoDetailRepository extends BaseRepository&lt;TTInfoDetail, Lon
34 @Query("select cc from TTInfoDetail cc where cc.id=?1") 34 @Query("select cc from TTInfoDetail cc where cc.id=?1")
35 TTInfoDetail findOneExtend(Long aLong); 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 @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) 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 Long findMaxFcno(Integer xlid, Long ttinfoid); 43 Long findMaxFcno(Integer xlid, Long ttinfoid);
@@ -44,6 +47,6 @@ public interface TTInfoDetailRepository extends BaseRepository&lt;TTInfoDetail, Lon @@ -44,6 +47,6 @@ public interface TTInfoDetailRepository extends BaseRepository&lt;TTInfoDetail, Lon
44 47
45 @Modifying 48 @Modifying
46 @Query(value = "delete from TTInfoDetail t where t.ttinfo.id = ?1") 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,7 +58,7 @@ public class GpsServiceImpl implements GpsService {
58 58
59 int dayOfYear = sCal.get(Calendar.DAY_OF_YEAR); 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 * System.out.println("暂时不支持跨天查询..."); return null; } 62 * System.out.println("暂时不支持跨天查询..."); return null; }
63 */ 63 */
64 64
@@ -195,7 +195,7 @@ public class GpsServiceImpl implements GpsService { @@ -195,7 +195,7 @@ public class GpsServiceImpl implements GpsService {
195 inv = inv.substring(0, inv.length() - 1); 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 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 (" 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 + inv + ") and ts > ? and ts < ?"; 201 + inv + ") and ts > ? and ts < ?";
@@ -239,11 +239,12 @@ public class GpsServiceImpl implements GpsService { @@ -239,11 +239,12 @@ public class GpsServiceImpl implements GpsService {
239 inOutStop = rs.getInt("INOUT_STOP"); 239 inOutStop = rs.getInt("INOUT_STOP");
240 map.put("inout_stop", inOutStop); 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 map.put("nbbm", BasicData.deviceId2NbbmMap.get(rs.getString("DEVICE_ID"))); 248 map.put("nbbm", BasicData.deviceId2NbbmMap.get(rs.getString("DEVICE_ID")));
248 map.put("state", 0); 249 map.put("state", 0);
249 // 上下行 250 // 上下行
@@ -272,11 +273,17 @@ public class GpsServiceImpl implements GpsService { @@ -272,11 +273,17 @@ public class GpsServiceImpl implements GpsService {
272 273
273 rs = ps.executeQuery(); 274 rs = ps.executeQuery();
274 ArrivalEntity arr; 275 ArrivalEntity arr;
275 - int inOut; 276 + int inOut, updown;
  277 + String prefix, stationName, lineId;
276 while (rs.next()) { 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 // 设备号_时间戳_进出状态 为key 288 // 设备号_时间戳_进出状态 为key
282 // 反转进出状态 289 // 反转进出状态
@@ -382,7 +389,7 @@ public class GpsServiceImpl implements GpsService { @@ -382,7 +389,7 @@ public class GpsServiceImpl implements GpsService {
382 389
383 gpsRealData.remove(device); 390 gpsRealData.remove(device);
384 rs.put("status", ResponseCode.SUCCESS); 391 rs.put("status", ResponseCode.SUCCESS);
385 - }catch (Exception e){ 392 + } catch (Exception e) {
386 rs.put("status", ResponseCode.ERROR); 393 rs.put("status", ResponseCode.ERROR);
387 } 394 }
388 return rs; 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,7 +132,7 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
132 t.setJcsx(Integer.parseInt(map.get("seqNumber").toString())); 132 t.setJcsx(Integer.parseInt(map.get("seqNumber").toString()));
133 t.setSsgsdm(map.get("company")==null?"":map.get("company").toString()); 133 t.setSsgsdm(map.get("company")==null?"":map.get("company").toString());
134 t.setFgsdm(map.get("bCompany")==null?"":map.get("bCompany").toString()); 134 t.setFgsdm(map.get("bCompany")==null?"":map.get("bCompany").toString());
135 - t.setRq(dBefore); 135 + t.setRq(sdf.parse(rq));
136 repository.save(t); 136 repository.save(t);
137 result = "success"; 137 result = "success";
138 } catch (Exception e) { 138 } catch (Exception e) {
src/main/java/com/bsth/service/realcontrol/RealMapService.java
@@ -13,4 +13,6 @@ public interface RealMapService { @@ -13,4 +13,6 @@ public interface RealMapService {
13 Map<String,Object> findRouteByLine(String lineCode); 13 Map<String,Object> findRouteByLine(String lineCode);
14 14
15 Map<String,Object> findRouteAndStationByLine(String lineCode); 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,7 +65,7 @@ public interface ScheduleRealInfoService extends BaseService&lt;ScheduleRealInfo, L
65 65
66 List<Map<String,Object>> dailyInfo(String line,String date,String type); 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 Map<Integer, Integer> trustStatus(String lineCodes); 70 Map<Integer, Integer> trustStatus(String lineCodes);
71 71
@@ -93,9 +93,9 @@ public interface ScheduleRealInfoService extends BaseService&lt;ScheduleRealInfo, L @@ -93,9 +93,9 @@ public interface ScheduleRealInfoService extends BaseService&lt;ScheduleRealInfo, L
93 93
94 List<Map<String,String>> findLpName(String lpName); 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 List<ScheduleRealInfo> queryListWaybill(String jName,String clZbh,String lpName,String date,String type); 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,7 +43,6 @@ public class ChildTaskPlanServiceImpl extends BaseServiceImpl&lt;ChildTaskPlan, Lon
43 ScheduleRealInfo sch = dayOfSchedule.get(t.getSchedule().getId()); 43 ScheduleRealInfo sch = dayOfSchedule.get(t.getSchedule().getId());
44 Map<String, Object> rs; 44 Map<String, Object> rs;
45 //保存起终点名称 45 //保存起终点名称
46 - Map<String, String> map = BasicData.stationCode2NameMap;  
47 String prefix = sch.getXlBm() + "_" + sch.getXlDir() + "_"; 46 String prefix = sch.getXlBm() + "_" + sch.getXlDir() + "_";
48 47
49 t.setStartStationName(BasicData.getStationNameByCode(t.getStartStation(), prefix)); 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,7 +122,7 @@ public class RealMapServiceImpl implements RealMapService {
122 rs.put("section", secList); 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 List<Map<String, Object>> stationList = jdbcTemplate.queryForList(sql, lineCode); 126 List<Map<String, Object>> stationList = jdbcTemplate.queryForList(sql, lineCode);
127 rs.put("station", stationList); 127 rs.put("station", stationList);
128 128
@@ -134,6 +134,31 @@ public class RealMapServiceImpl implements RealMapService { @@ -134,6 +134,31 @@ public class RealMapServiceImpl implements RealMapService {
134 return rs; 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 * wgs 坐标数组转 百度 163 * wgs 坐标数组转 百度
139 * 164 *
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
@@ -46,6 +46,7 @@ import org.slf4j.LoggerFactory; @@ -46,6 +46,7 @@ import org.slf4j.LoggerFactory;
46 import org.springframework.beans.factory.annotation.Autowired; 46 import org.springframework.beans.factory.annotation.Autowired;
47 import org.springframework.stereotype.Service; 47 import org.springframework.stereotype.Service;
48 48
  49 +import java.net.URLEncoder;
49 import java.text.DecimalFormat; 50 import java.text.DecimalFormat;
50 import java.text.ParseException; 51 import java.text.ParseException;
51 import java.text.SimpleDateFormat; 52 import java.text.SimpleDateFormat;
@@ -286,6 +287,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -286,6 +287,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
286 t.setCreateBy(user); 287 t.setCreateBy(user);
287 t.setSflj(true); 288 t.setSflj(true);
288 t.setLate(false); 289 t.setLate(false);
  290 + t.setDfsj(t.getFcsj());
289 t.setZdsjT(sdfyyyyMMddHHmm.parse(schDate + t.getZdsj()).getTime()); 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,8 +295,9 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
293 t.setBcsj(DateUtils.calcHHmmDiff(t.getFcsj(), t.getZdsj()) / 1000 / 60); 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 schAttrCalculator.calcRealDate(t).calcAllTimeByFcsj(t); 303 schAttrCalculator.calcRealDate(t).calcAllTimeByFcsj(t);
@@ -617,7 +620,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -617,7 +620,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
617 } 620 }
618 621
619 @Override 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 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 624 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
622 long d= 0; 625 long d= 0;
623 long t=0; 626 long t=0;
@@ -639,6 +642,36 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -639,6 +642,36 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
639 obj[4] = BasicData.lineCode2NameMap.get(line); 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 return list; 675 return list;
643 } 676 }
644 677
@@ -1218,13 +1251,15 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -1218,13 +1251,15 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1218 1251
1219 @Override 1252 @Override
1220 public List<Map<String, Object>> account(String line, String date, 1253 public List<Map<String, Object>> account(String line, String date,
1221 - String code,String xlName) { 1254 + String code,String xlName, String type) {
1222 List<Object[]> lsitObj = scheduleRealInfoRepository.account(line,date,code); 1255 List<Object[]> lsitObj = scheduleRealInfoRepository.account(line,date,code);
1223 List<Map<String,Object>> listMap = new ArrayList<Map<String,Object>>(); 1256 List<Map<String,Object>> listMap = new ArrayList<Map<String,Object>>();
1224 Map<String,Object> map; 1257 Map<String,Object> map;
  1258 + int i = 1;
1225 for(Object[] obj : lsitObj){ 1259 for(Object[] obj : lsitObj){
1226 if(obj != null){ 1260 if(obj != null){
1227 map = new HashMap<String,Object>(); 1261 map = new HashMap<String,Object>();
  1262 + map.put("num", i++);
1228 map.put("xlName", xlName); 1263 map.put("xlName", xlName);
1229 map.put("clZbh", obj[3]); 1264 map.put("clZbh", obj[3]);
1230 map.put("company", obj[0]); 1265 map.put("company", obj[0]);
@@ -1233,13 +1268,65 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -1233,13 +1268,65 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1233 listMap.add(map); 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 return listMap; 1303 return listMap;
1237 } 1304 }
1238 1305
1239 @Override 1306 @Override
1240 public List<ScheduleRealInfo> correctForm(String line, String startDate, 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 List<ScheduleRealInfo> list = scheduleRealInfoRepository.correctForm(line,startDate,endDate,lpName,code); 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 return list; 1330 return list;
1244 } 1331 }
1245 1332
@@ -1566,7 +1653,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -1566,7 +1653,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1566 1653
1567 @Override 1654 @Override
1568 public List<ScheduleRealInfo> realScheduleList(String line, String date) { 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 List<ScheduleRealInfo> listTotal = scheduleRealInfoRepository.scheduleByDateAndLine(line, date); 1657 List<ScheduleRealInfo> listTotal = scheduleRealInfoRepository.scheduleByDateAndLine(line, date);
1571 for(ScheduleRealInfo info:listInfo){ 1658 for(ScheduleRealInfo info:listInfo){
1572 for(ScheduleRealInfo total:listTotal){ 1659 for(ScheduleRealInfo total:listTotal){
@@ -1574,7 +1661,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -1574,7 +1661,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1574 1661
1575 } 1662 }
1576 } 1663 }
1577 - } 1664 + }*/
1578 return scheduleRealInfoRepository.scheduleByDateAndLine(line, date); 1665 return scheduleRealInfoRepository.scheduleByDateAndLine(line, date);
1579 } 1666 }
1580 1667
@@ -1584,8 +1671,84 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -1584,8 +1671,84 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1584 // String date = sdfMonth.format(org.apache.commons.lang.time.DateUtils.addDays(new Date(), -1)); 1671 // String date = sdfMonth.format(org.apache.commons.lang.time.DateUtils.addDays(new Date(), -1));
1585 // String date = "2016-09-20"; 1672 // String date = "2016-09-20";
1586 List<Map<String,Object>> yesterdayDataList = scheduleRealInfoRepository.yesterdayDataList(line, date); 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 if(scheduleRealInfo != null){ 1752 if(scheduleRealInfo != null){
1590 for(int i=0;i<yesterdayDataList.size();i++){ 1753 for(int i=0;i<yesterdayDataList.size();i++){
1591 if(scheduleRealInfo.getXlBm().equals(yesterdayDataList.get(i).get("xlBm")) && scheduleRealInfo.getClZbh().equals(yesterdayDataList.get(i).get("clZbh")) 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,7 +1776,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1613 } 1776 }
1614 } 1777 }
1615 } 1778 }
1616 - } 1779 + }*/
1617 //增加顺序号 1780 //增加顺序号
1618 for(int i=0;i<yesterdayDataList.size();i++){ 1781 for(int i=0;i<yesterdayDataList.size();i++){
1619 if(i == 0){ 1782 if(i == 0){
src/main/java/com/bsth/service/schedule/BService.java
1 package com.bsth.service.schedule; 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 import org.springframework.data.domain.Page; 5 import org.springframework.data.domain.Page;
4 import org.springframework.data.domain.Pageable; 6 import org.springframework.data.domain.Pageable;
5 7
@@ -10,8 +12,8 @@ import java.util.Map; @@ -10,8 +12,8 @@ import java.util.Map;
10 /** 12 /**
11 * 基础service接口。 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 // Create,Update操作 17 // Create,Update操作
16 T save(T t); 18 T save(T t);
17 <S extends T> List<S> bulkSave(List<S> entities); // 批量保存(TODO:待测试) 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,4 +24,5 @@ public interface BService&lt;T, ID extends Serializable&gt; {
22 List<T> list(Map<String, Object> param); 24 List<T> list(Map<String, Object> param);
23 // Delete操作 25 // Delete操作
24 void delete(ID id) throws ScheduleException; 26 void delete(ID id) throws ScheduleException;
  27 +
25 } 28 }
src/main/java/com/bsth/service/schedule/CarConfigInfoService.java
1 package com.bsth.service.schedule; 1 package com.bsth.service.schedule;
2 2
3 import com.bsth.entity.schedule.CarConfigInfo; 3 import com.bsth.entity.schedule.CarConfigInfo;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5
5 /** 6 /**
6 * Created by xu on 16/5/9. 7 * Created by xu on 16/5/9.
src/main/java/com/bsth/service/schedule/CarDeviceService.java
1 package com.bsth.service.schedule; 1 package com.bsth.service.schedule;
2 2
3 import com.bsth.entity.CarDevice; 3 import com.bsth.entity.CarDevice;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5
5 /** 6 /**
6 * Created by xu on 16/12/15. 7 * Created by xu on 16/12/15.
src/main/java/com/bsth/service/schedule/CarsService.java
1 package com.bsth.service.schedule; 1 package com.bsth.service.schedule;
2 2
3 import com.bsth.entity.Cars; 3 import com.bsth.entity.Cars;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5
5 /** 6 /**
6 * Created by xu on 16/12/8. 7 * Created by xu on 16/12/8.
src/main/java/com/bsth/service/schedule/EmployeeConfigInfoService.java
1 package com.bsth.service.schedule; 1 package com.bsth.service.schedule;
2 2
3 import com.bsth.entity.schedule.EmployeeConfigInfo; 3 import com.bsth.entity.schedule.EmployeeConfigInfo;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5
5 /** 6 /**
6 * Created by xu on 16/5/10. 7 * Created by xu on 16/5/10.
src/main/java/com/bsth/service/schedule/EmployeeService.java
1 package com.bsth.service.schedule; 1 package com.bsth.service.schedule;
2 2
3 import com.bsth.entity.Personnel; 3 import com.bsth.entity.Personnel;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5
5 /** 6 /**
6 * Created by xu on 16/12/15. 7 * Created by xu on 16/12/15.
src/main/java/com/bsth/service/schedule/GuideboardInfoService.java
1 package com.bsth.service.schedule; 1 package com.bsth.service.schedule;
2 2
3 import com.bsth.entity.schedule.GuideboardInfo; 3 import com.bsth.entity.schedule.GuideboardInfo;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5
5 /** 6 /**
6 * Created by xu on 16/5/11. 7 * Created by xu on 16/5/11.
src/main/java/com/bsth/service/schedule/PeopleCarPlanServiceImpl.java
1 package com.bsth.service.schedule; 1 package com.bsth.service.schedule;
2 2
3 import java.math.BigDecimal; 3 import java.math.BigDecimal;
  4 +import java.net.URLEncoder;
4 import java.sql.ResultSet; 5 import java.sql.ResultSet;
5 import java.sql.SQLException; 6 import java.sql.SQLException;
6 import java.text.DecimalFormat; 7 import java.text.DecimalFormat;
@@ -463,7 +464,7 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { @@ -463,7 +464,7 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
463 listI.add(resList.iterator()); 464 listI.add(resList.iterator());
464 String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\"; 465 String path = this.getClass().getResource("/").getPath()+"static\\pages\\forms\\";
465 ee.excelReplace(listI, new Object[] { m }, path+"mould\\workDaily.xls", 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 } catch (Exception e) { 468 } catch (Exception e) {
468 // TODO: handle exception 469 // TODO: handle exception
469 e.printStackTrace(); 470 e.printStackTrace();
@@ -937,7 +938,7 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { @@ -937,7 +938,7 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
937 tempMap.put("sjfcFirst0", "/"); 938 tempMap.put("sjfcFirst0", "/");
938 tempMap.put("delayFirst0", "/"); 939 tempMap.put("delayFirst0", "/");
939 } 940 }
940 - if(moban0.getZdsjActual() != null){ 941 + if(moban0.getFcsjActual() != null){
941 String[] split = moban0.getFcsjActual().split(":"); 942 String[] split = moban0.getFcsjActual().split(":");
942 long min = Integer.valueOf(split[0])*60 + Integer.valueOf(split[1]); 943 long min = Integer.valueOf(split[0])*60 + Integer.valueOf(split[1]);
943 long delay = moban0.getFcsjT() - min; 944 long delay = moban0.getFcsjT() - min;
@@ -963,7 +964,7 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { @@ -963,7 +964,7 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
963 tempMap.put("sjfcFirst1", "/"); 964 tempMap.put("sjfcFirst1", "/");
964 tempMap.put("delayFirst1", "/"); 965 tempMap.put("delayFirst1", "/");
965 } 966 }
966 - if(moban1.getZdsjActual() != null){ 967 + if(moban1.getFcsjActual() != null){
967 String[] split = moban1.getFcsjActual().split(":"); 968 String[] split = moban1.getFcsjActual().split(":");
968 long min = Integer.valueOf(split[0])*60 + Integer.valueOf(split[1]); 969 long min = Integer.valueOf(split[0])*60 + Integer.valueOf(split[1]);
969 long delay = moban1.getFcsjT() - min; 970 long delay = moban1.getFcsjT() - min;
src/main/java/com/bsth/service/schedule/TTInfoDetailService.java
1 package com.bsth.service.schedule; 1 package com.bsth.service.schedule;
2 2
3 import com.bsth.entity.schedule.TTInfoDetail; 3 import com.bsth.entity.schedule.TTInfoDetail;
4 -import com.bsth.service.BaseService; 4 +import com.bsth.service.schedule.exception.ScheduleException;
5 import org.apache.commons.lang3.StringUtils; 5 import org.apache.commons.lang3.StringUtils;
6 -import org.springframework.web.multipart.MultipartFile;  
7 6
8 -import java.io.File;  
9 import java.util.ArrayList; 7 import java.util.ArrayList;
10 import java.util.List; 8 import java.util.List;
11 9
12 /** 10 /**
13 * Created by xu on 16/7/2. 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,7 +30,12 @@ public interface TTInfoDetailService extends BaseService&lt;TTInfoDetail, Long&gt; {
34 public FcInfo() { 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 this.ttdid = StringUtils.isEmpty(ttdid_str) ? null : Long.valueOf(ttdid_str); 39 this.ttdid = StringUtils.isEmpty(ttdid_str) ? null : Long.valueOf(ttdid_str);
39 this.bc_type = bc_type; 40 this.bc_type = bc_type;
40 this.fcsj = fcsj; 41 this.fcsj = fcsj;
@@ -98,6 +99,9 @@ public interface TTInfoDetailService extends BaseService&lt;TTInfoDetail, Long&gt; { @@ -98,6 +99,9 @@ public interface TTInfoDetailService extends BaseService&lt;TTInfoDetail, Long&gt; {
98 /** 内容数据 */ 99 /** 内容数据 */
99 private List<List<FcInfo>> contents = new ArrayList<>(); 100 private List<List<FcInfo>> contents = new ArrayList<>();
100 101
  102 + /** 营运描述 */
  103 + private String yy_desc;
  104 +
101 public List<String> getHeader() { 105 public List<String> getHeader() {
102 return header; 106 return header;
103 } 107 }
@@ -113,6 +117,14 @@ public interface TTInfoDetailService extends BaseService&lt;TTInfoDetail, Long&gt; { @@ -113,6 +117,14 @@ public interface TTInfoDetailService extends BaseService&lt;TTInfoDetail, Long&gt; {
113 public void setContents(List<List<FcInfo>> contents) { 117 public void setContents(List<List<FcInfo>> contents) {
114 this.contents = contents; 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,22 +133,28 @@ public interface TTInfoDetailService extends BaseService&lt;TTInfoDetail, Long&gt; {
121 * @param ttid 时刻表id 133 * @param ttid 时刻表id
122 * @return 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 package com.bsth.service.schedule; 1 package com.bsth.service.schedule;
2 2
3 import com.bsth.entity.schedule.TTInfo; 3 import com.bsth.entity.schedule.TTInfo;
  4 +import com.bsth.service.schedule.exception.ScheduleException;
4 5
5 /** 6 /**
6 * Created by xu on 16/5/12. 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 * Created by xu on 16/12/5. 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,16 +3,19 @@ package com.bsth.service.schedule.impl;
3 import com.bsth.entity.search.CustomerSpecs; 3 import com.bsth.entity.search.CustomerSpecs;
4 import com.bsth.repository.BaseRepository; 4 import com.bsth.repository.BaseRepository;
5 import com.bsth.service.schedule.BService; 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 import org.slf4j.Logger; 8 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory; 9 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.beans.factory.annotation.Qualifier;
10 import org.springframework.beans.factory.annotation.Value; 12 import org.springframework.beans.factory.annotation.Value;
11 import org.springframework.data.domain.Page; 13 import org.springframework.data.domain.Page;
12 import org.springframework.data.domain.Pageable; 14 import org.springframework.data.domain.Pageable;
13 import org.springframework.data.jpa.domain.Specification; 15 import org.springframework.data.jpa.domain.Specification;
14 16
15 import javax.persistence.EntityManager; 17 import javax.persistence.EntityManager;
  18 +import java.io.File;
16 import java.io.Serializable; 19 import java.io.Serializable;
17 import java.util.ArrayList; 20 import java.util.ArrayList;
18 import java.util.List; 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,6 +32,10 @@ public class BServiceImpl&lt;T, ID extends Serializable&gt; implements BService&lt;T, ID&gt;
29 @Value("${hibernate.jdbc.batch_size}") 32 @Value("${hibernate.jdbc.batch_size}")
30 private int batchSize; 33 private int batchSize;
31 34
  35 + @Autowired
  36 + @Qualifier(value = "dataToolsServiceImpl")
  37 + private DataToolsService dataToolsService;
  38 +
32 /** 日志记录器 */ 39 /** 日志记录器 */
33 protected Logger logger = LoggerFactory.getLogger(this.getClass()); 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,4 +115,19 @@ public class BServiceImpl&lt;T, ID extends Serializable&gt; implements BService&lt;T, ID&gt;
108 115
109 baseRepository.delete(id); 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,7 +3,7 @@ package com.bsth.service.schedule.impl;
3 import com.bsth.entity.schedule.CarConfigInfo; 3 import com.bsth.entity.schedule.CarConfigInfo;
4 import com.bsth.entity.schedule.rule.ScheduleRule1Flat; 4 import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
5 import com.bsth.service.schedule.CarConfigInfoService; 5 import com.bsth.service.schedule.CarConfigInfoService;
6 -import com.bsth.service.schedule.ScheduleException; 6 +import com.bsth.service.schedule.exception.ScheduleException;
7 import com.bsth.service.schedule.ScheduleRule1FlatService; 7 import com.bsth.service.schedule.ScheduleRule1FlatService;
8 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.stereotype.Service; 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,7 +4,7 @@ import com.bsth.entity.CarDevice;
4 import com.bsth.entity.Cars; 4 import com.bsth.entity.Cars;
5 import com.bsth.service.CarsService; 5 import com.bsth.service.CarsService;
6 import com.bsth.service.schedule.CarDeviceService; 6 import com.bsth.service.schedule.CarDeviceService;
7 -import com.bsth.service.schedule.ScheduleException; 7 +import com.bsth.service.schedule.exception.ScheduleException;
8 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.stereotype.Service; 9 import org.springframework.stereotype.Service;
10 import org.springframework.transaction.annotation.Transactional; 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,19 +2,91 @@ package com.bsth.service.schedule.impl;
2 2
3 import com.bsth.entity.Cars; 3 import com.bsth.entity.Cars;
4 import com.bsth.service.schedule.CarsService; 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 import org.springframework.stereotype.Service; 11 import org.springframework.stereotype.Service;
7 import org.springframework.transaction.annotation.Transactional; 12 import org.springframework.transaction.annotation.Transactional;
8 import org.springframework.util.CollectionUtils; 13 import org.springframework.util.CollectionUtils;
9 14
  15 +import java.io.File;
  16 +import java.io.PrintWriter;
  17 +import java.io.StringWriter;
10 import java.util.HashMap; 18 import java.util.HashMap;
11 import java.util.Map; 19 import java.util.Map;
12 20
13 /** 21 /**
14 * Created by xu on 16/12/8. 22 * Created by xu on 16/12/8.
15 */ 23 */
  24 +@EnableConfigurationProperties(DataToolsProperties.class)
16 @Service(value = "carsServiceImpl_sc") 25 @Service(value = "carsServiceImpl_sc")
17 public class CarsServiceImpl extends BServiceImpl<Cars, Integer> implements CarsService { 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 @Override 91 @Override
20 @Transactional 92 @Transactional
src/main/java/com/bsth/service/schedule/impl/EmployeeConfigInfoServiceImpl.java
@@ -3,7 +3,7 @@ package com.bsth.service.schedule.impl; @@ -3,7 +3,7 @@ package com.bsth.service.schedule.impl;
3 import com.bsth.entity.schedule.EmployeeConfigInfo; 3 import com.bsth.entity.schedule.EmployeeConfigInfo;
4 import com.bsth.entity.schedule.rule.ScheduleRule1Flat; 4 import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
5 import com.bsth.service.schedule.EmployeeConfigInfoService; 5 import com.bsth.service.schedule.EmployeeConfigInfoService;
6 -import com.bsth.service.schedule.ScheduleException; 6 +import com.bsth.service.schedule.exception.ScheduleException;
7 import com.bsth.service.schedule.ScheduleRule1FlatService; 7 import com.bsth.service.schedule.ScheduleRule1FlatService;
8 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.stereotype.Service; 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,19 +2,92 @@ package com.bsth.service.schedule.impl;
2 2
3 import com.bsth.entity.Personnel; 3 import com.bsth.entity.Personnel;
4 import com.bsth.service.schedule.EmployeeService; 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 import org.springframework.stereotype.Service; 11 import org.springframework.stereotype.Service;
7 import org.springframework.transaction.annotation.Transactional; 12 import org.springframework.transaction.annotation.Transactional;
8 import org.springframework.util.CollectionUtils; 13 import org.springframework.util.CollectionUtils;
9 14
  15 +import java.io.File;
  16 +import java.io.PrintWriter;
  17 +import java.io.StringWriter;
10 import java.util.HashMap; 18 import java.util.HashMap;
11 import java.util.Map; 19 import java.util.Map;
12 20
13 /** 21 /**
14 * Created by xu on 16/12/15. 22 * Created by xu on 16/12/15.
15 */ 23 */
  24 +@EnableConfigurationProperties(DataToolsProperties.class)
16 @Service 25 @Service
17 public class EmployeeServiceImpl extends BServiceImpl<Personnel, Integer> implements EmployeeService { 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 @Override 91 @Override
19 @Transactional 92 @Transactional
20 public void validate_gh(Personnel personnel) throws ScheduleException { 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,7 +3,7 @@ package com.bsth.service.schedule.impl;
3 import com.bsth.entity.schedule.GuideboardInfo; 3 import com.bsth.entity.schedule.GuideboardInfo;
4 import com.bsth.entity.schedule.TTInfoDetail; 4 import com.bsth.entity.schedule.TTInfoDetail;
5 import com.bsth.service.schedule.GuideboardInfoService; 5 import com.bsth.service.schedule.GuideboardInfoService;
6 -import com.bsth.service.schedule.ScheduleException; 6 +import com.bsth.service.schedule.exception.ScheduleException;
7 import com.bsth.service.schedule.TTInfoDetailService; 7 import com.bsth.service.schedule.TTInfoDetailService;
8 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.stereotype.Service; 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,7 +2,7 @@ package com.bsth.service.schedule.impl;
2 2
3 import com.bsth.entity.schedule.rule.RerunRule; 3 import com.bsth.entity.schedule.rule.RerunRule;
4 import com.bsth.service.schedule.RerunService; 4 import com.bsth.service.schedule.RerunService;
5 -import com.bsth.service.schedule.ScheduleException; 5 +import com.bsth.service.schedule.exception.ScheduleException;
6 import org.springframework.stereotype.Service; 6 import org.springframework.stereotype.Service;
7 import org.springframework.transaction.annotation.Transactional; 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 package com.bsth.service.schedule.impl; 1 package com.bsth.service.schedule.impl;
2 2
3 import com.bsth.entity.schedule.TTInfo; 3 import com.bsth.entity.schedule.TTInfo;
4 -import com.bsth.service.schedule.ScheduleException; 4 +import com.bsth.service.schedule.exception.ScheduleException;
5 import com.bsth.service.schedule.TTInfoService; 5 import com.bsth.service.schedule.TTInfoService;
6 import org.apache.commons.lang3.StringUtils; 6 import org.apache.commons.lang3.StringUtils;
7 import org.springframework.stereotype.Service; 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,11 +15,11 @@ datatools.kvars_dbdname=control
15 15
16 # 3、上传数据配置信息 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 # ktr转换文件,中配置的错误输出目录(根据不同的环境需要修正) 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 ##---------------------------- 导入数据ktr ----------------------------## 24 ##---------------------------- 导入数据ktr ----------------------------##
25 # 测试temp的ktr转换文件 25 # 测试temp的ktr转换文件
@@ -49,7 +49,7 @@ datatools.employeesconfig_datainputktr=/datatools/ktrs/employeesConfigDataInput. @@ -49,7 +49,7 @@ datatools.employeesconfig_datainputktr=/datatools/ktrs/employeesConfigDataInput.
49 49
50 # 4、数据导出配置信息 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 ##---------------------------- 导出数据ktr -----------------------------## 54 ##---------------------------- 导出数据ktr -----------------------------##
55 # 车辆信息导出ktr转换 55 # 车辆信息导出ktr转换
src/main/resources/datatools/ktrs/ttinfodetailDataInput.ktr
@@ -1182,7 +1182,7 @@ @@ -1182,7 +1182,7 @@
1182 <name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</name> 1182 <name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</name>
1183 <type>ExcelInput</type> 1183 <type>ExcelInput</type>
1184 <description/> 1184 <description/>
1185 - <distribute>Y</distribute> 1185 + <distribute>N</distribute>
1186 <custom_distribution/> 1186 <custom_distribution/>
1187 <copies>1</copies> 1187 <copies>1</copies>
1188 <partitioning> 1188 <partitioning>
@@ -1837,6 +1837,12 @@ @@ -1837,6 +1837,12 @@
1837 <condition>&#x3d;</condition> 1837 <condition>&#x3d;</condition>
1838 <name2/> 1838 <name2/>
1839 </key> 1839 </key>
  1840 + <key>
  1841 + <name>iscanceled</name>
  1842 + <field>is_cancel</field>
  1843 + <condition>&#x3d;</condition>
  1844 + <name2/>
  1845 + </key>
1840 <value> 1846 <value>
1841 <name>id</name> 1847 <name>id</name>
1842 <rename>lpid</rename> 1848 <rename>lpid</rename>
@@ -2662,6 +2668,18 @@ @@ -2662,6 +2668,18 @@
2662 </step> 2668 </step>
2663 2669
2664 <step_error_handling> 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 </step_error_handling> 2683 </step_error_handling>
2666 <slave-step-copy-partition-distribution> 2684 <slave-step-copy-partition-distribution>
2667 </slave-step-copy-partition-distribution> 2685 </slave-step-copy-partition-distribution>
src/main/resources/datatools/ktrs/ttinfodetailMetaData.ktr
@@ -37,7 +37,7 @@ @@ -37,7 +37,7 @@
37 <parameter> 37 <parameter>
38 <name>sheetname</name> 38 <name>sheetname</name>
39 <default_value>&#x5de5;&#x4f5c;&#x8868;1</default_value> 39 <default_value>&#x5de5;&#x4f5c;&#x8868;1</default_value>
40 - <description/> 40 + <description>xls sheet&#x540d;&#x5b57;</description>
41 </parameter> 41 </parameter>
42 <parameter> 42 <parameter>
43 <name>tccname</name> 43 <name>tccname</name>
@@ -45,6 +45,11 @@ @@ -45,6 +45,11 @@
45 <description>&#x505c;&#x8f66;&#x573a;&#x540d;&#x5b57;</description> 45 <description>&#x505c;&#x8f66;&#x573a;&#x540d;&#x5b57;</description>
46 </parameter> 46 </parameter>
47 <parameter> 47 <parameter>
  48 + <name>ttid</name>
  49 + <default_value>1</default_value>
  50 + <description>&#x65f6;&#x523b;&#x8868;id</description>
  51 + </parameter>
  52 + <parameter>
48 <name>ttinfoname</name> 53 <name>ttinfoname</name>
49 <default_value>&#x8868;2</default_value> 54 <default_value>&#x8868;2</default_value>
50 <description>&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;</description> 55 <description>&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;</description>
@@ -133,6 +138,7 @@ @@ -133,6 +138,7 @@
133 <data_tablespace/> 138 <data_tablespace/>
134 <index_tablespace/> 139 <index_tablespace/>
135 <attributes> 140 <attributes>
  141 + <attribute><code>EXTRA_OPTION_MYSQL.characterEncoding</code><attribute>utf8</attribute></attribute>
136 <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute> 142 <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
137 <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute> 143 <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
138 <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute> 144 <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
@@ -294,13 +300,14 @@ @@ -294,13 +300,14 @@
294 <hop> <from>&#x83b7;&#x53d6;&#x505c;&#x8f66;&#x573a;&#x540d;&#x79f0;</from><to>&#x589e;&#x52a0;&#x505c;&#x8f66;&#x573a;&#x540d;&#x79f0;metadata</to><enabled>Y</enabled> </hop> 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 <hop> <from>&#x589e;&#x52a0;&#x505c;&#x8f66;&#x573a;&#x540d;&#x79f0;metadata</from><to>&#x66ff;&#x6362;&#x505c;&#x8f66;&#x5382;&#x540d;&#x5b57; </to><enabled>Y</enabled> </hop> 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 <hop> <from>&#x66ff;&#x6362;&#x505c;&#x8f66;&#x5382;&#x540d;&#x5b57; </from><to>&#x505c;&#x8f66;&#x573a;&#x540d;&#x79f0;metadata&#x5b57;&#x6bb5;</to><enabled>Y</enabled> </hop> 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 <hop> <from>&#x589e;&#x52a0;&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;metadata</from><to>&#x66ff;&#x6362;&#x65f6;&#x523b;&#x8868;&#x540d;&#x5b57;</to><enabled>Y</enabled> </hop> 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 <hop> <from>&#x66ff;&#x6362;&#x65f6;&#x523b;&#x8868;&#x540d;&#x5b57;</from><to>&#x65f6;&#x523b;&#x8868;&#x540d;&#x79f0;metadata&#x5b57;&#x6bb5;</to><enabled>Y</enabled> </hop> 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 <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> 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 <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> 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 <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> 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 <hop> <from>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</from><to>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</to><enabled>Y</enabled> </hop> 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 </order> 311 </order>
305 <step> 312 <step>
306 <name>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</name> 313 <name>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</name>
@@ -343,56 +350,6 @@ @@ -343,56 +350,6 @@
343 <target_detail>Y</target_detail> 350 <target_detail>Y</target_detail>
344 <source_step>&#x83b7;&#x53d6;excel&#x6587;&#x4ef6;&#x540d;</source_step> 351 <source_step>&#x83b7;&#x53d6;excel&#x6587;&#x4ef6;&#x540d;</source_step>
345 <source_field>filepath_</source_field> 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 </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name> 353 </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name>
397 <target_attribute_key>PRECISION</target_attribute_key> 354 <target_attribute_key>PRECISION</target_attribute_key>
398 <target_detail>Y</target_detail> 355 <target_detail>Y</target_detail>
@@ -418,6 +375,16 @@ @@ -418,6 +375,16 @@
418 <target_detail>Y</target_detail> 375 <target_detail>Y</target_detail>
419 <source_step>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</source_step> 376 <source_step>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</source_step>
420 <source_field>col_type</source_field> 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 </mapping> <mapping> <target_step_name>&#x73ed;&#x6b21;&#x6570;&#x636e;&#x8303;&#x5f0f;&#x5316;</target_step_name> 388 </mapping> <mapping> <target_step_name>&#x73ed;&#x6b21;&#x6570;&#x636e;&#x8303;&#x5f0f;&#x5316;</target_step_name>
422 <target_attribute_key>NAME</target_attribute_key> 389 <target_attribute_key>NAME</target_attribute_key>
423 <target_detail>Y</target_detail> 390 <target_detail>Y</target_detail>
@@ -429,20 +396,60 @@ @@ -429,20 +396,60 @@
429 <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step> 396 <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step>
430 <source_field>length</source_field> 397 <source_field>length</source_field>
431 </mapping> <mapping> <target_step_name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</target_step_name> 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 <target_attribute_key>TYPE</target_attribute_key> 409 <target_attribute_key>TYPE</target_attribute_key>
433 <target_detail>Y</target_detail> 410 <target_detail>Y</target_detail>
434 <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step> 411 <source_step>&#x589e;&#x52a0;excel&#x5b57;&#x6bb5;&#x5176;&#x4ed6;&#x5143;&#x6570;&#x636e;</source_step>
435 <source_field>fieldtype</source_field> 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 </mapping> <mapping> <target_step_name>&#x884c;&#x8f6c;&#x5217;</target_step_name> 418 </mapping> <mapping> <target_step_name>&#x884c;&#x8f6c;&#x5217;</target_step_name>
437 <target_attribute_key>VALUE</target_attribute_key> 419 <target_attribute_key>VALUE</target_attribute_key>
438 <target_detail>Y</target_detail> 420 <target_detail>Y</target_detail>
439 <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c; 2</source_step> 421 <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c; 2</source_step>
440 <source_field>fieldName</source_field> 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 </mapping> <mapping> <target_step_name>&#x884c;&#x8f6c;&#x5217;</target_step_name> 428 </mapping> <mapping> <target_step_name>&#x884c;&#x8f6c;&#x5217;</target_step_name>
442 <target_attribute_key>NORMALISED</target_attribute_key> 429 <target_attribute_key>NORMALISED</target_attribute_key>
443 <target_detail>Y</target_detail> 430 <target_detail>Y</target_detail>
444 <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c; 2</source_step> 431 <source_step>&#x5217;&#x62c6;&#x5206;&#x4e3a;&#x591a;&#x884c; 2</source_step>
445 <source_field>value</source_field> 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 </mapping> <mapping> <target_step_name>Excel&#x8f93;&#x5165;</target_step_name> 453 </mapping> <mapping> <target_step_name>Excel&#x8f93;&#x5165;</target_step_name>
447 <target_attribute_key>PRECISION</target_attribute_key> 454 <target_attribute_key>PRECISION</target_attribute_key>
448 <target_detail>Y</target_detail> 455 <target_detail>Y</target_detail>
@@ -1100,7 +1107,7 @@ @@ -1100,7 +1107,7 @@
1100 </step> 1107 </step>
1101 1108
1102 <step> 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 <type>GetVariable</type> 1111 <type>GetVariable</type>
1105 <description/> 1112 <description/>
1106 <distribute>Y</distribute> 1113 <distribute>Y</distribute>
@@ -1217,6 +1224,72 @@ @@ -1217,6 +1224,72 @@
1217 </GUI> 1224 </GUI>
1218 </step> 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 <step_error_handling> 1293 <step_error_handling>
1221 </step_error_handling> 1294 </step_error_handling>
1222 <slave-step-copy-partition-distribution> 1295 <slave-step-copy-partition-distribution>
src/main/resources/datatools/ktrs/ttinfodetailoutputforedit.ktr
@@ -345,6 +345,11 @@ @@ -345,6 +345,11 @@
345 <format/> 345 <format/>
346 </field> 346 </field>
347 <field> 347 <field>
  348 + <name>fcno1_jhlc</name>
  349 + <type>None</type>
  350 + <format/>
  351 + </field>
  352 + <field>
348 <name>fcno1_zdname</name> 353 <name>fcno1_zdname</name>
349 <type>String</type> 354 <type>String</type>
350 <format/> 355 <format/>
@@ -375,6 +380,11 @@ @@ -375,6 +380,11 @@
375 <format/> 380 <format/>
376 </field> 381 </field>
377 <field> 382 <field>
  383 + <name>fcno2_jhlc</name>
  384 + <type>None</type>
  385 + <format/>
  386 + </field>
  387 + <field>
378 <name>fcno2_zdname</name> 388 <name>fcno2_zdname</name>
379 <type>String</type> 389 <type>String</type>
380 <format/> 390 <format/>
@@ -405,6 +415,11 @@ @@ -405,6 +415,11 @@
405 <format/> 415 <format/>
406 </field> 416 </field>
407 <field> 417 <field>
  418 + <name>fcno3_jhlc</name>
  419 + <type>None</type>
  420 + <format/>
  421 + </field>
  422 + <field>
408 <name>fcno3_zdname</name> 423 <name>fcno3_zdname</name>
409 <type>String</type> 424 <type>String</type>
410 <format/> 425 <format/>
@@ -435,6 +450,11 @@ @@ -435,6 +450,11 @@
435 <format/> 450 <format/>
436 </field> 451 </field>
437 <field> 452 <field>
  453 + <name>fcno5_jhlc</name>
  454 + <type>None</type>
  455 + <format/>
  456 + </field>
  457 + <field>
438 <name>fcno4_zdname</name> 458 <name>fcno4_zdname</name>
439 <type>String</type> 459 <type>String</type>
440 <format/> 460 <format/>
@@ -465,6 +485,11 @@ @@ -465,6 +485,11 @@
465 <format/> 485 <format/>
466 </field> 486 </field>
467 <field> 487 <field>
  488 + <name>fcno5_jhlc_1</name>
  489 + <type>None</type>
  490 + <format/>
  491 + </field>
  492 + <field>
468 <name>fcno5_zdname</name> 493 <name>fcno5_zdname</name>
469 <type>String</type> 494 <type>String</type>
470 <format/> 495 <format/>
@@ -495,6 +520,11 @@ @@ -495,6 +520,11 @@
495 <format/> 520 <format/>
496 </field> 521 </field>
497 <field> 522 <field>
  523 + <name>fcno6_jhlc</name>
  524 + <type>None</type>
  525 + <format/>
  526 + </field>
  527 + <field>
498 <name>fcno6_zdname</name> 528 <name>fcno6_zdname</name>
499 <type>String</type> 529 <type>String</type>
500 <format/> 530 <format/>
@@ -525,6 +555,11 @@ @@ -525,6 +555,11 @@
525 <format/> 555 <format/>
526 </field> 556 </field>
527 <field> 557 <field>
  558 + <name>fcno7_jhlc</name>
  559 + <type>None</type>
  560 + <format/>
  561 + </field>
  562 + <field>
528 <name>fcno7_zdname</name> 563 <name>fcno7_zdname</name>
529 <type>String</type> 564 <type>String</type>
530 <format/> 565 <format/>
@@ -555,6 +590,11 @@ @@ -555,6 +590,11 @@
555 <format/> 590 <format/>
556 </field> 591 </field>
557 <field> 592 <field>
  593 + <name>fcno8_jhlc</name>
  594 + <type>None</type>
  595 + <format/>
  596 + </field>
  597 + <field>
558 <name>fcno8_zdname</name> 598 <name>fcno8_zdname</name>
559 <type>String</type> 599 <type>String</type>
560 <format/> 600 <format/>
@@ -585,6 +625,11 @@ @@ -585,6 +625,11 @@
585 <format/> 625 <format/>
586 </field> 626 </field>
587 <field> 627 <field>
  628 + <name>fcno9_jhlc</name>
  629 + <type>None</type>
  630 + <format/>
  631 + </field>
  632 + <field>
588 <name>fcno9_zdname</name> 633 <name>fcno9_zdname</name>
589 <type>String</type> 634 <type>String</type>
590 <format/> 635 <format/>
@@ -615,6 +660,11 @@ @@ -615,6 +660,11 @@
615 <format/> 660 <format/>
616 </field> 661 </field>
617 <field> 662 <field>
  663 + <name>fcno10_jhlc</name>
  664 + <type>None</type>
  665 + <format/>
  666 + </field>
  667 + <field>
618 <name>fcno10_zdname</name> 668 <name>fcno10_zdname</name>
619 <type>String</type> 669 <type>String</type>
620 <format/> 670 <format/>
@@ -645,6 +695,11 @@ @@ -645,6 +695,11 @@
645 <format/> 695 <format/>
646 </field> 696 </field>
647 <field> 697 <field>
  698 + <name>fcno11_jhlc</name>
  699 + <type>None</type>
  700 + <format/>
  701 + </field>
  702 + <field>
648 <name>fcno11_zdname</name> 703 <name>fcno11_zdname</name>
649 <type>String</type> 704 <type>String</type>
650 <format/> 705 <format/>
@@ -675,6 +730,11 @@ @@ -675,6 +730,11 @@
675 <format/> 730 <format/>
676 </field> 731 </field>
677 <field> 732 <field>
  733 + <name>fcno12_jhlc</name>
  734 + <type>None</type>
  735 + <format/>
  736 + </field>
  737 + <field>
678 <name>fcno12_zdname</name> 738 <name>fcno12_zdname</name>
679 <type>String</type> 739 <type>String</type>
680 <format/> 740 <format/>
@@ -705,6 +765,11 @@ @@ -705,6 +765,11 @@
705 <format/> 765 <format/>
706 </field> 766 </field>
707 <field> 767 <field>
  768 + <name>fcno13_jhlc</name>
  769 + <type>None</type>
  770 + <format/>
  771 + </field>
  772 + <field>
708 <name>fcno13_zdname</name> 773 <name>fcno13_zdname</name>
709 <type>String</type> 774 <type>String</type>
710 <format/> 775 <format/>
@@ -735,6 +800,11 @@ @@ -735,6 +800,11 @@
735 <format/> 800 <format/>
736 </field> 801 </field>
737 <field> 802 <field>
  803 + <name>fcno14_jhlc</name>
  804 + <type>None</type>
  805 + <format/>
  806 + </field>
  807 + <field>
738 <name>fcno14_zdname</name> 808 <name>fcno14_zdname</name>
739 <type>String</type> 809 <type>String</type>
740 <format/> 810 <format/>
@@ -765,6 +835,11 @@ @@ -765,6 +835,11 @@
765 <format/> 835 <format/>
766 </field> 836 </field>
767 <field> 837 <field>
  838 + <name>fcno15_jhlc</name>
  839 + <type>None</type>
  840 + <format/>
  841 + </field>
  842 + <field>
768 <name>fcno15_zdname</name> 843 <name>fcno15_zdname</name>
769 <type>String</type> 844 <type>String</type>
770 <format/> 845 <format/>
@@ -795,6 +870,11 @@ @@ -795,6 +870,11 @@
795 <format/> 870 <format/>
796 </field> 871 </field>
797 <field> 872 <field>
  873 + <name>fcno16_jhlc</name>
  874 + <type>None</type>
  875 + <format/>
  876 + </field>
  877 + <field>
798 <name>fcno16_zdname</name> 878 <name>fcno16_zdname</name>
799 <type>String</type> 879 <type>String</type>
800 <format/> 880 <format/>
@@ -825,6 +905,11 @@ @@ -825,6 +905,11 @@
825 <format/> 905 <format/>
826 </field> 906 </field>
827 <field> 907 <field>
  908 + <name>fcno17_jhlc</name>
  909 + <type>None</type>
  910 + <format/>
  911 + </field>
  912 + <field>
828 <name>fcno17_zdname</name> 913 <name>fcno17_zdname</name>
829 <type>String</type> 914 <type>String</type>
830 <format/> 915 <format/>
@@ -855,6 +940,11 @@ @@ -855,6 +940,11 @@
855 <format/> 940 <format/>
856 </field> 941 </field>
857 <field> 942 <field>
  943 + <name>fcno18_jhlc</name>
  944 + <type>None</type>
  945 + <format/>
  946 + </field>
  947 + <field>
858 <name>fcno18_zdname</name> 948 <name>fcno18_zdname</name>
859 <type>String</type> 949 <type>String</type>
860 <format/> 950 <format/>
@@ -885,6 +975,11 @@ @@ -885,6 +975,11 @@
885 <format/> 975 <format/>
886 </field> 976 </field>
887 <field> 977 <field>
  978 + <name>fcno19_jhlc</name>
  979 + <type>None</type>
  980 + <format/>
  981 + </field>
  982 + <field>
888 <name>fcno19_zdname</name> 983 <name>fcno19_zdname</name>
889 <type>String</type> 984 <type>String</type>
890 <format/> 985 <format/>
@@ -915,6 +1010,11 @@ @@ -915,6 +1010,11 @@
915 <format/> 1010 <format/>
916 </field> 1011 </field>
917 <field> 1012 <field>
  1013 + <name>fcno20_jhlc</name>
  1014 + <type>None</type>
  1015 + <format/>
  1016 + </field>
  1017 + <field>
918 <name>fcno20_zdname</name> 1018 <name>fcno20_zdname</name>
919 <type>String</type> 1019 <type>String</type>
920 <format/> 1020 <format/>
@@ -945,6 +1045,11 @@ @@ -945,6 +1045,11 @@
945 <format/> 1045 <format/>
946 </field> 1046 </field>
947 <field> 1047 <field>
  1048 + <name>fcno21_jhlc</name>
  1049 + <type>None</type>
  1050 + <format/>
  1051 + </field>
  1052 + <field>
948 <name>fcno21_zdname</name> 1053 <name>fcno21_zdname</name>
949 <type>String</type> 1054 <type>String</type>
950 <format/> 1055 <format/>
@@ -975,6 +1080,11 @@ @@ -975,6 +1080,11 @@
975 <format/> 1080 <format/>
976 </field> 1081 </field>
977 <field> 1082 <field>
  1083 + <name>fcno22_jhlc</name>
  1084 + <type>None</type>
  1085 + <format/>
  1086 + </field>
  1087 + <field>
978 <name>fcno22_zdname</name> 1088 <name>fcno22_zdname</name>
979 <type>String</type> 1089 <type>String</type>
980 <format/> 1090 <format/>
@@ -1005,6 +1115,11 @@ @@ -1005,6 +1115,11 @@
1005 <format/> 1115 <format/>
1006 </field> 1116 </field>
1007 <field> 1117 <field>
  1118 + <name>fcno23_jhlc</name>
  1119 + <type>None</type>
  1120 + <format/>
  1121 + </field>
  1122 + <field>
1008 <name>fcno23_zdname</name> 1123 <name>fcno23_zdname</name>
1009 <type>String</type> 1124 <type>String</type>
1010 <format/> 1125 <format/>
@@ -1035,6 +1150,11 @@ @@ -1035,6 +1150,11 @@
1035 <format/> 1150 <format/>
1036 </field> 1151 </field>
1037 <field> 1152 <field>
  1153 + <name>fcno24_jhlc</name>
  1154 + <type>None</type>
  1155 + <format/>
  1156 + </field>
  1157 + <field>
1038 <name>fcno24_zdname</name> 1158 <name>fcno24_zdname</name>
1039 <type>String</type> 1159 <type>String</type>
1040 <format/> 1160 <format/>
@@ -1065,6 +1185,11 @@ @@ -1065,6 +1185,11 @@
1065 <format/> 1185 <format/>
1066 </field> 1186 </field>
1067 <field> 1187 <field>
  1188 + <name>fcno25_jhlc</name>
  1189 + <type>None</type>
  1190 + <format/>
  1191 + </field>
  1192 + <field>
1068 <name>fcno25_zdname</name> 1193 <name>fcno25_zdname</name>
1069 <type>String</type> 1194 <type>String</type>
1070 <format/> 1195 <format/>
@@ -1095,6 +1220,11 @@ @@ -1095,6 +1220,11 @@
1095 <format/> 1220 <format/>
1096 </field> 1221 </field>
1097 <field> 1222 <field>
  1223 + <name>fcno26_jhlc</name>
  1224 + <type>None</type>
  1225 + <format/>
  1226 + </field>
  1227 + <field>
1098 <name>fcno26_zdname</name> 1228 <name>fcno26_zdname</name>
1099 <type>String</type> 1229 <type>String</type>
1100 <format/> 1230 <format/>
@@ -1125,6 +1255,11 @@ @@ -1125,6 +1255,11 @@
1125 <format/> 1255 <format/>
1126 </field> 1256 </field>
1127 <field> 1257 <field>
  1258 + <name>fcno27_jhlc</name>
  1259 + <type>None</type>
  1260 + <format/>
  1261 + </field>
  1262 + <field>
1128 <name>fcno27_zdname</name> 1263 <name>fcno27_zdname</name>
1129 <type>String</type> 1264 <type>String</type>
1130 <format/> 1265 <format/>
@@ -1155,6 +1290,11 @@ @@ -1155,6 +1290,11 @@
1155 <format/> 1290 <format/>
1156 </field> 1291 </field>
1157 <field> 1292 <field>
  1293 + <name>fcno28_jhlc</name>
  1294 + <type>None</type>
  1295 + <format/>
  1296 + </field>
  1297 + <field>
1158 <name>fcno28_zdname</name> 1298 <name>fcno28_zdname</name>
1159 <type>String</type> 1299 <type>String</type>
1160 <format/> 1300 <format/>
@@ -1185,6 +1325,11 @@ @@ -1185,6 +1325,11 @@
1185 <format/> 1325 <format/>
1186 </field> 1326 </field>
1187 <field> 1327 <field>
  1328 + <name>fcno29_jhlc</name>
  1329 + <type>None</type>
  1330 + <format/>
  1331 + </field>
  1332 + <field>
1188 <name>fcno29_zdname</name> 1333 <name>fcno29_zdname</name>
1189 <type>String</type> 1334 <type>String</type>
1190 <format/> 1335 <format/>
@@ -1215,6 +1360,11 @@ @@ -1215,6 +1360,11 @@
1215 <format/> 1360 <format/>
1216 </field> 1361 </field>
1217 <field> 1362 <field>
  1363 + <name>fcno30_jhlc</name>
  1364 + <type>None</type>
  1365 + <format/>
  1366 + </field>
  1367 + <field>
1218 <name>fcno30_zdname</name> 1368 <name>fcno30_zdname</name>
1219 <type>String</type> 1369 <type>String</type>
1220 <format/> 1370 <format/>
@@ -1245,6 +1395,11 @@ @@ -1245,6 +1395,11 @@
1245 <format/> 1395 <format/>
1246 </field> 1396 </field>
1247 <field> 1397 <field>
  1398 + <name>fcno31_jhlc</name>
  1399 + <type>None</type>
  1400 + <format/>
  1401 + </field>
  1402 + <field>
1248 <name>fcno31_zdname</name> 1403 <name>fcno31_zdname</name>
1249 <type>String</type> 1404 <type>String</type>
1250 <format/> 1405 <format/>
@@ -1275,6 +1430,11 @@ @@ -1275,6 +1430,11 @@
1275 <format/> 1430 <format/>
1276 </field> 1431 </field>
1277 <field> 1432 <field>
  1433 + <name>fcno32_jhlc</name>
  1434 + <type>None</type>
  1435 + <format/>
  1436 + </field>
  1437 + <field>
1278 <name>fcno32_zdname</name> 1438 <name>fcno32_zdname</name>
1279 <type>String</type> 1439 <type>String</type>
1280 <format/> 1440 <format/>
@@ -1305,6 +1465,11 @@ @@ -1305,6 +1465,11 @@
1305 <format/> 1465 <format/>
1306 </field> 1466 </field>
1307 <field> 1467 <field>
  1468 + <name>fcno33_jhlc</name>
  1469 + <type>None</type>
  1470 + <format/>
  1471 + </field>
  1472 + <field>
1308 <name>fcno33_zdname</name> 1473 <name>fcno33_zdname</name>
1309 <type>String</type> 1474 <type>String</type>
1310 <format/> 1475 <format/>
@@ -1335,6 +1500,11 @@ @@ -1335,6 +1500,11 @@
1335 <format/> 1500 <format/>
1336 </field> 1501 </field>
1337 <field> 1502 <field>
  1503 + <name>fcno34_jhlc</name>
  1504 + <type>None</type>
  1505 + <format/>
  1506 + </field>
  1507 + <field>
1338 <name>fcno34_zdname</name> 1508 <name>fcno34_zdname</name>
1339 <type>String</type> 1509 <type>String</type>
1340 <format/> 1510 <format/>
@@ -1365,6 +1535,11 @@ @@ -1365,6 +1535,11 @@
1365 <format/> 1535 <format/>
1366 </field> 1536 </field>
1367 <field> 1537 <field>
  1538 + <name>fcno35_jhlc</name>
  1539 + <type>None</type>
  1540 + <format/>
  1541 + </field>
  1542 + <field>
1368 <name>fcno35_zdname</name> 1543 <name>fcno35_zdname</name>
1369 <type>String</type> 1544 <type>String</type>
1370 <format/> 1545 <format/>
@@ -1457,6 +1632,20 @@ @@ -1457,6 +1632,20 @@
1457 <target_aggregation_type>-</target_aggregation_type> 1632 <target_aggregation_type>-</target_aggregation_type>
1458 </field> 1633 </field>
1459 <field> 1634 <field>
  1635 + <field_name>jhlc</field_name>
  1636 + <key_value>1</key_value>
  1637 + <target_name>fcno1_jhlc</target_name>
  1638 + <target_type>String</target_type>
  1639 + <target_format/>
  1640 + <target_length>-1</target_length>
  1641 + <target_precision>-1</target_precision>
  1642 + <target_decimal_symbol/>
  1643 + <target_grouping_symbol/>
  1644 + <target_currency_symbol/>
  1645 + <target_null_string/>
  1646 + <target_aggregation_type>-</target_aggregation_type>
  1647 + </field>
  1648 + <field>
1460 <field_name>fczdName</field_name> 1649 <field_name>fczdName</field_name>
1461 <key_value>1</key_value> 1650 <key_value>1</key_value>
1462 <target_name>fcno1_zdname</target_name> 1651 <target_name>fcno1_zdname</target_name>
@@ -1541,6 +1730,20 @@ @@ -1541,6 +1730,20 @@
1541 <target_aggregation_type>-</target_aggregation_type> 1730 <target_aggregation_type>-</target_aggregation_type>
1542 </field> 1731 </field>
1543 <field> 1732 <field>
  1733 + <field_name>jhlc</field_name>
  1734 + <key_value>2</key_value>
  1735 + <target_name>fcno2_jhlc</target_name>
  1736 + <target_type>String</target_type>
  1737 + <target_format/>
  1738 + <target_length>-1</target_length>
  1739 + <target_precision>-1</target_precision>
  1740 + <target_decimal_symbol/>
  1741 + <target_grouping_symbol/>
  1742 + <target_currency_symbol/>
  1743 + <target_null_string/>
  1744 + <target_aggregation_type>-</target_aggregation_type>
  1745 + </field>
  1746 + <field>
1544 <field_name>fczdName</field_name> 1747 <field_name>fczdName</field_name>
1545 <key_value>2</key_value> 1748 <key_value>2</key_value>
1546 <target_name>fcno2_zdname</target_name> 1749 <target_name>fcno2_zdname</target_name>
@@ -1625,6 +1828,20 @@ @@ -1625,6 +1828,20 @@
1625 <target_aggregation_type>-</target_aggregation_type> 1828 <target_aggregation_type>-</target_aggregation_type>
1626 </field> 1829 </field>
1627 <field> 1830 <field>
  1831 + <field_name>jhlc</field_name>
  1832 + <key_value>3</key_value>
  1833 + <target_name>fcno3_jhlc</target_name>
  1834 + <target_type>String</target_type>
  1835 + <target_format/>
  1836 + <target_length>-1</target_length>
  1837 + <target_precision>-1</target_precision>
  1838 + <target_decimal_symbol/>
  1839 + <target_grouping_symbol/>
  1840 + <target_currency_symbol/>
  1841 + <target_null_string/>
  1842 + <target_aggregation_type>-</target_aggregation_type>
  1843 + </field>
  1844 + <field>
1628 <field_name>fczdName</field_name> 1845 <field_name>fczdName</field_name>
1629 <key_value>3</key_value> 1846 <key_value>3</key_value>
1630 <target_name>fcno3_zdname</target_name> 1847 <target_name>fcno3_zdname</target_name>
@@ -1709,6 +1926,20 @@ @@ -1709,6 +1926,20 @@
1709 <target_aggregation_type>-</target_aggregation_type> 1926 <target_aggregation_type>-</target_aggregation_type>
1710 </field> 1927 </field>
1711 <field> 1928 <field>
  1929 + <field_name>jhlc</field_name>
  1930 + <key_value>4</key_value>
  1931 + <target_name>fcno5_jhlc</target_name>
  1932 + <target_type>String</target_type>
  1933 + <target_format/>
  1934 + <target_length>-1</target_length>
  1935 + <target_precision>-1</target_precision>
  1936 + <target_decimal_symbol/>
  1937 + <target_grouping_symbol/>
  1938 + <target_currency_symbol/>
  1939 + <target_null_string/>
  1940 + <target_aggregation_type>-</target_aggregation_type>
  1941 + </field>
  1942 + <field>
1712 <field_name>fczdName</field_name> 1943 <field_name>fczdName</field_name>
1713 <key_value>4</key_value> 1944 <key_value>4</key_value>
1714 <target_name>fcno4_zdname</target_name> 1945 <target_name>fcno4_zdname</target_name>
@@ -1793,6 +2024,20 @@ @@ -1793,6 +2024,20 @@
1793 <target_aggregation_type>-</target_aggregation_type> 2024 <target_aggregation_type>-</target_aggregation_type>
1794 </field> 2025 </field>
1795 <field> 2026 <field>
  2027 + <field_name>jhlc</field_name>
  2028 + <key_value>5</key_value>
  2029 + <target_name>fcno5_jhlc</target_name>
  2030 + <target_type>String</target_type>
  2031 + <target_format/>
  2032 + <target_length>-1</target_length>
  2033 + <target_precision>-1</target_precision>
  2034 + <target_decimal_symbol/>
  2035 + <target_grouping_symbol/>
  2036 + <target_currency_symbol/>
  2037 + <target_null_string/>
  2038 + <target_aggregation_type>-</target_aggregation_type>
  2039 + </field>
  2040 + <field>
1796 <field_name>fczdName</field_name> 2041 <field_name>fczdName</field_name>
1797 <key_value>5</key_value> 2042 <key_value>5</key_value>
1798 <target_name>fcno5_zdname</target_name> 2043 <target_name>fcno5_zdname</target_name>
@@ -1877,6 +2122,20 @@ @@ -1877,6 +2122,20 @@
1877 <target_aggregation_type>-</target_aggregation_type> 2122 <target_aggregation_type>-</target_aggregation_type>
1878 </field> 2123 </field>
1879 <field> 2124 <field>
  2125 + <field_name>jhlc</field_name>
  2126 + <key_value>6</key_value>
  2127 + <target_name>fcno6_jhlc</target_name>
  2128 + <target_type>String</target_type>
  2129 + <target_format/>
  2130 + <target_length>-1</target_length>
  2131 + <target_precision>-1</target_precision>
  2132 + <target_decimal_symbol/>
  2133 + <target_grouping_symbol/>
  2134 + <target_currency_symbol/>
  2135 + <target_null_string/>
  2136 + <target_aggregation_type>-</target_aggregation_type>
  2137 + </field>
  2138 + <field>
1880 <field_name>fczdName</field_name> 2139 <field_name>fczdName</field_name>
1881 <key_value>6</key_value> 2140 <key_value>6</key_value>
1882 <target_name>fcno6_zdname</target_name> 2141 <target_name>fcno6_zdname</target_name>
@@ -1961,6 +2220,20 @@ @@ -1961,6 +2220,20 @@
1961 <target_aggregation_type>-</target_aggregation_type> 2220 <target_aggregation_type>-</target_aggregation_type>
1962 </field> 2221 </field>
1963 <field> 2222 <field>
  2223 + <field_name>jhlc</field_name>
  2224 + <key_value>7</key_value>
  2225 + <target_name>fcno7_jhlc</target_name>
  2226 + <target_type>String</target_type>
  2227 + <target_format/>
  2228 + <target_length>-1</target_length>
  2229 + <target_precision>-1</target_precision>
  2230 + <target_decimal_symbol/>
  2231 + <target_grouping_symbol/>
  2232 + <target_currency_symbol/>
  2233 + <target_null_string/>
  2234 + <target_aggregation_type>-</target_aggregation_type>
  2235 + </field>
  2236 + <field>
1964 <field_name>fczdName</field_name> 2237 <field_name>fczdName</field_name>
1965 <key_value>7</key_value> 2238 <key_value>7</key_value>
1966 <target_name>fcno7_zdname</target_name> 2239 <target_name>fcno7_zdname</target_name>
@@ -2045,6 +2318,20 @@ @@ -2045,6 +2318,20 @@
2045 <target_aggregation_type>-</target_aggregation_type> 2318 <target_aggregation_type>-</target_aggregation_type>
2046 </field> 2319 </field>
2047 <field> 2320 <field>
  2321 + <field_name>jhlc</field_name>
  2322 + <key_value>8</key_value>
  2323 + <target_name>fcno8_jhlc</target_name>
  2324 + <target_type>String</target_type>
  2325 + <target_format/>
  2326 + <target_length>-1</target_length>
  2327 + <target_precision>-1</target_precision>
  2328 + <target_decimal_symbol/>
  2329 + <target_grouping_symbol/>
  2330 + <target_currency_symbol/>
  2331 + <target_null_string/>
  2332 + <target_aggregation_type>-</target_aggregation_type>
  2333 + </field>
  2334 + <field>
2048 <field_name>fczdName</field_name> 2335 <field_name>fczdName</field_name>
2049 <key_value>8</key_value> 2336 <key_value>8</key_value>
2050 <target_name>fcno8_zdname</target_name> 2337 <target_name>fcno8_zdname</target_name>
@@ -2129,6 +2416,20 @@ @@ -2129,6 +2416,20 @@
2129 <target_aggregation_type>-</target_aggregation_type> 2416 <target_aggregation_type>-</target_aggregation_type>
2130 </field> 2417 </field>
2131 <field> 2418 <field>
  2419 + <field_name>jhlc</field_name>
  2420 + <key_value>9</key_value>
  2421 + <target_name>fcno9_jhlc</target_name>
  2422 + <target_type>String</target_type>
  2423 + <target_format/>
  2424 + <target_length>-1</target_length>
  2425 + <target_precision>-1</target_precision>
  2426 + <target_decimal_symbol/>
  2427 + <target_grouping_symbol/>
  2428 + <target_currency_symbol/>
  2429 + <target_null_string/>
  2430 + <target_aggregation_type>-</target_aggregation_type>
  2431 + </field>
  2432 + <field>
2132 <field_name>fczdName</field_name> 2433 <field_name>fczdName</field_name>
2133 <key_value>9</key_value> 2434 <key_value>9</key_value>
2134 <target_name>fcno9_zdname</target_name> 2435 <target_name>fcno9_zdname</target_name>
@@ -2213,6 +2514,20 @@ @@ -2213,6 +2514,20 @@
2213 <target_aggregation_type>-</target_aggregation_type> 2514 <target_aggregation_type>-</target_aggregation_type>
2214 </field> 2515 </field>
2215 <field> 2516 <field>
  2517 + <field_name>jhlc</field_name>
  2518 + <key_value>10</key_value>
  2519 + <target_name>fcno10_jhlc</target_name>
  2520 + <target_type>String</target_type>
  2521 + <target_format/>
  2522 + <target_length>-1</target_length>
  2523 + <target_precision>-1</target_precision>
  2524 + <target_decimal_symbol/>
  2525 + <target_grouping_symbol/>
  2526 + <target_currency_symbol/>
  2527 + <target_null_string/>
  2528 + <target_aggregation_type>-</target_aggregation_type>
  2529 + </field>
  2530 + <field>
2216 <field_name>fczdName</field_name> 2531 <field_name>fczdName</field_name>
2217 <key_value>10</key_value> 2532 <key_value>10</key_value>
2218 <target_name>fcno10_zdname</target_name> 2533 <target_name>fcno10_zdname</target_name>
@@ -2297,6 +2612,20 @@ @@ -2297,6 +2612,20 @@
2297 <target_aggregation_type>-</target_aggregation_type> 2612 <target_aggregation_type>-</target_aggregation_type>
2298 </field> 2613 </field>
2299 <field> 2614 <field>
  2615 + <field_name>jhlc</field_name>
  2616 + <key_value>11</key_value>
  2617 + <target_name>fcno11_jhlc</target_name>
  2618 + <target_type>String</target_type>
  2619 + <target_format/>
  2620 + <target_length>-1</target_length>
  2621 + <target_precision>-1</target_precision>
  2622 + <target_decimal_symbol/>
  2623 + <target_grouping_symbol/>
  2624 + <target_currency_symbol/>
  2625 + <target_null_string/>
  2626 + <target_aggregation_type>-</target_aggregation_type>
  2627 + </field>
  2628 + <field>
2300 <field_name>fczdName</field_name> 2629 <field_name>fczdName</field_name>
2301 <key_value>11</key_value> 2630 <key_value>11</key_value>
2302 <target_name>fcno11_zdname</target_name> 2631 <target_name>fcno11_zdname</target_name>
@@ -2381,6 +2710,20 @@ @@ -2381,6 +2710,20 @@
2381 <target_aggregation_type>-</target_aggregation_type> 2710 <target_aggregation_type>-</target_aggregation_type>
2382 </field> 2711 </field>
2383 <field> 2712 <field>
  2713 + <field_name>jhlc</field_name>
  2714 + <key_value>12</key_value>
  2715 + <target_name>fcno12_jhlc</target_name>
  2716 + <target_type>String</target_type>
  2717 + <target_format/>
  2718 + <target_length>-1</target_length>
  2719 + <target_precision>-1</target_precision>
  2720 + <target_decimal_symbol/>
  2721 + <target_grouping_symbol/>
  2722 + <target_currency_symbol/>
  2723 + <target_null_string/>
  2724 + <target_aggregation_type>-</target_aggregation_type>
  2725 + </field>
  2726 + <field>
2384 <field_name>fczdName</field_name> 2727 <field_name>fczdName</field_name>
2385 <key_value>12</key_value> 2728 <key_value>12</key_value>
2386 <target_name>fcno12_zdname</target_name> 2729 <target_name>fcno12_zdname</target_name>
@@ -2465,9 +2808,9 @@ @@ -2465,9 +2808,9 @@
2465 <target_aggregation_type>-</target_aggregation_type> 2808 <target_aggregation_type>-</target_aggregation_type>
2466 </field> 2809 </field>
2467 <field> 2810 <field>
2468 - <field_name>fczdName</field_name> 2811 + <field_name>jhlc</field_name>
2469 <key_value>13</key_value> 2812 <key_value>13</key_value>
2470 - <target_name>fcno13_zdname</target_name> 2813 + <target_name>fcno13_jhlc</target_name>
2471 <target_type>String</target_type> 2814 <target_type>String</target_type>
2472 <target_format/> 2815 <target_format/>
2473 <target_length>-1</target_length> 2816 <target_length>-1</target_length>
@@ -2479,9 +2822,9 @@ @@ -2479,9 +2822,9 @@
2479 <target_aggregation_type>-</target_aggregation_type> 2822 <target_aggregation_type>-</target_aggregation_type>
2480 </field> 2823 </field>
2481 <field> 2824 <field>
2482 - <field_name>bc_type</field_name> 2825 + <field_name>fczdName</field_name>
2483 <key_value>13</key_value> 2826 <key_value>13</key_value>
2484 - <target_name>fcno13_bctype</target_name> 2827 + <target_name>fcno13_zdname</target_name>
2485 <target_type>String</target_type> 2828 <target_type>String</target_type>
2486 <target_format/> 2829 <target_format/>
2487 <target_length>-1</target_length> 2830 <target_length>-1</target_length>
@@ -2493,7 +2836,21 @@ @@ -2493,7 +2836,21 @@
2493 <target_aggregation_type>-</target_aggregation_type> 2836 <target_aggregation_type>-</target_aggregation_type>
2494 </field> 2837 </field>
2495 <field> 2838 <field>
2496 - <field_name>xl_dir</field_name> 2839 + <field_name>bc_type</field_name>
  2840 + <key_value>13</key_value>
  2841 + <target_name>fcno13_bctype</target_name>
  2842 + <target_type>String</target_type>
  2843 + <target_format/>
  2844 + <target_length>-1</target_length>
  2845 + <target_precision>-1</target_precision>
  2846 + <target_decimal_symbol/>
  2847 + <target_grouping_symbol/>
  2848 + <target_currency_symbol/>
  2849 + <target_null_string/>
  2850 + <target_aggregation_type>-</target_aggregation_type>
  2851 + </field>
  2852 + <field>
  2853 + <field_name>xl_dir</field_name>
2497 <key_value>13</key_value> 2854 <key_value>13</key_value>
2498 <target_name>fcno13_xldir</target_name> 2855 <target_name>fcno13_xldir</target_name>
2499 <target_type>String</target_type> 2856 <target_type>String</target_type>
@@ -2549,6 +2906,20 @@ @@ -2549,6 +2906,20 @@
2549 <target_aggregation_type>-</target_aggregation_type> 2906 <target_aggregation_type>-</target_aggregation_type>
2550 </field> 2907 </field>
2551 <field> 2908 <field>
  2909 + <field_name>jhlc</field_name>
  2910 + <key_value>14</key_value>
  2911 + <target_name>fcno14_jhlc</target_name>
  2912 + <target_type>String</target_type>
  2913 + <target_format/>
  2914 + <target_length>-1</target_length>
  2915 + <target_precision>-1</target_precision>
  2916 + <target_decimal_symbol/>
  2917 + <target_grouping_symbol/>
  2918 + <target_currency_symbol/>
  2919 + <target_null_string/>
  2920 + <target_aggregation_type>-</target_aggregation_type>
  2921 + </field>
  2922 + <field>
2552 <field_name>fczdName</field_name> 2923 <field_name>fczdName</field_name>
2553 <key_value>14</key_value> 2924 <key_value>14</key_value>
2554 <target_name>fcno14_zdname</target_name> 2925 <target_name>fcno14_zdname</target_name>
@@ -2633,6 +3004,20 @@ @@ -2633,6 +3004,20 @@
2633 <target_aggregation_type>-</target_aggregation_type> 3004 <target_aggregation_type>-</target_aggregation_type>
2634 </field> 3005 </field>
2635 <field> 3006 <field>
  3007 + <field_name>jhlc</field_name>
  3008 + <key_value>15</key_value>
  3009 + <target_name>fcno15_jhlc</target_name>
  3010 + <target_type>String</target_type>
  3011 + <target_format/>
  3012 + <target_length>-1</target_length>
  3013 + <target_precision>-1</target_precision>
  3014 + <target_decimal_symbol/>
  3015 + <target_grouping_symbol/>
  3016 + <target_currency_symbol/>
  3017 + <target_null_string/>
  3018 + <target_aggregation_type>-</target_aggregation_type>
  3019 + </field>
  3020 + <field>
2636 <field_name>fczdName</field_name> 3021 <field_name>fczdName</field_name>
2637 <key_value>15</key_value> 3022 <key_value>15</key_value>
2638 <target_name>fcno15_zdname</target_name> 3023 <target_name>fcno15_zdname</target_name>
@@ -2717,6 +3102,20 @@ @@ -2717,6 +3102,20 @@
2717 <target_aggregation_type>-</target_aggregation_type> 3102 <target_aggregation_type>-</target_aggregation_type>
2718 </field> 3103 </field>
2719 <field> 3104 <field>
  3105 + <field_name>jhlc</field_name>
  3106 + <key_value>16</key_value>
  3107 + <target_name>fcno16_jhlc</target_name>
  3108 + <target_type>String</target_type>
  3109 + <target_format/>
  3110 + <target_length>-1</target_length>
  3111 + <target_precision>-1</target_precision>
  3112 + <target_decimal_symbol/>
  3113 + <target_grouping_symbol/>
  3114 + <target_currency_symbol/>
  3115 + <target_null_string/>
  3116 + <target_aggregation_type>-</target_aggregation_type>
  3117 + </field>
  3118 + <field>
2720 <field_name>fczdName</field_name> 3119 <field_name>fczdName</field_name>
2721 <key_value>16</key_value> 3120 <key_value>16</key_value>
2722 <target_name>fcno16_zdname</target_name> 3121 <target_name>fcno16_zdname</target_name>
@@ -2801,6 +3200,20 @@ @@ -2801,6 +3200,20 @@
2801 <target_aggregation_type>-</target_aggregation_type> 3200 <target_aggregation_type>-</target_aggregation_type>
2802 </field> 3201 </field>
2803 <field> 3202 <field>
  3203 + <field_name>jhlc</field_name>
  3204 + <key_value>17</key_value>
  3205 + <target_name>fcno17_jhlc</target_name>
  3206 + <target_type>String</target_type>
  3207 + <target_format/>
  3208 + <target_length>-1</target_length>
  3209 + <target_precision>-1</target_precision>
  3210 + <target_decimal_symbol/>
  3211 + <target_grouping_symbol/>
  3212 + <target_currency_symbol/>
  3213 + <target_null_string/>
  3214 + <target_aggregation_type>-</target_aggregation_type>
  3215 + </field>
  3216 + <field>
2804 <field_name>fczdName</field_name> 3217 <field_name>fczdName</field_name>
2805 <key_value>17</key_value> 3218 <key_value>17</key_value>
2806 <target_name>fcno17_zdname</target_name> 3219 <target_name>fcno17_zdname</target_name>
@@ -2885,6 +3298,20 @@ @@ -2885,6 +3298,20 @@
2885 <target_aggregation_type>-</target_aggregation_type> 3298 <target_aggregation_type>-</target_aggregation_type>
2886 </field> 3299 </field>
2887 <field> 3300 <field>
  3301 + <field_name>jhlc</field_name>
  3302 + <key_value>18</key_value>
  3303 + <target_name>fcno18_jhlc</target_name>
  3304 + <target_type>String</target_type>
  3305 + <target_format/>
  3306 + <target_length>-1</target_length>
  3307 + <target_precision>-1</target_precision>
  3308 + <target_decimal_symbol/>
  3309 + <target_grouping_symbol/>
  3310 + <target_currency_symbol/>
  3311 + <target_null_string/>
  3312 + <target_aggregation_type>-</target_aggregation_type>
  3313 + </field>
  3314 + <field>
2888 <field_name>fczdName</field_name> 3315 <field_name>fczdName</field_name>
2889 <key_value>18</key_value> 3316 <key_value>18</key_value>
2890 <target_name>fcno18_zdname</target_name> 3317 <target_name>fcno18_zdname</target_name>
@@ -2969,6 +3396,20 @@ @@ -2969,6 +3396,20 @@
2969 <target_aggregation_type>-</target_aggregation_type> 3396 <target_aggregation_type>-</target_aggregation_type>
2970 </field> 3397 </field>
2971 <field> 3398 <field>
  3399 + <field_name>jhlc</field_name>
  3400 + <key_value>19</key_value>
  3401 + <target_name>fcno19_jhlc</target_name>
  3402 + <target_type>String</target_type>
  3403 + <target_format/>
  3404 + <target_length>-1</target_length>
  3405 + <target_precision>-1</target_precision>
  3406 + <target_decimal_symbol/>
  3407 + <target_grouping_symbol/>
  3408 + <target_currency_symbol/>
  3409 + <target_null_string/>
  3410 + <target_aggregation_type>-</target_aggregation_type>
  3411 + </field>
  3412 + <field>
2972 <field_name>fczdName</field_name> 3413 <field_name>fczdName</field_name>
2973 <key_value>19</key_value> 3414 <key_value>19</key_value>
2974 <target_name>fcno19_zdname</target_name> 3415 <target_name>fcno19_zdname</target_name>
@@ -3053,6 +3494,20 @@ @@ -3053,6 +3494,20 @@
3053 <target_aggregation_type>-</target_aggregation_type> 3494 <target_aggregation_type>-</target_aggregation_type>
3054 </field> 3495 </field>
3055 <field> 3496 <field>
  3497 + <field_name>jhlc</field_name>
  3498 + <key_value>20</key_value>
  3499 + <target_name>fcno20_jhlc</target_name>
  3500 + <target_type>String</target_type>
  3501 + <target_format/>
  3502 + <target_length>-1</target_length>
  3503 + <target_precision>-1</target_precision>
  3504 + <target_decimal_symbol/>
  3505 + <target_grouping_symbol/>
  3506 + <target_currency_symbol/>
  3507 + <target_null_string/>
  3508 + <target_aggregation_type>-</target_aggregation_type>
  3509 + </field>
  3510 + <field>
3056 <field_name>fczdName</field_name> 3511 <field_name>fczdName</field_name>
3057 <key_value>20</key_value> 3512 <key_value>20</key_value>
3058 <target_name>fcno20_zdname</target_name> 3513 <target_name>fcno20_zdname</target_name>
@@ -3137,6 +3592,20 @@ @@ -3137,6 +3592,20 @@
3137 <target_aggregation_type>-</target_aggregation_type> 3592 <target_aggregation_type>-</target_aggregation_type>
3138 </field> 3593 </field>
3139 <field> 3594 <field>
  3595 + <field_name>jhlc</field_name>
  3596 + <key_value>21</key_value>
  3597 + <target_name>fcno21_jhlc</target_name>
  3598 + <target_type>String</target_type>
  3599 + <target_format/>
  3600 + <target_length>-1</target_length>
  3601 + <target_precision>-1</target_precision>
  3602 + <target_decimal_symbol/>
  3603 + <target_grouping_symbol/>
  3604 + <target_currency_symbol/>
  3605 + <target_null_string/>
  3606 + <target_aggregation_type>-</target_aggregation_type>
  3607 + </field>
  3608 + <field>
3140 <field_name>fczdName</field_name> 3609 <field_name>fczdName</field_name>
3141 <key_value>21</key_value> 3610 <key_value>21</key_value>
3142 <target_name>fcno21_zdname</target_name> 3611 <target_name>fcno21_zdname</target_name>
@@ -3221,6 +3690,20 @@ @@ -3221,6 +3690,20 @@
3221 <target_aggregation_type>-</target_aggregation_type> 3690 <target_aggregation_type>-</target_aggregation_type>
3222 </field> 3691 </field>
3223 <field> 3692 <field>
  3693 + <field_name>jhlc</field_name>
  3694 + <key_value>22</key_value>
  3695 + <target_name>fcno22_jhlc</target_name>
  3696 + <target_type>String</target_type>
  3697 + <target_format/>
  3698 + <target_length>-1</target_length>
  3699 + <target_precision>-1</target_precision>
  3700 + <target_decimal_symbol/>
  3701 + <target_grouping_symbol/>
  3702 + <target_currency_symbol/>
  3703 + <target_null_string/>
  3704 + <target_aggregation_type>-</target_aggregation_type>
  3705 + </field>
  3706 + <field>
3224 <field_name>fczdName</field_name> 3707 <field_name>fczdName</field_name>
3225 <key_value>22</key_value> 3708 <key_value>22</key_value>
3226 <target_name>fcno22_zdname</target_name> 3709 <target_name>fcno22_zdname</target_name>
@@ -3305,6 +3788,20 @@ @@ -3305,6 +3788,20 @@
3305 <target_aggregation_type>-</target_aggregation_type> 3788 <target_aggregation_type>-</target_aggregation_type>
3306 </field> 3789 </field>
3307 <field> 3790 <field>
  3791 + <field_name>jhlc</field_name>
  3792 + <key_value>23</key_value>
  3793 + <target_name>fcno23_jhlc</target_name>
  3794 + <target_type>String</target_type>
  3795 + <target_format/>
  3796 + <target_length>-1</target_length>
  3797 + <target_precision>-1</target_precision>
  3798 + <target_decimal_symbol/>
  3799 + <target_grouping_symbol/>
  3800 + <target_currency_symbol/>
  3801 + <target_null_string/>
  3802 + <target_aggregation_type>-</target_aggregation_type>
  3803 + </field>
  3804 + <field>
3308 <field_name>fczdName</field_name> 3805 <field_name>fczdName</field_name>
3309 <key_value>23</key_value> 3806 <key_value>23</key_value>
3310 <target_name>fcno23_zdname</target_name> 3807 <target_name>fcno23_zdname</target_name>
@@ -3389,6 +3886,20 @@ @@ -3389,6 +3886,20 @@
3389 <target_aggregation_type>-</target_aggregation_type> 3886 <target_aggregation_type>-</target_aggregation_type>
3390 </field> 3887 </field>
3391 <field> 3888 <field>
  3889 + <field_name>jhlc</field_name>
  3890 + <key_value>24</key_value>
  3891 + <target_name>fcno24_jhlc</target_name>
  3892 + <target_type>String</target_type>
  3893 + <target_format/>
  3894 + <target_length>-1</target_length>
  3895 + <target_precision>-1</target_precision>
  3896 + <target_decimal_symbol/>
  3897 + <target_grouping_symbol/>
  3898 + <target_currency_symbol/>
  3899 + <target_null_string/>
  3900 + <target_aggregation_type>-</target_aggregation_type>
  3901 + </field>
  3902 + <field>
3392 <field_name>fczdName</field_name> 3903 <field_name>fczdName</field_name>
3393 <key_value>24</key_value> 3904 <key_value>24</key_value>
3394 <target_name>fcno24_zdname</target_name> 3905 <target_name>fcno24_zdname</target_name>
@@ -3473,6 +3984,20 @@ @@ -3473,6 +3984,20 @@
3473 <target_aggregation_type>-</target_aggregation_type> 3984 <target_aggregation_type>-</target_aggregation_type>
3474 </field> 3985 </field>
3475 <field> 3986 <field>
  3987 + <field_name>jhlc</field_name>
  3988 + <key_value>25</key_value>
  3989 + <target_name>fcno25_jhlc</target_name>
  3990 + <target_type>String</target_type>
  3991 + <target_format/>
  3992 + <target_length>-1</target_length>
  3993 + <target_precision>-1</target_precision>
  3994 + <target_decimal_symbol/>
  3995 + <target_grouping_symbol/>
  3996 + <target_currency_symbol/>
  3997 + <target_null_string/>
  3998 + <target_aggregation_type>-</target_aggregation_type>
  3999 + </field>
  4000 + <field>
3476 <field_name>fczdName</field_name> 4001 <field_name>fczdName</field_name>
3477 <key_value>25</key_value> 4002 <key_value>25</key_value>
3478 <target_name>fcno25_zdname</target_name> 4003 <target_name>fcno25_zdname</target_name>
@@ -3557,6 +4082,20 @@ @@ -3557,6 +4082,20 @@
3557 <target_aggregation_type>-</target_aggregation_type> 4082 <target_aggregation_type>-</target_aggregation_type>
3558 </field> 4083 </field>
3559 <field> 4084 <field>
  4085 + <field_name>jhlc</field_name>
  4086 + <key_value>26</key_value>
  4087 + <target_name>fcno26_jhlc</target_name>
  4088 + <target_type>String</target_type>
  4089 + <target_format/>
  4090 + <target_length>-1</target_length>
  4091 + <target_precision>-1</target_precision>
  4092 + <target_decimal_symbol/>
  4093 + <target_grouping_symbol/>
  4094 + <target_currency_symbol/>
  4095 + <target_null_string/>
  4096 + <target_aggregation_type>-</target_aggregation_type>
  4097 + </field>
  4098 + <field>
3560 <field_name>fczdName</field_name> 4099 <field_name>fczdName</field_name>
3561 <key_value>26</key_value> 4100 <key_value>26</key_value>
3562 <target_name>fcno26_zdname</target_name> 4101 <target_name>fcno26_zdname</target_name>
@@ -3641,6 +4180,20 @@ @@ -3641,6 +4180,20 @@
3641 <target_aggregation_type>-</target_aggregation_type> 4180 <target_aggregation_type>-</target_aggregation_type>
3642 </field> 4181 </field>
3643 <field> 4182 <field>
  4183 + <field_name>jhlc</field_name>
  4184 + <key_value>27</key_value>
  4185 + <target_name>fcno27_jhlc</target_name>
  4186 + <target_type>String</target_type>
  4187 + <target_format/>
  4188 + <target_length>-1</target_length>
  4189 + <target_precision>-1</target_precision>
  4190 + <target_decimal_symbol/>
  4191 + <target_grouping_symbol/>
  4192 + <target_currency_symbol/>
  4193 + <target_null_string/>
  4194 + <target_aggregation_type>-</target_aggregation_type>
  4195 + </field>
  4196 + <field>
3644 <field_name>fczdName</field_name> 4197 <field_name>fczdName</field_name>
3645 <key_value>27</key_value> 4198 <key_value>27</key_value>
3646 <target_name>fcno27_zdname</target_name> 4199 <target_name>fcno27_zdname</target_name>
@@ -3725,6 +4278,20 @@ @@ -3725,6 +4278,20 @@
3725 <target_aggregation_type>-</target_aggregation_type> 4278 <target_aggregation_type>-</target_aggregation_type>
3726 </field> 4279 </field>
3727 <field> 4280 <field>
  4281 + <field_name>jhlc</field_name>
  4282 + <key_value>28</key_value>
  4283 + <target_name>fcno28_jhlc</target_name>
  4284 + <target_type>String</target_type>
  4285 + <target_format/>
  4286 + <target_length>-1</target_length>
  4287 + <target_precision>-1</target_precision>
  4288 + <target_decimal_symbol/>
  4289 + <target_grouping_symbol/>
  4290 + <target_currency_symbol/>
  4291 + <target_null_string/>
  4292 + <target_aggregation_type>-</target_aggregation_type>
  4293 + </field>
  4294 + <field>
3728 <field_name>fczdName</field_name> 4295 <field_name>fczdName</field_name>
3729 <key_value>28</key_value> 4296 <key_value>28</key_value>
3730 <target_name>fcno28_zdname</target_name> 4297 <target_name>fcno28_zdname</target_name>
@@ -3809,6 +4376,20 @@ @@ -3809,6 +4376,20 @@
3809 <target_aggregation_type>-</target_aggregation_type> 4376 <target_aggregation_type>-</target_aggregation_type>
3810 </field> 4377 </field>
3811 <field> 4378 <field>
  4379 + <field_name>jhlc</field_name>
  4380 + <key_value>29</key_value>
  4381 + <target_name>fcno29_jhlc</target_name>
  4382 + <target_type>String</target_type>
  4383 + <target_format/>
  4384 + <target_length>-1</target_length>
  4385 + <target_precision>-1</target_precision>
  4386 + <target_decimal_symbol/>
  4387 + <target_grouping_symbol/>
  4388 + <target_currency_symbol/>
  4389 + <target_null_string/>
  4390 + <target_aggregation_type>-</target_aggregation_type>
  4391 + </field>
  4392 + <field>
3812 <field_name>fczdName</field_name> 4393 <field_name>fczdName</field_name>
3813 <key_value>29</key_value> 4394 <key_value>29</key_value>
3814 <target_name>fcno29_zdname</target_name> 4395 <target_name>fcno29_zdname</target_name>
@@ -3893,6 +4474,20 @@ @@ -3893,6 +4474,20 @@
3893 <target_aggregation_type>-</target_aggregation_type> 4474 <target_aggregation_type>-</target_aggregation_type>
3894 </field> 4475 </field>
3895 <field> 4476 <field>
  4477 + <field_name>jhlc</field_name>
  4478 + <key_value>30</key_value>
  4479 + <target_name>fcno30_jhlc</target_name>
  4480 + <target_type>String</target_type>
  4481 + <target_format/>
  4482 + <target_length>-1</target_length>
  4483 + <target_precision>-1</target_precision>
  4484 + <target_decimal_symbol/>
  4485 + <target_grouping_symbol/>
  4486 + <target_currency_symbol/>
  4487 + <target_null_string/>
  4488 + <target_aggregation_type>-</target_aggregation_type>
  4489 + </field>
  4490 + <field>
3896 <field_name>fczdName</field_name> 4491 <field_name>fczdName</field_name>
3897 <key_value>30</key_value> 4492 <key_value>30</key_value>
3898 <target_name>fcno30_zdname</target_name> 4493 <target_name>fcno30_zdname</target_name>
@@ -3977,6 +4572,20 @@ @@ -3977,6 +4572,20 @@
3977 <target_aggregation_type>-</target_aggregation_type> 4572 <target_aggregation_type>-</target_aggregation_type>
3978 </field> 4573 </field>
3979 <field> 4574 <field>
  4575 + <field_name>jhlc</field_name>
  4576 + <key_value>31</key_value>
  4577 + <target_name>fcno31_jhlc</target_name>
  4578 + <target_type>String</target_type>
  4579 + <target_format/>
  4580 + <target_length>-1</target_length>
  4581 + <target_precision>-1</target_precision>
  4582 + <target_decimal_symbol/>
  4583 + <target_grouping_symbol/>
  4584 + <target_currency_symbol/>
  4585 + <target_null_string/>
  4586 + <target_aggregation_type>-</target_aggregation_type>
  4587 + </field>
  4588 + <field>
3980 <field_name>fczdName</field_name> 4589 <field_name>fczdName</field_name>
3981 <key_value>31</key_value> 4590 <key_value>31</key_value>
3982 <target_name>fcno31_zdname</target_name> 4591 <target_name>fcno31_zdname</target_name>
@@ -4061,6 +4670,20 @@ @@ -4061,6 +4670,20 @@
4061 <target_aggregation_type>-</target_aggregation_type> 4670 <target_aggregation_type>-</target_aggregation_type>
4062 </field> 4671 </field>
4063 <field> 4672 <field>
  4673 + <field_name>jhlc</field_name>
  4674 + <key_value>32</key_value>
  4675 + <target_name>fcno32_jhlc</target_name>
  4676 + <target_type>String</target_type>
  4677 + <target_format/>
  4678 + <target_length>-1</target_length>
  4679 + <target_precision>-1</target_precision>
  4680 + <target_decimal_symbol/>
  4681 + <target_grouping_symbol/>
  4682 + <target_currency_symbol/>
  4683 + <target_null_string/>
  4684 + <target_aggregation_type>-</target_aggregation_type>
  4685 + </field>
  4686 + <field>
4064 <field_name>fczdName</field_name> 4687 <field_name>fczdName</field_name>
4065 <key_value>32</key_value> 4688 <key_value>32</key_value>
4066 <target_name>fcno32_zdname</target_name> 4689 <target_name>fcno32_zdname</target_name>
@@ -4145,6 +4768,20 @@ @@ -4145,6 +4768,20 @@
4145 <target_aggregation_type>-</target_aggregation_type> 4768 <target_aggregation_type>-</target_aggregation_type>
4146 </field> 4769 </field>
4147 <field> 4770 <field>
  4771 + <field_name>jhlc</field_name>
  4772 + <key_value>33</key_value>
  4773 + <target_name>fcno33_jhlc</target_name>
  4774 + <target_type>String</target_type>
  4775 + <target_format/>
  4776 + <target_length>-1</target_length>
  4777 + <target_precision>-1</target_precision>
  4778 + <target_decimal_symbol/>
  4779 + <target_grouping_symbol/>
  4780 + <target_currency_symbol/>
  4781 + <target_null_string/>
  4782 + <target_aggregation_type>-</target_aggregation_type>
  4783 + </field>
  4784 + <field>
4148 <field_name>fczdName</field_name> 4785 <field_name>fczdName</field_name>
4149 <key_value>33</key_value> 4786 <key_value>33</key_value>
4150 <target_name>fcno33_zdname</target_name> 4787 <target_name>fcno33_zdname</target_name>
@@ -4229,6 +4866,20 @@ @@ -4229,6 +4866,20 @@
4229 <target_aggregation_type>-</target_aggregation_type> 4866 <target_aggregation_type>-</target_aggregation_type>
4230 </field> 4867 </field>
4231 <field> 4868 <field>
  4869 + <field_name>jhlc</field_name>
  4870 + <key_value>34</key_value>
  4871 + <target_name>fcno34_jhlc</target_name>
  4872 + <target_type>String</target_type>
  4873 + <target_format/>
  4874 + <target_length>-1</target_length>
  4875 + <target_precision>-1</target_precision>
  4876 + <target_decimal_symbol/>
  4877 + <target_grouping_symbol/>
  4878 + <target_currency_symbol/>
  4879 + <target_null_string/>
  4880 + <target_aggregation_type>-</target_aggregation_type>
  4881 + </field>
  4882 + <field>
4232 <field_name>fczdName</field_name> 4883 <field_name>fczdName</field_name>
4233 <key_value>34</key_value> 4884 <key_value>34</key_value>
4234 <target_name>fcno34_zdname</target_name> 4885 <target_name>fcno34_zdname</target_name>
@@ -4313,6 +4964,20 @@ @@ -4313,6 +4964,20 @@
4313 <target_aggregation_type>-</target_aggregation_type> 4964 <target_aggregation_type>-</target_aggregation_type>
4314 </field> 4965 </field>
4315 <field> 4966 <field>
  4967 + <field_name>jhlc</field_name>
  4968 + <key_value>35</key_value>
  4969 + <target_name>fcno35_jhlc</target_name>
  4970 + <target_type>String</target_type>
  4971 + <target_format/>
  4972 + <target_length>-1</target_length>
  4973 + <target_precision>-1</target_precision>
  4974 + <target_decimal_symbol/>
  4975 + <target_grouping_symbol/>
  4976 + <target_currency_symbol/>
  4977 + <target_null_string/>
  4978 + <target_aggregation_type>-</target_aggregation_type>
  4979 + </field>
  4980 + <field>
4316 <field_name>fczdName</field_name> 4981 <field_name>fczdName</field_name>
4317 <key_value>35</key_value> 4982 <key_value>35</key_value>
4318 <target_name>fcno35_zdname</target_name> 4983 <target_name>fcno35_zdname</target_name>
@@ -4451,6 +5116,10 @@ @@ -4451,6 +5116,10 @@
4451 <rename/> 5116 <rename/>
4452 <length>-2</length> 5117 <length>-2</length>
4453 <precision>-2</precision> 5118 <precision>-2</precision>
  5119 + </field> <field> <name>jhlc</name>
  5120 + <rename/>
  5121 + <length>-2</length>
  5122 + <precision>-2</precision>
4454 </field> <select_unspecified>N</select_unspecified> 5123 </field> <select_unspecified>N</select_unspecified>
4455 </fields> <cluster_schema/> 5124 </fields> <cluster_schema/>
4456 <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI> 5125 <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
@@ -4511,6 +5180,10 @@ @@ -4511,6 +5180,10 @@
4511 <rename/> 5180 <rename/>
4512 <length>-2</length> 5181 <length>-2</length>
4513 <precision>-2</precision> 5182 <precision>-2</precision>
  5183 + </field> <field> <name>jhlc</name>
  5184 + <rename/>
  5185 + <length>-2</length>
  5186 + <precision>-2</precision>
4514 </field> <select_unspecified>N</select_unspecified> 5187 </field> <select_unspecified>N</select_unspecified>
4515 </fields> <cluster_schema/> 5188 </fields> <cluster_schema/>
4516 <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI> 5189 <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
@@ -4755,7 +5428,7 @@ @@ -4755,7 +5428,7 @@
4755 <schema_name/> 5428 <schema_name/>
4756 </partitioning> 5429 </partitioning>
4757 <connection>bus_control_variable</connection> 5430 <connection>bus_control_variable</connection>
4758 - <sql>select &#xa;t.id as id&#xa;, g.lp_name as lp&#xa;, g.xl as xl&#xa;, qdz&#xa;, zdz&#xa;, tcc&#xa;, fcsj&#xa;, bc_type &#xa;, bcs&#xa;, fcno&#xa;, xl_dir&#xa;, isfb&#xa;from bsth_c_s_ttinfo_detail t left join &#xa;bsth_c_s_gbi g on t.lp &#x3d; g.id &#xa;where &#xa;g.xl &#x3d; &#x3f; and&#xa;t.ttinfo &#x3d; &#x3f; &#xa;order by t.bcs asc</sql> 5431 + <sql>select &#xa;t.id as id&#xa;, g.lp_name as lp&#xa;, g.xl as xl&#xa;, qdz&#xa;, zdz&#xa;, tcc&#xa;, fcsj&#xa;, jhlc&#xa;, bc_type &#xa;, bcs&#xa;, fcno&#xa;, xl_dir&#xa;, isfb&#xa;from bsth_c_s_ttinfo_detail t left join &#xa;bsth_c_s_gbi g on t.lp &#x3d; g.id &#xa;where &#xa;g.xl &#x3d; &#x3f; and&#xa;t.ttinfo &#x3d; &#x3f; &#xa;order by t.bcs asc</sql>
4759 <limit>0</limit> 5432 <limit>0</limit>
4760 <lookup>&#x83b7;&#x53d6;&#x53d8;&#x91cf;</lookup> 5433 <lookup>&#x83b7;&#x53d6;&#x53d8;&#x91cf;</lookup>
4761 <execute_each_row>N</execute_each_row> 5434 <execute_each_row>N</execute_each_row>
src/main/resources/logback.xml
@@ -106,6 +106,48 @@ @@ -106,6 +106,48 @@
106 <appender-ref ref="TRAFFIC" /> 106 <appender-ref ref="TRAFFIC" />
107 </logger> 107 </logger>
108 108
  109 + <!-- schedule 数据工具操作日志 -->
  110 + <appender name="DATATOOLS"
  111 + class="ch.qos.logback.core.rolling.RollingFileAppender">
  112 + <file>${LOG_BASE}/schedule/datatools/datatools.log</file>
  113 + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  114 + <fileNamePattern>${LOG_BASE}/schedule/datatools/datatools-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  115 + <timeBasedFileNamingAndTriggeringPolicy
  116 + class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  117 + <maxFileSize>100MB</maxFileSize>
  118 + </timeBasedFileNamingAndTriggeringPolicy>
  119 + </rollingPolicy>
  120 +
  121 + <layout class="ch.qos.logback.classic.PatternLayout">
  122 + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%file:%line] %-5level -%msg%n
  123 + </pattern>
  124 + </layout>
  125 + </appender>
  126 + <!-- schedule 时刻表操作日志 -->
  127 + <appender name="TIMETABLE"
  128 + class="ch.qos.logback.core.rolling.RollingFileAppender">
  129 + <file>${LOG_BASE}/schedule/timetable/timetable.log</file>
  130 + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  131 + <fileNamePattern>${LOG_BASE}/schedule/timetable/timetable-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  132 + <timeBasedFileNamingAndTriggeringPolicy
  133 + class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  134 + <maxFileSize>100MB</maxFileSize>
  135 + </timeBasedFileNamingAndTriggeringPolicy>
  136 + </rollingPolicy>
  137 +
  138 + <layout class="ch.qos.logback.classic.PatternLayout">
  139 + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%file:%line] %-5level -%msg%n
  140 + </pattern>
  141 + </layout>
  142 + </appender>
  143 + <logger name="com.bsth.service.schedule.impl.TTInfoDetailServiceImpl" level="INFO" additivity="false" >
  144 + <appender-ref ref="TIMETABLE" />
  145 + </logger>
  146 + <logger name="com.bsth.service.schedule.utils.DataToolsServiceImpl" level="INFO" additivity="false" >
  147 + <appender-ref ref="TIMETABLE" />
  148 + <appender-ref ref="DATATOOLS" />
  149 + </logger>
  150 +
109 <!-- 日志输出级别 --> 151 <!-- 日志输出级别 -->
110 <root level="info"> 152 <root level="info">
111 <appender-ref ref="STDOUT" /> 153 <appender-ref ref="STDOUT" />
src/main/resources/static/index.html
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <html lang="zh"> 2 <html lang="zh">
3 <head> 3 <head>
4 -<meta name="renderer" content="webkit" />  
5 -<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />  
6 -<meta charset="UTF-8">  
7 -<title>调度系统</title>  
8 -  
9 -<meta http-equiv="Pragma" content="no-cache">  
10 -<meta http-equiv="Cache-control" content="no-cache">  
11 -<meta http-equiv="Cache" content="no-cache">  
12 -  
13 -<!-- Font Awesome 图标字体 -->  
14 -<link href="/metronic_v4.5.4/plugins/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css" />  
15 -<!-- Bootstrap style -->  
16 -<link href="/metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />  
17 -<!-- jsTree 数插件 -->  
18 -<link href="/metronic_v4.5.4/plugins/jstree/dist/themes/default/style.min.css" rel="stylesheet" type="text/css" />  
19 -<!-- MULTI-select 多选下拉框美化 -->  
20 -<link href="/metronic_v4.5.4/plugins/jquery-multi-select/css/multi-select.css" rel="stylesheet" type="text/css" />  
21 -  
22 -<!-- editable -->  
23 -<link href="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/css/bootstrap-editable.css" rel="stylesheet" type="text/css" />  
24 -<!-- METRONIC style -->  
25 -<link href="/metronic_v4.5.4/layout4/css/themes/light.min.css" rel="stylesheet" type="text/css" id="style_color" />  
26 -<link href="/metronic_v4.5.4/css/components.css" rel="stylesheet" type="text/css" />  
27 -<link href="/metronic_v4.5.4/css/plugins.css" rel="stylesheet" type="text/css" />  
28 -<link href="/metronic_v4.5.4/layout4/css/layout.min.css" rel="stylesheet" type="text/css" />  
29 -<link href="/metronic_v4.5.4/layout4/css/custom.min.css" rel="stylesheet" type="text/css" />  
30 -<!-- select2 下拉框插件 -->  
31 -<link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css" rel="stylesheet" type="text/css" />  
32 -<link href="/metronic_v4.5.4/plugins/select2/css/select2-bootstrap.min.css" rel="stylesheet" type="text/css" />  
33 -<!-- layer 弹层 插件 -->  
34 -<link href="/assets/plugins/layer-v2.4/layer/skin/layer.css" rel="stylesheet" type="text/css" />  
35 -<!-- fileinput 上传 插件 -->  
36 -<link href="/assets/plugins/fileinput/css/fileinput.min.css" rel="stylesheet" type="text/css" />  
37 -<!-- iCheck 单选框和复选框 -->  
38 -<link href="/metronic_v4.5.4/plugins/icheck/skins/all.css" rel="stylesheet" type="text/css" />  
39 -<!-- 日期控件 -->  
40 -<link href="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/css/bootstrap-datetimepicker.min.css" rel="stylesheet" type="text/css" />  
41 -<!-- table 表格控件 -->  
42 -<link rel="stylesheet" href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css" type="text/css" />  
43 -  
44 -<!-- handsontable样式 -->  
45 -<link rel="stylesheet" href="/assets/bower_components/handsontable/dist/handsontable.full.css"/>  
46 -<!-- schedule计划调度AngularJS模块主css -->  
47 -<link rel="stylesheet" href="/pages/scheduleApp/module/common/main.css" type="text/css"/>  
48 -  
49 -<style type="text/css">  
50 -.searchForm{  
51 -  
52 -}  
53 -.searchForm .form-group .control-label{  
54 - padding-right: 0px;  
55 - text-align: right;  
56 - margin-top: 7px;  
57 -}  
58 -.searchForm .form-group>div{  
59 - padding-left: 10px;  
60 - padding-right: 0px;  
61 -}  
62 -.searchForm .row>div{  
63 - padding-left: 0px;  
64 - padding-right: 0px;  
65 - padding: 5px 0 5px 0;  
66 - width: 270px;  
67 - display: inline-block;  
68 -}  
69 -.searchForm .form-actions{  
70 -  
71 -}  
72 -tr.row-active td {  
73 - border-bottom: 1px solid blue!important;  
74 - color: blue;  
75 -}  
76 -.ms-container .ms-selectable li.ms-elem-selectable, .ms-container .ms-selection li.ms-elem-selection {  
77 - font-size: 14px;  
78 -}  
79 -.ms-container .ms-selectable li.ms-elem-selectable, .ms-container .ms-selection li.ms-elem-selection{  
80 - padding: 6px 26px;  
81 -}  
82 -.ms-container .ms-list{  
83 - height: 306px;  
84 -}  
85 -.ms-container .ms-selectable, .ms-container .ms-selection{  
86 - width: 47%;  
87 -}  
88 -.ms-container {  
89 - width: 470px;  
90 - margin: auto;  
91 -}  
92 -.multi-custom-header-left{  
93 - text-align: center;  
94 - padding: 7px;  
95 - color: #3B3F51;  
96 -}  
97 -.multi-custom-header-right{  
98 - text-align: center;  
99 - padding: 7px;  
100 - font-weight: bold;  
101 - color: #36C6D3;  
102 -}  
103 -.mt-element-list .list-simple.mt-list-container ul > .mt-list-item > .list-item-content {  
104 - padding: 0 55px 0 0px;  
105 -}  
106 -.mt-element-list .list-simple.mt-list-container ul > .mt-list-item {  
107 - padding: 3.3px 0;  
108 -}  
109 -  
110 -#route-container{  
111 - display: none;  
112 -}  
113 -  
114 -.page-content.active{  
115 - display: block !important;  
116 -}  
117 -  
118 -.page-header.navbar .page-logo .logo-default {  
119 - margin: 0;  
120 -}  
121 -.page-header.navbar .top-menu .navbar-nav>li.dropdown.open .dropdown-toggle {  
122 - background-color: #284a99;  
123 -}  
124 -.page-header.navbar .page-logo{  
125 - padding-right: 10px;  
126 -}  
127 -  
128 -.page-logo .logo-default.logo-default-text{  
129 - font-weight: 600;  
130 - color: white !important;  
131 - margin-top: 19px !important;  
132 - font-size: 24px;  
133 - text-decoration: none;  
134 -}  
135 -.page-logo .logo-default.logo-default-text:HOVER{  
136 - color: #dedede !important;  
137 -}  
138 -  
139 -</style>  
140 -  
141 -<!-- ocLazyLoading载入文件的位置 -->  
142 -<link id="ng_load_plugins_before" /> 4 + <meta name="renderer" content="webkit"/>
  5 + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
  6 + <meta charset="UTF-8">
  7 + <title>调度系统</title>
  8 +
  9 + <meta http-equiv="Pragma" content="no-cache">
  10 + <meta http-equiv="Cache-control" content="no-cache">
  11 + <meta http-equiv="Cache" content="no-cache">
  12 +
  13 + <!-- Font Awesome 图标字体 -->
  14 + <link href="/metronic_v4.5.4/plugins/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css"/>
  15 + <!-- Bootstrap style -->
  16 + <link href="/metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css"/>
  17 + <!-- jsTree 数插件 -->
  18 + <link href="/metronic_v4.5.4/plugins/jstree/dist/themes/default/style.min.css" rel="stylesheet" type="text/css"/>
  19 + <!-- MULTI-select 多选下拉框美化 -->
  20 + <link href="/metronic_v4.5.4/plugins/jquery-multi-select/css/multi-select.css" rel="stylesheet" type="text/css"/>
  21 +
  22 + <!-- editable -->
  23 + <link href="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/css/bootstrap-editable.css"
  24 + rel="stylesheet" type="text/css"/>
  25 + <!-- METRONIC style -->
  26 + <link href="/metronic_v4.5.4/layout4/css/themes/light.min.css" rel="stylesheet" type="text/css" id="style_color"/>
  27 + <link href="/metronic_v4.5.4/css/components.css" rel="stylesheet" type="text/css"/>
  28 + <link href="/metronic_v4.5.4/css/plugins.css" rel="stylesheet" type="text/css"/>
  29 + <link href="/metronic_v4.5.4/layout4/css/layout.min.css" rel="stylesheet" type="text/css"/>
  30 + <link href="/metronic_v4.5.4/layout4/css/custom.min.css" rel="stylesheet" type="text/css"/>
  31 + <!-- select2 下拉框插件 -->
  32 + <link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css" rel="stylesheet" type="text/css"/>
  33 + <link href="/metronic_v4.5.4/plugins/select2/css/select2-bootstrap.min.css" rel="stylesheet" type="text/css"/>
  34 + <!-- layer 弹层 插件 -->
  35 + <link href="/assets/plugins/layer-v2.4/layer/skin/layer.css" rel="stylesheet" type="text/css"/>
  36 + <!-- fileinput 上传 插件 -->
  37 + <link href="/assets/plugins/fileinput/css/fileinput.min.css" rel="stylesheet" type="text/css"/>
  38 + <!-- iCheck 单选框和复选框 -->
  39 + <link href="/metronic_v4.5.4/plugins/icheck/skins/all.css" rel="stylesheet" type="text/css"/>
  40 + <!-- 日期控件 -->
  41 + <link href="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/css/bootstrap-datetimepicker.min.css"
  42 + rel="stylesheet" type="text/css"/>
  43 + <!-- table 表格控件 -->
  44 + <link rel="stylesheet" href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css"
  45 + type="text/css"/>
  46 +
  47 + <!-- handsontable样式 -->
  48 + <link rel="stylesheet" href="/assets/bower_components/handsontable/dist/handsontable.full.css"/>
  49 + <!-- schedule计划调度AngularJS模块主css -->
  50 + <link rel="stylesheet" href="/pages/scheduleApp/module/common/main.css" type="text/css"/>
  51 +
  52 + <style type="text/css">
  53 + .searchForm {
  54 +
  55 + }
  56 +
  57 + .searchForm .form-group .control-label {
  58 + padding-right: 0px;
  59 + text-align: right;
  60 + margin-top: 7px;
  61 + }
  62 +
  63 + .searchForm .form-group > div {
  64 + padding-left: 10px;
  65 + padding-right: 0px;
  66 + }
  67 +
  68 + .searchForm .row > div {
  69 + padding-left: 0px;
  70 + padding-right: 0px;
  71 + padding: 5px 0 5px 0;
  72 + width: 270px;
  73 + display: inline-block;
  74 + }
  75 +
  76 + .searchForm .form-actions {
  77 +
  78 + }
  79 +
  80 + tr.row-active td {
  81 + border-bottom: 1px solid blue !important;
  82 + color: blue;
  83 + }
  84 +
  85 + .ms-container .ms-selectable li.ms-elem-selectable, .ms-container .ms-selection li.ms-elem-selection {
  86 + font-size: 14px;
  87 + }
  88 +
  89 + .ms-container .ms-selectable li.ms-elem-selectable, .ms-container .ms-selection li.ms-elem-selection {
  90 + padding: 6px 26px;
  91 + }
  92 +
  93 + .ms-container .ms-list {
  94 + height: 306px;
  95 + }
  96 +
  97 + .ms-container .ms-selectable, .ms-container .ms-selection {
  98 + width: 47%;
  99 + }
  100 +
  101 + .ms-container {
  102 + width: 470px;
  103 + margin: auto;
  104 + }
  105 +
  106 + .multi-custom-header-left {
  107 + text-align: center;
  108 + padding: 7px;
  109 + color: #3B3F51;
  110 + }
  111 +
  112 + .multi-custom-header-right {
  113 + text-align: center;
  114 + padding: 7px;
  115 + font-weight: bold;
  116 + color: #36C6D3;
  117 + }
  118 +
  119 + .mt-element-list .list-simple.mt-list-container ul > .mt-list-item > .list-item-content {
  120 + padding: 0 55px 0 0px;
  121 + }
  122 +
  123 + .mt-element-list .list-simple.mt-list-container ul > .mt-list-item {
  124 + padding: 3.3px 0;
  125 + }
  126 +
  127 + #route-container {
  128 + display: none;
  129 + }
  130 +
  131 + .page-content.active {
  132 + display: block !important;
  133 + }
  134 +
  135 + .page-header.navbar .page-logo .logo-default {
  136 + margin: 0;
  137 + }
  138 +
  139 + .page-header.navbar .top-menu .navbar-nav > li.dropdown.open .dropdown-toggle {
  140 + background-color: #284a99;
  141 + }
  142 +
  143 + .page-header.navbar .page-logo {
  144 + padding-right: 10px;
  145 + }
  146 +
  147 + .page-logo .logo-default.logo-default-text {
  148 + font-weight: 600;
  149 + color: white !important;
  150 + margin-top: 19px !important;
  151 + font-size: 24px;
  152 + text-decoration: none;
  153 + }
  154 +
  155 + .page-logo .logo-default.logo-default-text:HOVER {
  156 + color: #dedede !important;
  157 + }
  158 +
  159 + </style>
  160 +
  161 + <!-- ocLazyLoading载入文件的位置 -->
  162 + <link id="ng_load_plugins_before"/>
143 163
144 </head> 164 </head>
145 <body class="page-container-bg-solid page-header-fixed page-sidebar-closed-hide-logo page-sidebar-fixed"> 165 <body class="page-container-bg-solid page-header-fixed page-sidebar-closed-hide-logo page-sidebar-fixed">
146 - <div class="page-header navbar navbar-fixed-top" style="background: linear-gradient(to bottom ,#124e78, #125688);">  
147 - <div class="page-header-inner ">  
148 - <!-- LOGO -->  
149 - <div class="page-logo">  
150 - <a href="index.html" class="logo-default logo-default-text" > 闵行公交调度系统 </a>  
151 - <div class="menu-toggler sidebar-toggler">  
152 - </div>  
153 - </div>  
154 - <!-- END LOGO -->  
155 - <a href="javascript:;" class="menu-toggler responsive-toggler" data-toggle="collapse" data-target=".navbar-collapse"> </a>  
156 - <div class="page-top">  
157 - <div class="top-menu">  
158 - <ul class="nav navbar-nav pull-right">  
159 - <!-- 信息通知区 -->  
160 - <li class="dropdown dropdown-extended dropdown-notification dropdown-dark" id="header_notification_bar">  
161 - <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">  
162 - <i class="fa fa-bell"></i>  
163 - <span class="badge badge-success"> 0 </span>  
164 - </a>  
165 - <ul class="dropdown-menu" style="max-width: 345px;width: 345px;">  
166 - <li class="external">  
167 - <h3>今日 <span class="bold">0 条</span> 通知</h3>  
168 - <a href="javascript:;">查看全部</a>  
169 - </li>  
170 - <li>  
171 - <ul class="dropdown-menu-list scroller" style="height: 250px;" data-handle-color="#637283">  
172 - </ul>  
173 - </li>  
174 - </ul>  
175 - </li>  
176 - <li class="dropdown dropdown-user dropdown-dark">  
177 - <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">  
178 - <span id="indexTopUName" class="username username-hide-on-mobile" style="vertical-align: middle;"> <i class="fa fa-user"></i></span>  
179 - </a>  
180 - <ul class="dropdown-menu dropdown-menu-default">  
181 - <li>  
182 - <a href="javascript:;">  
183 - <i class="fa fa-user"></i> 我的信息 </a>  
184 - </li>  
185 - <li>  
186 - <a href="javascript:;" id="changePWD">  
187 - <i class="fa fa-unlock-alt"></i> 修改密码</a>  
188 - </li>  
189 - <li class="divider"> </li>  
190 - <li>  
191 - <a href="javascript:;">  
192 - <i class="fa fa-lock"></i> 锁屏 </a>  
193 - </li>  
194 - <li>  
195 - <a href="/logout">  
196 - <i class="fa fa-key"></i> 注销登陆 </a>  
197 - </li>  
198 - </ul>  
199 - </li>  
200 - </ul>  
201 - </div> 166 +<div class="page-header navbar navbar-fixed-top" style="background: linear-gradient(to bottom ,#124e78, #125688);">
  167 + <div class="page-header-inner ">
  168 + <!-- LOGO -->
  169 + <div class="page-logo">
  170 + <a href="index.html" class="logo-default logo-default-text"> 闵行公交调度系统 </a>
  171 + <div class="menu-toggler sidebar-toggler">
202 </div> 172 </div>
203 </div> 173 </div>
204 - </div>  
205 - <div class="page-container">  
206 - <div class="page-sidebar-wrapper">  
207 - <div class="page-sidebar navbar-collapse collapse">  
208 - <ul class="page-sidebar-menu page-sidebar-menu-fixed" data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200" id="leftMenuSidebar"> 174 + <!-- END LOGO -->
  175 + <a href="javascript:;" class="menu-toggler responsive-toggler" data-toggle="collapse"
  176 + data-target=".navbar-collapse"> </a>
  177 + <div class="page-top">
  178 + <div class="top-menu">
  179 + <ul class="nav navbar-nav pull-right">
  180 + <!-- 信息通知区 -->
  181 + <li class="dropdown dropdown-extended dropdown-notification dropdown-dark"
  182 + id="header_notification_bar">
  183 + <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown"
  184 + data-close-others="true">
  185 + <i class="fa fa-bell"></i>
  186 + <span class="badge badge-success"> 0 </span>
  187 + </a>
  188 + <ul class="dropdown-menu" style="max-width: 345px;width: 345px;">
  189 + <li class="external">
  190 + <h3>今日 <span class="bold">0 条</span> 通知</h3>
  191 + <a href="javascript:;">查看全部</a>
  192 + </li>
  193 + <li>
  194 + <ul class="dropdown-menu-list scroller" style="height: 250px;"
  195 + data-handle-color="#637283">
  196 + </ul>
  197 + </li>
  198 + </ul>
  199 + </li>
  200 + <li class="dropdown dropdown-user dropdown-dark">
  201 + <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown"
  202 + data-close-others="true">
  203 + <span id="indexTopUName" class="username username-hide-on-mobile"
  204 + style="vertical-align: middle;"> <i class="fa fa-user"></i></span>
  205 + </a>
  206 + <ul class="dropdown-menu dropdown-menu-default">
  207 + <li>
  208 + <a href="javascript:;">
  209 + <i class="fa fa-user"></i> 我的信息 </a>
  210 + </li>
  211 + <li>
  212 + <a href="javascript:;" id="changePWD">
  213 + <i class="fa fa-unlock-alt"></i> 修改密码</a>
  214 + </li>
  215 + <li class="divider"></li>
  216 + <li>
  217 + <a href="javascript:;">
  218 + <i class="fa fa-lock"></i> 锁屏 </a>
  219 + </li>
  220 + <li>
  221 + <a href="/logout">
  222 + <i class="fa fa-key"></i> 注销登陆 </a>
  223 + </li>
  224 + </ul>
  225 + </li>
209 </ul> 226 </ul>
210 </div> 227 </div>
211 </div> 228 </div>
212 - <div class="page-content-wrapper">  
213 - <div id="pjax-container" class="page-content"></div>  
214 -  
215 - <div id="route-container">  
216 - <div ng-app="ScheduleApp">  
217 - <div ng-controller="ScheduleAppController">  
218 -  
219 - <!-- loading widget -->  
220 - <div id="loadingWidget" class="flyover mask" loading-widget>  
221 - <div class="alert alert-info">  
222 - <strong>载入中......</strong>  
223 - </div>  
224 - </div>  
225 -  
226 - <div ui-view class="fade-in-up"> </div> 229 + </div>
  230 +</div>
  231 +<div class="page-container">
  232 + <div class="page-sidebar-wrapper">
  233 + <div class="page-sidebar navbar-collapse collapse">
  234 + <ul class="page-sidebar-menu page-sidebar-menu-fixed" data-keep-expanded="false" data-auto-scroll="true"
  235 + data-slide-speed="200" id="leftMenuSidebar">
  236 + </ul>
  237 + </div>
  238 + </div>
  239 + <div class="page-content-wrapper">
  240 + <div id="pjax-container" class="page-content"></div>
  241 +
  242 + <div id="route-container">
  243 + <div ng-app="ScheduleApp">
  244 + <div ng-controller="ScheduleAppController">
  245 +
  246 + <!-- loading widget -->
  247 + <div id="loadingWidget" class="flyover mask" loading-widget>
  248 + <div class="alert alert-info">
  249 + <strong>载入中......</strong>
227 </div> 250 </div>
228 </div> 251 </div>
  252 +
  253 + <div ui-view class="fade-in-up"></div>
229 </div> 254 </div>
230 - </div> 255 + </div>
  256 + </div>
231 </div> 257 </div>
  258 +</div>
232 259
233 <script id="menu_list_temp" type="text/html"> 260 <script id="menu_list_temp" type="text/html">
234 -{{each list as group i}}  
235 - <li class="heading">  
236 - <h3 class="uppercase">{{group.name}}</h3>  
237 - </li>  
238 - {{each group.children as dir j}}  
239 - <li class="nav-item">  
240 - <a href="javascript:;" class="nav-link nav-toggle ">  
241 - <i class="{{dir.icon}}"></i>  
242 - <span class="title">{{dir.name}}</span>  
243 - <span class="arrow"></span>  
244 - </a>  
245 - <ul class="sub-menu">  
246 - {{each dir.children as module s}}  
247 - <li class="nav-item ">  
248 - {{if module.container=="pjax-container"}}  
249 - <a href="/pages/{{module.path}}" class="nav-link " data-pjax>  
250 - <span class="title">{{module.name}}</span>  
251 - </a>  
252 - {{else}}  
253 - <a href="{{module.path}}" class="nav-link " data-angularjs>  
254 - <span class="title">{{module.name}}</span>  
255 - </a>  
256 - {{/if}}  
257 - </li>  
258 - {{/each}}  
259 - </ul>  
260 - </li>  
261 - {{/each}}  
262 -{{/each}} 261 + {{each list as group i}}
  262 + <li class="heading">
  263 + <h3 class="uppercase">{{group.name}}</h3>
  264 + </li>
  265 + {{each group.children as dir j}}
  266 + <li class="nav-item">
  267 + <a href="javascript:;" class="nav-link nav-toggle ">
  268 + <i class="{{dir.icon}}"></i>
  269 + <span class="title">{{dir.name}}</span>
  270 + <span class="arrow"></span>
  271 + </a>
  272 + <ul class="sub-menu">
  273 + {{each dir.children as module s}}
  274 + <li class="nav-item ">
  275 + {{if module.container=="pjax-container"}}
  276 + <a href="/pages/{{module.path}}" class="nav-link " data-pjax>
  277 + <span class="title">{{module.name}}</span>
  278 + </a>
  279 + {{else}}
  280 + <a href="{{module.path}}" class="nav-link " data-angularjs>
  281 + <span class="title">{{module.name}}</span>
  282 + </a>
  283 + {{/if}}
  284 + </li>
  285 + {{/each}}
  286 + </ul>
  287 + </li>
  288 + {{/each}}
  289 + {{/each}}
263 290
264 </script> 291 </script>
265 <!-- jQuery --> 292 <!-- jQuery -->
@@ -272,24 +299,24 @@ tr.row-active td { @@ -272,24 +299,24 @@ tr.row-active td {
272 <script src="/metronic_v4.5.4/scripts/app.min.js" data-exclude=1></script> 299 <script src="/metronic_v4.5.4/scripts/app.min.js" data-exclude=1></script>
273 <script src="/metronic_v4.5.4/layout4/scripts/layout.min.js" data-exclude=1></script> 300 <script src="/metronic_v4.5.4/layout4/scripts/layout.min.js" data-exclude=1></script>
274 <!-- 虚拟滚动条 --> 301 <!-- 虚拟滚动条 -->
275 -<script src="/metronic_v4.5.4/plugins/jquery-slimscroll/jquery.slimscroll.min.js" ></script> 302 +<script src="/metronic_v4.5.4/plugins/jquery-slimscroll/jquery.slimscroll.min.js"></script>
276 <!-- jsTree 树插件 --> 303 <!-- jsTree 树插件 -->
277 -<script src="/metronic_v4.5.4/plugins/jstree/dist/jstree.min.js" ></script> 304 +<script src="/metronic_v4.5.4/plugins/jstree/dist/jstree.min.js"></script>
278 <!-- bootstrap-hover-dropDown --> 305 <!-- bootstrap-hover-dropDown -->
279 -<script src="/metronic_v4.5.4/plugins/bootstrap-hover-dropdown/bootstrap-hover-dropdown.min.js" ></script> 306 +<script src="/metronic_v4.5.4/plugins/bootstrap-hover-dropdown/bootstrap-hover-dropdown.min.js"></script>
280 <!-- jquery.validate 表单验证 --> 307 <!-- jquery.validate 表单验证 -->
281 <script src="/metronic_v4.5.4/plugins/jquery-validation/js/jquery.validate.min.js"></script> 308 <script src="/metronic_v4.5.4/plugins/jquery-validation/js/jquery.validate.min.js"></script>
282 <script src="/metronic_v4.5.4/plugins/jquery-validation/js/localization/messages_zh.js"></script> 309 <script src="/metronic_v4.5.4/plugins/jquery-validation/js/localization/messages_zh.js"></script>
283 <!-- 向导式插件 --> 310 <!-- 向导式插件 -->
284 <script src="/metronic_v4.5.4//plugins/bootstrap-wizard/jquery.bootstrap.wizard.min.js"></script> 311 <script src="/metronic_v4.5.4//plugins/bootstrap-wizard/jquery.bootstrap.wizard.min.js"></script>
285 <!-- iCheck 单选框和复选框 --> 312 <!-- iCheck 单选框和复选框 -->
286 -<script src="/metronic_v4.5.4/plugins/icheck/icheck.min.js" ></script> 313 +<script src="/metronic_v4.5.4/plugins/icheck/icheck.min.js"></script>
287 <!-- select2 下拉框 --> 314 <!-- select2 下拉框 -->
288 -<script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js" ></script> 315 +<script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js"></script>
289 <!-- MULTI SELECT 多选下拉框 --> 316 <!-- MULTI SELECT 多选下拉框 -->
290 -<script src="/metronic_v4.5.4/plugins/jquery-multi-select/js/jquery.multi-select.js" ></script> 317 +<script src="/metronic_v4.5.4/plugins/jquery-multi-select/js/jquery.multi-select.js"></script>
291 <!-- editable.js --> 318 <!-- editable.js -->
292 -<script src="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/js/bootstrap-editable.min.js" ></script> 319 +<script src="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/js/bootstrap-editable.min.js"></script>
293 <!-- PJAX --> 320 <!-- PJAX -->
294 <script src="/assets/plugins/jquery.pjax.js"></script> 321 <script src="/assets/plugins/jquery.pjax.js"></script>
295 <!-- layer 弹层 --> 322 <!-- layer 弹层 -->
@@ -313,7 +340,7 @@ tr.row-active td { @@ -313,7 +340,7 @@ tr.row-active td {
313 340
314 <script src="/assets/plugins/pinyin.js"></script> 341 <script src="/assets/plugins/pinyin.js"></script>
315 <!-- 日期控件 --> 342 <!-- 日期控件 -->
316 -<script src="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/js/bootstrap-datetimepicker.min.js" ></script> 343 +<script src="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/js/bootstrap-datetimepicker.min.js"></script>
317 <!-- 表格控件 --> 344 <!-- 表格控件 -->
318 <!-- 统计图控件 --> 345 <!-- 统计图控件 -->
319 <!--<script src="/assets/global/getEchart.js"></script> 346 <!--<script src="/assets/global/getEchart.js"></script>
@@ -322,130 +349,139 @@ tr.row-active td { @@ -322,130 +349,139 @@ tr.row-active td {
322 <script src="/assets/js/dictionary.js"></script> 349 <script src="/assets/js/dictionary.js"></script>
323 350
324 <script data-exclude=1> 351 <script data-exclude=1>
325 -//初始打开的片段地址  
326 -var initFragment = "^_^initFragment^_^";  
327 -//静态文件目录  
328 -var dir = '/pages/';  
329 -//片段容器  
330 -var pjaxContainer = '#pjax-container'  
331 - ,angJsContainer = '#route-container';  
332 -  
333 -$(function(){  
334 - $.get('/user/currentUser', function(user){  
335 - $('#indexTopUName').text(user.userName);  
336 - });  
337 -  
338 - //带 data-pjax 的链接由pjax加载  
339 - $(document).pjax('a[data-pjax]', pjaxContainer);  
340 -  
341 - //pjax左菜单点击事件  
342 - $(document).on('click','#leftMenuSidebar a[data-pjax]', function(){  
343 - $('#leftMenuSidebar li.nav-item.active').removeClass('active');  
344 - $(this).parent().addClass('active');  
345 - showPjax();  
346 - });  
347 -  
348 - //angularjs左菜单点击事件  
349 - $(document).on('click','#leftMenuSidebar a[data-angularjs]', function(){  
350 - $('#leftMenuSidebar li.nav-item.active').removeClass('active');  
351 - $(this).parent().addClass('active');  
352 - showAngJs();  
353 - });  
354 -  
355 - //加载左菜单栏  
356 - $get('/module/findByCurrentUser', null,  
357 - function(ms){  
358 - var treeArray = createTreeData(ms);  
359 - treeArray.sort(function(a, b){  
360 - return a.createDate - b.createDate;  
361 - });  
362 - var menuHtml = template('menu_list_temp', {list: treeArray});  
363 - $('#leftMenuSidebar').html(menuHtml);  
364 -  
365 - //----------- 检查URL ----------------  
366 - var h = location.hash;  
367 - if(initFragment && initFragment != ''){  
368 - showPjax();  
369 - //普通片段  
370 - loadPage(initFragment);  
371 - //选中菜单  
372 - $.each($('#leftMenuSidebar a'), function(i, item){  
373 - if(urlPattern($(item).attr('href'), initFragment)){  
374 - activeLeftMenu(item);  
375 - }  
376 - });  
377 - }else if(h){  
378 - //angularjs片段  
379 - showAngJs();  
380 - //选中菜单  
381 - $.each($('#leftMenuSidebar a'), function(i, item){  
382 - if($(item).attr('href') == h){  
383 - activeLeftMenu(item);  
384 - }  
385 - });  
386 - }  
387 - else{  
388 - //加载主页  
389 - loadPage('/pages/home.html');  
390 - }  
391 - });  
392 -  
393 - //修改密码  
394 - $('#changePWD').on('click', function(){  
395 - $.get('/pages/permission/user/changePWD.html', function(content){  
396 - layer.open({  
397 - type: 1,  
398 - area: ['600px','360px'],  
399 - content: content,  
400 - title : '修改密码',  
401 - shift: 5,  
402 - scrollbar: false,  
403 - success: function(){  
404 - }  
405 - });  
406 - });  
407 - });  
408 -});  
409 -  
410 - //modal关闭时销毁dom  
411 - $(document).on('hidden.bs.modal', '.modal', function(){  
412 - $(this).remove();  
413 - });  
414 -  
415 - //pjax加载完成事件  
416 - $(document).on('pjax:success', function(){  
417 - var dicts = $(pjaxContainer).find('.nt-dictionary');  
418 - dictionaryUtils.transformDom(dicts);  
419 - });  
420 -  
421 - function loadPage(url){  
422 - $.pjax({url: url, container: pjaxContainer})  
423 - }  
424 -  
425 - function urlPattern(a , b){  
426 - var r;  
427 - try {  
428 - r = a.substring(0, a.lastIndexOf('/')) == b.substring(0, b.lastIndexOf('/'));  
429 - } catch (e) {  
430 - r = false;  
431 - }  
432 - return r;  
433 - }  
434 -  
435 - function showPjax(){  
436 - $(angJsContainer).removeClass('page-content active').hide();  
437 - $(pjaxContainer).addClass('page-content active');  
438 - }  
439 -  
440 - function showAngJs(){  
441 - $(pjaxContainer).html('').removeClass('page-content active').hide();  
442 - $(angJsContainer).addClass('page-content active');  
443 - }  
444 -  
445 - function activeLeftMenu(item){  
446 - $(item).parent('.nav-item').addClass('active').parent('.sub-menu').show().parent().addClass('open');  
447 - }  
448 - 352 + //初始打开的片段地址
  353 + var initFragment = "^_^initFragment^_^";
  354 + //静态文件目录
  355 + var dir = '/pages/';
  356 + //片段容器
  357 + var pjaxContainer = '#pjax-container'
  358 + , angJsContainer = '#route-container';
  359 +
  360 + $(function () {
  361 + $.get('/user/currentUser', function (user) {
  362 + $('#indexTopUName').text(user.userName);
  363 + });
  364 +
  365 + //带 data-pjax 的链接由pjax加载
  366 + $(document).pjax('a[data-pjax]', pjaxContainer);
  367 +
  368 + //pjax左菜单点击事件
  369 + $(document).on('click', '#leftMenuSidebar a[data-pjax]', function () {
  370 + setTitle(this);
  371 +
  372 + $('#leftMenuSidebar li.nav-item.active').removeClass('active');
  373 + $(this).parent().addClass('active');
  374 + showPjax();
  375 + });
  376 +
  377 + //angularjs左菜单点击事件
  378 + $(document).on('click', '#leftMenuSidebar a[data-angularjs]', function () {
  379 + setTitle(this);
  380 +
  381 + $('#leftMenuSidebar li.nav-item.active').removeClass('active');
  382 + $(this).parent().addClass('active');
  383 + showAngJs();
  384 + });
  385 +
  386 + //加载左菜单栏
  387 + $get('/module/findByCurrentUser', null,
  388 + function (ms) {
  389 + var treeArray = createTreeData(ms);
  390 + treeArray.sort(function (a, b) {
  391 + return a.createDate - b.createDate;
  392 + });
  393 + var menuHtml = template('menu_list_temp', {list: treeArray});
  394 + $('#leftMenuSidebar').html(menuHtml);
  395 +
  396 + //----------- 检查URL ----------------
  397 + var h = location.hash;
  398 + if (initFragment && initFragment != '') {
  399 + showPjax();
  400 + //普通片段
  401 + loadPage(initFragment);
  402 + //选中菜单
  403 + $.each($('#leftMenuSidebar a'), function (i, item) {
  404 + if (urlPattern($(item).attr('href'), initFragment)) {
  405 + activeLeftMenu(item);
  406 + }
  407 + });
  408 + } else if (h) {
  409 + //angularjs片段
  410 + showAngJs();
  411 + //选中菜单
  412 + $.each($('#leftMenuSidebar a'), function (i, item) {
  413 + if ($(item).attr('href') == h) {
  414 + activeLeftMenu(item);
  415 + }
  416 + });
  417 + }
  418 + else {
  419 + //加载主页
  420 + loadPage('/pages/home.html');
  421 + }
  422 + });
  423 +
  424 + //修改密码
  425 + $('#changePWD').on('click', function () {
  426 + $.get('/pages/permission/user/changePWD.html', function (content) {
  427 + layer.open({
  428 + type: 1,
  429 + area: ['600px', '360px'],
  430 + content: content,
  431 + title: '修改密码',
  432 + shift: 5,
  433 + scrollbar: false,
  434 + success: function () {
  435 + }
  436 + });
  437 + });
  438 + });
  439 + });
  440 +
  441 + //modal关闭时销毁dom
  442 + $(document).on('hidden.bs.modal', '.modal', function () {
  443 + $(this).remove();
  444 + });
  445 +
  446 + //pjax加载完成事件
  447 + $(document).on('pjax:success', function () {
  448 + var dicts = $(pjaxContainer).find('.nt-dictionary');
  449 + dictionaryUtils.transformDom(dicts);
  450 + });
  451 +
  452 + function loadPage(url) {
  453 + $.pjax({url: url, container: pjaxContainer})
  454 + }
  455 +
  456 + function urlPattern(a, b) {
  457 + var r;
  458 + try {
  459 + r = a.substring(0, a.lastIndexOf('/')) == b.substring(0, b.lastIndexOf('/'));
  460 + } catch (e) {
  461 + r = false;
  462 + }
  463 + return r;
  464 + }
  465 +
  466 + function showPjax() {
  467 + $(angJsContainer).removeClass('page-content active').hide();
  468 + $(pjaxContainer).addClass('page-content active');
  469 + }
  470 +
  471 + function showAngJs() {
  472 + $(pjaxContainer).html('').removeClass('page-content active').hide();
  473 + $(angJsContainer).addClass('page-content active');
  474 + }
  475 +
  476 + function activeLeftMenu(item) {
  477 + $(item).parent('.nav-item').addClass('active').parent('.sub-menu').show().parent().addClass('open');
  478 + setTitle(item);
  479 + }
  480 +
  481 + function setTitle(menuItem){
  482 + document.title = $('span.title', menuItem).text();
  483 + }
  484 +
449 </script> 485 </script>
450 <!-- d3 --> 486 <!-- d3 -->
451 <script src="/assets/js/d3.min.js" data-exclude=1></script> 487 <script src="/assets/js/d3.min.js" data-exclude=1></script>
@@ -478,8 +514,10 @@ $(function(){ @@ -478,8 +514,10 @@ $(function(){
478 <!-- 百度 --> 514 <!-- 百度 -->
479 <script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT" data-exclude=1></script> 515 <script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT" data-exclude=1></script>
480 <script src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js" data-exclude=1></script> 516 <script src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js" data-exclude=1></script>
481 -<script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js" data-exclude=1></script>  
482 -<script type="text/javascript" src="http://api.map.baidu.com/library/RichMarker/1.2/src/RichMarker_min.js " data-exclude=1></script> 517 +<script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"
  518 + data-exclude=1></script>
  519 +<script type="text/javascript" src="http://api.map.baidu.com/library/RichMarker/1.2/src/RichMarker_min.js "
  520 + data-exclude=1></script>
483 <script src="/assets/js/baidu/TextIconOverlay.js" data-exclude=1></script> 521 <script src="/assets/js/baidu/TextIconOverlay.js" data-exclude=1></script>
484 <script src="/assets/js/baidu//MarkerClusterer.js" data-exclude=1></script> 522 <script src="/assets/js/baidu//MarkerClusterer.js" data-exclude=1></script>
485 <!-- 高德 --> 523 <!-- 高德 -->
src/main/resources/static/pages/forms/mould/account.xls 0 → 100644
No preview for this file type
src/main/resources/static/pages/forms/mould/historyMessage.xls 0 → 100644
No preview for this file type
src/main/resources/static/pages/forms/statement/account.html
@@ -70,6 +70,9 @@ @@ -70,6 +70,9 @@
70 70
71 <script> 71 <script>
72 $(function(){ 72 $(function(){
  73 + $("#export").attr('disabled',"true");
  74 +
  75 +
73 var reqCodeMap = {"0xA1": '请求恢复运营', "0xA2": '申请调档', "0xA3": '出场请求', "0xA5": '进场请求', "0xA7": '加油请求', "0x50": '车辆故障', "0x70": '路阻报告', "0x60": '事故报告', "0x11": '扣证纠纷', "0x12" : '报警'}; 76 var reqCodeMap = {"0xA1": '请求恢复运营', "0xA2": '申请调档', "0xA3": '出场请求', "0xA5": '进场请求', "0xA7": '加油请求', "0x50": '车辆故障', "0x70": '路阻报告', "0x60": '事故报告', "0x11": '扣证纠纷', "0x12" : '报警'};
74 // 关闭左侧栏 77 // 关闭左侧栏
75 if (!$('body').hasClass('page-sidebar-closed')) 78 if (!$('body').hasClass('page-sidebar-closed'))
@@ -130,14 +133,19 @@ @@ -130,14 +133,19 @@
130 } 133 }
131 } 134 }
132 }); 135 });
133 - 136 +
  137 + var line = $("#line").val();
  138 + var xlName = $("#select2-line-container").html();
  139 + var date = $("#date").val();
  140 + var code = $("#code").val();
134 $("#query").on("click",function(){ 141 $("#query").on("click",function(){
135 - var line = $("#line").val();  
136 - var xlName = $("#select2-line-container").html();  
137 - var date = $("#date").val();  
138 - var code = $("#code").val(); 142 + line = $("#line").val();
  143 + xlName = $("#select2-line-container").html();
  144 + date = $("#date").val();
  145 + code = $("#code").val();
  146 + var type = "query";
139 $(".hidden").removeClass("hidden"); 147 $(".hidden").removeClass("hidden");
140 - $post('/realSchedule/account',{line:line,date:date,code:code,xlName:xlName},function(result){ 148 + $post('/realSchedule/account',{line:line,date:date,code:code,xlName:xlName,type:type},function(result){
141 $.each(result, function(i, obj) { 149 $.each(result, function(i, obj) {
142 obj.requestType = reqCodeMap[obj.requestType]; 150 obj.requestType = reqCodeMap[obj.requestType];
143 }); 151 });
@@ -145,8 +153,22 @@ @@ -145,8 +153,22 @@
145 var tbodyHtml = template('list_account',{list:result}); 153 var tbodyHtml = template('list_account',{list:result});
146 // 把渲染好的模版html文本追加到表格中 154 // 把渲染好的模版html文本追加到表格中
147 $('#forms tbody').html(tbodyHtml); 155 $('#forms tbody').html(tbodyHtml);
  156 +
  157 + if(result.length == 0)
  158 + $("#export").attr('disabled',"true");
  159 + else
  160 + $("#export").removeAttr("disabled");
  161 +
148 }); 162 });
149 - }); 163 + });
  164 +
  165 + $("#export").on("click",function(){
  166 + var type = "export";
  167 + $get('/realSchedule/account', {line:line,date:date,code:code,xlName:xlName,type:type}, function(result){
  168 + window.open("/downloadFile/download?fileName=驾驶员请求台账"+moment(date).format("YYYYMMDD"));
  169 + });
  170 + });
  171 +
150 }); 172 });
151 </script> 173 </script>
152 <script type="text/html" id="list_account"> 174 <script type="text/html" id="list_account">
src/main/resources/static/pages/forms/statement/correctForm.html
@@ -67,7 +67,8 @@ @@ -67,7 +67,8 @@
67 <td rowspan="2">线路名</td> 67 <td rowspan="2">线路名</td>
68 <td rowspan="2">路牌</td> 68 <td rowspan="2">路牌</td>
69 <td rowspan="2">车号</td> 69 <td rowspan="2">车号</td>
70 - <td colspan="2">车号</td> 70 + <td rowspan="2">司机</td>
  71 + <td rowspan="2">售票员</td>
71 <td colspan="2">发车时间</td> 72 <td colspan="2">发车时间</td>
72 <td colspan="2">结束时间</td> 73 <td colspan="2">结束时间</td>
73 <td rowspan="2">修改人</td> 74 <td rowspan="2">修改人</td>
@@ -75,8 +76,6 @@ @@ -75,8 +76,6 @@
75 <td rowspan="2">备注</td> 76 <td rowspan="2">备注</td>
76 </tr> 77 </tr>
77 <tr> 78 <tr>
78 - <td>司机</td>  
79 - <td>售票员</td>  
80 <td>计划</td> 79 <td>计划</td>
81 <td>实际</td> 80 <td>实际</td>
82 <td>计划</td> 81 <td>计划</td>
@@ -97,7 +96,10 @@ @@ -97,7 +96,10 @@
97 </div> 96 </div>
98 97
99 <script> 98 <script>
100 - $(function(){ 99 + $(function(){
  100 + $("#export").attr('disabled',"true");
  101 +
  102 +
101 // 关闭左侧栏 103 // 关闭左侧栏
102 if (!$('body').hasClass('page-sidebar-closed')) 104 if (!$('body').hasClass('page-sidebar-closed'))
103 $('.menu-toggler.sidebar-toggler').click(); 105 $('.menu-toggler.sidebar-toggler').click();
@@ -196,14 +198,20 @@ @@ -196,14 +198,20 @@
196 } 198 }
197 } 199 }
198 }); 200 });
199 - 201 +
  202 + var line = $("#line").val();
  203 + var startDate = $("#startDate").val();
  204 + var endDate = $("#endDate").val();
  205 + var lpName = $("#lpName").val();
  206 + var code = $("#code").val();
200 $("#query").on("click",function(){ 207 $("#query").on("click",function(){
201 - var line = $("#line").val();  
202 - var startDate = $("#startDate").val();  
203 - var endDate = $("#endDate").val();  
204 - var lpName = $("#lpName").val();  
205 - var code = $("#code").val();  
206 - $post("/realSchedule/correctForm",{line:line,startDate:startDate,endDate:endDate,lpName:lpName,code:code},function(result){ 208 + line = $("#line").val();
  209 + startDate = $("#startDate").val();
  210 + endDate = $("#endDate").val();
  211 + lpName = $("#lpName").val();
  212 + code = $("#code").val();
  213 + var type = "query";
  214 + $post("/realSchedule/correctForm",{line:line,startDate:startDate,endDate:endDate,lpName:lpName,code:code,type:type},function(result){
207 $("#sDate").text(startDate); 215 $("#sDate").text(startDate);
208 $("#eDate").text(endDate); 216 $("#eDate").text(endDate);
209 var temp = {}; 217 var temp = {};
@@ -228,8 +236,22 @@ @@ -228,8 +236,22 @@
228 236
229 /* var list_correctForm_statistics = template('list_correctForm_statistics',temp); 237 /* var list_correctForm_statistics = template('list_correctForm_statistics',temp);
230 $('#forms .list_correctForm_statistics').html(list_correctForm_statistics); */ 238 $('#forms .list_correctForm_statistics').html(list_correctForm_statistics); */
  239 +
  240 + if(result.length == 0)
  241 + $("#export").attr('disabled',"true");
  242 + else
  243 + $("#export").removeAttr("disabled");
  244 +
231 }); 245 });
232 - }); 246 + });
  247 +
  248 + $("#export").on("click",function(){
  249 + var type = "export";
  250 + $get('/realSchedule/correctForm',{line:line,startDate:startDate,endDate:endDate,lpName:lpName,code:code,type:type},function(result){
  251 + window.open("/downloadFile/download?fileName=修正报表"+moment(startDate).format("YYYYMMDD")+"-"+moment(endDate).format("YYYYMMDD"));
  252 + });
  253 + });
  254 +
233 }); 255 });
234 </script> 256 </script>
235 <script type="text/html" id="list_correctForm"> 257 <script type="text/html" id="list_correctForm">
src/main/resources/static/pages/forms/statement/historyMessage.html
@@ -41,7 +41,7 @@ @@ -41,7 +41,7 @@
41 </div> 41 </div>
42 <div class="form-group"> 42 <div class="form-group">
43 <input class="btn btn-default" type="button" id="query" value="筛选"/> 43 <input class="btn btn-default" type="button" id="query" value="筛选"/>
44 -<!-- <input class="btn btn-default" type="button" id="export" value="导出"/> --> 44 + <input class="btn btn-default" type="button" id="export" value="导出"/>
45 </div> 45 </div>
46 </form> 46 </form>
47 </div> 47 </div>
@@ -69,7 +69,9 @@ @@ -69,7 +69,9 @@
69 </div> 69 </div>
70 70
71 <script> 71 <script>
72 - $(function(){ 72 + $(function(){
  73 + $('#export').attr('disabled', "true");
  74 +
73 // 关闭左侧栏 75 // 关闭左侧栏
74 if (!$('body').hasClass('page-sidebar-closed')) 76 if (!$('body').hasClass('page-sidebar-closed'))
75 $('.menu-toggler.sidebar-toggler').click(); 77 $('.menu-toggler.sidebar-toggler').click();
@@ -127,21 +129,35 @@ @@ -127,21 +129,35 @@
127 } 129 }
128 } 130 }
129 }); 131 });
130 - 132 +
  133 + var line = $("#line").val();
  134 + var date = $("#date").val();
  135 + var code = $("#code").val();
131 $("#query").on("click",function(){ 136 $("#query").on("click",function(){
132 - var line = $("#line").val();  
133 - var date = $("#date").val();  
134 - var code = $("#code").val(); 137 + line = $("#line").val();
  138 + date = $("#date").val();
  139 + code = $("#code").val();
  140 + var type = "query";
135 $(".hidden").removeClass("hidden"); 141 $(".hidden").removeClass("hidden");
136 $get('/realSchedule/historyMessage',{line:line,date:date,code:code},function(result){ 142 $get('/realSchedule/historyMessage',{line:line,date:date,code:code},function(result){
137 // 把数据填充到模版中 143 // 把数据填充到模版中
138 var tbodyHtml = template('list_history',{list:result}); 144 var tbodyHtml = template('list_history',{list:result});
139 // 把渲染好的模版html文本追加到表格中 145 // 把渲染好的模版html文本追加到表格中
140 $('#forms tbody').html(tbodyHtml); 146 $('#forms tbody').html(tbodyHtml);
  147 +
  148 + if(result.length == 0)
  149 + $("#export").attr('disabled',"true");
  150 + else
  151 + $("#export").removeAttr("disabled");
  152 +
141 }); 153 });
142 }); 154 });
  155 +
143 $("#export").on("click",function(){ 156 $("#export").on("click",function(){
144 - $('#forms').tableExport({ type: 'excel', escape: 'false',filename:'(2016-02-29_2016-03-06)'}); 157 + var type = "export";
  158 + $get('/realSchedule/historyMessage', {line:line,date:date,code:code,type:type}, function(result){
  159 + window.open("/downloadFile/download?fileName=调度历史消息"+moment(date).format("YYYYMMDD"));
  160 + });
145 }); 161 });
146 162
147 }); 163 });
src/main/resources/static/pages/forms/statement/jobSummary.html
@@ -37,7 +37,7 @@ @@ -37,7 +37,7 @@
37 </div> 37 </div>
38 <div class="form-group"> 38 <div class="form-group">
39 <input class="btn btn-default" type="button" id="query" value="查询"/> 39 <input class="btn btn-default" type="button" id="query" value="查询"/>
40 - <input class="btn btn-default" type="button" id="export" value="导出"/> 40 +<!-- <input class="btn btn-default" type="button" id="export" value="导出"/> -->
41 </div> 41 </div>
42 </form> 42 </form>
43 </div> 43 </div>
src/main/resources/static/pages/forms/statement/scheduleDaily.html
@@ -269,7 +269,6 @@ @@ -269,7 +269,6 @@
269 for(var code in result){ 269 for(var code in result){
270 data.push({id: code, text: result[code]}); 270 data.push({id: code, text: result[code]});
271 } 271 }
272 - console.log(data);  
273 initPinYinSelect2('#line',data,''); 272 initPinYinSelect2('#line',data,'');
274 273
275 }) 274 })
@@ -282,7 +281,8 @@ @@ -282,7 +281,8 @@
282 var scheduleDaily_1 = template('scheduleDaily_1',{list:result}); 281 var scheduleDaily_1 = template('scheduleDaily_1',{list:result});
283 $('#forms .scheduleDaily_1').html(scheduleDaily_1); 282 $('#forms .scheduleDaily_1').html(scheduleDaily_1);
284 }); 283 });
285 - $.get('/realSchedule/queryUserInfo',{line:line,date:date},function(result){ 284 + $.get('/realSchedule/queryUserInfo',{line:line,date:date,state:2},function(result){
  285 + console.log(result);
286 var scheduleDaily_2 = template('scheduleDaily_2',{list:result}); 286 var scheduleDaily_2 = template('scheduleDaily_2',{list:result});
287 $('#forms .scheduleDaily_2').html(scheduleDaily_2); 287 $('#forms .scheduleDaily_2').html(scheduleDaily_2);
288 }); 288 });
@@ -346,10 +346,10 @@ @@ -346,10 +346,10 @@
346 {{if i%5 == 0}} 346 {{if i%5 == 0}}
347 <tr> 347 <tr>
348 {{/if}} 348 {{/if}}
349 - <td colspan="2">{{obj.lpName}}</td>  
350 - <td colspan="2">{{obj.clZbh}}</td>  
351 - <td>{{obj.jGh}}</td>  
352 - <td>{{obj.sGh}}</td> 349 + <td colspan="2">{{obj[3]}}</td>
  350 + <td colspan="2">{{obj[2]}}</td>
  351 + <td>{{obj[4]}}</td>
  352 + <td>&nbsp;</td>
353 <td>&nbsp;</td> 353 <td>&nbsp;</td>
354 <td>&nbsp;</td> 354 <td>&nbsp;</td>
355 {{if (i+1)%5 == 0}} 355 {{if (i+1)%5 == 0}}
src/main/resources/static/pages/report/timetable/timetable.html
@@ -234,7 +234,7 @@ @@ -234,7 +234,7 @@
234 234
235 $.get('/basic/lineCode2Name',function(result){ 235 $.get('/basic/lineCode2Name',function(result){
236 var data=[]; 236 var data=[];
237 - 237 + data.push({id: "", text: "请选择"});
238 for(var code in result){ 238 for(var code in result){
239 data.push({id: code, text: result[code]}); 239 data.push({id: code, text: result[code]});
240 } 240 }
src/main/resources/static/pages/scheduleApp/module/basicInfo/busInfoManage/module.js
@@ -147,7 +147,7 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;BusInfoManageToolsCtrl&#39;, [&#39;$modalInsta @@ -147,7 +147,7 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;BusInfoManageToolsCtrl&#39;, [&#39;$modalInsta
147 147
148 // 上传文件组件 148 // 上传文件组件
149 self.uploader = new FileUploader({ 149 self.uploader = new FileUploader({
150 - url: "/cars/dataImport", 150 + url: "/cars_sc/uploadAndImportFile",
151 filters: [] // 用于过滤文件,比如只允许导入excel 151 filters: [] // 用于过滤文件,比如只允许导入excel
152 }); 152 });
153 self.uploader.onAfterAddingFile = function(fileItem) 153 self.uploader.onAfterAddingFile = function(fileItem)
@@ -159,7 +159,16 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;BusInfoManageToolsCtrl&#39;, [&#39;$modalInsta @@ -159,7 +159,16 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;BusInfoManageToolsCtrl&#39;, [&#39;$modalInsta
159 }; 159 };
160 self.uploader.onSuccessItem = function(fileItem, response, status, headers) 160 self.uploader.onSuccessItem = function(fileItem, response, status, headers)
161 { 161 {
162 - console.info('onSuccessItem', fileItem, response, status, headers); 162 + if (response.status == "SUCCESS") {
  163 + console.info('onSuccessItem', fileItem, response, status, headers);
  164 + } else {
  165 + fileItem.isSuccess = false;
  166 + fileItem.isCancel = false;
  167 + fileItem.isError = true;
  168 +
  169 + alert(response.msg);
  170 + }
  171 +
163 }; 172 };
164 self.uploader.onErrorItem = function(fileItem, response, status, headers) 173 self.uploader.onErrorItem = function(fileItem, response, status, headers)
165 { 174 {
src/main/resources/static/pages/scheduleApp/module/basicInfo/busInfoManage/service.js
@@ -59,14 +59,14 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -59,14 +59,14 @@ angular.module(&#39;ScheduleApp&#39;).factory(
59 } 59 }
60 ), 60 ),
61 dataTools: $resource( 61 dataTools: $resource(
62 - '/cars/:type', 62 + '/cars_sc/:type',
63 {}, 63 {},
64 { 64 {
65 dataExport: { 65 dataExport: {
66 method: 'GET', 66 method: 'GET',
67 responseType: "arraybuffer", 67 responseType: "arraybuffer",
68 params: { 68 params: {
69 - type: "dataExport" 69 + type: "exportFile"
70 }, 70 },
71 transformResponse: function(data, headers){ 71 transformResponse: function(data, headers){
72 return {data : data}; 72 return {data : data};
src/main/resources/static/pages/scheduleApp/module/basicInfo/employeeInfoManage/module.js
@@ -146,7 +146,7 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;EmployInfoManageToolsCtrl&#39;, [&#39;$modalIn @@ -146,7 +146,7 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;EmployInfoManageToolsCtrl&#39;, [&#39;$modalIn
146 146
147 // 上传文件组件 147 // 上传文件组件
148 self.uploader = new FileUploader({ 148 self.uploader = new FileUploader({
149 - url: "/personnel/dataImport", 149 + url: "/ee/uploadAndImportFile",
150 filters: [] // 用于过滤文件,比如只允许导入excel 150 filters: [] // 用于过滤文件,比如只允许导入excel
151 }); 151 });
152 self.uploader.onAfterAddingFile = function(fileItem) 152 self.uploader.onAfterAddingFile = function(fileItem)
@@ -158,7 +158,15 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;EmployInfoManageToolsCtrl&#39;, [&#39;$modalIn @@ -158,7 +158,15 @@ angular.module(&#39;ScheduleApp&#39;).controller(&#39;EmployInfoManageToolsCtrl&#39;, [&#39;$modalIn
158 }; 158 };
159 self.uploader.onSuccessItem = function(fileItem, response, status, headers) 159 self.uploader.onSuccessItem = function(fileItem, response, status, headers)
160 { 160 {
161 - console.info('onSuccessItem', fileItem, response, status, headers); 161 + if (response.status == "SUCCESS") {
  162 + console.info('onSuccessItem', fileItem, response, status, headers);
  163 + } else {
  164 + fileItem.isSuccess = false;
  165 + fileItem.isCancel = false;
  166 + fileItem.isError = true;
  167 +
  168 + alert(response.msg);
  169 + }
162 }; 170 };
163 self.uploader.onErrorItem = function(fileItem, response, status, headers) 171 self.uploader.onErrorItem = function(fileItem, response, status, headers)
164 { 172 {
src/main/resources/static/pages/scheduleApp/module/basicInfo/employeeInfoManage/service.js
@@ -41,14 +41,14 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -41,14 +41,14 @@ angular.module(&#39;ScheduleApp&#39;).factory(
41 ), 41 ),
42 42
43 dataTools: $resource( 43 dataTools: $resource(
44 - '/personnel/:type', 44 + '/ee/:type',
45 {}, 45 {},
46 { 46 {
47 dataExport: { 47 dataExport: {
48 method: 'GET', 48 method: 'GET',
49 responseType: "arraybuffer", 49 responseType: "arraybuffer",
50 params: { 50 params: {
51 - type: "dataExport" 51 + type: "exportFile"
52 }, 52 },
53 transformResponse: function(data, headers){ 53 transformResponse: function(data, headers){
54 return {data : data}; 54 return {data : data};
src/main/resources/static/pages/scheduleApp/module/common/prj-common-globalservice.js
@@ -60,14 +60,14 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -60,14 +60,14 @@ angular.module(&#39;ScheduleApp&#39;).factory(
60 } 60 }
61 ), 61 ),
62 dataTools: $resource( 62 dataTools: $resource(
63 - '/cars/:type', 63 + '/cars_sc/:type',
64 {}, 64 {},
65 { 65 {
66 dataExport: { 66 dataExport: {
67 method: 'GET', 67 method: 'GET',
68 responseType: "arraybuffer", 68 responseType: "arraybuffer",
69 params: { 69 params: {
70 - type: "dataExport" 70 + type: "exportFile"
71 }, 71 },
72 transformResponse: function(data, headers){ 72 transformResponse: function(data, headers){
73 return {data : data}; 73 return {data : data};
@@ -163,14 +163,14 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -163,14 +163,14 @@ angular.module(&#39;ScheduleApp&#39;).factory(
163 ), 163 ),
164 164
165 dataTools: $resource( 165 dataTools: $resource(
166 - '/personnel/:type', 166 + '/ee/:type',
167 {}, 167 {},
168 { 168 {
169 dataExport: { 169 dataExport: {
170 method: 'GET', 170 method: 'GET',
171 responseType: "arraybuffer", 171 responseType: "arraybuffer",
172 params: { 172 params: {
173 - type: "dataExport" 173 + type: "exportFile"
174 }, 174 },
175 transformResponse: function(data, headers){ 175 transformResponse: function(data, headers){
176 return {data : data}; 176 return {data : data};
@@ -533,15 +533,31 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -533,15 +533,31 @@ angular.module(&#39;ScheduleApp&#39;).factory(
533 {order: 'createDate', direction: 'DESC', id: '@id'}, 533 {order: 'createDate', direction: 'DESC', id: '@id'},
534 { 534 {
535 get: { 535 get: {
536 - method: 'GET' 536 + method: 'GET',
  537 + transformResponse: function(rs) {
  538 + var dst = angular.fromJson(rs);
  539 + if (dst.status == 'SUCCESS') {
  540 + return dst.data;
  541 + } else {
  542 + return dst; // 业务错误留给控制器处理
  543 + }
  544 + }
537 }, 545 },
538 save: { 546 save: {
539 - method: 'POST' 547 + method: 'POST',
  548 + transformResponse: function(rs) {
  549 + var dst = angular.fromJson(rs);
  550 + if (dst.status == 'SUCCESS') {
  551 + return dst.data;
  552 + } else {
  553 + return dst; // 业务错误留给控制器处理
  554 + }
  555 + }
540 } 556 }
541 } 557 }
542 ), 558 ),
543 import: $resource( 559 import: $resource(
544 - '/tidc/importfile', 560 + '/tidc/importFile',
545 {}, 561 {},
546 { 562 {
547 do: { 563 do: {
@@ -564,7 +580,15 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -564,7 +580,15 @@ angular.module(&#39;ScheduleApp&#39;).factory(
564 {}, 580 {},
565 { 581 {
566 list: { 582 list: {
567 - method: 'GET' 583 + method: 'GET',
  584 + transformResponse: function(rs) {
  585 + var dst = angular.fromJson(rs);
  586 + if (dst.status == 'SUCCESS') {
  587 + return dst.data;
  588 + } else {
  589 + return dst; // 业务错误留给控制器处理
  590 + }
  591 + }
568 } 592 }
569 } 593 }
570 ), 594 ),
@@ -586,7 +610,7 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -586,7 +610,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(
586 method: 'GET', 610 method: 'GET',
587 responseType: "arraybuffer", 611 responseType: "arraybuffer",
588 params: { 612 params: {
589 - type: "dataExportExt" 613 + type: "exportFile"
590 }, 614 },
591 transformResponse: function(data, headers){ 615 transformResponse: function(data, headers){
592 return {data : data}; 616 return {data : data};
src/main/resources/static/pages/scheduleApp/module/core/busConfig/edit.html
@@ -76,19 +76,19 @@ @@ -76,19 +76,19 @@
76 searchexp="this.insideCode" 76 searchexp="this.insideCode"
77 required > 77 required >
78 </sa-Select5> 78 </sa-Select5>
79 - <input type="hidden" name="cl_h" ng-model="ctrl.busConfigForSave.cl.id"  
80 - remote-Validation  
81 - remotevtype="cc_cars"  
82 - remotevparam="{{ {'id_eq': ctrl.busConfigForSave.id, 'xl.id_eq': ctrl.busConfigForSave.xl.id, 'xl.name_eq': ctrl.busConfigForSave.xl.name, 'cl.id_eq': ctrl.busConfigForSave.cl.id} | json}}"  
83 - /> 79 + <!--<input type="hidden" name="cl_h" ng-model="ctrl.busConfigForSave.cl.id"-->
  80 + <!--remote-Validation-->
  81 + <!--remotevtype="cc_cars"-->
  82 + <!--remotevparam="{{ {'id_eq': ctrl.busConfigForSave.id, 'xl.id_eq': ctrl.busConfigForSave.xl.id, 'xl.name_eq': ctrl.busConfigForSave.xl.name, 'cl.id_eq': ctrl.busConfigForSave.cl.id} | json}}"-->
  83 + <!--/>-->
84 </div> 84 </div>
85 <!-- 隐藏块,显示验证信息 --> 85 <!-- 隐藏块,显示验证信息 -->
86 <div class="alert alert-danger well-sm" ng-show="myForm.cl.$error.required"> 86 <div class="alert alert-danger well-sm" ng-show="myForm.cl.$error.required">
87 车辆必须选择 87 车辆必须选择
88 </div> 88 </div>
89 - <div class="alert alert-danger well-sm" ng-show="myForm.cl_h.$error.remote">  
90 - {{$remote_msg}}  
91 - </div> 89 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.cl_h.$error.remote">-->
  90 + <!--{{$remote_msg}}-->
  91 + <!--</div>-->
92 </div> 92 </div>
93 93
94 <div class="form-group has-success has-feedback"> 94 <div class="form-group has-success has-feedback">
src/main/resources/static/pages/scheduleApp/module/core/busConfig/form.html
@@ -76,19 +76,19 @@ @@ -76,19 +76,19 @@
76 searchexp="this.insideCode" 76 searchexp="this.insideCode"
77 required > 77 required >
78 </sa-Select5> 78 </sa-Select5>
79 - <input type="hidden" name="cl_h" ng-model="ctrl.busConfigForSave.cl.id"  
80 - remote-Validation  
81 - remotevtype="cc_cars"  
82 - remotevparam="{{ {'xl.id_eq': ctrl.busConfigForSave.xl.id, 'xl.name_eq': ctrl.busConfigForSave.xl.name, 'cl.id_eq': ctrl.busConfigForSave.cl.id} | json}}"  
83 - /> 79 + <!--<input type="hidden" name="cl_h" ng-model="ctrl.busConfigForSave.cl.id"-->
  80 + <!--remote-Validation-->
  81 + <!--remotevtype="cc_cars"-->
  82 + <!--remotevparam="{{ {'xl.id_eq': ctrl.busConfigForSave.xl.id, 'xl.name_eq': ctrl.busConfigForSave.xl.name, 'cl.id_eq': ctrl.busConfigForSave.cl.id} | json}}"-->
  83 + <!--/>-->
84 </div> 84 </div>
85 <!-- 隐藏块,显示验证信息 --> 85 <!-- 隐藏块,显示验证信息 -->
86 <div class="alert alert-danger well-sm" ng-show="myForm.cl.$error.required"> 86 <div class="alert alert-danger well-sm" ng-show="myForm.cl.$error.required">
87 车辆必须选择 87 车辆必须选择
88 </div> 88 </div>
89 - <div class="alert alert-danger well-sm" ng-show="myForm.cl_h.$error.remote">  
90 - {{$remote_msg}}  
91 - </div> 89 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.cl_h.$error.remote">-->
  90 + <!--{{$remote_msg}}-->
  91 + <!--</div>-->
92 </div> 92 </div>
93 93
94 <div class="form-group has-success has-feedback"> 94 <div class="form-group has-success has-feedback">
src/main/resources/static/pages/scheduleApp/module/core/employeeConfig/edit.html
@@ -89,19 +89,19 @@ @@ -89,19 +89,19 @@
89 searchexp="this.personnelName + '<' + this.jobCode + '>'" 89 searchexp="this.personnelName + '<' + this.jobCode + '>'"
90 required > 90 required >
91 </sa-Select5> 91 </sa-Select5>
92 - <input type="hidden" name="jsy_h" ng-model="ctrl.employeeConfigForSave.jsy.id"  
93 - remote-Validation  
94 - remotevtype="ec_jsy"  
95 - remotevparam="{{ {'id_eq': ctrl.employeeConfigForSave.id, 'xl.id_eq': ctrl.employeeConfigForSave.xl.id, 'xl.name_eq': ctrl.employeeConfigForSave.xl.name, 'jsy.id_eq': ctrl.employeeConfigForSave.jsy.id} | json}}"  
96 - /> 92 + <!--<input type="hidden" name="jsy_h" ng-model="ctrl.employeeConfigForSave.jsy.id"-->
  93 + <!--remote-Validation-->
  94 + <!--remotevtype="ec_jsy"-->
  95 + <!--remotevparam="{{ {'id_eq': ctrl.employeeConfigForSave.id, 'xl.id_eq': ctrl.employeeConfigForSave.xl.id, 'xl.name_eq': ctrl.employeeConfigForSave.xl.name, 'jsy.id_eq': ctrl.employeeConfigForSave.jsy.id} | json}}"-->
  96 + <!--/>-->
97 </div> 97 </div>
98 <!-- 隐藏块,显示验证信息 --> 98 <!-- 隐藏块,显示验证信息 -->
99 <div class="alert alert-danger well-sm" ng-show="myForm.jsy.$error.required"> 99 <div class="alert alert-danger well-sm" ng-show="myForm.jsy.$error.required">
100 驾驶员必须选择 100 驾驶员必须选择
101 </div> 101 </div>
102 - <div class="alert alert-danger well-sm" ng-show="myForm.jsy_h.$error.remote">  
103 - {{$remote_msg}}  
104 - </div> 102 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.jsy_h.$error.remote">-->
  103 + <!--{{$remote_msg}}-->
  104 + <!--</div>-->
105 </div> 105 </div>
106 106
107 <div class="form-group"> 107 <div class="form-group">
@@ -119,16 +119,16 @@ @@ -119,16 +119,16 @@
119 searchexp="this.personnelName + '<' + this.jobCode + '>'" 119 searchexp="this.personnelName + '<' + this.jobCode + '>'"
120 > 120 >
121 </sa-Select5> 121 </sa-Select5>
122 - <input type="hidden" name="spy_h" ng-model="ctrl.employeeConfigForSave.spy.id"  
123 - remote-Validation  
124 - remotevtype="ec_spy"  
125 - remotevparam="{{ {'id_eq': ctrl.employeeConfigForSave.id, 'xl.id_eq': ctrl.employeeConfigForSave.xl.id, 'xl.name_eq': ctrl.employeeConfigForSave.xl.name, 'spy.id_eq': ctrl.employeeConfigForSave.spy.id} | json}}"  
126 - /> 122 + <!--<input type="hidden" name="spy_h" ng-model="ctrl.employeeConfigForSave.spy.id"-->
  123 + <!--remote-Validation-->
  124 + <!--remotevtype="ec_spy"-->
  125 + <!--remotevparam="{{ {'id_eq': ctrl.employeeConfigForSave.id, 'xl.id_eq': ctrl.employeeConfigForSave.xl.id, 'xl.name_eq': ctrl.employeeConfigForSave.xl.name, 'spy.id_eq': ctrl.employeeConfigForSave.spy.id} | json}}"-->
  126 + <!--/>-->
127 </div> 127 </div>
128 <!-- 隐藏块,显示验证信息 --> 128 <!-- 隐藏块,显示验证信息 -->
129 - <div class="alert alert-danger well-sm" ng-show="myForm.spy_h.$error.remote">  
130 - {{$remote_msg}}  
131 - </div> 129 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.spy_h.$error.remote">-->
  130 + <!--{{$remote_msg}}-->
  131 + <!--</div>-->
132 </div> 132 </div>
133 133
134 <!-- 其他form-group --> 134 <!-- 其他form-group -->
src/main/resources/static/pages/scheduleApp/module/core/employeeConfig/form.html
@@ -89,19 +89,19 @@ @@ -89,19 +89,19 @@
89 searchexp="this.personnelName + '<' + this.jobCode + '>'" 89 searchexp="this.personnelName + '<' + this.jobCode + '>'"
90 required > 90 required >
91 </sa-Select5> 91 </sa-Select5>
92 - <input type="hidden" name="jsy_h" ng-model="ctrl.employeeConfigForSave.jsy.id"  
93 - remote-Validation  
94 - remotevtype="ec_jsy"  
95 - remotevparam="{{ {'xl.id_eq': ctrl.employeeConfigForSave.xl.id, 'xl.name_eq': ctrl.employeeConfigForSave.xl.name, 'jsy.id_eq': ctrl.employeeConfigForSave.jsy.id} | json}}"  
96 - /> 92 + <!--<input type="hidden" name="jsy_h" ng-model="ctrl.employeeConfigForSave.jsy.id"-->
  93 + <!--remote-Validation-->
  94 + <!--remotevtype="ec_jsy"-->
  95 + <!--remotevparam="{{ {'xl.id_eq': ctrl.employeeConfigForSave.xl.id, 'xl.name_eq': ctrl.employeeConfigForSave.xl.name, 'jsy.id_eq': ctrl.employeeConfigForSave.jsy.id} | json}}"-->
  96 + <!--/>-->
97 </div> 97 </div>
98 <!-- 隐藏块,显示验证信息 --> 98 <!-- 隐藏块,显示验证信息 -->
99 <div class="alert alert-danger well-sm" ng-show="myForm.jsy.$error.required"> 99 <div class="alert alert-danger well-sm" ng-show="myForm.jsy.$error.required">
100 驾驶员必须选择 100 驾驶员必须选择
101 </div> 101 </div>
102 - <div class="alert alert-danger well-sm" ng-show="myForm.jsy_h.$error.remote">  
103 - {{$remote_msg}}  
104 - </div> 102 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.jsy_h.$error.remote">-->
  103 + <!--{{$remote_msg}}-->
  104 + <!--</div>-->
105 </div> 105 </div>
106 106
107 <div class="form-group"> 107 <div class="form-group">
@@ -119,16 +119,16 @@ @@ -119,16 +119,16 @@
119 searchexp="this.personnelName + '<' + this.jobCode + '>'" 119 searchexp="this.personnelName + '<' + this.jobCode + '>'"
120 > 120 >
121 </sa-Select5> 121 </sa-Select5>
122 - <input type="hidden" name="spy_h" ng-model="ctrl.employeeConfigForSave.spy.id"  
123 - remote-Validation  
124 - remotevtype="ec_spy"  
125 - remotevparam="{{ {'xl.id_eq': ctrl.employeeConfigForSave.xl.id, 'xl.name_eq': ctrl.employeeConfigForSave.xl.name, 'spy.id_eq': ctrl.employeeConfigForSave.spy.id} | json}}"  
126 - /> 122 + <!--<input type="hidden" name="spy_h" ng-model="ctrl.employeeConfigForSave.spy.id"-->
  123 + <!--remote-Validation-->
  124 + <!--remotevtype="ec_spy"-->
  125 + <!--remotevparam="{{ {'xl.id_eq': ctrl.employeeConfigForSave.xl.id, 'xl.name_eq': ctrl.employeeConfigForSave.xl.name, 'spy.id_eq': ctrl.employeeConfigForSave.spy.id} | json}}"-->
  126 + <!--/>-->
127 </div> 127 </div>
128 <!-- 隐藏块,显示验证信息 --> 128 <!-- 隐藏块,显示验证信息 -->
129 - <div class="alert alert-danger well-sm" ng-show="myForm.spy_h.$error.remote">  
130 - {{$remote_msg}}  
131 - </div> 129 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.spy_h.$error.remote">-->
  130 + <!--{{$remote_msg}}-->
  131 + <!--</div>-->
132 </div> 132 </div>
133 133
134 <!-- 其他form-group --> 134 <!-- 其他form-group -->
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/detailedit/edit-detail2.html
@@ -126,6 +126,22 @@ @@ -126,6 +126,22 @@
126 </div> 126 </div>
127 127
128 </div> 128 </div>
  129 + <div class="form-group has-success has-feedback">
  130 + <label class="col-md-3 control-label">班次类型:</label>
  131 + <div class="col-md-7">
  132 + <sa-Select3 model="ctrl.TimeTableDetailForSave"
  133 + name="bcType"
  134 + placeholder="请选择班次类型..."
  135 + dcvalue="{{ctrl.TimeTableDetailForSave.bcType}}"
  136 + dcname="bcType"
  137 + icname="code"
  138 + icnames="name"
  139 + datatype="ScheduleType"
  140 + >
  141 + </sa-Select3>
  142 + </div>
  143 +
  144 + </div>
129 145
130 </div> 146 </div>
131 147
@@ -148,3 +164,4 @@ @@ -148,3 +164,4 @@
148 164
149 165
150 </div> 166 </div>
  167 +
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/detailedit/edit.html
@@ -74,6 +74,7 @@ @@ -74,6 +74,7 @@
74 </div> 74 </div>
75 75
76 <div class="portlet-body"> 76 <div class="portlet-body">
  77 + <h3><span ng-bind="ctrl.getYYDesc()"></span></h3>
77 <!--<div ng-view></div>--> 78 <!--<div ng-view></div>-->
78 <div class="fixDiv"> 79 <div class="fixDiv">
79 <table style="width: 2000px" class="table table-striped table-bordered table-hover table-checkable order-column"> 80 <table style="width: 2000px" class="table table-striped table-bordered table-hover table-checkable order-column">
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/detailedit/form.html
@@ -118,7 +118,7 @@ @@ -118,7 +118,7 @@
118 required > 118 required >
119 </sa-Select5> 119 </sa-Select5>
120 <input type="hidden" name="sheetname_h" ng-model="ctrl.ttInfoDetailManageForForm.sheetvaliddesc" 120 <input type="hidden" name="sheetname_h" ng-model="ctrl.ttInfoDetailManageForForm.sheetvaliddesc"
121 - remote-Validationt2 121 + remote-Validation
122 remotevtype="sheet" 122 remotevtype="sheet"
123 remotevparam="{{ { 123 remotevparam="{{ {
124 'filename': ctrl.ttInfoDetailManageForForm.filename, 124 'filename': ctrl.ttInfoDetailManageForForm.filename,
@@ -132,7 +132,7 @@ @@ -132,7 +132,7 @@
132 工作区必须选择 132 工作区必须选择
133 </div> 133 </div>
134 <div class="alert alert-danger well-sm" ng-show="myForm.sheetname_h.$error.remote"> 134 <div class="alert alert-danger well-sm" ng-show="myForm.sheetname_h.$error.remote">
135 - {{ctrl.ttInfoDetailManageForForm.sheetvaliddesc}} 135 + {{$remote_msg}}
136 </div> 136 </div>
137 </div> 137 </div>
138 138
@@ -152,7 +152,7 @@ @@ -152,7 +152,7 @@
152 required > 152 required >
153 </sa-Select5> 153 </sa-Select5>
154 <input type="hidden" name="lineinfo_h" ng-model="ctrl.ttInfoDetailManageForForm.lineinfo" 154 <input type="hidden" name="lineinfo_h" ng-model="ctrl.ttInfoDetailManageForForm.lineinfo"
155 - remote-Validationt2 155 + remote-Validation
156 remotevtype="sheetli" 156 remotevtype="sheetli"
157 remotevparam="{{ {'lineinfoid': ctrl.ttInfoDetailManageForForm.lineinfo} | json}}"/> 157 remotevparam="{{ {'lineinfoid': ctrl.ttInfoDetailManageForForm.lineinfo} | json}}"/>
158 </div> 158 </div>
@@ -161,9 +161,7 @@ @@ -161,9 +161,7 @@
161 线路标准必须选择 161 线路标准必须选择
162 </div> 162 </div>
163 <div class="alert alert-danger well-sm" ng-show="myForm.lineinfo_h.$error.remote"> 163 <div class="alert alert-danger well-sm" ng-show="myForm.lineinfo_h.$error.remote">
164 - {{ctrl.ttInfoDetailManageForForm.lineinfovaliddesc}}  
165 -  
166 - 上下行出场进场里程时间必须填写,上下行班次里程时间必须填写,停车场必须填写 164 + {{$remote_msg}}
167 </div> 165 </div>
168 </div> 166 </div>
169 167
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/detailedit/module.js
@@ -89,13 +89,26 @@ angular.module(&#39;ScheduleApp&#39;).controller( @@ -89,13 +89,26 @@ angular.module(&#39;ScheduleApp&#39;).controller(
89 }; 89 };
90 self.uploader.onSuccessItem = function(fileItem, response, status, headers) 90 self.uploader.onSuccessItem = function(fileItem, response, status, headers)
91 { 91 {
92 - self.sheetnames = response.sheetnames;  
93 - self.ttInfoDetailManageForForm.filename = response.fileName;  
94 - console.info('onSuccessItem', fileItem, response, status, headers); 92 + if (response.status == "SUCCESS") {
  93 + self.sheetnames = [];
  94 + var sheetNames = response.sheetnames.split(",");
  95 + for (var i = 0; i < sheetNames.length; i++) {
  96 + self.sheetnames.push({name: sheetNames[i]});
  97 + }
  98 + self.ttInfoDetailManageForForm.filename = response.filename;
  99 + console.info('onSuccessItem', fileItem, response, status, headers);
  100 + } else {
  101 + self.sheetnames = [];
  102 + fileItem.isSuccess = false;
  103 + fileItem.isCancel = false;
  104 + fileItem.isError = true;
  105 +
  106 + alert(response.msg);
  107 + }
  108 +
95 }; 109 };
96 self.uploader.onErrorItem = function(fileItem, response, status, headers) 110 self.uploader.onErrorItem = function(fileItem, response, status, headers)
97 { 111 {
98 - alert("error");  
99 self.sheetnames = []; 112 self.sheetnames = [];
100 console.info('onErrorItem', fileItem, response, status, headers); 113 console.info('onErrorItem', fileItem, response, status, headers);
101 }; 114 };
@@ -105,10 +118,11 @@ angular.module(&#39;ScheduleApp&#39;).controller( @@ -105,10 +118,11 @@ angular.module(&#39;ScheduleApp&#39;).controller(
105 self.submit = function() { 118 self.submit = function() {
106 service.importDetail(self.ttInfoDetailManageForForm).then( 119 service.importDetail(self.ttInfoDetailManageForForm).then(
107 function(result) { 120 function(result) {
108 - $state.go("ttInfoManage");  
109 - },  
110 - function(result) {  
111 - alert("出错啦!"); 121 + if (result.status == 'SUCCESS') {
  122 + $state.go("ttInfoManage");
  123 + } else {
  124 + alert(result.msg);
  125 + }
112 } 126 }
113 ); 127 );
114 }; 128 };
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/detailedit/timeTableDetailManage_old.js
@@ -13,7 +13,8 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -13,7 +13,8 @@ angular.module(&#39;ScheduleApp&#39;).factory(
13 // 时刻表信息 13 // 时刻表信息
14 var editInfo = { 14 var editInfo = {
15 detailHeads: [], // 时刻表头信息 15 detailHeads: [], // 时刻表头信息
16 - detailInfos: [] // 时刻表明细信息 16 + detailInfos: [], // 时刻表明细信息
  17 + yydesc: "" // 营运汇总描述
17 }; 18 };
18 19
19 return { 20 return {
@@ -32,18 +33,24 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -32,18 +33,24 @@ angular.module(&#39;ScheduleApp&#39;).factory(
32 refreshEditInfo: function(xlid, ttid) { 33 refreshEditInfo: function(xlid, ttid) {
33 editInfo = { 34 editInfo = {
34 detailHeads: [], // 时刻表头信息 35 detailHeads: [], // 时刻表头信息
35 - detailInfos: [] // 时刻表明细信息 36 + detailInfos: [], // 时刻表明细信息
  37 + yydesc: "" // 营运汇总描述
36 }; 38 };
37 39
38 service.edit.list({xlid: xlid, ttid: ttid}, function(result) { 40 service.edit.list({xlid: xlid, ttid: ttid}, function(result) {
39 - editInfo.detailHeads = result.header;  
40 - editInfo.detailInfos = result.contents;  
41 -  
42 - // detailInfos里添加是否选中的flag  
43 - for (var i = 0; i < editInfo.detailInfos.length; i++) {  
44 - for (var j = 0; j < editInfo.detailInfos[i].length; j++) {  
45 - editInfo.detailInfos[i][j].sel = false; 41 + if (result.status != 'ERROR') {
  42 + editInfo.detailHeads = result.header;
  43 + editInfo.detailInfos = result.contents;
  44 + editInfo.yydesc = result.yy_desc;
  45 +
  46 + // detailInfos里添加是否选中的flag
  47 + for (var i = 0; i < editInfo.detailInfos.length; i++) {
  48 + for (var j = 0; j < editInfo.detailInfos[i].length; j++) {
  49 + editInfo.detailInfos[i][j].sel = false;
  50 + }
46 } 51 }
  52 + } else {
  53 + alert(result.msg);
47 } 54 }
48 }); 55 });
49 }, 56 },
@@ -76,26 +83,40 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -76,26 +83,40 @@ angular.module(&#39;ScheduleApp&#39;).factory(
76 for (var n = 0; n < ttinfodetailIds.length; n++) { 83 for (var n = 0; n < ttinfodetailIds.length; n++) {
77 (function(index) { 84 (function(index) {
78 queryClass.get({id: ttinfodetailIds[index].ttdid}, function(value) { 85 queryClass.get({id: ttinfodetailIds[index].ttdid}, function(value) {
79 - for (var key in updateObject) {  
80 - if (updateObject[key]) {  
81 - value[key] = updateObject[key]; 86 + if (value.status == 'ERROR') {
  87 + error_counts ++;
  88 + if (success_counts + error_counts == ttinfodetailIds.length) {
  89 + deferred.reject();
  90 + }
  91 + } else {
  92 + for (var key in updateObject) {
  93 + if (updateObject[key]) {
  94 + value[key] = updateObject[key];
  95 + }
82 } 96 }
83 } 97 }
84 value.$save(function() { 98 value.$save(function() {
85 - // 赋值(上下行,发车时间,班次类型)  
86 - if (value.fcsj) {  
87 - ttinfodetailIds[index].fcsj = value.fcsj;  
88 - }  
89 - if (value.xlDir) {  
90 - ttinfodetailIds[index].xldir = value.xlDir;  
91 - }  
92 - if (value.bcType) {  
93 - ttinfodetailIds[index].bc_type = value.bcType;  
94 - }  
95 -  
96 - success_counts ++;  
97 - if (success_counts + error_counts == ttinfodetailIds.length) {  
98 - deferred.resolve(); 99 + if (value.status == 'ERROR') {
  100 + error_counts ++;
  101 + if (success_counts + error_counts == ttinfodetailIds.length) {
  102 + deferred.reject();
  103 + }
  104 + } else {
  105 + // 赋值(上下行,发车时间,班次类型)
  106 + if (value.fcsj) {
  107 + ttinfodetailIds[index].fcsj = value.fcsj;
  108 + }
  109 + if (value.xlDir) {
  110 + ttinfodetailIds[index].xldir = value.xlDir;
  111 + }
  112 + if (value.bcType) {
  113 + ttinfodetailIds[index].bc_type = value.bcType;
  114 + }
  115 +
  116 + success_counts ++;
  117 + if (success_counts + error_counts == ttinfodetailIds.length) {
  118 + deferred.resolve();
  119 + }
99 } 120 }
100 }, function() { 121 }, function() {
101 error_counts ++; 122 error_counts ++;
@@ -147,6 +168,9 @@ angular.module(&#39;ScheduleApp&#39;).controller( @@ -147,6 +168,9 @@ angular.module(&#39;ScheduleApp&#39;).controller(
147 self.getDetailInfos = function() { 168 self.getDetailInfos = function() {
148 return service.getEditInfo().detailInfos; 169 return service.getEditInfo().detailInfos;
149 }; 170 };
  171 + self.getYYDesc = function() {
  172 + return service.getEditInfo().yydesc;
  173 + };
150 174
151 // 刷新时刻表数据 175 // 刷新时刻表数据
152 self.refresh = function() { 176 self.refresh = function() {
@@ -337,7 +361,6 @@ angular.module(&#39;ScheduleApp&#39;).controller( @@ -337,7 +361,6 @@ angular.module(&#39;ScheduleApp&#39;).controller(
337 delete self.TimeTableDetailForSave.zdz; 361 delete self.TimeTableDetailForSave.zdz;
338 362
339 service.editInfos(self.TimeTableDetailForSave).then(function() { 363 service.editInfos(self.TimeTableDetailForSave).then(function() {
340 - alert("批量更新成功!");  
341 $state.go("ttInfoDetailManage_edit", { 364 $state.go("ttInfoDetailManage_edit", {
342 xlid: self.xlid, 365 xlid: self.xlid,
343 ttid: self.ttid, 366 ttid: self.ttid,
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/module.js
@@ -50,7 +50,7 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -50,7 +50,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(
50 */ 50 */
51 dataExport: function(ttinfoid) { 51 dataExport: function(ttinfoid) {
52 var param = {}; 52 var param = {};
53 - param.type = 'dataExportExt'; 53 + param.type = 'exportFile';
54 param.ttinfoid = ttinfoid; 54 param.ttinfoid = ttinfoid;
55 return dservice.dataTools.dataExport(param).$promise; 55 return dservice.dataTools.dataExport(param).$promise;
56 } 56 }
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/service.js
@@ -54,15 +54,31 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -54,15 +54,31 @@ angular.module(&#39;ScheduleApp&#39;).factory(
54 {order: 'createDate', direction: 'DESC', id: '@id'}, 54 {order: 'createDate', direction: 'DESC', id: '@id'},
55 { 55 {
56 get: { 56 get: {
57 - method: 'GET' 57 + method: 'GET',
  58 + transformResponse: function(rs) {
  59 + var dst = angular.fromJson(rs);
  60 + if (dst.status == 'SUCCESS') {
  61 + return dst.data;
  62 + } else {
  63 + return dst; // 业务错误留给控制器处理
  64 + }
  65 + }
58 }, 66 },
59 save: { 67 save: {
60 - method: 'POST' 68 + method: 'POST',
  69 + transformResponse: function(rs) {
  70 + var dst = angular.fromJson(rs);
  71 + if (dst.status == 'SUCCESS') {
  72 + return dst.data;
  73 + } else {
  74 + return dst; // 业务错误留给控制器处理
  75 + }
  76 + }
61 } 77 }
62 } 78 }
63 ), 79 ),
64 import: $resource( 80 import: $resource(
65 - '/tidc/importfile', 81 + '/tidc/importFile',
66 {}, 82 {},
67 { 83 {
68 do: { 84 do: {
@@ -85,7 +101,15 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -85,7 +101,15 @@ angular.module(&#39;ScheduleApp&#39;).factory(
85 {}, 101 {},
86 { 102 {
87 list: { 103 list: {
88 - method: 'GET' 104 + method: 'GET',
  105 + transformResponse: function(rs) {
  106 + var dst = angular.fromJson(rs);
  107 + if (dst.status == 'SUCCESS') {
  108 + return dst.data;
  109 + } else {
  110 + return dst; // 业务错误留给控制器处理
  111 + }
  112 + }
89 } 113 }
90 } 114 }
91 ), 115 ),
@@ -107,7 +131,7 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -107,7 +131,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(
107 method: 'GET', 131 method: 'GET',
108 responseType: "arraybuffer", 132 responseType: "arraybuffer",
109 params: { 133 params: {
110 - type: "dataExportExt" 134 + type: "exportFile"
111 }, 135 },
112 transformResponse: function(data, headers){ 136 transformResponse: function(data, headers){
113 return {data : data}; 137 return {data : data};
src/main/resources/static/real_control_v2/css/line_schedule.css
@@ -685,15 +685,17 @@ label.destroy-sch small{ @@ -685,15 +685,17 @@ label.destroy-sch small{
685 border-bottom: 0; 685 border-bottom: 0;
686 } 686 }
687 687
688 -i.add-temp-sch-icon{  
689 - float: right;  
690 - font-size: 18px;  
691 - cursor: pointer;  
692 - color: #4592b8;  
693 - margin: 10px 15px 0; 688 +.add-temp-sch-icon{
  689 + float: right;
  690 + margin: 0 3px 0;
  691 + padding: 0;
  692 + font-size: 13px;
  693 + text-decoration: underline;
694 } 694 }
695 -i.add-temp-sch-icon:hover{  
696 - color: #2d7091; 695 +
  696 +.add-temp-lp-icon{
  697 + cursor: pointer;
  698 + margin-left: 5px;
697 } 699 }
698 700
699 701
@@ -1046,4 +1048,20 @@ i.signal_state_icon.uk-icon-question-circle{ @@ -1046,4 +1048,20 @@ i.signal_state_icon.uk-icon-question-circle{
1046 i.signal_state_icon.uk-icon-reply{ 1048 i.signal_state_icon.uk-icon-reply{
1047 color: #4134e3 !important; 1049 color: #4134e3 !important;
1048 box-shadow: none; 1050 box-shadow: none;
  1051 +}
  1052 +
  1053 +.child-task-status{
  1054 + float: right;
  1055 + font-size: 13px;
  1056 +}
  1057 +
  1058 +.child-task-status.fail{
  1059 + color: red;
  1060 + text-shadow: red 0px 0px 20px;
  1061 +}
  1062 +
  1063 +.child-task-status.fail span.calc-detail{
  1064 + font-family: Consolas,monospace,serif;
  1065 + white-space: nowrap;
  1066 + font-size: 14px;
1049 } 1067 }
1050 \ No newline at end of file 1068 \ No newline at end of file
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/add_temp_sch.html
@@ -13,7 +13,8 @@ @@ -13,7 +13,8 @@
13 <div class="uk-form-row"> 13 <div class="uk-form-row">
14 <label class="uk-form-label">班次类型</label> 14 <label class="uk-form-label">班次类型</label>
15 <div class="uk-form-controls"> 15 <div class="uk-form-controls">
16 - <select class="form-control nt-dictionary" name="bcType" data-code="{{bcType}}" data-group=ScheduleType></select> 16 + <select class="form-control nt-dictionary" name="bcType" data-code="{{bcType}}"
  17 + data-group=ScheduleType></select>
17 </div> 18 </div>
18 </div> 19 </div>
19 </div> 20 </div>
@@ -22,8 +23,8 @@ @@ -22,8 +23,8 @@
22 <label class="uk-form-label">上下行</label> 23 <label class="uk-form-label">上下行</label>
23 <div class="uk-form-controls"> 24 <div class="uk-form-controls">
24 <select name="xlDir"> 25 <select name="xlDir">
25 - <option value="0">上行</option>  
26 - <option value="1">下行</option> 26 + <option value="0">上行</option>
  27 + <option value="1">下行</option>
27 </select> 28 </select>
28 </div> 29 </div>
29 </div> 30 </div>
@@ -35,7 +36,7 @@ @@ -35,7 +36,7 @@
35 <label class="uk-form-label">起点站</label> 36 <label class="uk-form-label">起点站</label>
36 <div class="uk-form-controls"> 37 <div class="uk-form-controls">
37 <select name="qdzCode" required> 38 <select name="qdzCode" required>
38 - </select> 39 + </select>
39 </div> 40 </div>
40 </div> 41 </div>
41 </div> 42 </div>
@@ -44,7 +45,7 @@ @@ -44,7 +45,7 @@
44 <label class="uk-form-label">终点站</label> 45 <label class="uk-form-label">终点站</label>
45 <div class="uk-form-controls"> 46 <div class="uk-form-controls">
46 <select name="zdzCode" required> 47 <select name="zdzCode" required>
47 - </select> 48 + </select>
48 </div> 49 </div>
49 </div> 50 </div>
50 </div> 51 </div>
@@ -82,7 +83,8 @@ @@ -82,7 +83,8 @@
82 <div class="uk-form-row"> 83 <div class="uk-form-row">
83 <label class="uk-form-label">里程</label> 84 <label class="uk-form-label">里程</label>
84 <div class="uk-form-controls"> 85 <div class="uk-form-controls">
85 - <input type="text" name="jhlc" value="{{jhlc}}" max=222 data-fv-lessthan-inclusive="false" required> 86 + <input type="text" name="jhlc" value="{{jhlc}}" max=222 data-fv-lessthan-inclusive="false"
  87 + required>
86 </div> 88 </div>
87 </div> 89 </div>
88 </div> 90 </div>
@@ -90,7 +92,8 @@ @@ -90,7 +92,8 @@
90 <div class="uk-grid"> 92 <div class="uk-grid">
91 <div class="uk-width-1-2"> 93 <div class="uk-width-1-2">
92 <div class="uk-form-row"> 94 <div class="uk-form-row">
93 - <label class="uk-form-label">驾驶员 <!--<i class="uk-icon-question-circle" data-uk-tooltip title="如果有驾驶员未提示,请至后台“基础信息 -人员信息”里纠正该员工的“工种”类别 "></i>--></label> 95 + <label class="uk-form-label">驾驶员
  96 + <!--<i class="uk-icon-question-circle" data-uk-tooltip title="如果有驾驶员未提示,请至后台“基础信息 -人员信息”里纠正该员工的“工种”类别 "></i>--></label>
94 <div class="uk-form-controls"> 97 <div class="uk-form-controls">
95 <div class="uk-autocomplete uk-form jsy-autocom"> 98 <div class="uk-autocomplete uk-form jsy-autocom">
96 <input type="text" value="{{jGh}}/{{jName}}" name="jsy" required> 99 <input type="text" value="{{jGh}}/{{jName}}" name="jsy" required>
@@ -116,101 +119,139 @@ @@ -116,101 +119,139 @@
116 </script> 119 </script>
117 120
118 <script> 121 <script>
119 - (function() { 122 + (function () {
120 var modal = '#schedule-addsch-modal', 123 var modal = '#schedule-addsch-modal',
121 - sch, stationRoutes, parks, information;  
122 - $(modal).on('init', function(e, data) { 124 + sch, stationRoutes, parks, information;
  125 +
  126 + var normalInfo = [];
  127 + $(modal).on('init', function (e, data) {
123 sch = data.sch; 128 sch = data.sch;
  129 + //normal 班次里程和耗时
  130 + var list = gb_common.get_vals(gb_schedule_table.findScheduleByLine(sch.xlBm));
  131 + var upPlan = getNormalSch(list, 0)
  132 + , downPlan = getNormalSch(list, 1);
  133 + normalInfo[0] = {time: upPlan.bcsj, mileage: upPlan.jhlc};
  134 + normalInfo[1] = {time: downPlan.bcsj, mileage: downPlan.jhlc};
  135 +
  136 +
124 var formHtml = template('schedule-addsch-form-temp', sch); 137 var formHtml = template('schedule-addsch-form-temp', sch);
125 $('form', modal).html(formHtml); 138 $('form', modal).html(formHtml);
126 //字典转换 139 //字典转换
127 dictionaryUtils.transformDom($('.nt-dictionary', modal)); 140 dictionaryUtils.transformDom($('.nt-dictionary', modal));
128 141
129 //----------- Autocomplete -------------- 142 //----------- Autocomplete --------------
130 - $.get('/basic/cars', function(rs) { 143 + $.get('/basic/cars', function (rs) {
131 //车辆 144 //车辆
132 gb_common.carAutocomplete($('.car-autocom', modal), rs); 145 gb_common.carAutocomplete($('.car-autocom', modal), rs);
133 }); 146 });
134 - //$.get('/basic/all_personnel', function(rs) {  
135 - //驾驶员  
136 - gb_common.personAutocomplete($('.jsy-autocom', modal));  
137 - //售票员  
138 - gb_common.personAutocomplete($('.spy-autocom', modal));  
139 - //}); 147 + //驾驶员
  148 + gb_common.personAutocomplete($('.jsy-autocom', modal));
  149 +
  150 + //售票员
  151 + gb_common.personAutocomplete($('.spy-autocom', modal));
140 152
141 //站点路由 153 //站点路由
142 - stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(sch.xlBm).sort(function(a, b){  
143 - return a.stationRouteCode-b.stationRouteCode; 154 + stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(sch.xlBm).sort(function (a, b) {
  155 + return a.stationRouteCode - b.stationRouteCode;
144 }), 'directions'); 156 }), 'directions');
145 //停车场 157 //停车场
146 - $.get('/basic/parks', function(rs){  
147 - parks=rs; 158 + $.get('/basic/parks', function (rs) {
  159 + parks = rs;
148 }); 160 });
149 //线路标准 161 //线路标准
150 - information=gb_data_basic.getLineInformation(sch.xlBm); 162 + information = gb_data_basic.getLineInformation(sch.xlBm);
151 163
152 //submit 164 //submit
153 var f = $('form', modal).formValidation(gb_form_validation_opts); 165 var f = $('form', modal).formValidation(gb_form_validation_opts);
154 - f.on('success.form.fv', function(e) { 166 + f.on('success.form.fv', function (e) {
155 disabled_submit_btn(this); 167 disabled_submit_btn(this);
156 e.preventDefault(); 168 e.preventDefault();
157 var data = $(this).serializeJSON(); 169 var data = $(this).serializeJSON();
158 - data.xlBm=sch.xlBm;  
159 - data.xlName=sch.xlName;  
160 - data.lpName=sch.lpName; 170 + data.xlBm = sch.xlBm;
  171 + data.xlName = sch.xlName;
  172 + data.lpName = sch.lpName;
161 //拆分驾驶员工号和姓名 173 //拆分驾驶员工号和姓名
162 data.jGh = data.jsy.split('/')[0]; 174 data.jGh = data.jsy.split('/')[0];
163 data.jName = data.jsy.split('/')[1]; 175 data.jName = data.jsy.split('/')[1];
164 delete data.jsy; 176 delete data.jsy;
165 //拆分售票员工号和姓名 177 //拆分售票员工号和姓名
166 - if(data.sGh != null){  
167 - data.sGh = data.spy.split('/')[0];  
168 - data.sName = data.spy.split('/')[1];  
169 - delete data.spy; 178 + if (data.sGh != null) {
  179 + data.sGh = data.spy.split('/')[0];
  180 + data.sName = data.spy.split('/')[1];
  181 + delete data.spy;
170 } 182 }
171 183
172 - gb_common.$post('/realSchedule', data, function(rs){  
173 - //插入  
174 - gb_schedule_table.insertSchedule(rs.t, rs.ts);  
175 - $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: rs.t});  
176 - UIkit.modal(modal).hide();  
177 - notify_succ('新增临加班次成功'); 184 + gb_common.$post('/realSchedule', data, function (rs) {
  185 + //插入
  186 + gb_schedule_table.insertSchedule(rs.t, rs.ts);
  187 + $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: rs.t});
  188 + UIkit.modal(modal).hide();
  189 + notify_succ('新增临加班次成功');
178 }); 190 });
179 }); 191 });
180 192
181 //班次类型 和 上下行切换 193 //班次类型 和 上下行切换
182 - $('[name=bcType],[name=xlDir]', f).on('change', function(){  
183 - var bcType_e=$('[name=bcType]', f)  
184 - , xlDir_e=$('[name=xlDir]', f);  
185 -  
186 - var routes=stationRoutes[xlDir_e.val()]  
187 - ,lastCode=routes[routes.length-1].stationCode  
188 - ,opts='',park_opts='';  
189 - //station options  
190 - $.each(routes, function(){  
191 - opts+='<option value="'+this.stationCode+'">'+this.stationName+'</option>'  
192 - });  
193 - //park options  
194 - for(var code in parks)  
195 - park_opts+='<option value="'+code+'">'+parks[code]+'</option>';  
196 -  
197 - var qdz=$('[name=qdzCode]', f),zdz=$('[name=zdzCode]', f);  
198 - switch (bcType_e.val()) {  
199 - case 'out':  
200 - qdz.html(park_opts).val(information.carPark);  
201 - zdz.html(opts);  
202 - break;  
203 - case 'in':  
204 - qdz.html(opts);  
205 - zdz.html(park_opts).val(information.carPark);  
206 - break;  
207 - default:  
208 - qdz.html(opts);  
209 - zdz.html(opts).val(lastCode);  
210 - } 194 + $('[name=bcType],[name=xlDir]', f).on('change', function () {
  195 + var bcType_e = $('[name=bcType]', f)
  196 + , xlDir_e = $('[name=xlDir]', f);
  197 +
  198 + var routes = stationRoutes[xlDir_e.val()]
  199 + , lastCode = routes[routes.length - 1].stationCode
  200 + , opts = '', park_opts = '';
  201 + //station options
  202 + $.each(routes, function () {
  203 + opts += '<option value="' + this.stationCode + '">' + this.stationName + '</option>'
  204 + });
  205 + //park options
  206 + for (var code in parks)
  207 + park_opts += '<option value="' + code + '">' + parks[code] + '</option>';
  208 +
  209 + var qdz = $('[name=qdzCode]', f), zdz = $('[name=zdzCode]', f);
  210 + var time, mileage;
  211 + switch (bcType_e.val()) {
  212 + case 'out':
  213 + qdz.html(park_opts).val(information.carPark);
  214 + zdz.html(opts);
  215 + //出场结束时间
  216 + time = xlDir_e.val() == 0 ? information.upOutTimer : information.downOutTimer;
  217 + mileage = xlDir_e.val() == 0 ? information.upOutMileage : information.downOutMileage;
  218 + break;
  219 + case 'in':
  220 + qdz.html(opts);
  221 + zdz.html(park_opts).val(information.carPark);
  222 + //进场结束时间
  223 + time = xlDir_e.val() == 0 ? information.upInTimer : information.downInTimer;
  224 + mileage = xlDir_e.val() == 0 ? information.upInMileage : information.downInMileage;
  225 + break;
  226 + default:
  227 + qdz.html(opts);
  228 + zdz.html(opts).val(lastCode);
  229 + time = xlDir_e.val() == 0?normalInfo[0].time:normalInfo[1].time;
  230 + mileage = xlDir_e.val() == 0?normalInfo[0].mileage:normalInfo[1].mileage;
  231 + }
  232 +
  233 + setEndTime(time);
  234 + $('[name=jhlc]', f).val(mileage);
211 }).trigger('change'); 235 }).trigger('change');
212 236
  237 +
  238 + function setEndTime(diff) {
  239 + var et = moment($('[name=fcsj]', f).val(), 'HH:mm').add(diff, 'minutes').format('HH:mm');
  240 + $('[name=zdsj]', f).val(et);
  241 + }
213 }); 242 });
  243 +
  244 + function getNormalSch(list, updown) {
  245 + var sch;
  246 + $.each(list, function () {
  247 + if (this.bcType == 'normal' && this.xlDir == updown) {
  248 + sch = this;
  249 + return false;
  250 + }
  251 + });
  252 +
  253 + return sch;
  254 + }
214 })(); 255 })();
215 </script> 256 </script>
216 </div> 257 </div>
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/lj_zrw.html
@@ -18,13 +18,17 @@ @@ -18,13 +18,17 @@
18 <div class="uk-form-row"> 18 <div class="uk-form-row">
19 <label class="uk-form-label" style="width: 50px;">路牌</label> 19 <label class="uk-form-label" style="width: 50px;">路牌</label>
20 <div class="uk-form-controls" style="margin-left: 51px;"> 20 <div class="uk-form-controls" style="margin-left: 51px;">
21 - <select name="lpName"></select> 21 + <select name="lpName" style="width: 120px;"></select>
  22 + <i class="uk-icon-plus add-temp-lp-icon" title="临加路牌" data-uk-tooltip></i>
22 </div> 23 </div>
23 </div> 24 </div>
24 </div> 25 </div>
25 <div class="uk-width-1-3"> 26 <div class="uk-width-1-3">
26 <div class="uk-form-row"> 27 <div class="uk-form-row">
27 - <i class="uk-icon-plus add-temp-sch-icon" title="新增临加班次" data-uk-tooltip></i> 28 + <!--<i class="uk-icon-plus add-temp-sch-icon" title="新增临加班次" data-uk-tooltip></i>-->
  29 + <!--<button class="uk-button uk-button-primary add-temp-sch-icon">临加班次</button>-->
  30 + <!--<a class="uk-button add-temp-sch-icon"><i class="uk-icon-plus"></i> 临加班次</a>-->
  31 + <a class="uk-button uk-button-link add-temp-sch-icon"> 临加班次</a>
28 </div> 32 </div>
29 </div> 33 </div>
30 </div> 34 </div>
@@ -51,7 +55,9 @@ @@ -51,7 +55,9 @@
51 </div> 55 </div>
52 56
53 <div class="uk-panel uk-panel-box uk-panel-box-secondary" style="padding-bottom: 0;"> 57 <div class="uk-panel uk-panel-box uk-panel-box-secondary" style="padding-bottom: 0;">
54 - <h3 class="uk-panel-title">子任务列表</h3> 58 + <h3 class="uk-panel-title" id="childTaskTitle">
  59 + 子任务列表
  60 + </h3>
55 <div class="ct_table_wrap ct_table_no_border" style="height: 142px;"> 61 <div class="ct_table_wrap ct_table_no_border" style="height: 142px;">
56 <div class="ct_table sub-task-table"> 62 <div class="ct_table sub-task-table">
57 <div class="ct_table_head"> 63 <div class="ct_table_head">
@@ -131,6 +137,12 @@ @@ -131,6 +137,12 @@
131 </dl> 137 </dl>
132 {{/each}} 138 {{/each}}
133 </script> 139 </script>
  140 +
  141 + <script id="sub_task-fail-status-temp" type="text/html">
  142 + <div class="child-task-status fail"><i class="uk-icon-times-circle"></i> 营运里程 与主任务不符,请检查子任务
  143 + <span class="calc-detail">{{calcs}}</span></div>
  144 + </script>
  145 +
134 <script> 146 <script>
135 (function () { 147 (function () {
136 var modal_opts = {center: false, bgclose: false, modal: false} 148 var modal_opts = {center: false, bgclose: false, modal: false}
@@ -140,6 +152,7 @@ @@ -140,6 +152,7 @@
140 s_t_body = '.sub-task-table .ct_table_body', 152 s_t_body = '.sub-task-table .ct_table_body',
141 folder = '/real_control_v2/fragments/line_schedule/context_menu', 153 folder = '/real_control_v2/fragments/line_schedule/context_menu',
142 sch, schList, lp2SchMap; 154 sch, schList, lp2SchMap;
  155 +
143 $(modal).on('init', function (e, data) { 156 $(modal).on('init', function (e, data) {
144 sch = data.sch; 157 sch = data.sch;
145 158
@@ -163,10 +176,16 @@ @@ -163,10 +176,16 @@
163 176
164 //路牌下拉框 177 //路牌下拉框
165 $('[name=lpName]', f).on('change', function () { 178 $('[name=lpName]', f).on('change', function () {
166 - var list = lp2SchMap[$(this).val()].sort(gb_schedule_table.schedule_sort),  
167 - htmlBody = template('schedule-main-table-temp', {  
168 - list: list  
169 - }); 179 + var list = [];
  180 +
  181 + try {
  182 + list = lp2SchMap[$(this).val()].sort(gb_schedule_table.schedule_sort);
  183 +
  184 + } catch (e) {
  185 + }
  186 + var htmlBody = template('schedule-main-table-temp', {
  187 + list: list
  188 + });
170 $(m_t_body, modal).html(htmlBody); 189 $(m_t_body, modal).html(htmlBody);
171 $(s_t_body, modal).empty(); 190 $(s_t_body, modal).empty();
172 }); 191 });
@@ -218,7 +237,7 @@ @@ -218,7 +237,7 @@
218 if (opts && opts.sch) { 237 if (opts && opts.sch) {
219 selectedDl(opts.sch); 238 selectedDl(opts.sch);
220 } 239 }
221 - } 240 + };
222 241
223 //刷新子任务表格 242 //刷新子任务表格
224 var sub_task_update = function () { 243 var sub_task_update = function () {
@@ -230,7 +249,30 @@ @@ -230,7 +249,30 @@
230 tbody.html(htmlStr); 249 tbody.html(htmlStr);
231 //字典转换 250 //字典转换
232 dictionaryUtils.transformDom($('.nt-dictionary', tbody)); 251 dictionaryUtils.transformDom($('.nt-dictionary', tbody));
233 - } 252 +
  253 + //检查子任务营运里程
  254 + $('#childTaskTitle .child-task-status', modal).remove();
  255 + var i = 0;
  256 + if (sch.cTasks.length == 0)
  257 + return;
  258 + var sum = 0, calcs = '';
  259 + $.each(sch.cTasks, function () {
  260 + if (this.mileageType == 'service') {
  261 + sum = gb_common.accAdd(sum, this.mileage);
  262 + calcs += (' + ' + this.mileage);
  263 + i++;
  264 + }
  265 + });
  266 + //公里与主任务不符合
  267 + if (sum != sch.jhlc) {
  268 + if (i > 1)
  269 + calcs += ('=' + sum);
  270 + calcs += (' ≠ ' + sch.jhlc);
  271 + calcs = calcs.substr(3);
  272 + var htmlStr = template('sub_task-fail-status-temp', {calcs: calcs});
  273 + $('#childTaskTitle', modal).append(htmlStr);
  274 + }
  275 + };
234 276
235 //新增临加 277 //新增临加
236 var add_temp_sch = function () { 278 var add_temp_sch = function () {
@@ -241,7 +283,7 @@ @@ -241,7 +283,7 @@
241 open_modal(folder + '/add_temp_sch.html', { 283 open_modal(folder + '/add_temp_sch.html', {
242 sch: sch 284 sch: sch
243 }, modal_opts); 285 }, modal_opts);
244 - } 286 + };
245 287
246 //删除临加班次 288 //删除临加班次
247 var remove_sch = function () { 289 var remove_sch = function () {
@@ -254,7 +296,6 @@ @@ -254,7 +296,6 @@
254 //前端数据更新 296 //前端数据更新
255 gb_schedule_table.updateSchedule(rs.ts); 297 gb_schedule_table.updateSchedule(rs.ts);
256 gb_schedule_table.deheteSchedule(rs.delete); 298 gb_schedule_table.deheteSchedule(rs.delete);
257 - //m_s_table_update();  
258 $('.main-schedule-table', modal).trigger('refresh'); 299 $('.main-schedule-table', modal).trigger('refresh');
259 }); 300 });
260 }, '确定删除'); 301 }, '确定删除');
@@ -359,6 +400,21 @@ @@ -359,6 +400,21 @@
359 gb_ct_table.fixedHead($('.ct_table_wrap', modal)); 400 gb_ct_table.fixedHead($('.ct_table_wrap', modal));
360 401
361 $('.add-temp-sch-icon', modal).on('click', add_temp_sch); 402 $('.add-temp-sch-icon', modal).on('click', add_temp_sch);
  403 + //临加路牌
  404 + $('.add-temp-lp-icon', modal).on('click', function () {
  405 + var index = 0, max;
  406 + for (var lp in lp2SchMap) {
  407 + if (lp.indexOf('临') != -1) {
  408 + max = lp.substr(lp.indexOf('临') + 1);
  409 + if (!isNaN(max))
  410 + index = parseInt(max);
  411 + }
  412 + }
  413 +
  414 + var lpName = '临' + (index + 1);
  415 + lp2SchMap[lpName] = [];
  416 + $('[name=lpName]', f).append('<option value="' + lpName + '">' + lpName + '</option>').val(lpName).trigger('change');
  417 + });
362 418
363 function sub_task_sort(a, b) { 419 function sub_task_sort(a, b) {
364 return a.id - b.id; 420 return a.id - b.id;
src/main/resources/static/real_control_v2/js/data/data_gps.js
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 var gb_data_gps = (function() { 3 var gb_data_gps = (function() {
4 4
5 //fixed time refresh delay 5 //fixed time refresh delay
6 - var delay = 1000 * 60; 6 + var delay = 1000 * 6;
7 //deviceId ——> gps 7 //deviceId ——> gps
8 var realData = {}; 8 var realData = {};
9 //refresh after callback 9 //refresh after callback
@@ -15,12 +15,6 @@ var gb_data_gps = (function() { @@ -15,12 +15,6 @@ var gb_data_gps = (function() {
15 }; 15 };
16 16
17 var refresh = function(cb) { 17 var refresh = function(cb) {
18 - /*$.get('/gps/real/line', {  
19 - lineCodes: gb_data_basic.line_idx  
20 - }, function(rs) {  
21 - refreshData(rs);  
22 - cb();  
23 - });*/  
24 $.ajax({ 18 $.ajax({
25 url: '/gps/real/line', 19 url: '/gps/real/line',
26 data:{lineCodes: gb_data_basic.line_idx}, 20 data:{lineCodes: gb_data_basic.line_idx},
@@ -30,7 +24,7 @@ var gb_data_gps = (function() { @@ -30,7 +24,7 @@ var gb_data_gps = (function() {
30 }, 24 },
31 error: function (xr, t) { 25 error: function (xr, t) {
32 notify_err('刷新GPS失败,稍后重试' + t); 26 notify_err('刷新GPS失败,稍后重试' + t);
33 - //cb(); 27 + cb();
34 } 28 }
35 }); 29 });
36 }; 30 };
@@ -50,9 +44,7 @@ var gb_data_gps = (function() { @@ -50,9 +44,7 @@ var gb_data_gps = (function() {
50 upArr.push(this); 44 upArr.push(this);
51 } else 45 } else
52 addArr.push(this); 46 addArr.push(this);
53 - //起终点 拼接方向标识  
54 - /*if(this.sEPoint)  
55 - this.stopNo=this.stopNo+'_'+this.upDown;*/ 47 +
56 //时间格式化 48 //时间格式化
57 this.dateStr = moment(this.timestamp).format('YYYY-MM-DD HH:mm:ss'); 49 this.dateStr = moment(this.timestamp).format('YYYY-MM-DD HH:mm:ss');
58 realData[this.deviceId] = this; 50 realData[this.deviceId] = this;
@@ -86,15 +78,15 @@ var gb_data_gps = (function() { @@ -86,15 +78,15 @@ var gb_data_gps = (function() {
86 rs.push(realData[device]); 78 rs.push(realData[device]);
87 } 79 }
88 return rs; 80 return rs;
89 - } 81 + };
90 82
91 var findOne = function(deviceId){ 83 var findOne = function(deviceId){
92 return realData[deviceId]; 84 return realData[deviceId];
93 - } 85 + };
94 86
95 var findGpsByNbbm = function(nbbm){ 87 var findGpsByNbbm = function(nbbm){
96 return realData[gb_data_basic.nbbm2deviceMap()[nbbm]]; 88 return realData[gb_data_basic.nbbm2deviceMap()[nbbm]];
97 - } 89 + };
98 90
99 return { 91 return {
100 fixedTimeRefresh: fixedTimeRefresh, 92 fixedTimeRefresh: fixedTimeRefresh,
src/main/resources/static/real_control_v2/js/data/gps_abnormal.js 0 → 100644
  1 +/** gps 信号异常状态,无效 | 越界 | 超速 */
  2 +
  3 +var gb_gps_abnormal = (function () {
  4 +
  5 + //按线路分组的路段数据
  6 + var allRoads;
  7 +
  8 + //gps无效
  9 + var gpsInvalid = function (gps) {
  10 + return gps.lat == 0 || gps.lon == 0;
  11 + };
  12 +
  13 + //越界
  14 + var gpsOutOfBounds = function (gps) {
  15 + var roads = allRoads[gps.lineId + '_' + gps.upDown];
  16 + if (!roads)
  17 + return;
  18 +
  19 + //最短距离
  20 + var min, distance;
  21 + $.each(roads, function () {
  22 + distance = minDistanceFromRoad(this.pos, gps);
  23 + if(!min || min > distance)
  24 + min = distance;
  25 + });
  26 +
  27 + //console.log('最短距离', min, gps);
  28 + };
  29 +
  30 + /**
  31 + * 初始化数据
  32 + */
  33 + var initData = function () {
  34 + //获取线路路段数据
  35 + gb_common.$get('/realMap/multiSectionRoute', {codeIdx: gb_data_basic.line_idx}, function (rs) {
  36 + var list = [];
  37 + $.each(rs.section, function () {
  38 + list.push({
  39 + line: this['LINE_CODE'],
  40 + updown: this['DIRECTIONS'],
  41 + pos: parseCoords(this['GSECTION_VECTOR']),
  42 + route_code: this['SECTIONROUTE_CODE'],
  43 + code: this['SECTION_CODE'],
  44 + name: this['SECTION_NAME']
  45 + });
  46 + });
  47 + //按线路_走向 分组数据
  48 + allRoads = groupByLineAndUpdown(list);
  49 + console.log('路段数据', allRoads);
  50 + });
  51 + };
  52 +
  53 + function minDistanceFromRoad(pos, gps){
  54 + var distance, min;
  55 + var len = pos.length - 1;
  56 + for(var i = 0; i < len; i ++){
  57 + distance = geolib.getDistanceFromLine({
  58 + latitude: gps.lat,
  59 + longitude: gps.lon
  60 + }, pos[i], pos[i + 1]);
  61 +
  62 + if(!min || min > distance)
  63 + min = distance;
  64 + }
  65 +
  66 + return min;
  67 + }
  68 +
  69 + function groupByLineAndUpdown(list) {
  70 + var rs = {},
  71 + key;
  72 + $.each(list, function () {
  73 + key = this.line + '_' + this.updown;
  74 + if (!rs[key])
  75 + rs[key] = [];
  76 +
  77 + rs[key].push(this);
  78 + });
  79 +
  80 + return rs;
  81 + }
  82 +
  83 + function parseCoords(str) {
  84 + var array = str.substr(11, str.length - 2).split(','), rs = [], temps;
  85 + $.each(array, function (i, coords) {
  86 + temps = coords.split(' ');
  87 + rs.push({
  88 + latitude: parseFloat(temps[1]),
  89 + longitude: parseFloat(temps[0])
  90 + });
  91 + });
  92 +
  93 + return rs;
  94 + }
  95 +
  96 + return {
  97 + initData: initData,
  98 + check: function (gps) {
  99 + if(!allRoads){
  100 + return;
  101 + }
  102 +
  103 + gpsOutOfBounds(gps);
  104 + }
  105 + }
  106 +})();
0 \ No newline at end of file 107 \ No newline at end of file
src/main/resources/static/real_control_v2/js/line_schedule/context_menu.js
1 /* line schedule table context menu*/ 1 /* line schedule table context menu*/
2 2
3 -var gb_schedule_context_menu = (function() { 3 +var gb_schedule_context_menu = (function () {
4 4
5 var modal_opts = { 5 var modal_opts = {
6 center: false, 6 center: false,
@@ -8,35 +8,38 @@ var gb_schedule_context_menu = (function() { @@ -8,35 +8,38 @@ var gb_schedule_context_menu = (function() {
8 }, 8 },
9 folder = '/real_control_v2/fragments/line_schedule/context_menu'; 9 folder = '/real_control_v2/fragments/line_schedule/context_menu';
10 var callbackHandler = { 10 var callbackHandler = {
11 - dftz: function(sch) { 11 + dftz: function (sch) {
12 open_modal(folder + '/dftz.html', { 12 open_modal(folder + '/dftz.html', {
13 sch: sch 13 sch: sch
14 }, modal_opts); 14 }, modal_opts);
15 }, 15 },
16 - multi_tzrc: function(schArray) { 16 + multi_tzrc: function (schArray) {
17 open_modal(folder + '/multi_tzrc.html', { 17 open_modal(folder + '/multi_tzrc.html', {
18 list: schArray 18 list: schArray
19 }, modal_opts); 19 }, modal_opts);
20 }, 20 },
21 - multi_dftz: function(schArray) { 21 + multi_dftz: function (schArray) {
  22 + var list = schArray.filter(function (sch) {
  23 + return sch.bcType != 'out' && sch.bcType != 'in' && sch.fcsjActual == null;
  24 + });
22 open_modal(folder + '/multi_dftz.html', { 25 open_modal(folder + '/multi_dftz.html', {
23 - list: schArray 26 + list: list
24 }, modal_opts); 27 }, modal_opts);
25 }, 28 },
26 - jhlb: function(sch) { 29 + jhlb: function (sch) {
27 open_modal(folder + '/jhlb.html', { 30 open_modal(folder + '/jhlb.html', {
28 sch: sch 31 sch: sch
29 }, modal_opts); 32 }, modal_opts);
30 }, 33 },
31 - cxlb: function(sch) { 34 + cxlb: function (sch) {
32 if (!sch.destroy) 35 if (!sch.destroy)
33 return notify_err('烂掉的班次才能执行此操作!'); 36 return notify_err('烂掉的班次才能执行此操作!');
34 37
35 var content = '<h3>确定要撤销<span style="color:red;margin: 0 5px;">' + sch.clZbh + '( ' + sch.dfsj + ' )</span>的烂班设置?</h3>' 38 var content = '<h3>确定要撤销<span style="color:red;margin: 0 5px;">' + sch.clZbh + '( ' + sch.dfsj + ' )</span>的烂班设置?</h3>'
36 - alt_confirm(content, function() { 39 + alt_confirm(content, function () {
37 gb_common.$post('/realSchedule/revokeDestroy', { 40 gb_common.$post('/realSchedule/revokeDestroy', {
38 id: sch.id 41 id: sch.id
39 - }, function(rs) { 42 + }, function (rs) {
40 gb_schedule_table.updateSchedule(rs.t); 43 gb_schedule_table.updateSchedule(rs.t);
41 notify_succ('撤销烂班操作成功!'); 44 notify_succ('撤销烂班操作成功!');
42 45
@@ -45,20 +48,20 @@ var gb_schedule_context_menu = (function() { @@ -45,20 +48,20 @@ var gb_schedule_context_menu = (function() {
45 }); 48 });
46 }, '确认撤销'); 49 }, '确认撤销');
47 }, 50 },
48 - sftz: function(sch) { 51 + sftz: function (sch) {
49 open_modal(folder + '/sftz.html', { 52 open_modal(folder + '/sftz.html', {
50 sch: sch 53 sch: sch
51 }, modal_opts); 54 }, modal_opts);
52 }, 55 },
53 - cxsf: function(sch) { 56 + cxsf: function (sch) {
54 if (!sch.fcsjActual) 57 if (!sch.fcsjActual)
55 return notify_err('车辆未实发,无法执行该操作!'); 58 return notify_err('车辆未实发,无法执行该操作!');
56 59
57 var content = '<h3>确定要撤销<span style="color:red;margin: 0 5px;">' + sch.clZbh + '( ' + sch.dfsj + ' )</span>的实发时间?</h3>' 60 var content = '<h3>确定要撤销<span style="color:red;margin: 0 5px;">' + sch.clZbh + '( ' + sch.dfsj + ' )</span>的实发时间?</h3>'
58 - alt_confirm(content, function() { 61 + alt_confirm(content, function () {
59 gb_common.$post('/realSchedule/revokeRealOutgo', { 62 gb_common.$post('/realSchedule/revokeRealOutgo', {
60 id: sch.id 63 id: sch.id
61 - }, function(rs) { 64 + }, function (rs) {
62 gb_schedule_table.updateSchedule(rs.ts); 65 gb_schedule_table.updateSchedule(rs.ts);
63 notify_succ('撤销实发操作成功!'); 66 notify_succ('撤销实发操作成功!');
64 //calc 应发未发 67 //calc 应发未发
@@ -66,27 +69,27 @@ var gb_schedule_context_menu = (function() { @@ -66,27 +69,27 @@ var gb_schedule_context_menu = (function() {
66 }); 69 });
67 }, '确认撤销实发'); 70 }, '确认撤销实发');
68 }, 71 },
69 - fcxxwt: function(sch) { 72 + fcxxwt: function (sch) {
70 open_modal(folder + '/fcxxwt.html', { 73 open_modal(folder + '/fcxxwt.html', {
71 sch: sch 74 sch: sch
72 }, modal_opts); 75 }, modal_opts);
73 }, 76 },
74 - lj_zrw: function(sch) { 77 + lj_zrw: function (sch) {
75 open_modal(folder + '/lj_zrw.html', { 78 open_modal(folder + '/lj_zrw.html', {
76 sch: sch 79 sch: sch
77 }, modal_opts); 80 }, modal_opts);
78 }, 81 },
79 - tzrc: function(sch) { 82 + tzrc: function (sch) {
80 open_modal(folder + '/tzrc.html', { 83 open_modal(folder + '/tzrc.html', {
81 sch: sch 84 sch: sch
82 }, modal_opts); 85 }, modal_opts);
83 }, 86 },
84 - zlcf: function(sch) { 87 + zlcf: function (sch) {
85 var text = sch.clZbh + '重发调度指令? [路牌: ' + sch.lpName + ' 计划时间:' + sch.fcsj + ' 待发时间:' + sch.dfsj + ']'; 88 var text = sch.clZbh + '重发调度指令? [路牌: ' + sch.lpName + ' 计划时间:' + sch.fcsj + ' 待发时间:' + sch.dfsj + ']';
86 - alt_confirm(text, function() { 89 + alt_confirm(text, function () {
87 //走短语下发 90 //走短语下发
88 $.post('/directive/dispatch', {id: sch.id}, 91 $.post('/directive/dispatch', {id: sch.id},
89 - function(code) { 92 + function (code) {
90 if (code == 0) 93 if (code == 0)
91 notify_succ('发送指令成功'); 94 notify_succ('发送指令成功');
92 else 95 else
@@ -95,12 +98,12 @@ var gb_schedule_context_menu = (function() { @@ -95,12 +98,12 @@ var gb_schedule_context_menu = (function() {
95 }, '确定下发指令'); 98 }, '确定下发指令');
96 }, 99 },
97 jgtz: function (schArray) { 100 jgtz: function (schArray) {
98 - var idArr=[];  
99 - $.each(schArray, function(){  
100 - idArr.push(this.id); 101 + var idArr = [];
  102 + $.each(schArray, function () {
  103 + idArr.push(this.id);
101 }); 104 });
102 - var elem = UIkit.modal.prompt('请输入间隔(分钟)',0, function(newValue) {  
103 - if (!isNaN(newValue) && newValue>0) { 105 + var elem = UIkit.modal.prompt('请输入间隔(分钟)', 0, function (newValue) {
  106 + if (!isNaN(newValue) && newValue > 0) {
104 gb_common.$post_arr('/realSchedule/spaceAdjust', {ids: idArr, space: newValue}, function (rs) { 107 gb_common.$post_arr('/realSchedule/spaceAdjust', {ids: idArr, space: newValue}, function (rs) {
105 //刷新数据 108 //刷新数据
106 gb_schedule_table.updateSchedule(rs.ts); 109 gb_schedule_table.updateSchedule(rs.ts);
@@ -120,7 +123,7 @@ var gb_schedule_context_menu = (function() { @@ -120,7 +123,7 @@ var gb_schedule_context_menu = (function() {
120 $.contextMenu({ 123 $.contextMenu({
121 selector: '.line_schedule .ct_table_body dl:not([class="drag-active"])', 124 selector: '.line_schedule .ct_table_body dl:not([class="drag-active"])',
122 className: 'schedule-ct-menu', 125 className: 'schedule-ct-menu',
123 - callback: function(key, options) { 126 + callback: function (key, options) {
124 var $tbody = options.$trigger.parent(), 127 var $tbody = options.$trigger.parent(),
125 id = $('.context-menu-active', $tbody).data('id'), 128 id = $('.context-menu-active', $tbody).data('id'),
126 lineCode = $tbody.parents('li.line_schedule').data('id'), 129 lineCode = $tbody.parents('li.line_schedule').data('id'),
@@ -166,13 +169,13 @@ var gb_schedule_context_menu = (function() { @@ -166,13 +169,13 @@ var gb_schedule_context_menu = (function() {
166 $.contextMenu({ 169 $.contextMenu({
167 selector: '.line_schedule .ct_table_body dl.drag-active', 170 selector: '.line_schedule .ct_table_body dl.drag-active',
168 className: 'schedule-ct-menu', 171 className: 'schedule-ct-menu',
169 - callback: function(key, options) { 172 + callback: function (key, options) {
170 var $tbody = options.$trigger.parent(), 173 var $tbody = options.$trigger.parent(),
171 lineCode = $tbody.parents('li.line_schedule').data('id'), 174 lineCode = $tbody.parents('li.line_schedule').data('id'),
172 schArray = [], 175 schArray = [],
173 all = gb_schedule_table.findScheduleByLine(lineCode); 176 all = gb_schedule_table.findScheduleByLine(lineCode);
174 177
175 - $tbody.find('dl.drag-active').each(function() { 178 + $tbody.find('dl.drag-active').each(function () {
176 schArray.push(all[$(this).data('id')]); 179 schArray.push(all[$(this).data('id')]);
177 }); 180 });
178 181
src/main/resources/static/real_control_v2/js/main.js
1 -//主调和监控模式  
2 -var operationMode = window.localStorage.getItem('operationMode');  
3 -if (operationMode == 0) {  
4 - $('body>.north').addClass('monitor');  
5 - $(document).on('ajaxSend', interceptPOST);  
6 -}  
7 -else  
8 - $('body>.north').addClass('main');  
9 -  
10 -//拦截POST请求  
11 -function interceptPOST(e, xhr, t) {  
12 - if (t && (t.method == 'POST' || t.type == 'POST')) {  
13 - console.log(e, xhr, t);  
14 - xhr.abort();  
15 - notify_err('监控模式!');  
16 - }  
17 -}  
18 1
19 /* main js */ 2 /* main js */
20 var gb_main_ep = new EventProxy(), 3 var gb_main_ep = new EventProxy(),
@@ -59,10 +42,13 @@ var gb_main_ep = new EventProxy(), @@ -59,10 +42,13 @@ var gb_main_ep = new EventProxy(),
59 gb_signal_state.init(); 42 gb_signal_state.init();
60 }); 43 });
61 44
  45 + //初始化gps异常判定
  46 + //gb_gps_abnormal.initData();
  47 +
62 //嵌入地图页面 48 //嵌入地图页面
63 $('li.map-panel', '#main-tab-content').load('/real_control_v2/mapmonitor/real.html'); 49 $('li.map-panel', '#main-tab-content').load('/real_control_v2/mapmonitor/real.html');
64 //弹出更新说明 50 //弹出更新说明
65 - showUpdateDescription(); 51 + //showUpdateDescription();
66 }); 52 });
67 53
68 function g_emit(id) { 54 function g_emit(id) {
src/main/resources/static/real_control_v2/js/north/toolbar.js
1 /* main.html north toolbar js */ 1 /* main.html north toolbar js */
2 2
3 -var gb_northToolbar = (function() { 3 +var gb_northToolbar = (function () {
4 4
5 - var modal_opts={center: true,bgclose: false};  
6 - var currentUser; 5 + var modal_opts = {center: true, bgclose: false};
  6 + var currentUser;
7 7
8 - $.get('/real_control_v2/fragments/north/toolbar.html', function(temp){  
9 - ep.emit("template", temp);  
10 - }); 8 + $.get('/real_control_v2/fragments/north/toolbar.html', function (temp) {
  9 + ep.emit("template", temp);
  10 + });
  11 +
  12 + $.get('/real_control_v2/js/data/json/north_toolbar.json', function (data) {
  13 + ep.emit("data", data);
  14 + });
11 15
12 - $.get('/real_control_v2/js/data/json/north_toolbar.json', function(data){  
13 - ep.emit("data", data);  
14 - }); 16 + //当前用户信息
  17 + $.get('/user/currentUser', function (user) {
  18 + ep.emit("user", user);
  19 + });
15 20
16 - //当前用户信息  
17 - $.get('/user/currentUser', function(user){  
18 - ep.emit("user", user);  
19 - }); 21 + var ep = EventProxy.create("template", "data", "user", function (temp, data, user) {
  22 + currentUser = user;
  23 + var t = $('#north-toolbar-temp', temp).html()
  24 + , htmlStr = template.render(t)({list: data, user: currentUser});
  25 + $('.north .north-toolbar').html(htmlStr);
20 26
21 - var ep = EventProxy.create("template", "data", "user" , function (temp, data, user) {  
22 - currentUser=user;  
23 - var t = $('#north-toolbar-temp', temp).html()  
24 - ,htmlStr = template.render(t)({list: data, user: currentUser});  
25 - $('.north .north-toolbar').html(htmlStr); 27 + //exit
  28 + $('.north .north-toolbar .exit-system').on('click', function () {
  29 + //关闭websocket 连接
  30 + gb_sch_websocket.sock.close();
  31 + window.location.href = '/pages/control/lineallot/allot.html';
  32 + });
  33 + });
26 34
27 - //exit  
28 - $('.north .north-toolbar .exit-system').on('click', function(){  
29 - //关闭websocket 连接  
30 - gb_sch_websocket.sock.close();  
31 - window.location.href='/pages/control/lineallot/allot.html'; 35 + $(document).on('click', '#north_toolbar_panel li.event a', function () {
  36 + var event = $(this).data('event');
  37 + handler[event] && handler[event]();
32 }); 38 });
33 - });  
34 39
35 - $(document).on('click', '#north_toolbar_panel li.event a', function(){  
36 - var event = $(this).data('event');  
37 - handler[event] && handler[event]();  
38 - }); 40 + var handler = {
  41 + // device report list
  42 + device_report: function () {
  43 + open_modal('/real_control_v2/fragments/north/nav/report_80.html', {}, modal_opts);
  44 + },
  45 + directive_history: function () {
  46 + open_modal('/real_control_v2/fragments/north/nav/directive_history.html', {}, modal_opts);
  47 + },
  48 + tts_config: function () {
  49 + open_modal('/real_control_v2/fragments/north/nav/tts_config.html', {}, modal_opts);
  50 + },
  51 + all_devices: function () {
  52 + open_modal('/real_control_v2/fragments/north/nav/all_devices.html', {}, modal_opts);
  53 + },
  54 + device_online_rate: function () {
  55 + open_modal('/real_control_v2/fragments/north/nav/charts/device_online_rate.html', {}, modal_opts);
  56 + },
  57 + turnout_rate: function () {
  58 + open_modal('/real_control_v2/fragments/north/nav/charts/car_out_rate.html', {}, modal_opts);
  59 + },
  60 + s_e_punctuality_rate: function () {
  61 + open_modal('/real_control_v2/fragments/north/nav/charts/strat_end_punctuality_rate.html', {}, modal_opts);
  62 + },
  63 + s_e_punctuality_rate_line: function () {
  64 + open_modal('/real_control_v2/fragments/north/nav/charts/s_e_punctuality_rate_line.html', {}, modal_opts);
  65 + },
  66 + history_sch_maintain: function () {
  67 + open_modal('/real_control_v2/fragments/north/nav/history_sch_maintain.html', {}, {
  68 + center: false,
  69 + bgclose: false
  70 + });
  71 + },
  72 + sch_exec_rate: function () {
  73 + open_modal('/real_control_v2/fragments/north/nav/charts/sch_exec_rate.html', {}, modal_opts);
  74 + },
  75 + gps_play_back: function () {
  76 + gb_map_play_back.initParams();
  77 + },
  78 + signal_state: function () {
  79 + open_modal('/real_control_v2/fragments/north/nav/signal_state_config.html', {}, modal_opts);
  80 + }
  81 + }
39 82
40 - var handler = {  
41 - // device report list  
42 - device_report: function(){  
43 - open_modal('/real_control_v2/fragments/north/nav/report_80.html', {}, modal_opts);  
44 - },  
45 - directive_history: function(){  
46 - open_modal('/real_control_v2/fragments/north/nav/directive_history.html', {}, modal_opts);  
47 - },  
48 - tts_config: function(){  
49 - open_modal('/real_control_v2/fragments/north/nav/tts_config.html', {}, modal_opts);  
50 - },  
51 - all_devices: function(){  
52 - open_modal('/real_control_v2/fragments/north/nav/all_devices.html', {}, modal_opts);  
53 - },  
54 - device_online_rate: function(){  
55 - open_modal('/real_control_v2/fragments/north/nav/charts/device_online_rate.html', {}, modal_opts);  
56 - },  
57 - turnout_rate: function () {  
58 - open_modal('/real_control_v2/fragments/north/nav/charts/car_out_rate.html', {}, modal_opts);  
59 - },  
60 - s_e_punctuality_rate: function () {  
61 - open_modal('/real_control_v2/fragments/north/nav/charts/strat_end_punctuality_rate.html', {}, modal_opts);  
62 - },  
63 - s_e_punctuality_rate_line: function () {  
64 - open_modal('/real_control_v2/fragments/north/nav/charts/s_e_punctuality_rate_line.html', {}, modal_opts);  
65 - },  
66 - history_sch_maintain: function () {  
67 - open_modal('/real_control_v2/fragments/north/nav/history_sch_maintain.html', {}, {center: false,bgclose: false});  
68 - },  
69 - sch_exec_rate: function () {  
70 - open_modal('/real_control_v2/fragments/north/nav/charts/sch_exec_rate.html', {}, modal_opts);  
71 - },  
72 - gps_play_back: function () {  
73 - gb_map_play_back.initParams();  
74 - },  
75 - signal_state: function () {  
76 - open_modal('/real_control_v2/fragments/north/nav/signal_state_config.html', {}, modal_opts); 83 + return {
  84 + user: function () {
  85 + return currentUser;
  86 + }
77 } 87 }
78 - }  
79 })(); 88 })();
src/main/resources/static/real_control_v2/js/signal_state/signal_state.js
1 /** 1 /**
2 - * GPS信号状态 2 + * 班次 GPS信号状态
3 * @type {{}} 3 * @type {{}}
4 */ 4 */
5 var gb_signal_state = (function () { 5 var gb_signal_state = (function () {
src/main/resources/static/real_control_v2/js/utils/dispatch_pattern.js 0 → 100644
  1 +/** 调度模式 */
  2 +
  3 +//主调和监控模式
  4 +var operationMode = window.localStorage.getItem('operationMode');
  5 +if (operationMode == 0) {
  6 + $('body>.north').addClass('monitor');
  7 + $(document).on('ajaxSend', interceptPOST);
  8 +}
  9 +else
  10 + $('body>.north').addClass('main');
  11 +
  12 +//拦截POST请求
  13 +function interceptPOST(e, xhr, t) {
  14 + if (t && (t.method == 'POST' || t.type == 'POST')) {
  15 + console.log(e, xhr, t);
  16 + xhr.abort();
  17 + notify_err('监控模式!');
  18 + }
  19 +}
  20 +
  21 +
  22 +//10分钟后提交当班调度数据
  23 +setTimeout(function () {
  24 + var user = gb_northToolbar.user();
  25 + var data = {
  26 + uId: user.id,
  27 + uName: user.userName,
  28 + codeIdx: gb_data_basic.line_idx + ',',
  29 + main: operationMode
  30 + };
  31 +
  32 + gb_common.$post('/dutyEmployee', data);
  33 +}, 1000 * 60 * 10);
0 \ No newline at end of file 34 \ No newline at end of file
src/main/resources/static/real_control_v2/js/utils/svg_chart.js
@@ -200,7 +200,7 @@ var gb_svg_chart = (function () { @@ -200,7 +200,7 @@ var gb_svg_chart = (function () {
200 var len = (d.nbbm == false ? 0 : d.nbbm.length) 200 var len = (d.nbbm == false ? 0 : d.nbbm.length)
201 , t = len > 3 ? d.nbbm.substr(len - 3) : d.nbbm; 201 , t = len > 3 ? d.nbbm.substr(len - 3) : d.nbbm;
202 202
203 - if (d.nbbm.indexOf('-') > 1) { 203 + if (d.nbbm.indexOf('-') > 0) {
204 t = d.nbbm.substr(d.nbbm.indexOf('-') - 1, 1) + t; 204 t = d.nbbm.substr(d.nbbm.indexOf('-') - 1, 1) + t;
205 } 205 }
206 return t; 206 return t;
src/main/resources/static/real_control_v2/js/utils/svg_data_convert.js
@@ -29,7 +29,7 @@ var gb_svg_data_convert = (function() { @@ -29,7 +29,7 @@ var gb_svg_data_convert = (function() {
29 var dIndex = station_indexof(down, upS, j); 29 var dIndex = station_indexof(down, upS, j);
30 if (dIndex == -1) { 30 if (dIndex == -1) {
31 op.type = 0; 31 op.type = 0;
32 - op.id = [upS.stationCode, -1]; 32 + op.id = [get_station_code(upS), -1];
33 //占位 33 //占位
34 down.splice(j, 0, {}); 34 down.splice(j, 0, {});
35 } else { 35 } else {
@@ -38,7 +38,7 @@ var gb_svg_data_convert = (function() { @@ -38,7 +38,7 @@ var gb_svg_data_convert = (function() {
38 data.push({ 38 data.push({
39 name: [temp.stationName], 39 name: [temp.stationName],
40 type: 1, 40 type: 1,
41 - id: [temp.stationCode] 41 + id: [get_station_code(temp)]
42 }); 42 });
43 } 43 }
44 //delete 44 //delete
src/main/resources/static/real_control_v2/js/websocket/sch_websocket.js
@@ -94,6 +94,7 @@ var gb_sch_websocket = (function () { @@ -94,6 +94,7 @@ var gb_sch_websocket = (function () {
94 //到达终点 94 //到达终点
95 var zhongDian = function (msg) { 95 var zhongDian = function (msg) {
96 gb_schedule_table.updateSchedule(msg.t); 96 gb_schedule_table.updateSchedule(msg.t);
  97 + gb_schedule_table.updateSchedule(msg.nt);
97 msg.domId = 'zhongDian_' + msg.t.id + '_' + parseInt(Math.random() * 10000); 98 msg.domId = 'zhongDian_' + msg.t.id + '_' + parseInt(Math.random() * 10000);
98 99
99 var $item = $(temps['sys-note-42_1-temp'](msg)); 100 var $item = $(temps['sys-note-42_1-temp'](msg));
src/main/resources/static/real_control_v2/main.html
@@ -107,6 +107,7 @@ @@ -107,6 +107,7 @@
107 <!-- 数据 --> 107 <!-- 数据 -->
108 <script src="/real_control_v2/js/data/data_basic.js"></script> 108 <script src="/real_control_v2/js/data/data_basic.js"></script>
109 <script src="/real_control_v2/js/data/data_gps.js"></script> 109 <script src="/real_control_v2/js/data/data_gps.js"></script>
  110 + <script src="/real_control_v2/js/data/gps_abnormal.js"></script>
110 <!-- 线路模拟图 --> 111 <!-- 线路模拟图 -->
111 <script src="/real_control_v2/js/utils/svg_chart.js"></script> 112 <script src="/real_control_v2/js/utils/svg_chart.js"></script>
112 <script src="/real_control_v2/js/utils/svg_data_convert.js"></script> 113 <script src="/real_control_v2/js/utils/svg_data_convert.js"></script>
@@ -144,6 +145,7 @@ @@ -144,6 +145,7 @@
144 <script src="/real_control_v2/geolib/geolib.js"></script> 145 <script src="/real_control_v2/geolib/geolib.js"></script>
145 146
146 <script src="/real_control_v2/js/signal_state/signal_state.js"></script> 147 <script src="/real_control_v2/js/signal_state/signal_state.js"></script>
  148 + <script src="/real_control_v2/js/utils/dispatch_pattern.js"></script>
147 </body> 149 </body>
148 150
149 </html> 151 </html>
src/main/resources/static/real_control_v2/mapmonitor/css/real.css
@@ -96,7 +96,7 @@ input[type=checkbox].disabled{ @@ -96,7 +96,7 @@ input[type=checkbox].disabled{
96 .real_bottom_panel{ 96 .real_bottom_panel{
97 97
98 position: absolute !important; 98 position: absolute !important;
99 - height: 256px; 99 + height: 192px;
100 bottom: 2px !important; 100 bottom: 2px !important;
101 background: #fff; 101 background: #fff;
102 box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); 102 box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
src/main/resources/static/real_control_v2/mapmonitor/js/map/iMap.js
@@ -44,7 +44,7 @@ var gb_map_imap = (function () { @@ -44,7 +44,7 @@ var gb_map_imap = (function () {
44 return mapProxy; 44 return mapProxy;
45 }, 45 },
46 calcGpsMarkerWidth: function (nbbm) { 46 calcGpsMarkerWidth: function (nbbm) {
47 - var width = 0; 47 + /* var width = 0;
48 $.each(nbbm.split(''), function () { 48 $.each(nbbm.split(''), function () {
49 if (!isNaN(this)) 49 if (!isNaN(this))
50 width += 7;//icon_num_width[this]; 50 width += 7;//icon_num_width[this];
@@ -52,8 +52,8 @@ var gb_map_imap = (function () { @@ -52,8 +52,8 @@ var gb_map_imap = (function () {
52 width += 10; 52 width += 10;
53 else 53 else
54 width += 16; 54 width += 16;
55 - });  
56 - return width; 55 + });*/
  56 + return nbbm.length * 9.8;
57 } 57 }
58 }; 58 };
59 59
src/test/java/com/bsth/service/schedule/rules/Test.java 0 → 100644
  1 +package com.bsth.service.schedule.rules;
  2 +
  3 +import org.apache.tika.Tika;
  4 +
  5 +import java.io.File;
  6 +
  7 +/**
  8 + * Created by xu on 17/1/3.
  9 + */
  10 +public class Test {
  11 + public static void main(String[] args) throws Exception {
  12 + Tika tika = new Tika();
  13 + File file = new File("/Users/xu/Downloads/排班规则练习1.xls");
  14 +
  15 + // application/vnd.ms-excel
  16 + // application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  17 +
  18 + String detecttype = tika.detect(file);
  19 + System.out.println(detecttype);
  20 +
  21 + }
  22 +}