Browse Source

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

安浩浩 7 months ago
parent
commit
cbfbc55cd8
24 changed files with 122 additions and 307 deletions
  1. BIN
      plugins/yudao-module-iot-http-plugin-2.2.0-snapshot.jar
  2. 4 6
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginDeployTypeEnum.java
  3. 4 6
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginStatusEnum.java
  4. 4 7
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginTypeEnum.java
  5. 7 6
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/PluginInfoController.java
  6. 21 35
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/PluginInstanceController.java
  7. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoImportReqVO.java
  8. 17 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoPageReqVO.java
  9. 2 2
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoRespVO.java
  10. 2 2
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoSaveReqVO.java
  11. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstancePageReqVO.java
  12. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstanceRespVO.java
  13. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstanceSaveReqVO.java
  14. 0 116
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/PluginController.java
  15. 0 59
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/vo/PluginInfoPageReqVO.java
  16. 11 5
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/plugininfo/PluginInfoDO.java
  17. 25 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugin/PluginInfoMapper.java
  18. 2 2
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugin/PluginInstanceMapper.java
  19. 0 36
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugininfo/PluginInfoMapper.java
  20. 3 3
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoService.java
  21. 8 9
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoServiceImpl.java
  22. 3 3
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceService.java
  23. 4 5
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceServiceImpl.java
  24. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/plugininstance/PluginInstanceMapper.xml

BIN
plugins/yudao-module-iot-http-plugin-2.2.0-snapshot.jar


+ 4 - 6
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 {
     }
 
     public static IotPluginDeployTypeEnum fromDeployType(Integer deployType) {
-        for (IotPluginDeployTypeEnum value : values()) {
-            if (value.getDeployType().equals(deployType)) {
-                return value;
-            }
-        }
-        return null;
+        return Arrays.stream(values())
+                .filter(value -> value.getDeployType().equals(deployType))
+                .findFirst()
+                .orElse(null);
     }
 
     public static boolean isValidDeployType(Integer deployType) {

+ 4 - 6
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 {
     }
 
     public static IotPluginStatusEnum fromState(Integer state) {
-        for (IotPluginStatusEnum value : values()) {
-            if (value.getStatus().equals(state)) {
-                return value;
-            }
-        }
-        return null;
+        return Arrays.stream(values())
+                .filter(value -> value.getStatus().equals(state))
+                .findFirst()
+                .orElse(null);
     }
 
     @Override

+ 4 - 7
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 {
         return ARRAYS;
     }
 
-    // TODO @haohao:可以使用 hutool 简化
     public static IotPluginTypeEnum fromType(Integer type) {
-        for (IotPluginTypeEnum value : values()) {
-            if (value.getType().equals(type)) {
-                return value;
-            }
-        }
-        return null;
+        return Arrays.stream(values())
+                .filter(value -> value.getType().equals(type))
+                .findFirst()
+                .orElse(null);
     }
 
     public static boolean isValidType(Integer type) {

+ 7 - 6
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/PluginInfoController.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/PluginInfoController.java

@@ -1,14 +1,14 @@
-package cn.iocoder.yudao.module.iot.controller.admin.plugininfo;
+package cn.iocoder.yudao.module.iot.controller.admin.plugin;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 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.plugininfo.vo.PluginInfoImportReqVO;
-import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoPageReqVO;
-import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoRespVO;
-import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoSaveReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoImportReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoRespVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
-import cn.iocoder.yudao.module.iot.service.plugininfo.PluginInfoService;
+import cn.iocoder.yudao.module.iot.service.plugin.PluginInfoService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -72,6 +72,7 @@ public class PluginInfoController {
 
     @PostMapping("/upload-file")
     @Operation(summary = "上传插件文件")
+    @PreAuthorize("@ss.hasPermission('iot:plugin-info:update')")
     public CommonResult<Boolean> uploadFile(@Valid PluginInfoImportReqVO reqVO) {
         pluginInfoService.uploadFile(reqVO.getId(), reqVO.getFile());
         return success(true);

+ 21 - 35
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininstance/PluginInstanceController.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/PluginInstanceController.java

@@ -1,32 +1,31 @@
-package cn.iocoder.yudao.module.iot.controller.admin.plugininstance;
-
-import org.springframework.web.bind.annotation.*;
-import jakarta.annotation.Resource;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.security.access.prepost.PreAuthorize;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.Operation;
-
-import jakarta.validation.*;
-import jakarta.servlet.http.*;
-import java.util.*;
-import java.io.IOException;
+package cn.iocoder.yudao.module.iot.controller.admin.plugin;
 
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceRespVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceSaveReqVO;
+import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
+import cn.iocoder.yudao.module.iot.service.plugin.PluginInstanceService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
-import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
-import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+import java.io.IOException;
+import java.util.List;
 
-import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.*;
-import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
-import cn.iocoder.yudao.module.iot.service.plugininstance.PluginInstanceService;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "管理后台 - IoT 插件实例")
 @RestController
@@ -78,17 +77,4 @@ public class PluginInstanceController {
         return success(BeanUtils.toBean(pageResult, PluginInstanceRespVO.class));
     }
 
-    @GetMapping("/export-excel")
-    @Operation(summary = "导出IoT 插件实例 Excel")
-    @PreAuthorize("@ss.hasPermission('iot:plugin-instance:export')")
-    @ApiAccessLog(operateType = EXPORT)
-    public void exportPluginInstanceExcel(@Valid PluginInstancePageReqVO pageReqVO,
-              HttpServletResponse response) throws IOException {
-        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<PluginInstanceDO> list = pluginInstanceService.getPluginInstancePage(pageReqVO).getList();
-        // 导出 Excel
-        ExcelUtils.write(response, "IoT 插件实例.xls", "数据", PluginInstanceRespVO.class,
-                        BeanUtils.toBean(list, PluginInstanceRespVO.class));
-    }
-
 }

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/vo/PluginInfoImportReqVO.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoImportReqVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
+package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;

+ 17 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoPageReqVO.java

@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - IoT 插件信息分页 Request VO")
+@Data
+public class PluginInfoPageReqVO extends PageParam {
+
+    @Schema(description = "插件名称", example = "http")
+    private String name;
+
+    @Schema(description = "状态")
+    private Integer status;
+
+}

+ 2 - 2
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/vo/PluginInfoRespVO.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoRespVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
+package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
@@ -34,7 +34,7 @@ public class PluginInfoRespVO {
 
     @Schema(description = "插件包文件名", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("插件包文件名")
-    private String file;
+    private String fileName;
 
     @Schema(description = "插件版本", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("插件版本")

+ 2 - 2
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/vo/PluginInfoSaveReqVO.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoSaveReqVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
+package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -23,7 +23,7 @@ public class PluginInfoSaveReqVO {
     private Integer deployType;
 
     @Schema(description = "插件包文件名", requiredMode = Schema.RequiredMode.REQUIRED)
-    private String file;
+    private String fileName;
 
     @Schema(description = "插件版本", requiredMode = Schema.RequiredMode.REQUIRED)
     private String version;

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininstance/vo/PluginInstancePageReqVO.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstancePageReqVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo;
+package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
 
 import lombok.*;
 import io.swagger.v3.oas.annotations.media.Schema;

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininstance/vo/PluginInstanceRespVO.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstanceRespVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo;
+package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininstance/vo/PluginInstanceSaveReqVO.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstanceSaveReqVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo;
+package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;

+ 0 - 116
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/PluginController.java

@@ -1,116 +0,0 @@
-package cn.iocoder.yudao.module.iot.controller.admin.plugininfo;
-
-import jakarta.annotation.Resource;
-import org.pf4j.spring.SpringPluginManager;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.annotation.security.PermitAll;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * 插件 Controller 测试用例
- */
-@RestController
-@RequestMapping("/iot/plugins")
-public class PluginController {
-
-    @Resource
-    private SpringPluginManager springPluginManager;
-
-    @Value("${pf4j.pluginsDir}")
-    private String pluginsDir;
-
-    /**
-     * 上传插件 JAR 文件并加载插件
-     *
-     * @param file 上传的 JAR 文件
-     * @return 上传结果
-     */
-    @PermitAll
-    @PostMapping("/upload")
-    public ResponseEntity<String> uploadPlugin(@RequestParam("file") MultipartFile file) {
-        if (file.isEmpty()) {
-            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("上传的文件为空");
-        }
-
-        // 确保插件目录存在
-        Path pluginsPath = Paths.get(pluginsDir);
-        try {
-            if (!Files.exists(pluginsPath)) {
-                Files.createDirectories(pluginsPath);
-            }
-
-            // 保存上传的 JAR 文件到插件目录
-            String filename = file.getOriginalFilename();
-            if (filename == null || (!filename.endsWith(".jar") && !filename.endsWith(".zip"))) {
-                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("上传的文件不是 JAR 或 ZIP 文件");
-            }
-
-            Path jarPath = pluginsPath.resolve(filename);
-
-            Files.copy(file.getInputStream(), jarPath, StandardCopyOption.REPLACE_EXISTING);
-
-            // 加载插件
-            String pluginId = springPluginManager.loadPlugin(jarPath.toAbsolutePath());
-
-            // 启动插件
-            springPluginManager.startPlugin(pluginId);
-
-            return ResponseEntity.ok("插件上传并加载成功");
-        } catch (IOException e) {
-            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("上传插件时发生错误: " + e.getMessage());
-        } catch (Exception e) {
-            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("加载插件时发生错误: " + e.getMessage());
-        }
-    }
-
-    /**
-     * 卸载指定插件
-     *
-     * @param pluginId 插件 ID
-     * @return 卸载结果
-     */
-    @PermitAll
-    @DeleteMapping("/unload/{pluginId}")
-    public ResponseEntity<String> unloadPlugin(@PathVariable String pluginId) {
-        if (springPluginManager.getPlugins().stream().noneMatch(plugin -> plugin.getDescriptor().getPluginId().equals(pluginId))) {
-            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("插件未加载: " + pluginId);
-        }
-
-        springPluginManager.stopPlugin(pluginId);
-        springPluginManager.unloadPlugin(pluginId);
-
-        // 删除插件 JAR 文件(可选)
-//            PluginWrapper plugin = pluginManager.getPlugin(pluginId);
-//            PluginDescriptor descriptor = plugin.getDescriptor();
-//            Path jarPath = Paths.get(pluginsDir).resolve(descriptor.getPluginId() + ".jar");
-//            Files.deleteIfExists(jarPath);
-
-        return ResponseEntity.ok("插件卸载成功: " + pluginId);
-    }
-
-    /**
-     * 列出所有已加载的插件
-     *
-     * @return 插件列表
-     */
-    @PermitAll
-    @GetMapping("/list")
-    public ResponseEntity<List<String>> listPlugins() {
-        List<String> plugins = springPluginManager.getPlugins().stream()
-                .map(plugin -> plugin.getDescriptor().getPluginId())
-                .collect(Collectors.toList());
-        return ResponseEntity.ok(plugins);
-    }
-
-}

+ 0 - 59
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/vo/PluginInfoPageReqVO.java

@@ -1,59 +0,0 @@
-package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo;
-
-import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginTypeEnum;
-import lombok.*;
-import io.swagger.v3.oas.annotations.media.Schema;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import org.springframework.format.annotation.DateTimeFormat;
-import java.time.LocalDateTime;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-// TODO @haohao:只查询必要字段哈
-@Schema(description = "管理后台 - IoT 插件信息分页 Request VO")
-@Data
-public class PluginInfoPageReqVO extends PageParam {
-
-    @Schema(description = "插件包 ID ", example = "24627")
-    private String pluginId;
-
-    @Schema(description = "插件名称", example = "赵六")
-    private String name;
-
-    @Schema(description = "描述", example = "你猜")
-    private String description;
-
-    @Schema(description = "部署方式", example = "2")
-    private Integer deployType;
-
-    @Schema(description = "插件包文件名")
-    private String file;
-
-    @Schema(description = "插件版本")
-    private String version;
-
-    @Schema(description = "插件类型", example = "2")
-    @InEnum(IotPluginTypeEnum.class)
-    private Integer type;
-
-    @Schema(description = "设备插件协议类型")
-    private String protocol;
-
-    @Schema(description = "状态")
-    private Integer status;
-
-    @Schema(description = "插件配置项描述信息")
-    private String configSchema;
-
-    @Schema(description = "插件配置信息")
-    private String config;
-
-    @Schema(description = "插件脚本")
-    private String script;
-
-    @Schema(description = "创建时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalDateTime[] createTime;
-
-}

+ 11 - 5
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/plugininfo/PluginInfoDO.java

@@ -1,6 +1,9 @@
 package cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo;
 
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginDeployTypeEnum;
+import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum;
+import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginTypeEnum;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -27,6 +30,7 @@ public class PluginInfoDO extends BaseDO {
     @TableId
     private Long id;
     // TODO @haohao:这个是不是改成类似 key 之类的字段哈?
+    // 回复:默认是 pluginId,可以不用改
     /**
      * 插件包 ID
      */
@@ -41,22 +45,23 @@ public class PluginInfoDO extends BaseDO {
     private String description;
     /**
      * 部署方式
+     * <p>
+     * 枚举 {@link IotPluginDeployTypeEnum}
      */
-    // TODO @haohao:枚举
     private Integer deployType;
     /**
      * 插件包文件名
      */
-    // TODO @haohao:是不是叫 fileName 哈?避免后续有别的字段,类似 fileUrl?
-    private String file;
+    private String fileName;
     /**
      * 插件版本
      */
     private String version;
     /**
      * 插件类型
+     * <p>
+     * 枚举 {@link IotPluginTypeEnum}
      */
-    // TODO @haohao:枚举
     private Integer type;
     /**
      * 设备插件协议类型
@@ -64,8 +69,9 @@ public class PluginInfoDO extends BaseDO {
     private String protocol;
     /**
      * 状态
+     * <p>
+     * 枚举 {@link IotPluginStatusEnum}
      */
-    // TODO @haohao:枚举
     private Integer status;
     /**
      * 插件配置项描述信息

+ 25 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugin/PluginInfoMapper.java

@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.iot.dal.mysql.plugin;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.*;
+
+/**
+ * IoT 插件信息 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface PluginInfoMapper extends BaseMapperX<PluginInfoDO> {
+
+    default PageResult<PluginInfoDO> selectPage(PluginInfoPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<PluginInfoDO>()
+                .likeIfPresent(PluginInfoDO::getName, reqVO.getName())
+                .eqIfPresent(PluginInfoDO::getStatus, reqVO.getStatus())
+                .orderByDesc(PluginInfoDO::getId));
+    }
+
+}

+ 2 - 2
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugininstance/PluginInstanceMapper.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugin/PluginInstanceMapper.java

@@ -1,11 +1,11 @@
-package cn.iocoder.yudao.module.iot.dal.mysql.plugininstance;
+package cn.iocoder.yudao.module.iot.dal.mysql.plugin;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
 import org.apache.ibatis.annotations.Mapper;
-import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.*;
 
 /**
  * IoT 插件实例 Mapper

+ 0 - 36
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugininfo/PluginInfoMapper.java

@@ -1,36 +0,0 @@
-package cn.iocoder.yudao.module.iot.dal.mysql.plugininfo;
-
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
-import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
-import org.apache.ibatis.annotations.Mapper;
-import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.*;
-
-/**
- * IoT 插件信息 Mapper
- *
- * @author 芋道源码
- */
-@Mapper
-public interface PluginInfoMapper extends BaseMapperX<PluginInfoDO> {
-
-    default PageResult<PluginInfoDO> selectPage(PluginInfoPageReqVO reqVO) {
-        return selectPage(reqVO, new LambdaQueryWrapperX<PluginInfoDO>()
-                .eqIfPresent(PluginInfoDO::getPluginId, reqVO.getPluginId())
-                .likeIfPresent(PluginInfoDO::getName, reqVO.getName())
-                .eqIfPresent(PluginInfoDO::getDescription, reqVO.getDescription())
-                .eqIfPresent(PluginInfoDO::getDeployType, reqVO.getDeployType())
-                .eqIfPresent(PluginInfoDO::getFile, reqVO.getFile())
-                .eqIfPresent(PluginInfoDO::getVersion, reqVO.getVersion())
-                .eqIfPresent(PluginInfoDO::getType, reqVO.getType())
-                .eqIfPresent(PluginInfoDO::getProtocol, reqVO.getProtocol())
-                .eqIfPresent(PluginInfoDO::getStatus, reqVO.getStatus())
-                .eqIfPresent(PluginInfoDO::getConfigSchema, reqVO.getConfigSchema())
-                .eqIfPresent(PluginInfoDO::getConfig, reqVO.getConfig())
-                .eqIfPresent(PluginInfoDO::getScript, reqVO.getScript())
-                .betweenIfPresent(PluginInfoDO::getCreateTime, reqVO.getCreateTime())
-                .orderByDesc(PluginInfoDO::getId));
-    }
-
-}

+ 3 - 3
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugininfo/PluginInfoService.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoService.java

@@ -1,8 +1,8 @@
-package cn.iocoder.yudao.module.iot.service.plugininfo;
+package cn.iocoder.yudao.module.iot.service.plugin;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoPageReqVO;
-import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoSaveReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
 import jakarta.validation.Valid;
 import org.springframework.web.multipart.MultipartFile;

+ 8 - 9
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugininfo/PluginInfoServiceImpl.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoServiceImpl.java

@@ -1,11 +1,11 @@
-package cn.iocoder.yudao.module.iot.service.plugininfo;
+package cn.iocoder.yudao.module.iot.service.plugin;
 
 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.plugininfo.vo.PluginInfoPageReqVO;
-import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.PluginInfoSaveReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;
-import cn.iocoder.yudao.module.iot.dal.mysql.plugininfo.PluginInfoMapper;
+import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInfoMapper;
 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
@@ -41,7 +41,6 @@ public class PluginInfoServiceImpl implements PluginInfoService {
 
     @Resource
     private PluginInfoMapper pluginInfoMapper;
-
     @Resource
     private SpringPluginManager pluginManager;
 
@@ -94,12 +93,12 @@ public class PluginInfoServiceImpl implements PluginInfoService {
         Executors.newSingleThreadExecutor().submit(() -> {
             try {
                 TimeUnit.SECONDS.sleep(1); // 等待 1 秒,避免插件未卸载完毕
-                File file = new File(pluginsDir, pluginInfoDO.getFile());
+                File file = new File(pluginsDir, pluginInfoDO.getFileName());
                 if (file.exists() && !file.delete()) {
-                    log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFile());
+                    log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFileName());
                 }
             } catch (InterruptedException e) {
-                log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFile(), e);
+                log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFileName(), e);
             }
         });
 
@@ -213,7 +212,7 @@ public class PluginInfoServiceImpl implements PluginInfoService {
     private void updatePluginInfo(PluginInfoDO pluginInfoDo, String pluginIdNew, MultipartFile file) {
         pluginInfoDo.setPluginId(pluginIdNew);
         pluginInfoDo.setStatus(IotPluginStatusEnum.STOPPED.getStatus());
-        pluginInfoDo.setFile(file.getOriginalFilename());
+        pluginInfoDo.setFileName(file.getOriginalFilename());
         pluginInfoDo.setScript("");
 
         PluginDescriptor pluginDescriptor = pluginManager.getPlugin(pluginIdNew).getDescriptor();

+ 3 - 3
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugininstance/PluginInstanceService.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceService.java

@@ -1,8 +1,8 @@
-package cn.iocoder.yudao.module.iot.service.plugininstance;
+package cn.iocoder.yudao.module.iot.service.plugin;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.PluginInstancePageReqVO;
-import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.PluginInstanceSaveReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceSaveReqVO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
 import jakarta.validation.Valid;
 

+ 4 - 5
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugininstance/PluginInstanceServiceImpl.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceServiceImpl.java

@@ -1,11 +1,11 @@
-package cn.iocoder.yudao.module.iot.service.plugininstance;
+package cn.iocoder.yudao.module.iot.service.plugin;
 
 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.plugininstance.vo.PluginInstancePageReqVO;
-import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.PluginInstanceSaveReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstanceSaveReqVO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO;
-import cn.iocoder.yudao.module.iot.dal.mysql.plugininstance.PluginInstanceMapper;
+import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInstanceMapper;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
@@ -13,7 +13,6 @@ import org.springframework.validation.annotation.Validated;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.PLUGIN_INSTANCE_NOT_EXISTS;
 
-// TODO @haohao:可以搞个 plugin 包,然后把 plugininfo、plugininstance
 /**
  * IoT 插件实例 Service 实现类
  *

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/plugininstance/PluginInstanceMapper.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="cn.iocoder.yudao.module.iot.dal.mysql.plugininstance.PluginInstanceMapper">
+<mapper namespace="cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInstanceMapper">
 
     <!--
         一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。