Browse Source

bug修复

master
luogw 2 months ago
parent
commit
34238903b3
  1. 10
      src/main/java/com/project/information/mapper/InformationMapper.java
  2. 25
      src/main/java/com/project/operation/aop/OperationLogAspect.java
  3. 4
      src/main/java/com/project/operation/domain/entity/OperationLogEntity.java
  4. 5
      src/main/java/com/project/operation/domain/service/impl/description/AppealDescriptionStrategy.java
  5. 48
      src/main/java/com/project/operation/domain/service/impl/description/DataDescriptionStrategy.java
  6. 30
      src/main/java/com/project/operation/domain/service/impl/description/TaskDescriptionStrategy.java
  7. 8
      src/main/java/com/project/task/mapper/TaskMapper.java

10
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.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.project.information.domain.entity.InformationEntity; import com.project.information.domain.entity.InformationEntity;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper @Mapper
public interface InformationMapper extends BaseMapper<InformationEntity> { public interface InformationMapper extends BaseMapper<InformationEntity> {
@Select({"<script>",
"SELECT * FROM evaluator_information WHERE id IN",
"<foreach collection='list' item='id' open='(' separator=',' close=')'>#{id}</foreach>",
"</script>"})
List<InformationEntity> selectBatchIdsIncludeDeleted(@Param("list") List<Long> idList);
} }

25
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 org.springframework.web.context.request.ServletRequestAttributes;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.concurrent.CompletableFuture;
/** /**
* 操作日志AOP切面 * 操作日志AOP切面
@ -54,14 +55,10 @@ public class OperationLogAspect {
Object businessResult = null; Object businessResult = null;
try { try {
//收集请求上下文(IP、用户ID等) //收集请求上下文(IP等,不依赖业务结果
collectRequestContext(operationLogDTO); collectRequestContext(operationLogDTO);
//收集方法和注解信息
collectMethodAndAnnotationInfo(joinPoint, operationLogDTO);
//执行业务方法 //执行业务方法
businessResult = joinPoint.proceed(); businessResult = joinPoint.proceed();
//获取用户ID
handleLoginSceneUserId(operationLogDTO, joinPoint, businessResult);
operationLogDTO.setResult(0); operationLogDTO.setResult(0);
} catch (Exception e) { } catch (Exception e) {
operationLogDTO.setResult(1); operationLogDTO.setResult(1);
@ -69,12 +66,28 @@ public class OperationLogAspect {
throw e; throw e;
} finally { } finally {
operationLogDTO.setCostTime(System.currentTimeMillis() - startTime); operationLogDTO.setCostTime(System.currentTimeMillis() - startTime);
saveOperationLogAsync(operationLogDTO); // 异步提交后续处理(策略+用户ID+保存),完全不阻塞主线程
submitLogProcessingAsync(joinPoint, operationLogDTO, businessResult);
} }
return 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等 * 收集请求上下文IP用户ID等
*/ */

4
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 '操作'") @Column(name = "action", columnDefinition = "varchar(255) comment '操作'")
private String action; private String action;
@Column(name = "description" , columnDefinition="varchar(255) comment '操作描述'") @Column(name = "description" , columnDefinition="TEXT comment '操作描述'")
private String description; private String description;
/** 操作结果 */ /** 操作结果 */
@ -41,7 +41,7 @@ public class OperationLogEntity extends BaseEntity {
@Column(name = "method", columnDefinition="varchar(255) comment '操作方法路径'") @Column(name = "method", columnDefinition="varchar(255) comment '操作方法路径'")
private String method; private String method;
@Column(name = "exception", columnDefinition="varchar(255) comment '异常信息(失败时记录)'") @Column(name = "exception", columnDefinition="TEXT comment '异常信息(失败时记录)'")
private String exception; private String exception;
/** 操作耗时(毫秒) */ /** 操作耗时(毫秒) */

5
src/main/java/com/project/operation/domain/service/impl/description/AppealDescriptionStrategy.java

@ -29,9 +29,8 @@ public class AppealDescriptionStrategy implements DescriptionStrategy {
return false; return false;
} }
if (ObjectUtils.isNotEmpty(args) && args[0] instanceof AppealDTO) { if (ObjectUtils.isNotEmpty(args) && args[0] instanceof AppealDTO appealDTO) {
AppealDTO appealDTO = (AppealDTO) args[0]; if (ObjectUtils.isEmpty(appealDTO.getId())) {
if (appealDTO == null || ObjectUtils.isEmpty(appealDTO.getId())) {
return false; return false;
} }

48
src/main/java/com/project/operation/domain/service/impl/description/DataDescriptionStrategy.java

@ -1,19 +1,13 @@
package com.project.operation.domain.service.impl.description; 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.dto.ProductLineDTO;
import com.project.information.domain.entity.InformationEntity;
import com.project.information.domain.entity.ProductLineEntity; import com.project.information.domain.entity.ProductLineEntity;
import com.project.information.domain.param.ProductLineParam; import com.project.information.mapper.InformationMapper;
import com.project.information.domain.service.ProductLineBaseService; import com.project.information.mapper.ProductLineMapper;
import com.project.operation.domain.dto.OperationLogDTO; import com.project.operation.domain.dto.OperationLogDTO;
import com.project.operation.domain.enums.ModuleEnum; import com.project.operation.domain.enums.ModuleEnum;
import com.project.operation.domain.service.DescriptionStrategy; import com.project.operation.domain.service.DescriptionStrategy;
import com.project.task.domain.dto.TaskDTO;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; 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.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.AbstractMap;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -33,15 +26,14 @@ import java.util.stream.Collectors;
@Component @Component
public class DataDescriptionStrategy implements DescriptionStrategy { public class DataDescriptionStrategy implements DescriptionStrategy {
@Autowired @Autowired
private ProductLineBaseService productLineBaseService; private ProductLineMapper productLineMapper;
@Autowired @Autowired
private InformationApplicationService informationApplicationService; private InformationMapper informationMapper;
@SneakyThrows @SneakyThrows
@Override @Override
public Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName) { public Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName) {
if (methodName.equals("save") && ObjectUtils.isNotEmpty(args) && args[0] instanceof ProductLineDTO) { if (methodName.equals("save") && ObjectUtils.isNotEmpty(args) && args[0] instanceof ProductLineDTO productLineDTO) {
ProductLineDTO productLineDTO = (ProductLineDTO) args[0];
if (productLineDTO.getLeaf() == null || StringUtils.isBlank(productLineDTO.getName())) { if (productLineDTO.getLeaf() == null || StringUtils.isBlank(productLineDTO.getName())) {
return false; return false;
@ -54,15 +46,10 @@ public class DataDescriptionStrategy implements DescriptionStrategy {
operationLogDTO.setDescription("【"+ productLineDTO.getName()+"】"); operationLogDTO.setDescription("【"+ productLineDTO.getName()+"】");
} }
if(methodName.equals("delete") && ObjectUtils.isNotEmpty(args) && args[0] instanceof Long){ if(methodName.equals("delete") && ObjectUtils.isNotEmpty(args) && args[0] instanceof Long id){
Long id = (Long) args[0];
if(id==null){
return false;
}
operationLogDTO.setAction("删除"); operationLogDTO.setAction("删除");
ProductLineEntity productLineEntity = productLineBaseService.getById(id); ProductLineEntity productLineEntity = productLineMapper.selectByIdIncludeDeleted(id);
if (productLineEntity == null){ if (productLineEntity == null){
return false; return false;
@ -70,18 +57,23 @@ public class DataDescriptionStrategy implements DescriptionStrategy {
operationLogDTO.setDescription("【"+ productLineEntity.getName()+"】"); operationLogDTO.setDescription("【"+ productLineEntity.getName()+"】");
} }
if (methodName.equals("batchDelete") && ObjectUtils.isNotEmpty(args) && args[0] instanceof String) { if (methodName.equals("batchDelete") && ObjectUtils.isNotEmpty(args) && args[0] instanceof String ids) {
String ids = (String) args[0];
if (StringUtils.isBlank(ids)){ if (StringUtils.isBlank(ids)){
return false; return false;
} }
List<Long> idList = Arrays.asList(ids.split(",")).stream().map(id -> Long.valueOf(id)).collect(Collectors.toList()); List<Long> idList = Arrays.stream(ids.split(","))
List<InformationDTO> informationDTOList = informationApplicationService.selectBatchIds(idList); .filter(StringUtils::isNotBlank)
.map(Long::valueOf)
.collect(Collectors.toList());
if (idList.isEmpty()) {
return false;
}
List<InformationEntity> infoEntities = informationMapper.selectBatchIdsIncludeDeleted(idList);
operationLogDTO.setAction(idList.size() == 1 ? "删除" : "批量删除"); operationLogDTO.setAction(idList.size() == 1 ? "删除" : "批量删除");
if (CollectionUtils.isEmpty(informationDTOList)){ if (CollectionUtils.isEmpty(infoEntities)){
return false; return false;
} }
String description = informationDTOList.stream() String description = infoEntities.stream()
.map(informationDTO ->{ .map(informationDTO ->{
String taskName = Optional.ofNullable(informationDTO.getName()).orElse("未知文件"); String taskName = Optional.ofNullable(informationDTO.getName()).orElse("未知文件");
return "【" + informationDTO.getName() + "】"; return "【" + informationDTO.getName() + "】";
@ -97,4 +89,4 @@ public class DataDescriptionStrategy implements DescriptionStrategy {
public String getStrategyName() { public String getStrategyName() {
return ModuleEnum.DATA_MANAGEMENT.name(); return ModuleEnum.DATA_MANAGEMENT.name();
} }
} }

30
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.dto.OperationLogDTO;
import com.project.operation.domain.enums.ModuleEnum; import com.project.operation.domain.enums.ModuleEnum;
import com.project.operation.domain.service.DescriptionStrategy; 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.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.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -21,38 +22,37 @@ import java.util.stream.Collectors;
@Component @Component
public class TaskDescriptionStrategy implements DescriptionStrategy { public class TaskDescriptionStrategy implements DescriptionStrategy {
@Autowired @Autowired
private TaskApplicationService taskApplicationService; private TaskMapper taskMapper;
@Override @Override
public Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName) { public Boolean process(Object[] args, OperationLogDTO operationLogDTO, String methodName) {
if (methodName.equals("save") && ObjectUtils.isNotEmpty(args) && args[0] instanceof TaskDTO) { if (methodName.equals("save") && ObjectUtils.isNotEmpty(args) && args[0] instanceof TaskDTO taskDTO) {
TaskDTO taskDTO = (TaskDTO) args[0];
//设置操作 //设置操作
if (taskDTO.getId() == null){ if (taskDTO.getId() == null) {
operationLogDTO.setAction("创建"); operationLogDTO.setAction("创建");
}else { } else {
operationLogDTO.setAction("编辑"); operationLogDTO.setAction("编辑");
} }
//构建操作详细信息 //构建操作详细信息
if (StringUtils.isBlank(taskDTO.getName())){ if (StringUtils.isBlank(taskDTO.getName())) {
return false; return false;
} }
operationLogDTO.setDescription("【"+ taskDTO.getName() +"】"); operationLogDTO.setDescription("【" + taskDTO.getName() + "】");
return true; return true;
} }
if (methodName.equals("batchDelete") && ObjectUtils.isNotEmpty(args) && args[0] instanceof List) { if (methodName.equals("batchDelete") && ObjectUtils.isNotEmpty(args) && args[0] instanceof List) {
List<Long> taskIdList = (List) args[0]; List<Long> taskIdList = (List) args[0];
if (CollectionUtils.isEmpty(taskIdList)){ if (CollectionUtils.isEmpty(taskIdList)) {
operationLogDTO.setAction("批量删除"); operationLogDTO.setAction("批量删除");
return false; return false;
} }
List<TaskDTO> taskDTOList = taskApplicationService.selectBatchIds(taskIdList); List<TaskEntity> taskEntities = taskMapper.selectBatchIdsIncludeDeleted(taskIdList);
operationLogDTO.setAction(taskIdList.size() == 1 ? "删除" : "批量删除"); operationLogDTO.setAction(taskIdList.size() == 1 ? "删除" : "批量删除");
String description = taskDTOList.stream() String description = taskEntities.stream()
.map(taskDTO -> { .map(task -> {
String taskName = Optional.ofNullable(taskDTO.getName()).orElse("未知任务"); String taskName = Optional.ofNullable(task.getName()).orElse("未知任务");
return "【" + taskName + "】"; return "【" + taskName + "】";
}) })
.collect(Collectors.joining(",")); .collect(Collectors.joining(","));

8
src/main/java/com/project/task/mapper/TaskMapper.java

@ -17,6 +17,14 @@ import java.util.Set;
@Mapper @Mapper
public interface TaskMapper extends BaseMapper<TaskEntity> { public interface TaskMapper extends BaseMapper<TaskEntity> {
@Select({
"<script>",
"SELECT * FROM evaluator_task WHERE id IN",
"<foreach collection='list' item='id' open='(' separator=',' close=')'>#{id}</foreach>",
"</script>"
})
List<TaskEntity> selectBatchIdsIncludeDeleted(@Param("list") List<Long> idList);
/** /**
* 考生端分页查询任务JOIN evaluator_task_user 替代子查询 * 考生端分页查询任务JOIN evaluator_task_user 替代子查询
*/ */

Loading…
Cancel
Save