Commit 4308e58a7004b89c279592cd01195d7864104388

Authored by 徐烜
1 parent e1ecfac0

1、修改ktr从classpath中以流的方式加载

src/main/java/com/bsth/service/schedule/datatools/CarConfigInfoDataToolsImpl.java
... ... @@ -11,7 +11,6 @@ import org.slf4j.Logger;
11 11 import org.slf4j.LoggerFactory;
12 12 import org.springframework.beans.factory.annotation.Autowired;
13 13 import org.springframework.beans.factory.annotation.Qualifier;
14   -import org.springframework.boot.context.properties.EnableConfigurationProperties;
15 14 import org.springframework.stereotype.Service;
16 15  
17 16 import java.io.File;
... ... @@ -90,8 +89,9 @@ public class CarConfigInfoDataToolsImpl implements DataToolsService {
90 89 File ktrFile = new File(this.getClass().getResource(
91 90 dataToolsProperties.getCarsconfigDatainputktr()).toURI());
92 91  
93   - // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径
  92 + // 通用参数,转换文件路径,转换文件类路径,excel输入文件路径,错误输出文件路径
94 93 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  94 + ktrParms.put("trans_class_path", dataToolsProperties.getCarsconfigDatainputktr());
95 95 ktrParms.put("filepath", file.getAbsolutePath());
96 96 ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());
97 97  
... ... @@ -120,8 +120,9 @@ public class CarConfigInfoDataToolsImpl implements DataToolsService {
120 120 File ktrFile = new File(this.getClass().getResource(
121 121 dataToolsProperties.getCarsconfigDataoutputktr()).toURI());
122 122  
123   - // 通用参数,转换文件路径,excel输出文件名
  123 + // 通用参数,转换文件路径,转换文件类路径,excel输出文件名
124 124 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  125 + ktrParms.put("trans_class_path", dataToolsProperties.getCarsconfigDataoutputktr());
125 126 ktrParms.put("filename", "车辆配置信息_download-");
126 127  
127 128 ktrParms.putAll(params);
... ...
src/main/java/com/bsth/service/schedule/datatools/CarsDataToolsImpl.java
... ... @@ -9,7 +9,6 @@ import org.slf4j.Logger;
9 9 import org.slf4j.LoggerFactory;
10 10 import org.springframework.beans.factory.annotation.Autowired;
11 11 import org.springframework.beans.factory.annotation.Qualifier;
12   -import org.springframework.boot.context.properties.EnableConfigurationProperties;
13 12 import org.springframework.stereotype.Service;
14 13  
15 14 import java.io.File;
... ... @@ -88,8 +87,9 @@ public class CarsDataToolsImpl implements DataToolsService {
88 87 File ktrFile = new File(this.getClass().getResource(
89 88 dataToolsProperties.getCarsDatainputktr()).toURI());
90 89  
91   - // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径
  90 + // 通用参数,转换文件路径,转换文件类路径,excel输入文件路径,错误输出文件路径
92 91 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  92 + ktrParms.put("trans_class_path", dataToolsProperties.getCarsDatainputktr());
93 93 ktrParms.put("filepath", file.getAbsolutePath());
94 94 ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());
95 95  
... ... @@ -116,8 +116,9 @@ public class CarsDataToolsImpl implements DataToolsService {
116 116 File ktrFile = new File(this.getClass().getResource(
117 117 dataToolsProperties.getCarsDataoutputktr()).toURI());
118 118  
119   - // 通用参数,转换文件路径,excel输出文件名
  119 + // 通用参数,转换文件路径,转换文件类路径,excel输出文件名
120 120 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  121 + ktrParms.put("trans_class_path", dataToolsProperties.getCarsDataoutputktr());
121 122 ktrParms.put("filename", "车辆基础信息_download-");
122 123  
123 124 ktrParms.putAll(params);
... ...
src/main/java/com/bsth/service/schedule/datatools/EmployeeConfigInfoDataToolsImpl.java
... ... @@ -9,7 +9,6 @@ import org.slf4j.Logger;
9 9 import org.slf4j.LoggerFactory;
10 10 import org.springframework.beans.factory.annotation.Autowired;
11 11 import org.springframework.beans.factory.annotation.Qualifier;
12   -import org.springframework.boot.context.properties.EnableConfigurationProperties;
13 12 import org.springframework.stereotype.Service;
14 13  
15 14 import java.io.File;
... ... @@ -88,8 +87,9 @@ public class EmployeeConfigInfoDataToolsImpl implements DataToolsService {
88 87 File ktrFile = new File(this.getClass().getResource(
89 88 dataToolsProperties.getEmployeesconfigDatainputktr()).toURI());
90 89  
91   - // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径
  90 + // 通用参数,转换文件路径,转换文件类路径,excel输入文件路径,错误输出文件路径
92 91 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  92 + ktrParms.put("trans_class_path", dataToolsProperties.getEmployeesconfigDatainputktr());
93 93 ktrParms.put("filepath", file.getAbsolutePath());
94 94 ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());
95 95  
... ... @@ -118,8 +118,9 @@ public class EmployeeConfigInfoDataToolsImpl implements DataToolsService {
118 118 File ktrFile = new File(this.getClass().getResource(
119 119 dataToolsProperties.getEmployeesconfigDataoutputktr()).toURI());
120 120  
121   - // 通用参数,转换文件路径,excel输出文件名
  121 + // 通用参数,转换文件路径,转换文件类路径,excel输出文件名
122 122 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  123 + ktrParms.put("trans_class_path", dataToolsProperties.getEmployeesconfigDataoutputktr());
123 124 ktrParms.put("filename", "人员配置信息_download-");
124 125  
125 126 ktrParms.putAll(params);
... ...
src/main/java/com/bsth/service/schedule/datatools/EmployeeDataToolsImpl.java
... ... @@ -9,7 +9,6 @@ import org.slf4j.Logger;
9 9 import org.slf4j.LoggerFactory;
10 10 import org.springframework.beans.factory.annotation.Autowired;
11 11 import org.springframework.beans.factory.annotation.Qualifier;
12   -import org.springframework.boot.context.properties.EnableConfigurationProperties;
13 12 import org.springframework.stereotype.Service;
14 13  
15 14 import java.io.File;
... ... @@ -88,8 +87,9 @@ public class EmployeeDataToolsImpl implements DataToolsService {
88 87 File ktrFile = new File(this.getClass().getResource(
89 88 dataToolsProperties.getEmployeesDatainputktr()).toURI());
90 89  
91   - // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径
  90 + // 通用参数,转换文件路径,转换文件类路径,excel输入文件路径,错误输出文件路径
92 91 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  92 + ktrParms.put("trans_class_path", dataToolsProperties.getEmployeesDatainputktr());
93 93 ktrParms.put("filepath", file.getAbsolutePath());
94 94 ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());
95 95  
... ... @@ -116,8 +116,9 @@ public class EmployeeDataToolsImpl implements DataToolsService {
116 116 File ktrFile = new File(this.getClass().getResource(
117 117 dataToolsProperties.getEmployeesDataoutputktr()).toURI());
118 118  
119   - // 通用参数,转换文件路径,excel输出文件名
  119 + // 通用参数,转换文件路径,转换文件类路径,excel输出文件名
120 120 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  121 + ktrParms.put("trans_class_path", dataToolsProperties.getEmployeesDataoutputktr());
121 122 ktrParms.put("filename", "人员基础信息_download-");
122 123  
123 124 ktrParms.putAll(params);
... ...
src/main/java/com/bsth/service/schedule/datatools/GuideboardInfoDataToolsImpl.java
... ... @@ -9,7 +9,6 @@ import org.slf4j.Logger;
9 9 import org.slf4j.LoggerFactory;
10 10 import org.springframework.beans.factory.annotation.Autowired;
11 11 import org.springframework.beans.factory.annotation.Qualifier;
12   -import org.springframework.boot.context.properties.EnableConfigurationProperties;
13 12 import org.springframework.stereotype.Service;
14 13  
15 14 import java.io.File;
... ... @@ -88,8 +87,9 @@ public class GuideboardInfoDataToolsImpl implements DataToolsService {
88 87 File ktrFile = new File(this.getClass().getResource(
89 88 dataToolsProperties.getGuideboardsDatainputktr()).toURI());
90 89  
91   - // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径
  90 + // 通用参数,转换文件路径,转换文件类路径,excel输入文件路径,错误输出文件路径
92 91 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  92 + ktrParms.put("trans_class_path", dataToolsProperties.getGuideboardsDatainputktr());
93 93 ktrParms.put("filepath", file.getAbsolutePath());
94 94 ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());
95 95  
... ... @@ -118,8 +118,9 @@ public class GuideboardInfoDataToolsImpl implements DataToolsService {
118 118 File ktrFile = new File(this.getClass().getResource(
119 119 dataToolsProperties.getGuideboardsDataoutputktr()).toURI());
120 120  
121   - // 通用参数,转换文件路径,excel输出文件名
  121 + // 通用参数,转换文件路径,转换文件类路径,excel输出文件名
122 122 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  123 + ktrParms.put("trans_class_path", dataToolsProperties.getGuideboardsDataoutputktr());
123 124 ktrParms.put("filename", "路牌信息_download-");
124 125  
125 126 ktrParms.putAll(params);
... ...
src/main/java/com/bsth/service/schedule/datatools/ScheduleRule1FlatDataToolsImpl.java
... ... @@ -9,7 +9,6 @@ import org.slf4j.Logger;
9 9 import org.slf4j.LoggerFactory;
10 10 import org.springframework.beans.factory.annotation.Autowired;
11 11 import org.springframework.beans.factory.annotation.Qualifier;
12   -import org.springframework.boot.context.properties.EnableConfigurationProperties;
13 12 import org.springframework.stereotype.Service;
14 13  
15 14 import java.io.File;
... ... @@ -88,8 +87,9 @@ public class ScheduleRule1FlatDataToolsImpl implements DataToolsService {
88 87 File ktrFile = new File(this.getClass().getResource(
89 88 dataToolsProperties.getScheduleruleDatainputktr()).toURI());
90 89  
91   - // 通用参数,转换文件路径,excel输入文件路径,错误输出文件路径
  90 + // 通用参数,转换文件路径,转换文件类路径,excel输入文件路径,错误输出文件路径
92 91 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  92 + ktrParms.put("trans_class_path", dataToolsProperties.getScheduleruleDatainputktr());
93 93 ktrParms.put("filepath", file.getAbsolutePath());
94 94 ktrParms.put("erroroutputdir", dataToolsProperties.getTransErrordir());
95 95  
... ... @@ -118,8 +118,9 @@ public class ScheduleRule1FlatDataToolsImpl implements DataToolsService {
118 118 File ktrFile = new File(this.getClass().getResource(
119 119 dataToolsProperties.getScheduleruleOutput()).toURI());
120 120  
121   - // 通用参数,转换文件路径,excel输出文件名
  121 + // 通用参数,转换文件路径,转换文件类路径,excel输出文件名
122 122 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  123 + ktrParms.put("trans_class_path", dataToolsProperties.getScheduleruleOutput());
123 124 ktrParms.put("filename", "排版规则信息_download-");
124 125  
125 126 ktrParms.putAll(params);
... ...
src/main/java/com/bsth/service/schedule/datatools/TTInfoDetailDataToolsImpl.java
... ... @@ -24,11 +24,12 @@ import org.slf4j.LoggerFactory;
24 24 import org.springframework.beans.factory.annotation.Autowired;
25 25 import org.springframework.beans.factory.annotation.Qualifier;
26 26 import org.springframework.stereotype.Service;
  27 +import org.springframework.util.StreamUtils;
27 28  
28 29 import java.awt.*;
29   -import java.io.File;
30   -import java.io.PrintWriter;
31   -import java.io.StringWriter;
  30 +import java.io.*;
  31 +import java.nio.file.Files;
  32 +import java.nio.file.Paths;
32 33 import java.util.*;
33 34 import java.util.List;
34 35  
... ... @@ -237,6 +238,7 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
237 238  
238 239 @Override
239 240 public DataToolsFile exportData(Map<String, Object> params) throws ScheduleException {
  241 + File template_ktr_temp_file = null;
240 242 try {
241 243 LOGGER.info("//---------------- 导出时刻表明细 start... ----------------//");
242 244  
... ... @@ -247,12 +249,31 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
247 249 File ktrFile2 = new File(this.getClass().getResource(
248 250 dataToolsProperties.getTtinfodetailOutput()).toURI());
249 251  
250   - // 通用参数,转换文件路径,excel输出文件名
  252 + // 通用参数,转换文件路径,转换文件类路径,excel输出文件名
251 253 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  254 + ktrParms.put("trans_class_path", dataToolsProperties.getTtinfodetailMetaoutput());
252 255 ktrParms.put("filename", String.format("时刻表_(id=%s)_download-", String.valueOf(params.get("ttinfoid"))));
253 256  
  257 + //---------------------- 计算template ktr(以下)-------------------//
  258 + /**
  259 + * trans_class_path 指定的ktr内部使用了 ETL Metadata Injection 步骤,内部的模版ktr必须是一个外部文件路径,无法是流
  260 + * 所以这里从类路径获取模版ktr流,生成一个临时ktr保存到临时目录,传递给 injectktrfile 变量
  261 + */
  262 + InputStream template_ktr_input_stream = this.getClass().getResourceAsStream(
  263 + dataToolsProperties.getTtinfodetailOutput());
  264 + template_ktr_temp_file = Files.createTempFile(
  265 + Paths.get(dataToolsProperties.getTransTempdir()),
  266 + "ttInfoDetailEditTemplate_ktr_" + new DateTime().toString("yyyyMMddHHmmss"),
  267 + ".ktr").toFile();
  268 + FileOutputStream template_ktr_output_stream = new FileOutputStream(template_ktr_temp_file);
  269 +
  270 + StreamUtils.copy(template_ktr_input_stream, template_ktr_output_stream);
  271 +
  272 + //---------------------- 计算template ktr(以上)-------------------//
  273 +
254 274 // 附加参数
255   - ktrParms.put("injectktrfile", ktrFile2.getAbsolutePath()); // 注入元数据的ktr文件
  275 +// ktrParms.put("injectktrfile", ktrFile2.getAbsolutePath()); // 注入元数据的ktr文件
  276 + ktrParms.put("injectktrfile", template_ktr_temp_file.getAbsolutePath()); // 注入元数据的ktr文件
256 277 ktrParms.put("ttinfoid", String.valueOf(params.get("ttinfoid")));
257 278  
258 279 DataToolsFile file = dataToolsService.exportData(ktrParms);
... ... @@ -312,6 +333,10 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
312 333 LOGGER.info(sw.toString());
313 334  
314 335 throw new ScheduleException(exp.getMessage());
  336 + } finally {
  337 + if (template_ktr_temp_file != null && template_ktr_temp_file.exists()) {
  338 + template_ktr_temp_file.delete();
  339 + }
315 340 }
316 341 }
317 342  
... ... @@ -325,8 +350,9 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
325 350 File ktrFile = new File(this.getClass().getResource(
326 351 dataToolsProperties.getTtinfodetailForeditktr()).toURI());
327 352  
328   - // 通用参数,转换文件路径,excel输出文件名,错误输出文件路径
  353 + // 通用参数,转换文件路径,转换文件类路径,excel输出文件名,错误输出文件路径
329 354 ktrParms.put("transpath", ktrFile.getAbsolutePath());
  355 + ktrParms.put("trans_class_path", dataToolsProperties.getTtinfodetailForeditktr());
330 356 ktrParms.put("filename", "todo");
331 357  
332 358 // 附加参数
... ...
src/main/java/com/bsth/service/schedule/timetable/strategy/impl/TimetableExcelDataImportStrategyImpl.java
... ... @@ -11,10 +11,16 @@ import jxl.write.WritableSheet;
11 11 import jxl.write.WritableWorkbook;
12 12 import org.apache.commons.lang3.StringUtils;
13 13 import org.apache.poi.ss.usermodel.Sheet;
  14 +import org.joda.time.DateTime;
14 15 import org.slf4j.Logger;
15 16 import org.slf4j.LoggerFactory;
  17 +import org.springframework.util.StreamUtils;
16 18  
17 19 import java.io.File;
  20 +import java.io.FileOutputStream;
  21 +import java.io.InputStream;
  22 +import java.nio.file.Files;
  23 +import java.nio.file.Paths;
18 24 import java.util.ArrayList;
19 25 import java.util.List;
20 26 import java.util.Map;
... ... @@ -145,35 +151,83 @@ public class TimetableExcelDataImportStrategyImpl implements TimetableExcelDataI
145 151 }
146 152  
147 153 // 3-3、计算ktr路径相关参数
  154 + File template_ktr_temp_file = null;
148 155 try {
149 156 // 元数据ktr
150 157 File mktrFile = new File(this.getClass().getResource(
151 158 dataToolsProperties.getTtinfodetailMetadatainputktr()).toURI());
152 159 ktrParams.put("transpath", mktrFile.getAbsolutePath());
  160 + ktrParams.put("trans_class_path", dataToolsProperties.getTtinfodetailMetadatainputktr());
153 161  
154 162 // 实际数据ktr
155 163 if (timetableExcelFormatType == TimetableExcelFormatType.Normal) {
156   - File normal_ktrFile = new File(this.getClass().getResource(
157   - dataToolsProperties.getTtinfodetailDatainputktr2version()).toURI());
158   - ktrParams.put("injectktrfile", normal_ktrFile.getAbsolutePath());
  164 +// File normal_ktrFile = new File(this.getClass().getResource(
  165 +// dataToolsProperties.getTtinfodetailDatainputktr2version()).toURI());
  166 +// ktrParams.put("injectktrfile", normal_ktrFile.getAbsolutePath());
  167 + template_ktr_temp_file = generateTemplateKtrFile(
  168 + "ttInfo_input_normal_template_ktr_",
  169 + ".ktr",
  170 + dataToolsProperties.getTtinfodetailDatainputktr2version(),
  171 + dataToolsProperties.getTransTempdir()
  172 + );
  173 + ktrParams.put("injectktrfile", template_ktr_temp_file.getAbsolutePath());
159 174 } 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());
  175 +// File noramlwithgs_ktrFile = new File(this.getClass().getResource(
  176 +// dataToolsProperties.getTtinfodetailDatainputktr2normalwithgs()).toURI());
  177 +// ktrParams.put("injectktrfile", noramlwithgs_ktrFile.getAbsolutePath());
  178 + template_ktr_temp_file = generateTemplateKtrFile(
  179 + "ttInfo_input_noramlwithgs_template_ktr_",
  180 + ".ktr",
  181 + dataToolsProperties.getTtinfodetailDatainputktr2normalwithgs(),
  182 + dataToolsProperties.getTransTempdir()
  183 + );
  184 + ktrParams.put("injectktrfile", template_ktr_temp_file.getAbsolutePath());
163 185 } 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());
  186 +// File dynamic_ktrFile = new File(this.getClass().getResource(
  187 +// dataToolsProperties.getTtinfodetailDatainputktr2version2()).toURI());
  188 +// ktrParams.put("injectktrfile", dynamic_ktrFile.getAbsolutePath());
  189 + template_ktr_temp_file = generateTemplateKtrFile(
  190 + "ttInfo_input_dynamic_template_ktr_",
  191 + ".ktr",
  192 + dataToolsProperties.getTtinfodetailDatainputktr2version2(),
  193 + dataToolsProperties.getTransTempdir()
  194 + );
  195 + ktrParams.put("injectktrfile", template_ktr_temp_file.getAbsolutePath());
167 196 } else {
168 197 throw new ScheduleException("未知的TimetableExcelFormatType格式[" + timetableExcelFormatType + "]");
169 198 }
170 199  
  200 + // 3-4、执行ktr
  201 + dataToolsService.importData(fileCal, ktrParams);
  202 +
171 203 } catch (Exception exp) {
172 204 exp.printStackTrace();
173 205 throw new ScheduleException("导入时刻表异常!");
  206 + } finally {
  207 + if (template_ktr_temp_file != null && template_ktr_temp_file.exists()) {
  208 + template_ktr_temp_file.delete();
  209 + }
174 210 }
175 211  
176   - // 3-4、执行ktr
177   - dataToolsService.importData(fileCal, ktrParams);
  212 + }
  213 +
  214 + /**
  215 + * trans_class_path 指定的ktr内部使用了 ETL Metadata Injection 步骤,内部的模版ktr必须是一个外部文件路径,无法是流
  216 + * 所以这里从类路径获取模版ktr流,生成一个临时ktr保存到临时目录,传递给 injectktrfile 变量
  217 + */
  218 + private File generateTemplateKtrFile(
  219 + String filePrefix, String fileSuffix,
  220 + String fileClassPath, String fileDir) throws Exception {
  221 + InputStream template_ktr_input_stream = this.getClass().getResourceAsStream(fileClassPath);
  222 + File template_ktr_temp_file = Files.createTempFile(
  223 + Paths.get(fileDir),
  224 + filePrefix + new DateTime().toString("yyyyMMddHHmmss"),
  225 + fileSuffix).toFile();
  226 + FileOutputStream template_ktr_output_stream = new FileOutputStream(template_ktr_temp_file);
  227 +
  228 + StreamUtils.copy(template_ktr_input_stream, template_ktr_output_stream);
  229 +
  230 + return template_ktr_temp_file;
  231 +
178 232 }
179 233 }
... ...
src/main/java/com/bsth/service/schedule/timetable/strategy/impl/TimetableExcelWithPlanInfoExportStrategyImpl.java
... ... @@ -9,10 +9,16 @@ import jxl.write.Label;
9 9 import jxl.write.WritableSheet;
10 10 import jxl.write.WritableWorkbook;
11 11 import org.apache.poi.ss.usermodel.Row;
  12 +import org.joda.time.DateTime;
12 13 import org.slf4j.Logger;
13 14 import org.slf4j.LoggerFactory;
  15 +import org.springframework.util.StreamUtils;
14 16  
15 17 import java.io.File;
  18 +import java.io.FileOutputStream;
  19 +import java.io.InputStream;
  20 +import java.nio.file.Files;
  21 +import java.nio.file.Paths;
16 22 import java.time.ZoneId;
17 23 import java.time.format.DateTimeFormatter;
18 24 import java.util.*;
... ... @@ -33,6 +39,8 @@ public class TimetableExcelWithPlanInfoExportStrategyImpl implements TimetableEx
33 39  
34 40 LOG.info("---------------- 开始导出线路=[{}],日期=[{}]排班时刻信息... --------------", xl.getName(), scheduleDate);
35 41  
  42 + File template_ktr_temp_file = null;
  43 +
36 44 try {
37 45 // ---------- 1-1、创建ktr参数 --------- //
38 46 Map<String, Object> ktrParams = new HashMap<>();
... ... @@ -43,12 +51,33 @@ public class TimetableExcelWithPlanInfoExportStrategyImpl implements TimetableEx
43 51 File ktrFile = new File(this.getClass().getResource(
44 52 dataToolsProperties.getTtinfodetailPlaninfoOutput()).toURI());
45 53  
46   - // 通用参数,转换文件路径,excel输出文件名
  54 + // 通用参数,转换文件路径,转换文件类路径,excel输出文件名
47 55 ktrParams.put("transpath", ktrMetaFile.getAbsolutePath());
  56 + ktrParams.put("trans_class_path", dataToolsProperties.getTtinfodetailPlaninfoMetaoutput());
48 57 ktrParams.put("filename", "排班时刻表导出数据temp");
  58 +
  59 + //---------------------- 计算template ktr(以下)-------------------//
  60 + /**
  61 + * trans_class_path 指定的ktr内部使用了 ETL Metadata Injection 步骤,内部的模版ktr必须是一个外部文件路径,无法是流
  62 + * 所以这里从类路径获取模版ktr流,生成一个临时ktr保存到临时目录,传递给 injectktrfile 变量
  63 + */
  64 + InputStream template_ktr_input_stream = this.getClass().getResourceAsStream(
  65 + dataToolsProperties.getTtinfodetailPlaninfoOutput());
  66 + template_ktr_temp_file = Files.createTempFile(
  67 + Paths.get(dataToolsProperties.getTransTempdir()),
  68 + "planInfoOutputTemplate_ktr_" + new DateTime().toString("yyyyMMddHHmmss"),
  69 + ".ktr").toFile();
  70 + FileOutputStream template_ktr_output_stream = new FileOutputStream(template_ktr_temp_file);
  71 +
  72 + StreamUtils.copy(template_ktr_input_stream, template_ktr_output_stream);
  73 +
  74 + //---------------------- 计算template ktr(以上)-------------------//
  75 +
  76 +
49 77 // ktr附加命名参数
  78 +// ktrParams.put("injectktrfile", ktrFile.getAbsolutePath()); // 注入元数据的ktr文件
  79 + ktrParams.put("injectktrfile", template_ktr_temp_file.getAbsolutePath()); // 注入元数据的ktr文件
50 80 ktrParams.put("xlid", xl.getId()); // 线路Id
51   - ktrParams.put("injectktrfile", ktrFile.getAbsolutePath()); // 注入元数据的ktr文件
52 81 ktrParams.put("sdate", scheduleDate.toInstant()
53 82 .atZone(ZoneId.systemDefault()).toLocalDate()
54 83 .format(DateTimeFormatter.ISO_DATE)); // 排班日期
... ... @@ -106,6 +135,10 @@ public class TimetableExcelWithPlanInfoExportStrategyImpl implements TimetableEx
106 135 } catch (Exception exp) {
107 136 LOG.error("---------------- 导出线路=[{}],日期=[{}]排班时刻信息失败! --------------", xl.getName(), scheduleDate);
108 137 throw new ScheduleException(exp);
  138 + } finally {
  139 + if (template_ktr_temp_file != null && template_ktr_temp_file.exists()) {
  140 + template_ktr_temp_file.delete();
  141 + }
109 142 }
110 143  
111 144 }
... ...
src/main/java/com/bsth/service/schedule/timetable/strategy/impl/TimetableExcelWithPlanInfoViewStrategyImpl.java
... ... @@ -40,8 +40,9 @@ public class TimetableExcelWithPlanInfoViewStrategyImpl implements TimetableExce
40 40 File ktrFile = new File(this.getClass().getResource(
41 41 dataToolsProperties.getTtinfodetailPlaninfoOutputEdit()).toURI());
42 42  
43   - // 通用参数,转换文件路径,excel输出文件名
  43 + // 通用参数,转换文件路径,转换文件类路径,excel输出文件名
44 44 ktrParams.put("transpath", ktrFile.getAbsolutePath());
  45 + ktrParams.put("trans_class_path", dataToolsProperties.getTtinfodetailPlaninfoOutputEdit());
45 46 ktrParams.put("filename", "排班时刻表导出edit数据");
46 47 // ktr附加命名参数
47 48 ktrParams.put("xlid", xl.getId()); // 线路Id
... ...
src/main/java/com/bsth/service/schedule/utils/DataToolsServiceImpl.java
... ... @@ -157,6 +157,12 @@ public class DataToolsServiceImpl implements DataToolsService {
157 157 "没有指定transpath参数值,无法确定ktr转换文件!");
158 158 }
159 159 File ktrFile = new File(transpath);
  160 +
  161 + String transClassPath = String.valueOf(params.get("trans_class_path"));
  162 + if ("null".equals(transClassPath)) {
  163 + throw new Exception("没有指定 trans_class_path 参数值,无法确定ktr转换文件!");
  164 + }
  165 +
160 166 // 设置文件路径,错误输出文件路径参数
161 167 params.put("filepath", file.getAbsolutePath());
162 168 params.put("erroroutputdir", dataToolsProperties.getTransErrordir());
... ... @@ -164,7 +170,16 @@ public class DataToolsServiceImpl implements DataToolsService {
164 170 // 2、使用kettle运行封装数据导入逻辑的ktr转换文件
165 171 // 2.1、初始化kettle(组件初始化已经做了)
166 172 // 2.2、创建转换元数据,转换
167   - TransMeta transMeta = new TransMeta(ktrFile.getAbsolutePath());
  173 +// TransMeta transMeta = new TransMeta(ktrFile.getAbsolutePath());
  174 +
  175 + // 使用流方式载入ktr
  176 + TransMeta transMeta = new TransMeta(
  177 + this.getClass().getResourceAsStream(transClassPath),
  178 + null,
  179 + true,
  180 + null,
  181 + null);
  182 +
168 183 Trans trans = new Trans(transMeta);
169 184 // 2.3、设定命名参数,用于指定数据文件,注意每个ktr必须都有以下指定的命名参数
170 185 for (String key : params.keySet()) {
... ... @@ -225,6 +240,12 @@ public class DataToolsServiceImpl implements DataToolsService {
225 240 "没有指定transpath参数值,无法确定ktr转换文件!");
226 241 }
227 242 File ktrFile = new File(transpath);
  243 +
  244 + String transClassPath = String.valueOf(params.get("trans_class_path"));
  245 + if ("null".equals(transClassPath)) {
  246 + throw new Exception("没有指定 trans_class_path 参数值,无法确定ktr转换文件!");
  247 + }
  248 +
228 249 // 设置文件路径参数
229 250 String filepath = dataToolsProperties.getFileoutputDir() +
230 251 File.separator +
... ... @@ -238,7 +259,16 @@ public class DataToolsServiceImpl implements DataToolsService {
238 259 // 2、使用kettle运行封装数据导入逻辑的ktr转换文件
239 260 // 2.1、初始化kettle(组件初始化已经做了)
240 261 // 2.2、创建转换元数据,转换
241   - TransMeta transMeta = new TransMeta(ktrFile.getAbsolutePath());
  262 +// TransMeta transMeta = new TransMeta(ktrFile.getAbsolutePath());
  263 +
  264 + // 使用流方式载入ktr
  265 + TransMeta transMeta = new TransMeta(
  266 + this.getClass().getResourceAsStream(transClassPath),
  267 + null,
  268 + true,
  269 + null,
  270 + null);
  271 +
242 272 Trans trans = new Trans(transMeta);
243 273 // 2.3、设定命名参数,用于指定数据文件,注意每个ktr必须都有以下指定的命名参数
244 274 for (String key : params.keySet()) {
... ...