From d07dda28b53260ca0f137e3595ff4eae9019b393 Mon Sep 17 00:00:00 2001 From: wangguangyuan Date: Wed, 2 Sep 2026 15:52:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=BC=BA=E9=99=B7=E6=B1=87=E6=80=BB?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E7=9B=B8=E6=9C=BA=E9=80=9A=E9=81=93?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ResultAnalysisController.java | 25 +++ .../analysis/domain/DefectListQuery.java | 52 +++++ .../service/DefectListAggregator.java | 205 ++++++++++++++++++ .../mapper/PatrolResultMapper.java | 3 + .../service/IPatrolResultService.java | 3 + .../service/impl/PatrolResultServiceImpl.java | 6 + .../mapper/task/PatrolResultMapper.xml | 110 ++++++++++ .../domain/BasedataEqpBookChannel.java | 2 + .../eqpbook/BasedataEqpBookChannelMapper.xml | 14 +- 9 files changed, 414 insertions(+), 6 deletions(-) create mode 100644 inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/domain/DefectListQuery.java create mode 100644 inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/service/DefectListAggregator.java diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/controller/ResultAnalysisController.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/controller/ResultAnalysisController.java index 1fa2e42..2a2b265 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/controller/ResultAnalysisController.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/controller/ResultAnalysisController.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageInfo; import com.inspect.analysis.domain.*; import com.inspect.analysis.service.IResultAnalysisService; +import com.inspect.analysis.service.DefectListAggregator; import com.inspect.base.core.constant.AlgConstants; import com.inspect.base.core.domain.Response; import com.inspect.base.core.enums.PointStatusEnum; @@ -884,6 +885,30 @@ public class ResultAnalysisController extends BaseController { return rspData; } + /** + * 缺陷列表查询:同一任务、点位对象和算法聚合为一条记录。 + */ + @GetMapping({"/defect/summary"}) + public TableDataInfo defectSummary(DefectListQuery query) { + logger.info("LIST_DEFECT_SUMMARY param: {}", query); + + List candidates = patrolResultService.selectDefectList(query); + logger.info("缺陷汇总原始数据 candidates size:{}",candidates == null ? 0 : candidates.size()); + List algInfos = patrolResultService.selectAlgInfo(new PatrolResult()); + List resultList = DefectListAggregator.aggregate(candidates, algInfos); + logger.info("缺陷汇总 resultList size:{}",resultList.size()); + PageDomain pageDomain = TableSupport.buildPageRequest(); + List pageList = DefectListAggregator.page( + resultList, pageDomain.getPageNum(), pageDomain.getPageSize()); + + TableDataInfo response = new TableDataInfo(); + response.setCode(200); + response.setRows(pageList); + response.setTotal(resultList.size()); + response.setMsg("查询成功"); + return response; + } + private static class GroupKey { private final String objectId; private final String algType; diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/domain/DefectListQuery.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/domain/DefectListQuery.java new file mode 100644 index 0000000..c6fe00d --- /dev/null +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/domain/DefectListQuery.java @@ -0,0 +1,52 @@ +package com.inspect.analysis.domain; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.util.List; + +/** + * 缺陷列表查询条件。 + */ +@Getter +@Setter +@ToString +public class DefectListQuery { + /** 巡视任务执行 ID。 */ + private String taskPatrolledId; + /** 服务层根据主任务展开后的任务执行 ID。 */ + private List taskPatrolIds; + /** 结果来源:0-大模型,1-初筛。 */ + private String filter; + /** 算法类型。 */ + private String algType; + /** 区域 ID。 */ + private String areaId; + /** 主设备 ID。 */ + private String deviceId; + /** 点位 ID。 */ + private String pointId; + /** 任务编码。 */ + private String taskCode; + /** 点位名称。 */ + private String pointName; + /** 任务名称。 */ + private String taskName; + /** 主设备名称。 */ + private String deviceName; + /** 相机/巡检设备名称。 */ + private String channelName; + /** 系统/设备来源。 */ + private String deviceSource; + /** 点位状态。 */ + private String pointStatus; + /** 缺陷描述关键字。 */ + private String desc; + /** 开始日期,格式 yyyy-MM-dd。 */ + private String beginTime; + /** 结束日期,格式 yyyy-MM-dd。 */ + private String endTime; + /** 预置位类型:0-视频,其他-机器人/无人机;未传时按视频处理。 */ + private String posType = "0"; +} diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/service/DefectListAggregator.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/service/DefectListAggregator.java new file mode 100644 index 0000000..c6defbc --- /dev/null +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/service/DefectListAggregator.java @@ -0,0 +1,205 @@ +package com.inspect.analysis.service; + +import com.inspect.analysis.domain.AlgValue; +import com.inspect.base.core.constant.AlgConstants; +import com.inspect.base.core.utils.StringUtils; +import com.inspect.partrolresult.domain.AlgInfo; +import com.inspect.task.domain.PatrolData; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 将缺陷分析明细按任务、对象和算法聚合为列表展示记录。 + */ +public final class DefectListAggregator { + + private DefectListAggregator() { + } + + public static List aggregate(List source, List algInfos) { + if (source == null || source.isEmpty()) { + return new ArrayList<>(); + } + + Map algNameMap = algInfos == null ? Collections.emptyMap() : algInfos.stream() + .filter(Objects::nonNull) + .filter(item -> StringUtils.isNotEmpty(item.getAlgSubtypeCode())) + .collect(Collectors.toMap(AlgInfo::getAlgSubtypeCode, AlgInfo::getAlgSubtypeName, + (first, ignored) -> first)); + + Map> groups = new LinkedHashMap<>(); + for (PatrolData item : source) { + if (item == null || !"0".equals(item.getWarnStatus()) + || AlgConstants.CORRECTION.equals(item.getAlgType())) { + continue; + } + item.setAlgName(algNameMap.getOrDefault(item.getAlgType(), "")); + prepareItem(item); + GroupKey key = new GroupKey(item.getTaskPatrolId(), item.getObjectId(), item.getAlgType()); + groups.computeIfAbsent(key, ignored -> new ArrayList<>()).add(item); + } + + List result = new ArrayList<>(); + for (Map.Entry> entry : groups.entrySet()) { + result.add(merge(entry.getKey(), entry.getValue())); + } + result.sort(Comparator.comparingInt(item -> statusRank(item.getResStatus()))); + return result; + } + + public static List page(List source, Integer pageNum, Integer pageSize) { + if (source == null || source.isEmpty()) { + return new ArrayList<>(); + } + int safePageNum = pageNum == null || pageNum < 1 ? 1 : pageNum; + int safePageSize = pageSize == null || pageSize < 1 ? 10 : pageSize; + long from = (long) (safePageNum - 1) * safePageSize; + if (from >= source.size()) { + return new ArrayList<>(); + } + int fromIndex = (int) from; + long to = Math.min((long) source.size(), from + safePageSize); + int toIndex = (int) to; + return source.subList(fromIndex, toIndex); + } + + private static void prepareItem(PatrolData item) { + if ("1".equals(item.getFilter()) && StringUtils.isNotEmpty(item.getImageNormalUrlPath())) { + item.setImg(item.getImageNormalUrlPath()); + } + if (item.getResValue() != null && "meter".equals(item.getAlgType())) { + String value = new AlgValue().formatValue(item.getResValue()); + if ("-1".equals(value)) { + item.setResValue("空值"); + } + } + } + + private static PatrolData merge(GroupKey key, List values) { + PatrolData result = new PatrolData(); + result.setTaskPatrolId(key.taskPatrolId); + result.setObjectId(key.objectId); + result.setAlgType(key.algType); + result.setDesc(joinDistinct(values, PatrolData::getDesc)); + + for (PatrolData item : values) { + if ("1".equals(item.getFilter())) { +// if (StringUtils.isEmpty(result.getImgAnalyse())) { +// result.setImgAnalyse(item.getImgAnalyse()); +// } + if (StringUtils.isEmpty(result.getImg())) { + result.setImg(item.getImg()); + } + } + if ("0".equals(item.getFilter())) { + if (StringUtils.isNotEmpty(item.getImgAnalyse())) { + result.setImgAnalyse(item.getImgAnalyse()); + } +// if (StringUtils.isNotEmpty(item.getImg())) { +// result.setImg(item.getImg()); +// } + } +// if (StringUtils.isEmpty(result.getImg())) { +// if (StringUtils.isNotEmpty(item.getImgAnalyse())) { +// result.setImgAnalyse(item.getImgAnalyse()); +// } +// if (StringUtils.isNotEmpty(item.getImg())) { +// result.setImg(item.getImg()); +// } +// } + } + + result.setImageNormalUrlPath(firstNonEmpty(values, PatrolData::getImageNormalUrlPath)); + result.setFilePath(firstNonEmpty(values, PatrolData::getFilePath)); + result.setAlgName(firstNonEmpty(values, PatrolData::getAlgName)); + result.setAreaName(firstNonEmpty(values, PatrolData::getAreaName)); +// result.setBrightDesc(firstNonEmpty(values, PatrolData::getBrightDesc)); +// result.setBrightImgAnalyse(firstNonEmpty(values, PatrolData::getBrightImgAnalyse)); +// result.setBrightResStatus(firstNonEmpty(values, PatrolData::getBrightResStatus)); + result.setChannelName(firstNonEmpty(values, PatrolData::getChannelName)); + result.setDataType(firstNonEmpty(values, PatrolData::getDataType)); + result.setDeviceName(firstNonEmpty(values, PatrolData::getDeviceName)); + result.setDeviceSource(firstNonEmpty(values, PatrolData::getDeviceSource)); + result.setImgType(firstNonEmpty(values, PatrolData::getImgType)); + result.setLineId(joinDistinct(values, PatrolData::getLineId)); + result.setPatrolTime(firstNonEmpty(values, PatrolData::getPatrolTime)); + result.setPointId(firstNonEmpty(values, PatrolData::getPointId)); + result.setPointName(firstNonEmpty(values, PatrolData::getPointName)); + result.setPointStatus(firstNonEmpty(values, PatrolData::getPointStatus)); + result.setRequestId(firstNonEmpty(values, PatrolData::getRequestId)); + result.setResValue(firstNonEmpty(values, PatrolData::getResValue)); + result.setResStatus(firstNonEmpty(values, PatrolData::getResStatus)); + result.setSuggestion(firstNonEmpty(values, PatrolData::getSuggestion)); + result.setWarnStatus("0"); + return result; + } + + private static String firstNonEmpty(List values, Function getter) { + return values.stream().map(getter).filter(StringUtils::isNotEmpty).findFirst().orElse(""); + } + + private static String joinDistinct(List values, Function getter) { + Set distinct = new LinkedHashSet<>(); + for (PatrolData value : values) { + String item = getter.apply(value); + if (StringUtils.isNotEmpty(item)) { + distinct.add(item); + } + } + return String.join(",", distinct); + } + + private static int statusRank(String status) { + if ("1".equals(status)) { + return 1; + } + if ("3".equals(status)) { + return 2; + } + if ("2".equals(status)) { + return 3; + } + return 10; + } + + private static final class GroupKey { + private final String taskPatrolId; + private final String objectId; + private final String algType; + + private GroupKey(String taskPatrolId, String objectId, String algType) { + this.taskPatrolId = taskPatrolId; + this.objectId = objectId; + this.algType = algType; + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (!(other instanceof GroupKey)) { + return false; + } + GroupKey that = (GroupKey) other; + return Objects.equals(taskPatrolId, that.taskPatrolId) + && Objects.equals(objectId, that.objectId) + && Objects.equals(algType, that.algType); + } + + @Override + public int hashCode() { + return Objects.hash(taskPatrolId, objectId, algType); + } + } +} diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/mapper/PatrolResultMapper.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/mapper/PatrolResultMapper.java index f8ae020..97e1f68 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/mapper/PatrolResultMapper.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/mapper/PatrolResultMapper.java @@ -1,6 +1,7 @@ package com.inspect.partrolresult.mapper; import com.inspect.analysis.domain.ResultAnalysis; +import com.inspect.analysis.domain.DefectListQuery; import com.inspect.partrolresult.domain.*; import com.inspect.statistics.domain.TaskStatisticsConfig; import com.inspect.system.base.openDomain.BasedataEqpBookMoMain; @@ -34,6 +35,8 @@ public interface PatrolResultMapper { List selectPatrolDataResultByTaskCodeV2(ResultAnalysis resultAnalysis); + List selectDefectList(DefectListQuery query); + List selectPatrolDataResultByTaskCodeList(PatrolTaskStatus patrolTaskStatus); List selectBasedataEqpBookList(BasedataEqpBookMoMain basedataEqpBookMoMain); diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/IPatrolResultService.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/IPatrolResultService.java index ee14a13..5b3a40c 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/IPatrolResultService.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/IPatrolResultService.java @@ -1,6 +1,7 @@ package com.inspect.partrolresult.service; import com.inspect.analysis.domain.ResultAnalysis; +import com.inspect.analysis.domain.DefectListQuery; import com.inspect.insreport.domain.InspectionReport; import com.inspect.partrolresult.domain.*; import com.inspect.resultmain.domain.PatrolTaskResultMain; @@ -30,6 +31,8 @@ public interface IPatrolResultService { List selectPatrolDataResultByTaskCodeV2(ResultAnalysis resultAnalysis); + List selectDefectList(DefectListQuery query); + List selectPatrolDataResultByTaskCodeList(PatrolTaskStatus patrolTaskStatus); List selectBasedataEqpBookList(BasedataEqpBookMoMain basedataEqpbookMomain); diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java index fccc5b5..9e52a3f 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.inspect.analysis.domain.AlgValue; import com.inspect.analysis.domain.AnalyseResPoint; +import com.inspect.analysis.domain.DefectListQuery; import com.inspect.analysis.domain.ResultAnalysis; import com.inspect.analysis.mapper.ResultAnalysisMapper; import com.inspect.analysis.utils.ResultAnalysisUtils; @@ -147,6 +148,11 @@ public class PatrolResultServiceImpl implements IPatrolResultService { return this.patrolResultMapper.selectPatrolDataResultByTaskCodeV3(resultAnalysis); } + @Override + public List selectDefectList(DefectListQuery query) { + return patrolResultMapper.selectDefectList(query); + } + public List selectPatrolDataResultByTaskCodeList(PatrolTaskStatus patrolTaskStatus) { return patrolResultMapper.selectPatrolDataResultByTaskCodeList(patrolTaskStatus); } diff --git a/inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolResultMapper.xml b/inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolResultMapper.xml index d319d34..641be86 100644 --- a/inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolResultMapper.xml +++ b/inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolResultMapper.xml @@ -346,6 +346,116 @@ ORDER BY line_id desc + + diff --git a/inspect-metadata/src/main/java/com/inspect/metadata/eqpbook/domain/BasedataEqpBookChannel.java b/inspect-metadata/src/main/java/com/inspect/metadata/eqpbook/domain/BasedataEqpBookChannel.java index 90001ad..7824b33 100644 --- a/inspect-metadata/src/main/java/com/inspect/metadata/eqpbook/domain/BasedataEqpBookChannel.java +++ b/inspect-metadata/src/main/java/com/inspect/metadata/eqpbook/domain/BasedataEqpBookChannel.java @@ -93,6 +93,8 @@ public class BasedataEqpBookChannel extends BaseEntity { private String areaName; + private Long areaId; + public String toString() { return (new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)).append("channelId", this.getChannelId()).append("channelCode", this.getChannelCode()).append("channelName", this.getChannelName()).append("parentChannelId", this.getParentChannelId()).append("eqpbookId", this.getEqpBookId()).append("channelType", this.getChannelType()).append("onlineState", this.getOnlineState()).append("channelContent", this.getChannelContent()).append("provider", this.getProvider()).append("address", this.getAddress()).append("host", this.getHost()).append("port", this.getPort()).append("createBy", this.getCreateBy()).append("createTime", this.getCreateTime()).append("updateBy", this.getUpdateBy()).append("updateTime", this.getUpdateTime()).append("deleteFlag", this.getDeleteFlag()).append("patroldeviceCode", this.getPatrolDeviceCode()).append("username", this.getUsername()).append("password", this.getPassword()).toString(); } diff --git a/inspect-metadata/src/main/resources/mapper/eqpbook/BasedataEqpBookChannelMapper.xml b/inspect-metadata/src/main/resources/mapper/eqpbook/BasedataEqpBookChannelMapper.xml index fe7ed92..e98c59b 100644 --- a/inspect-metadata/src/main/resources/mapper/eqpbook/BasedataEqpBookChannelMapper.xml +++ b/inspect-metadata/src/main/resources/mapper/eqpbook/BasedataEqpBookChannelMapper.xml @@ -5,6 +5,10 @@ + + + + @@ -58,6 +62,10 @@