Commit 34453a3f70492f9dfbc8b8d70a458632321e6017
1 parent
27e08266
【代码评审】IoT:数据桥梁的维护
Showing
18 changed files
with
38 additions
and
30 deletions
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/DictTypeConstants.java
| ... | ... | @@ -15,6 +15,7 @@ public class DictTypeConstants { |
| 15 | 15 | public static final String VALIDATE_TYPE = "iot_validate_type"; |
| 16 | 16 | |
| 17 | 17 | public static final String DEVICE_STATE = "iot_device_state"; |
| 18 | + | |
| 18 | 19 | public static final String IOT_DATA_BRIDGE_DIRECTION_ENUM = "iot_data_bridge_direction_enum"; |
| 19 | 20 | public static final String IOT_DATA_BRIDGE_TYPE_ENUM = "iot_data_bridge_type_enum"; |
| 20 | 21 | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/IotDataBridgeController.java
| ... | ... | @@ -37,14 +37,14 @@ public class IotDataBridgeController { |
| 37 | 37 | private IotDataBridgeService dataBridgeService; |
| 38 | 38 | |
| 39 | 39 | @PostMapping("/create") |
| 40 | - @Operation(summary = "创建IoT 数据桥梁") | |
| 40 | + @Operation(summary = "创建数据桥梁") | |
| 41 | 41 | @PreAuthorize("@ss.hasPermission('iot:data-bridge:create')") |
| 42 | 42 | public CommonResult<Long> createDataBridge(@Valid @RequestBody IotDataBridgeSaveReqVO createReqVO) { |
| 43 | 43 | return success(dataBridgeService.createDataBridge(createReqVO)); |
| 44 | 44 | } |
| 45 | 45 | |
| 46 | 46 | @PutMapping("/update") |
| 47 | - @Operation(summary = "更新IoT 数据桥梁") | |
| 47 | + @Operation(summary = "更新数据桥梁") | |
| 48 | 48 | @PreAuthorize("@ss.hasPermission('iot:data-bridge:update')") |
| 49 | 49 | public CommonResult<Boolean> updateDataBridge(@Valid @RequestBody IotDataBridgeSaveReqVO updateReqVO) { |
| 50 | 50 | dataBridgeService.updateDataBridge(updateReqVO); |
| ... | ... | @@ -52,7 +52,7 @@ public class IotDataBridgeController { |
| 52 | 52 | } |
| 53 | 53 | |
| 54 | 54 | @DeleteMapping("/delete") |
| 55 | - @Operation(summary = "删除IoT 数据桥梁") | |
| 55 | + @Operation(summary = "删除数据桥梁") | |
| 56 | 56 | @Parameter(name = "id", description = "编号", required = true) |
| 57 | 57 | @PreAuthorize("@ss.hasPermission('iot:data-bridge:delete')") |
| 58 | 58 | public CommonResult<Boolean> deleteDataBridge(@RequestParam("id") Long id) { |
| ... | ... | @@ -61,7 +61,7 @@ public class IotDataBridgeController { |
| 61 | 61 | } |
| 62 | 62 | |
| 63 | 63 | @GetMapping("/get") |
| 64 | - @Operation(summary = "获得IoT 数据桥梁") | |
| 64 | + @Operation(summary = "获得数据桥梁") | |
| 65 | 65 | @Parameter(name = "id", description = "编号", required = true, example = "1024") |
| 66 | 66 | @PreAuthorize("@ss.hasPermission('iot:data-bridge:query')") |
| 67 | 67 | public CommonResult<IotDataBridgeRespVO> getDataBridge(@RequestParam("id") Long id) { |
| ... | ... | @@ -70,15 +70,16 @@ public class IotDataBridgeController { |
| 70 | 70 | } |
| 71 | 71 | |
| 72 | 72 | @GetMapping("/page") |
| 73 | - @Operation(summary = "获得IoT 数据桥梁分页") | |
| 73 | + @Operation(summary = "获得数据桥梁分页") | |
| 74 | 74 | @PreAuthorize("@ss.hasPermission('iot:data-bridge:query')") |
| 75 | 75 | public CommonResult<PageResult<IotDataBridgeRespVO>> getDataBridgePage(@Valid IotDataBridgePageReqVO pageReqVO) { |
| 76 | 76 | PageResult<IotDataBridgeDO> pageResult = dataBridgeService.getDataBridgePage(pageReqVO); |
| 77 | 77 | return success(BeanUtils.toBean(pageResult, IotDataBridgeRespVO.class)); |
| 78 | 78 | } |
| 79 | 79 | |
| 80 | + // TODO @puhui999:不用导出哈。相关的 IotDataBridgeRespVO 里的导出也注释掉哈 | |
| 80 | 81 | @GetMapping("/export-excel") |
| 81 | - @Operation(summary = "导出IoT 数据桥梁 Excel") | |
| 82 | + @Operation(summary = "导出数据桥梁 Excel") | |
| 82 | 83 | @PreAuthorize("@ss.hasPermission('iot:data-bridge:export')") |
| 83 | 84 | @ApiAccessLog(operateType = EXPORT) |
| 84 | 85 | public void exportDataBridgeExcel(@Valid IotDataBridgePageReqVO pageReqVO, | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/IotDataBridgePageReqVO.java
| ... | ... | @@ -20,6 +20,7 @@ public class IotDataBridgePageReqVO extends PageParam { |
| 20 | 20 | @Schema(description = "桥梁名称", example = "赵六") |
| 21 | 21 | private String name; |
| 22 | 22 | |
| 23 | + // TODO @puhui999:description、direction、type 不过滤哈 | |
| 23 | 24 | @Schema(description = "桥梁描述", example = "随便") |
| 24 | 25 | private String description; |
| 25 | 26 | |
| ... | ... | @@ -36,4 +37,5 @@ public class IotDataBridgePageReqVO extends PageParam { |
| 36 | 37 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 37 | 38 | private LocalDateTime[] createTime; |
| 38 | 39 | |
| 40 | + | |
| 39 | 41 | } |
| 40 | 42 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/IotDataBridgeRespVO.java
| ... | ... | @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| 4 | 4 | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| 5 | -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeConfig; | |
| 5 | +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeAbstractConfig; | |
| 6 | 6 | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; |
| 7 | 7 | import com.alibaba.excel.annotation.ExcelProperty; |
| 8 | 8 | import io.swagger.v3.oas.annotations.media.Schema; |
| ... | ... | @@ -48,7 +48,7 @@ public class IotDataBridgeRespVO { |
| 48 | 48 | |
| 49 | 49 | @Schema(description = "桥梁配置") |
| 50 | 50 | @ExcelProperty("桥梁配置") |
| 51 | - private IotDataBridgeConfig config; | |
| 51 | + private IotDataBridgeAbstractConfig config; | |
| 52 | 52 | |
| 53 | 53 | @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) |
| 54 | 54 | @ExcelProperty("创建时间") | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/IotDataBridgeSaveReqVO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge; |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeConfig; | |
| 3 | +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeAbstractConfig; | |
| 4 | 4 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | 5 | import jakarta.validation.constraints.NotEmpty; |
| 6 | 6 | import jakarta.validation.constraints.NotNull; |
| ... | ... | @@ -24,6 +24,7 @@ public class IotDataBridgeSaveReqVO { |
| 24 | 24 | @NotNull(message = "桥梁状态不能为空") |
| 25 | 25 | private Integer status; |
| 26 | 26 | |
| 27 | + // TODO @puhui999:枚举的校验 | |
| 27 | 28 | @Schema(description = "桥梁方向", requiredMode = Schema.RequiredMode.REQUIRED) |
| 28 | 29 | @NotNull(message = "桥梁方向不能为空") |
| 29 | 30 | private Integer direction; |
| ... | ... | @@ -34,6 +35,6 @@ public class IotDataBridgeSaveReqVO { |
| 34 | 35 | |
| 35 | 36 | @Schema(description = "桥梁配置") |
| 36 | 37 | @NotNull(message = "桥梁配置不能为空") |
| 37 | - private IotDataBridgeConfig config; | |
| 38 | + private IotDataBridgeAbstractConfig config; | |
| 38 | 39 | |
| 39 | 40 | } |
| 40 | 41 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeConfig.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeAbstractConfig.java
| ... | ... | @@ -22,7 +22,7 @@ import lombok.Data; |
| 22 | 22 | @JsonSubTypes.Type(value = IotDataBridgeRedisStreamMQConfig.class, name = "REDIS_STREAM"), |
| 23 | 23 | @JsonSubTypes.Type(value = IotDataBridgeRocketMQConfig.class, name = "ROCKETMQ"), |
| 24 | 24 | }) |
| 25 | -public abstract class IotDataBridgeConfig { | |
| 25 | +public abstract class IotDataBridgeAbstractConfig { | |
| 26 | 26 | |
| 27 | 27 | /** |
| 28 | 28 | * 配置类型 | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeHttpConfig.java
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeKafkaMQConfig.java
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeMqttConfig.java
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeRabbitMQConfig.java
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeRedisStreamMQConfig.java
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeRocketMQConfig.java
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotDataBridgeDO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.dal.dataobject.rule; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeConfig; | |
| 4 | +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeAbstractConfig; | |
| 5 | 5 | import cn.iocoder.yudao.module.iot.enums.rule.IotDataBridgeDirectionEnum; |
| 6 | 6 | import cn.iocoder.yudao.module.iot.enums.rule.IotDataBridgeTypeEnum; |
| 7 | 7 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| ... | ... | @@ -63,6 +63,6 @@ public class IotDataBridgeDO extends BaseDO { |
| 63 | 63 | * 桥梁配置 |
| 64 | 64 | */ |
| 65 | 65 | @TableField(typeHandler = JacksonTypeHandler.class) |
| 66 | - private IotDataBridgeConfig config; | |
| 66 | + private IotDataBridgeAbstractConfig config; | |
| 67 | 67 | |
| 68 | 68 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/IotDataBridgeService.java
| ... | ... | @@ -14,7 +14,7 @@ import jakarta.validation.Valid; |
| 14 | 14 | public interface IotDataBridgeService { |
| 15 | 15 | |
| 16 | 16 | /** |
| 17 | - * 创建IoT 数据桥梁 | |
| 17 | + * 创建数据桥梁 | |
| 18 | 18 | * |
| 19 | 19 | * @param createReqVO 创建信息 |
| 20 | 20 | * @return 编号 |
| ... | ... | @@ -22,32 +22,32 @@ public interface IotDataBridgeService { |
| 22 | 22 | Long createDataBridge(@Valid IotDataBridgeSaveReqVO createReqVO); |
| 23 | 23 | |
| 24 | 24 | /** |
| 25 | - * 更新IoT 数据桥梁 | |
| 25 | + * 更新数据桥梁 | |
| 26 | 26 | * |
| 27 | 27 | * @param updateReqVO 更新信息 |
| 28 | 28 | */ |
| 29 | 29 | void updateDataBridge(@Valid IotDataBridgeSaveReqVO updateReqVO); |
| 30 | 30 | |
| 31 | 31 | /** |
| 32 | - * 删除IoT 数据桥梁 | |
| 32 | + * 删除数据桥梁 | |
| 33 | 33 | * |
| 34 | 34 | * @param id 编号 |
| 35 | 35 | */ |
| 36 | 36 | void deleteDataBridge(Long id); |
| 37 | 37 | |
| 38 | 38 | /** |
| 39 | - * 获得IoT 数据桥梁 | |
| 39 | + * 获得数据桥梁 | |
| 40 | 40 | * |
| 41 | 41 | * @param id 编号 |
| 42 | - * @return IoT 数据桥梁 | |
| 42 | + * @return 数据桥梁 | |
| 43 | 43 | */ |
| 44 | 44 | IotDataBridgeDO getDataBridge(Long id); |
| 45 | 45 | |
| 46 | 46 | /** |
| 47 | - * 获得IoT 数据桥梁分页 | |
| 47 | + * 获得数据桥梁分页 | |
| 48 | 48 | * |
| 49 | 49 | * @param pageReqVO 分页查询 |
| 50 | - * @return IoT 数据桥梁分页 | |
| 50 | + * @return 数据桥梁分页 | |
| 51 | 51 | */ |
| 52 | 52 | PageResult<IotDataBridgeDO> getDataBridgePage(IotDataBridgePageReqVO pageReqVO); |
| 53 | 53 | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/databridge/AbstractCacheableDataBridgeExecute.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.service.rule.action.databridge; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.util.ObjUtil; | |
| 3 | 4 | import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataBridgeDO; |
| 4 | 5 | import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage; |
| 5 | 6 | import com.google.common.cache.CacheBuilder; |
| ... | ... | @@ -56,6 +57,7 @@ public abstract class AbstractCacheableDataBridgeExecute<Config, Producer> imple |
| 56 | 57 | } |
| 57 | 58 | }) |
| 58 | 59 | .build(new CacheLoader<Config, Producer>() { |
| 60 | + | |
| 59 | 61 | @Override |
| 60 | 62 | public Producer load(Config config) throws Exception { |
| 61 | 63 | try { |
| ... | ... | @@ -67,6 +69,7 @@ public abstract class AbstractCacheableDataBridgeExecute<Config, Producer> imple |
| 67 | 69 | throw e; // 抛出异常,触发缓存加载失败机制 |
| 68 | 70 | } |
| 69 | 71 | } |
| 72 | + | |
| 70 | 73 | }); |
| 71 | 74 | |
| 72 | 75 | /** |
| ... | ... | @@ -98,12 +101,9 @@ public abstract class AbstractCacheableDataBridgeExecute<Config, Producer> imple |
| 98 | 101 | @Override |
| 99 | 102 | @SuppressWarnings({"unchecked"}) |
| 100 | 103 | public void execute(IotDeviceMessage message, IotDataBridgeDO dataBridge) { |
| 101 | - // 1.1 校验数据桥梁类型 | |
| 102 | - if (!getType().equals(dataBridge.getType())) { | |
| 104 | + if (ObjUtil.notEqual(message.getType(), getType())) { | |
| 103 | 105 | return; |
| 104 | 106 | } |
| 105 | - | |
| 106 | - // 1.2 执行对应的数据桥梁发送消息 | |
| 107 | 107 | try { |
| 108 | 108 | execute0(message, (Config) dataBridge.getConfig()); |
| 109 | 109 | } catch (Exception e) { | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/databridge/IotDataBridgeExecute.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.service.rule.action.databridge; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeAbstractConfig; | |
| 3 | 4 | import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataBridgeDO; |
| 4 | 5 | import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage; |
| 5 | 6 | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/databridge/IotRocketMQDataBridgeExecute.java
| ... | ... | @@ -66,6 +66,7 @@ public class IotRocketMQDataBridgeExecute extends |
| 66 | 66 | } |
| 67 | 67 | |
| 68 | 68 | // TODO @芋艿:测试代码,后续清理 |
| 69 | + // TODO @puhui999:搞到测试类里。 | |
| 69 | 70 | public static void main(String[] args) { |
| 70 | 71 | // 1. 创建一个共享的实例 |
| 71 | 72 | IotRocketMQDataBridgeExecute action = new IotRocketMQDataBridgeExecute(); | ... | ... |
yudao-server/pom.xml
| ... | ... | @@ -115,6 +115,7 @@ |
| 115 | 115 | <version>${revision}</version> |
| 116 | 116 | </dependency> |
| 117 | 117 | <!-- IoT 数据桥梁的执行器所需消息队列。如果您只需要使用 rocketmq 那么则注释掉其它消息队列即可 --> |
| 118 | + <!-- TODO @puhui999:默认不使用哈。可以在 iot biz 那,作为 optional 进行引入 --> | |
| 118 | 119 | <dependency> |
| 119 | 120 | <groupId>org.apache.rocketmq</groupId> |
| 120 | 121 | <artifactId>rocketmq-spring-boot-starter</artifactId> | ... | ... |