From a991dd784fd94741a5fbeb5faf7427ddcc61e57e Mon Sep 17 00:00:00 2001 From: lidongyang <506508008@qq.com> Date: Tue, 30 Dec 2025 16:37:37 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=8F=8A=E5=85=B6=E5=85=B3=E8=81=94=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=202=E3=80=81onlyoffice=E5=9B=9E=E8=B0=83=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=B7=B3=E8=BF=87=E9=89=B4=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sdm/common/annotation/IgnoreAuth.java | 13 +++ .../com/sdm/common/filter/BaseAuthFilter.java | 42 +++++++++- .../data/controller/DataFileController.java | 2 + .../controller/SimulationTaskController.java | 10 +++ .../dao/SimulationPerformanceExtraMapper.java | 17 ++++ .../entity/SimulationPerformanceExtra.java | 80 +++++++++++++++++++ .../project/model/req/SpdmDeleteTaskReq.java | 21 +++++ .../ISimulationPerformanceExtraService.java | 17 ++++ .../com/sdm/project/service/ITaskService.java | 3 + ...SimulationPerformanceExtraServiceImpl.java | 23 ++++++ .../project/service/impl/TaskServiceImpl.java | 42 ++++++++++ 11 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/com/sdm/common/annotation/IgnoreAuth.java create mode 100644 project/src/main/java/com/sdm/project/dao/SimulationPerformanceExtraMapper.java create mode 100644 project/src/main/java/com/sdm/project/model/entity/SimulationPerformanceExtra.java create mode 100644 project/src/main/java/com/sdm/project/model/req/SpdmDeleteTaskReq.java create mode 100644 project/src/main/java/com/sdm/project/service/ISimulationPerformanceExtraService.java create mode 100644 project/src/main/java/com/sdm/project/service/impl/SimulationPerformanceExtraServiceImpl.java diff --git a/common/src/main/java/com/sdm/common/annotation/IgnoreAuth.java b/common/src/main/java/com/sdm/common/annotation/IgnoreAuth.java new file mode 100644 index 00000000..69cceba1 --- /dev/null +++ b/common/src/main/java/com/sdm/common/annotation/IgnoreAuth.java @@ -0,0 +1,13 @@ +package com.sdm.common.annotation; + +import java.lang.annotation.*; + +/** + * 自定义跳过Filter鉴权的注解 + * 标记此注解的Controller方法将跳过Filter的权限校验 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface IgnoreAuth { + +} \ No newline at end of file diff --git a/common/src/main/java/com/sdm/common/filter/BaseAuthFilter.java b/common/src/main/java/com/sdm/common/filter/BaseAuthFilter.java index 49803bb3..623ef3c2 100644 --- a/common/src/main/java/com/sdm/common/filter/BaseAuthFilter.java +++ b/common/src/main/java/com/sdm/common/filter/BaseAuthFilter.java @@ -1,5 +1,6 @@ package com.sdm.common.filter; +import com.sdm.common.annotation.IgnoreAuth; import com.sdm.common.common.ThreadLocalContext; import com.sdm.common.config.WhitelistProperties; import jakarta.servlet.Filter; @@ -11,8 +12,13 @@ import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.util.AntPathMatcher; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerExecutionChain; +import org.springframework.web.servlet.HandlerMapping; import java.io.IOException; import java.util.List; @@ -23,6 +29,10 @@ public abstract class BaseAuthFilter implements Filter { @Autowired protected WhitelistProperties whitelistProperties; + @Autowired + @Qualifier("requestMappingHandlerMapping") + private HandlerMapping handlerMapping; + protected List excludedPaths; protected final AntPathMatcher pathMatcher = new AntPathMatcher(); @@ -50,7 +60,7 @@ public abstract class BaseAuthFilter implements Filter { filterChain.doFilter(servletRequest, servletResponse); return; } - + // 执行认证检查 if (!shouldSkipAuthentication(req) && !hasContext) { handleUnauthenticatedRequest(servletResponse); @@ -68,6 +78,36 @@ public abstract class BaseAuthFilter implements Filter { * 子类可以覆盖此方法来实现特定逻辑 */ protected boolean shouldSkipAuthentication(HttpServletRequest request) { + // 1. 通过HandlerMapping获取当前请求对应的处理器(HandlerMethod) + Object handler = null; + try { + HandlerExecutionChain handlerExecutionChain = handlerMapping.getHandler(request); + if (ObjectUtils.isEmpty(handlerExecutionChain)) { + return false; + } + handler = handlerExecutionChain.getHandler(); + if (ObjectUtils.isEmpty(handler)) { + return false; + } + } catch (Exception e) { + log.error("shouldSkipAuthentication异常:{}",e.getMessage()); + return false; + } + // 2. 判断处理器是否为HandlerMethod(仅Controller方法会是HandlerMethod,静态资源等不是) + if (!(handler instanceof HandlerMethod)) { + return true; + } + HandlerMethod handlerMethod = (HandlerMethod) handler; + // 3. 先判断Controller方法上是否带有@IgnoreAuth注解(方法注解优先级高于类注解) + if (handlerMethod.hasMethodAnnotation(IgnoreAuth.class)) { + return true; + } + // 4. 再判断Controller类上是否带有@IgnoreAuth注解 + Class controllerClass = handlerMethod.getBeanType(); + if (controllerClass.isAnnotationPresent(IgnoreAuth.class)) { + return true; + } + // 5. 既无方法注解,也无类注解,不跳过Filter return false; } diff --git a/data/src/main/java/com/sdm/data/controller/DataFileController.java b/data/src/main/java/com/sdm/data/controller/DataFileController.java index 3eb08ead..243d5e05 100644 --- a/data/src/main/java/com/sdm/data/controller/DataFileController.java +++ b/data/src/main/java/com/sdm/data/controller/DataFileController.java @@ -1,5 +1,6 @@ package com.sdm.data.controller; +import com.sdm.common.annotation.IgnoreAuth; import com.sdm.common.common.SdmResponse; import com.sdm.common.entity.req.data.*; import com.sdm.common.entity.req.system.LaunchApproveReq; @@ -478,6 +479,7 @@ public class DataFileController implements IDataFeignClient { @CrossOrigin(origins = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.OPTIONS}) @PostMapping("/onlyOfficeCallback") @Operation(summary = "only office 回调", description = "only office 回调") + @IgnoreAuth public ResponseEntity onlyOfficeCallback(@RequestBody CallbackData callbackData) { return IDataFileService.onlyOfficeCallback(callbackData); } diff --git a/project/src/main/java/com/sdm/project/controller/SimulationTaskController.java b/project/src/main/java/com/sdm/project/controller/SimulationTaskController.java index 07299368..3fcd29f5 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationTaskController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationTaskController.java @@ -247,4 +247,14 @@ public class SimulationTaskController implements ISimulationTaskFeignClient { return taskService.getProjectDifficultStatistics(req); } + /** + * 删除任务及相关数据 + */ + @SysLog("删除任务及相关数据") + @PostMapping("/deleteTask") + @Operation(summary = "删除任务及相关数据", description = "删除任务及相关数据") + public SdmResponse deleteTask(@RequestBody @Validated SpdmDeleteTaskReq req) { + return taskService.deleteTask(req); + } + } diff --git a/project/src/main/java/com/sdm/project/dao/SimulationPerformanceExtraMapper.java b/project/src/main/java/com/sdm/project/dao/SimulationPerformanceExtraMapper.java new file mode 100644 index 00000000..5236b921 --- /dev/null +++ b/project/src/main/java/com/sdm/project/dao/SimulationPerformanceExtraMapper.java @@ -0,0 +1,17 @@ +package com.sdm.project.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sdm.common.entity.req.project.SimulationPerformance; +import com.sdm.project.model.entity.SimulationPerformanceExtra; + +/** + *

+ * Mapper 接口 + *

+ * + * @author author + * @since 2025-11-03 + */ +public interface SimulationPerformanceExtraMapper extends BaseMapper { + +} diff --git a/project/src/main/java/com/sdm/project/model/entity/SimulationPerformanceExtra.java b/project/src/main/java/com/sdm/project/model/entity/SimulationPerformanceExtra.java new file mode 100644 index 00000000..0782989d --- /dev/null +++ b/project/src/main/java/com/sdm/project/model/entity/SimulationPerformanceExtra.java @@ -0,0 +1,80 @@ +package com.sdm.project.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author author + * @since 2025-09-16 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("simulation_performance_extra") +@ApiModel(value="SimulationPerformanceExtra对象", description="") +public class SimulationPerformanceExtra implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("uuid") + private String uuid; + + @TableField("performanceId") + private String performanceId; + + @TableField("taskId") + private String taskId; + + @TableField("nodeId") + private String nodeId; + + @TableField("poolName") + private String poolName; + + + @TableField("propertyName") + private String propertyName; + + @TableField("propertyValue") + private String propertyValue; + + @TableField("valueType") + private String valueType; + + @TableField("propertyClass") + private String propertyClass; + + @TableField("creator") + @ApiModelProperty(value = "创建人") + private Long creator; + + @TableField("create_time") + @ApiModelProperty(value = "创建时间") + private String createTime; + + @TableField("updater") + @ApiModelProperty(value = "更新人") + private Long updater; + + @TableField("update_time") + @ApiModelProperty(value = "更新时间") + private String updateTime; + + +} diff --git a/project/src/main/java/com/sdm/project/model/req/SpdmDeleteTaskReq.java b/project/src/main/java/com/sdm/project/model/req/SpdmDeleteTaskReq.java new file mode 100644 index 00000000..cf4ad4ad --- /dev/null +++ b/project/src/main/java/com/sdm/project/model/req/SpdmDeleteTaskReq.java @@ -0,0 +1,21 @@ +package com.sdm.project.model.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.util.List; + +/** + * 删除任务及相关数据请求参数 + */ +@Data +@Schema(description = "删除任务及相关数据请求参数") +public class SpdmDeleteTaskReq { + + @Schema(description = "任务id集合") + @NotEmpty + private List taskIdList; + +} \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/service/ISimulationPerformanceExtraService.java b/project/src/main/java/com/sdm/project/service/ISimulationPerformanceExtraService.java new file mode 100644 index 00000000..6b730262 --- /dev/null +++ b/project/src/main/java/com/sdm/project/service/ISimulationPerformanceExtraService.java @@ -0,0 +1,17 @@ +package com.sdm.project.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.sdm.common.entity.req.project.SimulationPerformance; +import com.sdm.project.model.entity.SimulationPerformanceExtra; + +/** + *

+ * 服务类 + *

+ * + * @author author + * @since 2025-11-03 + */ +public interface ISimulationPerformanceExtraService extends IService { + +} diff --git a/project/src/main/java/com/sdm/project/service/ITaskService.java b/project/src/main/java/com/sdm/project/service/ITaskService.java index f7ede948..6a959f83 100644 --- a/project/src/main/java/com/sdm/project/service/ITaskService.java +++ b/project/src/main/java/com/sdm/project/service/ITaskService.java @@ -76,4 +76,7 @@ public interface ITaskService { SdmResponse> getTaskDifficultStatistics(); SdmResponse> getProjectDifficultStatistics(ProjectDifficultCompleteStatisticsReq req); + + SdmResponse deleteTask(SpdmDeleteTaskReq req); + } diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationPerformanceExtraServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationPerformanceExtraServiceImpl.java new file mode 100644 index 00000000..83b07f23 --- /dev/null +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationPerformanceExtraServiceImpl.java @@ -0,0 +1,23 @@ +package com.sdm.project.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sdm.common.entity.req.project.SimulationPerformance; +import com.sdm.project.dao.SimulationPerformanceExtraMapper; +import com.sdm.project.dao.SimulationPerformanceMapper; +import com.sdm.project.model.entity.SimulationPerformanceExtra; +import com.sdm.project.service.ISimulationPerformanceExtraService; +import com.sdm.project.service.ISimulationPerformanceService; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author author + * @since 2025-11-03 + */ +@Service +public class SimulationPerformanceExtraServiceImpl extends ServiceImpl implements ISimulationPerformanceExtraService { + +} diff --git a/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java index ac211a33..4e9a6006 100644 --- a/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java @@ -11,6 +11,7 @@ import com.sdm.common.entity.enums.DirTypeEnum; import com.sdm.common.entity.enums.FilePermissionEnum; import com.sdm.common.entity.enums.NodeTypeEnum; import com.sdm.common.entity.req.data.CreateDirReq; +import com.sdm.common.entity.req.data.DelDirReq; import com.sdm.common.entity.req.data.QueryFileReq; import com.sdm.common.entity.req.data.UpdatePermissionReq; import com.sdm.common.entity.req.project.SimulationPerformance; @@ -110,6 +111,9 @@ public class TaskServiceImpl implements ITaskService { @Autowired private SimulationFlowFeignClientImpl flowFeignClient; + @Autowired + private ISimulationPerformanceExtraService simulationPerformanceExtraService; + private static final String NODE_NAME_KEY = "nodeName"; private static final String NODE_CODE_KEY = "nodeCode"; @@ -2656,4 +2660,42 @@ public class TaskServiceImpl implements ITaskService { return SdmResponse.success(projectDifficultStatisticsRespList.stream().sorted(Comparator.comparingInt(ProjectDifficultStatisticsResp::getDifficult)).toList()); } + // 删除文件夹 + public void deleteDirNew(List uuidList) { + for (String uuid : uuidList) { + DelDirReq req = new DelDirReq(); + req.setDelUuid(uuid); + log.info("调用删除文件夹的参数为:{}", req); + SdmResponse response = dataClientFeignClient.delDir(req); + log.info("调用删除文件夹的返回值为:{}", response); + if (response.getCode() != ResultCode.SUCCESS.getCode()) { + throw new RuntimeException(response.getMessage()); + } + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public SdmResponse deleteTask(SpdmDeleteTaskReq req) { + List taskIdList = req.getTaskIdList(); + // 删除任务相关数据 + simulationTaskService.lambdaUpdate().in(SimulationTask::getUuid, taskIdList).remove(); + simulationTaskMemberService.lambdaUpdate().in(SimulationTaskMember::getTaskId, taskIdList).remove(); + simulationTaskExtraService.lambdaUpdate().in(SimulationTaskExtra::getTaskId, taskIdList).remove(); + simulationTaskAttentionService.lambdaUpdate().in(SimulationTaskAttention::getTaskId, taskIdList).remove(); + // 删除指标相关数据 + List performanceList = simulationPerformanceService.lambdaQuery().in(SimulationPerformance::getTaskId, taskIdList).list(); + if (CollectionUtils.isNotEmpty(performanceList)) { + simulationPerformanceService.lambdaUpdate().in(SimulationPerformance::getTaskId, taskIdList).remove(); + simulationPerformanceExtraService.lambdaUpdate().in(SimulationPerformanceExtra::getPerformanceId, performanceList.stream().map(SimulationPerformance::getUuid).toList()).remove(); + } + try { + deleteDirNew(taskIdList); + }catch (Exception e) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return SdmResponse.failed("删除任务失败,原因为:" + e.getMessage()); + } + return SdmResponse.success("删除任务成功"); + } + }