吉安感知网项目-后端
linwei
2026-02-05 ef36e785f7d67fbb7275c5b80aa105045e5d3eb6
反无设备启用,禁用优化
4 files modified
319 ■■■■■ changed files
drone-service/drone-fw/src/main/java/org/sxkj/fw/area/mapper/FwAreaDivideMapper.java 7 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/area/mapper/FwAreaDivideMapper.xml 10 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/area/service/impl/FwAreaDivideServiceImpl.java 140 ●●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/area/service/impl/FwDefenseSceneServiceImpl.java 162 ●●●●● patch | view | raw | blame | history
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();