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

This commit is contained in:
安浩浩 2024-12-30 12:01:58 +08:00
parent 8ca9bebfd1
commit cbfbc55cd8
24 changed files with 126 additions and 311 deletions

View File

@ -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) {

View File

@ -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

View File

@ -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) {

View File

@ -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);

View File

@ -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;
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;
package cn.iocoder.yudao.module.iot.controller.admin.plugin;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.*;
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.util.object.BeanUtils;
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.plugininstance.PluginInstanceService;
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 java.io.IOException;
import java.util.List;
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));
}
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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("插件版本")

View File

@ -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;

View File

@ -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;

View File

@ -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.*;

View File

@ -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.*;

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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;
/**
* 插件配置项描述信息

View File

@ -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));
}
}

View File

@ -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

View File

@ -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));
}
}

View File

@ -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;

View File

@ -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();

View File

@ -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;

View File

@ -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 然后把 plugininfoplugininstance
/**
* IoT 插件实例 Service 实现类
*

View File

@ -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 增删改查即可。