Commit cbfbc55cd8612296978b56a122972a35e0e4c5da

Authored by 安浩浩
1 parent 8ca9bebf

【功能完善】IoT: 添加插件和插件实例管理功能,包括插件信息的增删改查接口,支持文件上传和状态更新,同时优化了枚举类型的处理逻辑。

Showing 23 changed files with 99 additions and 284 deletions
plugins/yudao-module-iot-http-plugin-2.2.0-snapshot.jar
No preview for this file type
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginDeployTypeEnum.java
... ... @@ -34,12 +34,10 @@ public enum IotPluginDeployTypeEnum implements IntArrayValuable {
34 34 }
35 35  
36 36 public static IotPluginDeployTypeEnum fromDeployType(Integer deployType) {
37   - for (IotPluginDeployTypeEnum value : values()) {
38   - if (value.getDeployType().equals(deployType)) {
39   - return value;
40   - }
41   - }
42   - return null;
  37 + return Arrays.stream(values())
  38 + .filter(value -> value.getDeployType().equals(deployType))
  39 + .findFirst()
  40 + .orElse(null);
43 41 }
44 42  
45 43 public static boolean isValidDeployType(Integer deployType) {
... ...
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginStatusEnum.java
... ... @@ -34,12 +34,10 @@ public enum IotPluginStatusEnum implements IntArrayValuable {
34 34 }
35 35  
36 36 public static IotPluginStatusEnum fromState(Integer state) {
37   - for (IotPluginStatusEnum value : values()) {
38   - if (value.getStatus().equals(state)) {
39   - return value;
40   - }
41   - }
42   - return null;
  37 + return Arrays.stream(values())
  38 + .filter(value -> value.getStatus().equals(state))
  39 + .findFirst()
  40 + .orElse(null);
43 41 }
44 42  
45 43 @Override
... ...
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginTypeEnum.java
... ... @@ -35,14 +35,11 @@ public enum IotPluginTypeEnum implements IntArrayValuable {
35 35 return ARRAYS;
36 36 }
37 37  
38   - // TODO @haohao:可以使用 hutool 简化
39 38 public static IotPluginTypeEnum fromType(Integer type) {
40   - for (IotPluginTypeEnum value : values()) {
41   - if (value.getType().equals(type)) {
42   - return value;
43   - }
44   - }
45   - return null;
  39 + return Arrays.stream(values())
  40 + .filter(value -> value.getType().equals(type))
  41 + .findFirst()
  42 + .orElse(null);
46 43 }
47 44  
48 45 public static boolean isValidType(Integer type) {
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/PluginInfoController.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/PluginInfoController.java
1   -package cn.iocoder.yudao.module.iot.controller.admin.plugininfo;
  1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6   -import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoImportReqVO;
7   -import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoPageReqVO;
8   -import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoRespVO;
9   -import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoSaveReqVO;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoImportReqVO;
  7 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;
  8 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoRespVO;
  9 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;
10 10 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
11   -import cn.iocoder.yudao.module.iot.service.plugininfo.PluginInfoService;
  11 +import cn.iocoder.yudao.module.iot.service.plugin.PluginInfoService;
12 12 import io.swagger.v3.oas.annotations.Operation;
13 13 import io.swagger.v3.oas.annotations.Parameter;
14 14 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -72,6 +72,7 @@ public class PluginInfoController {
72 72  
73 73 @PostMapping("/upload-file")
74 74 @Operation(summary = "上传插件文件")
  75 + @PreAuthorize("@ss.hasPermission('iot:plugin-info:update')")
75 76 public CommonResult<Boolean> uploadFile(@Valid PluginInfoImportReqVO reqVO) {
76 77 pluginInfoService.uploadFile(reqVO.getId(), reqVO.getFile());
77 78 return success(true);
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininstance/PluginInstanceController.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/PluginInstanceController.java
1   -package cn.iocoder.yudao.module.iot.controller.admin.plugininstance;
2   -
3   -import org.springframework.web.bind.annotation.*;
4   -import jakarta.annotation.Resource;
5   -import org.springframework.validation.annotation.Validated;
6   -import org.springframework.security.access.prepost.PreAuthorize;
7   -import io.swagger.v3.oas.annotations.tags.Tag;
8   -import io.swagger.v3.oas.annotations.Parameter;
9   -import io.swagger.v3.oas.annotations.Operation;
10   -
11   -import jakarta.validation.*;
12   -import jakarta.servlet.http.*;
13   -import java.util.*;
14   -import java.io.IOException;
  1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin;
15 2  
  3 +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
16 5 import cn.iocoder.yudao.framework.common.pojo.PageParam;
17 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
18   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
19 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
20   -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
21   -
22 8 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  9 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
  10 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceRespVO;
  11 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceSaveReqVO;
  12 +import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
  13 +import cn.iocoder.yudao.module.iot.service.plugin.PluginInstanceService;
  14 +import io.swagger.v3.oas.annotations.Operation;
  15 +import io.swagger.v3.oas.annotations.Parameter;
  16 +import io.swagger.v3.oas.annotations.tags.Tag;
  17 +import jakarta.annotation.Resource;
  18 +import jakarta.servlet.http.HttpServletResponse;
  19 +import jakarta.validation.Valid;
  20 +import org.springframework.security.access.prepost.PreAuthorize;
  21 +import org.springframework.validation.annotation.Validated;
  22 +import org.springframework.web.bind.annotation.*;
23 23  
24   -import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
25   -import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
  24 +import java.io.IOException;
  25 +import java.util.List;
26 26  
27   -import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.*;
28   -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
29   -import cn.iocoder.yudao.module.iot.service.plugininstance.PluginInstanceService;
  27 +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
  28 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
30 29  
31 30 @Tag(name = "管理后台 - IoT 插件实例")
32 31 @RestController
... ... @@ -78,17 +77,4 @@ public class PluginInstanceController {
78 77 return success(BeanUtils.toBean(pageResult, PluginInstanceRespVO.class));
79 78 }
80 79  
81   - @GetMapping("/export-excel")
82   - @Operation(summary = "导出IoT 插件实例 Excel")
83   - @PreAuthorize("@ss.hasPermission('iot:plugin-instance:export')")
84   - @ApiAccessLog(operateType = EXPORT)
85   - public void exportPluginInstanceExcel(@Valid PluginInstancePageReqVO pageReqVO,
86   - HttpServletResponse response) throws IOException {
87   - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
88   - List<PluginInstanceDO> list = pluginInstanceService.getPluginInstancePage(pageReqVO).getList();
89   - // 导出 Excel
90   - ExcelUtils.write(response, "IoT 插件实例.xls", "数据", PluginInstanceRespVO.class,
91   - BeanUtils.toBean(list, PluginInstanceRespVO.class));
92   - }
93   -
94 80 }
95 81 \ No newline at end of file
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/vo/PluginInfoImportReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoImportReqVO.java
1   -package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
  1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import jakarta.validation.constraints.NotNull;
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +
  7 +@Schema(description = "管理后台 - IoT 插件信息分页 Request VO")
  8 +@Data
  9 +public class PluginInfoPageReqVO extends PageParam {
  10 +
  11 + @Schema(description = "插件名称", example = "http")
  12 + private String name;
  13 +
  14 + @Schema(description = "状态")
  15 + private Integer status;
  16 +
  17 +}
0 18 \ No newline at end of file
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/vo/PluginInfoRespVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoRespVO.java
1   -package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
  1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
2 2  
3 3 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4 4 import com.alibaba.excel.annotation.ExcelProperty;
... ... @@ -34,7 +34,7 @@ public class PluginInfoRespVO {
34 34  
35 35 @Schema(description = "插件包文件名", requiredMode = Schema.RequiredMode.REQUIRED)
36 36 @ExcelProperty("插件包文件名")
37   - private String file;
  37 + private String fileName;
38 38  
39 39 @Schema(description = "插件版本", requiredMode = Schema.RequiredMode.REQUIRED)
40 40 @ExcelProperty("插件版本")
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/vo/PluginInfoSaveReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoSaveReqVO.java
1   -package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
  1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.*;
... ... @@ -23,7 +23,7 @@ public class PluginInfoSaveReqVO {
23 23 private Integer deployType;
24 24  
25 25 @Schema(description = "插件包文件名", requiredMode = Schema.RequiredMode.REQUIRED)
26   - private String file;
  26 + private String fileName;
27 27  
28 28 @Schema(description = "插件版本", requiredMode = Schema.RequiredMode.REQUIRED)
29 29 private String version;
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininstance/vo/PluginInstancePageReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstancePageReqVO.java
1   -package cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo;
  1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
2 2  
3 3 import lombok.*;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininstance/vo/PluginInstanceRespVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstanceRespVO.java
1   -package cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo;
  1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.*;
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininstance/vo/PluginInstanceSaveReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstanceSaveReqVO.java
1   -package cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo;
  1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.*;
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/PluginController.java deleted
1   -package cn.iocoder.yudao.module.iot.controller.admin.plugininfo;
2   -
3   -import jakarta.annotation.Resource;
4   -import org.pf4j.spring.SpringPluginManager;
5   -import org.springframework.beans.factory.annotation.Value;
6   -import org.springframework.http.HttpStatus;
7   -import org.springframework.http.ResponseEntity;
8   -import org.springframework.web.bind.annotation.*;
9   -import org.springframework.web.multipart.MultipartFile;
10   -
11   -import javax.annotation.security.PermitAll;
12   -import java.io.IOException;
13   -import java.nio.file.Files;
14   -import java.nio.file.Path;
15   -import java.nio.file.Paths;
16   -import java.nio.file.StandardCopyOption;
17   -import java.util.List;
18   -import java.util.stream.Collectors;
19   -
20   -/**
21   - * 插件 Controller 测试用例
22   - */
23   -@RestController
24   -@RequestMapping("/iot/plugins")
25   -public class PluginController {
26   -
27   - @Resource
28   - private SpringPluginManager springPluginManager;
29   -
30   - @Value("${pf4j.pluginsDir}")
31   - private String pluginsDir;
32   -
33   - /**
34   - * 上传插件 JAR 文件并加载插件
35   - *
36   - * @param file 上传的 JAR 文件
37   - * @return 上传结果
38   - */
39   - @PermitAll
40   - @PostMapping("/upload")
41   - public ResponseEntity<String> uploadPlugin(@RequestParam("file") MultipartFile file) {
42   - if (file.isEmpty()) {
43   - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("上传的文件为空");
44   - }
45   -
46   - // 确保插件目录存在
47   - Path pluginsPath = Paths.get(pluginsDir);
48   - try {
49   - if (!Files.exists(pluginsPath)) {
50   - Files.createDirectories(pluginsPath);
51   - }
52   -
53   - // 保存上传的 JAR 文件到插件目录
54   - String filename = file.getOriginalFilename();
55   - if (filename == null || (!filename.endsWith(".jar") && !filename.endsWith(".zip"))) {
56   - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("上传的文件不是 JAR 或 ZIP 文件");
57   - }
58   -
59   - Path jarPath = pluginsPath.resolve(filename);
60   -
61   - Files.copy(file.getInputStream(), jarPath, StandardCopyOption.REPLACE_EXISTING);
62   -
63   - // 加载插件
64   - String pluginId = springPluginManager.loadPlugin(jarPath.toAbsolutePath());
65   -
66   - // 启动插件
67   - springPluginManager.startPlugin(pluginId);
68   -
69   - return ResponseEntity.ok("插件上传并加载成功");
70   - } catch (IOException e) {
71   - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("上传插件时发生错误: " + e.getMessage());
72   - } catch (Exception e) {
73   - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("加载插件时发生错误: " + e.getMessage());
74   - }
75   - }
76   -
77   - /**
78   - * 卸载指定插件
79   - *
80   - * @param pluginId 插件 ID
81   - * @return 卸载结果
82   - */
83   - @PermitAll
84   - @DeleteMapping("/unload/{pluginId}")
85   - public ResponseEntity<String> unloadPlugin(@PathVariable String pluginId) {
86   - if (springPluginManager.getPlugins().stream().noneMatch(plugin -> plugin.getDescriptor().getPluginId().equals(pluginId))) {
87   - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("插件未加载: " + pluginId);
88   - }
89   -
90   - springPluginManager.stopPlugin(pluginId);
91   - springPluginManager.unloadPlugin(pluginId);
92   -
93   - // 删除插件 JAR 文件(可选)
94   -// PluginWrapper plugin = pluginManager.getPlugin(pluginId);
95   -// PluginDescriptor descriptor = plugin.getDescriptor();
96   -// Path jarPath = Paths.get(pluginsDir).resolve(descriptor.getPluginId() + ".jar");
97   -// Files.deleteIfExists(jarPath);
98   -
99   - return ResponseEntity.ok("插件卸载成功: " + pluginId);
100   - }
101   -
102   - /**
103   - * 列出所有已加载的插件
104   - *
105   - * @return 插件列表
106   - */
107   - @PermitAll
108   - @GetMapping("/list")
109   - public ResponseEntity<List<String>> listPlugins() {
110   - List<String> plugins = springPluginManager.getPlugins().stream()
111   - .map(plugin -> plugin.getDescriptor().getPluginId())
112   - .collect(Collectors.toList());
113   - return ResponseEntity.ok(plugins);
114   - }
115   -
116   -}
117 0 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/vo/PluginInfoPageReqVO.java deleted
1   -package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
2   -
3   -import cn.iocoder.yudao.framework.common.validation.InEnum;
4   -import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginTypeEnum;
5   -import lombok.*;
6   -import io.swagger.v3.oas.annotations.media.Schema;
7   -import cn.iocoder.yudao.framework.common.pojo.PageParam;
8   -import org.springframework.format.annotation.DateTimeFormat;
9   -import java.time.LocalDateTime;
10   -
11   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
12   -
13   -// TODO @haohao:只查询必要字段哈
14   -@Schema(description = "管理后台 - IoT 插件信息分页 Request VO")
15   -@Data
16   -public class PluginInfoPageReqVO extends PageParam {
17   -
18   - @Schema(description = "插件包 ID ", example = "24627")
19   - private String pluginId;
20   -
21   - @Schema(description = "插件名称", example = "赵六")
22   - private String name;
23   -
24   - @Schema(description = "描述", example = "你猜")
25   - private String description;
26   -
27   - @Schema(description = "部署方式", example = "2")
28   - private Integer deployType;
29   -
30   - @Schema(description = "插件包文件名")
31   - private String file;
32   -
33   - @Schema(description = "插件版本")
34   - private String version;
35   -
36   - @Schema(description = "插件类型", example = "2")
37   - @InEnum(IotPluginTypeEnum.class)
38   - private Integer type;
39   -
40   - @Schema(description = "设备插件协议类型")
41   - private String protocol;
42   -
43   - @Schema(description = "状态")
44   - private Integer status;
45   -
46   - @Schema(description = "插件配置项描述信息")
47   - private String configSchema;
48   -
49   - @Schema(description = "插件配置信息")
50   - private String config;
51   -
52   - @Schema(description = "插件脚本")
53   - private String script;
54   -
55   - @Schema(description = "创建时间")
56   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
57   - private LocalDateTime[] createTime;
58   -
59   -}
60 0 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/plugininfo/PluginInfoDO.java
1 1 package cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginDeployTypeEnum;
  5 +import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum;
  6 +import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginTypeEnum;
4 7 import com.baomidou.mybatisplus.annotation.KeySequence;
5 8 import com.baomidou.mybatisplus.annotation.TableId;
6 9 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -27,6 +30,7 @@ public class PluginInfoDO extends BaseDO {
27 30 @TableId
28 31 private Long id;
29 32 // TODO @haohao:这个是不是改成类似 key 之类的字段哈?
  33 + // 回复:默认是 pluginId,可以不用改
30 34 /**
31 35 * 插件包 ID
32 36 */
... ... @@ -41,22 +45,23 @@ public class PluginInfoDO extends BaseDO {
41 45 private String description;
42 46 /**
43 47 * 部署方式
  48 + * <p>
  49 + * 枚举 {@link IotPluginDeployTypeEnum}
44 50 */
45   - // TODO @haohao:枚举
46 51 private Integer deployType;
47 52 /**
48 53 * 插件包文件名
49 54 */
50   - // TODO @haohao:是不是叫 fileName 哈?避免后续有别的字段,类似 fileUrl?
51   - private String file;
  55 + private String fileName;
52 56 /**
53 57 * 插件版本
54 58 */
55 59 private String version;
56 60 /**
57 61 * 插件类型
  62 + * <p>
  63 + * 枚举 {@link IotPluginTypeEnum}
58 64 */
59   - // TODO @haohao:枚举
60 65 private Integer type;
61 66 /**
62 67 * 设备插件协议类型
... ... @@ -64,8 +69,9 @@ public class PluginInfoDO extends BaseDO {
64 69 private String protocol;
65 70 /**
66 71 * 状态
  72 + * <p>
  73 + * 枚举 {@link IotPluginStatusEnum}
67 74 */
68   - // TODO @haohao:枚举
69 75 private Integer status;
70 76 /**
71 77 * 插件配置项描述信息
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugininfo/PluginInfoMapper.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugin/PluginInfoMapper.java
1   -package cn.iocoder.yudao.module.iot.dal.mysql.plugininfo;
  1 +package cn.iocoder.yudao.module.iot.dal.mysql.plugin;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 6 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
7 7 import org.apache.ibatis.annotations.Mapper;
8   -import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.*;
  8 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.*;
9 9  
10 10 /**
11 11 * IoT 插件信息 Mapper
... ... @@ -17,19 +17,8 @@ public interface PluginInfoMapper extends BaseMapperX&lt;PluginInfoDO&gt; {
17 17  
18 18 default PageResult<PluginInfoDO> selectPage(PluginInfoPageReqVO reqVO) {
19 19 return selectPage(reqVO, new LambdaQueryWrapperX<PluginInfoDO>()
20   - .eqIfPresent(PluginInfoDO::getPluginId, reqVO.getPluginId())
21 20 .likeIfPresent(PluginInfoDO::getName, reqVO.getName())
22   - .eqIfPresent(PluginInfoDO::getDescription, reqVO.getDescription())
23   - .eqIfPresent(PluginInfoDO::getDeployType, reqVO.getDeployType())
24   - .eqIfPresent(PluginInfoDO::getFile, reqVO.getFile())
25   - .eqIfPresent(PluginInfoDO::getVersion, reqVO.getVersion())
26   - .eqIfPresent(PluginInfoDO::getType, reqVO.getType())
27   - .eqIfPresent(PluginInfoDO::getProtocol, reqVO.getProtocol())
28 21 .eqIfPresent(PluginInfoDO::getStatus, reqVO.getStatus())
29   - .eqIfPresent(PluginInfoDO::getConfigSchema, reqVO.getConfigSchema())
30   - .eqIfPresent(PluginInfoDO::getConfig, reqVO.getConfig())
31   - .eqIfPresent(PluginInfoDO::getScript, reqVO.getScript())
32   - .betweenIfPresent(PluginInfoDO::getCreateTime, reqVO.getCreateTime())
33 22 .orderByDesc(PluginInfoDO::getId));
34 23 }
35 24  
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugininstance/PluginInstanceMapper.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugin/PluginInstanceMapper.java
1   -package cn.iocoder.yudao.module.iot.dal.mysql.plugininstance;
  1 +package cn.iocoder.yudao.module.iot.dal.mysql.plugin;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
6 7 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
7 8 import org.apache.ibatis.annotations.Mapper;
8   -import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.*;
9 9  
10 10 /**
11 11 * IoT 插件实例 Mapper
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugininfo/PluginInfoService.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoService.java
1   -package cn.iocoder.yudao.module.iot.service.plugininfo;
  1 +package cn.iocoder.yudao.module.iot.service.plugin;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoPageReqVO;
5   -import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoSaveReqVO;
  4 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;
  5 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;
6 6 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
7 7 import jakarta.validation.Valid;
8 8 import org.springframework.web.multipart.MultipartFile;
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugininfo/PluginInfoServiceImpl.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoServiceImpl.java
1   -package cn.iocoder.yudao.module.iot.service.plugininfo;
  1 +package cn.iocoder.yudao.module.iot.service.plugin;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5   -import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoPageReqVO;
6   -import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoSaveReqVO;
  5 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;
7 7 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
8   -import cn.iocoder.yudao.module.iot.dal.mysql.plugininfo.PluginInfoMapper;
  8 +import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInfoMapper;
9 9 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum;
10 10 import jakarta.annotation.Resource;
11 11 import lombok.extern.slf4j.Slf4j;
... ... @@ -41,7 +41,6 @@ public class PluginInfoServiceImpl implements PluginInfoService {
41 41  
42 42 @Resource
43 43 private PluginInfoMapper pluginInfoMapper;
44   -
45 44 @Resource
46 45 private SpringPluginManager pluginManager;
47 46  
... ... @@ -94,12 +93,12 @@ public class PluginInfoServiceImpl implements PluginInfoService {
94 93 Executors.newSingleThreadExecutor().submit(() -> {
95 94 try {
96 95 TimeUnit.SECONDS.sleep(1); // 等待 1 秒,避免插件未卸载完毕
97   - File file = new File(pluginsDir, pluginInfoDO.getFile());
  96 + File file = new File(pluginsDir, pluginInfoDO.getFileName());
98 97 if (file.exists() && !file.delete()) {
99   - log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFile());
  98 + log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFileName());
100 99 }
101 100 } catch (InterruptedException e) {
102   - log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFile(), e);
  101 + log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFileName(), e);
103 102 }
104 103 });
105 104  
... ... @@ -213,7 +212,7 @@ public class PluginInfoServiceImpl implements PluginInfoService {
213 212 private void updatePluginInfo(PluginInfoDO pluginInfoDo, String pluginIdNew, MultipartFile file) {
214 213 pluginInfoDo.setPluginId(pluginIdNew);
215 214 pluginInfoDo.setStatus(IotPluginStatusEnum.STOPPED.getStatus());
216   - pluginInfoDo.setFile(file.getOriginalFilename());
  215 + pluginInfoDo.setFileName(file.getOriginalFilename());
217 216 pluginInfoDo.setScript("");
218 217  
219 218 PluginDescriptor pluginDescriptor = pluginManager.getPlugin(pluginIdNew).getDescriptor();
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugininstance/PluginInstanceService.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceService.java
1   -package cn.iocoder.yudao.module.iot.service.plugininstance;
  1 +package cn.iocoder.yudao.module.iot.service.plugin;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.PluginInstancePageReqVO;
5   -import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.PluginInstanceSaveReqVO;
  4 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
  5 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceSaveReqVO;
6 6 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
7 7 import jakarta.validation.Valid;
8 8  
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugininstance/PluginInstanceServiceImpl.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceServiceImpl.java
1   -package cn.iocoder.yudao.module.iot.service.plugininstance;
  1 +package cn.iocoder.yudao.module.iot.service.plugin;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5   -import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.PluginInstancePageReqVO;
6   -import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.PluginInstanceSaveReqVO;
  5 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceSaveReqVO;
7 7 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
8   -import cn.iocoder.yudao.module.iot.dal.mysql.plugininstance.PluginInstanceMapper;
  8 +import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInstanceMapper;
9 9 import jakarta.annotation.Resource;
10 10 import org.springframework.stereotype.Service;
11 11 import org.springframework.validation.annotation.Validated;
... ... @@ -13,7 +13,6 @@ import org.springframework.validation.annotation.Validated;
13 13 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
14 14 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.PLUGIN_INSTANCE_NOT_EXISTS;
15 15  
16   -// TODO @haohao:可以搞个 plugin 包,然后把 plugininfo、plugininstance
17 16 /**
18 17 * IoT 插件实例 Service 实现类
19 18 *
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/plugininstance/PluginInstanceMapper.xml
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3   -<mapper namespace="cn.iocoder.yudao.module.iot.dal.mysql.plugininstance.PluginInstanceMapper">
  3 +<mapper namespace="cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInstanceMapper">
4 4  
5 5 <!--
6 6 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
... ...