From f185fa47066fc5c43b9975994c6eb53aa465ba2a Mon Sep 17 00:00:00 2001 From: xy <748613696@qq.com> Date: Tue, 7 Jul 2026 20:29:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(event):=20=E6=B7=BB=E5=8A=A0=E7=94=B5?= =?UTF-8?q?=E8=83=BD=E8=B4=A8=E9=87=8F=E4=BA=8B=E4=BB=B6=E6=BA=90=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E5=AD=98=E5=82=A8=E5=92=8C=E6=9F=A5=E8=AF=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在事件详情表中新增 SagSource 字段存储 - 修改 insertEvent 方法增加 sagSource 参数传递 - 优化事件用户查询页面的搜索逻辑,支持按告警码查询 - 更新 XML 映射文件中的搜索条件构建方式 - 添加对电能质量参数 EPD 列表的查询支持 - 修复数据服务中排序字段错误问题 - 补充便携式离线日志处理中的源信息同步 --- .../impl/PortableOfflLogServiceImpl.java | 3 + .../param/CsEventUserQueryPage.java | 3 + .../mapper/mapping/CsEventUserPOMapper.xml | 24 +- .../service/impl/CsEventPOServiceImpl.java | 5 +- .../impl/CsEventUserPOServiceImpl.java | 219 ++++++++++++++---- .../service/impl/DataServiceImpl.java | 4 +- 6 files changed, 198 insertions(+), 60 deletions(-) diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/PortableOfflLogServiceImpl.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/PortableOfflLogServiceImpl.java index f0ece55..24178a9 100644 --- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/PortableOfflLogServiceImpl.java +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/PortableOfflLogServiceImpl.java @@ -628,6 +628,9 @@ public class PortableOfflLogServiceImpl extends ServiceImpl epdTagList; } \ No newline at end of file diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/mapper/mapping/CsEventUserPOMapper.xml b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/mapper/mapping/CsEventUserPOMapper.xml index eaf0484..88aae5f 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/mapper/mapping/CsEventUserPOMapper.xml +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/mapper/mapping/CsEventUserPOMapper.xml @@ -223,13 +223,25 @@ AND b.severity < #{csEventUserQueryPage.severityMax} - - - AND e.name like concat('%',#{csEventUserQueryPage.searchValue},'%') - - - AND d.name like concat('%',#{csEventUserQueryPage.searchValue},'%') + + AND ( + + + + e.name LIKE CONCAT('%', #{csEventUserQueryPage.searchValue}, '%') + + + d.name LIKE CONCAT('%', #{csEventUserQueryPage.searchValue}, '%') + + + + + OR b.tag IN + + #{tagItem} + + ) diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java index f8dfff1..6944ee9 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java @@ -479,7 +479,7 @@ public class CsEventPOServiceImpl extends ServiceImpl epdList = epdFeignClient.findListByCode(searchValue).getData(); + if (CollUtil.isNotEmpty(epdList)) { + List epdTagList = epdList.stream() + .map(EleEpdPqd::getName) + .collect(Collectors.toList()); + csEventUserQueryPage.setEpdTagList(epdTagList); + } + } //获取监测点电压等级 List list = csLineFeignClient.getAllLineDetail().getData(); Map map = list.stream().collect(Collectors.toMap(CsLineDTO::getLineId, temp -> temp)); @@ -559,65 +571,172 @@ public class CsEventUserPOServiceImpl extends ServiceImpl getFrontWarnInfo(CldWarnParam baseParam) { Page result = new Page<>(baseParam.getPageNum(), baseParam.getPageSize()); - Page page = new Page<>(baseParam.getPageNum(), baseParam.getPageSize()); - List nodeList = nodeFeignClient.nodeAllList().getData(); - Map nodeMap = new HashMap<>(); - if (CollectionUtil.isNotEmpty(nodeList)) { - nodeMap = nodeList.stream().collect(Collectors.toMap(Node::getId, Function.identity())); - if (ObjectUtil.isNotNull(baseParam.getSearchValue()) || StringUtil.isNotBlank(baseParam.getSearchValue())) { - nodeList = nodeList.stream().filter(item-> item.getName().contains(baseParam.getSearchValue()) || item.getIp().contains(baseParam.getSearchValue())).collect(Collectors.toList()); + // 1. 获取全量节点并构建映射(始终保留全量map用于后续VO转换) + List nodeList = nodeFeignClient.nodeAllList().getData(); + if (CollectionUtil.isEmpty(nodeList)) { + return result; + } + Map nodeMap = nodeList.stream() + .collect(Collectors.toMap(Node::getId, Function.identity(), (a, b) -> a)); + + // 2. 提取搜索关键词,避免重复调用getter + String searchValue = baseParam.getSearchValue(); + boolean hasSearchValue = StrUtil.isNotBlank(searchValue); + // 3. 根据搜索词筛选出"名称/IP匹配"的节点ID(仅作为OR条件的一部分) + List matchedNodeIds; + if (hasSearchValue) { + matchedNodeIds = nodeList.stream() + .filter(item -> item.getName().contains(searchValue) + + || item.getIp().contains(searchValue)) + .map(Node::getId) + .collect(Collectors.toList()); + } else { + matchedNodeIds = Collections.emptyList(); + } + // 4. 全量节点ID(用于限定查询总范围,防止code LIKE查到无关设备) + List allNodeIds = nodeList.stream() + .map(Node::getId) + .collect(Collectors.toList()); + + // 5. 构建查询条件 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // 搜索条件下 deviceId 与 code 改为 OR 关系 + if (hasSearchValue) { + if (CollectionUtil.isNotEmpty(matchedNodeIds)) { + // 有匹配节点:(deviceId IN 匹配节点 OR code LIKE) AND deviceId IN 全部节点 + queryWrapper.in(CsEventPO::getDeviceId, allNodeIds) + .and(w -> w + .in(CsEventPO::getDeviceId, matchedNodeIds) + .or() + .like(CsEventPO::getCode, searchValue) + ); + } else { + // 无匹配节点:仅靠 code LIKE,但仍限定在全部节点范围内 + queryWrapper.in(CsEventPO::getDeviceId, allNodeIds) + .and(w -> w.like(CsEventPO::getCode, searchValue)); } - if (CollectionUtil.isNotEmpty(nodeList)) { - List nodeIds = nodeList.stream().map(Node::getId).collect(Collectors.toList()); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(CsEventPO::getDeviceId, nodeIds) - .between(CsEventPO::getStartTime, - DateUtil.beginOfDay(DateUtil.parse(baseParam.getSearchBeginTime())).toString(), - DateUtil.endOfDay(DateUtil.parse(baseParam.getSearchEndTime())).toString()) - .eq(CsEventPO::getType, 4) - .orderByDesc(CsEventPO::getStartTime); - if (ObjectUtil.isNotNull(baseParam.getLevel()) && StringUtil.isNotBlank(baseParam.getLevel())) { - List levelList = Arrays.stream(baseParam.getLevel().split(",")) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .map(Integer::parseInt) - .collect(Collectors.toList()); - queryWrapper.in(CsEventPO::getLevel, levelList); - } - page = csEventPOMapper.selectPage(page, queryWrapper); + } else { + // 无搜索词:正常按全部节点查询 + queryWrapper.in(CsEventPO::getDeviceId, allNodeIds); + } + // 时间范围 & 类型固定条件 + queryWrapper.between(CsEventPO::getStartTime, + DateUtil.beginOfDay(DateUtil.parse(baseParam.getSearchBeginTime())).toString(), + DateUtil.endOfDay(DateUtil.parse(baseParam.getSearchEndTime())).toString()) + .eq(CsEventPO::getType, 4) + .orderByDesc(CsEventPO::getStartTime); + // 等级筛选 + if (StrUtil.isNotBlank(baseParam.getLevel())) { + List levelList = Arrays.stream(baseParam.getLevel().split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .map(Integer::parseInt) + .collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(levelList)) { + queryWrapper.in(CsEventPO::getLevel, levelList); } } + + // 6. 执行分页查询 + Page page = csEventPOMapper.selectPage( + new Page<>(baseParam.getPageNum(), baseParam.getPageSize()), queryWrapper); + // 7. 结果转换 List records = page.getRecords(); - if (CollUtil.isNotEmpty(records)) { - List frontWarnVos = new ArrayList<>(); - Map finalNodeMap = nodeMap; - page.getRecords().forEach(item->{ - FrontWarnVo vo = new FrontWarnVo(); - //这边将前置名称放进lineId字段;将前置IP放进wavePath字段;进程号使用clDid - Node node = finalNodeMap.get(item.getDeviceId()); - item.setLineId(Objects.isNull(node) ? null : node.getName()); - item.setWavePath(Objects.isNull(node) ? null : node.getIp()); - //事件等级(1:Ⅰ级||ERROR 2:Ⅱ级||WARN 3:Ⅲ级||(DEBUG&&NORMAL)) - if (item.getLevel() == 4 || item.getLevel() == 5) { - item.setLevel(3); - } else if (item.getLevel() == 6) { - item.setLevel(2); - } else if (item.getLevel() == 7) { - item.setLevel(1); - } - BeanUtils.copyProperties(item, vo); - frontWarnVos.add(vo); - }); - result.setRecords(frontWarnVos); - result.setTotal(page.getTotal()); - result.setPages(page.getPages()); - result.setCurrent(page.getCurrent()); - result.setSize(page.getSize()); + if (CollUtil.isEmpty(records)) { + return result; } + List frontWarnVos = records.stream().map(item -> { + FrontWarnVo vo = new FrontWarnVo(); + // 填充节点信息(使用全量nodeMap,而非过滤后的列表) + Node node = nodeMap.get(item.getDeviceId()); + item.setLineId(node != null ? node.getName() : null); + item.setWavePath(node != null ? node.getIp() : null); + // 事件等级映射: 4,5→3(DEBUG/NORMAL) | 6→2(WARN) | 7→1(ERROR) + Integer level = item.getLevel(); + if (level == 4 || level == 5) { + item.setLevel(3); + } else if (level == 6) { + item.setLevel(2); + } else if (level == 7) { + item.setLevel(1); + } + BeanUtils.copyProperties(item, vo); + return vo; + }).collect(Collectors.toList()); + + result.setRecords(frontWarnVos); + result.setTotal(page.getTotal()); + result.setPages(page.getPages()); + result.setCurrent(page.getCurrent()); + result.setSize(page.getSize()); return result; } +// @Override +// public Page getFrontWarnInfo(CldWarnParam baseParam) { +// Page result = new Page<>(baseParam.getPageNum(), baseParam.getPageSize()); +// Page page = new Page<>(baseParam.getPageNum(), baseParam.getPageSize()); +// List nodeList = nodeFeignClient.nodeAllList().getData(); +// Map nodeMap = new HashMap<>(); +// +// if (CollectionUtil.isNotEmpty(nodeList)) { +// nodeMap = nodeList.stream().collect(Collectors.toMap(Node::getId, Function.identity())); +// if (ObjectUtil.isNotNull(baseParam.getSearchValue()) || StringUtil.isNotBlank(baseParam.getSearchValue())) { +// nodeList = nodeList.stream().filter(item-> item.getName().contains(baseParam.getSearchValue()) || item.getIp().contains(baseParam.getSearchValue())).collect(Collectors.toList()); +// } +// if (CollectionUtil.isNotEmpty(nodeList)) { +// List nodeIds = nodeList.stream().map(Node::getId).collect(Collectors.toList()); +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.in(CsEventPO::getDeviceId, nodeIds) +// .between(CsEventPO::getStartTime, +// DateUtil.beginOfDay(DateUtil.parse(baseParam.getSearchBeginTime())).toString(), +// DateUtil.endOfDay(DateUtil.parse(baseParam.getSearchEndTime())).toString()) +// .eq(CsEventPO::getType, 4) +// .like(StrUtil.isNotBlank(baseParam.getSearchValue()), CsEventPO::getCode, baseParam.getSearchValue()) +// .orderByDesc(CsEventPO::getStartTime); +// if (ObjectUtil.isNotNull(baseParam.getLevel()) && StringUtil.isNotBlank(baseParam.getLevel())) { +// List levelList = Arrays.stream(baseParam.getLevel().split(",")) +// .map(String::trim) +// .filter(s -> !s.isEmpty()) +// .map(Integer::parseInt) +// .collect(Collectors.toList()); +// queryWrapper.in(CsEventPO::getLevel, levelList); +// } +// page = csEventPOMapper.selectPage(page, queryWrapper); +// } +// } +// List records = page.getRecords(); +// if (CollUtil.isNotEmpty(records)) { +// List frontWarnVos = new ArrayList<>(); +// Map finalNodeMap = nodeMap; +// page.getRecords().forEach(item->{ +// FrontWarnVo vo = new FrontWarnVo(); +// //这边将前置名称放进lineId字段;将前置IP放进wavePath字段;进程号使用clDid +// Node node = finalNodeMap.get(item.getDeviceId()); +// item.setLineId(Objects.isNull(node) ? null : node.getName()); +// item.setWavePath(Objects.isNull(node) ? null : node.getIp()); +// //事件等级(1:Ⅰ级||ERROR 2:Ⅱ级||WARN 3:Ⅲ级||(DEBUG&&NORMAL)) +// if (item.getLevel() == 4 || item.getLevel() == 5) { +// item.setLevel(3); +// } else if (item.getLevel() == 6) { +// item.setLevel(2); +// } else if (item.getLevel() == 7) { +// item.setLevel(1); +// } +// BeanUtils.copyProperties(item, vo); +// frontWarnVos.add(vo); +// }); +// result.setRecords(frontWarnVos); +// result.setTotal(page.getTotal()); +// result.setPages(page.getPages()); +// result.setCurrent(page.getCurrent()); +// result.setSize(page.getSize()); +// } +// return result; +// } + @Override public List queryEventListByUserId(String userIndex, List eventList) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/DataServiceImpl.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/DataServiceImpl.java index 768ed3b..987ce1f 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/DataServiceImpl.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/DataServiceImpl.java @@ -1757,7 +1757,7 @@ public class DataServiceImpl implements IDataService { if (CollUtil.isNotEmpty(result)) { result.sort(Comparator.comparing(AppLineDetailVo::getProjectName) .thenComparing(AppLineDetailVo::getDeviceName) - .thenComparing(AppLineDetailVo::getPointId)); + .thenComparing(AppLineDetailVo::getPointName)); } return result; } @@ -2042,7 +2042,7 @@ public class DataServiceImpl implements IDataService { children2.sort(Comparator.comparingInt(AppLineDetailVo.targetDetail::getSort)); children2.forEach(item2->{ if (Objects.isNull(item2.getData())) { - item2.setData(3.15159); + item2.setData(3.14159); } if (!Objects.equals(item2.getData(),NULL_DATA)) { item2.setData(BigDecimal.valueOf(item2.getData()).setScale(2, RoundingMode.HALF_UP).doubleValue());