From a37a8f03f3e5b4d54412b656ea32c6e623a98061 Mon Sep 17 00:00:00 2001
From: linwei <872216696@qq.com>
Date: Thu, 09 Apr 2026 11:36:07 +0800
Subject: [PATCH] opt:优化
---
drone-service/drone-fw/src/main/java/org/sxkj/fw/cockpit/service/impl/CockpitServiceImpl.java | 84 ++++++++++++++++++++++--------------------
1 files changed, 44 insertions(+), 40 deletions(-)
diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/cockpit/service/impl/CockpitServiceImpl.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/cockpit/service/impl/CockpitServiceImpl.java
index 8fbef5c..2bab47a 100644
--- a/drone-service/drone-fw/src/main/java/org/sxkj/fw/cockpit/service/impl/CockpitServiceImpl.java
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/cockpit/service/impl/CockpitServiceImpl.java
@@ -174,55 +174,71 @@
return iFwDefenseSceneManageService.selectFwDefenseSceneManageList(filterTime);
}
+ /**
+ * 统计场景管理与区域数量
+ * <p>
+ * 该方法统计指定时间下的场景管理数量和关联的区域总数。
+ * 统计逻辑:
+ * 1. 查询符合条件的场景管理列表
+ * 2. 去重统计场景管理数量
+ * 3. 获取场景管理关联的防控场景ID集合
+ * 4. 查询防控场景并统计每个场景关联的区域划分数量
+ * 5. 累加所有场景的区域数量得到总数
+ * </p>
+ *
+ * @param filterTime 过滤时间,用于筛选有效的场景管理数据
+ * @return 场景管理统计结果,包含场景管理数量和区域总数
+ */
@Override
public SceneManageStatisticsVO statisticsSceneManageAndArea(Date filterTime) {
List<FwDefenseSceneManageVO> sceneManageList = iFwDefenseSceneManageService.selectFwDefenseSceneManageCockpitList(buildFwBaseInfo(), filterTime);
+ log.info("场景管理列表数据:{}", sceneManageList);
SceneManageStatisticsVO statisticsVO = new SceneManageStatisticsVO();
+
if (sceneManageList == null || sceneManageList.isEmpty()) {
statisticsVO.setSceneManageCount(0);
statisticsVO.setAreaCount(0);
return statisticsVO;
}
- Map<Long, Long> sceneManageSceneMap = new HashMap<>();
- for (FwDefenseSceneManageVO sceneManage : sceneManageList) {
- if (sceneManage == null || sceneManage.getId() == null) {
- continue;
- }
- sceneManageSceneMap.putIfAbsent(sceneManage.getId(), sceneManage.getDefenseSceneId());
- }
- statisticsVO.setSceneManageCount(sceneManageSceneMap.size());
+ // 场景管理数量:按 id 去重(JOIN 可能产生重复行)
+ long sceneManageCount = sceneManageList.stream()
+ .filter(vo -> vo != null && vo.getId() != null)
+ .map(FwDefenseSceneManageVO::getId)
+ .distinct()
+ .count();
+ statisticsVO.setSceneManageCount((int) sceneManageCount);
- Set<Long> defenseSceneIds = new HashSet<>();
- for (Long defenseSceneId : sceneManageSceneMap.values()) {
- if (defenseSceneId != null) {
- defenseSceneIds.add(defenseSceneId);
+ // 区域数量:按防控场景ID去重后,统计每个防控场景关联的区域数量
+ // 同一个防控场景可能被多个场景管理引用,只计一次
+ Map<Long, String> defenseSceneAreaMap = new HashMap<>();
+ for (FwDefenseSceneManageVO vo : sceneManageList) {
+ if (vo != null && vo.getDefenseSceneId() != null) {
+ defenseSceneAreaMap.putIfAbsent(vo.getDefenseSceneId(), vo.getDefenseSceneName());
}
}
- if (defenseSceneIds.isEmpty()) {
+
+ if (defenseSceneAreaMap.isEmpty()) {
statisticsVO.setAreaCount(0);
return statisticsVO;
}
- List<FwDefenseSceneEntity> defenseScenes = iFwDefenseSceneService.listByIds(defenseSceneIds);
- Map<Long, Integer> sceneAreaCountMap = new HashMap<>();
- if (defenseScenes != null && !defenseScenes.isEmpty()) {
+ // 批量查询防控场景,统计区域数量(同一防控场景只计一次)
+ List<FwDefenseSceneEntity> defenseScenes = iFwDefenseSceneService.listByIds(defenseSceneAreaMap.keySet());
+ Set<Long> countedAreaIds = new HashSet<>();
+ int totalAreaCount = 0;
+ if (defenseScenes != null) {
for (FwDefenseSceneEntity scene : defenseScenes) {
if (scene == null || scene.getId() == null) {
continue;
}
- sceneAreaCountMap.put(scene.getId(), countAreaDivide(scene.getAreaDivideIds()));
- }
- }
-
- int totalAreaCount = 0;
- for (Long defenseSceneId : sceneManageSceneMap.values()) {
- if (defenseSceneId == null) {
- continue;
- }
- Integer areaCount = sceneAreaCountMap.get(defenseSceneId);
- if (areaCount != null) {
- totalAreaCount += areaCount;
+ List<Long> areaIds = Func.toLongList(scene.getAreaDivideIds());
+ for (Long areaId : areaIds) {
+ // 全局去重:同一区域ID被多个防控场景引用只计一次
+ if (countedAreaIds.add(areaId)) {
+ totalAreaCount++;
+ }
+ }
}
}
statisticsVO.setAreaCount(totalAreaCount);
@@ -269,16 +285,4 @@
return fwBaseInfo;
}
- /**
- * 统计逗号分隔区域ID的数量
- *
- * @param areaDivideIds 区域ID字符串
- * @return 区域数量
- */
- private int countAreaDivide(String areaDivideIds) {
- if (StringUtil.isBlank(areaDivideIds)) {
- return 0;
- }
- return Func.toLongList(areaDivideIds).size();
- }
}
--
Gitblit v1.9.3