Просмотр исходного кода

feat:【iot】新增数据流转规则和目的名称唯一性校验功能

haohao месяцев назад: 6
Родитель
Сommit
832b36ac47

+ 4 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/rule/IotDataRuleMapper.java

@@ -35,4 +35,8 @@ public interface IotDataRuleMapper extends BaseMapperX<IotDataRuleDO> {
         return selectList(IotDataRuleDO::getStatus, status);
     }
 
+    default IotDataRuleDO selectByName(String name) {
+        return selectOne(IotDataRuleDO::getName, name);
+    }
+
 }

+ 4 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/rule/IotDataSinkMapper.java

@@ -29,4 +29,8 @@ public interface IotDataSinkMapper extends BaseMapperX<IotDataSinkDO> {
         return selectList(IotDataSinkDO::getStatus, status);
     }
 
+    default IotDataSinkDO selectByName(String name) {
+        return selectOne(IotDataSinkDO::getName, name);
+    }
+
 }

+ 2 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java

@@ -65,10 +65,12 @@ public interface ErrorCodeConstants {
 
     // ========== IoT 数据流转规则 1-050-010-000 ==========
     ErrorCode DATA_RULE_NOT_EXISTS = new ErrorCode(1_050_010_000, "数据流转规则不存在");
+    ErrorCode DATA_RULE_NAME_EXISTS = new ErrorCode(1_050_010_001, "数据流转规则名称已存在");
 
     // ========== IoT 数据流转目的 1-050-011-000 ==========
     ErrorCode DATA_SINK_NOT_EXISTS = new ErrorCode(1_050_011_000, "数据桥梁不存在");
     ErrorCode DATA_SINK_DELETE_FAIL_USED_BY_RULE = new ErrorCode(1_050_011_001, "数据流转目的正在被数据流转规则使用,无法删除");
+    ErrorCode DATA_SINK_NAME_EXISTS = new ErrorCode(1_050_011_002, "数据流转目的名称已存在");
 
     // ========== IoT 场景联动 1-050-012-000 ==========
     ErrorCode RULE_SCENE_NOT_EXISTS = new ErrorCode(1_050_012_000, "场景联动不存在");

+ 28 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/data/IotDataRuleServiceImpl.java

@@ -32,6 +32,7 @@ import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_RULE_NAME_EXISTS;
 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_RULE_NOT_EXISTS;
 
 /**
@@ -62,6 +63,8 @@ public class IotDataRuleServiceImpl implements IotDataRuleService {
     @Override
     @CacheEvict(value = RedisKeyConstants.DATA_RULE_LIST, allEntries = true)
     public Long createDataRule(IotDataRuleSaveReqVO createReqVO) {
+        // 校验名称唯一
+        validateDataRuleNameUnique(null, createReqVO.getName());
         // 校验数据源配置和数据目的
         validateDataRuleConfig(createReqVO);
         // 新增
@@ -75,6 +78,8 @@ public class IotDataRuleServiceImpl implements IotDataRuleService {
     public void updateDataRule(IotDataRuleSaveReqVO updateReqVO) {
         // 校验存在
         validateDataRuleExists(updateReqVO.getId());
+        // 校验名称唯一
+        validateDataRuleNameUnique(updateReqVO.getId(), updateReqVO.getName());
         // 校验数据源配置和数据目的
         validateDataRuleConfig(updateReqVO);
 
@@ -98,6 +103,29 @@ public class IotDataRuleServiceImpl implements IotDataRuleService {
         }
     }
 
+    /**
+     * 校验数据流转规则名称唯一性
+     *
+     * @param id   数据流转规则编号(用于更新时排除自身)
+     * @param name 数据流转规则名称
+     */
+    private void validateDataRuleNameUnique(Long id, String name) {
+        if (StrUtil.isBlank(name)) {
+            return;
+        }
+        IotDataRuleDO dataRule = dataRuleMapper.selectByName(name);
+        if (dataRule == null) {
+            return;
+        }
+        // 如果 id 为空,说明不用比较是否为相同 id 的规则
+        if (id == null) {
+            throw exception(DATA_RULE_NAME_EXISTS);
+        }
+        if (!dataRule.getId().equals(id)) {
+            throw exception(DATA_RULE_NAME_EXISTS);
+        }
+    }
+
     /**
      * 校验数据流转规则配置
      *

+ 30 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/data/IotDataSinkServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.iot.service.rule.data;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.sink.IotDataSinkPageReqVO;
@@ -19,6 +20,7 @@ import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_SINK_DELETE_FAIL_USED_BY_RULE;
+import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_SINK_NAME_EXISTS;
 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_SINK_NOT_EXISTS;
 
 /**
@@ -39,6 +41,9 @@ public class IotDataSinkServiceImpl implements IotDataSinkService {
 
     @Override
     public Long createDataSink(IotDataSinkSaveReqVO createReqVO) {
+        // 校验名称唯一
+        validateDataSinkNameUnique(null, createReqVO.getName());
+        // 新增
         IotDataSinkDO dataBridge = BeanUtils.toBean(createReqVO, IotDataSinkDO.class);
         dataSinkMapper.insert(dataBridge);
         return dataBridge.getId();
@@ -48,6 +53,8 @@ public class IotDataSinkServiceImpl implements IotDataSinkService {
     public void updateDataSink(IotDataSinkSaveReqVO updateReqVO) {
         // 校验存在
         validateDataBridgeExists(updateReqVO.getId());
+        // 校验名称唯一
+        validateDataSinkNameUnique(updateReqVO.getId(), updateReqVO.getName());
         // 更新
         IotDataSinkDO updateObj = BeanUtils.toBean(updateReqVO, IotDataSinkDO.class);
         dataSinkMapper.updateById(updateObj);
@@ -71,6 +78,29 @@ public class IotDataSinkServiceImpl implements IotDataSinkService {
         }
     }
 
+    /**
+     * 校验数据流转目的名称唯一性
+     *
+     * @param id   数据流转目的编号(用于更新时排除自身)
+     * @param name 数据流转目的名称
+     */
+    private void validateDataSinkNameUnique(Long id, String name) {
+        if (StrUtil.isBlank(name)) {
+            return;
+        }
+        IotDataSinkDO dataSink = dataSinkMapper.selectByName(name);
+        if (dataSink == null) {
+            return;
+        }
+        // 如果 id 为空,说明不用比较是否为相同 id 的目的
+        if (id == null) {
+            throw exception(DATA_SINK_NAME_EXISTS);
+        }
+        if (!dataSink.getId().equals(id)) {
+            throw exception(DATA_SINK_NAME_EXISTS);
+        }
+    }
+
     @Override
     public IotDataSinkDO getDataSink(Long id) {
         return dataSinkMapper.selectById(id);