From 66bfbdb9251c22ffa2b5f05595a76a3547a2f5eb Mon Sep 17 00:00:00 2001
From: rain <1679827795@qq.com>
Date: Mon, 09 Feb 2026 11:00:44 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 drone-service/drone-fw/src/main/java/org/sxkj/fw/area/service/impl/FwDefenseSceneServiceImpl.java |  201 +++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 175 insertions(+), 26 deletions(-)

diff --git a/drone-service/drone-fw/src/main/java/org/sxkj/fw/area/service/impl/FwDefenseSceneServiceImpl.java b/drone-service/drone-fw/src/main/java/org/sxkj/fw/area/service/impl/FwDefenseSceneServiceImpl.java
index 3545a1b..7d31d40 100644
--- a/drone-service/drone-fw/src/main/java/org/sxkj/fw/area/service/impl/FwDefenseSceneServiceImpl.java
+++ b/drone-service/drone-fw/src/main/java/org/sxkj/fw/area/service/impl/FwDefenseSceneServiceImpl.java
@@ -17,6 +17,7 @@
 package org.sxkj.fw.area.service.impl;
 
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.sxkj.common.utils.HeaderUtils;
@@ -33,6 +34,8 @@
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.sxkj.system.cache.SysCache;
+
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
@@ -43,6 +46,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.Date;
+import java.util.stream.Collectors;
 
 /**
  * 防控场景表 服务实现类
@@ -63,6 +67,10 @@
 
 	@Override
 	public IPage<FwDefenseSceneVO> selectFwDefenseScenePage(IPage<FwDefenseSceneVO> page, FwDefenseSceneVO fwDefenseScene) {
+		if (!AuthUtil.isAdministrator()) {
+			List<Long> deptList = SysCache.getDeptChildIds(Long.valueOf(AuthUtil.getDeptId()));
+			fwDefenseScene.setDeptList(deptList);
+		}
 		IPage<FwDefenseSceneVO> result = page.setRecords(baseMapper.selectFwDefenseScenePage(page, fwDefenseScene));
 		List<FwDefenseSceneVO> records = result.getRecords();
 		if (records == null || records.isEmpty()) {
@@ -83,7 +91,7 @@
 				if (area == null || area.getId() == null) {
 					continue;
 				}
-				areaSizeMap.put(area.getId(), area.getAreaSize());
+//				areaSizeMap.put(area.getId(), area.getAreaSize());
 				List<Long> areaDeviceIds = parseIdList(area.getDeviceIds());
 				areaDeviceMap.put(area.getId(), areaDeviceIds);
 				deviceIdSet.addAll(areaDeviceIds);
@@ -104,7 +112,6 @@
 		for (FwDefenseSceneVO record : records) {
 			List<Long> areaIds = parseIdList(record.getAreaDivideIds());
 			record.setAreaCount(areaIds.size());
-			record.setDefenseArea(sumDefenseArea(areaIds, areaSizeMap));
 
 			Set<Long> deviceIds = new HashSet<>();
 			for (Long areaId : areaIds) {
@@ -134,8 +141,12 @@
 	}
 
 	@Override
-	public List<FwDefenseSceneVO> selectFwDefenseSceneList(Integer filterSelected, Long areaId) {
-		return baseMapper.selectFwDefenseSceneList(filterSelected, areaId);
+	public List<FwDefenseSceneVO> selectFwDefenseSceneList(Integer filterSelected, Long zoneId, Long areaId, Integer unbound, Long sceneManageId) {
+		List<Long> deptList = new ArrayList<>();
+		if (!AuthUtil.isAdministrator()) {
+			deptList = SysCache.getDeptChildIds(Long.valueOf(AuthUtil.getDeptId()));
+		}
+		return baseMapper.selectFwDefenseSceneList(filterSelected, zoneId, areaId, unbound, sceneManageId, deptList);
 	}
 
 	private List<Long> parseIdList(String ids) {
@@ -160,31 +171,9 @@
 		return idList;
 	}
 
-	private Integer sumDefenseArea(List<Long> areaIds, Map<Long, BigDecimal> areaSizeMap) {
-		if (areaIds == null || areaIds.isEmpty()) {
-			return 0;
-		}
-		BigDecimal total = BigDecimal.ZERO;
-		for (Long areaId : areaIds) {
-			BigDecimal areaSize = areaSizeMap.get(areaId);
-			if (areaSize != null) {
-				total = total.add(areaSize);
-			}
-		}
-		if (BigDecimal.ZERO.compareTo(total) == 0) {
-			return 0;
-		}
-		BigDecimal totalArea = total.multiply(AREA_SIZE_FACTOR);
-		return totalArea.setScale(0, RoundingMode.HALF_UP).intValue();
-	}
-
-
 	@Override
 	public List<FwDefenseSceneExcel> exportFwDefenseScene(Wrapper<FwDefenseSceneEntity> queryWrapper) {
 		List<FwDefenseSceneExcel> fwDefenseSceneList = baseMapper.exportFwDefenseScene(queryWrapper);
-		//fwDefenseSceneList.forEach(fwDefenseScene -> {
-		//	fwDefenseScene.setTypeName(DictCache.getValue(DictEnum.YES_NO, FwDefenseScene.getType()));
-		//});
 		return fwDefenseSceneList;
 	}
 
@@ -207,9 +196,169 @@
 		} else {
 			fillUpdateFields(fwDefenseScene);
 		}
+		String areaDivideIds = fwDefenseScene.getAreaDivideIds();
+
+		// 处理区域划分的新增和删除
+		if (fwDefenseScene.getId() != null) {
+			// 更新操作,需要比较旧的areaDivideIds
+			FwDefenseSceneEntity oldEntity = baseMapper.selectById(fwDefenseScene.getId());
+			if (oldEntity != null) {
+				String oldAreaDivideIds = oldEntity.getAreaDivideIds();
+
+				// 解析新旧区域划分ID列表
+				Set<Long> oldAreaIds = parseAreaDivideIds(oldAreaDivideIds);
+				Set<Long> newAreaIds = parseAreaDivideIds(areaDivideIds);
+
+				// 找出新增的区域划分ID
+				Set<Long> addedAreaIds = new HashSet<>();
+				for (Long id : newAreaIds) {
+					if (!oldAreaIds.contains(id)) {
+						addedAreaIds.add(id);
+					}
+				}
+
+				// 找出删除的区域划分ID
+				Set<Long> removedAreaIds = new HashSet<>();
+				for (Long id : oldAreaIds) {
+					if (!newAreaIds.contains(id)) {
+						removedAreaIds.add(id);
+					}
+				}
+
+				// 处理删除的区域划分对应的设备(禁用)
+				if (!removedAreaIds.isEmpty()) {
+					List<FwAreaDivideEntity> removedAreas = fwAreaDivideService.listByIds(new ArrayList<>(removedAreaIds));
+					List<Long> removedDeviceIds = removedAreas.stream()
+						.map(item -> Func.toLongList(item.getDeviceIds()))
+						.flatMap(List::stream)
+						.collect(Collectors.toList());
+					if (!removedDeviceIds.isEmpty()) {
+						// 禁用设备
+						disableDevices(removedDeviceIds);
+					}
+				}
+
+				// 处理新增的区域划分对应的设备(启用)
+				if (!addedAreaIds.isEmpty()) {
+					List<FwAreaDivideEntity> addedAreas = fwAreaDivideService.listByIds(new ArrayList<>(addedAreaIds));
+					List<Long> addedDeviceIds = addedAreas.stream()
+						.map(item -> Func.toLongList(item.getDeviceIds()))
+						.flatMap(List::stream)
+						.collect(Collectors.toList());
+					if (!addedDeviceIds.isEmpty()) {
+						// 启用设备
+						enableDevices(addedDeviceIds);
+					}
+				}
+			}
+		} else {
+			// 新增操作,所有区域划分都是新增的,启用对应设备
+			List<FwAreaDivideEntity> fwAreaDivideEntities = fwAreaDivideService.listByIds(Func.toLongList(areaDivideIds));
+			List<Long> addedDeviceIds = fwAreaDivideEntities.stream()
+				.map(item -> Func.toLongList(item.getDeviceIds()))
+				.flatMap(List::stream)
+				.collect(Collectors.toList());
+			if (!addedDeviceIds.isEmpty()) {
+				// 启用设备
+				enableDevices(addedDeviceIds);
+			}
+		}
+
 		return super.saveOrUpdate(fwDefenseScene);
 	}
 
+	/**
+	 * 解析区域划分ID字符串为集合
+	 * @param areaDivideIds 区域划分ID字符串,逗号分隔
+	 * @return 区域划分ID集合
+	 */
+	private Set<Long> parseAreaDivideIds(String areaDivideIds) {
+		Set<Long> areaIdSet = new HashSet<>();
+		if (StringUtil.isNotBlank(areaDivideIds)) {
+			List<Long> ids = Func.toLongList(areaDivideIds);
+			areaIdSet.addAll(ids);
+		}
+		return areaIdSet;
+	}
+
+	/**
+	 * 启用设备
+	 * @param deviceIds 设备ID列表
+	 */
+	private void enableDevices(List<Long> deviceIds) {
+		if (deviceIds != null && !deviceIds.isEmpty()) {
+			// 实现设备启用逻辑
+			// 这里假设FwDeviceEntity有enabled字段,1表示启用,0表示禁用
+			for (Long deviceId : deviceIds) {
+				FwDeviceEntity device = new FwDeviceEntity();
+				device.setId(deviceId);
+				device.setIsEnabled(true);
+				fwDeviceService.updateById(device);
+			}
+		}
+	}
+
+	/**
+	 * 禁用设备
+	 * @param deviceIds 设备ID列表
+	 */
+	private void disableDevices(List<Long> deviceIds) {
+		if (deviceIds != null && !deviceIds.isEmpty()) {
+			// 实现设备禁用逻辑
+			// 这里假设FwDeviceEntity有enabled字段,1表示启用,0表示禁用
+			for (Long deviceId : deviceIds) {
+				FwDeviceEntity device = new FwDeviceEntity();
+				device.setId(deviceId);
+				device.setIsEnabled(false);
+				fwDeviceService.updateById(device);
+			}
+		}
+	}
+
+	/**
+	 * 逻辑删除防控场景,并处理关联设备的禁用
+	 * @param ids 防控场景ID列表
+	 * @return 是否删除成功
+	 */
+	@Override
+	public boolean deleteLogic(List<Long> ids) {
+		if (ids == null || ids.isEmpty()) {
+			return false;
+		}
+
+		// 先获取要删除的防控场景
+		List<FwDefenseSceneEntity> scenes = listByIds(ids);
+		if (scenes == null || scenes.isEmpty()) {
+			return false;
+		}
+
+		// 收集所有相关的区域划分ID
+		Set<Long> areaDivideIds = new HashSet<>();
+		for (FwDefenseSceneEntity scene : scenes) {
+			if (scene != null && StringUtil.isNotBlank(scene.getAreaDivideIds())) {
+				areaDivideIds.addAll(Func.toLongList(scene.getAreaDivideIds()));
+			}
+		}
+
+		// 收集所有相关的设备ID
+		List<Long> deviceIds = new ArrayList<>();
+		if (!areaDivideIds.isEmpty()) {
+			List<FwAreaDivideEntity> areas = fwAreaDivideService.listByIds(new ArrayList<>(areaDivideIds));
+			deviceIds = areas.stream()
+				.map(item -> Func.toLongList(item.getDeviceIds()))
+				.flatMap(List::stream)
+				.collect(Collectors.toList());
+		}
+
+		// 禁用相关设备
+		if (!deviceIds.isEmpty()) {
+			disableDevices(deviceIds);
+		}
+
+		// 执行逻辑删除
+		return super.deleteLogic(ids);
+	}
+
 	private void fillCreateFields(FwDefenseSceneEntity fwDefenseScene) {
 		Long userId = AuthUtil.getUserId();
 		String deptIdStr = AuthUtil.getDeptId();

--
Gitblit v1.9.3