GisSurveyThirdImporter.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. package com.shkpr.service.alambizplugin.components;
  2. import com.global.base.log.LogLevelFlag;
  3. import com.global.base.log.LogPrintMgr;
  4. import com.shkpr.service.alambizplugin.apiparam.GisSurveyThirdImportParams;
  5. import com.shkpr.service.alambizplugin.commtools.ExcelUtils;
  6. import com.shkpr.service.alambizplugin.components.checker.DuplicatePointsFinder;
  7. import com.shkpr.service.alambizplugin.components.checker.InvalidLinesFinder;
  8. import com.shkpr.service.alambizplugin.components.checker.InvalidPropertiesFinder;
  9. import com.shkpr.service.alambizplugin.constants.ExcelEnum;
  10. import com.shkpr.service.alambizplugin.constants.GisMetadataDefine;
  11. import com.shkpr.service.alambizplugin.constants.GisSurveyCheckStatusEnum;
  12. import com.shkpr.service.alambizplugin.constants.GisSurveyImportDefine;
  13. import com.shkpr.service.alambizplugin.constants.GisSurveyImportStatusEnum;
  14. import com.shkpr.service.alambizplugin.constants.LogFlagBusiType;
  15. import com.shkpr.service.alambizplugin.dbdao.services.intef.GisMetadataLayerTemplateService;
  16. import com.shkpr.service.alambizplugin.dto.GisMetadataLayerTemplate;
  17. import com.shkpr.service.alambizplugin.dto.GisSurveyThirdImportElement;
  18. import com.shkpr.service.alambizplugin.dto.GisSurveyThirdImportResult;
  19. import com.shkpr.service.alambizplugin.dto.GisSurveyThirdImportResultDetail;
  20. import com.shkpr.service.alambizplugin.dto.GisSurveyThirdImportSubtask;
  21. import org.apache.commons.collections4.CollectionUtils;
  22. import org.springframework.scheduling.annotation.Async;
  23. import org.springframework.scheduling.annotation.AsyncResult;
  24. import org.springframework.stereotype.Component;
  25. import org.springframework.util.concurrent.ListenableFuture;
  26. import java.io.IOException;
  27. import java.io.InputStream;
  28. import java.time.Duration;
  29. import java.time.LocalDateTime;
  30. import java.util.ArrayList;
  31. import java.util.List;
  32. import java.util.Map;
  33. import java.util.concurrent.ExecutionException;
  34. import java.util.function.Consumer;
  35. import java.util.stream.Collectors;
  36. /**
  37. * 第三方导入执行器
  38. *
  39. * @author 欧阳劲驰
  40. * @since 1.0.0
  41. */
  42. @Component
  43. public class GisSurveyThirdImporter {
  44. /**
  45. * log
  46. */
  47. private final String mStrClassName;
  48. private final String mBizType;
  49. private final GisMetadataLayerTemplateService layerTemplateService;
  50. private final DuplicatePointsFinder duplicatePointsFinder;
  51. private final InvalidLinesFinder invalidLinesFinder;
  52. private final InvalidPropertiesFinder invalidPropertiesFinder;
  53. public GisSurveyThirdImporter(GisMetadataLayerTemplateService layerTemplateService, DuplicatePointsFinder duplicatePointsFinder, InvalidLinesFinder invalidLinesFinder, InvalidPropertiesFinder invalidPropertiesFinder) {
  54. mStrClassName = "GisSurveyThirdImporter";
  55. mBizType = LogFlagBusiType.BUSI_GIS_SURVEY.toStrValue();
  56. this.layerTemplateService = layerTemplateService;
  57. this.duplicatePointsFinder = duplicatePointsFinder;
  58. this.invalidLinesFinder = invalidLinesFinder;
  59. this.invalidPropertiesFinder = invalidPropertiesFinder;
  60. }
  61. /**
  62. * 第三方导入任务
  63. *
  64. * @param params 系统检查参数
  65. * @param inputStreams 文件输入流
  66. * @param onStartSubtask 启动子任务
  67. * @param onDeprecatedSubtask 弃用子任务(完成数据收集/取消)
  68. * @return 系统检查返回
  69. */
  70. @Async
  71. public ListenableFuture<GisSurveyThirdImportResult> thirdImportTask(GisSurveyThirdImportParams params, List<InputStream> inputStreams
  72. , Consumer<GisSurveyThirdImportSubtask> onStartSubtask, Consumer<String> onDeprecatedSubtask) {
  73. //构建返回
  74. GisSurveyThirdImportResult result = GisSurveyThirdImportResult.fail(params);
  75. //无效属性任务
  76. ListenableFuture<GisSurveyThirdImportResultDetail<Map<String, List<GisSurveyThirdImportElement>>>> invalidPropertiesFuture = null;
  77. //重复点号任务
  78. ListenableFuture<GisSurveyThirdImportResultDetail<List<GisSurveyThirdImportElement>>> duplicatePointsFuture = null;
  79. //无效线任务
  80. ListenableFuture<GisSurveyThirdImportResultDetail<List<GisSurveyThirdImportElement>>> invalidLinesFuture = null;
  81. //点集合
  82. List<Map<String, String>> points = new ArrayList<>();
  83. //线集合
  84. List<Map<String, String>> lines = new ArrayList<>();
  85. try {
  86. LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName
  87. , String.format(
  88. "开始执行第三方导入;任务id: %s"
  89. , params.getJobId()
  90. )
  91. );
  92. //解析excel
  93. parseExcel(inputStreams, points, lines);
  94. //提取图层名
  95. List<String> pointLayerNames = getLayerNames(points, GisSurveyImportDefine.POINT.LAYER);
  96. List<String> listLayerNames = getLayerNames(lines, GisSurveyImportDefine.LINE.LAYER);
  97. //图层模版
  98. List<GisMetadataLayerTemplate> pointLayerTemplates = layerTemplateService.findByNatureAndNameIn(params.getNature(), pointLayerNames);
  99. List<GisMetadataLayerTemplate> lineLayerTemplates = layerTemplateService.findByNatureAndNameIn(params.getNature(), listLayerNames);
  100. //无效属性检查
  101. invalidPropertiesFuture = invalidPropertiesFinder.findInvalidProperties(points, lines, pointLayerTemplates, lineLayerTemplates);
  102. //重复点检查
  103. duplicatePointsFuture = duplicatePointsFinder.findDuplicatePoints(points);
  104. //无效线检查
  105. invalidLinesFuture = invalidLinesFinder.finderInvalidLines(points, lines);
  106. //返回子任务
  107. onStartSubtask.accept(
  108. new GisSurveyThirdImportSubtask(invalidPropertiesFuture, duplicatePointsFuture, invalidLinesFuture)
  109. );
  110. //等待结果
  111. GisSurveyThirdImportResultDetail<Map<String, List<GisSurveyThirdImportElement>>> invalidPropertiesResult = invalidPropertiesFuture.get();
  112. //存入无效属性结果
  113. result.setInvalidLayersResult(untarInvalidProperties(invalidPropertiesResult, GisSurveyImportDefine.RESULT.INVALID_LAYERS));
  114. result.setMissingRequirementsResult(untarInvalidProperties(invalidPropertiesResult, GisSurveyImportDefine.RESULT.MISSING_REQUIREMENTS));
  115. result.setInvalidTypesResult(untarInvalidProperties(invalidPropertiesResult, GisSurveyImportDefine.RESULT.INVALID_TYPES));
  116. result.setOutRangesResult(untarInvalidProperties(invalidPropertiesResult, GisSurveyImportDefine.RESULT.OUT_RANGES));
  117. //存入重复点结果
  118. result.setDuplicatePointsResult(duplicatePointsFuture.get());
  119. //存入无效线结果
  120. result.setInvalidLinesResult(invalidLinesFuture.get());
  121. //结果未通过
  122. if (!checkResult(result)) {
  123. result.setImportStatus(GisSurveyImportStatusEnum.DATA_ERROR.getCode());
  124. result.setCompleteTime(LocalDateTime.now());
  125. //弃用子任务
  126. onDeprecatedSubtask.accept(params.getJobId());
  127. return new AsyncResult<>(result);
  128. }
  129. //格式化数据,并入库
  130. //完成任务
  131. result.setImportStatus(GisSurveyImportStatusEnum.SUCCESS.getCode());
  132. result.setCompleteTime(LocalDateTime.now());
  133. LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName
  134. , String.format(
  135. "结束执行第三方导入;任务id: %s, 用时(毫秒):%d",
  136. params.getJobId(),
  137. Duration.between(result.getRequestTime(), result.getCompleteTime()).toMillis()
  138. )
  139. );
  140. //弃用子任务
  141. onDeprecatedSubtask.accept(params.getJobId());
  142. return new AsyncResult<>(result);
  143. } catch (InterruptedException | ExecutionException | IOException | RuntimeException e) {
  144. LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, mBizType, mStrClassName
  145. , String.format(
  146. "监测到中断或执行异常,开始清除子任务 任务id:%s error:%s",
  147. params.getJobId(),
  148. e
  149. )
  150. );
  151. //清除子任务
  152. if (invalidPropertiesFuture != null) invalidPropertiesFuture.cancel(true);
  153. if (duplicatePointsFuture != null) duplicatePointsFuture.cancel(true);
  154. if (invalidLinesFuture != null) invalidLinesFuture.cancel(true);
  155. //失败信息
  156. result.setImportStatus(GisSurveyCheckStatusEnum.FAIL.getCode());
  157. result.setCompleteTime(LocalDateTime.now());
  158. //弃用子任务
  159. onDeprecatedSubtask.accept(params.getJobId());
  160. return new AsyncResult<>(result);
  161. }
  162. }
  163. /**
  164. * 解析excel
  165. *
  166. * @param inputStreams 输入流
  167. * @param points 点集合
  168. * @param lines 线集合
  169. * @throws IOException io异常
  170. */
  171. private void parseExcel(List<InputStream> inputStreams, List<Map<String, String>> points, List<Map<String, String>> lines) throws IOException {
  172. LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName, "开始执行解析excel ======>");
  173. long begin = System.currentTimeMillis();
  174. //解析文件
  175. for (InputStream inputStream : inputStreams) {
  176. //解析excel
  177. Map<String, List<Map<String, String>>> excelData = ExcelUtils.parseExcelFile(inputStream,
  178. ExcelEnum.XLSX, 0, 3);
  179. //填入集合
  180. if (excelData != null && excelData.containsKey(GisMetadataDefine.TYPE_KINE.POINT))
  181. points.addAll(excelData.get(GisMetadataDefine.TYPE_KINE.POINT));
  182. if (excelData != null && excelData.containsKey(GisMetadataDefine.TYPE_KINE.LINE))
  183. lines.addAll(excelData.get(GisMetadataDefine.TYPE_KINE.LINE));
  184. //释放流
  185. inputStream.close();
  186. }
  187. long end = System.currentTimeMillis();
  188. LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName
  189. , String.format(
  190. "结束执行执行解析excel,用时(毫秒):%d"
  191. , (end - begin)
  192. )
  193. );
  194. }
  195. /**
  196. * 获取图层名称
  197. *
  198. * @param datas 数据
  199. * @param layerKey 图层的key
  200. * @return 图层名称集合
  201. */
  202. private List<String> getLayerNames(List<Map<String, String>> datas, String layerKey) {
  203. //去重图层
  204. return datas.parallelStream()
  205. .filter(data -> data.get(layerKey) != null)
  206. .map(data -> data.get(layerKey))
  207. .distinct()
  208. .collect(Collectors.toList());
  209. }
  210. /**
  211. * 解包无效属性
  212. *
  213. * @param invalidPropertiesResult 无效属性结果
  214. * @param resultKey 结果key
  215. * @return 具体结果
  216. */
  217. private GisSurveyThirdImportResultDetail<List<GisSurveyThirdImportElement>> untarInvalidProperties(
  218. GisSurveyThirdImportResultDetail<Map<String, List<GisSurveyThirdImportElement>>> invalidPropertiesResult
  219. , String resultKey) {
  220. //获取结果
  221. List<GisSurveyThirdImportElement> importElements = invalidPropertiesResult.getResults().get(resultKey);
  222. return new GisSurveyThirdImportResultDetail<>(true, importElements);
  223. }
  224. /**
  225. * 检查结果
  226. *
  227. * @param result 结果
  228. * @return 结果通过状态
  229. */
  230. private Boolean checkResult(GisSurveyThirdImportResult result) {
  231. List<GisSurveyThirdImportElement> invalidLayers = result.getInvalidLayersResult().getResults();
  232. List<GisSurveyThirdImportElement> missingRequirements = result.getMissingRequirementsResult().getResults();
  233. List<GisSurveyThirdImportElement> invalidTypesResult = result.getInvalidTypesResult().getResults();
  234. List<GisSurveyThirdImportElement> outRanges = result.getOutRangesResult().getResults();
  235. List<GisSurveyThirdImportElement> duplicatePoints = result.getDuplicatePointsResult().getResults();
  236. List<GisSurveyThirdImportElement> invalidLines = result.getInvalidLinesResult().getResults();
  237. //检查是否都为空
  238. return CollectionUtils.isEmpty(invalidLayers) && CollectionUtils.isEmpty(missingRequirements) &&
  239. CollectionUtils.isEmpty(invalidTypesResult) && CollectionUtils.isEmpty(outRanges) &&
  240. CollectionUtils.isEmpty(duplicatePoints) && CollectionUtils.isEmpty(invalidLines);
  241. }
  242. }