123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- package com.shkpr.service.alambizplugin.components.checker;
- import com.global.base.log.LogLevelFlag;
- import com.global.base.log.LogPrintMgr;
- import com.shkpr.service.alambizplugin.commtools.BeanUtil;
- import com.shkpr.service.alambizplugin.components.GisSurveySystemCheckResultManager;
- import com.shkpr.service.alambizplugin.constants.GisSurveySystemCheckResultPath;
- import com.shkpr.service.alambizplugin.constants.LogFlagBusiType;
- import com.shkpr.service.alambizplugin.dto.GisSurveyLayerApplyLine;
- import com.shkpr.service.alambizplugin.dto.GisSurveyLayerApplyPoint;
- import com.shkpr.service.alambizplugin.dto.GisSurveySystemCheckElement;
- import com.shkpr.service.alambizplugin.dto.GisSurveySystemCheckId;
- import com.shkpr.service.alambizplugin.dto.GisSurveySystemCheckResultDetail;
- import org.apache.commons.lang3.StringUtils;
- import org.springframework.scheduling.annotation.Async;
- import org.springframework.scheduling.annotation.AsyncResult;
- import org.springframework.stereotype.Component;
- import org.springframework.util.concurrent.ListenableFuture;
- import java.util.Collections;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Objects;
- import java.util.Set;
- import java.util.stream.Collectors;
- /**
- * 寻找孤立点
- */
- @Component
- public class IsolatedPointsFinder {
- /**
- * log
- */
- private final String mStrClassName;
- private final String mBizType;
- private final GisSurveySystemCheckResultManager systemCheckResultManager;
- public IsolatedPointsFinder(GisSurveySystemCheckResultManager systemCheckResultManager) {
- mStrClassName = "IsolatedPointsFinder";
- mBizType = LogFlagBusiType.BUSI_GIS_SURVEY.toStrValue();
- this.systemCheckResultManager = systemCheckResultManager;
- }
- /**
- * 寻找孤立点
- * <p>根据 {@code code} 上下游匹配,不涉及拓扑点</p><p>标识: {@code code} 唯一</p>
- *
- * @param points 点集合
- * @param lines 线集合
- * @param systemCheckId 系统检查id
- * @return 孤立点集合
- */
- @Async
- public ListenableFuture<GisSurveySystemCheckResultDetail> findIsolatedPoints(List<GisSurveyLayerApplyPoint> points
- , List<GisSurveyLayerApplyLine> lines, GisSurveySystemCheckId systemCheckId) throws InterruptedException {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName, "开始执行寻找孤立点========>");
- long begin = System.currentTimeMillis();
- //线为空,点不为空,则全孤立点
- if (lines.isEmpty() && !points.isEmpty()) {
- List<GisSurveySystemCheckElement> elements = points.parallelStream()
- //转为返回元素
- .map(point -> BeanUtil.copy(point, GisSurveySystemCheckElement.class))
- .collect(Collectors.toList());
- return new AsyncResult<>(createResult(elements, systemCheckId, begin));
- }
- //线为空,点也为空,则无孤立点
- if (lines.isEmpty()) return new AsyncResult<>(createResult(Collections.emptyList(), systemCheckId, begin));
- //点为空,则无孤立点
- if (points.isEmpty()) return new AsyncResult<>(createResult(Collections.emptyList(), systemCheckId, begin));
- //计算预期最大容量,避免频繁扩容
- int expectedMaxSize = (int) (((long) lines.size() << 1) / .75f + 1);
- //联通点code
- Set<String> connectedPoints = new HashSet<>(expectedMaxSize);
- //遍历所有线,标记参与的点
- for (GisSurveyLayerApplyLine line : lines) {
- //响应中断
- if (Thread.interrupted()) throw new InterruptedException();
- //上下游节点判空
- if (StringUtils.isBlank(line.getUpNode()) || StringUtils.isBlank(line.getDownNode())) continue;
- connectedPoints.add(line.getUpNode());
- connectedPoints.add(line.getDownNode());
- }
- //使用并行流找出孤立点
- List<GisSurveySystemCheckElement> elements = points.parallelStream()
- //转为返回元素
- .map(point -> BeanUtil.copy(point, GisSurveySystemCheckElement.class))
- //过滤连通点
- .filter(element -> Objects.nonNull(element) && !connectedPoints.contains(element.getCode()))
- .collect(Collectors.toList());
- return new AsyncResult<>(createResult(elements, systemCheckId, begin));
- }
- /**
- * 创建结果
- *
- * @param data 数据
- * @param systemCheckId 系统检查id
- * @param begin 开始时间
- * @return 结果
- */
- private GisSurveySystemCheckResultDetail createResult(List<GisSurveySystemCheckElement> data
- , GisSurveySystemCheckId systemCheckId, long begin) {
- //数据大小
- final int size = data.size();
- //写入路径
- String path = GisSurveySystemCheckResultPath.ISOLATED_POINTS;
- //写入文件
- systemCheckResultManager.writeResult(data, systemCheckId, path);
- long end = System.currentTimeMillis();
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName
- , String.format(
- "结束执行寻找孤立点,用时(毫秒):%d"
- , (end - begin)
- )
- );
- //构建结果
- return new GisSurveySystemCheckResultDetail(true, GisSurveySystemCheckResultPath.relativePath(systemCheckId, path), size);
- }
- }
|