Commit 5a94481f97176017ecb17f00f46185f05be2fd86

Authored by 徐烜
Committed by 王通
1 parent 46421f20

1.cherry-pick 8ac4a72a 时刻表导入加入工时信息

Showing 26 changed files with 5361 additions and 726 deletions
src/main/java/com/bsth/controller/schedule/core/TTInfoDetailController_facade.java
@@ -12,7 +12,7 @@ import com.bsth.controller.schedule.BController_facade; @@ -12,7 +12,7 @@ import com.bsth.controller.schedule.BController_facade;
12 import com.bsth.service.schedule.TTInfoDetailService; 12 import com.bsth.service.schedule.TTInfoDetailService;
13 import com.bsth.service.schedule.datatools.TTInfoDetailForEdit; 13 import com.bsth.service.schedule.datatools.TTInfoDetailForEdit;
14 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData; 14 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData;
15 -import com.bsth.service.schedule.timetable.ExcelFormatType; 15 +import com.bsth.service.schedule.timetable.TimetableExcelFormatType;
16 import com.bsth.service.schedule.utils.DataToolsFile; 16 import com.bsth.service.schedule.utils.DataToolsFile;
17 import com.bsth.service.schedule.utils.DataToolsFileType; 17 import com.bsth.service.schedule.utils.DataToolsFileType;
18 import org.apache.commons.lang3.StringUtils; 18 import org.apache.commons.lang3.StringUtils;
@@ -143,7 +143,7 @@ public class TTInfoDetailController_facade extends BController_facade<Long, TTIn @@ -143,7 +143,7 @@ public class TTInfoDetailController_facade extends BController_facade<Long, TTIn
143 throw new Exception("线路版本未知"); 143 throw new Exception("线路版本未知");
144 } 144 }
145 ttInfoDetailService.validateExcelSheet(filename, sheetname, lineid, linename, lineversion, 145 ttInfoDetailService.validateExcelSheet(filename, sheetname, lineid, linename, lineversion,
146 - ExcelFormatType.getEnum(excelFormatType)); 146 + TimetableExcelFormatType.fromDesc(excelFormatType));
147 rtn.put("status", ResponseCode.SUCCESS); 147 rtn.put("status", ResponseCode.SUCCESS);
148 } catch (Exception exp) { 148 } catch (Exception exp) {
149 rtn.put("status", ResponseCode.ERROR); 149 rtn.put("status", ResponseCode.ERROR);
src/main/java/com/bsth/controller/schedule/core/legacy/TTInfoDetailController.java
@@ -7,7 +7,7 @@ import com.bsth.entity.schedule.TTInfoDetail; @@ -7,7 +7,7 @@ import com.bsth.entity.schedule.TTInfoDetail;
7 import com.bsth.service.schedule.TTInfoDetailService; 7 import com.bsth.service.schedule.TTInfoDetailService;
8 import com.bsth.service.schedule.datatools.TTInfoDetailForEdit; 8 import com.bsth.service.schedule.datatools.TTInfoDetailForEdit;
9 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData; 9 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData;
10 -import com.bsth.service.schedule.timetable.ExcelFormatType; 10 +import com.bsth.service.schedule.timetable.TimetableExcelFormatType;
11 import com.bsth.service.schedule.utils.DataToolsFile; 11 import com.bsth.service.schedule.utils.DataToolsFile;
12 import com.bsth.service.schedule.utils.DataToolsFileType; 12 import com.bsth.service.schedule.utils.DataToolsFileType;
13 import com.bsth.service.schedule.utils.MyHttpUtils; 13 import com.bsth.service.schedule.utils.MyHttpUtils;
@@ -54,7 +54,7 @@ public class TTInfoDetailController extends BController<TTInfoDetail, Long> { @@ -54,7 +54,7 @@ public class TTInfoDetailController extends BController<TTInfoDetail, Long> {
54 throw new Exception("线路版本未知"); 54 throw new Exception("线路版本未知");
55 } 55 }
56 ttInfoDetailService.validateExcelSheet(filename, sheetname, lineid, linename, lineversion, 56 ttInfoDetailService.validateExcelSheet(filename, sheetname, lineid, linename, lineversion,
57 - ExcelFormatType.getEnum(excelFormatType)); 57 + TimetableExcelFormatType.fromDesc(excelFormatType));
58 rtn.put("status", ResponseCode.SUCCESS); 58 rtn.put("status", ResponseCode.SUCCESS);
59 } catch (Exception exp) { 59 } catch (Exception exp) {
60 rtn.put("status", ResponseCode.ERROR); 60 rtn.put("status", ResponseCode.ERROR);
src/main/java/com/bsth/entity/schedule/TTInfoBxDetail.java
@@ -34,14 +34,17 @@ public class TTInfoBxDetail extends BEntity { @@ -34,14 +34,17 @@ public class TTInfoBxDetail extends BEntity {
34 34
35 /** 路牌班型1 */ 35 /** 路牌班型1 */
36 @Convert(converter = BxTypeConverter.class) 36 @Convert(converter = BxTypeConverter.class)
37 - @Column(nullable = false) 37 + @Column(columnDefinition = "default '_null_'", nullable = false)
38 private BxType bxType1; 38 private BxType bxType1;
39 /** 路牌班型2 */ 39 /** 路牌班型2 */
40 - @Column(nullable = false)  
41 @Convert(converter = BxTypeConverter.class) 40 @Convert(converter = BxTypeConverter.class)
  41 + @Column(columnDefinition = "default '_null_'", nullable = false)
42 private BxType bxType2; 42 private BxType bxType2;
43 /** 路牌配档数 */ 43 /** 路牌配档数 */
44 private String bxPds; 44 private String bxPds;
  45 + /** 工时 */
  46 + @Column(nullable = false)
  47 + private String gs;
45 48
46 /** 版本控制 */ 49 /** 版本控制 */
47 @Version 50 @Version
@@ -122,4 +125,11 @@ public class TTInfoBxDetail extends BEntity { @@ -122,4 +125,11 @@ public class TTInfoBxDetail extends BEntity {
122 this.version = version; 125 this.version = version;
123 } 126 }
124 127
  128 + public String getGs() {
  129 + return gs;
  130 + }
  131 +
  132 + public void setGs(String gs) {
  133 + this.gs = gs;
  134 + }
125 } 135 }
src/main/java/com/bsth/service/schedule/TTInfoDetailService.java
@@ -4,7 +4,7 @@ import com.bsth.entity.schedule.TTInfoDetail; @@ -4,7 +4,7 @@ import com.bsth.entity.schedule.TTInfoDetail;
4 import com.bsth.service.schedule.datatools.TTInfoDetailForEdit; 4 import com.bsth.service.schedule.datatools.TTInfoDetailForEdit;
5 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData; 5 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData;
6 import com.bsth.service.schedule.exception.ScheduleException; 6 import com.bsth.service.schedule.exception.ScheduleException;
7 -import com.bsth.service.schedule.timetable.ExcelFormatType; 7 +import com.bsth.service.schedule.timetable.TimetableExcelFormatType;
8 import com.bsth.service.schedule.utils.DataToolsFile; 8 import com.bsth.service.schedule.utils.DataToolsFile;
9 import com.bsth.service.schedule.utils.DataToolsFileType; 9 import com.bsth.service.schedule.utils.DataToolsFileType;
10 10
@@ -77,7 +77,7 @@ public interface TTInfoDetailService extends BService<TTInfoDetail, Long> { @@ -77,7 +77,7 @@ public interface TTInfoDetailService extends BService<TTInfoDetail, Long> {
77 * @param sheetname sheet名字 77 * @param sheetname sheet名字
78 * @param lineid 线路id 78 * @param lineid 线路id
79 * @param lineversion 线路版本 79 * @param lineversion 线路版本
80 - * @param excelFormatType 版本 80 + * @param timetableExcelFormatType 时刻表excel格式类型
81 */ 81 */
82 void validateExcelSheet( 82 void validateExcelSheet(
83 String filename, 83 String filename,
@@ -85,7 +85,7 @@ public interface TTInfoDetailService extends BService<TTInfoDetail, Long> { @@ -85,7 +85,7 @@ public interface TTInfoDetailService extends BService<TTInfoDetail, Long> {
85 Integer lineid, 85 Integer lineid,
86 String linename, 86 String linename,
87 Integer lineversion, 87 Integer lineversion,
88 - ExcelFormatType excelFormatType) throws ScheduleException; 88 + TimetableExcelFormatType timetableExcelFormatType) throws ScheduleException;
89 89
90 /** 90 /**
91 * 验证关联的线路标准信息(以后放到规则引擎里去做)。 91 * 验证关联的线路标准信息(以后放到规则引擎里去做)。
src/main/java/com/bsth/service/schedule/datatools/TTInfoDetailDataToolsImpl.java
@@ -3,7 +3,9 @@ package com.bsth.service.schedule.datatools; @@ -3,7 +3,9 @@ package com.bsth.service.schedule.datatools;
3 import com.bsth.entity.StationRoute; 3 import com.bsth.entity.StationRoute;
4 import com.bsth.service.StationRouteService; 4 import com.bsth.service.StationRouteService;
5 import com.bsth.service.schedule.exception.ScheduleException; 5 import com.bsth.service.schedule.exception.ScheduleException;
6 -import com.bsth.service.schedule.timetable.ExcelFormatType; 6 +import com.bsth.service.schedule.timetable.TimetableExcelData;
  7 +import com.bsth.service.schedule.timetable.TimetableExcelFormatType;
  8 +import com.bsth.service.schedule.timetable.strategy.impl.TimetableExcelDataImportStrategyImpl;
7 import com.bsth.service.schedule.utils.*; 9 import com.bsth.service.schedule.utils.*;
8 import jxl.Sheet; 10 import jxl.Sheet;
9 import jxl.Workbook; 11 import jxl.Workbook;
@@ -14,7 +16,6 @@ import org.apache.commons.lang3.StringUtils; @@ -14,7 +16,6 @@ import org.apache.commons.lang3.StringUtils;
14 import org.apache.poi.ss.usermodel.Cell; 16 import org.apache.poi.ss.usermodel.Cell;
15 import org.apache.poi.ss.usermodel.Row; 17 import org.apache.poi.ss.usermodel.Row;
16 import org.apache.poi.ss.util.CellRangeAddress; 18 import org.apache.poi.ss.util.CellRangeAddress;
17 -import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
18 import org.joda.time.DateTime; 19 import org.joda.time.DateTime;
19 import org.joda.time.LocalTime; 20 import org.joda.time.LocalTime;
20 import org.joda.time.format.DateTimeFormat; 21 import org.joda.time.format.DateTimeFormat;
@@ -22,7 +23,6 @@ import org.slf4j.Logger; @@ -22,7 +23,6 @@ import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory; 23 import org.slf4j.LoggerFactory;
23 import org.springframework.beans.factory.annotation.Autowired; 24 import org.springframework.beans.factory.annotation.Autowired;
24 import org.springframework.beans.factory.annotation.Qualifier; 25 import org.springframework.beans.factory.annotation.Qualifier;
25 -import org.springframework.boot.context.properties.EnableConfigurationProperties;  
26 import org.springframework.stereotype.Service; 26 import org.springframework.stereotype.Service;
27 27
28 import java.awt.*; 28 import java.awt.*;
@@ -84,126 +84,144 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail @@ -84,126 +84,144 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
84 try { 84 try {
85 LOGGER.info("//---------------- 导入时刻表明细 start... ----------------//"); 85 LOGGER.info("//---------------- 导入时刻表明细 start... ----------------//");
86 86
87 - if (params.get("lineversion") == null) {  
88 - throw new Exception("线路版本未知");  
89 - }  
90 -  
91 - String filename = file.getAbsolutePath(); // xls xlsx 文件名  
92 - String sheetname = String.valueOf(params.get("sheetname")); // sheet名字  
93 - Long ttid = Long.valueOf(String.valueOf(params.get("ttid"))); // 时刻表id  
94 - Long xlid = Long.valueOf(String.valueOf(params.get("xlid"))); // 线路id  
95 - Integer lineid = Integer.valueOf(String.valueOf(params.get("lineinfo"))); // 线路标准id  
96 - String xlname = String.valueOf(params.get("xlname")); // 线路名字  
97 - String ttname = String.valueOf(params.get("ttname")); // 时刻表名字  
98 - Integer lineversion = Integer.valueOf(params.get("lineversion").toString()); // 线路路由版本  
99 - ExcelFormatType excelFormatType = ExcelFormatType.getEnum(String.valueOf(params.get("excelFormatType"))); // 格式  
100 -  
101 - LOGGER.info("参数1, xls文件名={},sheet名字={}", filename, sheetname);  
102 - LOGGER.info("参数2, 线路id={},线路名字={}", xlid, xlname);  
103 - LOGGER.info("参数3, 时刻表id={},时刻表名字={}", ttid, ttname);  
104 -  
105 - LOGGER.info("转换xls文件格式成文本格式...");  
106 - // 1、修改已经上传的excel文件,在每个起点站后标示数字,表示第几个班次  
107 - // 2、由于格式问题,需要把内容都转换成字符串  
108 - List<String> colList = new ArrayList<>();  
109 -  
110 - // poi api,并读取第一行数据,组合成站点列表,逗号分隔  
111 - org.apache.poi.ss.usermodel.Workbook poi_workbook;  
112 - org.apache.poi.ss.usermodel.Sheet poi_sheet;  
113 - if (DataToolsFileType.XLS.isThisType(file)) {  
114 - poi_workbook = DataToolsFileType.XLS.getWorkBook(file);  
115 - } else if (DataToolsFileType.XLSX.isThisType(file)) {  
116 - poi_workbook = DataToolsFileType.XLSX.getWorkBook(file);  
117 - } else {  
118 - throw new Exception("不是xls xlsx文件!");  
119 - }  
120 - poi_sheet = poi_workbook.getSheet(sheetname);  
121 - int rownums = poi_sheet.getLastRowNum() + 1;  
122 - int colnums = poi_sheet.getRow(0).getLastCellNum();  
123 - Row firstrow = poi_sheet.getRow(0);  
124 - for (int i = 0; i < colnums; i++) {  
125 - org.apache.poi.ss.usermodel.Cell cell = firstrow.getCell(i);  
126 - if (i == 0) {  
127 - colList.add(PoiUtils.getStringValueFromCell(cell).trim());  
128 - } else {  
129 - // 站点名字后加->数字形式标示成不同的字段  
130 - colList.add(PoiUtils.getStringValueFromCell(cell).trim().replaceAll("(->\\d+)", "") + "->" + i);  
131 - }  
132 - }  
133 -  
134 - // jxl api  
135 - File fileCal = new File(filename + "_stringType.xls");  
136 - WritableWorkbook writableWorkbook = Workbook.createWorkbook(fileCal);  
137 - WritableSheet sheet1 = writableWorkbook.createSheet(sheetname, 0);  
138 - for (int i = 0; i < colnums; i++) { // 第一行数据  
139 - sheet1.addCell(new Label(i, 0, colList.get(i)));  
140 - }  
141 - for (int i = 1; i < rownums; i++) { // 第二行开始  
142 - for (int j = 0; j < colnums; j++) {  
143 - // poi读  
144 - String cellContent = PoiUtils.getStringValueFromCell(  
145 - poi_sheet.getRow(i).getCell(j)  
146 - ).replaceAll("\\s*", "");  
147 - // jxl写  
148 - sheet1.addCell(new Label(j, i, cellContent));  
149 - }  
150 - }  
151 - writableWorkbook.write();  
152 - writableWorkbook.close();  
153 -  
154 - // 2、删除原有数据  
155 - // 操作在ktr内部执行  
156 -  
157 - // 3、导入时刻表  
158 -  
159 - // 计算表头参数  
160 - Workbook book = Workbook.getWorkbook(fileCal);  
161 - Sheet sheet_exp = book.getSheet(sheetname);  
162 - List<String> columnames = new ArrayList<>();  
163 - for (int i = 0; i < sheet_exp.getColumns(); i++) { // 获取第一行,数据,作为列名  
164 - columnames.add(sheet_exp.getCell(i, 0).getContents());  
165 - }  
166 - LOGGER.info("表头={}", StringUtils.join(columnames.toArray(), ","));  
167 -  
168 - // 创建ktr转换所需参数  
169 - Map<String, Object> ktrParms = new HashMap<>();  
170 - // 元数据ktr  
171 - File mktrFile = new File(this.getClass().getResource(  
172 - dataToolsProperties.getTtinfodetailMetadatainputktr()).toURI());  
173 - // 实际数据ktr  
174 - File ktrFile2_version = new File(this.getClass().getResource(  
175 - dataToolsProperties.getTtinfodetailDatainputktr2version()).toURI());  
176 - // 实际数据ktr2  
177 - File ktrFile2_version2 = new File(this.getClass().getResource(  
178 - dataToolsProperties.getTtinfodetailDatainputktr2version2()).toURI());  
179 -  
180 -  
181 - // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径  
182 - ktrParms.put("transpath", mktrFile.getAbsolutePath());  
183 - ktrParms.put("filepath", fileCal.getAbsolutePath());  
184 - ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());  
185 -  
186 - // 附加参数  
187 - if (excelFormatType == ExcelFormatType.Normal) {  
188 - ktrParms.put("injectktrfile", ktrFile2_version.getAbsolutePath()); // 注入元数据的ktr文件  
189 - } else if (excelFormatType == ExcelFormatType.Dynamic) {  
190 - ktrParms.put("injectktrfile", ktrFile2_version2.getAbsolutePath()); // 注入元数据的ktr文件  
191 - } else {  
192 - throw new ScheduleException("未知ExcelFormatType");  
193 - }  
194 -  
195 - ktrParms.put("sheetname", sheetname); // sheet工作区的名字  
196 - ktrParms.put("lineinfoid", lineid); // 线路标准id  
197 - ktrParms.put("xlname", xlname); // 线路名称  
198 - ktrParms.put("xlid", xlid); // 线路id  
199 - ktrParms.put("ttinfoname", ttname); // 时刻表名称  
200 - ktrParms.put("ttid", ttid.intValue()); // 时刻表id  
201 - ktrParms.put("lineversion", lineversion); // 站点路由版本  
202 - ktrParms.put("excelfieldnames", StringUtils.join(columnames.toArray(), ",")); // 时刻表excel输入字段名,以逗号连接  
203 - columnames.remove(0);  
204 - ktrParms.put("normalizefieldnames", StringUtils.join(columnames.toArray(), ",")); // 数据范式化字段名,以逗号连接  
205 -  
206 - dataToolsService.importData(fileCal, ktrParms); 87 + TimetableExcelData timetableExcelData = TimetableExcelData.withImportBuilder()
  88 + .setExcelFilePath(file.getAbsolutePath())
  89 + .setExcelSheetName(String.valueOf(params.get("sheetname")))
  90 + .setTtInfoId(Long.valueOf(String.valueOf(params.get("ttid"))))
  91 + .setLineId(Integer.valueOf(String.valueOf(params.get("xlid"))))
  92 + .setLineInfoId(Integer.valueOf(String.valueOf(params.get("lineinfo"))))
  93 + .setLineName(String.valueOf(params.get("xlname")))
  94 + .setTtInfoName(String.valueOf(params.get("ttname")))
  95 + .setLineRouteVersion(Integer.valueOf(String.valueOf(params.get("lineversion"))))
  96 + .setTimetableExcelFormatType(TimetableExcelFormatType.fromDesc(
  97 + String.valueOf(params.get("excelFormatType"))))
  98 + .setDataToolsService(this.dataToolsService)
  99 + .setDataToolsProperties(this.dataToolsProperties)
  100 + .setTimetableExcelDataImportStrategy(new TimetableExcelDataImportStrategyImpl())
  101 + .build();
  102 +
  103 + timetableExcelData.doImport();
  104 +
  105 +// if (params.get("lineversion") == null) {
  106 +// throw new Exception("线路版本未知");
  107 +// }
  108 +//
  109 +// String filename = file.getAbsolutePath(); // xls xlsx 文件名
  110 +// String sheetname = String.valueOf(params.get("sheetname")); // sheet名字
  111 +// Long ttid = Long.valueOf(String.valueOf(params.get("ttid"))); // 时刻表id
  112 +// Long xlid = Long.valueOf(String.valueOf(params.get("xlid"))); // 线路id
  113 +// Integer lineid = Integer.valueOf(String.valueOf(params.get("lineinfo"))); // 线路标准id
  114 +// String xlname = String.valueOf(params.get("xlname")); // 线路名字
  115 +// String ttname = String.valueOf(params.get("ttname")); // 时刻表名字
  116 +// Integer lineversion = Integer.valueOf(params.get("lineversion").toString()); // 线路路由版本
  117 +// ExcelFormatType excelFormatType = ExcelFormatType.getEnum(String.valueOf(params.get("excelFormatType"))); // 格式
  118 +//
  119 +// LOGGER.info("参数1, xls文件名={},sheet名字={}", filename, sheetname);
  120 +// LOGGER.info("参数2, 线路id={},线路名字={}", xlid, xlname);
  121 +// LOGGER.info("参数3, 时刻表id={},时刻表名字={}", ttid, ttname);
  122 +//
  123 +// LOGGER.info("转换xls文件格式成文本格式...");
  124 +// // 1、修改已经上传的excel文件,在每个起点站后标示数字,表示第几个班次
  125 +// // 2、由于格式问题,需要把内容都转换成字符串
  126 +// List<String> colList = new ArrayList<>();
  127 +//
  128 +// // poi api,并读取第一行数据,组合成站点列表,逗号分隔
  129 +// org.apache.poi.ss.usermodel.Workbook poi_workbook;
  130 +// org.apache.poi.ss.usermodel.Sheet poi_sheet;
  131 +// if (DataToolsFileType.XLS.isThisType(file)) {
  132 +// poi_workbook = DataToolsFileType.XLS.getWorkBook(file);
  133 +// } else if (DataToolsFileType.XLSX.isThisType(file)) {
  134 +// poi_workbook = DataToolsFileType.XLSX.getWorkBook(file);
  135 +// } else {
  136 +// throw new Exception("不是xls xlsx文件!");
  137 +// }
  138 +// poi_sheet = poi_workbook.getSheet(sheetname);
  139 +// int rownums = poi_sheet.getLastRowNum() + 1;
  140 +// int colnums = poi_sheet.getRow(0).getLastCellNum();
  141 +// Row firstrow = poi_sheet.getRow(0);
  142 +// for (int i = 0; i < colnums; i++) {
  143 +// org.apache.poi.ss.usermodel.Cell cell = firstrow.getCell(i);
  144 +// if (i == 0) {
  145 +// colList.add(PoiUtils.getStringValueFromCell(cell).trim());
  146 +// } else {
  147 +// // 站点名字后加->数字形式标示成不同的字段
  148 +// colList.add(PoiUtils.getStringValueFromCell(cell).trim().replaceAll("(->\\d+)", "") + "->" + i);
  149 +// }
  150 +// }
  151 +//
  152 +// // jxl api
  153 +// File fileCal = new File(filename + "_stringType.xls");
  154 +// WritableWorkbook writableWorkbook = Workbook.createWorkbook(fileCal);
  155 +// WritableSheet sheet1 = writableWorkbook.createSheet(sheetname, 0);
  156 +// for (int i = 0; i < colnums; i++) { // 第一行数据
  157 +// sheet1.addCell(new Label(i, 0, colList.get(i)));
  158 +// }
  159 +// for (int i = 1; i < rownums; i++) { // 第二行开始
  160 +// for (int j = 0; j < colnums; j++) {
  161 +// // poi读
  162 +// String cellContent = PoiUtils.getStringValueFromCell(
  163 +// poi_sheet.getRow(i).getCell(j)
  164 +// ).replaceAll("\\s*", "");
  165 +// // jxl写
  166 +// sheet1.addCell(new Label(j, i, cellContent));
  167 +// }
  168 +// }
  169 +// writableWorkbook.write();
  170 +// writableWorkbook.close();
  171 +//
  172 +// // 2、删除原有数据
  173 +// // 操作在ktr内部执行
  174 +//
  175 +// // 3、导入时刻表
  176 +//
  177 +// // 计算表头参数
  178 +// Workbook book = Workbook.getWorkbook(fileCal);
  179 +// Sheet sheet_exp = book.getSheet(sheetname);
  180 +// List<String> columnames = new ArrayList<>();
  181 +// for (int i = 0; i < sheet_exp.getColumns(); i++) { // 获取第一行,数据,作为列名
  182 +// columnames.add(sheet_exp.getCell(i, 0).getContents());
  183 +// }
  184 +// LOGGER.info("表头={}", StringUtils.join(columnames.toArray(), ","));
  185 +//
  186 +// // 创建ktr转换所需参数
  187 +// Map<String, Object> ktrParms = new HashMap<>();
  188 +// // 元数据ktr
  189 +// File mktrFile = new File(this.getClass().getResource(
  190 +// dataToolsProperties.getTtinfodetailMetadatainputktr()).toURI());
  191 +// // 实际数据ktr
  192 +// File ktrFile2_version = new File(this.getClass().getResource(
  193 +// dataToolsProperties.getTtinfodetailDatainputktr2version()).toURI());
  194 +// // 实际数据ktr2
  195 +// File ktrFile2_version2 = new File(this.getClass().getResource(
  196 +// dataToolsProperties.getTtinfodetailDatainputktr2version2()).toURI());
  197 +//
  198 +//
  199 +// // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径
  200 +// ktrParms.put("transpath", mktrFile.getAbsolutePath());
  201 +// ktrParms.put("filepath", fileCal.getAbsolutePath());
  202 +// ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());
  203 +//
  204 +// // 附加参数
  205 +// if (excelFormatType == ExcelFormatType.Normal) {
  206 +// ktrParms.put("injectktrfile", ktrFile2_version.getAbsolutePath()); // 注入元数据的ktr文件
  207 +// } else if (excelFormatType == ExcelFormatType.Dynamic) {
  208 +// ktrParms.put("injectktrfile", ktrFile2_version2.getAbsolutePath()); // 注入元数据的ktr文件
  209 +// } else {
  210 +// throw new ScheduleException("未知ExcelFormatType");
  211 +// }
  212 +//
  213 +// ktrParms.put("sheetname", sheetname); // sheet工作区的名字
  214 +// ktrParms.put("lineinfoid", lineid); // 线路标准id
  215 +// ktrParms.put("xlname", xlname); // 线路名称
  216 +// ktrParms.put("xlid", xlid); // 线路id
  217 +// ktrParms.put("ttinfoname", ttname); // 时刻表名称
  218 +// ktrParms.put("ttid", ttid.intValue()); // 时刻表id
  219 +// ktrParms.put("lineversion", lineversion); // 站点路由版本
  220 +// ktrParms.put("excelfieldnames", StringUtils.join(columnames.toArray(), ",")); // 时刻表excel输入字段名,以逗号连接
  221 +// columnames.remove(0);
  222 +// ktrParms.put("normalizefieldnames", StringUtils.join(columnames.toArray(), ",")); // 数据范式化字段名,以逗号连接
  223 +//
  224 +// dataToolsService.importData(fileCal, ktrParms);
207 225
208 LOGGER.info("//---------------- 导入时刻表明细 success... ----------------//"); 226 LOGGER.info("//---------------- 导入时刻表明细 success... ----------------//");
209 } catch (Exception exp) { 227 } catch (Exception exp) {
src/main/java/com/bsth/service/schedule/impl/TTInfoDetailServiceImpl.java
@@ -28,8 +28,9 @@ import com.bsth.service.schedule.datatools.ExcelPoiOperator; @@ -28,8 +28,9 @@ import com.bsth.service.schedule.datatools.ExcelPoiOperator;
28 import com.bsth.service.schedule.datatools.TTInfoDetailForEdit; 28 import com.bsth.service.schedule.datatools.TTInfoDetailForEdit;
29 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData; 29 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData;
30 import com.bsth.service.schedule.exception.ScheduleException; 30 import com.bsth.service.schedule.exception.ScheduleException;
31 -import com.bsth.service.schedule.timetable.ExcelData;  
32 -import com.bsth.service.schedule.timetable.ExcelFormatType; 31 +import com.bsth.service.schedule.timetable.TimetableExcelData;
  32 +import com.bsth.service.schedule.timetable.TimetableExcelFormatType;
  33 +import com.bsth.service.schedule.timetable.strategy.impl.TimetableExcelDataValidateStrategyImpl;
33 import com.bsth.service.schedule.utils.*; 34 import com.bsth.service.schedule.utils.*;
34 import org.apache.commons.lang3.StringUtils; 35 import org.apache.commons.lang3.StringUtils;
35 import org.apache.commons.lang3.time.DateFormatUtils; 36 import org.apache.commons.lang3.time.DateFormatUtils;
@@ -404,13 +405,26 @@ public class TTInfoDetailServiceImpl extends BServiceImpl&lt;TTInfoDetail, Long&gt; im @@ -404,13 +405,26 @@ public class TTInfoDetailServiceImpl extends BServiceImpl&lt;TTInfoDetail, Long&gt; im
404 } 405 }
405 406
406 @Override 407 @Override
407 - public void validateExcelSheet(String filename, String sheetname, Integer lineid, String linename, Integer lineversion, ExcelFormatType excelFormatType) throws ScheduleException {  
408 - ExcelData excelData = new ExcelData(  
409 - filename, sheetname, lineid,  
410 - lineService, guideboardInfoService,  
411 - lineversion, stationRouteService,  
412 - excelFormatType);  
413 - excelData.validateExcelSheet(); 408 + public void validateExcelSheet(
  409 + String filename,
  410 + String sheetname,
  411 + Integer lineid,
  412 + String linename,
  413 + Integer lineversion,
  414 + TimetableExcelFormatType timetableExcelFormatType
  415 + ) throws ScheduleException {
  416 + TimetableExcelData timetableExcelData = TimetableExcelData.withValidateBuilder()
  417 + .setExcelFilePath(filename)
  418 + .setExcelSheetName(sheetname)
  419 + .setLineId(lineid)
  420 + .setLineRouteVersion(lineversion)
  421 + .setLineService(this.lineService)
  422 + .setStationRouteService(this.stationRouteService)
  423 + .setGuideboardInfoService(this.guideboardInfoService)
  424 + .setTimetableExcelFormatType(timetableExcelFormatType)
  425 + .setTimetableExcelDataValidateStrategy(new TimetableExcelDataValidateStrategyImpl())
  426 + .build();
  427 + timetableExcelData.doValidate();
414 } 428 }
415 429
416 @Override 430 @Override
src/main/java/com/bsth/service/schedule/timetable/ExcelData.java deleted 100644 → 0
1 -package com.bsth.service.schedule.timetable;  
2 -  
3 -import com.bsth.entity.Line;  
4 -import com.bsth.entity.LsStationRoute;  
5 -import com.bsth.entity.schedule.GuideboardInfo;  
6 -import com.bsth.service.LineService;  
7 -import com.bsth.service.StationRouteService;  
8 -import com.bsth.service.schedule.GuideboardInfoService;  
9 -import com.bsth.service.schedule.exception.ScheduleException;  
10 -import com.bsth.service.schedule.utils.DataToolsFile;  
11 -import com.bsth.service.schedule.utils.DataToolsFileType;  
12 -import com.bsth.service.schedule.utils.PoiUtils;  
13 -import org.apache.commons.lang3.StringUtils;  
14 -import org.apache.poi.ss.usermodel.Cell;  
15 -import org.apache.poi.ss.usermodel.Row;  
16 -import org.apache.poi.ss.usermodel.Sheet;  
17 -import org.apache.poi.ss.usermodel.Workbook;  
18 -import org.springframework.util.CollectionUtils;  
19 -  
20 -import java.io.File;  
21 -import java.util.ArrayList;  
22 -import java.util.HashMap;  
23 -import java.util.List;  
24 -import java.util.Map;  
25 -import java.util.regex.Matcher;  
26 -import java.util.regex.Pattern;  
27 -  
28 -/**  
29 - * 时刻表Excel数据类。  
30 - */  
31 -public class ExcelData {  
32 -  
33 - /** 导入后的Excel文件对象 */  
34 - private DataToolsFile dataToolsFile;  
35 - /** 数据sheet名 */  
36 - private String sheetName;  
37 - /** 线路 */  
38 - private Line line;  
39 - /** 线路路由列表(包含上下行的起终点站) */  
40 - private List<LsStationRoute> lsStationRouteList;  
41 - /** 路牌列表 */  
42 - private List<GuideboardInfo> guideboardInfoList;  
43 - /** excel数据格式 */  
44 - private ExcelFormatType excelFormatType;  
45 -  
46 - public DataToolsFile getDataToolsFile() {  
47 - return dataToolsFile;  
48 - }  
49 -  
50 - public void setDataToolsFile(DataToolsFile dataToolsFile) {  
51 - this.dataToolsFile = dataToolsFile;  
52 - }  
53 -  
54 - public String getSheetName() {  
55 - return sheetName;  
56 - }  
57 -  
58 - public void setSheetName(String sheetName) {  
59 - this.sheetName = sheetName;  
60 - }  
61 -  
62 - public Line getLine() {  
63 - return line;  
64 - }  
65 -  
66 - public void setLine(Line line) {  
67 - this.line = line;  
68 - }  
69 -  
70 - public List<LsStationRoute> getLsStationRouteList() {  
71 - return lsStationRouteList;  
72 - }  
73 -  
74 - public void setLsStationRouteList(List<LsStationRoute> lsStationRouteList) {  
75 - this.lsStationRouteList = lsStationRouteList;  
76 - }  
77 -  
78 - public List<GuideboardInfo> getGuideboardInfoList() {  
79 - return guideboardInfoList;  
80 - }  
81 -  
82 - public void setGuideboardInfoList(List<GuideboardInfo> guideboardInfoList) {  
83 - this.guideboardInfoList = guideboardInfoList;  
84 - }  
85 -  
86 - public ExcelFormatType getExcelFormatType() {  
87 - return excelFormatType;  
88 - }  
89 -  
90 - public void setExcelFormatType(ExcelFormatType excelFormatType) {  
91 - this.excelFormatType = excelFormatType;  
92 - }  
93 -  
94 - /**  
95 - * 构造函数  
96 - * @param filePath 文件路径  
97 - * @param sheetName sheet名字  
98 - * @param lineId 线路Id  
99 - * @param lineService LineServiceImpl  
100 - * @param guideboardInfoService GuideboardInfoServiceImpl  
101 - * @param lineRouteVersion 线路路由版本  
102 - * @param stationRouteService StationRouteServiceImpl  
103 - * @param excelFormatType excel数据格式  
104 - * @throws ScheduleException  
105 - * @see com.bsth.service.impl.LineServiceImpl  
106 - * @see com.bsth.service.schedule.impl.GuideboardInfoServiceImpl  
107 - * @see com.bsth.service.impl.StationRouteServiceImpl  
108 - */  
109 - public ExcelData(  
110 - String filePath, String sheetName,  
111 - Integer lineId, LineService lineService, GuideboardInfoService guideboardInfoService,  
112 - Integer lineRouteVersion, StationRouteService stationRouteService,  
113 - ExcelFormatType excelFormatType) throws ScheduleException {  
114 - // 获取Excel文件对象,类型  
115 - File file = new File(filePath);  
116 - this.dataToolsFile = new DataToolsFile();  
117 - this.dataToolsFile.setFile(file);  
118 - if (DataToolsFileType.XLS.isThisType(file)) {  
119 - this.dataToolsFile.setFileType(DataToolsFileType.XLS);  
120 - } else if (DataToolsFileType.XLSX.isThisType(file)) {  
121 - this.dataToolsFile.setFileType(DataToolsFileType.XLSX);  
122 - } else {  
123 - throw new ScheduleException("不是xls xlsx文件!");  
124 - }  
125 -  
126 - // sheet名字  
127 - this.sheetName = sheetName;  
128 - // 线路  
129 - this.line = lineService.findById(lineId);  
130 - // 线路路由列表  
131 - Map<String, Object> p1 = new HashMap<>();  
132 - p1.put("line.id_eq", lineId);  
133 - p1.put("stationMark_in", "B,E"); // 起点站  
134 - p1.put("destroy_eq", 0); // 未撤销  
135 - p1.put("versions_eq", lineRouteVersion); // 带线路版本  
136 - lsStationRouteList = (List<LsStationRoute>) stationRouteService.list_ls(p1);  
137 - // 路牌列表  
138 - p1.clear();  
139 - p1.put("xl.id_eq", lineId);  
140 - p1.put("isCancel_eq", false);  
141 - guideboardInfoList = guideboardInfoService.list(p1);  
142 -  
143 - // excel数据格式  
144 - this.excelFormatType = excelFormatType;  
145 - }  
146 -  
147 - /**  
148 - * 验证路由名字。  
149 - * @param colNum 列标号(从0开始)  
150 - * @param routeName 路由名字  
151 - * @throws ScheduleException  
152 - */  
153 - private void validateRouteName(int colNum, String routeName) throws ScheduleException {  
154 - List<LsStationRoute> lsStationRoutes = new ArrayList<>();  
155 - for (LsStationRoute lsStationRoute : this.lsStationRouteList) {  
156 - if ("B".equals(lsStationRoute.getStationMark()) && routeName.equals(lsStationRoute.getStationName())) {  
157 - lsStationRoutes.add(lsStationRoute);  
158 - }  
159 - }  
160 -  
161 - if (CollectionUtils.isEmpty(lsStationRoutes)) {  
162 - throw new ScheduleException(String.format("第1行,第%d列数据%s在%s站点路由中不是起点站",  
163 - colNum + 1, routeName, this.line.getName()));  
164 - } else if (lsStationRoutes.size() > 1) {  
165 - throw new ScheduleException(String.format("第1行,第%d列数据%s在%s站点路由中上下行都是起点站",  
166 - colNum + 1, routeName, this.line.getName()));  
167 - } else if (StringUtils.isEmpty(lsStationRoutes.get(0).getStationCode())) {  
168 - throw new ScheduleException(String.format("第1行,第%d列数据%s在%s站点路由中没有站点编码",  
169 - colNum + 1, routeName, this.line.getName()));  
170 - }  
171 -  
172 - }  
173 -  
174 - /**  
175 - * 验证路牌名字。  
176 - * @param colNum excelSheet 列index  
177 - * @param guideboardName 路牌名字  
178 - * @throws ScheduleException  
179 - */  
180 - private void validateGuideboardName(int colNum, String guideboardName) throws ScheduleException {  
181 - List<GuideboardInfo> guideboardInfos = new ArrayList<>();  
182 - for (GuideboardInfo guideboardInfo : this.guideboardInfoList) {  
183 - if (guideboardName.equals(guideboardInfo.getLpName())) {  
184 - guideboardInfos.add(guideboardInfo);  
185 - }  
186 - }  
187 -  
188 - if (CollectionUtils.isEmpty(guideboardInfos)) {  
189 - throw new ScheduleException(String.format("第%d行,第1列的路牌在%s中不存在",  
190 - colNum + 1, this.line.getName()));  
191 - } else if (guideboardInfos.size() > 1) {  
192 - throw new ScheduleException(String.format("第%d行,第1列的路牌在%s中重复",  
193 - colNum + 1, this.line.getName()));  
194 - }  
195 - }  
196 -  
197 - /**  
198 - * 验证发车时间内容。  
199 - * @param rowNum excelSheet 行index  
200 - * @param colNum excelSheet 列index  
201 - * @param fcsjContent 发车时间内容  
202 - * @throws ScheduleException  
203 - */  
204 - private void validateFcsjContent(int rowNum, int colNum, String fcsjContent) throws ScheduleException {  
205 - if (this.excelFormatType == ExcelFormatType.Normal) {  
206 - // 班次时间验证,正则表达式,格式hh:mm或者hhmm  
207 - String rex1 = "^([01]?[0-9]|2[0-3]):[0-5][0-9]$"; // hh:mm格式  
208 - String rex2 = "^([01]?[0-9]|2[0-3]),[0-5][0-9]$"; // hh,mm格式  
209 - String rex3 = "^([01]?[0-9]|2[0-3])[0-5][0-9]$"; // hhmm格式  
210 - Pattern p1 = Pattern.compile(rex1);  
211 - Pattern p2 = Pattern.compile(rex2);  
212 - Pattern p3 = Pattern.compile(rex3);  
213 -  
214 - Matcher m1 = p1.matcher(fcsjContent.trim());  
215 - Matcher m2 = p2.matcher(fcsjContent.trim());  
216 - Matcher m3 = p3.matcher(fcsjContent.trim());  
217 - if ((!m1.matches()) && (!m2.matches()) && (!m3.matches())) {  
218 - throw new ScheduleException(String.format("第%d行,第%d列的发车时间格式不正确,格式应为hh:mm或hh,mm或hhmm",  
219 - rowNum + 1, colNum + 1));  
220 - }  
221 - } else if (this.excelFormatType == ExcelFormatType.Dynamic) {  
222 - String rex1 = "^(\u62a5|\u51fa)?([01]?[0-9]|2[0-3]):[0-5][0-9]$"; // (报|出)hh:mm格式  
223 - String rex2 = "^([01]?[0-9]|2[0-3]):[0-5][0-9](X|\u203b)?$"; // hh:mm(X|※)格式  
224 - Pattern p1 = Pattern.compile(rex1);  
225 - Pattern p2 = Pattern.compile(rex2);  
226 - Matcher m1 = p1.matcher(fcsjContent.trim());  
227 - Matcher m2 = p2.matcher(fcsjContent.trim());  
228 - if ((!m1.matches()) && (!m2.matches())) {  
229 - throw new ScheduleException(String.format(  
230 - "第%d行,第%d列的发车时间格式不正确,格式应为(报|出)hh:mm或hh:mm(X|※)",  
231 - rowNum + 1, colNum + 1));  
232 - }  
233 - } else {  
234 - throw new ScheduleException("未知ExcelFormatType");  
235 - }  
236 -  
237 - }  
238 -  
239 - private List<Integer> calcuExcelSheetColIndexList(Workbook workbook) throws ScheduleException {  
240 - // 有些列不需要参与计算,找出参与计算的列  
241 - List<Integer> colIndexList = new ArrayList<>();  
242 - Sheet sheet = workbook.getSheet(this.sheetName);  
243 - Row firstRow = sheet.getRow(0); // 获取第一行数据列  
244 - for (int i = 0; i < firstRow.getLastCellNum(); i++) {  
245 - if (excelFormatType == ExcelFormatType.Normal) {  
246 - colIndexList.add(i);  
247 - } else if (excelFormatType == ExcelFormatType.Dynamic) {  
248 - String cell_con = StringUtils.trimToEmpty(  
249 - PoiUtils.getStringValueFromCell(firstRow.getCell(i))); // trimToEmpty  
250 - if ("报到".equals(cell_con) ||  
251 - "到场".equals(cell_con) ||  
252 - "离场".equals(cell_con) ||  
253 - "总公里".equals(cell_con) ||  
254 - "营业公里".equals(cell_con) ||  
255 - "空驶公里".equals(cell_con) ||  
256 - "总工时".equals(cell_con) ||  
257 - "营业工时".equals(cell_con) ||  
258 - "营运班次".equals(cell_con)) {  
259 - // 这些列全部祛除  
260 - continue;  
261 - } else {  
262 - colIndexList.add(i);  
263 - }  
264 - } else {  
265 - throw new ScheduleException("未知excelFormatType");  
266 - }  
267 - }  
268 - return colIndexList;  
269 - }  
270 -  
271 - /**  
272 - * 验证老系统ExcelSheet格式。  
273 - * @throws ScheduleException  
274 - */  
275 - public void validateExcelSheet() throws ScheduleException {  
276 - try {  
277 - Workbook workbook = this.dataToolsFile.getFileType().getWorkBook(  
278 - this.dataToolsFile.getFile()  
279 - );  
280 -  
281 - Sheet sheet = workbook.getSheet(this.sheetName);  
282 - int rowNums = sheet.getLastRowNum() + 1; // 基于0 base的,长度加1  
283 - int colNums = sheet.getRow(0).getLastCellNum(); // 不需要加1,就是长度  
284 -  
285 - if (rowNums == 0 || colNums == 0) { // 工作区是否为空  
286 - throw new Exception(String.format("%s 工作区没有数据!", this.sheetName));  
287 - } else {  
288 - if (rowNums <= 1 || rowNums <= 1) {  
289 - throw new Exception(String.format("工作区至少包含2行2列的数据"));  
290 - } else {  
291 - List<Integer> colIndexList = this.calcuExcelSheetColIndexList(workbook);  
292 - Row firstRow = sheet.getRow(0); // 获取第一行数据列  
293 - for (int n = 0; n < colIndexList.size(); n++) {  
294 - int i = colIndexList.get(n);  
295 - String cell_con = StringUtils.trimToEmpty(  
296 - PoiUtils.getStringValueFromCell(firstRow.getCell(i))); // trimToEmpty  
297 -  
298 - if (StringUtils.isEmpty(cell_con)) {  
299 - throw new Exception(String.format("第1行,第%d列数据不能为空", i + 1));  
300 - } else {  
301 - // 正则表达式去除右侧数字  
302 -// cell_con = cell_con.replaceAll("[\\d+]", "");  
303 -// cell_con = cell_con.replaceAll("(\\d+)$", "");  
304 -  
305 - // 如果站名中有类似->{数字},使用正则表达式过滤掉  
306 - cell_con = cell_con.replaceAll("(->\\d+)", "");  
307 -  
308 - if (i == 0) { // 第一列必须是路牌2个字  
309 - if (!"路牌".equals(cell_con.trim())) {  
310 - throw new Exception("第1行,第1列数据必须是路牌2个字");  
311 - }  
312 - } else { // 排除出场,进场,其余内容到站点路由里查询,以各个方向的起点站为查询依据  
313 - if ((!"出场".equals(cell_con.trim())) &&  
314 - (!"进场".equals(cell_con.trim()))) {  
315 - validateRouteName(i, cell_con.trim()); // 验证路由名字  
316 - }  
317 -  
318 - }  
319 - }  
320 - }  
321 -  
322 - // 验证路牌内容  
323 - Map<String, Integer> gbindexmap = new HashMap<>(); // 记录每个路牌在第几行  
324 - for (int i = 1; i < rowNums; i++) { // 从第2行开始验证数据  
325 - Cell cell = sheet.getRow(i).getCell(0); // 获取第1列  
326 - String bcell_con = StringUtils.trimToEmpty(  
327 - PoiUtils.getStringValueFromCell(cell)); // trimToEmpty  
328 - if (StringUtils.isEmpty(bcell_con)) {  
329 - throw new Exception(String.format("第%d行,第1列路牌无数据", i + 1));  
330 - } else if (gbindexmap.get(bcell_con.trim()) != null) {  
331 - throw new Exception(String.format("第%d行,第1列的路牌数据与第%d行,第1列数据重复",  
332 - i + 1,  
333 - gbindexmap.get(bcell_con.trim())));  
334 - } else {  
335 - validateGuideboardName(i, bcell_con.trim()); // 验证路牌名字  
336 - gbindexmap.put(bcell_con.trim(), i + 1);  
337 - }  
338 - }  
339 -  
340 - // 验证发车时间格式  
341 - for (int i = 1; i < rowNums; i++) { // 从第2行开始验证数据  
342 - Row row = sheet.getRow(i);  
343 - for (int n = 1; n < colIndexList.size(); n++) { // 从第2列开始  
344 - int j = colIndexList.get(n);  
345 - String bcell_con = StringUtils.trimToEmpty(  
346 - PoiUtils.getStringValueFromCell(  
347 - row.getCell(j))).replaceAll("\\s*", ""); // trimToEmpty  
348 - if (StringUtils.isNotEmpty(bcell_con)) {  
349 - validateFcsjContent(i, j, bcell_con);  
350 - }  
351 - }  
352 - }  
353 - }  
354 -  
355 - }  
356 -  
357 - } catch (Exception exp) {  
358 - exp.printStackTrace();  
359 - throw new ScheduleException(exp.getMessage());  
360 - }  
361 - }  
362 -  
363 -}  
src/main/java/com/bsth/service/schedule/timetable/ExcelFormatType.java deleted 100644 → 0
1 -package com.bsth.service.schedule.timetable;  
2 -  
3 -import com.fasterxml.jackson.annotation.JsonCreator;  
4 -import com.fasterxml.jackson.annotation.JsonValue;  
5 -  
6 -/**  
7 - * 导入时刻表时,excel的数据格式类型。  
8 - */  
9 -public enum ExcelFormatType {  
10 - Normal("normal"), // 老系统格式  
11 - Dynamic("dynamic"); // 自动生成的导出格式  
12 -  
13 - private String flag;  
14 -  
15 - @JsonCreator  
16 - ExcelFormatType(String flag) {  
17 - this.flag = flag;  
18 - }  
19 -  
20 - @JsonValue  
21 - public String getFlag() {  
22 - return flag;  
23 - }  
24 -  
25 - public void setFlag(String flag) {  
26 - this.flag = flag;  
27 - }  
28 -  
29 - public static ExcelFormatType getEnum(String str) {  
30 - if ("normal".equals(str)) {  
31 - return Normal;  
32 - } else if ("dynamic".equals(str)) {  
33 - return Dynamic;  
34 - } else {  
35 - throw new IllegalArgumentException("未知ExcelFormatType");  
36 - }  
37 - }  
38 -}  
src/main/java/com/bsth/service/schedule/timetable/TimetableExcelData.java 0 → 100644
  1 +package com.bsth.service.schedule.timetable;
  2 +
  3 +import com.bsth.entity.Line;
  4 +import com.bsth.entity.LsStationRoute;
  5 +import com.bsth.entity.schedule.GuideboardInfo;
  6 +import com.bsth.service.LineService;
  7 +import com.bsth.service.StationRouteService;
  8 +import com.bsth.service.schedule.GuideboardInfoService;
  9 +import com.bsth.service.schedule.exception.ScheduleException;
  10 +import com.bsth.service.schedule.timetable.strategy.TimetableExcelDataImportStrategy;
  11 +import com.bsth.service.schedule.timetable.strategy.TimetableExcelDataValidateStrategy;
  12 +import com.bsth.service.schedule.utils.*;
  13 +import org.apache.commons.lang3.StringUtils;
  14 +import org.apache.poi.ss.usermodel.Sheet;
  15 +import org.apache.poi.ss.usermodel.Workbook;
  16 +import org.slf4j.Logger;
  17 +import org.slf4j.LoggerFactory;
  18 +import org.springframework.util.Assert;
  19 +import org.springframework.util.CollectionUtils;
  20 +
  21 +import java.io.File;
  22 +import java.util.HashMap;
  23 +import java.util.List;
  24 +import java.util.Map;
  25 +
  26 +/**
  27 + * 时刻表Excel数据类,用于验证,导入,导出时刻表数据。
  28 + * 混合Builder和Strategy模式。
  29 + */
  30 +public class TimetableExcelData {
  31 + /** 日志记录器 */
  32 + private final static Logger LOG = LoggerFactory.getLogger(TimetableExcelData.class);
  33 +
  34 + // ------------------ 公共属性及方法,如下:------------------- //
  35 + /** 待导入excel workbook对象 */
  36 + private Workbook excelWorkBook;
  37 + /** 待导入excel workbook 工作区对象 */
  38 + private Sheet excelWorkBookSheet;
  39 + /** 时刻表excel格式类型 */
  40 + private TimetableExcelFormatType timetableExcelFormatType;
  41 +
  42 + // 内部标识excel单元格类
  43 + public static class TimetableExcelInternalCell {
  44 + /** 是否可用(默认不可用) */
  45 + public Boolean isEnable = false;
  46 + /** 单元格内容 */
  47 + public String cellContent;
  48 +
  49 + //------------- 班次类型(发车时间单元格 isFcsjCell = true)-----------//
  50 + /** 是否是班次 */
  51 + public Boolean isBc = false;
  52 + /** 是否是出场班次 */
  53 + public Boolean isOutBc = false;
  54 + /** 是否是进场班次 */
  55 + public Boolean isInBc = false;
  56 +
  57 + //------------- 单元格类型 -------------//
  58 + /** 是否表头Cell */
  59 + public Boolean isHeadCell = false;
  60 + /** 是否路牌名字Cell */
  61 + public Boolean isLpNameCell = false;
  62 + /** 是否发车时间Cell */
  63 + public Boolean isFcsjCell = false;
  64 + /** 是否工时Cell */
  65 + public Boolean isGsCell = false;
  66 + }
  67 + /** 内部Excel单元格二维数组 */
  68 + private TimetableExcelInternalCell[][] internalExcelCells;
  69 + // 初始化内部标识excel单元格
  70 + private void initInternalExcelCells() {
  71 + int rowCount = this.excelWorkBookSheet.getLastRowNum() + 1; // 基于0 base的,长度加1
  72 + Assert.isTrue(rowCount > 1, String.format("%s 工作区没有数据!", this.excelWorkBookSheet.getSheetName()));
  73 + int colCount = this.excelWorkBookSheet.getRow(0).getLastCellNum(); // 不需要加1,就是长度
  74 + Assert.isTrue(colCount > 0, String.format("%s 工作区第一行没有数据!", this.excelWorkBookSheet.getSheetName()));
  75 +
  76 + this.internalExcelCells = new TimetableExcelInternalCell[rowCount][colCount];
  77 + for (int rowNum = 0; rowNum < rowCount; rowNum ++) {
  78 + for (int colNum = 0; colNum < colCount; colNum ++) {
  79 + TimetableExcelInternalCell cell = new TimetableExcelInternalCell();
  80 + String cell_con = StringUtils.trimToEmpty(PoiUtils.getStringValueFromCell(
  81 + this.excelWorkBookSheet.getRow(rowNum).getCell(colNum))
  82 + .replaceAll("\\s*", "")); // trimToEmpty
  83 +
  84 + // 如果站名中有类似->{数字},使用正则表达式过滤掉
  85 + cell_con = cell_con.replaceAll("(->\\d+)", "");
  86 +
  87 + cell.cellContent = cell_con;
  88 + cell.isEnable = true;
  89 + this.internalExcelCells[rowNum][colNum] = cell;
  90 + }
  91 + }
  92 +
  93 + }
  94 +
  95 + // ------------------ 验证相关属性及方法,如下:---------------- //
  96 + /** 线路信息 */
  97 + private Line line;
  98 + /** 线路站点路由列表(包含上下行的起终点站) */
  99 + private List<LsStationRoute> lsStationRouteList;
  100 + /** 路牌列表 */
  101 + private List<GuideboardInfo> guideboardInfoList;
  102 + /** 时刻表excel验证策略 */
  103 + private TimetableExcelDataValidateStrategy timetableExcelDataValidateStrategy;
  104 + /**
  105 + * 验证excel时刻表。
  106 + */
  107 + public void doValidate() throws ScheduleException {
  108 + this.timetableExcelDataValidateStrategy.doValidate(
  109 + this.internalExcelCells,
  110 + this.timetableExcelFormatType,
  111 + this.line,
  112 + this.lsStationRouteList,
  113 + this.guideboardInfoList);
  114 + }
  115 +
  116 + // ------------------ 导入相关属性及方法,如下:---------------- //
  117 + /** 导入的Excel文件路径 */
  118 + private String excelFilePath;
  119 + /** 数据工具服务 */
  120 + private DataToolsService dataToolsService;
  121 + /** 配置数据导入导出用到的配置信息 */
  122 + private DataToolsProperties dataToolsProperties;
  123 + /** ktr转换所需参数对象 */
  124 + private Map<String, Object> ktrParams = new HashMap<>();
  125 + /** 时刻表excel导入策略 */
  126 + private TimetableExcelDataImportStrategy timetableExcelDataImportStrategy;
  127 + /**
  128 + * 导入excel时刻表。
  129 + */
  130 + public void doImport() throws ScheduleException {
  131 + this.timetableExcelDataImportStrategy.doImport(
  132 + this.excelWorkBookSheet,
  133 + this.excelFilePath,
  134 + this.dataToolsService,
  135 + this.dataToolsProperties,
  136 + this.ktrParams,
  137 + this.internalExcelCells,
  138 + this.timetableExcelFormatType);
  139 + }
  140 +
  141 +
  142 + // ----------- 构造函数 ---------- //
  143 + public TimetableExcelData(ValidateBuilder validateBuilder) {
  144 + // 公共属性
  145 + this.excelWorkBook = validateBuilder.excelWorkBook;
  146 + this.excelWorkBookSheet = validateBuilder.excelWorkBookSheet;
  147 + this.timetableExcelFormatType = validateBuilder.timetableExcelFormatType;
  148 + // 验证用属性
  149 + this.line = validateBuilder.line;
  150 + this.lsStationRouteList = validateBuilder.lsStationRouteList;
  151 + this.guideboardInfoList = validateBuilder.guideboardInfoList;
  152 + this.timetableExcelDataValidateStrategy = validateBuilder.timetableExcelDataValidateStrategy;
  153 +
  154 + // 构造内部Excel单元格二维数组
  155 + this.initInternalExcelCells();
  156 + }
  157 + public TimetableExcelData(ImportBuilder importBuilder) {
  158 + // 公共属性
  159 + this.excelWorkBook = importBuilder.excelWorkBook;
  160 + this.excelWorkBookSheet = importBuilder.excelWorkBookSheet;
  161 + this.timetableExcelFormatType = importBuilder.timetableExcelFormatType;
  162 + // 导入用属性
  163 + this.excelFilePath = importBuilder.excelFilePath;
  164 + this.dataToolsService = importBuilder.dataToolsService;
  165 + this.dataToolsProperties = importBuilder.dataToolsProperties;
  166 + this.ktrParams = importBuilder.ktrParams;
  167 + this.timetableExcelDataImportStrategy = importBuilder.timetableExcelDataImportStrategy;
  168 +
  169 + LOG.info("参数组1, xls文件名={},sheet名字={}",
  170 + this.excelFilePath, this.ktrParams.get("sheetname"));
  171 + LOG.info("参数组2, 线路id={},线路名字={},线路版本={}",
  172 + this.ktrParams.get("xlid"), this.ktrParams.get("xlname"), this.ktrParams.get("lineversion"));
  173 + LOG.info("参数组3, 时刻表id={},时刻表名字={}",
  174 + this.ktrParams.get("ttid"), this.ktrParams.get("ttinfoname"));
  175 +
  176 + // 构造内部Excel单元格二维数组
  177 + this.initInternalExcelCells();
  178 + }
  179 +
  180 + // ----------- builder类 ----------- //
  181 + public static ValidateBuilder withValidateBuilder() {
  182 + return new ValidateBuilder();
  183 + }
  184 + /**
  185 + * 验证excel时刻表数据用builder。
  186 + */
  187 + public static class ValidateBuilder {
  188 + private ValidateBuilder() {}
  189 +
  190 + /** 导入的Excel文件路径 */
  191 + private String excelFilePath;
  192 + /** 导入的Excel sheet名字 */
  193 + private String excelSheetName;
  194 + /** 线路Id */
  195 + private Integer lineId;
  196 + /** 线路路由版本 */
  197 + private Integer lineRouteVersion;
  198 + /** 线路信息service */
  199 + private LineService lineService;
  200 + /** 站点路由信息service */
  201 + private StationRouteService stationRouteService;
  202 + /** 路牌信息service */
  203 + private GuideboardInfoService guideboardInfoService;
  204 + /** 时刻表excel格式类型 */
  205 + private TimetableExcelFormatType timetableExcelFormatType;
  206 + /** 时刻表excel验证策略 */
  207 + private TimetableExcelDataValidateStrategy timetableExcelDataValidateStrategy;
  208 +
  209 + public ValidateBuilder setExcelFilePath(String excelFilePath) {
  210 + this.excelFilePath = excelFilePath;
  211 + return this;
  212 + }
  213 +
  214 + public ValidateBuilder setExcelSheetName(String excelSheetName) {
  215 + this.excelSheetName = excelSheetName;
  216 + return this;
  217 + }
  218 +
  219 + public ValidateBuilder setLineId(Integer lineId) {
  220 + this.lineId = lineId;
  221 + return this;
  222 + }
  223 +
  224 + public ValidateBuilder setLineRouteVersion(Integer lineRouteVersion) {
  225 + this.lineRouteVersion = lineRouteVersion;
  226 + return this;
  227 + }
  228 +
  229 + public ValidateBuilder setLineService(LineService lineService) {
  230 + this.lineService = lineService;
  231 + return this;
  232 + }
  233 +
  234 + public ValidateBuilder setStationRouteService(StationRouteService stationRouteService) {
  235 + this.stationRouteService = stationRouteService;
  236 + return this;
  237 + }
  238 +
  239 + public ValidateBuilder setGuideboardInfoService(GuideboardInfoService guideboardInfoService) {
  240 + this.guideboardInfoService = guideboardInfoService;
  241 + return this;
  242 + }
  243 +
  244 + public ValidateBuilder setTimetableExcelFormatType(TimetableExcelFormatType timetableExcelFormatType) {
  245 + this.timetableExcelFormatType = timetableExcelFormatType;
  246 + return this;
  247 + }
  248 +
  249 + public ValidateBuilder setTimetableExcelDataValidateStrategy(TimetableExcelDataValidateStrategy timetableExcelDataValidateStrategy) {
  250 + this.timetableExcelDataValidateStrategy = timetableExcelDataValidateStrategy;
  251 + return this;
  252 + }
  253 +
  254 + // ---------------- 内部生成的属性 ------------------ //
  255 + /** 待导入excel workbook对象 */
  256 + private Workbook excelWorkBook;
  257 + /** 待导入excel workbook工作区对象 */
  258 + private Sheet excelWorkBookSheet;
  259 + /** 线路信息 */
  260 + private Line line;
  261 + /** 线路站点路由列表(包含上下行的起终点站) */
  262 + private List<LsStationRoute> lsStationRouteList;
  263 + /** 路牌列表 */
  264 + private List<GuideboardInfo> guideboardInfoList;
  265 +
  266 + public TimetableExcelData build() throws ScheduleException {
  267 + // 0、检测时刻表excel业务格式
  268 + if (this.timetableExcelFormatType == null) {
  269 + throw new ScheduleException("导入的Excel类型为空!");
  270 + }
  271 +
  272 + // 1、检测excel文件,创建excel workbook对象
  273 + // 1-1、检测文件是否存在
  274 + Assert.hasText(this.excelFilePath, "导入的Excel文件路径为空!");
  275 + File file = new File(this.excelFilePath);
  276 + if (!file.exists()) {
  277 + throw new ScheduleException("导入的Excel文件[" + this.excelFilePath + "]不存在!");
  278 + }
  279 + // 1-2、检测文件类型
  280 + DataToolsFile dataToolsFile = new DataToolsFile();
  281 + dataToolsFile.setFile(file);
  282 + if (DataToolsFileType.XLS.isThisType(file)) {
  283 + dataToolsFile.setFileType(DataToolsFileType.XLS);
  284 + } else if (DataToolsFileType.XLSX.isThisType(file)) {
  285 + dataToolsFile.setFileType(DataToolsFileType.XLSX);
  286 + } else {
  287 + throw new ScheduleException("导入的Excel文件[" + this.excelFilePath + "]内部不是xls,xlsx文件!");
  288 + }
  289 + // 1-3、创建workbook
  290 + this.excelWorkBook = dataToolsFile.getFileType().getWorkBook(dataToolsFile.getFile());
  291 + // 1-4、检测sheet名字
  292 + Assert.hasText(this.excelSheetName, "导入的Excel sheet名字为空!");
  293 + this.excelWorkBookSheet = this.excelWorkBook.getSheet(this.excelSheetName);
  294 + if (this.excelWorkBookSheet == null) {
  295 + throw new ScheduleException("导入的Excel文件sheet[" + this.excelSheetName + "]不存在!");
  296 + }
  297 +
  298 + // 2、获取线路信息,站点路由信息
  299 + // 2-1、线路信息
  300 + Assert.notNull(this.lineService, "线路信息service为空!");
  301 + Assert.notNull(this.lineId, "线路Id为空!");
  302 + this.line = this.lineService.findById(this.lineId);
  303 + if (this.line == null) {
  304 + throw new ScheduleException("线路[id=" + this.lineId + "]不存在!");
  305 + }
  306 + // 2-2、站点路由信息
  307 + Assert.notNull(this.stationRouteService, "站点路由信息service为空!");
  308 + Assert.notNull(this.lineRouteVersion, "线路站点路由版本为空!");
  309 + Map<String, Object> p1 = new HashMap<>();
  310 + p1.put("line.id_eq", this.lineId);
  311 + p1.put("stationMark_in", "B,E"); // 起点站
  312 + p1.put("destroy_eq", 0); // 未撤销
  313 + p1.put("versions_eq", this.lineRouteVersion); // 带线路版本
  314 + this.lsStationRouteList = (List<LsStationRoute>) this.stationRouteService.list_ls(p1);
  315 + if (CollectionUtils.isEmpty(this.lsStationRouteList)) {
  316 + throw new ScheduleException("线路[" + this.line.getName() + "],站点路由[版本=" + this.lineRouteVersion + "]信息为空");
  317 + }
  318 +
  319 + // 3、获取路牌信息
  320 + Assert.notNull(this.guideboardInfoService, "路牌信息service为空!");
  321 + p1.clear();
  322 + p1.put("xl.id_eq", this.lineId);
  323 + p1.put("isCancel_eq", false);
  324 + this.guideboardInfoList = guideboardInfoService.list(p1);
  325 + if (CollectionUtils.isEmpty(this.guideboardInfoList)) {
  326 + throw new ScheduleException("线路[" + this.line.getName() + "]路牌信息为空!");
  327 + }
  328 +
  329 + // 4、验证策略类
  330 + Assert.notNull(this.timetableExcelDataValidateStrategy, "时刻表excel验证策略类为空!");
  331 +
  332 + return new TimetableExcelData(this);
  333 + }
  334 + }
  335 +
  336 + public static ImportBuilder withImportBuilder() {
  337 + return new ImportBuilder();
  338 + }
  339 + public static class ImportBuilder {
  340 + private ImportBuilder() {}
  341 +
  342 + /** 导入的Excel文件路径 */
  343 + private String excelFilePath;
  344 + /** 导入的Excel sheet名字 */
  345 + private String excelSheetName;
  346 + /** 时刻表Id */
  347 + private Long ttInfoId;
  348 + /** 线路Id */
  349 + private Integer lineId;
  350 + /** 线路标准信息Id */
  351 + private Integer lineInfoId;
  352 + /** 线路名字 */
  353 + private String lineName;
  354 + /** 时刻表名字 */
  355 + private String ttInfoName;
  356 + /** 线路路由版本 */
  357 + private Integer lineRouteVersion;
  358 + /** 时刻表excel格式类型 */
  359 + private TimetableExcelFormatType timetableExcelFormatType;
  360 + /** 数据工具服务 */
  361 + private DataToolsService dataToolsService;
  362 + /** 配置数据导入导出用到的配置信息 */
  363 + private DataToolsProperties dataToolsProperties;
  364 + /** 时刻表excel导入策略 */
  365 + private TimetableExcelDataImportStrategy timetableExcelDataImportStrategy;
  366 +
  367 + public ImportBuilder setExcelFilePath(String excelFilePath) {
  368 + this.excelFilePath = excelFilePath;
  369 + return this;
  370 + }
  371 +
  372 + public ImportBuilder setExcelSheetName(String excelSheetName) {
  373 + this.excelSheetName = excelSheetName;
  374 + return this;
  375 + }
  376 +
  377 + public ImportBuilder setTtInfoId(Long ttInfoId) {
  378 + this.ttInfoId = ttInfoId;
  379 + return this;
  380 + }
  381 +
  382 + public ImportBuilder setLineId(Integer lineId) {
  383 + this.lineId = lineId;
  384 + return this;
  385 + }
  386 +
  387 + public ImportBuilder setLineInfoId(Integer lineInfoId) {
  388 + this.lineInfoId = lineInfoId;
  389 + return this;
  390 + }
  391 +
  392 + public ImportBuilder setLineName(String lineName) {
  393 + this.lineName = lineName;
  394 + return this;
  395 + }
  396 +
  397 + public ImportBuilder setTtInfoName(String ttInfoName) {
  398 + this.ttInfoName = ttInfoName;
  399 + return this;
  400 + }
  401 +
  402 + public ImportBuilder setLineRouteVersion(Integer lineRouteVersion) {
  403 + this.lineRouteVersion = lineRouteVersion;
  404 + return this;
  405 + }
  406 +
  407 + public ImportBuilder setTimetableExcelFormatType(TimetableExcelFormatType timetableExcelFormatType) {
  408 + this.timetableExcelFormatType = timetableExcelFormatType;
  409 + return this;
  410 + }
  411 +
  412 + public ImportBuilder setDataToolsService(DataToolsService dataToolsService) {
  413 + this.dataToolsService = dataToolsService;
  414 + return this;
  415 + }
  416 +
  417 + public ImportBuilder setDataToolsProperties(DataToolsProperties dataToolsProperties) {
  418 + this.dataToolsProperties = dataToolsProperties;
  419 + return this;
  420 + }
  421 +
  422 + public ImportBuilder setTimetableExcelDataImportStrategy(TimetableExcelDataImportStrategy timetableExcelDataImportStrategy) {
  423 + this.timetableExcelDataImportStrategy = timetableExcelDataImportStrategy;
  424 + return this;
  425 + }
  426 +
  427 + // ---------------- 内部生成的属性 ------------------ //
  428 + /** 待导入excel workbook对象 */
  429 + private Workbook excelWorkBook;
  430 + /** 待导入excel workbook工作区对象 */
  431 + private Sheet excelWorkBookSheet;
  432 + /** ktr转换所需参数对象 */
  433 + private Map<String, Object> ktrParams = new HashMap<>();
  434 +
  435 + public TimetableExcelData build() throws ScheduleException {
  436 + // 0、验证策略类
  437 + Assert.notNull(this.timetableExcelDataImportStrategy, "时刻表excel导入策略类为空!");
  438 +
  439 + // 注意:这里不做其他验证,业务上导入前必须验证的(调用验证用的builder)
  440 + File file = new File(this.excelFilePath);
  441 + DataToolsFile dataToolsFile = new DataToolsFile();
  442 + dataToolsFile.setFile(file);
  443 + if (DataToolsFileType.XLS.isThisType(file)) {
  444 + dataToolsFile.setFileType(DataToolsFileType.XLS);
  445 + } else if (DataToolsFileType.XLSX.isThisType(file)) {
  446 + dataToolsFile.setFileType(DataToolsFileType.XLSX);
  447 + }
  448 + this.excelWorkBook = dataToolsFile.getFileType().getWorkBook(dataToolsFile.getFile());
  449 + this.excelWorkBookSheet = this.excelWorkBook.getSheet(this.excelSheetName);
  450 +
  451 + // 设置ktr转换参数
  452 + this.ktrParams.put("erroroutputdir", this.dataToolsProperties.getTransErrordir()); // 错误文件输出路径
  453 + this.ktrParams.put("sheetname", this.excelSheetName); // sheet工作区的名字
  454 + this.ktrParams.put("lineinfoid", this.lineInfoId); // 线路标准id
  455 + this.ktrParams.put("xlname", this.lineName); // 线路名称
  456 + this.ktrParams.put("xlid", this.lineId); // 线路id
  457 + this.ktrParams.put("ttinfoname", this.ttInfoName); // 时刻表名称
  458 + this.ktrParams.put("ttid", this.ttInfoId.intValue()); // 时刻表id
  459 + this.ktrParams.put("lineversion", this.lineRouteVersion); // 站点路由版本
  460 +
  461 + return new TimetableExcelData(this);
  462 + }
  463 + }
  464 +
  465 +}
src/main/java/com/bsth/service/schedule/timetable/TimetableExcelFormatType.java 0 → 100644
  1 +package com.bsth.service.schedule.timetable;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonCreator;
  4 +import com.fasterxml.jackson.annotation.JsonValue;
  5 +import org.springframework.util.Assert;
  6 +
  7 +import java.util.HashMap;
  8 +import java.util.Map;
  9 +
  10 +/**
  11 + * 时刻表excel格式类型。
  12 + */
  13 +public enum TimetableExcelFormatType {
  14 + Normal("normal"), // 一般格式
  15 + NormalWithGs("normalWithGs"), // 一般格式(路牌列后加一列工时列)
  16 + Dynamic("dynamic"); // 自动生成时刻表的导出格式
  17 +
  18 + private static Map<String, TimetableExcelFormatType> descMapEnum = new HashMap<>();
  19 + static {
  20 + descMapEnum.put("normal", Normal);
  21 + descMapEnum.put("normalWithGs", NormalWithGs);
  22 + descMapEnum.put("dynamic", Dynamic);
  23 + }
  24 +
  25 + private String desc;
  26 + @JsonValue
  27 + public String getDesc() {
  28 + return desc;
  29 + }
  30 +
  31 + public void setDesc(String desc) {
  32 + this.desc = desc;
  33 + }
  34 +
  35 + @JsonCreator
  36 + TimetableExcelFormatType(String desc) {
  37 + this.desc = desc;
  38 + }
  39 +
  40 + public static TimetableExcelFormatType fromDesc(String desc) {
  41 + Assert.hasText(desc, "excel导入格式为空!");
  42 + Assert.notNull(descMapEnum.get(desc), "未知的excel导入格式[" + desc + "]!");
  43 + return descMapEnum.get(desc);
  44 + }
  45 +}
src/main/java/com/bsth/service/schedule/timetable/strategy/TimetableExcelDataImportStrategy.java 0 → 100644
  1 +package com.bsth.service.schedule.timetable.strategy;
  2 +
  3 +import com.bsth.service.schedule.exception.ScheduleException;
  4 +import com.bsth.service.schedule.timetable.TimetableExcelFormatType;
  5 +import com.bsth.service.schedule.timetable.TimetableExcelData.TimetableExcelInternalCell;
  6 +import com.bsth.service.schedule.utils.DataToolsProperties;
  7 +import com.bsth.service.schedule.utils.DataToolsService;
  8 +import org.apache.poi.ss.usermodel.Sheet;
  9 +
  10 +import java.util.Map;
  11 +
  12 +/**
  13 + * 时刻表excel验证策略接口。
  14 + */
  15 +public interface TimetableExcelDataImportStrategy {
  16 + /**
  17 + * 导入excel时刻表。
  18 + * @param excelWorkBookSheet 待导入excel workbook 工作区对象
  19 + * @param excelFilePath 导入的Excel文件路径
  20 + * @param dataToolsService dataToolsService
  21 + * @param dataToolsProperties dataToolsProperties
  22 + * @param ktrParams ktr转换所需参数对象
  23 + * @param internalExcelCells 内部Excel单元格二维数组
  24 + * @param timetableExcelFormatType 时刻表excel格式
  25 + * @throws ScheduleException 导入异常
  26 + */
  27 + void doImport(
  28 + Sheet excelWorkBookSheet,
  29 + String excelFilePath,
  30 + DataToolsService dataToolsService,
  31 + DataToolsProperties dataToolsProperties,
  32 + Map<String, Object> ktrParams,
  33 + TimetableExcelInternalCell[][] internalExcelCells,
  34 + TimetableExcelFormatType timetableExcelFormatType
  35 + ) throws ScheduleException;
  36 +}
src/main/java/com/bsth/service/schedule/timetable/strategy/TimetableExcelDataValidateStrategy.java 0 → 100644
  1 +package com.bsth.service.schedule.timetable.strategy;
  2 +
  3 +import com.bsth.entity.Line;
  4 +import com.bsth.entity.LsStationRoute;
  5 +import com.bsth.entity.schedule.GuideboardInfo;
  6 +import com.bsth.service.schedule.exception.ScheduleException;
  7 +import com.bsth.service.schedule.timetable.TimetableExcelData.TimetableExcelInternalCell;
  8 +import com.bsth.service.schedule.timetable.TimetableExcelFormatType;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 时刻表excel验证策略接口。
  14 + */
  15 +public interface TimetableExcelDataValidateStrategy {
  16 + /**
  17 + * 验证excel时刻表。
  18 + * @param internalExcelCells 内部Excel单元格二维数组
  19 + * @param timetableExcelFormatType 时刻表excel格式
  20 + * @param line 线路信息
  21 + * @param lsStationRouteList 线路站点路由列表(包含上下行的起终点站)
  22 + * @param guideBoardInfoList 路牌列表
  23 + * @throws ScheduleException 验证异常
  24 + */
  25 + void doValidate(
  26 + TimetableExcelInternalCell[][] internalExcelCells,
  27 + TimetableExcelFormatType timetableExcelFormatType,
  28 + Line line,
  29 + List<LsStationRoute> lsStationRouteList,
  30 + List<GuideboardInfo> guideBoardInfoList
  31 + ) throws ScheduleException;
  32 +}
src/main/java/com/bsth/service/schedule/timetable/strategy/impl/TimetableExcelDataImportStrategyImpl.java 0 → 100644
  1 +package com.bsth.service.schedule.timetable.strategy.impl;
  2 +
  3 +import com.bsth.service.schedule.exception.ScheduleException;
  4 +import com.bsth.service.schedule.timetable.TimetableExcelData.TimetableExcelInternalCell;
  5 +import com.bsth.service.schedule.timetable.TimetableExcelFormatType;
  6 +import com.bsth.service.schedule.timetable.strategy.TimetableExcelDataImportStrategy;
  7 +import com.bsth.service.schedule.utils.DataToolsProperties;
  8 +import com.bsth.service.schedule.utils.DataToolsService;
  9 +import jxl.write.Label;
  10 +import jxl.write.WritableSheet;
  11 +import jxl.write.WritableWorkbook;
  12 +import org.apache.commons.lang3.StringUtils;
  13 +import org.apache.poi.ss.usermodel.Sheet;
  14 +import org.slf4j.Logger;
  15 +import org.slf4j.LoggerFactory;
  16 +
  17 +import java.io.File;
  18 +import java.util.ArrayList;
  19 +import java.util.List;
  20 +import java.util.Map;
  21 +
  22 +/**
  23 + * 时刻表excel导入策略实现。
  24 + */
  25 +public class TimetableExcelDataImportStrategyImpl implements TimetableExcelDataImportStrategy {
  26 + /** 日志记录器 */
  27 + private final static Logger LOG = LoggerFactory.getLogger(TimetableExcelDataImportStrategyImpl.class);
  28 +
  29 + @Override
  30 + public void doImport(
  31 + Sheet excelWorkBookSheet,
  32 + String excelFilePath,
  33 + DataToolsService dataToolsService,
  34 + DataToolsProperties dataToolsProperties,
  35 + Map<String, Object> ktrParams,
  36 + TimetableExcelInternalCell[][] internalExcelCells,
  37 + TimetableExcelFormatType timetableExcelFormatType
  38 + ) throws ScheduleException {
  39 + // 注意:这里不做验证,业务上导入前必须验证的(调用验证用的builder)
  40 +
  41 + // 1、创建内部单元格数据
  42 + // 1-1、计算第一行,并设置单元格属性
  43 + for (int colNum = 0; colNum < internalExcelCells[0].length; colNum ++) {
  44 + TimetableExcelInternalCell cell = internalExcelCells[0][colNum];
  45 + cell.isHeadCell = true;
  46 +
  47 + // 2-1-1、第一行,第一列为路牌
  48 + if (colNum == 0) {
  49 + cell.isLpNameCell = true;
  50 + continue;
  51 + }
  52 + // 2-1-1-1、第一行,第二列可能是工时
  53 + if (colNum == 1 && timetableExcelFormatType == TimetableExcelFormatType.NormalWithGs) {
  54 + cell.isGsCell = true;
  55 + continue;
  56 + }
  57 +
  58 + // 2-1-2、如果导入格式是Dynamic,忽略指定列
  59 + if (timetableExcelFormatType == TimetableExcelFormatType.Dynamic) {
  60 + if ("报到".equals(cell.cellContent) ||
  61 + "到场".equals(cell.cellContent) ||
  62 + "离场".equals(cell.cellContent) ||
  63 + "总公里".equals(cell.cellContent) ||
  64 + "营业公里".equals(cell.cellContent) ||
  65 + "空驶公里".equals(cell.cellContent) ||
  66 + "总工时".equals(cell.cellContent) ||
  67 + "营业工时".equals(cell.cellContent) ||
  68 + "营运班次".equals(cell.cellContent)) {
  69 + // 这些列都忽略,不参与计算
  70 + cell.isEnable = false;
  71 + }
  72 + }
  73 +
  74 + }
  75 +
  76 + // 1-2、根据第一行的单元格验证后的设置的属性,设置其余行单元格的属性
  77 + for (int rowNum = 1; rowNum < internalExcelCells.length; rowNum ++) {
  78 + for (int colNum = 0; colNum < internalExcelCells[rowNum].length; colNum ++) {
  79 + TimetableExcelInternalCell cell = internalExcelCells[rowNum][colNum];
  80 + TimetableExcelInternalCell firstRowCell = internalExcelCells[0][colNum];
  81 + if (firstRowCell.isEnable) {
  82 + cell.isLpNameCell = firstRowCell.isLpNameCell;
  83 + cell.isGsCell = firstRowCell.isGsCell;
  84 + }
  85 + }
  86 + }
  87 +
  88 + // 2、重新构造一个新的单元格数组,去除enable=false的,根据类型合并路牌和工时
  89 + List<List<TimetableExcelInternalCell>> newEnabledExcelCells = new ArrayList<>();
  90 + for (int rowNum = 0; rowNum < internalExcelCells.length; rowNum ++) {
  91 + List<TimetableExcelInternalCell> newEnabledExcelRowCells = new ArrayList<>();
  92 + newEnabledExcelCells.add(newEnabledExcelRowCells);
  93 +
  94 + for (int colNum = 0; colNum < internalExcelCells[rowNum].length; colNum ++) {
  95 + TimetableExcelInternalCell cell = internalExcelCells[rowNum][colNum];
  96 + if (!cell.isEnable) {
  97 + continue;
  98 + }
  99 + if (cell.isGsCell) { // 如果匹配到工时单元格,需要合并到前一个单元格中
  100 + // 前一个单元格就是当前已经保存的行单元格列表的最后一个
  101 + TimetableExcelInternalCell preNewEnabledCell =
  102 + newEnabledExcelRowCells.get(newEnabledExcelRowCells.size() - 1);
  103 + // 合并成 路牌1->工时1 这种格式
  104 + preNewEnabledCell.cellContent = preNewEnabledCell.cellContent + "->" + cell.cellContent;
  105 + } else {
  106 + newEnabledExcelRowCells.add(cell);
  107 + }
  108 + }
  109 + }
  110 +
  111 + // 3、计算其他ktr参数
  112 + // 3-1、计算字段名相关参数
  113 + List<String> columnNames = new ArrayList<>();
  114 + for (int colNum = 0; colNum < newEnabledExcelCells.get(0).size(); colNum ++) {
  115 + TimetableExcelInternalCell cell = newEnabledExcelCells.get(0).get(colNum);
  116 + if (colNum == 0) {
  117 + columnNames.add(cell.cellContent);
  118 + } else {
  119 + columnNames.add(cell.cellContent + "->" + colNum);
  120 + }
  121 + }
  122 +
  123 + LOG.info("表头参数={}", StringUtils.join(columnNames.toArray(), ","));
  124 + ktrParams.put("excelfieldnames", StringUtils.join(columnNames.toArray(), ",")); // 时刻表excel输入字段名,以逗号连接
  125 + columnNames.remove(0);
  126 + ktrParams.put("normalizefieldnames", StringUtils.join(columnNames.toArray(), ",")); // 数据范式化字段名,以逗号连接
  127 +
  128 + // 3-2、计算excel内容文件参数
  129 + File fileCal = new File(excelFilePath + "_stringType.xls");
  130 + try {
  131 + WritableWorkbook writableWorkbook = jxl.Workbook.createWorkbook(fileCal);
  132 + WritableSheet sheet1 = writableWorkbook.createSheet(excelWorkBookSheet.getSheetName(), 0);
  133 + for (int rowNum = 0; rowNum < newEnabledExcelCells.size(); rowNum ++) {
  134 + for (int colNum = 0; colNum < newEnabledExcelCells.get(rowNum).size(); colNum ++) {
  135 + TimetableExcelInternalCell cell = newEnabledExcelCells.get(rowNum).get(colNum);
  136 + sheet1.addCell(new Label(colNum, rowNum, cell.cellContent));
  137 + }
  138 + }
  139 + writableWorkbook.write();
  140 + writableWorkbook.close();
  141 + ktrParams.put("filepath", fileCal.getAbsolutePath());
  142 + } catch (Exception exp) {
  143 + exp.printStackTrace();
  144 + throw new ScheduleException("导入时刻表异常!");
  145 + }
  146 +
  147 + // 3-3、计算ktr路径相关参数
  148 + try {
  149 + // 元数据ktr
  150 + File mktrFile = new File(this.getClass().getResource(
  151 + dataToolsProperties.getTtinfodetailMetadatainputktr()).toURI());
  152 + ktrParams.put("transpath", mktrFile.getAbsolutePath());
  153 +
  154 + // 实际数据ktr
  155 + if (timetableExcelFormatType == TimetableExcelFormatType.Normal) {
  156 + File normal_ktrFile = new File(this.getClass().getResource(
  157 + dataToolsProperties.getTtinfodetailDatainputktr2version()).toURI());
  158 + ktrParams.put("injectktrfile", normal_ktrFile.getAbsolutePath());
  159 + } else if (timetableExcelFormatType == TimetableExcelFormatType.NormalWithGs) {
  160 + File noramlwithgs_ktrFile = new File(this.getClass().getResource(
  161 + dataToolsProperties.getTtinfodetailDatainputktr2normalwithgs()).toURI());
  162 + ktrParams.put("injectktrfile", noramlwithgs_ktrFile.getAbsolutePath());
  163 + } else if (timetableExcelFormatType == TimetableExcelFormatType.Dynamic) {
  164 + File dynamic_ktrFile = new File(this.getClass().getResource(
  165 + dataToolsProperties.getTtinfodetailDatainputktr2version2()).toURI());
  166 + ktrParams.put("injectktrfile", dynamic_ktrFile.getAbsolutePath());
  167 + } else {
  168 + throw new ScheduleException("未知的TimetableExcelFormatType格式[" + timetableExcelFormatType + "]");
  169 + }
  170 +
  171 + } catch (Exception exp) {
  172 + exp.printStackTrace();
  173 + throw new ScheduleException("导入时刻表异常!");
  174 + }
  175 +
  176 + // 3-4、执行ktr
  177 + dataToolsService.importData(fileCal, ktrParams);
  178 + }
  179 +}
src/main/java/com/bsth/service/schedule/timetable/strategy/impl/TimetableExcelDataValidateStrategyImpl.java 0 → 100644
  1 +package com.bsth.service.schedule.timetable.strategy.impl;
  2 +
  3 +import com.bsth.entity.Line;
  4 +import com.bsth.entity.LsStationRoute;
  5 +import com.bsth.entity.schedule.GuideboardInfo;
  6 +import com.bsth.service.schedule.exception.ScheduleException;
  7 +import com.bsth.service.schedule.timetable.TimetableExcelFormatType;
  8 +import com.bsth.service.schedule.timetable.TimetableExcelData.TimetableExcelInternalCell;
  9 +import com.bsth.service.schedule.timetable.strategy.TimetableExcelDataValidateStrategy;
  10 +import org.apache.commons.lang3.StringUtils;
  11 +import org.springframework.util.CollectionUtils;
  12 +
  13 +import java.util.ArrayList;
  14 +import java.util.HashMap;
  15 +import java.util.List;
  16 +import java.util.Map;
  17 +import java.util.regex.Matcher;
  18 +import java.util.regex.Pattern;
  19 +
  20 +/**
  21 + * 时刻表excel验证策略实现类。
  22 + */
  23 +public class TimetableExcelDataValidateStrategyImpl implements TimetableExcelDataValidateStrategy {
  24 + // 使用第一行单元格的属性设其他行单元格的属性
  25 + private void setInternalExcelCellPropertyWithFirstRowCell(TimetableExcelInternalCell[][] internalExcelCells) {
  26 + for (int rowNum = 1; rowNum < internalExcelCells.length; rowNum ++) {
  27 + for (int colNum = 0; colNum < internalExcelCells[rowNum].length; colNum ++) {
  28 + TimetableExcelInternalCell cell = internalExcelCells[rowNum][colNum];
  29 + TimetableExcelInternalCell firstRowCell = internalExcelCells[0][colNum];
  30 + if (firstRowCell.isEnable) {
  31 + cell.isBc = firstRowCell.isBc;
  32 + cell.isInBc = firstRowCell.isInBc;
  33 + cell.isOutBc = firstRowCell.isOutBc;
  34 +
  35 + cell.isLpNameCell = firstRowCell.isLpNameCell;
  36 + cell.isFcsjCell = firstRowCell.isFcsjCell;
  37 + cell.isGsCell = firstRowCell.isGsCell;
  38 + }
  39 + }
  40 + }
  41 + }
  42 +
  43 + // 验证路由名字cell
  44 + private void validateRouteContentCell(
  45 + int colNum,
  46 + String routeName,
  47 + Line line,
  48 + List<LsStationRoute> lsStationRouteList) throws ScheduleException {
  49 + if (StringUtils.isEmpty(routeName)) {
  50 + throw new ScheduleException(String.format("第1行,第%d列数据不能为空", colNum + 1));
  51 + }
  52 +
  53 + List<LsStationRoute> lsStationRoutes = new ArrayList<>();
  54 + for (LsStationRoute lsStationRoute : lsStationRouteList) {
  55 + if ("B".equals(lsStationRoute.getStationMark()) && routeName.equals(lsStationRoute.getStationName())) {
  56 + lsStationRoutes.add(lsStationRoute);
  57 + }
  58 + }
  59 +
  60 + if (CollectionUtils.isEmpty(lsStationRoutes)) {
  61 + throw new ScheduleException(String.format("第1行,第%d列数据%s在%s站点路由中不是起点站",
  62 + colNum + 1, routeName, line.getName()));
  63 + } else if (lsStationRoutes.size() > 1) {
  64 + throw new ScheduleException(String.format("第1行,第%d列数据%s在%s站点路由中上下行都是起点站",
  65 + colNum + 1, routeName, line.getName()));
  66 + } else if (StringUtils.isEmpty(lsStationRoutes.get(0).getStationCode())) {
  67 + throw new ScheduleException(String.format("第1行,第%d列数据%s在%s站点路由中没有站点编码",
  68 + colNum + 1, routeName, line.getName()));
  69 + }
  70 +
  71 + }
  72 +
  73 + // 验证路牌名字cell
  74 + private void validateGuideboardContentCell(
  75 + int rowNum,
  76 + String guideboardName,
  77 + Line line,
  78 + List<GuideboardInfo> guideboardInfoList) throws ScheduleException {
  79 + if (StringUtils.isEmpty(guideboardName)) {
  80 + throw new ScheduleException(String.format("第%d行,第1列路牌无数据", rowNum + 1));
  81 + }
  82 +
  83 + List<GuideboardInfo> guideboardInfos = new ArrayList<>();
  84 + for (GuideboardInfo guideboardInfo : guideboardInfoList) {
  85 + if (guideboardName.equals(guideboardInfo.getLpName())) {
  86 + guideboardInfos.add(guideboardInfo);
  87 + }
  88 + }
  89 +
  90 + if (CollectionUtils.isEmpty(guideboardInfos)) {
  91 + throw new ScheduleException(String.format("第%d行,第1列的路牌在%s中不存在",
  92 + rowNum + 1, line.getName()));
  93 + } else if (guideboardInfos.size() > 1) {
  94 + throw new ScheduleException(String.format("第%d行,第1列的路牌在%s中重复",
  95 + rowNum + 1, line.getName()));
  96 + }
  97 + }
  98 +
  99 + // Normal,NormalWithGs格式下的发车时间格式
  100 + private static Pattern p1 = Pattern.compile("^([01]?[0-9]|2[0-3]):[0-5][0-9]$"); // hh:mm格式
  101 + private static Pattern p2 = Pattern.compile("^([01]?[0-9]|2[0-3]),[0-5][0-9]$"); // hh,mm格式
  102 + private static Pattern p3 = Pattern.compile("^([01]?[0-9]|2[0-3])[0-5][0-9]$"); // hhmm格式
  103 + // Dynamic格式下的发车时间格式
  104 + private static Pattern p1_1 = Pattern.compile("^([\u62a5]|[\u51fa])?([01]?[0-9]|2[0-3]):[0-5][0-9]$"); // (报|出)hh:mm格式
  105 + private static Pattern p2_1 = Pattern.compile("^([01]?[0-9]|2[0-3]):[0-5][0-9]([X]|[\u203b])?$"); // hh:mm(X|※)格式
  106 + // 验证发车时间cell
  107 + private void validateFcsjContentCell(
  108 + int rowNum,
  109 + int colNum,
  110 + String fcsjContent, TimetableExcelFormatType timetableExcelFormatType) throws ScheduleException {
  111 + if (timetableExcelFormatType == TimetableExcelFormatType.Normal ||
  112 + timetableExcelFormatType == TimetableExcelFormatType.NormalWithGs) {
  113 + Matcher m1 = p1.matcher(fcsjContent.trim());
  114 + Matcher m2 = p2.matcher(fcsjContent.trim());
  115 + Matcher m3 = p3.matcher(fcsjContent.trim());
  116 + boolean expected = m1.matches() || m2.matches() || m3.matches();
  117 + if (!expected) {
  118 + throw new ScheduleException(String.format("第%d行,第%d列的发车时间格式不正确,格式应为hh:mm或hh,mm或hhmm",
  119 + rowNum + 1, colNum + 1));
  120 + }
  121 + } else if (timetableExcelFormatType == TimetableExcelFormatType.Dynamic) {
  122 + Matcher m1 = p1_1.matcher(fcsjContent.trim());
  123 + Matcher m2 = p2_1.matcher(fcsjContent.trim());
  124 + boolean expected = m1.matches() || m2.matches();
  125 + if (!expected) {
  126 + throw new ScheduleException(String.format(
  127 + "第%d行,第%d列的发车时间格式不正确,格式应为(报|出)hh:mm或hh:mm(X|※)",
  128 + rowNum + 1, colNum + 1));
  129 + }
  130 + } else {
  131 + throw new ScheduleException(String.format("未知的导入格式[%s]", timetableExcelFormatType.getDesc()));
  132 + }
  133 + }
  134 +
  135 + private static Pattern p5 = Pattern.compile("^[-\\+]?[.\\d]*$"); // 浮点数
  136 + // 验证工时cell
  137 + private void validateGsContentCell(int rowNum, int colNum, String gsContent) throws ScheduleException {
  138 + Matcher m1 = p5.matcher(gsContent.trim());
  139 + boolean expected = m1.matches();
  140 + if (!expected) {
  141 + throw new ScheduleException(String.format("第%d行,第%d列的工时格式不正确,格式应为整数或浮点数",
  142 + rowNum + 1, colNum + 1));
  143 + }
  144 + Double gs = new Double(gsContent.trim());
  145 + if (gs < 0) {
  146 + throw new ScheduleException(String.format("第%d行,第%d列的工时值必须大于0",
  147 + rowNum + 1, colNum + 1));
  148 + }
  149 + }
  150 +
  151 + /**
  152 + * 验证excel时刻表。
  153 + * @param internalExcelCells 内部Excel单元格二维数组
  154 + * @param timetableExcelFormatType 时刻表excel格式
  155 + * @param line 线路信息
  156 + * @param lsStationRouteList 线路站点路由列表(包含上下行的起终点站)
  157 + * @param guideBoardInfoList 路牌列表
  158 + * @throws ScheduleException 验证异常
  159 + */
  160 + @Override
  161 + public void doValidate(
  162 + TimetableExcelInternalCell[][] internalExcelCells,
  163 + TimetableExcelFormatType timetableExcelFormatType,
  164 + Line line,
  165 + List<LsStationRoute> lsStationRouteList,
  166 + List<GuideboardInfo> guideBoardInfoList) throws ScheduleException {
  167 + // 1、验证数据行,列
  168 + int rowCount = internalExcelCells.length;
  169 + int colCount = internalExcelCells[0].length;
  170 + if (rowCount <= 1 || colCount <= 1) {
  171 + throw new ScheduleException("工作区至少包含2行2列的数据");
  172 + }
  173 +
  174 + // 2、验证单元格信息
  175 + // 2-1、验证第1行数据(表头行数据)
  176 + for (int colNum = 0; colNum < colCount; colNum ++) {
  177 + TimetableExcelInternalCell cell = internalExcelCells[0][colNum];
  178 + cell.isHeadCell = true;
  179 +
  180 + // 2-1-1、第一行,第一列必须路牌2个字
  181 + if (colNum == 0) {
  182 + if (!"路牌".equals(cell.cellContent)) {
  183 + throw new ScheduleException("第1行,第1列数据必须是路牌2个字");
  184 + }
  185 + cell.isLpNameCell = true;
  186 + continue;
  187 + }
  188 + // 2-1-1-1、如果导入格式是NormalWithGs,第一行,第二列必须工时2个字
  189 + if (colNum == 1 && timetableExcelFormatType == TimetableExcelFormatType.NormalWithGs) {
  190 + if (!"工时".equals(cell.cellContent)) {
  191 + throw new ScheduleException("第1行,第2列数据必须是工时2个字");
  192 + }
  193 + cell.isGsCell = true;
  194 + continue;
  195 + }
  196 +
  197 + // 2-1-2、如果导入格式是Dynamic,忽略指定列
  198 + if (timetableExcelFormatType == TimetableExcelFormatType.Dynamic) {
  199 + if ("报到".equals(cell.cellContent) ||
  200 + "到场".equals(cell.cellContent) ||
  201 + "离场".equals(cell.cellContent) ||
  202 + "总公里".equals(cell.cellContent) ||
  203 + "营业公里".equals(cell.cellContent) ||
  204 + "空驶公里".equals(cell.cellContent) ||
  205 + "总工时".equals(cell.cellContent) ||
  206 + "营业工时".equals(cell.cellContent) ||
  207 + "营运班次".equals(cell.cellContent)) {
  208 + // 这些列都忽略,不参与计算
  209 + cell.isEnable = false;
  210 + continue;
  211 + }
  212 + }
  213 +
  214 + // 2-1-3、出场,进场班次,不验证路由
  215 + if ("出场".equals(cell.cellContent)) {
  216 + cell.isBc = true;
  217 + cell.isOutBc = true;
  218 + continue;
  219 + }
  220 + if ("进场".equals(cell.cellContent)) {
  221 + cell.isBc = true;
  222 + cell.isInBc = true;
  223 + continue;
  224 + }
  225 +
  226 + // 2-1-4、其他情况作为站点路由验证
  227 + cell.isBc = true;
  228 + cell.isFcsjCell = true;
  229 + this.validateRouteContentCell(colNum, cell.cellContent, line, lsStationRouteList); // 验证路由名字
  230 +
  231 + }
  232 +
  233 + // 2-2、根据第1行的单元格验证后的设置的属性,设置其余行单元格的属性
  234 + this.setInternalExcelCellPropertyWithFirstRowCell(internalExcelCells);
  235 +
  236 + // 2-3、验证具体路牌单元格(第1列)
  237 + Map<String, Integer> gbIndexMap = new HashMap<>(); // 记录每个路牌在第几行
  238 + for (int rowNum = 1; rowNum < rowCount; rowNum ++) {
  239 + TimetableExcelInternalCell cell = internalExcelCells[rowNum][0];
  240 + if (StringUtils.isEmpty(cell.cellContent)) {
  241 + throw new ScheduleException(String.format("第%d行,第1列路牌无数据", rowNum + 1));
  242 + } else if (gbIndexMap.get(cell.cellContent) != null) {
  243 + throw new ScheduleException(String.format("第%d行,第1列的路牌数据与第%d行,第1列数据重复",
  244 + rowNum + 1,
  245 + gbIndexMap.get(cell.cellContent)));
  246 + } else {
  247 + this.validateGuideboardContentCell(rowNum, cell.cellContent, line, guideBoardInfoList); // 验证路牌名字
  248 + gbIndexMap.put(cell.cellContent, rowNum + 1);
  249 + }
  250 + }
  251 +
  252 + // 2-4、验证其余单元格(第2行,第2列开始)
  253 + for (int rowNum = 1; rowNum < rowCount; rowNum ++) {
  254 + for (int colNum = 1; colNum < colCount; colNum ++) {
  255 + TimetableExcelInternalCell cell = internalExcelCells[rowNum][colNum];
  256 + if (!cell.isEnable) {
  257 + continue;
  258 + }
  259 +
  260 + if (cell.isBc) {
  261 + // 对应路牌对应单元格没有发车班次
  262 + if (StringUtils.isNotEmpty(cell.cellContent)) {
  263 + this.validateFcsjContentCell(rowNum, colNum, cell.cellContent, timetableExcelFormatType);
  264 + }
  265 + } else if (cell.isGsCell) {
  266 + if (StringUtils.isNotEmpty(cell.cellContent)) {
  267 + this.validateGsContentCell(rowNum, colNum, cell.cellContent);
  268 + }
  269 + } else {
  270 + throw new ScheduleException(String.format("第%d行,第%d列的单元格内容既不是发车时间,也不是工时!",
  271 + rowNum + 1, colNum + 1));
  272 + }
  273 + }
  274 + }
  275 + }
  276 +}
src/main/java/com/bsth/service/schedule/utils/DataToolsProperties.java
@@ -87,6 +87,9 @@ public class DataToolsProperties { @@ -87,6 +87,9 @@ public class DataToolsProperties {
87 /** 时刻表明细信息导入2(带版本),使用生成时刻表格式 */ 87 /** 时刻表明细信息导入2(带版本),使用生成时刻表格式 */
88 @NotNull 88 @NotNull
89 private String ttinfodetailDatainputktr2version2; 89 private String ttinfodetailDatainputktr2version2;
  90 + /** 时刻表明细信息导入2,一般格式(路牌列后加一列工时列)参看 TimetableExcelFormatType */
  91 + @NotNull
  92 + private String ttinfodetailDatainputktr2normalwithgs;
90 /** 排班规则信息导入 */ 93 /** 排班规则信息导入 */
91 @NotNull 94 @NotNull
92 private String scheduleruleDatainputktr; 95 private String scheduleruleDatainputktr;
@@ -373,6 +376,14 @@ public class DataToolsProperties { @@ -373,6 +376,14 @@ public class DataToolsProperties {
373 this.ttinfodetailDatainputktr2version2 = ttinfodetailDatainputktr2version2; 376 this.ttinfodetailDatainputktr2version2 = ttinfodetailDatainputktr2version2;
374 } 377 }
375 378
  379 + public String getTtinfodetailDatainputktr2normalwithgs() {
  380 + return ttinfodetailDatainputktr2normalwithgs;
  381 + }
  382 +
  383 + public void setTtinfodetailDatainputktr2normalwithgs(String ttinfodetailDatainputktr2normalwithgs) {
  384 + this.ttinfodetailDatainputktr2normalwithgs = ttinfodetailDatainputktr2normalwithgs;
  385 + }
  386 +
376 public String getVehicleDatasyncktr() { 387 public String getVehicleDatasyncktr() {
377 return vehicleDatasyncktr; 388 return vehicleDatasyncktr;
378 } 389 }
src/main/resources/datatools/config-dev.properties
1 -# 配置数据导入导出用到的配置信息  
2 -  
3 -# 1、kettle配置文件路径(类路径)  
4 -datatools.kettle_properties=/datatools/kettle.properties  
5 -# 2、ktr文件通用配置变量(数据库连接,根据不同的环境需要修正)  
6 -#数据库ip地址  
7 -datatools.kvars_dbip=127.0.0.1  
8 -#数据库用户名  
9 -datatools.kvars_dbuname=root  
10 -#数据库密码  
11 -datatools.kvars_dbpwd=  
12 -#数据库库名  
13 -datatools.kvars_dbdname=control  
14 -  
15 -# 3、上传数据配置信息  
16 -# 上传文件目录配置(根据不同的环境需要修正)  
17 -datatools.fileupload_dir=/Users/xu/resource/project_code/runtime_temp/bsth_control_u_d_files  
18 -# ktr转换文件,中配置的错误输出目录(根据不同的环境需要修正)  
19 -datatools.trans_errordir=/Users/xu/resource/project_code/runtime_temp/bsth_control_u_d_files/erroroutput  
20 -# 临时输出文件目录  
21 -datatools.trans_tempdir=/Users/xu/resource/project_code/runtime_temp/bsth_control_u_d_files/temp  
22 -# 模版文件目录  
23 -datatools.trans_templatedir=/Users/xu/resource/project_code/runtime_temp/bsth_control_u_d_files/template  
24 -  
25 -##---------------------------- 导入数据ktr ----------------------------##  
26 -# 车辆信息导入ktr转换  
27 -datatools.cars_datainputktr=/datatools/ktrs/carsDataInput.ktr  
28 -# 人员信息导入  
29 -datatools.employees_datainputktr=/datatools/ktrs/employeesDataInput.ktr  
30 -# 路牌信息导入  
31 -datatools.guideboards_datainputktr=/datatools/ktrs/guideboardDataInput.ktr  
32 -# 时刻表基础信息导入  
33 -datatools.ttinfo_datainputktr=/datatools/ktrs/ttinfoDataInput.ktr  
34 -# 时刻表明细信息导入(元数据)  
35 -datatools.ttinfodetail_metadatainputktr=/datatools/ktrs/ttinfodetailDataInputMetaData.ktr  
36 -# 时刻表明细编辑用数据  
37 -datatools.ttinfodetail_foreditktr=/datatools/ktrs/ttinfodetailoutputforedit.ktr  
38 -# 时刻表明细信息导入  
39 -datatools.ttinfodetail_datainputktr=/datatools/ktrs/ttinfodetailDataInput.ktr  
40 -# 时刻表明细信息导入2  
41 -datatools.ttinfodetail_datainputktr2=/datatools/ktrs/ttinfodetailDataInput2.ktr  
42 -# 时刻表明细信息导入2(版本化)  
43 -datatools.ttinfodetail_datainputktr2version=/datatools/ktrs/ttinfodetailDataInput2_version.ktr  
44 -# 时刻表明细信息导入2(版本化),使用生成时刻表格式  
45 -datatools.ttinfodetail_datainputktr2version2=/datatools/ktrs/ttinfodetailDataInput2_version_2.ktr  
46 -  
47 -# 车辆配置信息导入  
48 -datatools.carsconfig_datainputktr=/datatools/ktrs/carsConfigDataInput.ktr  
49 -# 人员配置信息导入  
50 -datatools.employeesconfig_datainputktr=/datatools/ktrs/employeesConfigDataInput.ktr  
51 -  
52 -# 排版规则信息导入  
53 -datatools.schedulerule_datainputktr=/datatools/ktrs/scheduleRuleDataInput.ktr  
54 -  
55 -# 4、数据导出配置信息  
56 -# 导出数据文件目录配置(根据不同的环境需要修正)  
57 -datatools.fileoutput_dir=/Users/xu/resource/project_code/runtime_temp/bsth_control_u_d_files  
58 -  
59 -##---------------------------- 导出数据ktr -----------------------------##  
60 -# 车辆信息导出ktr转换  
61 -datatools.cars_dataoutputktr=/datatools/ktrs/carsDataOutput.ktr  
62 -# 人员信息导出ktr转换  
63 -datatools.employees_dataoutputktr=/datatools/ktrs/employeesDataOutput.ktr  
64 -# 时刻表导出元数据ktr转换  
65 -datatools.ttinfodetail_metaoutput=/datatools/ktrs/ttinfodetailDataOutputMetaData.ktr  
66 -# 时刻表导出数据ktr转换  
67 -datatools.ttinfodetail_output=/datatools/ktrs/ttinfodetailDataOutput.ktr  
68 -# 排版规则导出数据ktr转换  
69 -datatools.schedulerule_output=/datatools/ktrs/scheduleRuleDataOutput.ktr  
70 -  
71 -# 车辆配置信息导出ktr转换  
72 -datatools.carsconfig_dataoutputktr=/datatools/ktrs/carsConfigDataOutput.ktr  
73 -# 人员配置信息导出ktr转换  
74 -datatools.employeesconfig_dataoutputktr=/datatools/ktrs/employeesConfigDataOutput.ktr  
75 -  
76 -# 路牌信息导出  
77 -datatools.guideboards_dataoutputktr=/datatools/ktrs/guideboardDataOutput.ktr  
78 -  
79 -  
80 -##--------------------------- 数据同步ktr ------------------------##  
81 -datatools.vehicle_datasyncktr=/datatools/ktrs/vehicleDataSync.ktr  
82 -  
83 -# TODO:  
84 -  
85 -  
86 -  
87 -  
88 -  
89 -  
90 -  
91 - 1 +# 配置数据导入导出用到的配置信息
  2 +
  3 +# 1、kettle配置文件路径(类路径)
  4 +datatools.kettle_properties=/datatools/kettle.properties
  5 +# 2、ktr文件通用配置变量(数据库连接,根据不同的环境需要修正)
  6 +#数据库ip地址
  7 +datatools.kvars_dbip=127.0.0.1
  8 +#数据库用户名
  9 +datatools.kvars_dbuname=root
  10 +#数据库密码
  11 +datatools.kvars_dbpwd=
  12 +#数据库库名
  13 +datatools.kvars_dbdname=control
  14 +
  15 +# 3、上传数据配置信息
  16 +# 上传文件目录配置(根据不同的环境需要修正)
  17 +datatools.fileupload_dir=/Users/xu/resource/project_code/runtime_temp/bsth_control_u_d_files
  18 +# ktr转换文件,中配置的错误输出目录(根据不同的环境需要修正)
  19 +datatools.trans_errordir=/Users/xu/resource/project_code/runtime_temp/bsth_control_u_d_files/erroroutput
  20 +# 临时输出文件目录
  21 +datatools.trans_tempdir=/Users/xu/resource/project_code/runtime_temp/bsth_control_u_d_files/temp
  22 +# 模版文件目录
  23 +datatools.trans_templatedir=/Users/xu/resource/project_code/runtime_temp/bsth_control_u_d_files/template
  24 +
  25 +##---------------------------- 导入数据ktr ----------------------------##
  26 +# 车辆信息导入ktr转换
  27 +datatools.cars_datainputktr=/datatools/ktrs/carsDataInput.ktr
  28 +# 人员信息导入
  29 +datatools.employees_datainputktr=/datatools/ktrs/employeesDataInput.ktr
  30 +# 路牌信息导入
  31 +datatools.guideboards_datainputktr=/datatools/ktrs/guideboardDataInput.ktr
  32 +# 时刻表基础信息导入
  33 +datatools.ttinfo_datainputktr=/datatools/ktrs/ttinfoDataInput.ktr
  34 +# 时刻表明细信息导入(元数据)
  35 +datatools.ttinfodetail_metadatainputktr=/datatools/ktrs/ttinfodetailDataInputMetaData.ktr
  36 +# 时刻表明细编辑用数据
  37 +datatools.ttinfodetail_foreditktr=/datatools/ktrs/ttinfodetailoutputforedit.ktr
  38 +# 时刻表明细信息导入
  39 +datatools.ttinfodetail_datainputktr=/datatools/ktrs/ttinfodetailDataInput.ktr
  40 +# 时刻表明细信息导入2
  41 +datatools.ttinfodetail_datainputktr2=/datatools/ktrs/ttinfodetailDataInput2.ktr
  42 +# 时刻表明细信息导入2(版本化)
  43 +datatools.ttinfodetail_datainputktr2version=/datatools/ktrs/ttinfodetailDataInput2_version.ktr
  44 +# 时刻表明细信息导入2(版本化),使用生成时刻表格式
  45 +datatools.ttinfodetail_datainputktr2version2=/datatools/ktrs/ttinfodetailDataInput2_version_2.ktr
  46 +# 时刻表明细信息导入2,一般格式(路牌列后加一列工时列)
  47 +datatools.ttinfodetail_datainputktr2normalwithgs=/datatools/ktrs/ttinfodetailDataInput2_normalwithgs.ktr
  48 +
  49 +# 车辆配置信息导入
  50 +datatools.carsconfig_datainputktr=/datatools/ktrs/carsConfigDataInput.ktr
  51 +# 人员配置信息导入
  52 +datatools.employeesconfig_datainputktr=/datatools/ktrs/employeesConfigDataInput.ktr
  53 +
  54 +# 排版规则信息导入
  55 +datatools.schedulerule_datainputktr=/datatools/ktrs/scheduleRuleDataInput.ktr
  56 +
  57 +# 4、数据导出配置信息
  58 +# 导出数据文件目录配置(根据不同的环境需要修正)
  59 +datatools.fileoutput_dir=/Users/xu/resource/project_code/runtime_temp/bsth_control_u_d_files
  60 +
  61 +##---------------------------- 导出数据ktr -----------------------------##
  62 +# 车辆信息导出ktr转换
  63 +datatools.cars_dataoutputktr=/datatools/ktrs/carsDataOutput.ktr
  64 +# 人员信息导出ktr转换
  65 +datatools.employees_dataoutputktr=/datatools/ktrs/employeesDataOutput.ktr
  66 +# 时刻表导出元数据ktr转换
  67 +datatools.ttinfodetail_metaoutput=/datatools/ktrs/ttinfodetailDataOutputMetaData.ktr
  68 +# 时刻表导出数据ktr转换
  69 +datatools.ttinfodetail_output=/datatools/ktrs/ttinfodetailDataOutput.ktr
  70 +# 排版规则导出数据ktr转换
  71 +datatools.schedulerule_output=/datatools/ktrs/scheduleRuleDataOutput.ktr
  72 +
  73 +# 车辆配置信息导出ktr转换
  74 +datatools.carsconfig_dataoutputktr=/datatools/ktrs/carsConfigDataOutput.ktr
  75 +# 人员配置信息导出ktr转换
  76 +datatools.employeesconfig_dataoutputktr=/datatools/ktrs/employeesConfigDataOutput.ktr
  77 +
  78 +# 路牌信息导出
  79 +datatools.guideboards_dataoutputktr=/datatools/ktrs/guideboardDataOutput.ktr
  80 +
  81 +
  82 +##--------------------------- 数据同步ktr ------------------------##
  83 +datatools.vehicle_datasyncktr=/datatools/ktrs/vehicleDataSync.ktr
  84 +
  85 +# TODO:
  86 +
  87 +
  88 +
  89 +
  90 +
  91 +
  92 +
  93 +
src/main/resources/datatools/config-prod.properties
@@ -44,6 +44,8 @@ datatools.ttinfodetail_datainputktr2=/datatools/ktrs/ttinfodetailDataInput2.ktr @@ -44,6 +44,8 @@ datatools.ttinfodetail_datainputktr2=/datatools/ktrs/ttinfodetailDataInput2.ktr
44 datatools.ttinfodetail_datainputktr2version=/datatools/ktrs/ttinfodetailDataInput2_version.ktr 44 datatools.ttinfodetail_datainputktr2version=/datatools/ktrs/ttinfodetailDataInput2_version.ktr
45 # 时刻表明细信息导入2(版本化),使用生成时刻表格式 45 # 时刻表明细信息导入2(版本化),使用生成时刻表格式
46 datatools.ttinfodetail_datainputktr2version2=/datatools/ktrs/ttinfodetailDataInput2_version_2.ktr 46 datatools.ttinfodetail_datainputktr2version2=/datatools/ktrs/ttinfodetailDataInput2_version_2.ktr
  47 +# 时刻表明细信息导入2,一般格式(路牌列后加一列工时列)
  48 +datatools.ttinfodetail_datainputktr2normalwithgs=/datatools/ktrs/ttinfodetailDataInput2_normalwithgs.ktr
47 49
48 # 车辆配置信息导入 50 # 车辆配置信息导入
49 datatools.carsconfig_datainputktr=/datatools/ktrs/carsConfigDataInput.ktr 51 datatools.carsconfig_datainputktr=/datatools/ktrs/carsConfigDataInput.ktr
src/main/resources/datatools/config-test.properties
@@ -44,6 +44,8 @@ datatools.ttinfodetail_datainputktr2=/datatools/ktrs/ttinfodetailDataInput2.ktr @@ -44,6 +44,8 @@ datatools.ttinfodetail_datainputktr2=/datatools/ktrs/ttinfodetailDataInput2.ktr
44 datatools.ttinfodetail_datainputktr2version=/datatools/ktrs/ttinfodetailDataInput2_version.ktr 44 datatools.ttinfodetail_datainputktr2version=/datatools/ktrs/ttinfodetailDataInput2_version.ktr
45 # 时刻表明细信息导入2(版本化),使用生成时刻表格式 45 # 时刻表明细信息导入2(版本化),使用生成时刻表格式
46 datatools.ttinfodetail_datainputktr2version2=/datatools/ktrs/ttinfodetailDataInput2_version_2.ktr 46 datatools.ttinfodetail_datainputktr2version2=/datatools/ktrs/ttinfodetailDataInput2_version_2.ktr
  47 +# 时刻表明细信息导入2,一般格式(路牌列后加一列工时列)
  48 +datatools.ttinfodetail_datainputktr2normalwithgs=/datatools/ktrs/ttinfodetailDataInput2_normalwithgs.ktr
47 49
48 # 车辆配置信息导入 50 # 车辆配置信息导入
49 datatools.carsconfig_datainputktr=/datatools/ktrs/carsConfigDataInput.ktr 51 datatools.carsconfig_datainputktr=/datatools/ktrs/carsConfigDataInput.ktr
src/main/resources/datatools/ktrs/ttinfodetailDataInput2_normalwithgs.ktr 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<transformation>
  3 + <info>
  4 + <name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x5bfc;&#x5165;-normalWithGs</name>
  5 + <description>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;&#x5bfc;&#x5165;</description>
  6 + <extended_description>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;&#xff0c;&#x5e26;&#x5de5;&#x65f6;&#x7248;&#x672c;&#x5bfc;&#x5165;</extended_description>
  7 + <trans_version/>
  8 + <trans_type>Normal</trans_type>
  9 + <trans_status>0</trans_status>
  10 + <directory>&#x2f;</directory>
  11 + <parameters>
  12 + </parameters>
  13 + <log>
  14 +<trans-log-table><connection/>
  15 +<schema/>
  16 +<table/>
  17 +<size_limit_lines/>
  18 +<interval/>
  19 +<timeout_days/>
  20 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STATUS</id><enabled>Y</enabled><name>STATUS</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name><subject/></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name><subject/></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name><subject/></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name><subject/></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name><subject/></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name><subject/></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>STARTDATE</id><enabled>Y</enabled><name>STARTDATE</name></field><field><id>ENDDATE</id><enabled>Y</enabled><name>ENDDATE</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>DEPDATE</id><enabled>Y</enabled><name>DEPDATE</name></field><field><id>REPLAYDATE</id><enabled>Y</enabled><name>REPLAYDATE</name></field><field><id>LOG_FIELD</id><enabled>Y</enabled><name>LOG_FIELD</name></field><field><id>EXECUTING_SERVER</id><enabled>N</enabled><name>EXECUTING_SERVER</name></field><field><id>EXECUTING_USER</id><enabled>N</enabled><name>EXECUTING_USER</name></field><field><id>CLIENT</id><enabled>N</enabled><name>CLIENT</name></field></trans-log-table>
  21 +<perf-log-table><connection/>
  22 +<schema/>
  23 +<table/>
  24 +<interval/>
  25 +<timeout_days/>
  26 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>SEQ_NR</id><enabled>Y</enabled><name>SEQ_NR</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>INPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>INPUT_BUFFER_ROWS</name></field><field><id>OUTPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>OUTPUT_BUFFER_ROWS</name></field></perf-log-table>
  27 +<channel-log-table><connection/>
  28 +<schema/>
  29 +<table/>
  30 +<timeout_days/>
  31 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>LOGGING_OBJECT_TYPE</id><enabled>Y</enabled><name>LOGGING_OBJECT_TYPE</name></field><field><id>OBJECT_NAME</id><enabled>Y</enabled><name>OBJECT_NAME</name></field><field><id>OBJECT_COPY</id><enabled>Y</enabled><name>OBJECT_COPY</name></field><field><id>REPOSITORY_DIRECTORY</id><enabled>Y</enabled><name>REPOSITORY_DIRECTORY</name></field><field><id>FILENAME</id><enabled>Y</enabled><name>FILENAME</name></field><field><id>OBJECT_ID</id><enabled>Y</enabled><name>OBJECT_ID</name></field><field><id>OBJECT_REVISION</id><enabled>Y</enabled><name>OBJECT_REVISION</name></field><field><id>PARENT_CHANNEL_ID</id><enabled>Y</enabled><name>PARENT_CHANNEL_ID</name></field><field><id>ROOT_CHANNEL_ID</id><enabled>Y</enabled><name>ROOT_CHANNEL_ID</name></field></channel-log-table>
  32 +<step-log-table><connection/>
  33 +<schema/>
  34 +<table/>
  35 +<timeout_days/>
  36 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>LOG_FIELD</id><enabled>N</enabled><name>LOG_FIELD</name></field></step-log-table>
  37 +<metrics-log-table><connection/>
  38 +<schema/>
  39 +<table/>
  40 +<timeout_days/>
  41 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>METRICS_DATE</id><enabled>Y</enabled><name>METRICS_DATE</name></field><field><id>METRICS_CODE</id><enabled>Y</enabled><name>METRICS_CODE</name></field><field><id>METRICS_DESCRIPTION</id><enabled>Y</enabled><name>METRICS_DESCRIPTION</name></field><field><id>METRICS_SUBJECT</id><enabled>Y</enabled><name>METRICS_SUBJECT</name></field><field><id>METRICS_TYPE</id><enabled>Y</enabled><name>METRICS_TYPE</name></field><field><id>METRICS_VALUE</id><enabled>Y</enabled><name>METRICS_VALUE</name></field></metrics-log-table>
  42 + </log>
  43 + <maxdate>
  44 + <connection/>
  45 + <table/>
  46 + <field/>
  47 + <offset>0.0</offset>
  48 + <maxdiff>0.0</maxdiff>
  49 + </maxdate>
  50 + <size_rowset>10000</size_rowset>
  51 + <sleep_time_empty>50</sleep_time_empty>
  52 + <sleep_time_full>50</sleep_time_full>
  53 + <unique_connections>N</unique_connections>
  54 + <feedback_shown>Y</feedback_shown>
  55 + <feedback_size>50000</feedback_size>
  56 + <using_thread_priorities>Y</using_thread_priorities>
  57 + <shared_objects_file/>
  58 + <capture_step_performance>N</capture_step_performance>
  59 + <step_performance_capturing_delay>1000</step_performance_capturing_delay>
  60 + <step_performance_capturing_size_limit>100</step_performance_capturing_size_limit>
  61 + <dependencies>
  62 + </dependencies>
  63 + <partitionschemas>
  64 + </partitionschemas>
  65 + <slaveservers>
  66 + </slaveservers>
  67 + <clusterschemas>
  68 + </clusterschemas>
  69 + <created_user>-</created_user>
  70 + <created_date>2016&#x2f;06&#x2f;30 12&#x3a;21&#x3a;57.536</created_date>
  71 + <modified_user>-</modified_user>
  72 + <modified_date>2016&#x2f;06&#x2f;30 12&#x3a;21&#x3a;57.536</modified_date>
  73 + <key_for_session_key>H4sIAAAAAAAAAAMAAAAAAAAAAAA&#x3d;</key_for_session_key>
  74 + <is_key_private>N</is_key_private>
  75 + </info>
  76 + <notepads>
  77 + <notepad>
  78 + <note>&#x5b57;&#x5178;&#x8868;&#x5bf9;&#x5e94;&#xff08;&#x4ee5;&#x540e;&#x76f4;&#x63a5;&#x67e5;&#x627e;&#x8868; bsth_c_sys_dictionary&#xff09;&#xa;&#x7c7b;&#x578b; &#x4ee3;&#x7801; &#x540d;&#x79f0;&#xa;LineTrend 0 &#x4e0a;&#x884c;&#xa;LineTrend 1 &#x4e0b;&#x884c;&#xa;ScheduleType normal &#x6b63;&#x5e38;&#x73ed;&#x6b21;&#xa;ScheduleType out &#x51fa;&#x573a;&#xa;ScheduleType in &#x8fdb;&#x573a;&#xa;ScheduleType temp &#x4e34;&#x52a0;&#xa;ScheduleType region &#x533a;&#x95f4;&#xa;ScheduleType venting &#x653e;&#x7a7a;&#xa;ScheduleType major &#x653e;&#x5927;&#x7ad9;</note>
  79 + <xloc>606</xloc>
  80 + <yloc>129</yloc>
  81 + <width>332</width>
  82 + <heigth>186</heigth>
  83 + <fontname>YaHei Consolas Hybrid</fontname>
  84 + <fontsize>12</fontsize>
  85 + <fontbold>N</fontbold>
  86 + <fontitalic>N</fontitalic>
  87 + <fontcolorred>0</fontcolorred>
  88 + <fontcolorgreen>0</fontcolorgreen>
  89 + <fontcolorblue>0</fontcolorblue>
  90 + <backgroundcolorred>255</backgroundcolorred>
  91 + <backgroundcolorgreen>205</backgroundcolorgreen>
  92 + <backgroundcolorblue>112</backgroundcolorblue>
  93 + <bordercolorred>100</bordercolorred>
  94 + <bordercolorgreen>100</bordercolorgreen>
  95 + <bordercolorblue>100</bordercolorblue>
  96 + <drawshadow>Y</drawshadow>
  97 + </notepad>
  98 + <notepad>
  99 + <note>&#x56e0;&#x4e3a;&#x65f6;&#x523b;&#x8868;&#x8f93;&#x5165;&#x683c;&#x5f0f;&#x4e0d;&#x786e;&#x5b9a;&#x6027;&#xff0c;&#x4e3b;&#x8981;&#x56e0;&#x4e3a;&#x8868;&#x7ed3;&#x6784;&#x662f;&#x53cd;&#x8303;&#x5f0f;&#x5316;&#x7684;&#xff0c;&#xa;&#x6240;&#x4ee5;&#x9700;&#x8981;&#x5916;&#x90e8;&#x52a8;&#x6001;&#x6307;&#x5b9a;&#x613f;&#x6570;&#x636e;&#xff0c;&#x5934;&#x4e09;&#x4e2a;step&#x52a8;&#x6001;&#x6307;&#x5b9a;&#x613f;&#x6570;&#x636e;&#xa;&#x6ce8;&#x610f;&#xff1a;&#x5bfc;&#x5165;&#x7684;&#x662f;normalWithGs&#x683c;&#x5f0f;&#xff0c;&#x5b57;&#x6bb5;&#x9009;&#x62e9;&#x662f;&#x8def;&#x724c;-&#x3e;&#x683c;&#x5f0f;&#xff0c;&#x9700;&#x8981;&#x62c6;&#x5206;&#x8def;&#x724c;&#x548c;&#x5de5;&#x65f6;&#xa;</note>
  100 + <xloc>71</xloc>
  101 + <yloc>202</yloc>
  102 + <width>456</width>
  103 + <heigth>74</heigth>
  104 + <fontname>YaHei Consolas Hybrid</fontname>
  105 + <fontsize>12</fontsize>
  106 + <fontbold>N</fontbold>
  107 + <fontitalic>N</fontitalic>
  108 + <fontcolorred>0</fontcolorred>
  109 + <fontcolorgreen>0</fontcolorgreen>
  110 + <fontcolorblue>0</fontcolorblue>
  111 + <backgroundcolorred>255</backgroundcolorred>
  112 + <backgroundcolorgreen>205</backgroundcolorgreen>
  113 + <backgroundcolorblue>112</backgroundcolorblue>
  114 + <bordercolorred>100</bordercolorred>
  115 + <bordercolorgreen>100</bordercolorgreen>
  116 + <bordercolorblue>100</bordercolorblue>
  117 + <drawshadow>Y</drawshadow>
  118 + </notepad>
  119 + <notepad>
  120 + <note>&#x8fd9;&#x91cc;&#x6709;&#x4e9b;&#x95ee;&#x9898;&#xa;&#x5728;window2012&#x7684;&#x73af;&#x5883;&#x4e0b;&#xff0c;&#xa;MySql&#x6570;&#x636e;&#x5e93;&#x67e5;&#x8be2;&#x4e2d;&#x5982;&#x679c;&#x8fd4;&#x56de;&#x4e2d;&#x6587;&#x5185;&#x5bb9;&#x7684;&#x5b57;&#x6bb5;&#xff0c;&#x8fd9;&#x4e2a;&#x5185;&#x5bb9;&#x4e71;&#x7801;&#xa;&#x89e3;&#x51b3;&#x529e;&#x6cd5;&#xff0c;&#x5c31;&#x662f;&#x6570;&#x636e;&#x5e93;&#x67e5;&#x8be2;&#x5168;&#x90e8;&#x7f13;&#x5b58;&#xff0c;&#x5c31;&#x4e0d;&#x4e71;&#x7801;&#xa;linux&#x73af;&#x5883;&#x4e0b;&#x6ca1;&#x95ee;&#x9898;</note>
  121 + <xloc>721</xloc>
  122 + <yloc>762</yloc>
  123 + <width>333</width>
  124 + <heigth>90</heigth>
  125 + <fontname>YaHei Consolas Hybrid</fontname>
  126 + <fontsize>12</fontsize>
  127 + <fontbold>N</fontbold>
  128 + <fontitalic>N</fontitalic>
  129 + <fontcolorred>0</fontcolorred>
  130 + <fontcolorgreen>0</fontcolorgreen>
  131 + <fontcolorblue>0</fontcolorblue>
  132 + <backgroundcolorred>255</backgroundcolorred>
  133 + <backgroundcolorgreen>205</backgroundcolorgreen>
  134 + <backgroundcolorblue>112</backgroundcolorblue>
  135 + <bordercolorred>100</bordercolorred>
  136 + <bordercolorgreen>100</bordercolorgreen>
  137 + <bordercolorblue>100</bordercolorblue>
  138 + <drawshadow>Y</drawshadow>
  139 + </notepad>
  140 + <notepad>
  141 + <note>&#x51fa;&#x573a;&#x73ed;&#x6b21;&#xff0c;&#x65b9;&#x5411;&#x6709;&#x65f6;&#x786e;&#x5b9a;&#x4e0d;&#x51c6;&#xff0c;&#xa;&#x7a7a;&#x7684;&#x60c5;&#x51b5;&#x4e0b;&#x8bbe;&#x5b9a;&#x4e3a;0&#xff08;&#x4e0a;&#x884c;&#xff09;</note>
  142 + <xloc>104</xloc>
  143 + <yloc>939</yloc>
  144 + <width>178</width>
  145 + <heigth>42</heigth>
  146 + <fontname>YaHei Consolas Hybrid</fontname>
  147 + <fontsize>12</fontsize>
  148 + <fontbold>N</fontbold>
  149 + <fontitalic>N</fontitalic>
  150 + <fontcolorred>0</fontcolorred>
  151 + <fontcolorgreen>0</fontcolorgreen>
  152 + <fontcolorblue>0</fontcolorblue>
  153 + <backgroundcolorred>255</backgroundcolorred>
  154 + <backgroundcolorgreen>205</backgroundcolorgreen>
  155 + <backgroundcolorblue>112</backgroundcolorblue>
  156 + <bordercolorred>100</bordercolorred>
  157 + <bordercolorgreen>100</bordercolorgreen>
  158 + <bordercolorblue>100</bordercolorblue>
  159 + <drawshadow>Y</drawshadow>
  160 + </notepad>
  161 + <notepad>
  162 + <note>&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#xff0c;&#x65b9;&#x5411;&#x6709;&#x65f6;&#x786e;&#x5b9a;&#x4e0d;&#x51c6;&#xff0c;&#xa;&#x7a7a;&#x7684;&#x60c5;&#x51b5;&#x4e0b;&#x8bbe;&#x5b9a;&#x4e3a;0&#xff08;&#x4e0a;&#x884c;&#xff09;</note>
  163 + <xloc>578</xloc>
  164 + <yloc>1084</yloc>
  165 + <width>178</width>
  166 + <heigth>42</heigth>
  167 + <fontname>YaHei Consolas Hybrid</fontname>
  168 + <fontsize>12</fontsize>
  169 + <fontbold>N</fontbold>
  170 + <fontitalic>N</fontitalic>
  171 + <fontcolorred>0</fontcolorred>
  172 + <fontcolorgreen>0</fontcolorgreen>
  173 + <fontcolorblue>0</fontcolorblue>
  174 + <backgroundcolorred>255</backgroundcolorred>
  175 + <backgroundcolorgreen>205</backgroundcolorgreen>
  176 + <backgroundcolorblue>112</backgroundcolorblue>
  177 + <bordercolorred>100</bordercolorred>
  178 + <bordercolorgreen>100</bordercolorgreen>
  179 + <bordercolorblue>100</bordercolorblue>
  180 + <drawshadow>Y</drawshadow>
  181 + </notepad>
  182 + </notepads>
  183 + <connection>
  184 + <name>192.168.168.1_jwgl_dw</name>
  185 + <server>192.168.168.1</server>
  186 + <type>ORACLE</type>
  187 + <access>Native</access>
  188 + <database>orcl</database>
  189 + <port>1521</port>
  190 + <username>jwgl_dw</username>
  191 + <password>Encrypted 2be98afc86aa7f2e4cb13b977d2adabcd</password>
  192 + <servername/>
  193 + <data_tablespace/>
  194 + <index_tablespace/>
  195 + <attributes>
  196 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  197 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  198 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  199 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  200 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  201 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  202 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  203 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  204 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  205 + </attributes>
  206 + </connection>
  207 + <connection>
  208 + <name>bus_control_variable</name>
  209 + <server>&#x24;&#x7b;v_db_ip&#x7d;</server>
  210 + <type>MYSQL</type>
  211 + <access>Native</access>
  212 + <database>&#x24;&#x7b;v_db_dname&#x7d;</database>
  213 + <port>3306</port>
  214 + <username>&#x24;&#x7b;v_db_uname&#x7d;</username>
  215 + <password>&#x24;&#x7b;v_db_pwd&#x7d;</password>
  216 + <servername/>
  217 + <data_tablespace/>
  218 + <index_tablespace/>
  219 + <attributes>
  220 + <attribute><code>EXTRA_OPTION_MYSQL.characterEncoding</code><attribute>utf8</attribute></attribute>
  221 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  222 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  223 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  224 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  225 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  226 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  227 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  228 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  229 + <attribute><code>STREAM_RESULTS</code><attribute>N</attribute></attribute>
  230 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  231 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  232 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  233 + </attributes>
  234 + </connection>
  235 + <connection>
  236 + <name>bus_control_&#x516c;&#x53f8;_201</name>
  237 + <server>localhost</server>
  238 + <type>MYSQL</type>
  239 + <access>Native</access>
  240 + <database>control</database>
  241 + <port>3306</port>
  242 + <username>root</username>
  243 + <password>Encrypted </password>
  244 + <servername/>
  245 + <data_tablespace/>
  246 + <index_tablespace/>
  247 + <attributes>
  248 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  249 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  250 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  251 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  252 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  253 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  254 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  255 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  256 + <attribute><code>STREAM_RESULTS</code><attribute>N</attribute></attribute>
  257 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  258 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  259 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  260 + </attributes>
  261 + </connection>
  262 + <connection>
  263 + <name>bus_control_&#x672c;&#x673a;</name>
  264 + <server>localhost</server>
  265 + <type>MYSQL</type>
  266 + <access>Native</access>
  267 + <database>control</database>
  268 + <port>3306</port>
  269 + <username>root</username>
  270 + <password>Encrypted </password>
  271 + <servername/>
  272 + <data_tablespace/>
  273 + <index_tablespace/>
  274 + <attributes>
  275 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  276 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  277 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  278 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  279 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  280 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  281 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  282 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  283 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  284 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  285 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  286 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  287 + </attributes>
  288 + </connection>
  289 + <connection>
  290 + <name>control_jndi</name>
  291 + <server/>
  292 + <type>MYSQL</type>
  293 + <access>JNDI</access>
  294 + <database>control_jndi</database>
  295 + <port>1521</port>
  296 + <username/>
  297 + <password>Encrypted </password>
  298 + <servername/>
  299 + <data_tablespace/>
  300 + <index_tablespace/>
  301 + <attributes>
  302 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  303 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  304 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  305 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  306 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  307 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  308 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  309 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  310 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  311 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  312 + </attributes>
  313 + </connection>
  314 + <connection>
  315 + <name>JGJW_VM</name>
  316 + <server>192.168.198.240</server>
  317 + <type>ORACLE</type>
  318 + <access>Native</access>
  319 + <database>orcl</database>
  320 + <port>1521</port>
  321 + <username>jwgl</username>
  322 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10d485a8d6</password>
  323 + <servername/>
  324 + <data_tablespace/>
  325 + <index_tablespace/>
  326 + <attributes>
  327 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  328 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  329 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  330 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  331 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  332 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  333 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  334 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  335 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  336 + </attributes>
  337 + </connection>
  338 + <connection>
  339 + <name>NHJW_VM</name>
  340 + <server>192.168.198.240</server>
  341 + <type>ORACLE</type>
  342 + <access>Native</access>
  343 + <database>orcl</database>
  344 + <port>1521</port>
  345 + <username>nhjw</username>
  346 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10d09aa5cd</password>
  347 + <servername/>
  348 + <data_tablespace/>
  349 + <index_tablespace/>
  350 + <attributes>
  351 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  352 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  353 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  354 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  355 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  356 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  357 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  358 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  359 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  360 + </attributes>
  361 + </connection>
  362 + <connection>
  363 + <name>PDGJ_VM</name>
  364 + <server>192.168.198.240</server>
  365 + <type>ORACLE</type>
  366 + <access>Native</access>
  367 + <database>orcl</database>
  368 + <port>1521</port>
  369 + <username>pdgj</username>
  370 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10ce96a8d0</password>
  371 + <servername/>
  372 + <data_tablespace/>
  373 + <index_tablespace/>
  374 + <attributes>
  375 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  376 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  377 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  378 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  379 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  380 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  381 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  382 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  383 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  384 + </attributes>
  385 + </connection>
  386 + <connection>
  387 + <name>repair_dw_mysql_jndi</name>
  388 + <server/>
  389 + <type>MYSQL</type>
  390 + <access>JNDI</access>
  391 + <database>repair_dw_mysql</database>
  392 + <port>1521</port>
  393 + <username/>
  394 + <password>Encrypted </password>
  395 + <servername/>
  396 + <data_tablespace/>
  397 + <index_tablespace/>
  398 + <attributes>
  399 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  400 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  401 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  402 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  403 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  404 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  405 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  406 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  407 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  408 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  409 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  410 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  411 + </attributes>
  412 + </connection>
  413 + <connection>
  414 + <name>repair_dw&#xff08;&#x672c;&#x673a;&#xff09;</name>
  415 + <server>localhost</server>
  416 + <type>MYSQL</type>
  417 + <access>Native</access>
  418 + <database>ruoyi-vue-3.5</database>
  419 + <port>3306</port>
  420 + <username>root</username>
  421 + <password>Encrypted </password>
  422 + <servername/>
  423 + <data_tablespace/>
  424 + <index_tablespace/>
  425 + <attributes>
  426 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  427 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  428 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  429 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  430 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  431 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  432 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  433 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  434 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  435 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  436 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  437 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  438 + </attributes>
  439 + </connection>
  440 + <connection>
  441 + <name>repair_real_h2</name>
  442 + <server/>
  443 + <type>H2</type>
  444 + <access>JNDI</access>
  445 + <database>repair_real_h2</database>
  446 + <port>1521</port>
  447 + <username/>
  448 + <password>Encrypted </password>
  449 + <servername/>
  450 + <data_tablespace/>
  451 + <index_tablespace/>
  452 + <attributes>
  453 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  454 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  455 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  456 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  457 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  458 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  459 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  460 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  461 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  462 + </attributes>
  463 + </connection>
  464 + <connection>
  465 + <name>SNJW_VM</name>
  466 + <server>192.168.198.240</server>
  467 + <type>ORACLE</type>
  468 + <access>Native</access>
  469 + <database>orcl</database>
  470 + <port>1521</port>
  471 + <username>snjw</username>
  472 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10cd9ca5cd</password>
  473 + <servername/>
  474 + <data_tablespace/>
  475 + <index_tablespace/>
  476 + <attributes>
  477 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  478 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  479 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  480 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  481 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  482 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  483 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  484 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  485 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  486 + </attributes>
  487 + </connection>
  488 + <connection>
  489 + <name>test_control_local</name>
  490 + <server>localhost</server>
  491 + <type>MYSQL</type>
  492 + <access>Native</access>
  493 + <database>test_control</database>
  494 + <port>3306</port>
  495 + <username>root</username>
  496 + <password>Encrypted </password>
  497 + <servername/>
  498 + <data_tablespace/>
  499 + <index_tablespace/>
  500 + <attributes>
  501 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  502 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  503 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  504 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  505 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  506 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  507 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  508 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  509 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  510 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  511 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  512 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  513 + </attributes>
  514 + </connection>
  515 + <connection>
  516 + <name>test_control&#xff08;&#x672c;&#x673a;&#xff09;</name>
  517 + <server>127.0.0.1</server>
  518 + <type>MYSQL</type>
  519 + <access>Native</access>
  520 + <database>test_control</database>
  521 + <port>3306</port>
  522 + <username>root</username>
  523 + <password>Encrypted </password>
  524 + <servername/>
  525 + <data_tablespace/>
  526 + <index_tablespace/>
  527 + <attributes>
  528 + <attribute><code>EXTRA_OPTION_MYSQL.characterEncoding</code><attribute>utf8</attribute></attribute>
  529 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  530 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  531 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  532 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  533 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  534 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  535 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  536 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  537 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  538 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  539 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  540 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  541 + </attributes>
  542 + </connection>
  543 + <connection>
  544 + <name>xlab_mysql_youle</name>
  545 + <server>101.231.124.8</server>
  546 + <type>MYSQL</type>
  547 + <access>Native</access>
  548 + <database>xlab_youle</database>
  549 + <port>45687</port>
  550 + <username>xlab-youle</username>
  551 + <password>Encrypted 2be98afc86aa78a88aa1be369d187a3df</password>
  552 + <servername/>
  553 + <data_tablespace/>
  554 + <index_tablespace/>
  555 + <attributes>
  556 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  557 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  558 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  559 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  560 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  561 + <attribute><code>PORT_NUMBER</code><attribute>45687</attribute></attribute>
  562 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  563 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  564 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  565 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  566 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  567 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  568 + </attributes>
  569 + </connection>
  570 + <connection>
  571 + <name>xlab_mysql_youle&#xff08;&#x672c;&#x673a;&#xff09;</name>
  572 + <server>localhost</server>
  573 + <type>MYSQL</type>
  574 + <access>Native</access>
  575 + <database>xlab_youle</database>
  576 + <port>3306</port>
  577 + <username>root</username>
  578 + <password>Encrypted </password>
  579 + <servername/>
  580 + <data_tablespace/>
  581 + <index_tablespace/>
  582 + <attributes>
  583 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  584 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  585 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  586 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  587 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  588 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  589 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  590 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  591 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  592 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  593 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  594 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  595 + </attributes>
  596 + </connection>
  597 + <connection>
  598 + <name>xlab_youle</name>
  599 + <server/>
  600 + <type>MYSQL</type>
  601 + <access>JNDI</access>
  602 + <database>xlab_youle</database>
  603 + <port>1521</port>
  604 + <username/>
  605 + <password>Encrypted </password>
  606 + <servername/>
  607 + <data_tablespace/>
  608 + <index_tablespace/>
  609 + <attributes>
  610 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  611 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  612 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  613 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  614 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  615 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  616 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  617 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  618 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  619 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  620 + </attributes>
  621 + </connection>
  622 + <connection>
  623 + <name>YGJW_VM</name>
  624 + <server>192.168.198.240</server>
  625 + <type>ORACLE</type>
  626 + <access>Native</access>
  627 + <database>orcl</database>
  628 + <port>1521</port>
  629 + <username>ygjw</username>
  630 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10c795a5cd</password>
  631 + <servername/>
  632 + <data_tablespace/>
  633 + <index_tablespace/>
  634 + <attributes>
  635 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  636 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  637 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  638 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  639 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  640 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  641 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  642 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  643 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  644 + </attributes>
  645 + </connection>
  646 + <connection>
  647 + <name>&#x516c;&#x53f8;jgjw</name>
  648 + <server>192.168.168.1</server>
  649 + <type>ORACLE</type>
  650 + <access>Native</access>
  651 + <database>orcl</database>
  652 + <port>1521</port>
  653 + <username>jwgl</username>
  654 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10d485a8d6</password>
  655 + <servername/>
  656 + <data_tablespace/>
  657 + <index_tablespace/>
  658 + <attributes>
  659 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  660 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  661 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  662 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  663 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  664 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  665 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  666 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  667 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  668 + </attributes>
  669 + </connection>
  670 + <connection>
  671 + <name>&#x516c;&#x53f8;snjw</name>
  672 + <server>192.168.168.1</server>
  673 + <type>ORACLE</type>
  674 + <access>Native</access>
  675 + <database>orcl</database>
  676 + <port>1521</port>
  677 + <username>snjw</username>
  678 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10cd9ca5cd</password>
  679 + <servername/>
  680 + <data_tablespace/>
  681 + <index_tablespace/>
  682 + <attributes>
  683 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  684 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  685 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  686 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  687 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  688 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  689 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  690 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  691 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  692 + </attributes>
  693 + </connection>
  694 + <connection>
  695 + <name>&#x516c;&#x53f8;ygjw</name>
  696 + <server>192.168.168.1</server>
  697 + <type>ORACLE</type>
  698 + <access>Native</access>
  699 + <database>orcl</database>
  700 + <port>1521</port>
  701 + <username>ygjw</username>
  702 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10c795a5cd</password>
  703 + <servername/>
  704 + <data_tablespace/>
  705 + <index_tablespace/>
  706 + <attributes>
  707 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  708 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  709 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  710 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  711 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  712 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  713 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  714 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  715 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  716 + </attributes>
  717 + </connection>
  718 + <connection>
  719 + <name>&#x5916;&#x7f51;&#x91d1;&#x9ad8;&#x673a;&#x52a1;oracle</name>
  720 + <server>58.247.254.118</server>
  721 + <type>ORACLE</type>
  722 + <access>Native</access>
  723 + <database>orcl</database>
  724 + <port>15211</port>
  725 + <username>jwgl</username>
  726 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10d485a8d6</password>
  727 + <servername/>
  728 + <data_tablespace/>
  729 + <index_tablespace/>
  730 + <attributes>
  731 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  732 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  733 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  734 + <attribute><code>PORT_NUMBER</code><attribute>15211</attribute></attribute>
  735 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  736 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  737 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  738 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  739 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  740 + </attributes>
  741 + </connection>
  742 + <order>
  743 + <hop> <from>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</from><to>&#x73ed;&#x6b21;&#x6570;&#x636e;&#x8303;&#x5f0f;&#x5316;</to><enabled>Y</enabled> </hop>
  744 + <hop> <from>&#x6dfb;&#x52a0;&#x53d1;&#x8f66;&#x987a;&#x5e8f;&#x53f7;</from><to>&#x8fc7;&#x6ee4;&#x8bb0;&#x5f55;&#xff08;&#x53d1;&#x8f66;&#x65f6;&#x95f4;&#x4e3a;&#x7a7a;&#xff09;</to><enabled>Y</enabled> </hop>
  745 + <hop> <from>&#x8fc7;&#x6ee4;&#x8bb0;&#x5f55;&#xff08;&#x53d1;&#x8f66;&#x65f6;&#x95f4;&#x4e3a;&#x7a7a;&#xff09;</from><to>&#x6dfb;&#x52a0;&#x5bf9;&#x5e94;&#x73ed;&#x6b21;&#x6570;</to><enabled>Y</enabled> </hop>
  746 + <hop> <from>&#x6dfb;&#x52a0;&#x5bf9;&#x5e94;&#x73ed;&#x6b21;&#x6570;</from><to>&#x5904;&#x7406;&#x6570;&#x636e;</to><enabled>Y</enabled> </hop>
  747 + <hop> <from>&#x5904;&#x7406;&#x6570;&#x636e;</from><to>&#x5206;&#x7ec4;&#x5404;&#x4e2a;&#x8def;&#x724c;&#x7684;&#x7ad9;</to><enabled>Y</enabled> </hop>
  748 + <hop> <from>&#x67e5;&#x627e;&#x65f6;&#x523b;&#x8868;&#x57fa;&#x7840;&#x4fe1;&#x606f;&#x5173;&#x8054;</from><to>&#x67e5;&#x627e;&#x8def;&#x724c;&#x5173;&#x8054;</to><enabled>Y</enabled> </hop>
  749 + <hop> <from>&#x67e5;&#x627e;&#x7ebf;&#x8def;&#x5173;&#x8054;</from><to>&#x67e5;&#x627e;&#x65f6;&#x523b;&#x8868;&#x57fa;&#x7840;&#x4fe1;&#x606f;&#x5173;&#x8054;</to><enabled>Y</enabled> </hop>
  750 + <hop> <from>&#x4e0a;&#x4e0b;&#x884c;&#x5b57;&#x5178;</from><to>&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x5b57;&#x5178;</to><enabled>Y</enabled> </hop>
  751 + <hop> <from>&#x4e0a;&#x4e0b;&#x884c;&#x5b57;&#x5178; 2</from><to>&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x5b57;&#x5178; 2</to><enabled>Y</enabled> </hop>
  752 + <hop> <from>&#x4e0a;&#x4e0b;&#x884c;&#x5b57;&#x5178; 3</from><to>&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x5b57;&#x5178; 3</to><enabled>Y</enabled> </hop>
  753 + <hop> <from>&#x5339;&#x914d;&#x4e0a;&#x4e0b;&#x884c;&#x6b63;&#x5e38;&#x73ed;&#x6b21;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</from><to>&#x7c7b;&#x578b;&#x4fee;&#x6b63;</to><enabled>Y</enabled> </hop>
  754 + <hop> <from>&#x6309;&#x7167;&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x8fc7;&#x6ee4;&#x6570;&#x636e;1</from><to>&#x6309;&#x7167;&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x8fc7;&#x6ee4;&#x6570;&#x636e;2</to><enabled>Y</enabled> </hop>
  755 + <hop> <from>&#x6309;&#x7167;&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x8fc7;&#x6ee4;&#x6570;&#x636e;1</from><to>&#x6b63;&#x5e38;&#x73ed;&#x6b21;&#x6570;&#x636e;</to><enabled>Y</enabled> </hop>
  756 + <hop> <from>&#x6309;&#x7167;&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x8fc7;&#x6ee4;&#x6570;&#x636e;2</from><to>&#x51fa;&#x573a;&#x73ed;&#x6b21;&#x6570;&#x636e;</to><enabled>Y</enabled> </hop>
  757 + <hop> <from>&#x6309;&#x7167;&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x8fc7;&#x6ee4;&#x6570;&#x636e;2</from><to>&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x6570;&#x636e;</to><enabled>Y</enabled> </hop>
  758 + <hop> <from>&#x67e5;&#x627e;&#x6240;&#x6709;&#x7ebf;&#x8def;&#x4e0a;&#x4e0b;&#x884c;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</from><to>&#x5339;&#x914d;&#x4e0a;&#x4e0b;&#x884c;&#x6b63;&#x5e38;&#x73ed;&#x6b21;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</to><enabled>Y</enabled> </hop>
  759 + <hop> <from>&#x67e5;&#x627e;&#x7ec8;&#x70b9;&#x7ad9;&#x5173;&#x8054;</from><to>&#x4e0a;&#x4e0b;&#x884c;&#x5b57;&#x5178;</to><enabled>Y</enabled> </hop>
  760 + <hop> <from>&#x67e5;&#x627e;&#x8d77;&#x70b9;&#x7ad9;&#x5173;&#x8054;&#x5e76;&#x786e;&#x5b9a;&#x4e0a;&#x4e0b;&#x884c;</from><to>&#x67e5;&#x627e;&#x7ec8;&#x70b9;&#x7ad9;&#x5173;&#x8054;</to><enabled>Y</enabled> </hop>
  761 + <hop> <from>&#x6b63;&#x5e38;&#x73ed;&#x6b21;_&#x5904;&#x7406;&#x6570;&#x636e;</from><to>&#x67e5;&#x627e;&#x8d77;&#x70b9;&#x7ad9;&#x5173;&#x8054;&#x5e76;&#x786e;&#x5b9a;&#x4e0a;&#x4e0b;&#x884c;</to><enabled>Y</enabled> </hop>
  762 + <hop> <from>&#x6b63;&#x5e38;&#x73ed;&#x6b21;&#x6570;&#x636e;</from><to>&#x6b63;&#x5e38;&#x73ed;&#x6b21;_&#x5904;&#x7406;&#x6570;&#x636e;</to><enabled>Y</enabled> </hop>
  763 + <hop> <from>&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x5b57;&#x5178;</from><to>&#x67e5;&#x627e;&#x6240;&#x6709;&#x7ebf;&#x8def;&#x4e0a;&#x4e0b;&#x884c;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</to><enabled>Y</enabled> </hop>
  764 + <hop> <from>&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x5b57;&#x5178; 2</from><to>&#x67e5;&#x627e;&#x7ebf;&#x8def;&#x51fa;&#x573a;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</to><enabled>Y</enabled> </hop>
  765 + <hop> <from>&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x5b57;&#x5178; 3</from><to>&#x67e5;&#x627e;&#x7ebf;&#x8def;&#x8fdb;&#x573a;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</to><enabled>Y</enabled> </hop>
  766 + <hop> <from>&#x8ba1;&#x7b97;&#x73ed;&#x6b21;&#x7c7b;&#x578b;</from><to>&#x6309;&#x7167;&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x8fc7;&#x6ee4;&#x6570;&#x636e;1</to><enabled>Y</enabled> </hop>
  767 + <hop> <from>&#x51fa;&#x573a;&#x73ed;&#x6b21;&#x6570;&#x636e;</from><to>&#x67e5;&#x627e;&#x505c;&#x8f66;&#x573a;1</to><enabled>Y</enabled> </hop>
  768 + <hop> <from>&#x67e5;&#x627e;&#x505c;&#x8f66;&#x573a;1</from><to>&#x51fa;&#x573a;&#x73ed;&#x6b21;_&#x786e;&#x5b9a;&#x7ec8;&#x70b9;&#x7ad9;&#x540d;&#x5b57;</to><enabled>Y</enabled> </hop>
  769 + <hop> <from>&#x51fa;&#x573a;&#x73ed;&#x6b21;_&#x786e;&#x5b9a;&#x7ec8;&#x70b9;&#x7ad9;&#x540d;&#x5b57;</from><to>&#x67e5;&#x627e;&#x51fa;&#x573a;&#x7ec8;&#x70b9;&#x7ad9;&#x5173;&#x8054;&#x5e76;&#x786e;&#x5b9a;&#x4e0a;&#x4e0b;&#x884c;</to><enabled>Y</enabled> </hop>
  770 + <hop> <from>&#x67e5;&#x627e;&#x51fa;&#x573a;&#x7ec8;&#x70b9;&#x7ad9;&#x5173;&#x8054;&#x5e76;&#x786e;&#x5b9a;&#x4e0a;&#x4e0b;&#x884c;</from><to>&#x4e0a;&#x4e0b;&#x884c;&#x5b57;&#x5178; 2</to><enabled>Y</enabled> </hop>
  771 + <hop> <from>&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x6570;&#x636e;</from><to>&#x67e5;&#x627e;&#x505c;&#x8f66;&#x573a;2</to><enabled>Y</enabled> </hop>
  772 + <hop> <from>&#x67e5;&#x627e;&#x505c;&#x8f66;&#x573a;2</from><to>&#x8fdb;&#x573a;&#x73ed;&#x6b21;_&#x786e;&#x5b9a;&#x8d77;&#x70b9;&#x7ad9;&#x540d;&#x5b57;</to><enabled>Y</enabled> </hop>
  773 + <hop> <from>&#x8fdb;&#x573a;&#x73ed;&#x6b21;_&#x786e;&#x5b9a;&#x8d77;&#x70b9;&#x7ad9;&#x540d;&#x5b57;</from><to>&#x67e5;&#x627e;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x4e0a;&#x4e00;&#x4e2a;&#x73ed;&#x6b21;&#x7684;&#x7ebf;&#x8def;&#x65b9;&#x5411;</to><enabled>Y</enabled> </hop>
  774 + <hop> <from>&#x67e5;&#x627e;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x4e0a;&#x4e00;&#x4e2a;&#x73ed;&#x6b21;&#x7684;&#x7ebf;&#x8def;&#x65b9;&#x5411;</from><to>&#x67e5;&#x627e;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x4e0a;&#x4e00;&#x4e2a;&#x73ed;&#x6b21;&#x7684;&#x7ec8;&#x70b9;&#x7ad9;&#xff0c;&#x5e76;&#x4f5c;&#x4e3a;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x7684;&#x8d77;&#x70b9;&#x7ad9;</to><enabled>Y</enabled> </hop>
  775 + <hop> <from>&#x5206;&#x7ec4;&#x5404;&#x4e2a;&#x8def;&#x724c;&#x7684;&#x7ad9;</from><to>&#x67e5;&#x627e;&#x7ebf;&#x8def;&#x5173;&#x8054;</to><enabled>Y</enabled> </hop>
  776 + <hop> <from>&#x589e;&#x52a0;&#x65f6;&#x523b;&#x8868;&#x540d;&#x5b57;&#xff0c;&#x7ebf;&#x8def;&#x540d;&#x5b57;&#xff0c;&#x505c;&#x8f66;&#x573a;&#x540d;&#x5b57;</from><to>&#x8bb0;&#x5f55;&#x5173;&#x8054; &#x28;&#x7b1b;&#x5361;&#x5c14;&#x8f93;&#x51fa;&#x29;</to><enabled>Y</enabled> </hop>
  777 + <hop> <from>&#x73ed;&#x6b21;&#x6570;&#x636e;&#x8303;&#x5f0f;&#x5316;</from><to>&#x8bb0;&#x5f55;&#x5173;&#x8054; &#x28;&#x7b1b;&#x5361;&#x5c14;&#x8f93;&#x51fa;&#x29;</to><enabled>Y</enabled> </hop>
  778 + <hop> <from>&#x8bb0;&#x5f55;&#x5173;&#x8054; &#x28;&#x7b1b;&#x5361;&#x5c14;&#x8f93;&#x51fa;&#x29;</from><to>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</to><enabled>Y</enabled> </hop>
  779 + <hop> <from>&#x7c7b;&#x578b;&#x4fee;&#x6b63;</from><to>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_s_ttinfo_detail</to><enabled>Y</enabled> </hop>
  780 + <hop> <from>&#x67e5;&#x627e;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x4e0a;&#x4e00;&#x4e2a;&#x73ed;&#x6b21;&#x7684;&#x7ec8;&#x70b9;&#x7ad9;&#xff0c;&#x5e76;&#x4f5c;&#x4e3a;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x7684;&#x8d77;&#x70b9;&#x7ad9;</from><to>&#x67e5;&#x627e;&#x8fdb;&#x573a;&#x8d77;&#x70b9;&#x7ad9;&#x5173;&#x8054;&#x786e;&#x5b9a;&#x4e0a;&#x4e0b;&#x884c;</to><enabled>Y</enabled> </hop>
  781 + <hop> <from>&#x67e5;&#x627e;&#x8fdb;&#x573a;&#x8d77;&#x70b9;&#x7ad9;&#x5173;&#x8054;&#x786e;&#x5b9a;&#x4e0a;&#x4e0b;&#x884c;</from><to>&#x4e0a;&#x4e0b;&#x884c;&#x5b57;&#x5178; 3</to><enabled>Y</enabled> </hop>
  782 + <hop> <from>&#x67e5;&#x627e;&#x7ebf;&#x8def;&#x51fa;&#x573a;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</from><to>&#x5339;&#x914d;&#x51fa;&#x573a;&#x73ed;&#x6b21;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</to><enabled>Y</enabled> </hop>
  783 + <hop> <from>&#x67e5;&#x627e;&#x7ebf;&#x8def;&#x8fdb;&#x573a;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</from><to>&#x5339;&#x914d;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</to><enabled>Y</enabled> </hop>
  784 + <hop> <from>&#x5339;&#x914d;&#x51fa;&#x573a;&#x73ed;&#x6b21;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</from><to>&#x4e0a;&#x4e0b;&#x884c;NULL&#x5224;&#x5b9a;</to><enabled>Y</enabled> </hop>
  785 + <hop> <from>&#x4e0a;&#x4e0b;&#x884c;NULL&#x5224;&#x5b9a;</from><to>&#x7c7b;&#x578b;&#x4fee;&#x6b63; 2</to><enabled>Y</enabled> </hop>
  786 + <hop> <from>&#x7c7b;&#x578b;&#x4fee;&#x6b63; 2</from><to>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_s_ttinfo_detail 2</to><enabled>Y</enabled> </hop>
  787 + <hop> <from>&#x5339;&#x914d;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</from><to>&#x4e0a;&#x4e0b;&#x884c;&#x5224;&#x5b9a; 2</to><enabled>Y</enabled> </hop>
  788 + <hop> <from>&#x4e0a;&#x4e0b;&#x884c;&#x5224;&#x5b9a; 2</from><to>&#x7c7b;&#x578b;&#x4fee;&#x6b63; 3</to><enabled>Y</enabled> </hop>
  789 + <hop> <from>&#x7c7b;&#x578b;&#x4fee;&#x6b63; 3</from><to>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_s_ttinfo_detail 3</to><enabled>Y</enabled> </hop>
  790 + <hop> <from>&#x67e5;&#x627e;&#x8def;&#x724c;&#x5173;&#x8054;</from><to>&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c;&#x7c7b;&#x578b;</to><enabled>Y</enabled> </hop>
  791 + <hop> <from>&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c;&#x7c7b;&#x578b;</from><to>&#x8ba1;&#x7b97;&#x73ed;&#x6b21;&#x7c7b;&#x578b;</to><enabled>Y</enabled> </hop>
  792 + <hop> <from>&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c;&#x7c7b;&#x578b;</from><to>&#x66f4;&#x65b0;&#x65f6;&#x523b;&#x8868;&#x4e3b;&#x8868;&#x7248;&#x672c;</to><enabled>Y</enabled> </hop>
  793 + <hop> <from>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</from><to>&#x62c6;&#x5206;&#x8def;&#x724c;&#x548c;&#x5de5;&#x65f6;</to><enabled>Y</enabled> </hop>
  794 + <hop> <from>&#x62c6;&#x5206;&#x8def;&#x724c;&#x548c;&#x5de5;&#x65f6;</from><to>&#x6dfb;&#x52a0;&#x53d1;&#x8f66;&#x987a;&#x5e8f;&#x53f7;</to><enabled>Y</enabled> </hop>
  795 + <hop> <from>&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c;&#x7c7b;&#x578b;</from><to>&#x73ed;&#x578b;&#x8868;&#x6570;&#x636e;</to><enabled>Y</enabled> </hop>
  796 + <hop> <from>&#x73ed;&#x578b;&#x8868;&#x6570;&#x636e;</from><to>&#x63d2;&#x5165; &#x2f; &#x66f4;&#x65b0; &#x73ed;&#x578b;&#x8868;&#xff08;&#x5de5;&#x65f6;&#x6570;&#x636e;&#xff09;</to><enabled>Y</enabled> </hop>
  797 + </order>
  798 + <step>
  799 + <name>&#x4e0a;&#x4e0b;&#x884c;NULL&#x5224;&#x5b9a;</name>
  800 + <type>IfNull</type>
  801 + <description/>
  802 + <distribute>Y</distribute>
  803 + <custom_distribution/>
  804 + <copies>1</copies>
  805 + <partitioning>
  806 + <method>none</method>
  807 + <schema_name/>
  808 + </partitioning>
  809 + <replaceAllByValue/>
  810 + <replaceAllMask/>
  811 + <selectFields>Y</selectFields>
  812 + <selectValuesType>N</selectValuesType>
  813 + <setEmptyStringAll>N</setEmptyStringAll>
  814 + <valuetypes>
  815 + </valuetypes>
  816 + <fields>
  817 + <field>
  818 + <name>sxx</name>
  819 + <value>0</value>
  820 + <mask/>
  821 + <set_empty_string>N</set_empty_string>
  822 + </field>
  823 + </fields>
  824 + <cluster_schema/>
  825 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  826 + <xloc>335</xloc>
  827 + <yloc>938</yloc>
  828 + <draw>Y</draw>
  829 + </GUI>
  830 + </step>
  831 +
  832 + <step>
  833 + <name>&#x4e0a;&#x4e0b;&#x884c;&#x5224;&#x5b9a; 2</name>
  834 + <type>IfNull</type>
  835 + <description/>
  836 + <distribute>Y</distribute>
  837 + <custom_distribution/>
  838 + <copies>1</copies>
  839 + <partitioning>
  840 + <method>none</method>
  841 + <schema_name/>
  842 + </partitioning>
  843 + <replaceAllByValue/>
  844 + <replaceAllMask/>
  845 + <selectFields>Y</selectFields>
  846 + <selectValuesType>N</selectValuesType>
  847 + <setEmptyStringAll>N</setEmptyStringAll>
  848 + <valuetypes>
  849 + </valuetypes>
  850 + <fields>
  851 + <field>
  852 + <name>sxx2</name>
  853 + <value>0</value>
  854 + <mask/>
  855 + <set_empty_string>N</set_empty_string>
  856 + </field>
  857 + </fields>
  858 + <cluster_schema/>
  859 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  860 + <xloc>804</xloc>
  861 + <yloc>1081</yloc>
  862 + <draw>Y</draw>
  863 + </GUI>
  864 + </step>
  865 +
  866 + <step>
  867 + <name>&#x4e0a;&#x4e0b;&#x884c;&#x5b57;&#x5178;</name>
  868 + <type>ValueMapper</type>
  869 + <description/>
  870 + <distribute>Y</distribute>
  871 + <custom_distribution/>
  872 + <copies>1</copies>
  873 + <partitioning>
  874 + <method>none</method>
  875 + <schema_name/>
  876 + </partitioning>
  877 + <field_to_use>sxx</field_to_use>
  878 + <target_field>sxx_desc</target_field>
  879 + <non_match_default/>
  880 + <fields>
  881 + <field>
  882 + <source_value>0</source_value>
  883 + <target_value>&#x4e0a;&#x884c;</target_value>
  884 + </field>
  885 + <field>
  886 + <source_value>1</source_value>
  887 + <target_value>&#x4e0b;&#x884c;</target_value>
  888 + </field>
  889 + </fields>
  890 + <cluster_schema/>
  891 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  892 + <xloc>147</xloc>
  893 + <yloc>403</yloc>
  894 + <draw>Y</draw>
  895 + </GUI>
  896 + </step>
  897 +
  898 + <step>
  899 + <name>&#x4e0a;&#x4e0b;&#x884c;&#x5b57;&#x5178; 2</name>
  900 + <type>ValueMapper</type>
  901 + <description/>
  902 + <distribute>Y</distribute>
  903 + <custom_distribution/>
  904 + <copies>1</copies>
  905 + <partitioning>
  906 + <method>none</method>
  907 + <schema_name/>
  908 + </partitioning>
  909 + <field_to_use>sxx</field_to_use>
  910 + <target_field>sxx_desc</target_field>
  911 + <non_match_default/>
  912 + <fields>
  913 + <field>
  914 + <source_value>0</source_value>
  915 + <target_value>&#x4e0a;&#x884c;</target_value>
  916 + </field>
  917 + <field>
  918 + <source_value>1</source_value>
  919 + <target_value>&#x4e0b;&#x884c;</target_value>
  920 + </field>
  921 + </fields>
  922 + <cluster_schema/>
  923 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  924 + <xloc>331</xloc>
  925 + <yloc>598</yloc>
  926 + <draw>Y</draw>
  927 + </GUI>
  928 + </step>
  929 +
  930 + <step>
  931 + <name>&#x4e0a;&#x4e0b;&#x884c;&#x5b57;&#x5178; 3</name>
  932 + <type>ValueMapper</type>
  933 + <description/>
  934 + <distribute>Y</distribute>
  935 + <custom_distribution/>
  936 + <copies>1</copies>
  937 + <partitioning>
  938 + <method>none</method>
  939 + <schema_name/>
  940 + </partitioning>
  941 + <field_to_use>sxx</field_to_use>
  942 + <target_field>sxx_desc</target_field>
  943 + <non_match_default/>
  944 + <fields>
  945 + <field>
  946 + <source_value>0</source_value>
  947 + <target_value>&#x4e0a;&#x884c;</target_value>
  948 + </field>
  949 + <field>
  950 + <source_value>1</source_value>
  951 + <target_value>&#x4e0b;&#x884c;</target_value>
  952 + </field>
  953 + </fields>
  954 + <cluster_schema/>
  955 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  956 + <xloc>553</xloc>
  957 + <yloc>859</yloc>
  958 + <draw>Y</draw>
  959 + </GUI>
  960 + </step>
  961 +
  962 + <step>
  963 + <name>&#x51fa;&#x573a;&#x73ed;&#x6b21;_&#x786e;&#x5b9a;&#x7ec8;&#x70b9;&#x7ad9;&#x540d;&#x5b57;</name>
  964 + <type>ScriptValueMod</type>
  965 + <description/>
  966 + <distribute>Y</distribute>
  967 + <custom_distribution/>
  968 + <copies>1</copies>
  969 + <partitioning>
  970 + <method>none</method>
  971 + <schema_name/>
  972 + </partitioning>
  973 + <compatible>N</compatible>
  974 + <optimizationLevel>9</optimizationLevel>
  975 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  976 + <jsScript_name>Script 1</jsScript_name>
  977 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;&#x2f;&#x2f; &#x6dfb;&#x52a0;&#x7ad9;&#x70b9;&#x6807;&#x8bc6;&#xa;var cc_groups &#x3d; qdzgroups.split&#x28;&#x22;,&#x22;&#x29;&#x3b; &#x2f;&#x2f; &#x6240;&#x6709;&#x73ed;&#x6b21;&#x8d77;&#x70b9;&#x7ad9;&#x6570;&#x7ec4;&#xa;var zdzname &#x3d; cc_groups&#x5b;gno&#x5d;&#x3b; &#x2f;&#x2f; &#x51fa;&#x573a;&#x73ed;&#x6b21;&#x7684;&#x7ec8;&#x70b9;&#x7ad9;&#x662f;&#x4e0b;&#x4e2a;&#x73ed;&#x6b21;&#x7684;&#x8d77;&#x59cb;&#x7ad9;&#xa;var endZdtype &#x3d; &#x27;B&#x27;&#x3b;&#xa;&#x2f;&#x2f; var endZdtype &#x3d; &#x27;E&#x27;&#x3b;&#xa;&#xa;var destory &#x3d; 0&#x3b; &#x2f;&#x2f; &#x672a;&#x64a4;&#x9500;flag</jsScript_script>
  978 + </jsScript> </jsScripts> <fields> <field> <name>zdzname</name>
  979 + <rename>zdzname</rename>
  980 + <type>String</type>
  981 + <length>-1</length>
  982 + <precision>-1</precision>
  983 + <replace>N</replace>
  984 + </field> <field> <name>endZdtype</name>
  985 + <rename>endZdtype</rename>
  986 + <type>String</type>
  987 + <length>-1</length>
  988 + <precision>-1</precision>
  989 + <replace>N</replace>
  990 + </field> <field> <name>destory</name>
  991 + <rename>destory</rename>
  992 + <type>Integer</type>
  993 + <length>-1</length>
  994 + <precision>-1</precision>
  995 + <replace>N</replace>
  996 + </field> </fields> <cluster_schema/>
  997 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  998 + <xloc>575</xloc>
  999 + <yloc>502</yloc>
  1000 + <draw>Y</draw>
  1001 + </GUI>
  1002 + </step>
  1003 +
  1004 + <step>
  1005 + <name>&#x51fa;&#x573a;&#x73ed;&#x6b21;&#x6570;&#x636e;</name>
  1006 + <type>Dummy</type>
  1007 + <description/>
  1008 + <distribute>Y</distribute>
  1009 + <custom_distribution/>
  1010 + <copies>1</copies>
  1011 + <partitioning>
  1012 + <method>none</method>
  1013 + <schema_name/>
  1014 + </partitioning>
  1015 + <cluster_schema/>
  1016 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1017 + <xloc>869</xloc>
  1018 + <yloc>504</yloc>
  1019 + <draw>Y</draw>
  1020 + </GUI>
  1021 + </step>
  1022 +
  1023 + <step>
  1024 + <name>&#x5206;&#x7ec4;&#x5404;&#x4e2a;&#x8def;&#x724c;&#x7684;&#x7ad9;</name>
  1025 + <type>GroupBy</type>
  1026 + <description/>
  1027 + <distribute>Y</distribute>
  1028 + <custom_distribution/>
  1029 + <copies>1</copies>
  1030 + <partitioning>
  1031 + <method>none</method>
  1032 + <schema_name/>
  1033 + </partitioning>
  1034 + <all_rows>Y</all_rows>
  1035 + <ignore_aggregate>N</ignore_aggregate>
  1036 + <field_ignore/>
  1037 + <directory>&#x25;&#x25;java.io.tmpdir&#x25;&#x25;</directory>
  1038 + <prefix>grp</prefix>
  1039 + <add_linenr>Y</add_linenr>
  1040 + <linenr_fieldname>gno</linenr_fieldname>
  1041 + <give_back_row>N</give_back_row>
  1042 + <group>
  1043 + <field>
  1044 + <name>lp</name>
  1045 + </field>
  1046 + </group>
  1047 + <fields>
  1048 + <field>
  1049 + <aggregate>qdzgroups</aggregate>
  1050 + <subject>qdzname</subject>
  1051 + <type>CONCAT_STRING</type>
  1052 + <valuefield>,</valuefield>
  1053 + </field>
  1054 + </fields>
  1055 + <cluster_schema/>
  1056 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1057 + <xloc>892</xloc>
  1058 + <yloc>44</yloc>
  1059 + <draw>Y</draw>
  1060 + </GUI>
  1061 + </step>
  1062 +
  1063 + <step>
  1064 + <name>&#x5339;&#x914d;&#x4e0a;&#x4e0b;&#x884c;&#x6b63;&#x5e38;&#x73ed;&#x6b21;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</name>
  1065 + <type>ScriptValueMod</type>
  1066 + <description/>
  1067 + <distribute>Y</distribute>
  1068 + <custom_distribution/>
  1069 + <copies>1</copies>
  1070 + <partitioning>
  1071 + <method>none</method>
  1072 + <schema_name/>
  1073 + </partitioning>
  1074 + <compatible>N</compatible>
  1075 + <optimizationLevel>9</optimizationLevel>
  1076 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  1077 + <jsScript_name>Script 1</jsScript_name>
  1078 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;var jhlc&#x3b; &#x2f;&#x2f; &#x8ba1;&#x5212;&#x91cc;&#x7a0b;&#xa;var bcsj&#x3b; &#x2f;&#x2f; &#x73ed;&#x6b21;&#x65f6;&#x95f4;&#xa;&#xa;&#x2f;&#x2f; &#x65f6;&#x95f4;&#x8303;&#x56f4;&#x6b63;&#x5219;&#x8868;&#x8fbe;&#x5f0f;&#xa;var timeRex &#x3d; &#x2f;&#x5e;&#x28;&#x5b;01&#x5d;&#x3f;&#x5b;0-9&#x5d;&#x7c;2&#x5b;0-3&#x5d;&#x29;&#x3a;&#x5b;0-5&#x5d;&#x5b;0-9&#x5d;&#x24;&#x2f;&#x3b;&#xa;&#x2f;&#x2f; &#x53d1;&#x8f66;&#x65f6;&#x95f4;&#x8f6c;&#x6362;&#x6210;&#x65e5;&#x671f;&#xa;var fcsj_hour &#x3d; str2num&#x28;sendtime_calcu.substr&#x28;0, 2&#x29;, &#x22;&#x23;&#x22;&#x29;&#x3b;&#xa;var fcsj_min &#x3d; str2num&#x28;sendtime_calcu.substr&#x28;3, 2&#x29;, &#x22;&#x23;&#x22;&#x29;&#x3b;&#xa;var fcsj_date &#x3d; new Date&#x28;2000,1,1,fcsj_hour,fcsj_min,0&#x29;&#x3b;&#xa;&#xa;&#x2f;&#x2f; &#x5224;&#x5b9a;&#x662f;&#x5426;&#x65e9;&#x9ad8;&#x5cf0;&#xa;var isZgf &#x3d; false&#x3b;&#xa;if &#x28;timeRex.test&#x28;early_start_time&#x29; &#x26;&#x26; timeRex.test&#x28;early_end_time&#x29; &#x26;&#x26; early_up_time &#x21;&#x3d; null &#x26;&#x26; early_down_time &#x21;&#x3d; null&#x29; &#x7b;&#xa; var early_s_hour &#x3d; str2num&#x28;early_start_time.substr&#x28;0, 2&#x29;, &#x22;&#x23;&#x22;&#x29;&#x3b;&#xa; var early_s_min &#x3d; str2num&#x28;early_start_time.substr&#x28;3, 2&#x29;, &#x22;&#x23;&#x22;&#x29;&#x3b;&#xa; var early_s_date &#x3d; new Date&#x28;2000,1,1,early_s_hour,early_s_min,0&#x29;&#x3b;&#xa;&#xa; var early_e_hour &#x3d; str2num&#x28;early_end_time.substr&#x28;0, 2&#x29;, &#x22;&#x23;&#x22;&#x29;&#x3b;&#xa; var early_e_min &#x3d; str2num&#x28;early_end_time.substr&#x28;3, 2&#x29;, &#x22;&#x23;&#x22;&#x29;&#x3b;&#xa; var early_e_date &#x3d; new Date&#x28;2000,1,1,early_e_hour,early_e_min,0&#x29;&#x3b;&#xa;&#xa; if &#x28;fcsj_date &#x3e;&#x3d; early_s_date &#x26;&#x26; fcsj_date &#x3c;&#x3d; early_e_date&#x29; &#x7b;&#xa; isZgf &#x3d; true&#x3b;&#xa; &#x7d;&#xa;&#x7d;&#xa;&#xa;&#x2f;&#x2f; &#x5224;&#x5b9a;&#x662f;&#x5426;&#x665a;&#x9ad8;&#x5cf0;&#xa;var isWgf &#x3d; false&#x3b;&#xa;if &#x28;timeRex.test&#x28;late_start_time&#x29; &#x26;&#x26; timeRex.test&#x28;late_end_time&#x29; &#x26;&#x26; late_up_time &#x21;&#x3d; null &#x26;&#x26; late_down_time &#x21;&#x3d; null&#x29; &#x7b;&#xa; var late_s_hour &#x3d; str2num&#x28;late_start_time.substr&#x28;0, 2&#x29;, &#x22;&#x23;&#x22;&#x29;&#x3b;&#xa; var late_s_min &#x3d; str2num&#x28;late_start_time.substr&#x28;3, 2&#x29;, &#x22;&#x23;&#x22;&#x29;&#x3b;&#xa; var late_s_date &#x3d; new Date&#x28;2000,1,1,late_s_hour,late_s_min,0&#x29;&#x3b;&#xa;&#xa; var late_e_hour &#x3d; str2num&#x28;late_end_time.substr&#x28;0, 2&#x29;, &#x22;&#x23;&#x22;&#x29;&#x3b;&#xa; var late_e_min &#x3d; str2num&#x28;late_end_time.substr&#x28;3, 2&#x29;, &#x22;&#x23;&#x22;&#x29;&#x3b;&#xa; var late_e_date &#x3d; new Date&#x28;2000,1,1,late_e_hour,late_e_min,0&#x29;&#x3b;&#xa;&#xa; if &#x28;fcsj_date &#x3e;&#x3d; late_s_date &#x26;&#x26; fcsj_date &#x3c;&#x3d; late_e_date&#x29; &#x7b;&#xa; isWgf &#x3d; true&#x3b;&#xa; &#x7d;&#xa;&#x7d;&#xa;&#xa;&#x2f;&#x2f; &#x5224;&#x5b9a;&#x662f;&#x5426;&#x665a;&#x9ad8;&#x5cf0;&#xa;&#xa;if &#x28;sxx &#x3d;&#x3d; 0&#x29; &#x7b; &#x2f;&#x2f; &#x4e0a;&#x884c;&#xa; if &#x28;isZgf&#x29; &#x7b;&#xa; jhlc &#x3d; up_mileage&#x3b;&#xa; bcsj &#x3d; early_up_time &#x21;&#x3d; 0 &#x3f; early_up_time &#x3a; up_travel_time&#x3b;&#xa; &#x7d; else if &#x28;isWgf&#x29; &#x7b;&#xa; jhlc &#x3d; up_mileage&#x3b;&#xa; bcsj &#x3d; late_up_time &#x21;&#x3d; 0 &#x3f; late_up_time &#x3a; up_travel_time&#x3b;&#xa; &#x7d; else &#x7b;&#xa; jhlc &#x3d; up_mileage&#x3b;&#xa; bcsj &#x3d; up_travel_time&#x3b;&#xa; &#x7d;&#xa;&#x7d; else &#x7b; &#x2f;&#x2f; sxx &#x3d;&#x3d; 1 &#x4e0b;&#x884c;&#xa; if &#x28;isZgf&#x29; &#x7b;&#xa; jhlc &#x3d; down_mileage&#x3b;&#xa; bcsj &#x3d; early_down_time &#x21;&#x3d; 0 &#x3f; early_down_time &#x3a; down_travel_time&#x3b;&#xa; &#x7d; else if &#x28;isWgf&#x29; &#x7b;&#xa; jhlc &#x3d; down_mileage&#x3b;&#xa; bcsj &#x3d; late_down_time &#x21;&#x3d; 0 &#x3f; late_down_time &#x3a; down_travel_time&#x3b;&#xa; &#x7d; else &#x7b;&#xa; jhlc &#x3d; down_mileage&#x3b;&#xa; bcsj &#x3d; down_travel_time&#x3b;&#xa; &#x7d;&#xa;&#x7d;</jsScript_script>
  1079 + </jsScript> </jsScripts> <fields> <field> <name>jhlc</name>
  1080 + <rename>jhlc</rename>
  1081 + <type>String</type>
  1082 + <length>-1</length>
  1083 + <precision>-1</precision>
  1084 + <replace>N</replace>
  1085 + </field> <field> <name>bcsj</name>
  1086 + <rename>bcsj</rename>
  1087 + <type>String</type>
  1088 + <length>-1</length>
  1089 + <precision>-1</precision>
  1090 + <replace>N</replace>
  1091 + </field> </fields> <cluster_schema/>
  1092 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1093 + <xloc>148</xloc>
  1094 + <yloc>674</yloc>
  1095 + <draw>Y</draw>
  1096 + </GUI>
  1097 + </step>
  1098 +
  1099 + <step>
  1100 + <name>&#x5339;&#x914d;&#x51fa;&#x573a;&#x73ed;&#x6b21;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</name>
  1101 + <type>ScriptValueMod</type>
  1102 + <description/>
  1103 + <distribute>Y</distribute>
  1104 + <custom_distribution/>
  1105 + <copies>1</copies>
  1106 + <partitioning>
  1107 + <method>none</method>
  1108 + <schema_name/>
  1109 + </partitioning>
  1110 + <compatible>N</compatible>
  1111 + <optimizationLevel>9</optimizationLevel>
  1112 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  1113 + <jsScript_name>Script 1</jsScript_name>
  1114 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;var out_mileage&#x3b; &#x2f;&#x2f; &#x51fa;&#x573a;&#x8ba1;&#x5212;&#x91cc;&#x7a0b;&#xa;var out_time&#x3b; &#x2f;&#x2f; &#x51fa;&#x573a;&#x8ba1;&#x5212;&#x65f6;&#x95f4;&#xa;&#xa;if &#x28;sxx &#x3d;&#x3d; 0&#x29; &#x7b; &#x2f;&#x2f; &#x4e0a;&#x884c;&#xa; out_mileage &#x3d; up_out_mileage&#x3b;&#xa; out_time &#x3d; up_out_timer&#x3b;&#xa;&#x7d; else &#x7b; &#x2f;&#x2f; sxx &#x3d;&#x3d; 1 &#x4e0b;&#x884c;&#xa; out_mileage &#x3d; down_out_mileage&#x3b;&#xa; out_time &#x3d; down_out_timer&#x3b;&#xa;&#x7d;&#xa;&#xa;&#xa;&#xa;</jsScript_script>
  1115 + </jsScript> </jsScripts> <fields> <field> <name>out_mileage</name>
  1116 + <rename>out_mileage</rename>
  1117 + <type>String</type>
  1118 + <length>-1</length>
  1119 + <precision>-1</precision>
  1120 + <replace>N</replace>
  1121 + </field> <field> <name>out_time</name>
  1122 + <rename>out_time</rename>
  1123 + <type>String</type>
  1124 + <length>-1</length>
  1125 + <precision>-1</precision>
  1126 + <replace>N</replace>
  1127 + </field> </fields> <cluster_schema/>
  1128 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1129 + <xloc>336</xloc>
  1130 + <yloc>862</yloc>
  1131 + <draw>Y</draw>
  1132 + </GUI>
  1133 + </step>
  1134 +
  1135 + <step>
  1136 + <name>&#x5339;&#x914d;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</name>
  1137 + <type>ScriptValueMod</type>
  1138 + <description/>
  1139 + <distribute>Y</distribute>
  1140 + <custom_distribution/>
  1141 + <copies>1</copies>
  1142 + <partitioning>
  1143 + <method>none</method>
  1144 + <schema_name/>
  1145 + </partitioning>
  1146 + <compatible>N</compatible>
  1147 + <optimizationLevel>9</optimizationLevel>
  1148 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  1149 + <jsScript_name>Script 1</jsScript_name>
  1150 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;var parade_mileage&#x3b; &#x2f;&#x2f; &#x8fdb;&#x573a;&#x8ba1;&#x5212;&#x91cc;&#x7a0b;&#xa;var parade_time&#x3b; &#x2f;&#x2f; &#x8fdb;&#x573a;&#x8ba1;&#x5212;&#x65f6;&#x95f4;&#xa;&#xa;if &#x28;sxx2 &#x3d;&#x3d; 0&#x29; &#x7b; &#x2f;&#x2f; &#x4e0a;&#x884c;&#xa; parade_mileage &#x3d; up_in_mileage&#x3b;&#xa; parade_time &#x3d; up_in_timer&#x3b;&#xa;&#x7d; else &#x7b; &#x2f;&#x2f; sxx &#x3d;&#x3d; 1 &#x4e0b;&#x884c;&#xa; parade_mileage &#x3d; down_in_mileage&#x3b;&#xa; parade_time &#x3d; down_in_timer&#x3b;&#xa;&#x7d;&#xa;&#xa;&#xa;&#xa;</jsScript_script>
  1151 + </jsScript> </jsScripts> <fields> <field> <name>parade_mileage</name>
  1152 + <rename>parade_mileage</rename>
  1153 + <type>String</type>
  1154 + <length>-1</length>
  1155 + <precision>-1</precision>
  1156 + <replace>N</replace>
  1157 + </field> <field> <name>parade_time</name>
  1158 + <rename>parade_time</rename>
  1159 + <type>String</type>
  1160 + <length>-1</length>
  1161 + <precision>-1</precision>
  1162 + <replace>N</replace>
  1163 + </field> </fields> <cluster_schema/>
  1164 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1165 + <xloc>726</xloc>
  1166 + <yloc>1005</yloc>
  1167 + <draw>Y</draw>
  1168 + </GUI>
  1169 + </step>
  1170 +
  1171 + <step>
  1172 + <name>&#x589e;&#x52a0;&#x65f6;&#x523b;&#x8868;&#x540d;&#x5b57;&#xff0c;&#x7ebf;&#x8def;&#x540d;&#x5b57;&#xff0c;&#x505c;&#x8f66;&#x573a;&#x540d;&#x5b57;</name>
  1173 + <type>DataGrid</type>
  1174 + <description/>
  1175 + <distribute>Y</distribute>
  1176 + <custom_distribution/>
  1177 + <copies>1</copies>
  1178 + <partitioning>
  1179 + <method>none</method>
  1180 + <schema_name/>
  1181 + </partitioning>
  1182 + <fields>
  1183 + </fields>
  1184 + <data>
  1185 + <line> </line>
  1186 + </data>
  1187 + <cluster_schema/>
  1188 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1189 + <xloc>110</xloc>
  1190 + <yloc>133</yloc>
  1191 + <draw>Y</draw>
  1192 + </GUI>
  1193 + </step>
  1194 +
  1195 + <step>
  1196 + <name>&#x5904;&#x7406;&#x6570;&#x636e;</name>
  1197 + <type>ScriptValueMod</type>
  1198 + <description/>
  1199 + <distribute>Y</distribute>
  1200 + <custom_distribution/>
  1201 + <copies>1</copies>
  1202 + <partitioning>
  1203 + <method>none</method>
  1204 + <schema_name/>
  1205 + </partitioning>
  1206 + <compatible>N</compatible>
  1207 + <optimizationLevel>9</optimizationLevel>
  1208 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  1209 + <jsScript_name>Script 1</jsScript_name>
  1210 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;&#x2f;&#x2f; &#x5982;&#x679c;&#x7ad9;&#x540d;&#x4e2d;&#x6709;&#x7c7b;&#x4f3c;-&#x3e;&#x7b;&#x6570;&#x5b57;&#x7d;&#xff0c;&#x4f7f;&#x7528;&#x6b63;&#x5219;&#x8868;&#x8fbe;&#x5f0f;&#x8fc7;&#x6ee4;&#x6389;&#xa;qdzname &#x3d; qdzname.replace&#x28;&#x2f;-&#x3e;&#x5c;d&#x2b;&#x2f;g,&#x27;&#x27;&#x29;&#x3b;&#xa;if &#x28;qdzname &#x21;&#x3d; &#x22;&#x51fa;&#x573a;&#x22; &#x26;&#x26; qdzname &#x21;&#x3d; &#x22;&#x8fdb;&#x573a;&#x22;&#x29; &#x7b;&#xa; qdzname &#x3d; qdzname &#x2b; &#x22;&#x25;&#x22;&#x3b; &#x2f;&#x2f; &#x6a21;&#x7cca;&#x5339;&#x914d;&#x6807;&#x8bc6;&#x7b26;&#xa;&#x7d;&#xa;&#xa;&#x2f;&#x2f; sendtime&#x5904;&#x7406;&#xff0c;hhmm&#xff0c;hh&#x3a;mm&#xff0c;hh,mm&#xa;var sendtime_calcu &#x3d; sendtime.replace&#x28;&#x2f;&#x5c;s&#x2f;g, &#x22;&#x22;&#x29;&#x3b;&#xa;if &#x28;sendtime.length &#x3d;&#x3d; 5&#x29; &#x7b; &#x2f;&#x2f; &#x6700;&#x957f;&#x683c;&#x5f0f;&#xff0c;&#x5305;&#x62ec;&#x5206;&#x9694;&#x7b26;&#xff0c;&#x7edf;&#x4e00;&#x628a;&#x5206;&#x9694;&#x7b26;&#x66ff;&#x6362;&#x6210;&#x5192;&#x53f7;&#xa; sendtime_calcu &#x3d; sendtime.substr&#x28;0, 2&#x29; &#x2b; &#x22;&#x3a;&#x22; &#x2b; sendtime.substr&#x28;3, 2&#x29;&#x3b;&#xa;&#x7d; else if &#x28;sendtime.length &#x3d;&#x3d; 4&#x29; &#x7b;&#xa; if &#x28;sendtime.indexOf&#x28;&#x22;&#x3a;&#x22;&#x29; &#x3e; 0&#x29; &#x7b; &#x2f;&#x2f; &#x5192;&#x53f7;&#x5206;&#x9694;&#xff0c;&#x65e0;&#x9700;&#x4fee;&#x6539;&#xa; sendtime_calcu &#x3d; sendtime&#x3b;&#xa; &#x7d; else if &#x28;sendtime.indexOf&#x28;&#x22;,&#x22;&#x29; &#x3e; 0&#x29; &#x7b; &#x2f;&#x2f; &#x9017;&#x53f7;&#x5206;&#x9694;&#xff0c;&#x6539;&#x6210;&#x5192;&#x53f7;&#x5206;&#x9694;&#xa; sendtime_calcu &#x3d; sendtime.substr&#x28;0, 1&#x29; &#x2b; &#x22;&#x3a;&#x22; &#x2b; sendtime.substr&#x28;2, 2&#x29;&#x3b;&#xa; &#x7d; else &#x7b; &#x2f;&#x2f; &#x65e0;&#x5206;&#x9694;&#x7b26;&#xff0c;&#x6539;&#x6210;&#x5192;&#x53f7;&#x5206;&#x9694;&#xa; sendtime_calcu &#x3d; sendtime.substr&#x28;0, 2&#x29; &#x2b; &#x22;&#x3a;&#x22; &#x2b; sendtime.substr&#x28;2, 2&#x29;&#x3b;&#xa; &#x7d;&#xa;&#x7d; else if &#x28;sendtime.length &#x3d;&#x3d; 3&#x29; &#x7b; &#x2f;&#x2f; &#x65e0;&#x5206;&#x9694;&#x7b26;&#xff0c;&#x6539;&#x6210;&#x5192;&#x53f7;&#x5206;&#x9694;&#xa; sendtime_calcu &#x3d; sendtime.substr&#x28;0, 1&#x29; &#x2b; &#x22;&#x3a;&#x22; &#x2b; sendtime.substr&#x28;1, 2&#x29;&#x3b;&#xa;&#x7d;&#xa;&#xa;&#x2f;&#x2f; &#x5168;&#x90e8;&#x4fee;&#x6b63;&#x5b8c;&#x6bd5;&#x540e;&#xff0c;&#x5982;&#x679c;&#x957f;&#x5ea6;&#x4e0d;&#x662f;5&#xff0c;&#x524d;&#x9762;&#x8865;0&#xa;if &#x28;sendtime_calcu.length &#x21;&#x3d; 5&#x29; &#x7b;&#xa; sendtime_calcu &#x3d; &#x22;0&#x22; &#x2b; sendtime_calcu&#x3b;&#xa;&#x7d;&#xa;&#xa;&#x2f;&#x2f; &#x8bbe;&#x7f6e;&#x5206;&#x73ed;&#xa;var isfb &#x3d; 0&#x3b;&#xa;&#xa;&#x2f;&#x2f; &#x8bbe;&#x7f6e;&#x505c;&#x9a76;&#xa;var ists &#x3d; 0&#x3b;&#xa;&#xa;&#x2f;&#x2f; &#x8bbe;&#x7f6e;isCanceled&#xa;var iscanceled &#x3d; 0&#x3b;</jsScript_script>
  1211 + </jsScript> </jsScripts> <fields> <field> <name>qdzname</name>
  1212 + <rename>qdzname</rename>
  1213 + <type>String</type>
  1214 + <length>-1</length>
  1215 + <precision>-1</precision>
  1216 + <replace>Y</replace>
  1217 + </field> <field> <name>isfb</name>
  1218 + <rename>isfb</rename>
  1219 + <type>Integer</type>
  1220 + <length>-1</length>
  1221 + <precision>-1</precision>
  1222 + <replace>N</replace>
  1223 + </field> <field> <name>iscanceled</name>
  1224 + <rename>iscanceled</rename>
  1225 + <type>Integer</type>
  1226 + <length>-1</length>
  1227 + <precision>-1</precision>
  1228 + <replace>N</replace>
  1229 + </field> <field> <name>sendtime_calcu</name>
  1230 + <rename>sendtime_calcu</rename>
  1231 + <type>String</type>
  1232 + <length>-1</length>
  1233 + <precision>-1</precision>
  1234 + <replace>N</replace>
  1235 + </field> <field> <name>ists</name>
  1236 + <rename>ists</rename>
  1237 + <type>Integer</type>
  1238 + <length>-1</length>
  1239 + <precision>-1</precision>
  1240 + <replace>N</replace>
  1241 + </field> </fields> <cluster_schema/>
  1242 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1243 + <xloc>788</xloc>
  1244 + <yloc>44</yloc>
  1245 + <draw>Y</draw>
  1246 + </GUI>
  1247 + </step>
  1248 +
  1249 + <step>
  1250 + <name>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</name>
  1251 + <type>SelectValues</type>
  1252 + <description/>
  1253 + <distribute>Y</distribute>
  1254 + <custom_distribution/>
  1255 + <copies>1</copies>
  1256 + <partitioning>
  1257 + <method>none</method>
  1258 + <schema_name/>
  1259 + </partitioning>
  1260 + <fields> <field> <name>&#x8def;&#x724c;-&#x3e;&#x5de5;&#x65f6;</name>
  1261 + <rename>lpWithGs</rename>
  1262 + <length>-2</length>
  1263 + <precision>-2</precision>
  1264 + </field> <field> <name>&#x7ad9;&#x70b9;&#x540d;&#x79f0;</name>
  1265 + <rename>qdzname</rename>
  1266 + <length>-2</length>
  1267 + <precision>-2</precision>
  1268 + </field> <field> <name>&#x53d1;&#x8f66;&#x65f6;&#x95f4;</name>
  1269 + <rename>sendtime</rename>
  1270 + <length>-2</length>
  1271 + <precision>-2</precision>
  1272 + </field> <select_unspecified>Y</select_unspecified>
  1273 + </fields> <cluster_schema/>
  1274 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1275 + <xloc>441</xloc>
  1276 + <yloc>137</yloc>
  1277 + <draw>Y</draw>
  1278 + </GUI>
  1279 + </step>
  1280 +
  1281 + <step>
  1282 + <name>&#x6309;&#x7167;&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x8fc7;&#x6ee4;&#x6570;&#x636e;1</name>
  1283 + <type>FilterRows</type>
  1284 + <description/>
  1285 + <distribute>Y</distribute>
  1286 + <custom_distribution/>
  1287 + <copies>1</copies>
  1288 + <partitioning>
  1289 + <method>none</method>
  1290 + <schema_name/>
  1291 + </partitioning>
  1292 +<send_true_to>&#x6b63;&#x5e38;&#x73ed;&#x6b21;&#x6570;&#x636e;</send_true_to>
  1293 +<send_false_to>&#x6309;&#x7167;&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x8fc7;&#x6ee4;&#x6570;&#x636e;2</send_false_to>
  1294 + <compare>
  1295 +<condition>
  1296 + <negated>N</negated>
  1297 + <leftvalue>bctype</leftvalue>
  1298 + <function>&#x3d;</function>
  1299 + <rightvalue/>
  1300 + <value><name>constant</name><type>String</type><text>&#x6b63;&#x5e38;&#x73ed;&#x6b21;</text><length>-1</length><precision>-1</precision><isnull>N</isnull><mask/></value> </condition>
  1301 + </compare>
  1302 + <cluster_schema/>
  1303 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1304 + <xloc>860</xloc>
  1305 + <yloc>401</yloc>
  1306 + <draw>Y</draw>
  1307 + </GUI>
  1308 + </step>
  1309 +
  1310 + <step>
  1311 + <name>&#x6309;&#x7167;&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x8fc7;&#x6ee4;&#x6570;&#x636e;2</name>
  1312 + <type>FilterRows</type>
  1313 + <description/>
  1314 + <distribute>Y</distribute>
  1315 + <custom_distribution/>
  1316 + <copies>1</copies>
  1317 + <partitioning>
  1318 + <method>none</method>
  1319 + <schema_name/>
  1320 + </partitioning>
  1321 +<send_true_to>&#x51fa;&#x573a;&#x73ed;&#x6b21;&#x6570;&#x636e;</send_true_to>
  1322 +<send_false_to>&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x6570;&#x636e;</send_false_to>
  1323 + <compare>
  1324 +<condition>
  1325 + <negated>N</negated>
  1326 + <leftvalue>bctype</leftvalue>
  1327 + <function>&#x3d;</function>
  1328 + <rightvalue/>
  1329 + <value><name>constant</name><type>String</type><text>&#x51fa;&#x573a;</text><length>-1</length><precision>-1</precision><isnull>N</isnull><mask/></value> </condition>
  1330 + </compare>
  1331 + <cluster_schema/>
  1332 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1333 + <xloc>995</xloc>
  1334 + <yloc>503</yloc>
  1335 + <draw>Y</draw>
  1336 + </GUI>
  1337 + </step>
  1338 +
  1339 + <step>
  1340 + <name>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_s_ttinfo_detail</name>
  1341 + <type>InsertUpdate</type>
  1342 + <description/>
  1343 + <distribute>Y</distribute>
  1344 + <custom_distribution/>
  1345 + <copies>1</copies>
  1346 + <partitioning>
  1347 + <method>none</method>
  1348 + <schema_name/>
  1349 + </partitioning>
  1350 + <connection>control_jndi</connection>
  1351 + <commit>100</commit>
  1352 + <update_bypassed>N</update_bypassed>
  1353 + <lookup>
  1354 + <schema/>
  1355 + <table>bsth_c_s_ttinfo_detail</table>
  1356 + <key>
  1357 + <name>xlid</name>
  1358 + <field>xl</field>
  1359 + <condition>&#x3d;</condition>
  1360 + <name2/>
  1361 + </key>
  1362 + <key>
  1363 + <name>ttid</name>
  1364 + <field>ttinfo</field>
  1365 + <condition>&#x3d;</condition>
  1366 + <name2/>
  1367 + </key>
  1368 + <key>
  1369 + <name>lpid</name>
  1370 + <field>lp</field>
  1371 + <condition>&#x3d;</condition>
  1372 + <name2/>
  1373 + </key>
  1374 + <key>
  1375 + <name>fcno</name>
  1376 + <field>fcno</field>
  1377 + <condition>&#x3d;</condition>
  1378 + <name2/>
  1379 + </key>
  1380 + <key>
  1381 + <name>bcs</name>
  1382 + <field>bcs</field>
  1383 + <condition>&#x3d;</condition>
  1384 + <name2/>
  1385 + </key>
  1386 + <value>
  1387 + <name>lp</name>
  1388 + <rename>lpid</rename>
  1389 + <update>Y</update>
  1390 + </value>
  1391 + <value>
  1392 + <name>bc_type</name>
  1393 + <rename>bctype_code</rename>
  1394 + <update>Y</update>
  1395 + </value>
  1396 + <value>
  1397 + <name>bcs</name>
  1398 + <rename>bcs</rename>
  1399 + <update>Y</update>
  1400 + </value>
  1401 + <value>
  1402 + <name>bcsj</name>
  1403 + <rename>bcsj</rename>
  1404 + <update>Y</update>
  1405 + </value>
  1406 + <value>
  1407 + <name>fcno</name>
  1408 + <rename>fcno</rename>
  1409 + <update>Y</update>
  1410 + </value>
  1411 + <value>
  1412 + <name>jhlc</name>
  1413 + <rename>jhlc</rename>
  1414 + <update>Y</update>
  1415 + </value>
  1416 + <value>
  1417 + <name>fcsj</name>
  1418 + <rename>sendtime_calcu</rename>
  1419 + <update>Y</update>
  1420 + </value>
  1421 + <value>
  1422 + <name>ttinfo</name>
  1423 + <rename>ttid</rename>
  1424 + <update>Y</update>
  1425 + </value>
  1426 + <value>
  1427 + <name>xl</name>
  1428 + <rename>xlid</rename>
  1429 + <update>Y</update>
  1430 + </value>
  1431 + <value>
  1432 + <name>qdz</name>
  1433 + <rename>qdzid</rename>
  1434 + <update>Y</update>
  1435 + </value>
  1436 + <value>
  1437 + <name>zdz</name>
  1438 + <rename>zdzid</rename>
  1439 + <update>Y</update>
  1440 + </value>
  1441 + <value>
  1442 + <name>xl_dir</name>
  1443 + <rename>sxx</rename>
  1444 + <update>Y</update>
  1445 + </value>
  1446 + <value>
  1447 + <name>isfb</name>
  1448 + <rename>isfb</rename>
  1449 + <update>Y</update>
  1450 + </value>
  1451 + <value>
  1452 + <name>qdz_code</name>
  1453 + <rename>qdzcode</rename>
  1454 + <update>Y</update>
  1455 + </value>
  1456 + <value>
  1457 + <name>qdz_name</name>
  1458 + <rename>qdzname_</rename>
  1459 + <update>Y</update>
  1460 + </value>
  1461 + <value>
  1462 + <name>zdz_code</name>
  1463 + <rename>zdzcode</rename>
  1464 + <update>Y</update>
  1465 + </value>
  1466 + <value>
  1467 + <name>zdz_name</name>
  1468 + <rename>zdzname</rename>
  1469 + <update>Y</update>
  1470 + </value>
  1471 + <value>
  1472 + <name>ists</name>
  1473 + <rename>ists</rename>
  1474 + <update>Y</update>
  1475 + </value>
  1476 + <value>
  1477 + <name>line_version</name>
  1478 + <rename>version</rename>
  1479 + <update>Y</update>
  1480 + </value>
  1481 + </lookup>
  1482 + <cluster_schema/>
  1483 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1484 + <xloc>143</xloc>
  1485 + <yloc>860</yloc>
  1486 + <draw>Y</draw>
  1487 + </GUI>
  1488 + </step>
  1489 +
  1490 + <step>
  1491 + <name>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_s_ttinfo_detail 2</name>
  1492 + <type>InsertUpdate</type>
  1493 + <description/>
  1494 + <distribute>Y</distribute>
  1495 + <custom_distribution/>
  1496 + <copies>1</copies>
  1497 + <partitioning>
  1498 + <method>none</method>
  1499 + <schema_name/>
  1500 + </partitioning>
  1501 + <connection>control_jndi</connection>
  1502 + <commit>100</commit>
  1503 + <update_bypassed>N</update_bypassed>
  1504 + <lookup>
  1505 + <schema/>
  1506 + <table>bsth_c_s_ttinfo_detail</table>
  1507 + <key>
  1508 + <name>xlid</name>
  1509 + <field>xl</field>
  1510 + <condition>&#x3d;</condition>
  1511 + <name2/>
  1512 + </key>
  1513 + <key>
  1514 + <name>ttid</name>
  1515 + <field>ttinfo</field>
  1516 + <condition>&#x3d;</condition>
  1517 + <name2/>
  1518 + </key>
  1519 + <key>
  1520 + <name>lpid</name>
  1521 + <field>lp</field>
  1522 + <condition>&#x3d;</condition>
  1523 + <name2/>
  1524 + </key>
  1525 + <key>
  1526 + <name>fcno</name>
  1527 + <field>fcno</field>
  1528 + <condition>&#x3d;</condition>
  1529 + <name2/>
  1530 + </key>
  1531 + <key>
  1532 + <name>bcs</name>
  1533 + <field>bcs</field>
  1534 + <condition>&#x3d;</condition>
  1535 + <name2/>
  1536 + </key>
  1537 + <value>
  1538 + <name>tcc</name>
  1539 + <rename>qdzid</rename>
  1540 + <update>Y</update>
  1541 + </value>
  1542 + <value>
  1543 + <name>zdz</name>
  1544 + <rename>zdzid</rename>
  1545 + <update>Y</update>
  1546 + </value>
  1547 + <value>
  1548 + <name>xl</name>
  1549 + <rename>xlid</rename>
  1550 + <update>Y</update>
  1551 + </value>
  1552 + <value>
  1553 + <name>ttinfo</name>
  1554 + <rename>ttid</rename>
  1555 + <update>Y</update>
  1556 + </value>
  1557 + <value>
  1558 + <name>xl_dir</name>
  1559 + <rename>sxx</rename>
  1560 + <update>Y</update>
  1561 + </value>
  1562 + <value>
  1563 + <name>lp</name>
  1564 + <rename>lpid</rename>
  1565 + <update>Y</update>
  1566 + </value>
  1567 + <value>
  1568 + <name>jhlc</name>
  1569 + <rename>out_mileage</rename>
  1570 + <update>Y</update>
  1571 + </value>
  1572 + <value>
  1573 + <name>fcsj</name>
  1574 + <rename>sendtime_calcu</rename>
  1575 + <update>Y</update>
  1576 + </value>
  1577 + <value>
  1578 + <name>bcsj</name>
  1579 + <rename>out_time</rename>
  1580 + <update>Y</update>
  1581 + </value>
  1582 + <value>
  1583 + <name>bcs</name>
  1584 + <rename>bcs</rename>
  1585 + <update>Y</update>
  1586 + </value>
  1587 + <value>
  1588 + <name>fcno</name>
  1589 + <rename>fcno</rename>
  1590 + <update>Y</update>
  1591 + </value>
  1592 + <value>
  1593 + <name>bc_type</name>
  1594 + <rename>bctype_code</rename>
  1595 + <update>Y</update>
  1596 + </value>
  1597 + <value>
  1598 + <name>isfb</name>
  1599 + <rename>isfb</rename>
  1600 + <update>Y</update>
  1601 + </value>
  1602 + <value>
  1603 + <name>qdz_code</name>
  1604 + <rename>qdzcode</rename>
  1605 + <update>Y</update>
  1606 + </value>
  1607 + <value>
  1608 + <name>qdz_name</name>
  1609 + <rename>tn</rename>
  1610 + <update>Y</update>
  1611 + </value>
  1612 + <value>
  1613 + <name>zdz_code</name>
  1614 + <rename>zdzcode</rename>
  1615 + <update>Y</update>
  1616 + </value>
  1617 + <value>
  1618 + <name>zdz_name</name>
  1619 + <rename>zdzname_</rename>
  1620 + <update>Y</update>
  1621 + </value>
  1622 + <value>
  1623 + <name>ists</name>
  1624 + <rename>ists</rename>
  1625 + <update>Y</update>
  1626 + </value>
  1627 + <value>
  1628 + <name>line_version</name>
  1629 + <rename>version</rename>
  1630 + <update>Y</update>
  1631 + </value>
  1632 + </lookup>
  1633 + <cluster_schema/>
  1634 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1635 + <xloc>340</xloc>
  1636 + <yloc>1087</yloc>
  1637 + <draw>Y</draw>
  1638 + </GUI>
  1639 + </step>
  1640 +
  1641 + <step>
  1642 + <name>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_s_ttinfo_detail 3</name>
  1643 + <type>InsertUpdate</type>
  1644 + <description/>
  1645 + <distribute>Y</distribute>
  1646 + <custom_distribution/>
  1647 + <copies>1</copies>
  1648 + <partitioning>
  1649 + <method>none</method>
  1650 + <schema_name/>
  1651 + </partitioning>
  1652 + <connection>control_jndi</connection>
  1653 + <commit>100</commit>
  1654 + <update_bypassed>N</update_bypassed>
  1655 + <lookup>
  1656 + <schema/>
  1657 + <table>bsth_c_s_ttinfo_detail</table>
  1658 + <key>
  1659 + <name>xlid</name>
  1660 + <field>xl</field>
  1661 + <condition>&#x3d;</condition>
  1662 + <name2/>
  1663 + </key>
  1664 + <key>
  1665 + <name>ttid</name>
  1666 + <field>ttinfo</field>
  1667 + <condition>&#x3d;</condition>
  1668 + <name2/>
  1669 + </key>
  1670 + <key>
  1671 + <name>lpid</name>
  1672 + <field>lp</field>
  1673 + <condition>&#x3d;</condition>
  1674 + <name2/>
  1675 + </key>
  1676 + <key>
  1677 + <name>fcno</name>
  1678 + <field>fcno</field>
  1679 + <condition>&#x3d;</condition>
  1680 + <name2/>
  1681 + </key>
  1682 + <key>
  1683 + <name>bcs</name>
  1684 + <field>bcs</field>
  1685 + <condition>&#x3d;</condition>
  1686 + <name2/>
  1687 + </key>
  1688 + <value>
  1689 + <name>fcno</name>
  1690 + <rename>fcno</rename>
  1691 + <update>Y</update>
  1692 + </value>
  1693 + <value>
  1694 + <name>bcs</name>
  1695 + <rename>bcs</rename>
  1696 + <update>Y</update>
  1697 + </value>
  1698 + <value>
  1699 + <name>xl</name>
  1700 + <rename>xlid</rename>
  1701 + <update>Y</update>
  1702 + </value>
  1703 + <value>
  1704 + <name>ttinfo</name>
  1705 + <rename>ttid</rename>
  1706 + <update>Y</update>
  1707 + </value>
  1708 + <value>
  1709 + <name>lp</name>
  1710 + <rename>lpid</rename>
  1711 + <update>Y</update>
  1712 + </value>
  1713 + <value>
  1714 + <name>bc_type</name>
  1715 + <rename>bctype_code</rename>
  1716 + <update>Y</update>
  1717 + </value>
  1718 + <value>
  1719 + <name>bcsj</name>
  1720 + <rename>parade_time</rename>
  1721 + <update>Y</update>
  1722 + </value>
  1723 + <value>
  1724 + <name>jhlc</name>
  1725 + <rename>parade_mileage</rename>
  1726 + <update>Y</update>
  1727 + </value>
  1728 + <value>
  1729 + <name>fcsj</name>
  1730 + <rename>sendtime_calcu</rename>
  1731 + <update>Y</update>
  1732 + </value>
  1733 + <value>
  1734 + <name>xl_dir</name>
  1735 + <rename>sxx2</rename>
  1736 + <update>Y</update>
  1737 + </value>
  1738 + <value>
  1739 + <name>qdz</name>
  1740 + <rename>qdzid</rename>
  1741 + <update>Y</update>
  1742 + </value>
  1743 + <value>
  1744 + <name>tcc</name>
  1745 + <rename>zdzid</rename>
  1746 + <update>Y</update>
  1747 + </value>
  1748 + <value>
  1749 + <name>isfb</name>
  1750 + <rename>isfb</rename>
  1751 + <update>Y</update>
  1752 + </value>
  1753 + <value>
  1754 + <name>qdz_code</name>
  1755 + <rename>qdzcode</rename>
  1756 + <update>Y</update>
  1757 + </value>
  1758 + <value>
  1759 + <name>qdz_name</name>
  1760 + <rename>qname</rename>
  1761 + <update>Y</update>
  1762 + </value>
  1763 + <value>
  1764 + <name>zdz_code</name>
  1765 + <rename>zdzcode</rename>
  1766 + <update>Y</update>
  1767 + </value>
  1768 + <value>
  1769 + <name>zdz_name</name>
  1770 + <rename>tn</rename>
  1771 + <update>Y</update>
  1772 + </value>
  1773 + <value>
  1774 + <name>ists</name>
  1775 + <rename>ists</rename>
  1776 + <update>Y</update>
  1777 + </value>
  1778 + <value>
  1779 + <name>line_version</name>
  1780 + <rename>version</rename>
  1781 + <update>Y</update>
  1782 + </value>
  1783 + </lookup>
  1784 + <cluster_schema/>
  1785 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1786 + <xloc>845</xloc>
  1787 + <yloc>899</yloc>
  1788 + <draw>Y</draw>
  1789 + </GUI>
  1790 + </step>
  1791 +
  1792 + <step>
  1793 + <name>&#x65f6;&#x523b;&#x8868;&#x660e;&#x7ec6;&#x4fe1;&#x606f;Excel&#x8f93;&#x5165;</name>
  1794 + <type>ExcelInput</type>
  1795 + <description/>
  1796 + <distribute>Y</distribute>
  1797 + <custom_distribution/>
  1798 + <copies>1</copies>
  1799 + <partitioning>
  1800 + <method>none</method>
  1801 + <schema_name/>
  1802 + </partitioning>
  1803 + <header>Y</header>
  1804 + <noempty>Y</noempty>
  1805 + <stoponempty>N</stoponempty>
  1806 + <filefield/>
  1807 + <sheetfield/>
  1808 + <sheetrownumfield/>
  1809 + <rownumfield/>
  1810 + <sheetfield/>
  1811 + <filefield/>
  1812 + <limit>0</limit>
  1813 + <encoding/>
  1814 + <add_to_result_filenames>Y</add_to_result_filenames>
  1815 + <accept_filenames>N</accept_filenames>
  1816 + <accept_field/>
  1817 + <accept_stepname/>
  1818 + <file>
  1819 + <name/>
  1820 + <filemask/>
  1821 + <exclude_filemask/>
  1822 + <file_required>N</file_required>
  1823 + <include_subfolders>N</include_subfolders>
  1824 + </file>
  1825 + <fields>
  1826 + </fields>
  1827 + <sheets>
  1828 + <sheet>
  1829 + <name/>
  1830 + <startrow>0</startrow>
  1831 + <startcol>0</startcol>
  1832 + </sheet>
  1833 + </sheets>
  1834 + <strict_types>N</strict_types>
  1835 + <error_ignored>N</error_ignored>
  1836 + <error_line_skipped>N</error_line_skipped>
  1837 + <bad_line_files_destination_directory/>
  1838 + <bad_line_files_extension>warning</bad_line_files_extension>
  1839 + <error_line_files_destination_directory/>
  1840 + <error_line_files_extension>error</error_line_files_extension>
  1841 + <line_number_files_destination_directory/>
  1842 + <line_number_files_extension>line</line_number_files_extension>
  1843 + <shortFileFieldName/>
  1844 + <pathFieldName/>
  1845 + <hiddenFieldName/>
  1846 + <lastModificationTimeFieldName/>
  1847 + <uriNameFieldName/>
  1848 + <rootUriNameFieldName/>
  1849 + <extensionFieldName/>
  1850 + <sizeFieldName/>
  1851 + <spreadsheet_type>JXL</spreadsheet_type>
  1852 + <cluster_schema/>
  1853 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1854 + <xloc>112</xloc>
  1855 + <yloc>44</yloc>
  1856 + <draw>Y</draw>
  1857 + </GUI>
  1858 + </step>
  1859 +
  1860 + <step>
  1861 + <name>&#x66f4;&#x65b0;&#x65f6;&#x523b;&#x8868;&#x4e3b;&#x8868;&#x7248;&#x672c;</name>
  1862 + <type>Update</type>
  1863 + <description/>
  1864 + <distribute>Y</distribute>
  1865 + <custom_distribution/>
  1866 + <copies>1</copies>
  1867 + <partitioning>
  1868 + <method>none</method>
  1869 + <schema_name/>
  1870 + </partitioning>
  1871 + <connection>control_jndi</connection>
  1872 + <skip_lookup>N</skip_lookup>
  1873 + <commit>100</commit>
  1874 + <use_batch>N</use_batch>
  1875 + <error_ignored>N</error_ignored>
  1876 + <ignore_flag_field/>
  1877 + <lookup>
  1878 + <schema/>
  1879 + <table>bsth_c_s_ttinfo</table>
  1880 + <key>
  1881 + <name>ttid</name>
  1882 + <field>id</field>
  1883 + <condition>&#x3d;</condition>
  1884 + <name2/>
  1885 + </key>
  1886 + <value>
  1887 + <name>line_version</name>
  1888 + <rename>version</rename>
  1889 + </value>
  1890 + </lookup>
  1891 + <cluster_schema/>
  1892 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1893 + <xloc>863</xloc>
  1894 + <yloc>338</yloc>
  1895 + <draw>Y</draw>
  1896 + </GUI>
  1897 + </step>
  1898 +
  1899 + <step>
  1900 + <name>&#x67e5;&#x627e;&#x505c;&#x8f66;&#x573a;1</name>
  1901 + <type>DBLookup</type>
  1902 + <description/>
  1903 + <distribute>Y</distribute>
  1904 + <custom_distribution/>
  1905 + <copies>1</copies>
  1906 + <partitioning>
  1907 + <method>none</method>
  1908 + <schema_name/>
  1909 + </partitioning>
  1910 + <connection>control_jndi</connection>
  1911 + <cache>N</cache>
  1912 + <cache_load_all>N</cache_load_all>
  1913 + <cache_size>0</cache_size>
  1914 + <lookup>
  1915 + <schema/>
  1916 + <table>bsth_c_car_park</table>
  1917 + <orderby/>
  1918 + <fail_on_multiple>N</fail_on_multiple>
  1919 + <eat_row_on_failure>N</eat_row_on_failure>
  1920 + <key>
  1921 + <name>tccname_</name>
  1922 + <field>park_name</field>
  1923 + <condition>&#x3d;</condition>
  1924 + <name2/>
  1925 + </key>
  1926 + <value>
  1927 + <name>id</name>
  1928 + <rename>qdzid</rename>
  1929 + <default/>
  1930 + <type>Integer</type>
  1931 + </value>
  1932 + <value>
  1933 + <name>park_code</name>
  1934 + <rename>qdzcode</rename>
  1935 + <default/>
  1936 + <type>String</type>
  1937 + </value>
  1938 + <value>
  1939 + <name>park_name</name>
  1940 + <rename>tn</rename>
  1941 + <default/>
  1942 + <type>String</type>
  1943 + </value>
  1944 + </lookup>
  1945 + <cluster_schema/>
  1946 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1947 + <xloc>755</xloc>
  1948 + <yloc>504</yloc>
  1949 + <draw>Y</draw>
  1950 + </GUI>
  1951 + </step>
  1952 +
  1953 + <step>
  1954 + <name>&#x67e5;&#x627e;&#x505c;&#x8f66;&#x573a;2</name>
  1955 + <type>DBLookup</type>
  1956 + <description/>
  1957 + <distribute>Y</distribute>
  1958 + <custom_distribution/>
  1959 + <copies>1</copies>
  1960 + <partitioning>
  1961 + <method>none</method>
  1962 + <schema_name/>
  1963 + </partitioning>
  1964 + <connection>control_jndi</connection>
  1965 + <cache>N</cache>
  1966 + <cache_load_all>N</cache_load_all>
  1967 + <cache_size>0</cache_size>
  1968 + <lookup>
  1969 + <schema/>
  1970 + <table>bsth_c_car_park</table>
  1971 + <orderby/>
  1972 + <fail_on_multiple>N</fail_on_multiple>
  1973 + <eat_row_on_failure>N</eat_row_on_failure>
  1974 + <key>
  1975 + <name>tccname_</name>
  1976 + <field>park_name</field>
  1977 + <condition>&#x3d;</condition>
  1978 + <name2/>
  1979 + </key>
  1980 + <value>
  1981 + <name>id</name>
  1982 + <rename>zdzid</rename>
  1983 + <default/>
  1984 + <type>Integer</type>
  1985 + </value>
  1986 + <value>
  1987 + <name>park_code</name>
  1988 + <rename>zdzcode</rename>
  1989 + <default/>
  1990 + <type>String</type>
  1991 + </value>
  1992 + <value>
  1993 + <name>park_name</name>
  1994 + <rename>tn</rename>
  1995 + <default/>
  1996 + <type>String</type>
  1997 + </value>
  1998 + </lookup>
  1999 + <cluster_schema/>
  2000 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2001 + <xloc>887</xloc>
  2002 + <yloc>608</yloc>
  2003 + <draw>Y</draw>
  2004 + </GUI>
  2005 + </step>
  2006 +
  2007 + <step>
  2008 + <name>&#x67e5;&#x627e;&#x51fa;&#x573a;&#x7ec8;&#x70b9;&#x7ad9;&#x5173;&#x8054;&#x5e76;&#x786e;&#x5b9a;&#x4e0a;&#x4e0b;&#x884c;</name>
  2009 + <type>DBLookup</type>
  2010 + <description/>
  2011 + <distribute>Y</distribute>
  2012 + <custom_distribution/>
  2013 + <copies>1</copies>
  2014 + <partitioning>
  2015 + <method>none</method>
  2016 + <schema_name/>
  2017 + </partitioning>
  2018 + <connection>control_jndi</connection>
  2019 + <cache>N</cache>
  2020 + <cache_load_all>N</cache_load_all>
  2021 + <cache_size>0</cache_size>
  2022 + <lookup>
  2023 + <schema/>
  2024 + <table>bsth_c_ls_stationroute</table>
  2025 + <orderby/>
  2026 + <fail_on_multiple>N</fail_on_multiple>
  2027 + <eat_row_on_failure>N</eat_row_on_failure>
  2028 + <key>
  2029 + <name>xlid</name>
  2030 + <field>line</field>
  2031 + <condition>&#x3d;</condition>
  2032 + <name2/>
  2033 + </key>
  2034 + <key>
  2035 + <name>version</name>
  2036 + <field>versions</field>
  2037 + <condition>&#x3d;</condition>
  2038 + <name2/>
  2039 + </key>
  2040 + <key>
  2041 + <name>zdzname</name>
  2042 + <field>station_name</field>
  2043 + <condition>LIKE</condition>
  2044 + <name2/>
  2045 + </key>
  2046 + <key>
  2047 + <name>endZdtype</name>
  2048 + <field>station_mark</field>
  2049 + <condition>&#x3d;</condition>
  2050 + <name2/>
  2051 + </key>
  2052 + <key>
  2053 + <name>destory</name>
  2054 + <field>destroy</field>
  2055 + <condition>&#x3d;</condition>
  2056 + <name2/>
  2057 + </key>
  2058 + <value>
  2059 + <name>station</name>
  2060 + <rename>zdzid</rename>
  2061 + <default/>
  2062 + <type>Integer</type>
  2063 + </value>
  2064 + <value>
  2065 + <name>directions</name>
  2066 + <rename>sxx</rename>
  2067 + <default/>
  2068 + <type>Integer</type>
  2069 + </value>
  2070 + <value>
  2071 + <name>station_code</name>
  2072 + <rename>zdzcode</rename>
  2073 + <default/>
  2074 + <type>String</type>
  2075 + </value>
  2076 + <value>
  2077 + <name>station_name</name>
  2078 + <rename>zdzname_</rename>
  2079 + <default/>
  2080 + <type>String</type>
  2081 + </value>
  2082 + </lookup>
  2083 + <cluster_schema/>
  2084 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2085 + <xloc>329</xloc>
  2086 + <yloc>505</yloc>
  2087 + <draw>Y</draw>
  2088 + </GUI>
  2089 + </step>
  2090 +
  2091 + <step>
  2092 + <name>&#x67e5;&#x627e;&#x6240;&#x6709;&#x7ebf;&#x8def;&#x4e0a;&#x4e0b;&#x884c;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</name>
  2093 + <type>DBLookup</type>
  2094 + <description/>
  2095 + <distribute>Y</distribute>
  2096 + <custom_distribution/>
  2097 + <copies>1</copies>
  2098 + <partitioning>
  2099 + <method>none</method>
  2100 + <schema_name/>
  2101 + </partitioning>
  2102 + <connection>control_jndi</connection>
  2103 + <cache>N</cache>
  2104 + <cache_load_all>N</cache_load_all>
  2105 + <cache_size>0</cache_size>
  2106 + <lookup>
  2107 + <schema/>
  2108 + <table>bsth_c_line_information</table>
  2109 + <orderby/>
  2110 + <fail_on_multiple>N</fail_on_multiple>
  2111 + <eat_row_on_failure>N</eat_row_on_failure>
  2112 + <key>
  2113 + <name>xlid</name>
  2114 + <field>line</field>
  2115 + <condition>&#x3d;</condition>
  2116 + <name2/>
  2117 + </key>
  2118 + <value>
  2119 + <name>up_mileage</name>
  2120 + <rename>up_mileage</rename>
  2121 + <default/>
  2122 + <type>Number</type>
  2123 + </value>
  2124 + <value>
  2125 + <name>down_mileage</name>
  2126 + <rename>down_mileage</rename>
  2127 + <default/>
  2128 + <type>Number</type>
  2129 + </value>
  2130 + <value>
  2131 + <name>up_travel_time</name>
  2132 + <rename>up_travel_time</rename>
  2133 + <default/>
  2134 + <type>Number</type>
  2135 + </value>
  2136 + <value>
  2137 + <name>down_travel_time</name>
  2138 + <rename>down_travel_time</rename>
  2139 + <default/>
  2140 + <type>Number</type>
  2141 + </value>
  2142 + <value>
  2143 + <name>early_start_time</name>
  2144 + <rename>early_start_time</rename>
  2145 + <default/>
  2146 + <type>String</type>
  2147 + </value>
  2148 + <value>
  2149 + <name>early_end_time</name>
  2150 + <rename>early_end_time</rename>
  2151 + <default/>
  2152 + <type>String</type>
  2153 + </value>
  2154 + <value>
  2155 + <name>early_up_time</name>
  2156 + <rename>early_up_time</rename>
  2157 + <default/>
  2158 + <type>Number</type>
  2159 + </value>
  2160 + <value>
  2161 + <name>early_down_time</name>
  2162 + <rename>early_down_time</rename>
  2163 + <default/>
  2164 + <type>Number</type>
  2165 + </value>
  2166 + <value>
  2167 + <name>late_start_time</name>
  2168 + <rename>late_start_time</rename>
  2169 + <default/>
  2170 + <type>String</type>
  2171 + </value>
  2172 + <value>
  2173 + <name>late_end_time</name>
  2174 + <rename>late_end_time</rename>
  2175 + <default/>
  2176 + <type>String</type>
  2177 + </value>
  2178 + <value>
  2179 + <name>late_up_time</name>
  2180 + <rename>late_up_time</rename>
  2181 + <default/>
  2182 + <type>Number</type>
  2183 + </value>
  2184 + <value>
  2185 + <name>late_down_time</name>
  2186 + <rename>late_down_time</rename>
  2187 + <default/>
  2188 + <type>Number</type>
  2189 + </value>
  2190 + </lookup>
  2191 + <cluster_schema/>
  2192 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2193 + <xloc>149</xloc>
  2194 + <yloc>581</yloc>
  2195 + <draw>Y</draw>
  2196 + </GUI>
  2197 + </step>
  2198 +
  2199 + <step>
  2200 + <name>&#x67e5;&#x627e;&#x65f6;&#x523b;&#x8868;&#x57fa;&#x7840;&#x4fe1;&#x606f;&#x5173;&#x8054;</name>
  2201 + <type>DBLookup</type>
  2202 + <description/>
  2203 + <distribute>Y</distribute>
  2204 + <custom_distribution/>
  2205 + <copies>1</copies>
  2206 + <partitioning>
  2207 + <method>none</method>
  2208 + <schema_name/>
  2209 + </partitioning>
  2210 + <connection>control_jndi</connection>
  2211 + <cache>N</cache>
  2212 + <cache_load_all>N</cache_load_all>
  2213 + <cache_size>0</cache_size>
  2214 + <lookup>
  2215 + <schema/>
  2216 + <table>bsth_c_s_ttinfo</table>
  2217 + <orderby/>
  2218 + <fail_on_multiple>N</fail_on_multiple>
  2219 + <eat_row_on_failure>N</eat_row_on_failure>
  2220 + <key>
  2221 + <name>xlid</name>
  2222 + <field>xl</field>
  2223 + <condition>&#x3d;</condition>
  2224 + <name2/>
  2225 + </key>
  2226 + <key>
  2227 + <name>ttinfoname_</name>
  2228 + <field>name</field>
  2229 + <condition>&#x3d;</condition>
  2230 + <name2/>
  2231 + </key>
  2232 + <key>
  2233 + <name>iscanceled</name>
  2234 + <field>is_cancel</field>
  2235 + <condition>&#x3d;</condition>
  2236 + <name2/>
  2237 + </key>
  2238 + <value>
  2239 + <name>id</name>
  2240 + <rename>ttid</rename>
  2241 + <default/>
  2242 + <type>Integer</type>
  2243 + </value>
  2244 + </lookup>
  2245 + <cluster_schema/>
  2246 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2247 + <xloc>1011</xloc>
  2248 + <yloc>134</yloc>
  2249 + <draw>Y</draw>
  2250 + </GUI>
  2251 + </step>
  2252 +
  2253 + <step>
  2254 + <name>&#x67e5;&#x627e;&#x7ebf;&#x8def;&#x5173;&#x8054;</name>
  2255 + <type>DBLookup</type>
  2256 + <description/>
  2257 + <distribute>Y</distribute>
  2258 + <custom_distribution/>
  2259 + <copies>1</copies>
  2260 + <partitioning>
  2261 + <method>none</method>
  2262 + <schema_name/>
  2263 + </partitioning>
  2264 + <connection>control_jndi</connection>
  2265 + <cache>N</cache>
  2266 + <cache_load_all>N</cache_load_all>
  2267 + <cache_size>0</cache_size>
  2268 + <lookup>
  2269 + <schema/>
  2270 + <table>bsth_c_line</table>
  2271 + <orderby/>
  2272 + <fail_on_multiple>N</fail_on_multiple>
  2273 + <eat_row_on_failure>N</eat_row_on_failure>
  2274 + <key>
  2275 + <name>xlname_</name>
  2276 + <field>name</field>
  2277 + <condition>&#x3d;</condition>
  2278 + <name2/>
  2279 + </key>
  2280 + <key>
  2281 + <name>iscanceled</name>
  2282 + <field>destroy</field>
  2283 + <condition>&#x3d;</condition>
  2284 + <name2/>
  2285 + </key>
  2286 + <value>
  2287 + <name>id</name>
  2288 + <rename>xlid</rename>
  2289 + <default/>
  2290 + <type>Integer</type>
  2291 + </value>
  2292 + </lookup>
  2293 + <cluster_schema/>
  2294 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2295 + <xloc>1007</xloc>
  2296 + <yloc>43</yloc>
  2297 + <draw>Y</draw>
  2298 + </GUI>
  2299 + </step>
  2300 +
  2301 + <step>
  2302 + <name>&#x67e5;&#x627e;&#x7ebf;&#x8def;&#x51fa;&#x573a;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</name>
  2303 + <type>DBLookup</type>
  2304 + <description/>
  2305 + <distribute>Y</distribute>
  2306 + <custom_distribution/>
  2307 + <copies>1</copies>
  2308 + <partitioning>
  2309 + <method>none</method>
  2310 + <schema_name/>
  2311 + </partitioning>
  2312 + <connection>control_jndi</connection>
  2313 + <cache>N</cache>
  2314 + <cache_load_all>N</cache_load_all>
  2315 + <cache_size>0</cache_size>
  2316 + <lookup>
  2317 + <schema/>
  2318 + <table>bsth_c_line_information</table>
  2319 + <orderby/>
  2320 + <fail_on_multiple>N</fail_on_multiple>
  2321 + <eat_row_on_failure>N</eat_row_on_failure>
  2322 + <key>
  2323 + <name>xlid</name>
  2324 + <field>line</field>
  2325 + <condition>&#x3d;</condition>
  2326 + <name2/>
  2327 + </key>
  2328 + <value>
  2329 + <name>up_out_timer</name>
  2330 + <rename>up_out_timer</rename>
  2331 + <default/>
  2332 + <type>Number</type>
  2333 + </value>
  2334 + <value>
  2335 + <name>up_out_mileage</name>
  2336 + <rename>up_out_mileage</rename>
  2337 + <default/>
  2338 + <type>Number</type>
  2339 + </value>
  2340 + <value>
  2341 + <name>down_out_timer</name>
  2342 + <rename>down_out_timer</rename>
  2343 + <default/>
  2344 + <type>Number</type>
  2345 + </value>
  2346 + <value>
  2347 + <name>down_out_mileage</name>
  2348 + <rename>down_out_mileage</rename>
  2349 + <default/>
  2350 + <type>Number</type>
  2351 + </value>
  2352 + </lookup>
  2353 + <cluster_schema/>
  2354 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2355 + <xloc>335</xloc>
  2356 + <yloc>763</yloc>
  2357 + <draw>Y</draw>
  2358 + </GUI>
  2359 + </step>
  2360 +
  2361 + <step>
  2362 + <name>&#x67e5;&#x627e;&#x7ebf;&#x8def;&#x8fdb;&#x573a;&#x91cc;&#x7a0b;&#x65f6;&#x95f4;</name>
  2363 + <type>DBLookup</type>
  2364 + <description/>
  2365 + <distribute>Y</distribute>
  2366 + <custom_distribution/>
  2367 + <copies>1</copies>
  2368 + <partitioning>
  2369 + <method>none</method>
  2370 + <schema_name/>
  2371 + </partitioning>
  2372 + <connection>control_jndi</connection>
  2373 + <cache>N</cache>
  2374 + <cache_load_all>N</cache_load_all>
  2375 + <cache_size>0</cache_size>
  2376 + <lookup>
  2377 + <schema/>
  2378 + <table>bsth_c_line_information</table>
  2379 + <orderby/>
  2380 + <fail_on_multiple>N</fail_on_multiple>
  2381 + <eat_row_on_failure>N</eat_row_on_failure>
  2382 + <key>
  2383 + <name>xlid</name>
  2384 + <field>line</field>
  2385 + <condition>&#x3d;</condition>
  2386 + <name2/>
  2387 + </key>
  2388 + <value>
  2389 + <name>up_in_mileage</name>
  2390 + <rename>up_in_mileage</rename>
  2391 + <default/>
  2392 + <type>Number</type>
  2393 + </value>
  2394 + <value>
  2395 + <name>up_in_timer</name>
  2396 + <rename>up_in_timer</rename>
  2397 + <default/>
  2398 + <type>Number</type>
  2399 + </value>
  2400 + <value>
  2401 + <name>down_in_mileage</name>
  2402 + <rename>down_in_mileage</rename>
  2403 + <default/>
  2404 + <type>Number</type>
  2405 + </value>
  2406 + <value>
  2407 + <name>down_in_timer</name>
  2408 + <rename>down_in_timer</rename>
  2409 + <default/>
  2410 + <type>Number</type>
  2411 + </value>
  2412 + </lookup>
  2413 + <cluster_schema/>
  2414 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2415 + <xloc>553</xloc>
  2416 + <yloc>1004</yloc>
  2417 + <draw>Y</draw>
  2418 + </GUI>
  2419 + </step>
  2420 +
  2421 + <step>
  2422 + <name>&#x67e5;&#x627e;&#x7ec8;&#x70b9;&#x7ad9;&#x5173;&#x8054;</name>
  2423 + <type>DBLookup</type>
  2424 + <description/>
  2425 + <distribute>Y</distribute>
  2426 + <custom_distribution/>
  2427 + <copies>1</copies>
  2428 + <partitioning>
  2429 + <method>none</method>
  2430 + <schema_name/>
  2431 + </partitioning>
  2432 + <connection>control_jndi</connection>
  2433 + <cache>N</cache>
  2434 + <cache_load_all>N</cache_load_all>
  2435 + <cache_size>0</cache_size>
  2436 + <lookup>
  2437 + <schema/>
  2438 + <table>bsth_c_ls_stationroute</table>
  2439 + <orderby/>
  2440 + <fail_on_multiple>N</fail_on_multiple>
  2441 + <eat_row_on_failure>N</eat_row_on_failure>
  2442 + <key>
  2443 + <name>xlid</name>
  2444 + <field>line</field>
  2445 + <condition>&#x3d;</condition>
  2446 + <name2/>
  2447 + </key>
  2448 + <key>
  2449 + <name>version</name>
  2450 + <field>versions</field>
  2451 + <condition>&#x3d;</condition>
  2452 + <name2/>
  2453 + </key>
  2454 + <key>
  2455 + <name>sxx</name>
  2456 + <field>directions</field>
  2457 + <condition>&#x3d;</condition>
  2458 + <name2/>
  2459 + </key>
  2460 + <key>
  2461 + <name>endZdtype</name>
  2462 + <field>station_mark</field>
  2463 + <condition>&#x3d;</condition>
  2464 + <name2/>
  2465 + </key>
  2466 + <key>
  2467 + <name>destory</name>
  2468 + <field>destroy</field>
  2469 + <condition>&#x3d;</condition>
  2470 + <name2/>
  2471 + </key>
  2472 + <value>
  2473 + <name>station_name</name>
  2474 + <rename>zdzname</rename>
  2475 + <default/>
  2476 + <type>String</type>
  2477 + </value>
  2478 + <value>
  2479 + <name>station</name>
  2480 + <rename>zdzid</rename>
  2481 + <default/>
  2482 + <type>Integer</type>
  2483 + </value>
  2484 + <value>
  2485 + <name>station_code</name>
  2486 + <rename>zdzcode</rename>
  2487 + <default/>
  2488 + <type>String</type>
  2489 + </value>
  2490 + </lookup>
  2491 + <cluster_schema/>
  2492 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2493 + <xloc>280</xloc>
  2494 + <yloc>404</yloc>
  2495 + <draw>Y</draw>
  2496 + </GUI>
  2497 + </step>
  2498 +
  2499 + <step>
  2500 + <name>&#x67e5;&#x627e;&#x8d77;&#x70b9;&#x7ad9;&#x5173;&#x8054;&#x5e76;&#x786e;&#x5b9a;&#x4e0a;&#x4e0b;&#x884c;</name>
  2501 + <type>DBLookup</type>
  2502 + <description/>
  2503 + <distribute>Y</distribute>
  2504 + <custom_distribution/>
  2505 + <copies>1</copies>
  2506 + <partitioning>
  2507 + <method>none</method>
  2508 + <schema_name/>
  2509 + </partitioning>
  2510 + <connection>control_jndi</connection>
  2511 + <cache>N</cache>
  2512 + <cache_load_all>N</cache_load_all>
  2513 + <cache_size>0</cache_size>
  2514 + <lookup>
  2515 + <schema/>
  2516 + <table>bsth_c_ls_stationroute</table>
  2517 + <orderby/>
  2518 + <fail_on_multiple>N</fail_on_multiple>
  2519 + <eat_row_on_failure>N</eat_row_on_failure>
  2520 + <key>
  2521 + <name>xlid</name>
  2522 + <field>line</field>
  2523 + <condition>&#x3d;</condition>
  2524 + <name2/>
  2525 + </key>
  2526 + <key>
  2527 + <name>version</name>
  2528 + <field>versions</field>
  2529 + <condition>&#x3d;</condition>
  2530 + <name2/>
  2531 + </key>
  2532 + <key>
  2533 + <name>qdzname</name>
  2534 + <field>station_name</field>
  2535 + <condition>LIKE</condition>
  2536 + <name2/>
  2537 + </key>
  2538 + <key>
  2539 + <name>sendZdtype</name>
  2540 + <field>station_mark</field>
  2541 + <condition>&#x3d;</condition>
  2542 + <name2/>
  2543 + </key>
  2544 + <key>
  2545 + <name>destory</name>
  2546 + <field>destroy</field>
  2547 + <condition>&#x3d;</condition>
  2548 + <name2/>
  2549 + </key>
  2550 + <value>
  2551 + <name>station</name>
  2552 + <rename>qdzid</rename>
  2553 + <default/>
  2554 + <type>Integer</type>
  2555 + </value>
  2556 + <value>
  2557 + <name>directions</name>
  2558 + <rename>sxx</rename>
  2559 + <default/>
  2560 + <type>Integer</type>
  2561 + </value>
  2562 + <value>
  2563 + <name>station_code</name>
  2564 + <rename>qdzcode</rename>
  2565 + <default/>
  2566 + <type>String</type>
  2567 + </value>
  2568 + <value>
  2569 + <name>station_name</name>
  2570 + <rename>qdzname_</rename>
  2571 + <default/>
  2572 + <type>String</type>
  2573 + </value>
  2574 + </lookup>
  2575 + <cluster_schema/>
  2576 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2577 + <xloc>430</xloc>
  2578 + <yloc>403</yloc>
  2579 + <draw>Y</draw>
  2580 + </GUI>
  2581 + </step>
  2582 +
  2583 + <step>
  2584 + <name>&#x67e5;&#x627e;&#x8def;&#x724c;&#x5173;&#x8054;</name>
  2585 + <type>DBLookup</type>
  2586 + <description/>
  2587 + <distribute>Y</distribute>
  2588 + <custom_distribution/>
  2589 + <copies>1</copies>
  2590 + <partitioning>
  2591 + <method>none</method>
  2592 + <schema_name/>
  2593 + </partitioning>
  2594 + <connection>control_jndi</connection>
  2595 + <cache>N</cache>
  2596 + <cache_load_all>N</cache_load_all>
  2597 + <cache_size>0</cache_size>
  2598 + <lookup>
  2599 + <schema/>
  2600 + <table>bsth_c_s_gbi</table>
  2601 + <orderby/>
  2602 + <fail_on_multiple>N</fail_on_multiple>
  2603 + <eat_row_on_failure>N</eat_row_on_failure>
  2604 + <key>
  2605 + <name>xlid</name>
  2606 + <field>xl</field>
  2607 + <condition>&#x3d;</condition>
  2608 + <name2/>
  2609 + </key>
  2610 + <key>
  2611 + <name>lp</name>
  2612 + <field>lp_name</field>
  2613 + <condition>&#x3d;</condition>
  2614 + <name2/>
  2615 + </key>
  2616 + <key>
  2617 + <name>iscanceled</name>
  2618 + <field>is_cancel</field>
  2619 + <condition>&#x3d;</condition>
  2620 + <name2/>
  2621 + </key>
  2622 + <value>
  2623 + <name>id</name>
  2624 + <rename>lpid</rename>
  2625 + <default/>
  2626 + <type>Integer</type>
  2627 + </value>
  2628 + </lookup>
  2629 + <cluster_schema/>
  2630 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2631 + <xloc>1013</xloc>
  2632 + <yloc>221</yloc>
  2633 + <draw>Y</draw>
  2634 + </GUI>
  2635 + </step>
  2636 +
  2637 + <step>
  2638 + <name>&#x67e5;&#x627e;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x4e0a;&#x4e00;&#x4e2a;&#x73ed;&#x6b21;&#x7684;&#x7ebf;&#x8def;&#x65b9;&#x5411;</name>
  2639 + <type>DBLookup</type>
  2640 + <description/>
  2641 + <distribute>Y</distribute>
  2642 + <custom_distribution/>
  2643 + <copies>1</copies>
  2644 + <partitioning>
  2645 + <method>none</method>
  2646 + <schema_name/>
  2647 + </partitioning>
  2648 + <connection>control_jndi</connection>
  2649 + <cache>N</cache>
  2650 + <cache_load_all>N</cache_load_all>
  2651 + <cache_size>0</cache_size>
  2652 + <lookup>
  2653 + <schema/>
  2654 + <table>bsth_c_ls_stationroute</table>
  2655 + <orderby/>
  2656 + <fail_on_multiple>N</fail_on_multiple>
  2657 + <eat_row_on_failure>N</eat_row_on_failure>
  2658 + <key>
  2659 + <name>xlid</name>
  2660 + <field>line</field>
  2661 + <condition>&#x3d;</condition>
  2662 + <name2/>
  2663 + </key>
  2664 + <key>
  2665 + <name>version</name>
  2666 + <field>versions</field>
  2667 + <condition>&#x3d;</condition>
  2668 + <name2/>
  2669 + </key>
  2670 + <key>
  2671 + <name>startZdtype_calcu</name>
  2672 + <field>station_mark</field>
  2673 + <condition>&#x3d;</condition>
  2674 + <name2/>
  2675 + </key>
  2676 + <key>
  2677 + <name>qdzname_calcu</name>
  2678 + <field>station_name</field>
  2679 + <condition>LIKE</condition>
  2680 + <name2/>
  2681 + </key>
  2682 + <key>
  2683 + <name>destory</name>
  2684 + <field>destroy</field>
  2685 + <condition>&#x3d;</condition>
  2686 + <name2/>
  2687 + </key>
  2688 + <value>
  2689 + <name>directions</name>
  2690 + <rename>sxx</rename>
  2691 + <default/>
  2692 + <type>String</type>
  2693 + </value>
  2694 + </lookup>
  2695 + <cluster_schema/>
  2696 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2697 + <xloc>548</xloc>
  2698 + <yloc>610</yloc>
  2699 + <draw>Y</draw>
  2700 + </GUI>
  2701 + </step>
  2702 +
  2703 + <step>
  2704 + <name>&#x67e5;&#x627e;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x4e0a;&#x4e00;&#x4e2a;&#x73ed;&#x6b21;&#x7684;&#x7ec8;&#x70b9;&#x7ad9;&#xff0c;&#x5e76;&#x4f5c;&#x4e3a;&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x7684;&#x8d77;&#x70b9;&#x7ad9;</name>
  2705 + <type>DBLookup</type>
  2706 + <description/>
  2707 + <distribute>Y</distribute>
  2708 + <custom_distribution/>
  2709 + <copies>1</copies>
  2710 + <partitioning>
  2711 + <method>none</method>
  2712 + <schema_name/>
  2713 + </partitioning>
  2714 + <connection>control_jndi</connection>
  2715 + <cache>N</cache>
  2716 + <cache_load_all>Y</cache_load_all>
  2717 + <cache_size>0</cache_size>
  2718 + <lookup>
  2719 + <schema/>
  2720 + <table>bsth_c_ls_stationroute</table>
  2721 + <orderby/>
  2722 + <fail_on_multiple>N</fail_on_multiple>
  2723 + <eat_row_on_failure>N</eat_row_on_failure>
  2724 + <key>
  2725 + <name>xlid</name>
  2726 + <field>line</field>
  2727 + <condition>&#x3d;</condition>
  2728 + <name2/>
  2729 + </key>
  2730 + <key>
  2731 + <name>version</name>
  2732 + <field>versions</field>
  2733 + <condition>&#x3d;</condition>
  2734 + <name2/>
  2735 + </key>
  2736 + <key>
  2737 + <name>endZdtype_calcu</name>
  2738 + <field>station_mark</field>
  2739 + <condition>&#x3d;</condition>
  2740 + <name2/>
  2741 + </key>
  2742 + <key>
  2743 + <name>sxx</name>
  2744 + <field>directions</field>
  2745 + <condition>&#x3d;</condition>
  2746 + <name2/>
  2747 + </key>
  2748 + <key>
  2749 + <name>destory</name>
  2750 + <field>destroy</field>
  2751 + <condition>&#x3d;</condition>
  2752 + <name2/>
  2753 + </key>
  2754 + <value>
  2755 + <name>station_name</name>
  2756 + <rename>zdzname_calcu</rename>
  2757 + <default/>
  2758 + <type>Integer</type>
  2759 + </value>
  2760 + </lookup>
  2761 + <cluster_schema/>
  2762 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2763 + <xloc>550</xloc>
  2764 + <yloc>701</yloc>
  2765 + <draw>Y</draw>
  2766 + </GUI>
  2767 + </step>
  2768 +
  2769 + <step>
  2770 + <name>&#x67e5;&#x627e;&#x8fdb;&#x573a;&#x8d77;&#x70b9;&#x7ad9;&#x5173;&#x8054;&#x786e;&#x5b9a;&#x4e0a;&#x4e0b;&#x884c;</name>
  2771 + <type>DBLookup</type>
  2772 + <description/>
  2773 + <distribute>Y</distribute>
  2774 + <custom_distribution/>
  2775 + <copies>1</copies>
  2776 + <partitioning>
  2777 + <method>none</method>
  2778 + <schema_name/>
  2779 + </partitioning>
  2780 + <connection>control_jndi</connection>
  2781 + <cache>N</cache>
  2782 + <cache_load_all>N</cache_load_all>
  2783 + <cache_size>0</cache_size>
  2784 + <lookup>
  2785 + <schema/>
  2786 + <table>bsth_c_ls_stationroute</table>
  2787 + <orderby/>
  2788 + <fail_on_multiple>N</fail_on_multiple>
  2789 + <eat_row_on_failure>N</eat_row_on_failure>
  2790 + <key>
  2791 + <name>xlid</name>
  2792 + <field>line</field>
  2793 + <condition>&#x3d;</condition>
  2794 + <name2/>
  2795 + </key>
  2796 + <key>
  2797 + <name>version</name>
  2798 + <field>versions</field>
  2799 + <condition>&#x3d;</condition>
  2800 + <name2/>
  2801 + </key>
  2802 + <key>
  2803 + <name>zdzname_calcu</name>
  2804 + <field>station_name</field>
  2805 + <condition>&#x3d;</condition>
  2806 + <name2/>
  2807 + </key>
  2808 + <key>
  2809 + <name>startZdtype_calcu</name>
  2810 + <field>station_mark</field>
  2811 + <condition>&#x3d;</condition>
  2812 + <name2/>
  2813 + </key>
  2814 + <key>
  2815 + <name>destory</name>
  2816 + <field>destroy</field>
  2817 + <condition>&#x3d;</condition>
  2818 + <name2/>
  2819 + </key>
  2820 + <value>
  2821 + <name>directions</name>
  2822 + <rename>sxx2</rename>
  2823 + <default/>
  2824 + <type>Integer</type>
  2825 + </value>
  2826 + <value>
  2827 + <name>station</name>
  2828 + <rename>qdzid</rename>
  2829 + <default/>
  2830 + <type>Integer</type>
  2831 + </value>
  2832 + <value>
  2833 + <name>station_code</name>
  2834 + <rename>qdzcode</rename>
  2835 + <default/>
  2836 + <type>String</type>
  2837 + </value>
  2838 + <value>
  2839 + <name>station_name</name>
  2840 + <rename>qname</rename>
  2841 + <default/>
  2842 + <type>String</type>
  2843 + </value>
  2844 + </lookup>
  2845 + <cluster_schema/>
  2846 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2847 + <xloc>551</xloc>
  2848 + <yloc>782</yloc>
  2849 + <draw>Y</draw>
  2850 + </GUI>
  2851 + </step>
  2852 +
  2853 + <step>
  2854 + <name>&#x6b63;&#x5e38;&#x73ed;&#x6b21;_&#x5904;&#x7406;&#x6570;&#x636e;</name>
  2855 + <type>ScriptValueMod</type>
  2856 + <description/>
  2857 + <distribute>Y</distribute>
  2858 + <custom_distribution/>
  2859 + <copies>1</copies>
  2860 + <partitioning>
  2861 + <method>none</method>
  2862 + <schema_name/>
  2863 + </partitioning>
  2864 + <compatible>N</compatible>
  2865 + <optimizationLevel>9</optimizationLevel>
  2866 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  2867 + <jsScript_name>Script 1</jsScript_name>
  2868 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;&#x2f;&#x2f; &#x6dfb;&#x52a0;&#x7ad9;&#x70b9;&#x6807;&#x8bc6;&#xa;var sendZdtype &#x3d; &#x27;B&#x27;&#x3b;&#xa;var endZdtype &#x3d; &#x27;E&#x27;&#x3b;&#xa;&#xa;var destory &#x3d; 0&#x3b; &#x2f;&#x2f; &#x672a;&#x64a4;&#x9500;flag</jsScript_script>
  2869 + </jsScript> </jsScripts> <fields> <field> <name>sendZdtype</name>
  2870 + <rename>sendZdtype</rename>
  2871 + <type>String</type>
  2872 + <length>-1</length>
  2873 + <precision>-1</precision>
  2874 + <replace>N</replace>
  2875 + </field> <field> <name>endZdtype</name>
  2876 + <rename>endZdtype</rename>
  2877 + <type>String</type>
  2878 + <length>-1</length>
  2879 + <precision>-1</precision>
  2880 + <replace>N</replace>
  2881 + </field> <field> <name>destory</name>
  2882 + <rename>destory</rename>
  2883 + <type>Integer</type>
  2884 + <length>-1</length>
  2885 + <precision>-1</precision>
  2886 + <replace>N</replace>
  2887 + </field> </fields> <cluster_schema/>
  2888 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2889 + <xloc>588</xloc>
  2890 + <yloc>403</yloc>
  2891 + <draw>Y</draw>
  2892 + </GUI>
  2893 + </step>
  2894 +
  2895 + <step>
  2896 + <name>&#x6b63;&#x5e38;&#x73ed;&#x6b21;&#x6570;&#x636e;</name>
  2897 + <type>Dummy</type>
  2898 + <description/>
  2899 + <distribute>Y</distribute>
  2900 + <custom_distribution/>
  2901 + <copies>1</copies>
  2902 + <partitioning>
  2903 + <method>none</method>
  2904 + <schema_name/>
  2905 + </partitioning>
  2906 + <cluster_schema/>
  2907 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2908 + <xloc>725</xloc>
  2909 + <yloc>404</yloc>
  2910 + <draw>Y</draw>
  2911 + </GUI>
  2912 + </step>
  2913 +
  2914 + <step>
  2915 + <name>&#x6dfb;&#x52a0;&#x53d1;&#x8f66;&#x987a;&#x5e8f;&#x53f7;</name>
  2916 + <type>GroupBy</type>
  2917 + <description/>
  2918 + <distribute>Y</distribute>
  2919 + <custom_distribution/>
  2920 + <copies>1</copies>
  2921 + <partitioning>
  2922 + <method>none</method>
  2923 + <schema_name/>
  2924 + </partitioning>
  2925 + <all_rows>Y</all_rows>
  2926 + <ignore_aggregate>N</ignore_aggregate>
  2927 + <field_ignore/>
  2928 + <directory>&#x25;&#x25;java.io.tmpdir&#x25;&#x25;</directory>
  2929 + <prefix>grp</prefix>
  2930 + <add_linenr>Y</add_linenr>
  2931 + <linenr_fieldname>fcno</linenr_fieldname>
  2932 + <give_back_row>N</give_back_row>
  2933 + <group>
  2934 + <field>
  2935 + <name>lp</name>
  2936 + </field>
  2937 + </group>
  2938 + <fields>
  2939 + </fields>
  2940 + <cluster_schema/>
  2941 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2942 + <xloc>442</xloc>
  2943 + <yloc>44</yloc>
  2944 + <draw>Y</draw>
  2945 + </GUI>
  2946 + </step>
  2947 +
  2948 + <step>
  2949 + <name>&#x6dfb;&#x52a0;&#x5bf9;&#x5e94;&#x73ed;&#x6b21;&#x6570;</name>
  2950 + <type>GroupBy</type>
  2951 + <description/>
  2952 + <distribute>Y</distribute>
  2953 + <custom_distribution/>
  2954 + <copies>1</copies>
  2955 + <partitioning>
  2956 + <method>none</method>
  2957 + <schema_name/>
  2958 + </partitioning>
  2959 + <all_rows>Y</all_rows>
  2960 + <ignore_aggregate>N</ignore_aggregate>
  2961 + <field_ignore/>
  2962 + <directory>&#x25;&#x25;java.io.tmpdir&#x25;&#x25;</directory>
  2963 + <prefix>grp</prefix>
  2964 + <add_linenr>Y</add_linenr>
  2965 + <linenr_fieldname>bcs</linenr_fieldname>
  2966 + <give_back_row>N</give_back_row>
  2967 + <group>
  2968 + </group>
  2969 + <fields>
  2970 + </fields>
  2971 + <cluster_schema/>
  2972 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2973 + <xloc>692</xloc>
  2974 + <yloc>44</yloc>
  2975 + <draw>Y</draw>
  2976 + </GUI>
  2977 + </step>
  2978 +
  2979 + <step>
  2980 + <name>&#x73ed;&#x6b21;&#x6570;&#x636e;&#x8303;&#x5f0f;&#x5316;</name>
  2981 + <type>Normaliser</type>
  2982 + <description/>
  2983 + <distribute>Y</distribute>
  2984 + <custom_distribution/>
  2985 + <copies>1</copies>
  2986 + <partitioning>
  2987 + <method>none</method>
  2988 + <schema_name/>
  2989 + </partitioning>
  2990 + <typefield>&#x7ad9;&#x70b9;&#x540d;&#x79f0;</typefield>
  2991 + <fields> </fields> <cluster_schema/>
  2992 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  2993 + <xloc>248</xloc>
  2994 + <yloc>44</yloc>
  2995 + <draw>Y</draw>
  2996 + </GUI>
  2997 + </step>
  2998 +
  2999 + <step>
  3000 + <name>&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x5b57;&#x5178;</name>
  3001 + <type>ValueMapper</type>
  3002 + <description/>
  3003 + <distribute>Y</distribute>
  3004 + <custom_distribution/>
  3005 + <copies>1</copies>
  3006 + <partitioning>
  3007 + <method>none</method>
  3008 + <schema_name/>
  3009 + </partitioning>
  3010 + <field_to_use>bctype</field_to_use>
  3011 + <target_field>bctype_code</target_field>
  3012 + <non_match_default>&#x672a;&#x77e5;&#x7c7b;&#x578b;</non_match_default>
  3013 + <fields>
  3014 + <field>
  3015 + <source_value>&#x6b63;&#x5e38;&#x73ed;&#x6b21;</source_value>
  3016 + <target_value>normal</target_value>
  3017 + </field>
  3018 + <field>
  3019 + <source_value>&#x51fa;&#x573a;</source_value>
  3020 + <target_value>out</target_value>
  3021 + </field>
  3022 + <field>
  3023 + <source_value>&#x8fdb;&#x573a;</source_value>
  3024 + <target_value>in</target_value>
  3025 + </field>
  3026 + <field>
  3027 + <source_value>&#x52a0;&#x6cb9;</source_value>
  3028 + <target_value>oil</target_value>
  3029 + </field>
  3030 + <field>
  3031 + <source_value>&#x4e34;&#x52a0;</source_value>
  3032 + <target_value>temp</target_value>
  3033 + </field>
  3034 + <field>
  3035 + <source_value>&#x533a;&#x95f4;</source_value>
  3036 + <target_value>region</target_value>
  3037 + </field>
  3038 + <field>
  3039 + <source_value>&#x653e;&#x7a7a;</source_value>
  3040 + <target_value>venting</target_value>
  3041 + </field>
  3042 + <field>
  3043 + <source_value>&#x653e;&#x5927;&#x7ad9;</source_value>
  3044 + <target_value>major</target_value>
  3045 + </field>
  3046 + </fields>
  3047 + <cluster_schema/>
  3048 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3049 + <xloc>149</xloc>
  3050 + <yloc>491</yloc>
  3051 + <draw>Y</draw>
  3052 + </GUI>
  3053 + </step>
  3054 +
  3055 + <step>
  3056 + <name>&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x5b57;&#x5178; 2</name>
  3057 + <type>ValueMapper</type>
  3058 + <description/>
  3059 + <distribute>Y</distribute>
  3060 + <custom_distribution/>
  3061 + <copies>1</copies>
  3062 + <partitioning>
  3063 + <method>none</method>
  3064 + <schema_name/>
  3065 + </partitioning>
  3066 + <field_to_use>bctype</field_to_use>
  3067 + <target_field>bctype_code</target_field>
  3068 + <non_match_default>&#x672a;&#x77e5;&#x7c7b;&#x578b;</non_match_default>
  3069 + <fields>
  3070 + <field>
  3071 + <source_value>&#x6b63;&#x5e38;&#x73ed;&#x6b21;</source_value>
  3072 + <target_value>normal</target_value>
  3073 + </field>
  3074 + <field>
  3075 + <source_value>&#x51fa;&#x573a;</source_value>
  3076 + <target_value>out</target_value>
  3077 + </field>
  3078 + <field>
  3079 + <source_value>&#x8fdb;&#x573a;</source_value>
  3080 + <target_value>in</target_value>
  3081 + </field>
  3082 + <field>
  3083 + <source_value>&#x52a0;&#x6cb9;</source_value>
  3084 + <target_value>oil</target_value>
  3085 + </field>
  3086 + <field>
  3087 + <source_value>&#x4e34;&#x52a0;</source_value>
  3088 + <target_value>temp</target_value>
  3089 + </field>
  3090 + <field>
  3091 + <source_value>&#x533a;&#x95f4;</source_value>
  3092 + <target_value>region</target_value>
  3093 + </field>
  3094 + <field>
  3095 + <source_value>&#x653e;&#x7a7a;</source_value>
  3096 + <target_value>venting</target_value>
  3097 + </field>
  3098 + <field>
  3099 + <source_value>&#x653e;&#x5927;&#x7ad9;</source_value>
  3100 + <target_value>major</target_value>
  3101 + </field>
  3102 + </fields>
  3103 + <cluster_schema/>
  3104 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3105 + <xloc>333</xloc>
  3106 + <yloc>681</yloc>
  3107 + <draw>Y</draw>
  3108 + </GUI>
  3109 + </step>
  3110 +
  3111 + <step>
  3112 + <name>&#x73ed;&#x6b21;&#x7c7b;&#x578b;&#x5b57;&#x5178; 3</name>
  3113 + <type>ValueMapper</type>
  3114 + <description/>
  3115 + <distribute>Y</distribute>
  3116 + <custom_distribution/>
  3117 + <copies>1</copies>
  3118 + <partitioning>
  3119 + <method>none</method>
  3120 + <schema_name/>
  3121 + </partitioning>
  3122 + <field_to_use>bctype</field_to_use>
  3123 + <target_field>bctype_code</target_field>
  3124 + <non_match_default>&#x672a;&#x77e5;&#x7c7b;&#x578b;</non_match_default>
  3125 + <fields>
  3126 + <field>
  3127 + <source_value>&#x6b63;&#x5e38;&#x73ed;&#x6b21;</source_value>
  3128 + <target_value>normal</target_value>
  3129 + </field>
  3130 + <field>
  3131 + <source_value>&#x51fa;&#x573a;</source_value>
  3132 + <target_value>out</target_value>
  3133 + </field>
  3134 + <field>
  3135 + <source_value>&#x8fdb;&#x573a;</source_value>
  3136 + <target_value>in</target_value>
  3137 + </field>
  3138 + <field>
  3139 + <source_value>&#x52a0;&#x6cb9;</source_value>
  3140 + <target_value>oil</target_value>
  3141 + </field>
  3142 + <field>
  3143 + <source_value>&#x4e34;&#x52a0;</source_value>
  3144 + <target_value>temp</target_value>
  3145 + </field>
  3146 + <field>
  3147 + <source_value>&#x533a;&#x95f4;</source_value>
  3148 + <target_value>region</target_value>
  3149 + </field>
  3150 + <field>
  3151 + <source_value>&#x653e;&#x7a7a;</source_value>
  3152 + <target_value>venting</target_value>
  3153 + </field>
  3154 + <field>
  3155 + <source_value>&#x653e;&#x5927;&#x7ad9;</source_value>
  3156 + <target_value>major</target_value>
  3157 + </field>
  3158 + </fields>
  3159 + <cluster_schema/>
  3160 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3161 + <xloc>551</xloc>
  3162 + <yloc>928</yloc>
  3163 + <draw>Y</draw>
  3164 + </GUI>
  3165 + </step>
  3166 +
  3167 + <step>
  3168 + <name>&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c;&#x7c7b;&#x578b;</name>
  3169 + <type>SelectValues</type>
  3170 + <description/>
  3171 + <distribute>N</distribute>
  3172 + <custom_distribution/>
  3173 + <copies>1</copies>
  3174 + <partitioning>
  3175 + <method>none</method>
  3176 + <schema_name/>
  3177 + </partitioning>
  3178 + <fields> <select_unspecified>Y</select_unspecified>
  3179 + <meta> <name>zdlyversion_</name>
  3180 + <rename>version</rename>
  3181 + <type>Integer</type>
  3182 + <length>-2</length>
  3183 + <precision>-2</precision>
  3184 + <conversion_mask/>
  3185 + <date_format_lenient>false</date_format_lenient>
  3186 + <date_format_locale/>
  3187 + <date_format_timezone/>
  3188 + <lenient_string_to_number>false</lenient_string_to_number>
  3189 + <encoding/>
  3190 + <decimal_symbol/>
  3191 + <grouping_symbol/>
  3192 + <currency_symbol/>
  3193 + <storage_type/>
  3194 + </meta> </fields> <cluster_schema/>
  3195 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3196 + <xloc>1016</xloc>
  3197 + <yloc>305</yloc>
  3198 + <draw>Y</draw>
  3199 + </GUI>
  3200 + </step>
  3201 +
  3202 + <step>
  3203 + <name>&#x7c7b;&#x578b;&#x4fee;&#x6b63;</name>
  3204 + <type>SelectValues</type>
  3205 + <description/>
  3206 + <distribute>Y</distribute>
  3207 + <custom_distribution/>
  3208 + <copies>1</copies>
  3209 + <partitioning>
  3210 + <method>none</method>
  3211 + <schema_name/>
  3212 + </partitioning>
  3213 + <fields> <select_unspecified>N</select_unspecified>
  3214 + <meta> <name>jhlc</name>
  3215 + <rename>jhlc</rename>
  3216 + <type>Number</type>
  3217 + <length>-2</length>
  3218 + <precision>-2</precision>
  3219 + <conversion_mask/>
  3220 + <date_format_lenient>false</date_format_lenient>
  3221 + <date_format_locale/>
  3222 + <date_format_timezone/>
  3223 + <lenient_string_to_number>false</lenient_string_to_number>
  3224 + <encoding/>
  3225 + <decimal_symbol/>
  3226 + <grouping_symbol/>
  3227 + <currency_symbol/>
  3228 + <storage_type/>
  3229 + </meta> <meta> <name>bcsj</name>
  3230 + <rename>bcsj</rename>
  3231 + <type>Integer</type>
  3232 + <length>-2</length>
  3233 + <precision>-2</precision>
  3234 + <conversion_mask/>
  3235 + <date_format_lenient>false</date_format_lenient>
  3236 + <date_format_locale/>
  3237 + <date_format_timezone/>
  3238 + <lenient_string_to_number>false</lenient_string_to_number>
  3239 + <encoding/>
  3240 + <decimal_symbol/>
  3241 + <grouping_symbol/>
  3242 + <currency_symbol/>
  3243 + <storage_type/>
  3244 + </meta> </fields> <cluster_schema/>
  3245 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3246 + <xloc>146</xloc>
  3247 + <yloc>768</yloc>
  3248 + <draw>Y</draw>
  3249 + </GUI>
  3250 + </step>
  3251 +
  3252 + <step>
  3253 + <name>&#x7c7b;&#x578b;&#x4fee;&#x6b63; 2</name>
  3254 + <type>SelectValues</type>
  3255 + <description/>
  3256 + <distribute>Y</distribute>
  3257 + <custom_distribution/>
  3258 + <copies>1</copies>
  3259 + <partitioning>
  3260 + <method>none</method>
  3261 + <schema_name/>
  3262 + </partitioning>
  3263 + <fields> <select_unspecified>N</select_unspecified>
  3264 + <meta> <name>out_mileage</name>
  3265 + <rename>out_mileage</rename>
  3266 + <type>Number</type>
  3267 + <length>-2</length>
  3268 + <precision>-2</precision>
  3269 + <conversion_mask/>
  3270 + <date_format_lenient>false</date_format_lenient>
  3271 + <date_format_locale/>
  3272 + <date_format_timezone/>
  3273 + <lenient_string_to_number>false</lenient_string_to_number>
  3274 + <encoding/>
  3275 + <decimal_symbol/>
  3276 + <grouping_symbol/>
  3277 + <currency_symbol/>
  3278 + <storage_type/>
  3279 + </meta> <meta> <name>out_time</name>
  3280 + <rename>out_time</rename>
  3281 + <type>Integer</type>
  3282 + <length>-2</length>
  3283 + <precision>-2</precision>
  3284 + <conversion_mask/>
  3285 + <date_format_lenient>false</date_format_lenient>
  3286 + <date_format_locale/>
  3287 + <date_format_timezone/>
  3288 + <lenient_string_to_number>false</lenient_string_to_number>
  3289 + <encoding/>
  3290 + <decimal_symbol/>
  3291 + <grouping_symbol/>
  3292 + <currency_symbol/>
  3293 + <storage_type/>
  3294 + </meta> <meta> <name>sxx</name>
  3295 + <rename>sxx</rename>
  3296 + <type>Integer</type>
  3297 + <length>-2</length>
  3298 + <precision>-2</precision>
  3299 + <conversion_mask/>
  3300 + <date_format_lenient>false</date_format_lenient>
  3301 + <date_format_locale/>
  3302 + <date_format_timezone/>
  3303 + <lenient_string_to_number>false</lenient_string_to_number>
  3304 + <encoding/>
  3305 + <decimal_symbol/>
  3306 + <grouping_symbol/>
  3307 + <currency_symbol/>
  3308 + <storage_type/>
  3309 + </meta> </fields> <cluster_schema/>
  3310 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3311 + <xloc>338</xloc>
  3312 + <yloc>1008</yloc>
  3313 + <draw>Y</draw>
  3314 + </GUI>
  3315 + </step>
  3316 +
  3317 + <step>
  3318 + <name>&#x7c7b;&#x578b;&#x4fee;&#x6b63; 3</name>
  3319 + <type>SelectValues</type>
  3320 + <description/>
  3321 + <distribute>Y</distribute>
  3322 + <custom_distribution/>
  3323 + <copies>1</copies>
  3324 + <partitioning>
  3325 + <method>none</method>
  3326 + <schema_name/>
  3327 + </partitioning>
  3328 + <fields> <select_unspecified>N</select_unspecified>
  3329 + <meta> <name>parade_mileage</name>
  3330 + <rename>parade_mileage</rename>
  3331 + <type>Number</type>
  3332 + <length>-2</length>
  3333 + <precision>-2</precision>
  3334 + <conversion_mask/>
  3335 + <date_format_lenient>false</date_format_lenient>
  3336 + <date_format_locale/>
  3337 + <date_format_timezone/>
  3338 + <lenient_string_to_number>false</lenient_string_to_number>
  3339 + <encoding/>
  3340 + <decimal_symbol/>
  3341 + <grouping_symbol/>
  3342 + <currency_symbol/>
  3343 + <storage_type/>
  3344 + </meta> <meta> <name>parade_time</name>
  3345 + <rename>parade_time</rename>
  3346 + <type>Integer</type>
  3347 + <length>-2</length>
  3348 + <precision>-2</precision>
  3349 + <conversion_mask/>
  3350 + <date_format_lenient>false</date_format_lenient>
  3351 + <date_format_locale/>
  3352 + <date_format_timezone/>
  3353 + <lenient_string_to_number>false</lenient_string_to_number>
  3354 + <encoding/>
  3355 + <decimal_symbol/>
  3356 + <grouping_symbol/>
  3357 + <currency_symbol/>
  3358 + <storage_type/>
  3359 + </meta> <meta> <name>sxx2</name>
  3360 + <rename>sxx2</rename>
  3361 + <type>Integer</type>
  3362 + <length>-2</length>
  3363 + <precision>-2</precision>
  3364 + <conversion_mask/>
  3365 + <date_format_lenient>false</date_format_lenient>
  3366 + <date_format_locale/>
  3367 + <date_format_timezone/>
  3368 + <lenient_string_to_number>false</lenient_string_to_number>
  3369 + <encoding/>
  3370 + <decimal_symbol/>
  3371 + <grouping_symbol/>
  3372 + <currency_symbol/>
  3373 + <storage_type/>
  3374 + </meta> </fields> <cluster_schema/>
  3375 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3376 + <xloc>847</xloc>
  3377 + <yloc>1003</yloc>
  3378 + <draw>Y</draw>
  3379 + </GUI>
  3380 + </step>
  3381 +
  3382 + <step>
  3383 + <name>&#x8ba1;&#x7b97;&#x73ed;&#x6b21;&#x7c7b;&#x578b;</name>
  3384 + <type>ValueMapper</type>
  3385 + <description/>
  3386 + <distribute>Y</distribute>
  3387 + <custom_distribution/>
  3388 + <copies>1</copies>
  3389 + <partitioning>
  3390 + <method>none</method>
  3391 + <schema_name/>
  3392 + </partitioning>
  3393 + <field_to_use>qdzname</field_to_use>
  3394 + <target_field>bctype</target_field>
  3395 + <non_match_default>&#x6b63;&#x5e38;&#x73ed;&#x6b21;</non_match_default>
  3396 + <fields>
  3397 + <field>
  3398 + <source_value>&#x51fa;&#x573a;</source_value>
  3399 + <target_value>&#x51fa;&#x573a;</target_value>
  3400 + </field>
  3401 + <field>
  3402 + <source_value>&#x8fdb;&#x573a;</source_value>
  3403 + <target_value>&#x8fdb;&#x573a;</target_value>
  3404 + </field>
  3405 + </fields>
  3406 + <cluster_schema/>
  3407 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3408 + <xloc>1014</xloc>
  3409 + <yloc>401</yloc>
  3410 + <draw>Y</draw>
  3411 + </GUI>
  3412 + </step>
  3413 +
  3414 + <step>
  3415 + <name>&#x8bb0;&#x5f55;&#x5173;&#x8054; &#x28;&#x7b1b;&#x5361;&#x5c14;&#x8f93;&#x51fa;&#x29;</name>
  3416 + <type>JoinRows</type>
  3417 + <description/>
  3418 + <distribute>Y</distribute>
  3419 + <custom_distribution/>
  3420 + <copies>1</copies>
  3421 + <partitioning>
  3422 + <method>none</method>
  3423 + <schema_name/>
  3424 + </partitioning>
  3425 + <directory>&#x25;&#x25;java.io.tmpdir&#x25;&#x25;</directory>
  3426 + <prefix>out</prefix>
  3427 + <cache_size>500</cache_size>
  3428 + <main/>
  3429 + <compare>
  3430 +<condition>
  3431 + <negated>N</negated>
  3432 + <leftvalue/>
  3433 + <function>&#x3d;</function>
  3434 + <rightvalue/>
  3435 + </condition>
  3436 + </compare>
  3437 + <cluster_schema/>
  3438 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3439 + <xloc>310</xloc>
  3440 + <yloc>133</yloc>
  3441 + <draw>Y</draw>
  3442 + </GUI>
  3443 + </step>
  3444 +
  3445 + <step>
  3446 + <name>&#x8fc7;&#x6ee4;&#x8bb0;&#x5f55;&#xff08;&#x53d1;&#x8f66;&#x65f6;&#x95f4;&#x4e3a;&#x7a7a;&#xff09;</name>
  3447 + <type>FilterRows</type>
  3448 + <description/>
  3449 + <distribute>Y</distribute>
  3450 + <custom_distribution/>
  3451 + <copies>1</copies>
  3452 + <partitioning>
  3453 + <method>none</method>
  3454 + <schema_name/>
  3455 + </partitioning>
  3456 +<send_true_to/>
  3457 +<send_false_to/>
  3458 + <compare>
  3459 +<condition>
  3460 + <negated>N</negated>
  3461 + <leftvalue>sendtime</leftvalue>
  3462 + <function>IS NOT NULL</function>
  3463 + <rightvalue/>
  3464 + </condition>
  3465 + </compare>
  3466 + <cluster_schema/>
  3467 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3468 + <xloc>571</xloc>
  3469 + <yloc>44</yloc>
  3470 + <draw>Y</draw>
  3471 + </GUI>
  3472 + </step>
  3473 +
  3474 + <step>
  3475 + <name>&#x8fdb;&#x573a;&#x73ed;&#x6b21;_&#x786e;&#x5b9a;&#x8d77;&#x70b9;&#x7ad9;&#x540d;&#x5b57;</name>
  3476 + <type>ScriptValueMod</type>
  3477 + <description/>
  3478 + <distribute>Y</distribute>
  3479 + <custom_distribution/>
  3480 + <copies>1</copies>
  3481 + <partitioning>
  3482 + <method>none</method>
  3483 + <schema_name/>
  3484 + </partitioning>
  3485 + <compatible>N</compatible>
  3486 + <optimizationLevel>9</optimizationLevel>
  3487 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  3488 + <jsScript_name>Script 1</jsScript_name>
  3489 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;&#x2f;&#x2f; &#x6dfb;&#x52a0;&#x7ad9;&#x70b9;&#x6807;&#x8bc6;&#xa;var cc_groups &#x3d; qdzgroups.split&#x28;&#x22;,&#x22;&#x29;&#x3b; &#x2f;&#x2f; &#x6240;&#x6709;&#x73ed;&#x6b21;&#x8d77;&#x70b9;&#x7ad9;&#x6570;&#x7ec4;&#xa;var qdzname_calcu &#x3d; cc_groups&#x5b;gno - 2&#x5d;&#x3b; &#x2f;&#x2f; &#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x7684;&#x8d77;&#x70b9;&#x7ad9;&#x662f;&#x4e0a;&#x4e00;&#x4e2a;&#x73ed;&#x6b21;&#x7684;&#x7ec8;&#x70b9;&#x7ad9;&#xff0c;&#x8fd9;&#x91cc;&#x53ea;&#x6709;&#x4e0a;&#x4e00;&#x4e2a;&#x73ed;&#x6b21;&#x7684;&#x8d77;&#x70b9;&#x7ad9;&#xff0c;&#x8fd8;&#x9700;&#x8981;&#x8ba1;&#x7b97;&#xa;var startZdtype_calcu &#x3d; &#x27;B&#x27;&#x3b;&#xa;var endZdtype_calcu &#x3d; &#x27;E&#x27;&#x3b;&#xa;&#xa;var destory &#x3d; 0&#x3b; &#x2f;&#x2f; &#x672a;&#x64a4;&#x9500;flag</jsScript_script>
  3490 + </jsScript> </jsScripts> <fields> <field> <name>qdzname_calcu</name>
  3491 + <rename>qdzname_calcu</rename>
  3492 + <type>String</type>
  3493 + <length>-1</length>
  3494 + <precision>-1</precision>
  3495 + <replace>N</replace>
  3496 + </field> <field> <name>startZdtype_calcu</name>
  3497 + <rename>startZdtype_calcu</rename>
  3498 + <type>String</type>
  3499 + <length>-1</length>
  3500 + <precision>-1</precision>
  3501 + <replace>N</replace>
  3502 + </field> <field> <name>endZdtype_calcu</name>
  3503 + <rename>endZdtype_calcu</rename>
  3504 + <type>String</type>
  3505 + <length>-1</length>
  3506 + <precision>-1</precision>
  3507 + <replace>N</replace>
  3508 + </field> <field> <name>destory</name>
  3509 + <rename>destory</rename>
  3510 + <type>Integer</type>
  3511 + <length>-1</length>
  3512 + <precision>-1</precision>
  3513 + <replace>N</replace>
  3514 + </field> </fields> <cluster_schema/>
  3515 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3516 + <xloc>754</xloc>
  3517 + <yloc>610</yloc>
  3518 + <draw>Y</draw>
  3519 + </GUI>
  3520 + </step>
  3521 +
  3522 + <step>
  3523 + <name>&#x8fdb;&#x573a;&#x73ed;&#x6b21;&#x6570;&#x636e;</name>
  3524 + <type>Dummy</type>
  3525 + <description/>
  3526 + <distribute>Y</distribute>
  3527 + <custom_distribution/>
  3528 + <copies>1</copies>
  3529 + <partitioning>
  3530 + <method>none</method>
  3531 + <schema_name/>
  3532 + </partitioning>
  3533 + <cluster_schema/>
  3534 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3535 + <xloc>997</xloc>
  3536 + <yloc>606</yloc>
  3537 + <draw>Y</draw>
  3538 + </GUI>
  3539 + </step>
  3540 +
  3541 + <step>
  3542 + <name>&#x63d2;&#x5165; &#x2f; &#x66f4;&#x65b0; &#x73ed;&#x578b;&#x8868;&#xff08;&#x5de5;&#x65f6;&#x6570;&#x636e;&#xff09;</name>
  3543 + <type>InsertUpdate</type>
  3544 + <description/>
  3545 + <distribute>Y</distribute>
  3546 + <custom_distribution/>
  3547 + <copies>1</copies>
  3548 + <partitioning>
  3549 + <method>none</method>
  3550 + <schema_name/>
  3551 + </partitioning>
  3552 + <connection>control_jndi</connection>
  3553 + <commit>100</commit>
  3554 + <update_bypassed>Y</update_bypassed>
  3555 + <lookup>
  3556 + <schema/>
  3557 + <table>bsth_c_s_ttinfo_bx_detail</table>
  3558 + <key>
  3559 + <name>xlid</name>
  3560 + <field>xl</field>
  3561 + <condition>&#x3d;</condition>
  3562 + <name2/>
  3563 + </key>
  3564 + <key>
  3565 + <name>ttid</name>
  3566 + <field>ttinfo</field>
  3567 + <condition>&#x3d;</condition>
  3568 + <name2/>
  3569 + </key>
  3570 + <key>
  3571 + <name>lpid</name>
  3572 + <field>lp</field>
  3573 + <condition>&#x3d;</condition>
  3574 + <name2/>
  3575 + </key>
  3576 + <key>
  3577 + <name>version</name>
  3578 + <field>line_version</field>
  3579 + <condition>&#x3d;</condition>
  3580 + <name2/>
  3581 + </key>
  3582 + <value>
  3583 + <name>gs</name>
  3584 + <rename>gs</rename>
  3585 + <update>Y</update>
  3586 + </value>
  3587 + <value>
  3588 + <name>bx_type1</name>
  3589 + <rename>update_bx1</rename>
  3590 + <update>Y</update>
  3591 + </value>
  3592 + <value>
  3593 + <name>bx_type2</name>
  3594 + <rename>update_bx2</rename>
  3595 + <update>Y</update>
  3596 + </value>
  3597 + <value>
  3598 + <name>bx_pds</name>
  3599 + <rename>update_pds</rename>
  3600 + <update>Y</update>
  3601 + </value>
  3602 + <value>
  3603 + <name>version</name>
  3604 + <rename>update_version</rename>
  3605 + <update>Y</update>
  3606 + </value>
  3607 + <value>
  3608 + <name>xl</name>
  3609 + <rename>xlid</rename>
  3610 + <update>Y</update>
  3611 + </value>
  3612 + <value>
  3613 + <name>ttinfo</name>
  3614 + <rename>ttid</rename>
  3615 + <update>Y</update>
  3616 + </value>
  3617 + <value>
  3618 + <name>lp</name>
  3619 + <rename>lpid</rename>
  3620 + <update>Y</update>
  3621 + </value>
  3622 + <value>
  3623 + <name>line_version</name>
  3624 + <rename>version</rename>
  3625 + <update>Y</update>
  3626 + </value>
  3627 + </lookup>
  3628 + <cluster_schema/>
  3629 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3630 + <xloc>481</xloc>
  3631 + <yloc>331</yloc>
  3632 + <draw>Y</draw>
  3633 + </GUI>
  3634 + </step>
  3635 +
  3636 + <step>
  3637 + <name>&#x62c6;&#x5206;&#x8def;&#x724c;&#x548c;&#x5de5;&#x65f6;</name>
  3638 + <type>ScriptValueMod</type>
  3639 + <description/>
  3640 + <distribute>Y</distribute>
  3641 + <custom_distribution/>
  3642 + <copies>1</copies>
  3643 + <partitioning>
  3644 + <method>none</method>
  3645 + <schema_name/>
  3646 + </partitioning>
  3647 + <compatible>N</compatible>
  3648 + <optimizationLevel>9</optimizationLevel>
  3649 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  3650 + <jsScript_name>Script 1</jsScript_name>
  3651 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;var lp &#x3d; lpWithGs.split&#x28;&#x22;-&#x3e;&#x22;&#x29;&#x5b;0&#x5d;&#x3b;&#xa;var gs &#x3d; lpWithGs.split&#x28;&#x22;-&#x3e;&#x22;&#x29;&#x5b;1&#x5d;&#x3b;</jsScript_script>
  3652 + </jsScript> </jsScripts> <fields> <field> <name>lp</name>
  3653 + <rename>lp</rename>
  3654 + <type>String</type>
  3655 + <length>-1</length>
  3656 + <precision>-1</precision>
  3657 + <replace>N</replace>
  3658 + </field> <field> <name>gs</name>
  3659 + <rename>gs</rename>
  3660 + <type>String</type>
  3661 + <length>-1</length>
  3662 + <precision>-1</precision>
  3663 + <replace>N</replace>
  3664 + </field> </fields> <cluster_schema/>
  3665 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3666 + <xloc>541</xloc>
  3667 + <yloc>137</yloc>
  3668 + <draw>Y</draw>
  3669 + </GUI>
  3670 + </step>
  3671 +
  3672 + <step>
  3673 + <name>&#x73ed;&#x578b;&#x8868;&#x6570;&#x636e;</name>
  3674 + <type>ScriptValueMod</type>
  3675 + <description/>
  3676 + <distribute>Y</distribute>
  3677 + <custom_distribution/>
  3678 + <copies>1</copies>
  3679 + <partitioning>
  3680 + <method>none</method>
  3681 + <schema_name/>
  3682 + </partitioning>
  3683 + <compatible>N</compatible>
  3684 + <optimizationLevel>9</optimizationLevel>
  3685 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  3686 + <jsScript_name>Script 1</jsScript_name>
  3687 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;var update_version &#x3d; 1&#x3b; &#x2f;&#x2f; &#x6570;&#x636e;version&#xa;var update_bx1 &#x3d; &#x22;_null_&#x22;&#x3b; &#x2f;&#x2f; &#x73ed;&#x578b;1&#xa;var update_bx2 &#x3d; &#x22;_null_&#x22;&#x3b; &#x2f;&#x2f; &#x73ed;&#x578b;2&#xa;var update_pds &#x3d; &#x22;0&#x22;&#x3b; &#x2f;&#x2f; &#x914d;&#x6863;&#x6570;</jsScript_script>
  3688 + </jsScript> </jsScripts> <fields> <field> <name>update_version</name>
  3689 + <rename>update_version</rename>
  3690 + <type>Integer</type>
  3691 + <length>-1</length>
  3692 + <precision>-1</precision>
  3693 + <replace>N</replace>
  3694 + </field> <field> <name>update_bx1</name>
  3695 + <rename>update_bx1</rename>
  3696 + <type>String</type>
  3697 + <length>-1</length>
  3698 + <precision>-1</precision>
  3699 + <replace>N</replace>
  3700 + </field> <field> <name>update_bx2</name>
  3701 + <rename>update_bx2</rename>
  3702 + <type>String</type>
  3703 + <length>-1</length>
  3704 + <precision>-1</precision>
  3705 + <replace>N</replace>
  3706 + </field> <field> <name>update_pds</name>
  3707 + <rename>update_pds</rename>
  3708 + <type>String</type>
  3709 + <length>-1</length>
  3710 + <precision>-1</precision>
  3711 + <replace>N</replace>
  3712 + </field> </fields> <cluster_schema/>
  3713 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  3714 + <xloc>653</xloc>
  3715 + <yloc>332</yloc>
  3716 + <draw>Y</draw>
  3717 + </GUI>
  3718 + </step>
  3719 +
  3720 + <step_error_handling>
  3721 + <error>
  3722 + <source_step>&#x63d2;&#x5165;&#x2f;&#x66f4;&#x65b0;bsth_c_s_ttinfo_detail</source_step>
  3723 + <target_step/>
  3724 + <is_enabled>Y</is_enabled>
  3725 + <nr_valuename>c1</nr_valuename>
  3726 + <descriptions_valuename>c2</descriptions_valuename>
  3727 + <fields_valuename>c3</fields_valuename>
  3728 + <codes_valuename>c4</codes_valuename>
  3729 + <max_errors/>
  3730 + <max_pct_errors/>
  3731 + <min_pct_rows/>
  3732 + </error>
  3733 + </step_error_handling>
  3734 + <slave-step-copy-partition-distribution>
  3735 +</slave-step-copy-partition-distribution>
  3736 + <slave_transformation>N</slave_transformation>
  3737 +
  3738 +</transformation>
src/main/resources/datatools/ktrs/ttinfodetailDataInputMetaData.ktr
@@ -446,6 +446,33 @@ @@ -446,6 +446,33 @@
446 </attributes> 446 </attributes>
447 </connection> 447 </connection>
448 <connection> 448 <connection>
  449 + <name>test_control_local</name>
  450 + <server>localhost</server>
  451 + <type>MYSQL</type>
  452 + <access>Native</access>
  453 + <database>test_control</database>
  454 + <port>3306</port>
  455 + <username>root</username>
  456 + <password>Encrypted </password>
  457 + <servername/>
  458 + <data_tablespace/>
  459 + <index_tablespace/>
  460 + <attributes>
  461 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  462 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  463 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  464 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  465 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  466 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  467 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  468 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  469 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  470 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  471 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  472 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  473 + </attributes>
  474 + </connection>
  475 + <connection>
449 <name>test_control&#xff08;&#x672c;&#x673a;&#xff09;</name> 476 <name>test_control&#xff08;&#x672c;&#x673a;&#xff09;</name>
450 <server>127.0.0.1</server> 477 <server>127.0.0.1</server>
451 <type>MYSQL</type> 478 <type>MYSQL</type>
@@ -458,6 +485,7 @@ @@ -458,6 +485,7 @@
458 <data_tablespace/> 485 <data_tablespace/>
459 <index_tablespace/> 486 <index_tablespace/>
460 <attributes> 487 <attributes>
  488 + <attribute><code>EXTRA_OPTION_MYSQL.characterEncoding</code><attribute>utf8</attribute></attribute>
461 <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute> 489 <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
462 <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute> 490 <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
463 <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute> 491 <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
@@ -647,6 +675,30 @@ @@ -647,6 +675,30 @@
647 <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute> 675 <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
648 </attributes> 676 </attributes>
649 </connection> 677 </connection>
  678 + <connection>
  679 + <name>&#x5916;&#x7f51;&#x91d1;&#x9ad8;&#x673a;&#x52a1;oracle</name>
  680 + <server>58.247.254.118</server>
  681 + <type>ORACLE</type>
  682 + <access>Native</access>
  683 + <database>orcl</database>
  684 + <port>15211</port>
  685 + <username>jwgl</username>
  686 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10d485a8d6</password>
  687 + <servername/>
  688 + <data_tablespace/>
  689 + <index_tablespace/>
  690 + <attributes>
  691 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  692 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  693 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  694 + <attribute><code>PORT_NUMBER</code><attribute>15211</attribute></attribute>
  695 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  696 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  697 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  698 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  699 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  700 + </attributes>
  701 + </connection>
650 <order> 702 <order>
651 <hop> <from>&#x83b7;&#x53d6;excel&#x6587;&#x4ef6;&#x540d;</from><to>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</to><enabled>Y</enabled> </hop> 703 <hop> <from>&#x83b7;&#x53d6;excel&#x6587;&#x4ef6;&#x540d;</from><to>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</to><enabled>Y</enabled> </hop>
652 <hop> <from>&#x83b7;&#x53d6;excel&#x5b57;&#x6bb5;&#x540d;&#x5b57;&#x7b26;&#x4e32;</from><to>&#x9017;&#x53f7;&#x5207;&#x5206;&#x6210;&#x5b57;&#x6bb5;&#x540d;</to><enabled>Y</enabled> </hop> 704 <hop> <from>&#x83b7;&#x53d6;excel&#x5b57;&#x6bb5;&#x540d;&#x5b57;&#x7b26;&#x4e32;</from><to>&#x9017;&#x53f7;&#x5207;&#x5206;&#x6210;&#x5b57;&#x6bb5;&#x540d;</to><enabled>Y</enabled> </hop>
@@ -675,6 +727,7 @@ @@ -675,6 +727,7 @@
675 <hop> <from>&#x66ff;&#x6362;&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c;</from><to>&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c;metadata&#x5b57;&#x6bb5;</to><enabled>Y</enabled> </hop> 727 <hop> <from>&#x66ff;&#x6362;&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c;</from><to>&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c;metadata&#x5b57;&#x6bb5;</to><enabled>Y</enabled> </hop>
676 <hop> <from>&#x83b7;&#x53d6;&#x7ad9;&#x70b9;&#x8def;&#x7531;version</from><to>&#x589e;&#x52a0;&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c; metadata</to><enabled>Y</enabled> </hop> 728 <hop> <from>&#x83b7;&#x53d6;&#x7ad9;&#x70b9;&#x8def;&#x7531;version</from><to>&#x589e;&#x52a0;&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c; metadata</to><enabled>Y</enabled> </hop>
677 <hop> <from>&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c;metadata&#x5b57;&#x6bb5;</from><to>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</to><enabled>Y</enabled> </hop> 729 <hop> <from>&#x7ad9;&#x70b9;&#x8def;&#x7531;&#x7248;&#x672c;metadata&#x5b57;&#x6bb5;</from><to>&#x5408;&#x5e76;&#x589e;&#x52a0;&#x5e38;&#x91cf;&#x6570;&#x636e;metadata</to><enabled>Y</enabled> </hop>
  730 + <hop> <from>&#x83b7;&#x53d6;&#x65f6;&#x523b;&#x8868;id</from><to>&#x5220;&#x9664;&#x4e4b;&#x524d;&#x7684;&#x73ed;&#x578b;&#x4fe1;&#x606f;</to><enabled>Y</enabled> </hop>
678 </order> 731 </order>
679 <step> 732 <step>
680 <name>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</name> 733 <name>ETL&#x5143;&#x6570;&#x636e;&#x6ce8;&#x5165;</name>
@@ -957,7 +1010,7 @@ @@ -957,7 +1010,7 @@
957 <method>none</method> 1010 <method>none</method>
958 <schema_name/> 1011 <schema_name/>
959 </partitioning> 1012 </partitioning>
960 - <connection>bus_control_variable</connection> 1013 + <connection>control_jndi</connection>
961 <execute_each_row>Y</execute_each_row> 1014 <execute_each_row>Y</execute_each_row>
962 <single_statement>N</single_statement> 1015 <single_statement>N</single_statement>
963 <replace_variables>N</replace_variables> 1016 <replace_variables>N</replace_variables>
@@ -1675,7 +1728,7 @@ @@ -1675,7 +1728,7 @@
1675 <name>&#x83b7;&#x53d6;&#x65f6;&#x523b;&#x8868;id</name> 1728 <name>&#x83b7;&#x53d6;&#x65f6;&#x523b;&#x8868;id</name>
1676 <type>GetVariable</type> 1729 <type>GetVariable</type>
1677 <description/> 1730 <description/>
1678 - <distribute>Y</distribute> 1731 + <distribute>N</distribute>
1679 <custom_distribution/> 1732 <custom_distribution/>
1680 <copies>1</copies> 1733 <copies>1</copies>
1681 <partitioning> 1734 <partitioning>
@@ -1888,6 +1941,39 @@ @@ -1888,6 +1941,39 @@
1888 </GUI> 1941 </GUI>
1889 </step> 1942 </step>
1890 1943
  1944 + <step>
  1945 + <name>&#x5220;&#x9664;&#x4e4b;&#x524d;&#x7684;&#x73ed;&#x578b;&#x4fe1;&#x606f;</name>
  1946 + <type>ExecSQL</type>
  1947 + <description/>
  1948 + <distribute>Y</distribute>
  1949 + <custom_distribution/>
  1950 + <copies>1</copies>
  1951 + <partitioning>
  1952 + <method>none</method>
  1953 + <schema_name/>
  1954 + </partitioning>
  1955 + <connection>control_jndi</connection>
  1956 + <execute_each_row>Y</execute_each_row>
  1957 + <single_statement>N</single_statement>
  1958 + <replace_variables>N</replace_variables>
  1959 + <quoteString>N</quoteString>
  1960 + <sql>delete from bsth_c_s_ttinfo_bx_detail where ttinfo &#x3d; &#x3f;</sql>
  1961 + <set_params>N</set_params>
  1962 + <insert_field/>
  1963 + <update_field/>
  1964 + <delete_field/>
  1965 + <read_field/>
  1966 + <arguments>
  1967 + <argument><name>ttid_</name></argument>
  1968 + </arguments>
  1969 + <cluster_schema/>
  1970 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  1971 + <xloc>812</xloc>
  1972 + <yloc>86</yloc>
  1973 + <draw>Y</draw>
  1974 + </GUI>
  1975 + </step>
  1976 +
1891 <step_error_handling> 1977 <step_error_handling>
1892 </step_error_handling> 1978 </step_error_handling>
1893 <slave-step-copy-partition-distribution> 1979 <slave-step-copy-partition-distribution>
src/main/resources/datatools/ktrs/ttinfodetailoutputforedit.ktr
@@ -16,12 +16,12 @@ @@ -16,12 +16,12 @@
16 </parameter> 16 </parameter>
17 <parameter> 17 <parameter>
18 <name>ttid</name> 18 <name>ttid</name>
19 - <default_value>79</default_value> 19 + <default_value>4692</default_value>
20 <description>&#x65f6;&#x523b;&#x8868;id</description> 20 <description>&#x65f6;&#x523b;&#x8868;id</description>
21 </parameter> 21 </parameter>
22 <parameter> 22 <parameter>
23 <name>xlid</name> 23 <name>xlid</name>
24 - <default_value>63020</default_value> 24 + <default_value>10658</default_value>
25 <description>&#x7ebf;&#x8def;id</description> 25 <description>&#x7ebf;&#x8def;id</description>
26 </parameter> 26 </parameter>
27 </parameters> 27 </parameters>
@@ -417,6 +417,33 @@ @@ -417,6 +417,33 @@
417 </attributes> 417 </attributes>
418 </connection> 418 </connection>
419 <connection> 419 <connection>
  420 + <name>test_control_local</name>
  421 + <server>localhost</server>
  422 + <type>MYSQL</type>
  423 + <access>Native</access>
  424 + <database>test_control</database>
  425 + <port>3306</port>
  426 + <username>root</username>
  427 + <password>Encrypted </password>
  428 + <servername/>
  429 + <data_tablespace/>
  430 + <index_tablespace/>
  431 + <attributes>
  432 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  433 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  434 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  435 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  436 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  437 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  438 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  439 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  440 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  441 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  442 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  443 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  444 + </attributes>
  445 + </connection>
  446 + <connection>
420 <name>test_control&#xff08;&#x672c;&#x673a;&#xff09;</name> 447 <name>test_control&#xff08;&#x672c;&#x673a;&#xff09;</name>
421 <server>127.0.0.1</server> 448 <server>127.0.0.1</server>
422 <type>MYSQL</type> 449 <type>MYSQL</type>
@@ -429,6 +456,7 @@ @@ -429,6 +456,7 @@
429 <data_tablespace/> 456 <data_tablespace/>
430 <index_tablespace/> 457 <index_tablespace/>
431 <attributes> 458 <attributes>
  459 + <attribute><code>EXTRA_OPTION_MYSQL.characterEncoding</code><attribute>utf8</attribute></attribute>
432 <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute> 460 <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
433 <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute> 461 <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
434 <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute> 462 <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
@@ -618,6 +646,30 @@ @@ -618,6 +646,30 @@
618 <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute> 646 <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
619 </attributes> 647 </attributes>
620 </connection> 648 </connection>
  649 + <connection>
  650 + <name>&#x5916;&#x7f51;&#x91d1;&#x9ad8;&#x673a;&#x52a1;oracle</name>
  651 + <server>58.247.254.118</server>
  652 + <type>ORACLE</type>
  653 + <access>Native</access>
  654 + <database>orcl</database>
  655 + <port>15211</port>
  656 + <username>jwgl</username>
  657 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10d485a8d6</password>
  658 + <servername/>
  659 + <data_tablespace/>
  660 + <index_tablespace/>
  661 + <attributes>
  662 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  663 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  664 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  665 + <attribute><code>PORT_NUMBER</code><attribute>15211</attribute></attribute>
  666 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  667 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  668 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  669 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  670 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  671 + </attributes>
  672 + </connection>
621 <order> 673 <order>
622 <hop> <from>&#x5217;&#x8f6c;&#x884c;</from><to>&#x53bb;&#x9664;&#x5b57;&#x6bb5;</to><enabled>Y</enabled> </hop> 674 <hop> <from>&#x5217;&#x8f6c;&#x884c;</from><to>&#x53bb;&#x9664;&#x5b57;&#x6bb5;</to><enabled>Y</enabled> </hop>
623 <hop> <from>&#x53bb;&#x9664;&#x5b57;&#x6bb5;</from><to>Excel&#x8f93;&#x51fa;</to><enabled>Y</enabled> </hop> 675 <hop> <from>&#x53bb;&#x9664;&#x5b57;&#x6bb5;</from><to>Excel&#x8f93;&#x51fa;</to><enabled>Y</enabled> </hop>
src/main/resources/static/pages/scheduleApp/module/common/dts2/ttinfotable/saTimeTable.js
@@ -192,6 +192,7 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -192,6 +192,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(
192 bxInfo.lp.lpName = bcInfo && bcInfo.lpName; 192 bxInfo.lp.lpName = bcInfo && bcInfo.lpName;
193 bxInfo.bxType1 = "_null_"; 193 bxInfo.bxType1 = "_null_";
194 bxInfo.bxType2 = "_null_"; 194 bxInfo.bxType2 = "_null_";
  195 + bxInfo.gs = "0";
195 bxInfo.bxPds = "0"; 196 bxInfo.bxPds = "0";
196 197
197 return bxInfo; 198 return bxInfo;
src/main/resources/static/pages/scheduleApp/module/common/dts2/ttinfotable/saTimeTableTemplate.html
@@ -285,6 +285,28 @@ @@ -285,6 +285,28 @@
285 } 285 }
286 </style> 286 </style>
287 287
  288 +<style>
  289 + /**
  290 + 针对 <div class="tt_table_head" style="z-index: 110; top: 0;"> 下的dt样式指定
  291 + */
  292 +
  293 + /** 路牌 */
  294 + .tt_table_head dl dt:nth-of-type(2) {
  295 + width: 55px;
  296 + text-align: center;
  297 + }
  298 + /*!** 班型1 *!*/
  299 + /*.tt_table_head dl dt:nth-of-type(3) {*/
  300 + /*width: 60px;*/
  301 + /*text-align: center;*/
  302 + /*}*/
  303 + /*!** 班型2 *!*/
  304 + /*.tt_table_head dl dt:nth-of-type(4) {*/
  305 + /*width: 60px;*/
  306 + /*text-align: center;*/
  307 + /*}*/
  308 +</style>
  309 +
288 310
289 <div class="ttInfo_detail"> 311 <div class="ttInfo_detail">
290 <div class="container-fluid top-container"> 312 <div class="container-fluid top-container">
@@ -320,14 +342,17 @@ @@ -320,14 +342,17 @@
320 路牌 342 路牌
321 </dt> 343 </dt>
322 344
323 - <dt style="width: 50px;">  
324 - 班型1  
325 - </dt>  
326 - <dt style="width: 50px;">  
327 - 班型2  
328 - </dt> 345 + <!--<dt style="width: 60px;">-->
  346 + <!--班型1-->
  347 + <!--</dt>-->
  348 + <!--<dt style="width: 60px;">-->
  349 + <!--班型2-->
  350 + <!--</dt>-->
  351 + <!--<dt style="width: 50px;">-->
  352 + <!--配档数-->
  353 + <!--</dt>-->
329 <dt style="width: 50px; border-right: 2px solid #96b9d7;"> 354 <dt style="width: 50px; border-right: 2px solid #96b9d7;">
330 - 配档数 355 + 工时
331 </dt> 356 </dt>
332 </dl> 357 </dl>
333 </div> 358 </div>
@@ -340,7 +365,7 @@ @@ -340,7 +365,7 @@
340 </dt> 365 </dt>
341 366
342 <dt ng-repeat="head in $saTimeTableCtrl.ds.detailHeads track by $index"> 367 <dt ng-repeat="head in $saTimeTableCtrl.ds.detailHeads track by $index">
343 - {{(head != '路牌' && head != '班型1' && head != '班型2' && head != '配档数' && head != '空驶班次/空驶里程' && head != '运营班次/运营里程') ? (head.substr(0, 1) + ($index - 3)): head}} 368 + {{(head != '路牌' && head != '班型1' && head != '班型2' && head != '配档数' && head != '工时' && head != '空驶班次/空驶里程' && head != '运营班次/运营里程') ? (head.substr(0, 1) + ($index - 1)): head}}
344 </dt> 369 </dt>
345 </dl> 370 </dl>
346 </div> 371 </div>
@@ -360,32 +385,42 @@ @@ -360,32 +385,42 @@
360 {{cell.fcsj}} 385 {{cell.fcsj}}
361 </dd> 386 </dd>
362 387
363 - <dd style="width: 50px;"  
364 - ng-if="$saTimeTableCtrl.ds.rowBxInfo.length > rowIndex"  
365 - ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">  
366 - {{$saTimeTableCtrl.ds.rowBxInfo[rowIndex].bxType1 | dict:'ScheduleBxType':'未知'}}  
367 - </dd>  
368 - <dd style="width: 50px;"  
369 - ng-if="$saTimeTableCtrl.ds.rowBxInfo.length > rowIndex"  
370 - ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">  
371 - {{$saTimeTableCtrl.ds.rowBxInfo[rowIndex].bxType2 | dict:'ScheduleBxType':'未知'}}  
372 - </dd> 388 + <!--<dd style="width: 60px;"-->
  389 + <!--ng-if="$saTimeTableCtrl.ds.rowBxInfo.length > rowIndex"-->
  390 + <!--ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">-->
  391 + <!--{{$saTimeTableCtrl.ds.rowBxInfo[rowIndex].bxType1 | dict:'ScheduleBxType':'未知'}}-->
  392 + <!--</dd>-->
  393 + <!--<dd style="width: 60px;"-->
  394 + <!--ng-if="$saTimeTableCtrl.ds.rowBxInfo.length > rowIndex"-->
  395 + <!--ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">-->
  396 + <!--{{$saTimeTableCtrl.ds.rowBxInfo[rowIndex].bxType2 | dict:'ScheduleBxType':'未知'}}-->
  397 + <!--</dd>-->
  398 + <!--<dd style="width: 50px;"-->
  399 + <!--ng-if="$saTimeTableCtrl.ds.rowBxInfo.length > rowIndex"-->
  400 + <!--ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">-->
  401 + <!--{{$saTimeTableCtrl.ds.rowBxInfo[rowIndex].bxPds}}-->
  402 + <!--</dd>-->
373 <dd style="width: 50px; border-right: 2px solid #96b9d7;" 403 <dd style="width: 50px; border-right: 2px solid #96b9d7;"
374 ng-if="$saTimeTableCtrl.ds.rowBxInfo.length > rowIndex" 404 ng-if="$saTimeTableCtrl.ds.rowBxInfo.length > rowIndex"
375 ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)"> 405 ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">
376 - {{$saTimeTableCtrl.ds.rowBxInfo[rowIndex].bxPds}} 406 + {{$saTimeTableCtrl.ds.rowBxInfo[rowIndex].gs}}
377 </dd> 407 </dd>
378 408
379 - <dd style="width: 50px;"  
380 - ng-if="$saTimeTableCtrl.ds.rowBxInfo.length <= rowIndex"  
381 - ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">  
382 - _null_  
383 - </dd>  
384 - <dd style="width: 50px;"  
385 - ng-if="$saTimeTableCtrl.ds.rowBxInfo.length <= rowIndex"  
386 - ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">  
387 - _null_  
388 - </dd> 409 + <!--<dd style="width: 60px;"-->
  410 + <!--ng-if="$saTimeTableCtrl.ds.rowBxInfo.length <= rowIndex"-->
  411 + <!--ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">-->
  412 + <!--_null_-->
  413 + <!--</dd>-->
  414 + <!--<dd style="width: 60px;"-->
  415 + <!--ng-if="$saTimeTableCtrl.ds.rowBxInfo.length <= rowIndex"-->
  416 + <!--ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">-->
  417 + <!--_null_-->
  418 + <!--</dd>-->
  419 + <!--<dd style="width: 60px;"-->
  420 + <!--ng-if="$saTimeTableCtrl.ds.rowBxInfo.length <= rowIndex"-->
  421 + <!--ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">-->
  422 + <!--0-->
  423 + <!--</dd>-->
389 <dd style="width: 50px; border-right: 2px solid #96b9d7;" 424 <dd style="width: 50px; border-right: 2px solid #96b9d7;"
390 ng-if="$saTimeTableCtrl.ds.rowBxInfo.length <= rowIndex" 425 ng-if="$saTimeTableCtrl.ds.rowBxInfo.length <= rowIndex"
391 ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)"> 426 ng-dblclick="$saTimeTableCtrl.$$bx_cell_dbclick(rowIndex)">
@@ -407,14 +442,17 @@ @@ -407,14 +442,17 @@
407 路牌 442 路牌
408 </dd> 443 </dd>
409 444
410 - <dd style="width: 50px;">  
411 - 班型1  
412 - </dd>  
413 - <dd style="width: 50px;">  
414 - 班型2  
415 - </dd> 445 + <!--<dd style="width: 60px;">-->
  446 + <!--班型1-->
  447 + <!--</dd>-->
  448 + <!--<dd style="width: 60px;">-->
  449 + <!--班型2-->
  450 + <!--</dd>-->
  451 + <!--<dd style="width: 50px;">-->
  452 + <!--配档数-->
  453 + <!--</dd>-->
416 <dd style="width: 50px; border-right: 2px solid #96b9d7;"> 454 <dd style="width: 50px; border-right: 2px solid #96b9d7;">
417 - 配档数 455 + 工时
418 </dd> 456 </dd>
419 457
420 <dd ng-repeat="cell in info track by $index" 458 <dd ng-repeat="cell in info track by $index"
@@ -457,4 +495,4 @@ @@ -457,4 +495,4 @@
457 495
458 </div> 496 </div>
459 497
460 -</div>  
461 \ No newline at end of file 498 \ No newline at end of file
  499 +</div>
src/main/resources/static/pages/scheduleApp/module/common/prj-common-directive.js
@@ -4256,6 +4256,7 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -4256,6 +4256,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(
4256 bxInfo.lp.lpName = bcInfo && bcInfo.lpName; 4256 bxInfo.lp.lpName = bcInfo && bcInfo.lpName;
4257 bxInfo.bxType1 = "_null_"; 4257 bxInfo.bxType1 = "_null_";
4258 bxInfo.bxType2 = "_null_"; 4258 bxInfo.bxType2 = "_null_";
  4259 + bxInfo.gs = "0";
4259 bxInfo.bxPds = "0"; 4260 bxInfo.bxPds = "0";
4260 4261
4261 return bxInfo; 4262 return bxInfo;
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/detailedit/edit-bx-detail.html
@@ -83,64 +83,86 @@ @@ -83,64 +83,86 @@
83 </div> 83 </div>
84 </div> 84 </div>
85 85
86 - <div class="form-group has-success has-feedback">  
87 - <label class="col-md-2 control-label">班型1*:</label>  
88 - <div class="col-md-3">  
89 - <sa-Select5 name="bxType1"  
90 - model="ctrl.bxInfo"  
91 - cmaps="{'bxType1': 'code'}"  
92 - dcname="bxType1"  
93 - icname="code"  
94 - dsparams="{{ {type: 'dic', param: 'ScheduleBxType' } | json }}"  
95 - iterobjname="item"  
96 - iterobjexp="item.name"  
97 - searchph="请选择班型类型..."  
98 - searchexp="this.name"  
99 - required  
100 - >  
101 - </sa-Select5>  
102 - </div>  
103 - <!-- 隐藏块,显示验证信息 -->  
104 - <div class="alert alert-danger well-sm" ng-show="myForm.bxType1.$error.required">  
105 - 班型类型必须选择  
106 - </div> 86 + <!--<div class="form-group has-success has-feedback">-->
  87 + <!--<label class="col-md-2 control-label">班型1*:</label>-->
  88 + <!--<div class="col-md-3">-->
  89 + <!--<sa-Select5 name="bxType1"-->
  90 + <!--model="ctrl.bxInfo"-->
  91 + <!--cmaps="{'bxType1': 'code'}"-->
  92 + <!--dcname="bxType1"-->
  93 + <!--icname="code"-->
  94 + <!--dsparams="{{ {type: 'dic', param: 'ScheduleBxType' } | json }}"-->
  95 + <!--iterobjname="item"-->
  96 + <!--iterobjexp="item.name"-->
  97 + <!--searchph="请选择班型类型..."-->
  98 + <!--searchexp="this.name"-->
  99 + <!--required-->
  100 + <!--&gt;-->
  101 + <!--</sa-Select5>-->
  102 + <!--</div>-->
  103 + <!--&lt;!&ndash; 隐藏块,显示验证信息 &ndash;&gt;-->
  104 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.bxType1.$error.required">-->
  105 + <!--班型类型必须选择-->
  106 + <!--</div>-->
  107 +
  108 + <!--</div>-->
  109 +
  110 + <!--<div class="form-group has-success has-feedback">-->
  111 + <!--<label class="col-md-2 control-label">班型2*:</label>-->
  112 + <!--<div class="col-md-3">-->
  113 + <!--<sa-Select5 name="bxType2"-->
  114 + <!--model="ctrl.bxInfo"-->
  115 + <!--cmaps="{'bxType2': 'code'}"-->
  116 + <!--dcname="bxType2"-->
  117 + <!--icname="code"-->
  118 + <!--dsparams="{{ {type: 'dic', param: 'ScheduleBxType' } | json }}"-->
  119 + <!--iterobjname="item"-->
  120 + <!--iterobjexp="item.name"-->
  121 + <!--searchph="请选择班型类型..."-->
  122 + <!--searchexp="this.name"-->
  123 + <!--required-->
  124 + <!--&gt;-->
  125 + <!--</sa-Select5>-->
  126 + <!--</div>-->
  127 + <!--&lt;!&ndash; 隐藏块,显示验证信息 &ndash;&gt;-->
  128 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.bxType2.$error.required">-->
  129 + <!--班型类型必须选择-->
  130 + <!--</div>-->
  131 +
  132 + <!--</div>-->
  133 +
  134 + <!--<div class="form-group has-success has-feedback">-->
  135 + <!--<label class="col-md-2 control-label">配档数*:</label>-->
  136 + <!--<div class="col-md-3">-->
  137 + <!--<input type="text" class="form-control" name="bxPds"-->
  138 + <!--ng-model="ctrl.bxInfo.bxPds" required-->
  139 + <!--/>-->
  140 + <!--</div>-->
  141 + <!--&lt;!&ndash; 隐藏块,显示验证信息 &ndash;&gt;-->
  142 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.bxPds.$error.required">-->
  143 + <!--人员配档数必须填写-->
  144 + <!--</div>-->
  145 +
  146 + <!--</div>-->
107 147
108 - </div>  
109 148
110 <div class="form-group has-success has-feedback"> 149 <div class="form-group has-success has-feedback">
111 - <label class="col-md-2 control-label">班型2*:</label> 150 + <label class="col-md-2 control-label">工时-小时*:</label>
112 <div class="col-md-3"> 151 <div class="col-md-3">
113 - <sa-Select5 name="bxType2"  
114 - model="ctrl.bxInfo"  
115 - cmaps="{'bxType2': 'code'}"  
116 - dcname="bxType2"  
117 - icname="code"  
118 - dsparams="{{ {type: 'dic', param: 'ScheduleBxType' } | json }}"  
119 - iterobjname="item"  
120 - iterobjexp="item.name"  
121 - searchph="请选择班型类型..."  
122 - searchexp="this.name"  
123 - required  
124 - >  
125 - </sa-Select5> 152 + <input type="text" class="form-control" name="gs"
  153 + ng-model="ctrl.bxInfo.gs"
  154 + ng-pattern="ctrl.number_regex" required
  155 + />
126 </div> 156 </div>
  157 +
127 <!-- 隐藏块,显示验证信息 --> 158 <!-- 隐藏块,显示验证信息 -->
128 - <div class="alert alert-danger well-sm" ng-show="myForm.bxType2.$error.required">  
129 - 班型类型必须选择 159 + <div class="alert alert-danger well-sm" ng-show="myForm.gs.$error.required">
  160 + 工时必须填写
130 </div> 161 </div>
131 162
132 - </div>  
133 -  
134 - <div class="form-group">  
135 - <label class="col-md-2 control-label">配档数*:</label>  
136 - <div class="col-md-3">  
137 - <input type="text" class="form-control" name="bxPds"  
138 - ng-model="ctrl.bxInfo.bxPds" required  
139 - />  
140 - </div>  
141 <!-- 隐藏块,显示验证信息 --> 163 <!-- 隐藏块,显示验证信息 -->
142 - <div class="alert alert-danger well-sm" ng-show="myForm.bxPds.$error.required">  
143 - 人员配档数必须填写 164 + <div class="alert alert-danger well-sm" ng-show="myForm.gs.$error.pattern">
  165 + 输入整数
144 </div> 166 </div>
145 167
146 </div> 168 </div>
@@ -165,4 +187,4 @@ @@ -165,4 +187,4 @@
165 187
166 </div> 188 </div>
167 189
168 -</div>  
169 \ No newline at end of file 190 \ No newline at end of file
  191 +</div>
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/detailedit/timeTableDetailManage_old.js
@@ -126,10 +126,11 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -126,10 +126,11 @@ angular.module(&#39;ScheduleApp&#39;).factory(
126 126
127 //--------------- 获取班型信息 ----------------// 127 //--------------- 获取班型信息 ----------------//
128 128
129 - // 1、在detailHeads第一个位置后插入(班型1,班型2,配档数)列 129 + // 1、在detailHeads第一个位置后插入(班型1,班型2,配档数,工时)列
  130 + // TODO:暂时不显示班型1,班型2,配档数 列
130 if (editInfo.detailHeads && editInfo.detailHeads.length > 0) { 131 if (editInfo.detailHeads && editInfo.detailHeads.length > 0) {
131 editInfo.detailHeads.shift(); 132 editInfo.detailHeads.shift();
132 - editInfo.detailHeads.unshift("路牌", "班型1", "班型2", "配档数"); 133 + editInfo.detailHeads.unshift("路牌", "工时");
133 } 134 }
134 // 2、构造班型数据(TODO:这里模拟entity dto) 135 // 2、构造班型数据(TODO:这里模拟entity dto)
135 editInfo.rowBxInfo = []; 136 editInfo.rowBxInfo = [];
@@ -170,6 +171,8 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -170,6 +171,8 @@ angular.module(&#39;ScheduleApp&#39;).factory(
170 editInfo.rowBxInfo[lp_bx_index].bxType2 = bxInfo_temp.bxType2; 171 editInfo.rowBxInfo[lp_bx_index].bxType2 = bxInfo_temp.bxType2;
171 // assign配挡数 172 // assign配挡数
172 editInfo.rowBxInfo[lp_bx_index].bxPds = bxInfo_temp.bxPds; 173 editInfo.rowBxInfo[lp_bx_index].bxPds = bxInfo_temp.bxPds;
  174 + // assign工时
  175 + editInfo.rowBxInfo[lp_bx_index].gs = bxInfo_temp.gs;
173 // assign创建人时间 176 // assign创建人时间
174 editInfo.rowBxInfo[lp_bx_index].createBy = bxInfo_temp.createBy; 177 editInfo.rowBxInfo[lp_bx_index].createBy = bxInfo_temp.createBy;
175 editInfo.rowBxInfo[lp_bx_index].createDate = bxInfo_temp.createDate; 178 editInfo.rowBxInfo[lp_bx_index].createDate = bxInfo_temp.createDate;
@@ -717,6 +720,9 @@ angular.module(&#39;ScheduleApp&#39;).controller( @@ -717,6 +720,9 @@ angular.module(&#39;ScheduleApp&#39;).controller(
717 function(service, $stateParams, $state) { 720 function(service, $stateParams, $state) {
718 var self = this; 721 var self = this;
719 722
  723 + // 正数(不带符号)
  724 + self.number_regex = /^\d+(\.\d+)?$/;
  725 +
720 // 获取传过来的id,有的话就是修改,获取一遍数据 726 // 获取传过来的id,有的话就是修改,获取一遍数据
721 self.xlid = $stateParams.xlid; // 获取传过来的线路id 727 self.xlid = $stateParams.xlid; // 获取传过来的线路id
722 self.ttid = $stateParams.ttid; // 获取传过来的时刻表id 728 self.ttid = $stateParams.ttid; // 获取传过来的时刻表id