Commit 832b36ac47182aa75fde0d14592fb6961e05346d
1 parent
5086e122
feat:【iot】新增数据流转规则和目的名称唯一性校验功能
Showing
5 changed files
with
68 additions
and
0 deletions
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> { | @@ -35,4 +35,8 @@ public interface IotDataRuleMapper extends BaseMapperX<IotDataRuleDO> { | ||
| 35 | return selectList(IotDataRuleDO::getStatus, status); | 35 | return selectList(IotDataRuleDO::getStatus, status); |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | + default IotDataRuleDO selectByName(String name) { | ||
| 39 | + return selectOne(IotDataRuleDO::getName, name); | ||
| 40 | + } | ||
| 41 | + | ||
| 38 | } | 42 | } |
| 39 | \ No newline at end of file | 43 | \ No newline at end of file |
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> { | @@ -29,4 +29,8 @@ public interface IotDataSinkMapper extends BaseMapperX<IotDataSinkDO> { | ||
| 29 | return selectList(IotDataSinkDO::getStatus, status); | 29 | return selectList(IotDataSinkDO::getStatus, status); |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | + default IotDataSinkDO selectByName(String name) { | ||
| 33 | + return selectOne(IotDataSinkDO::getName, name); | ||
| 34 | + } | ||
| 35 | + | ||
| 32 | } | 36 | } |
| 33 | \ No newline at end of file | 37 | \ No newline at end of file |
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 { | @@ -65,10 +65,12 @@ public interface ErrorCodeConstants { | ||
| 65 | 65 | ||
| 66 | // ========== IoT 数据流转规则 1-050-010-000 ========== | 66 | // ========== IoT 数据流转规则 1-050-010-000 ========== |
| 67 | ErrorCode DATA_RULE_NOT_EXISTS = new ErrorCode(1_050_010_000, "数据流转规则不存在"); | 67 | ErrorCode DATA_RULE_NOT_EXISTS = new ErrorCode(1_050_010_000, "数据流转规则不存在"); |
| 68 | + ErrorCode DATA_RULE_NAME_EXISTS = new ErrorCode(1_050_010_001, "数据流转规则名称已存在"); | ||
| 68 | 69 | ||
| 69 | // ========== IoT 数据流转目的 1-050-011-000 ========== | 70 | // ========== IoT 数据流转目的 1-050-011-000 ========== |
| 70 | ErrorCode DATA_SINK_NOT_EXISTS = new ErrorCode(1_050_011_000, "数据桥梁不存在"); | 71 | ErrorCode DATA_SINK_NOT_EXISTS = new ErrorCode(1_050_011_000, "数据桥梁不存在"); |
| 71 | ErrorCode DATA_SINK_DELETE_FAIL_USED_BY_RULE = new ErrorCode(1_050_011_001, "数据流转目的正在被数据流转规则使用,无法删除"); | 72 | ErrorCode DATA_SINK_DELETE_FAIL_USED_BY_RULE = new ErrorCode(1_050_011_001, "数据流转目的正在被数据流转规则使用,无法删除"); |
| 73 | + ErrorCode DATA_SINK_NAME_EXISTS = new ErrorCode(1_050_011_002, "数据流转目的名称已存在"); | ||
| 72 | 74 | ||
| 73 | // ========== IoT 场景联动 1-050-012-000 ========== | 75 | // ========== IoT 场景联动 1-050-012-000 ========== |
| 74 | ErrorCode RULE_SCENE_NOT_EXISTS = new ErrorCode(1_050_012_000, "场景联动不存在"); | 76 | ErrorCode RULE_SCENE_NOT_EXISTS = new ErrorCode(1_050_012_000, "场景联动不存在"); |
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.*; | @@ -32,6 +32,7 @@ import java.util.*; | ||
| 32 | 32 | ||
| 33 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 33 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 34 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | 34 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| 35 | +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_RULE_NAME_EXISTS; | ||
| 35 | import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_RULE_NOT_EXISTS; | 36 | import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_RULE_NOT_EXISTS; |
| 36 | 37 | ||
| 37 | /** | 38 | /** |
| @@ -62,6 +63,8 @@ public class IotDataRuleServiceImpl implements IotDataRuleService { | @@ -62,6 +63,8 @@ public class IotDataRuleServiceImpl implements IotDataRuleService { | ||
| 62 | @Override | 63 | @Override |
| 63 | @CacheEvict(value = RedisKeyConstants.DATA_RULE_LIST, allEntries = true) | 64 | @CacheEvict(value = RedisKeyConstants.DATA_RULE_LIST, allEntries = true) |
| 64 | public Long createDataRule(IotDataRuleSaveReqVO createReqVO) { | 65 | public Long createDataRule(IotDataRuleSaveReqVO createReqVO) { |
| 66 | + // 校验名称唯一 | ||
| 67 | + validateDataRuleNameUnique(null, createReqVO.getName()); | ||
| 65 | // 校验数据源配置和数据目的 | 68 | // 校验数据源配置和数据目的 |
| 66 | validateDataRuleConfig(createReqVO); | 69 | validateDataRuleConfig(createReqVO); |
| 67 | // 新增 | 70 | // 新增 |
| @@ -75,6 +78,8 @@ public class IotDataRuleServiceImpl implements IotDataRuleService { | @@ -75,6 +78,8 @@ public class IotDataRuleServiceImpl implements IotDataRuleService { | ||
| 75 | public void updateDataRule(IotDataRuleSaveReqVO updateReqVO) { | 78 | public void updateDataRule(IotDataRuleSaveReqVO updateReqVO) { |
| 76 | // 校验存在 | 79 | // 校验存在 |
| 77 | validateDataRuleExists(updateReqVO.getId()); | 80 | validateDataRuleExists(updateReqVO.getId()); |
| 81 | + // 校验名称唯一 | ||
| 82 | + validateDataRuleNameUnique(updateReqVO.getId(), updateReqVO.getName()); | ||
| 78 | // 校验数据源配置和数据目的 | 83 | // 校验数据源配置和数据目的 |
| 79 | validateDataRuleConfig(updateReqVO); | 84 | validateDataRuleConfig(updateReqVO); |
| 80 | 85 | ||
| @@ -99,6 +104,29 @@ public class IotDataRuleServiceImpl implements IotDataRuleService { | @@ -99,6 +104,29 @@ public class IotDataRuleServiceImpl implements IotDataRuleService { | ||
| 99 | } | 104 | } |
| 100 | 105 | ||
| 101 | /** | 106 | /** |
| 107 | + * 校验数据流转规则名称唯一性 | ||
| 108 | + * | ||
| 109 | + * @param id 数据流转规则编号(用于更新时排除自身) | ||
| 110 | + * @param name 数据流转规则名称 | ||
| 111 | + */ | ||
| 112 | + private void validateDataRuleNameUnique(Long id, String name) { | ||
| 113 | + if (StrUtil.isBlank(name)) { | ||
| 114 | + return; | ||
| 115 | + } | ||
| 116 | + IotDataRuleDO dataRule = dataRuleMapper.selectByName(name); | ||
| 117 | + if (dataRule == null) { | ||
| 118 | + return; | ||
| 119 | + } | ||
| 120 | + // 如果 id 为空,说明不用比较是否为相同 id 的规则 | ||
| 121 | + if (id == null) { | ||
| 122 | + throw exception(DATA_RULE_NAME_EXISTS); | ||
| 123 | + } | ||
| 124 | + if (!dataRule.getId().equals(id)) { | ||
| 125 | + throw exception(DATA_RULE_NAME_EXISTS); | ||
| 126 | + } | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + /** | ||
| 102 | * 校验数据流转规则配置 | 130 | * 校验数据流转规则配置 |
| 103 | * | 131 | * |
| 104 | * @param reqVO 数据流转规则保存请求VO | 132 | * @param reqVO 数据流转规则保存请求VO |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/data/IotDataSinkServiceImpl.java
| 1 | package cn.iocoder.yudao.module.iot.service.rule.data; | 1 | package cn.iocoder.yudao.module.iot.service.rule.data; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | +import cn.hutool.core.util.StrUtil; | ||
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 6 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 6 | import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.sink.IotDataSinkPageReqVO; | 7 | import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.sink.IotDataSinkPageReqVO; |
| @@ -19,6 +20,7 @@ import java.util.List; | @@ -19,6 +20,7 @@ import java.util.List; | ||
| 19 | 20 | ||
| 20 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 21 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 21 | import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_SINK_DELETE_FAIL_USED_BY_RULE; | 22 | import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_SINK_DELETE_FAIL_USED_BY_RULE; |
| 23 | +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_SINK_NAME_EXISTS; | ||
| 22 | import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_SINK_NOT_EXISTS; | 24 | import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_SINK_NOT_EXISTS; |
| 23 | 25 | ||
| 24 | /** | 26 | /** |
| @@ -39,6 +41,9 @@ public class IotDataSinkServiceImpl implements IotDataSinkService { | @@ -39,6 +41,9 @@ public class IotDataSinkServiceImpl implements IotDataSinkService { | ||
| 39 | 41 | ||
| 40 | @Override | 42 | @Override |
| 41 | public Long createDataSink(IotDataSinkSaveReqVO createReqVO) { | 43 | public Long createDataSink(IotDataSinkSaveReqVO createReqVO) { |
| 44 | + // 校验名称唯一 | ||
| 45 | + validateDataSinkNameUnique(null, createReqVO.getName()); | ||
| 46 | + // 新增 | ||
| 42 | IotDataSinkDO dataBridge = BeanUtils.toBean(createReqVO, IotDataSinkDO.class); | 47 | IotDataSinkDO dataBridge = BeanUtils.toBean(createReqVO, IotDataSinkDO.class); |
| 43 | dataSinkMapper.insert(dataBridge); | 48 | dataSinkMapper.insert(dataBridge); |
| 44 | return dataBridge.getId(); | 49 | return dataBridge.getId(); |
| @@ -48,6 +53,8 @@ public class IotDataSinkServiceImpl implements IotDataSinkService { | @@ -48,6 +53,8 @@ public class IotDataSinkServiceImpl implements IotDataSinkService { | ||
| 48 | public void updateDataSink(IotDataSinkSaveReqVO updateReqVO) { | 53 | public void updateDataSink(IotDataSinkSaveReqVO updateReqVO) { |
| 49 | // 校验存在 | 54 | // 校验存在 |
| 50 | validateDataBridgeExists(updateReqVO.getId()); | 55 | validateDataBridgeExists(updateReqVO.getId()); |
| 56 | + // 校验名称唯一 | ||
| 57 | + validateDataSinkNameUnique(updateReqVO.getId(), updateReqVO.getName()); | ||
| 51 | // 更新 | 58 | // 更新 |
| 52 | IotDataSinkDO updateObj = BeanUtils.toBean(updateReqVO, IotDataSinkDO.class); | 59 | IotDataSinkDO updateObj = BeanUtils.toBean(updateReqVO, IotDataSinkDO.class); |
| 53 | dataSinkMapper.updateById(updateObj); | 60 | dataSinkMapper.updateById(updateObj); |
| @@ -71,6 +78,29 @@ public class IotDataSinkServiceImpl implements IotDataSinkService { | @@ -71,6 +78,29 @@ public class IotDataSinkServiceImpl implements IotDataSinkService { | ||
| 71 | } | 78 | } |
| 72 | } | 79 | } |
| 73 | 80 | ||
| 81 | + /** | ||
| 82 | + * 校验数据流转目的名称唯一性 | ||
| 83 | + * | ||
| 84 | + * @param id 数据流转目的编号(用于更新时排除自身) | ||
| 85 | + * @param name 数据流转目的名称 | ||
| 86 | + */ | ||
| 87 | + private void validateDataSinkNameUnique(Long id, String name) { | ||
| 88 | + if (StrUtil.isBlank(name)) { | ||
| 89 | + return; | ||
| 90 | + } | ||
| 91 | + IotDataSinkDO dataSink = dataSinkMapper.selectByName(name); | ||
| 92 | + if (dataSink == null) { | ||
| 93 | + return; | ||
| 94 | + } | ||
| 95 | + // 如果 id 为空,说明不用比较是否为相同 id 的目的 | ||
| 96 | + if (id == null) { | ||
| 97 | + throw exception(DATA_SINK_NAME_EXISTS); | ||
| 98 | + } | ||
| 99 | + if (!dataSink.getId().equals(id)) { | ||
| 100 | + throw exception(DATA_SINK_NAME_EXISTS); | ||
| 101 | + } | ||
| 102 | + } | ||
| 103 | + | ||
| 74 | @Override | 104 | @Override |
| 75 | public IotDataSinkDO getDataSink(Long id) { | 105 | public IotDataSinkDO getDataSink(Long id) { |
| 76 | return dataSinkMapper.selectById(id); | 106 | return dataSinkMapper.selectById(id); |