From 34238903b304c30b2abe7dac6315cb9df80ec560 Mon Sep 17 00:00:00 2001 From: luogw <3132758203@qq.com> Date: Wed, 22 Jul 2026 10:37:50 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../information/mapper/InformationMapper.java | 10 ++++ .../operation/aop/OperationLogAspect.java | 25 +++++++--- .../domain/entity/OperationLogEntity.java | 4 +- .../AppealDescriptionStrategy.java | 5 +- .../description/DataDescriptionStrategy.java | 48 ++++++++----------- .../description/TaskDescriptionStrategy.java | 30 ++++++------ .../com/project/task/mapper/TaskMapper.java | 8 ++++ 7 files changed, 76 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/project/information/mapper/InformationMapper.java b/src/main/java/com/project/information/mapper/InformationMapper.java index d9bb9f8..816983f 100644 --- a/src/main/java/com/project/information/mapper/InformationMapper.java +++ b/src/main/java/com/project/information/mapper/InformationMapper.java @@ -3,7 +3,17 @@ package com.project.information.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.project.information.domain.entity.InformationEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; @Mapper public interface InformationMapper extends BaseMapper { + + @Select({""}) + List selectBatchIdsIncludeDeleted(@Param("list") List idList); } diff --git a/src/main/java/com/project/operation/aop/OperationLogAspect.java b/src/main/java/com/project/operation/aop/OperationLogAspect.java index 7b8deff..e36f32f 100644 --- a/src/main/java/com/project/operation/aop/OperationLogAspect.java +++ b/src/main/java/com/project/operation/aop/OperationLogAspect.java @@ -24,6 +24,7 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import java.lang.reflect.Method; +import java.util.concurrent.CompletableFuture; /** * 操作日志AOP切面 @@ -54,14 +55,10 @@ public class OperationLogAspect { Object businessResult = null; try { - //收集请求上下文(IP、用户ID等) + //收集请求上下文(IP等,不依赖业务结果) collectRequestContext(operationLogDTO); - //收集方法和注解信息 - collectMethodAndAnnotationInfo(joinPoint, operationLogDTO); //执行业务方法 businessResult = joinPoint.proceed(); - //获取用户ID - handleLoginSceneUserId(operationLogDTO, joinPoint, businessResult); operationLogDTO.setResult(0); } catch (Exception e) { operationLogDTO.setResult(1); @@ -69,12 +66,28 @@ public class OperationLogAspect { throw e; } finally { operationLogDTO.setCostTime(System.currentTimeMillis() - startTime); - saveOperationLogAsync(operationLogDTO); + // 异步提交后续处理(策略+用户ID+保存),完全不阻塞主线程 + submitLogProcessingAsync(joinPoint, operationLogDTO, businessResult); } return businessResult; } + /** + * 异步提交日志处理(策略信息收集 + 用户ID解析 + 保存) + */ + private void submitLogProcessingAsync(ProceedingJoinPoint joinPoint, OperationLogDTO operationLogDTO, Object businessResult) { + CompletableFuture.runAsync(() -> { + try { + collectMethodAndAnnotationInfo(joinPoint, operationLogDTO); + handleLoginSceneUserId(operationLogDTO, joinPoint, businessResult); + } catch (Exception e) { + log.error("异步处理日志信息失败", e); + } + saveOperationLogAsync(operationLogDTO); + }); + } + /** * 收集请求上下文(IP、用户ID等) */ diff --git a/src/main/java/com/project/operation/domain/entity/OperationLogEntity.java b/src/main/java/com/project/operation/domain/entity/OperationLogEntity.java index 9488a7d..3d54eeb 100644 --- a/src/main/java/com/project/operation/domain/entity/OperationLogEntity.java +++ b/src/main/java/com/project/operation/domain/entity/OperationLogEntity.java @@ -30,7 +30,7 @@ public class OperationLogEntity extends BaseEntity { @Column(name = "action", columnDefinition = "varchar(255) comment '操作'") private String action; - @Column(name = "description" , columnDefinition="varchar(255) comment '操作描述'") + @Column(name = "description" , columnDefinition="TEXT comment '操作描述'") private String description; /** 操作结果 */ @@ -41,7 +41,7 @@ public class OperationLogEntity extends BaseEntity { @Column(name = "method", columnDefinition="varchar(255) comment '操作方法路径'") private String method; - @Column(name = "exception", columnDefinition="varchar(255) comment '异常信息(失败时记录)'") + @Column(name = "exception", columnDefinition="TEXT comment '异常信息(失败时记录)'") private String exception; /** 操作耗时(毫秒) */ diff --git a/src/main/java/com/project/operation/domain/service/impl/description/AppealDescriptionStrategy.java b/src/main/java/com/project/operation/domain/service/impl/description/AppealDescriptionStrategy.java index 82204d9..6030ce8 100644 --- a/src/main/java/com/project/operation/domain/service/impl/description/AppealDescriptionStrategy.java +++ b/src/main/java/com/project/operation/domain/service/impl/description/AppealDescriptionStrategy.java @@ -29,9 +29,8 @@ public class AppealDescriptionStrategy implements DescriptionStrategy { return false; } - if (ObjectUtils.isNotEmpty(args) && args[0] instanceof AppealDTO) { - AppealDTO appealDTO = (AppealDTO) args[0]; - if (appealDTO == null || ObjectUtils.isEmpty(appealDTO.getId())) { + if (ObjectUtils.isNotEmpty(args) && args[0] instanceof AppealDTO appealDTO) { + if (ObjectUtils.isEmpty(appealDTO.getId())) { return false; } diff --git a/src/main/java/com/project/operation/domain/service/impl/description/DataDescriptionStrategy.java b/src/main/java/com/project/operation/domain/service/impl/description/DataDescriptionStrategy.java index 7c34237..e8c8356 100644 --- a/src/main/java/com/project/operation/domain/service/impl/description/DataDescriptionStrategy.java +++ b/src/main/java/com/project/operation/domain/service/impl/description/DataDescriptionStrategy.java @@ -1,19 +1,13 @@ package com.project.operation.domain.service.impl.description; -import cn.hutool.core.util.ObjectUtil; -import com.project.appeal.domain.dto.AppealDTO; -import com.project.base.domain.result.Result; -import com.project.information.application.InformationApplicationService; -import com.project.information.application.ProductLineApplicationService; -import com.project.information.domain.dto.InformationDTO; import com.project.information.domain.dto.ProductLineDTO; +import com.project.information.domain.entity.InformationEntity; import com.project.information.domain.entity.ProductLineEntity; -import com.project.information.domain.param.ProductLineParam; -import com.project.information.domain.service.ProductLineBaseService; +import com.project.information.mapper.InformationMapper; +import com.project.information.mapper.ProductLineMapper; import com.project.operation.domain.dto.OperationLogDTO; import com.project.operation.domain.enums.ModuleEnum; import com.project.operation.domain.service.DescriptionStrategy; -import com.project.task.domain.dto.TaskDTO; import lombok.SneakyThrows; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -21,7 +15,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import java.util.AbstractMap; import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -33,15 +26,14 @@ import java.util.stream.Collectors; @Component public class DataDescriptionStrategy implements DescriptionStrategy { @Autowired - private ProductLineBaseService productLineBaseService; + private ProductLineMapper productLineMapper; @Autowired - private InformationApplicationService informationApplicationService; + private InformationMapper informationMapper; @SneakyThrows @Override public Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName) { - if (methodName.equals("save") && ObjectUtils.isNotEmpty(args) && args[0] instanceof ProductLineDTO) { - ProductLineDTO productLineDTO = (ProductLineDTO) args[0]; + if (methodName.equals("save") && ObjectUtils.isNotEmpty(args) && args[0] instanceof ProductLineDTO productLineDTO) { if (productLineDTO.getLeaf() == null || StringUtils.isBlank(productLineDTO.getName())) { return false; @@ -54,15 +46,10 @@ public class DataDescriptionStrategy implements DescriptionStrategy { operationLogDTO.setDescription("【"+ productLineDTO.getName()+"】"); } - if(methodName.equals("delete") && ObjectUtils.isNotEmpty(args) && args[0] instanceof Long){ - Long id = (Long) args[0]; - - if(id==null){ - return false; - } + if(methodName.equals("delete") && ObjectUtils.isNotEmpty(args) && args[0] instanceof Long id){ operationLogDTO.setAction("删除"); - ProductLineEntity productLineEntity = productLineBaseService.getById(id); + ProductLineEntity productLineEntity = productLineMapper.selectByIdIncludeDeleted(id); if (productLineEntity == null){ return false; @@ -70,18 +57,23 @@ public class DataDescriptionStrategy implements DescriptionStrategy { operationLogDTO.setDescription("【"+ productLineEntity.getName()+"】"); } - if (methodName.equals("batchDelete") && ObjectUtils.isNotEmpty(args) && args[0] instanceof String) { - String ids = (String) args[0]; + if (methodName.equals("batchDelete") && ObjectUtils.isNotEmpty(args) && args[0] instanceof String ids) { if (StringUtils.isBlank(ids)){ return false; } - List idList = Arrays.asList(ids.split(",")).stream().map(id -> Long.valueOf(id)).collect(Collectors.toList()); - List informationDTOList = informationApplicationService.selectBatchIds(idList); + List idList = Arrays.stream(ids.split(",")) + .filter(StringUtils::isNotBlank) + .map(Long::valueOf) + .collect(Collectors.toList()); + if (idList.isEmpty()) { + return false; + } + List infoEntities = informationMapper.selectBatchIdsIncludeDeleted(idList); operationLogDTO.setAction(idList.size() == 1 ? "删除" : "批量删除"); - if (CollectionUtils.isEmpty(informationDTOList)){ + if (CollectionUtils.isEmpty(infoEntities)){ return false; } - String description = informationDTOList.stream() + String description = infoEntities.stream() .map(informationDTO ->{ String taskName = Optional.ofNullable(informationDTO.getName()).orElse("未知文件"); return "【" + informationDTO.getName() + "】"; @@ -97,4 +89,4 @@ public class DataDescriptionStrategy implements DescriptionStrategy { public String getStrategyName() { return ModuleEnum.DATA_MANAGEMENT.name(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/project/operation/domain/service/impl/description/TaskDescriptionStrategy.java b/src/main/java/com/project/operation/domain/service/impl/description/TaskDescriptionStrategy.java index ee67b27..503021b 100644 --- a/src/main/java/com/project/operation/domain/service/impl/description/TaskDescriptionStrategy.java +++ b/src/main/java/com/project/operation/domain/service/impl/description/TaskDescriptionStrategy.java @@ -3,14 +3,15 @@ package com.project.operation.domain.service.impl.description; import com.project.operation.domain.dto.OperationLogDTO; import com.project.operation.domain.enums.ModuleEnum; import com.project.operation.domain.service.DescriptionStrategy; -import com.project.task.application.TaskApplicationService; import com.project.task.domain.dto.TaskDTO; +import com.project.task.domain.entity.TaskEntity; +import com.project.task.mapper.TaskMapper; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.Arrays; + import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -21,38 +22,37 @@ import java.util.stream.Collectors; @Component public class TaskDescriptionStrategy implements DescriptionStrategy { @Autowired - private TaskApplicationService taskApplicationService; + private TaskMapper taskMapper; @Override - public Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName) { - if (methodName.equals("save") && ObjectUtils.isNotEmpty(args) && args[0] instanceof TaskDTO) { - TaskDTO taskDTO = (TaskDTO) args[0]; + public Boolean process(Object[] args, OperationLogDTO operationLogDTO, String methodName) { + if (methodName.equals("save") && ObjectUtils.isNotEmpty(args) && args[0] instanceof TaskDTO taskDTO) { //设置操作 - if (taskDTO.getId() == null){ + if (taskDTO.getId() == null) { operationLogDTO.setAction("创建"); - }else { + } else { operationLogDTO.setAction("编辑"); } //构建操作详细信息 - if (StringUtils.isBlank(taskDTO.getName())){ + if (StringUtils.isBlank(taskDTO.getName())) { return false; } - operationLogDTO.setDescription("【"+ taskDTO.getName() +"】"); + operationLogDTO.setDescription("【" + taskDTO.getName() + "】"); return true; } if (methodName.equals("batchDelete") && ObjectUtils.isNotEmpty(args) && args[0] instanceof List) { List taskIdList = (List) args[0]; - if (CollectionUtils.isEmpty(taskIdList)){ + if (CollectionUtils.isEmpty(taskIdList)) { operationLogDTO.setAction("批量删除"); return false; } - List taskDTOList = taskApplicationService.selectBatchIds(taskIdList); + List taskEntities = taskMapper.selectBatchIdsIncludeDeleted(taskIdList); operationLogDTO.setAction(taskIdList.size() == 1 ? "删除" : "批量删除"); - String description = taskDTOList.stream() - .map(taskDTO -> { - String taskName = Optional.ofNullable(taskDTO.getName()).orElse("未知任务"); + String description = taskEntities.stream() + .map(task -> { + String taskName = Optional.ofNullable(task.getName()).orElse("未知任务"); return "【" + taskName + "】"; }) .collect(Collectors.joining(",")); diff --git a/src/main/java/com/project/task/mapper/TaskMapper.java b/src/main/java/com/project/task/mapper/TaskMapper.java index cd74586..f409ec3 100644 --- a/src/main/java/com/project/task/mapper/TaskMapper.java +++ b/src/main/java/com/project/task/mapper/TaskMapper.java @@ -17,6 +17,14 @@ import java.util.Set; @Mapper public interface TaskMapper extends BaseMapper { + @Select({ + "" + }) + List selectBatchIdsIncludeDeleted(@Param("list") List idList); + /** * 考生端分页查询任务(JOIN evaluator_task_user 替代子查询) */