drone-service/drone-fw/src/main/java/org/sxkj/fw/area/mapper/FwAreaDivideMapper.java
@@ -134,4 +134,11 @@ * @return */ List<FwAreaDivideVO> selectFwAreaDivideListCockpit(FwAreaDivideListParam param); /** * * @param areaId * @return */ boolean checkAreaBindScene(Long areaId); } drone-service/drone-fw/src/main/java/org/sxkj/fw/area/mapper/FwAreaDivideMapper.xml
@@ -493,6 +493,16 @@ ) dd on find_in_set(dd.id, ad.device_ids) </select> <select id="checkAreaBindScene" resultType="java.lang.Boolean"> select count(1) from ja_fw_defense_scene_manage dsm left join ja_fw_defense_scene ds on ds.id = dsm.defense_scene_id and ds.is_deleted = 0 where ds.is_deleted = 0 and find_in_set(#{areaId}, ds.area_divide_ids) and dsm.is_deleted = 0 </select> <insert id="insertWithGeom" parameterType="org.sxkj.fw.area.entity.FwAreaDivideEntity" useGeneratedKeys="true" keyProperty="id"> insert into ja_fw_area_divide ( id, drone-service/drone-fw/src/main/java/org/sxkj/fw/area/service/impl/FwAreaDivideServiceImpl.java
@@ -19,9 +19,11 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.SpringUtil; import org.springblade.core.tool.utils.StringUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -38,9 +40,12 @@ import org.sxkj.fw.area.vo.FwAreaDivideStatisticsVO; import org.sxkj.fw.area.vo.FwAreaDivideVO; import org.sxkj.fw.area.vo.FwDefenseSceneVO; import org.sxkj.fw.device.entity.FwDeviceEntity; import org.sxkj.fw.device.service.IFwDeviceService; import org.sxkj.system.cache.SysCache; import java.util.*; import java.util.stream.Collectors; /** * 区域划分表 服务实现类 @@ -50,8 +55,7 @@ */ @Service @AllArgsConstructor public class FwAreaDivideServiceImpl extends BaseServiceImpl<FwAreaDivideMapper, FwAreaDivideEntity> implements IFwAreaDivideService { public class FwAreaDivideServiceImpl extends BaseServiceImpl<FwAreaDivideMapper, FwAreaDivideEntity> implements IFwAreaDivideService { private final IFwAreaDivideExtService fwAreaDivideExtService; @@ -307,7 +311,12 @@ fwAreaDivide.setAreaTypeKeys(areaTypeKeys); } } String deviceIds = fwAreaDivide.getDeviceIds(); // 判断deviceIds是否和数据库里面一致,不一致需要处理 boolean isCreate = fwAreaDivide.getId() == null; // 处理设备启用禁用 handleDeviceEnablementAndDisabling(fwAreaDivide, isCreate, deviceIds); boolean mainResult = saveOrUpdate(fwAreaDivide); if (!mainResult) { return false; @@ -340,6 +349,58 @@ throw new RuntimeException("保存区域扩展面数据失败"); } return true; } /** * * @param fwAreaDivide * @param isCreate * @param deviceIds */ private void handleDeviceEnablementAndDisabling(FwAreaDivideEntity fwAreaDivide, boolean isCreate, String deviceIds) { // 查找新增和删除的设备ID Set<String> addedDeviceIds = new HashSet<>(); Set<String> removedDeviceIds = new HashSet<>(); if (!isCreate) { // 更新操作,需要比较数据库中的deviceIds FwAreaDivideEntity existingEntity = baseMapper.selectById(fwAreaDivide.getId()); if (existingEntity != null) { String oldDeviceIds = existingEntity.getDeviceIds(); // 解析新旧deviceIds为集合 Set<String> oldDeviceIdSet = parseDeviceIds(oldDeviceIds); Set<String> newDeviceIdSet = parseDeviceIds(deviceIds); // 找出新增的设备ID for (String id : newDeviceIdSet) { if (!oldDeviceIdSet.contains(id)) { addedDeviceIds.add(id); } } // 找出删除的设备ID for (String id : oldDeviceIdSet) { if (!newDeviceIdSet.contains(id)) { removedDeviceIds.add(id); } } } // 判断区域是否绑定到场景中 boolean isBindScene = baseMapper.checkAreaBindScene(fwAreaDivide.getId()); if (isBindScene) { IFwDeviceService fwDeviceService = SpringUtil.getBean(IFwDeviceService.class); if (!addedDeviceIds.isEmpty()) { fwDeviceService.update(Wrappers.<FwDeviceEntity>lambdaUpdate() .set(FwDeviceEntity::getIsEnabled, 1) .in(FwDeviceEntity::getId, addedDeviceIds)); } if (!removedDeviceIds.isEmpty()) { fwDeviceService.update(Wrappers.<FwDeviceEntity>lambdaUpdate() .set(FwDeviceEntity::getIsEnabled, 0) .in(FwDeviceEntity::getId, removedDeviceIds)); } } } } private void fillCreateFields(FwAreaDivideEntity fwAreaDivide) { @@ -376,6 +437,25 @@ fwAreaDivide.setUpdateUser(userId); } fwAreaDivide.setUpdateTime(new Date()); } /** * 解析设备ID字符串为集合 * * @param deviceIds 设备ID字符串,逗号分隔 * @return 设备ID集合 */ private Set<String> parseDeviceIds(String deviceIds) { Set<String> deviceIdSet = new HashSet<>(); if (StringUtil.isNotBlank(deviceIds)) { String[] ids = deviceIds.split(","); for (String id : ids) { if (StringUtil.isNotBlank(id)) { deviceIdSet.add(id.trim()); } } } return deviceIdSet; } private void fillCreateFieldsExt(FwAreaDivideExtEntity fwAreaDivideExt) { @@ -482,4 +562,60 @@ return idList; } /** * 禁用设备 * @param deviceIds 设备ID列表 */ private void disableDevices(List<Long> deviceIds) { IFwDeviceService fwDeviceService = SpringUtil.getBean(IFwDeviceService.class); 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<FwAreaDivideEntity> areas = listByIds(ids); if (areas == null || areas.isEmpty()) { return false; } // 过滤出配置了场景的区域数据 List<FwAreaDivideEntity> sceneBoundAreas = areas.stream() .filter(area -> area != null && baseMapper.checkAreaBindScene(area.getId())) .collect(Collectors.toList()); // 收集所有相关的设备ID List<Long> deviceIds = new ArrayList<>(); for (FwAreaDivideEntity area : sceneBoundAreas) { if (area != null && StringUtil.isNotBlank(area.getDeviceIds())) { deviceIds.addAll(parseIdList(area.getDeviceIds())); } } // 禁用相关设备 if (!deviceIds.isEmpty()) { disableDevices(deviceIds); } // 执行逻辑删除 return super.deleteLogic(ids); } } 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; @@ -45,6 +46,7 @@ import java.util.Map; import java.util.Set; import java.util.Date; import java.util.stream.Collectors; /** * 防控场景表 服务实现类 @@ -194,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();