From e341f731845ee1d27dda9d68ad9b47a83375ca1b Mon Sep 17 00:00:00 2001 From: luogw <3132758203@qq.com> Date: Mon, 2 Feb 2026 19:38:26 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=97=A5=E5=BF=97=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operation/annotation/OperationLog.java | 2 + .../operation/aop/OperationLogAspect.java | 17 ++++- .../operation/domain/enums/ModuleEnum.java | 24 +++++++ .../domain/service/DescriptionStrategy.java | 19 ++++++ .../AppealDescriptionStrategy.java | 27 ++++++++ .../description/DataDescriptionStrategy.java | 22 +++++++ .../impl/description/DescriptionManager.java | 42 ++++++++++++ .../description/TaskDescriptionStrategy.java | 66 +++++++++++++++++++ .../application/TaskApplicationService.java | 4 +- .../impl/TaskApplicationServiceImpl.java | 9 ++- .../task/controller/TaskController.java | 10 ++- .../service/DeleteTaskDomainService.java | 2 +- .../service/SearchTaskDomainService.java | 4 ++ .../impl/DeleteTaskDomainServiceImpl.java | 9 ++- .../impl/SearchTaskDomainServiceImpl.java | 8 +++ 15 files changed, 251 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/project/operation/domain/enums/ModuleEnum.java create mode 100644 src/main/java/com/project/operation/domain/service/DescriptionStrategy.java create mode 100644 src/main/java/com/project/operation/domain/service/impl/description/AppealDescriptionStrategy.java create mode 100644 src/main/java/com/project/operation/domain/service/impl/description/DataDescriptionStrategy.java create mode 100644 src/main/java/com/project/operation/domain/service/impl/description/DescriptionManager.java create mode 100644 src/main/java/com/project/operation/domain/service/impl/description/TaskDescriptionStrategy.java diff --git a/src/main/java/com/project/operation/annotation/OperationLog.java b/src/main/java/com/project/operation/annotation/OperationLog.java index cc4a530..6b97325 100644 --- a/src/main/java/com/project/operation/annotation/OperationLog.java +++ b/src/main/java/com/project/operation/annotation/OperationLog.java @@ -1,5 +1,7 @@ package com.project.operation.annotation; +import com.project.operation.domain.enums.ModuleEnum; + import java.lang.annotation.*; /** diff --git a/src/main/java/com/project/operation/aop/OperationLogAspect.java b/src/main/java/com/project/operation/aop/OperationLogAspect.java index 942075f..1499e64 100644 --- a/src/main/java/com/project/operation/aop/OperationLogAspect.java +++ b/src/main/java/com/project/operation/aop/OperationLogAspect.java @@ -1,5 +1,6 @@ package com.project.operation.aop; +import cn.hutool.core.util.EnumUtil; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.project.base.domain.result.Result; import com.project.ding.domain.dto.LoginDTO; @@ -7,6 +8,8 @@ import com.project.ding.utils.JwtUtils; import com.project.operation.annotation.OperationLog; import com.project.operation.application.impl.OperationLogApplicationService; import com.project.operation.domain.dto.OperationLogDTO; +import com.project.operation.domain.enums.ModuleEnum; +import com.project.operation.domain.service.impl.description.DescriptionManager; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -36,6 +39,8 @@ public class OperationLogAspect { private JwtUtils jwtUtils; @Autowired private OperationLogApplicationService operationLogApplicationService; + @Autowired + private DescriptionManager descriptionManager; private final ThreadLocal operationLogDTOThreadLocal = new ThreadLocal<>(); @@ -73,8 +78,14 @@ public class OperationLogAspect { //获取操作信息 OperationLog annotation = method.getAnnotation(OperationLog.class); operationLogDTO.setModule(annotation.module()); - operationLogDTO.setAction(annotation.action()); - operationLogDTO.setDescription(annotation.description()); + ModuleEnum moduleEnum = ModuleEnum.findByValue(annotation.module()); + if(moduleEnum != null){ + descriptionManager.process(moduleEnum.name(),joinPoint.getArgs(),operationLogDTO,method.getName()); + }else{ + operationLogDTO.setAction(annotation.action()); + operationLogDTO.setDescription(annotation.description()); + } + Object businessResult; @@ -103,7 +114,7 @@ public class OperationLogAspect { } try { //获取当前登陆用户 - if(operationLogDTO.getMethod().contains("getToken") && result instanceof Result){ + if(operationLogDTO.getMethod().contains("login") && result instanceof Result){ LoginDTO data = ((Result) result).getData(); String userId = jwtUtils.parseToken(data.getToken()).getSubject(); operationLogDTO.setCreatorId(Long.parseLong(userId)); diff --git a/src/main/java/com/project/operation/domain/enums/ModuleEnum.java b/src/main/java/com/project/operation/domain/enums/ModuleEnum.java new file mode 100644 index 0000000..a20dd15 --- /dev/null +++ b/src/main/java/com/project/operation/domain/enums/ModuleEnum.java @@ -0,0 +1,24 @@ +package com.project.operation.domain.enums; + +import com.project.base.domain.enums.HasValueEnum; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum ModuleEnum implements HasValueEnum { + EXAM_TASK("考试任务"), + DATA_MANAGEMENT("资料管理"), + APPEAL_APPROVAL("申诉审批"); + + private final String value; + + public static ModuleEnum findByValue(String value) { + for (ModuleEnum moduleEnum : ModuleEnum.values()) { + if (moduleEnum.getValue().equals(value)) { + return moduleEnum; + } + } + return null; + } +} diff --git a/src/main/java/com/project/operation/domain/service/DescriptionStrategy.java b/src/main/java/com/project/operation/domain/service/DescriptionStrategy.java new file mode 100644 index 0000000..c340b1c --- /dev/null +++ b/src/main/java/com/project/operation/domain/service/DescriptionStrategy.java @@ -0,0 +1,19 @@ +package com.project.operation.domain.service; + +import com.project.operation.domain.dto.OperationLogDTO; + +/** + * 日志记录详细信息 + */ +public interface DescriptionStrategy { + /** + * 获取并构建详细信息 + */ + Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName); + + /** + * 获取策略名称 + * @return 策略名称 + */ + String getStrategyName(); +} 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 new file mode 100644 index 0000000..57ab55a --- /dev/null +++ b/src/main/java/com/project/operation/domain/service/impl/description/AppealDescriptionStrategy.java @@ -0,0 +1,27 @@ +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 org.springframework.stereotype.Component; + +/** + * 申诉审批 + */ +@Component +public class AppealDescriptionStrategy implements DescriptionStrategy { + @Override + public Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName) { + + + if (methodName.equals("save")) { + + } + return null; + } + + @Override + public String getStrategyName() { + return ModuleEnum.APPEAL_APPROVAL.name(); + } +} 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 new file mode 100644 index 0000000..d15e631 --- /dev/null +++ b/src/main/java/com/project/operation/domain/service/impl/description/DataDescriptionStrategy.java @@ -0,0 +1,22 @@ +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 org.springframework.stereotype.Component; + +/** + * 资料管理 + */ +@Component +public class DataDescriptionStrategy implements DescriptionStrategy { + @Override + public Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName) { + return null; + } + + @Override + public String getStrategyName() { + return ModuleEnum.DATA_MANAGEMENT.name(); + } +} diff --git a/src/main/java/com/project/operation/domain/service/impl/description/DescriptionManager.java b/src/main/java/com/project/operation/domain/service/impl/description/DescriptionManager.java new file mode 100644 index 0000000..73833d5 --- /dev/null +++ b/src/main/java/com/project/operation/domain/service/impl/description/DescriptionManager.java @@ -0,0 +1,42 @@ +package com.project.operation.domain.service.impl.description; + +import com.project.operation.domain.dto.OperationLogDTO; +import com.project.operation.domain.service.DescriptionStrategy; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 日志记录详细信息策略管理器 + */ +@Component +@Slf4j +public class DescriptionManager { + private Map strategyMap = new ConcurrentHashMap<>(); + + @Autowired + public DescriptionManager(List strategyList) { + this.strategyMap = strategyList.stream() + .collect(Collectors.toMap(DescriptionStrategy::getStrategyName, Function.identity())); + } + + /** + * 指定使用的策略 + */ + public Boolean process(String strategyName, Object[] args, OperationLogDTO operationLogDTO,String methodName) throws Exception { + DescriptionStrategy descriptionStrategy = strategyMap.get(strategyName); + if (descriptionStrategy == null) { + log.error("未找到构建日志详细信息的策略: {}", strategyName); + return false; + } + + log.info("使用构建日志详细信息策略: {}", strategyName); + return descriptionStrategy.process(args,operationLogDTO,methodName); + } +} 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 new file mode 100644 index 0000000..acde953 --- /dev/null +++ b/src/main/java/com/project/operation/domain/service/impl/description/TaskDescriptionStrategy.java @@ -0,0 +1,66 @@ +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 org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Array; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 考试任务 + */ +@Component +public class TaskDescriptionStrategy implements DescriptionStrategy { + @Autowired + private TaskApplicationService taskApplicationService; + + @Override + public Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName) { + if (methodName.equals("save")) { + TaskDTO taskDTO = (TaskDTO) args[0]; + //设置操作 + if (taskDTO.getId() == null){ + operationLogDTO.setAction("创建"); + }else { + operationLogDTO.setAction("编辑"); + } + //构建操作详细信息 + if (StringUtils.isBlank(taskDTO.getName())){ + return false; + } + operationLogDTO.setDescription("【"+ taskDTO.getName() +"】"); + return true; + } + + if (methodName.equals("batchDelete")) { + String taskIds = (String) args[0]; + if (StringUtils.isBlank(taskIds)){ + return false; + } + List taskIdList = Arrays.asList(taskIds.split(",")).stream().map(id -> Long.parseLong(id)).collect(Collectors.toList()); + List taskDTOList = taskApplicationService.selectBatchIds(taskIdList); + if (taskIdList.size() == 1){ + operationLogDTO.setAction("删除"); + }else{ + operationLogDTO.setAction("批量删除"); + } + operationLogDTO.setDescription(taskDTOList.stream().map(taskDTO -> "【"+ taskDTO.getName() +"】").collect(Collectors.joining(","))); + } + + return true; + } + + @Override + public String getStrategyName() { + return ModuleEnum.EXAM_TASK.name(); + } +} diff --git a/src/main/java/com/project/task/application/TaskApplicationService.java b/src/main/java/com/project/task/application/TaskApplicationService.java index a7521ae..b3cf3d7 100644 --- a/src/main/java/com/project/task/application/TaskApplicationService.java +++ b/src/main/java/com/project/task/application/TaskApplicationService.java @@ -10,9 +10,11 @@ import java.util.List; public interface TaskApplicationService { Result saveOrUpdate(TaskDTO dto) throws Exception; - Result batchDelete(List idList) throws Exception; + Result batchDelete(String ids) throws Exception; Result> search(TaskParam param) throws Exception; Result getDetail(Long id) throws Exception; + + List selectBatchIds(List taskIdList); } diff --git a/src/main/java/com/project/task/application/impl/TaskApplicationServiceImpl.java b/src/main/java/com/project/task/application/impl/TaskApplicationServiceImpl.java index fe5cde9..e67d8de 100644 --- a/src/main/java/com/project/task/application/impl/TaskApplicationServiceImpl.java +++ b/src/main/java/com/project/task/application/impl/TaskApplicationServiceImpl.java @@ -32,8 +32,8 @@ public class TaskApplicationServiceImpl implements TaskApplicationService { @Override - public Result batchDelete(List idList) throws Exception { - return deleteTaskDomainService.batchDelete(idList); + public Result batchDelete(String ids) throws Exception { + return deleteTaskDomainService.batchDelete(ids); } @Override @@ -45,4 +45,9 @@ public class TaskApplicationServiceImpl implements TaskApplicationService { public Result getDetail(Long id) throws Exception { return searchTaskDomainService.getDetail(id); } + + @Override + public List selectBatchIds(List taskIdList) { + return searchTaskDomainService.selectBatchIds(taskIdList); + } } diff --git a/src/main/java/com/project/task/controller/TaskController.java b/src/main/java/com/project/task/controller/TaskController.java index fbfad7c..1c4f3ef 100644 --- a/src/main/java/com/project/task/controller/TaskController.java +++ b/src/main/java/com/project/task/controller/TaskController.java @@ -4,15 +4,13 @@ package com.project.task.controller; import com.project.base.domain.result.PageResult; import com.project.base.domain.result.Result; import com.project.operation.annotation.OperationLog; +import com.project.operation.domain.enums.ModuleEnum; import com.project.task.application.TaskApplicationService; import com.project.task.domain.dto.TaskDTO; import com.project.task.domain.param.TaskParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -43,7 +41,7 @@ public class TaskController { @PostMapping("/batchDelete") @OperationLog(module = "考试任务") - public Result batchDelete(List idList) throws Exception { - return taskApplicationService.batchDelete(idList); + public Result batchDelete(String ids) throws Exception { + return taskApplicationService.batchDelete(ids); } } diff --git a/src/main/java/com/project/task/domain/service/DeleteTaskDomainService.java b/src/main/java/com/project/task/domain/service/DeleteTaskDomainService.java index 2058e08..0a1a6e2 100644 --- a/src/main/java/com/project/task/domain/service/DeleteTaskDomainService.java +++ b/src/main/java/com/project/task/domain/service/DeleteTaskDomainService.java @@ -6,6 +6,6 @@ import java.util.List; public interface DeleteTaskDomainService { - Result batchDelete(List idList) throws Exception; + Result batchDelete(String ids) throws Exception; } diff --git a/src/main/java/com/project/task/domain/service/SearchTaskDomainService.java b/src/main/java/com/project/task/domain/service/SearchTaskDomainService.java index f660739..1c29ba4 100644 --- a/src/main/java/com/project/task/domain/service/SearchTaskDomainService.java +++ b/src/main/java/com/project/task/domain/service/SearchTaskDomainService.java @@ -5,8 +5,12 @@ import com.project.base.domain.result.Result; import com.project.task.domain.dto.TaskDTO; import com.project.task.domain.param.TaskParam; +import java.util.List; + public interface SearchTaskDomainService { Result> search(TaskParam param) throws Exception; Result getDetail(Long id) throws Exception; + + List selectBatchIds(List taskIdList); } diff --git a/src/main/java/com/project/task/domain/service/impl/DeleteTaskDomainServiceImpl.java b/src/main/java/com/project/task/domain/service/impl/DeleteTaskDomainServiceImpl.java index 7034af9..7d2c41c 100644 --- a/src/main/java/com/project/task/domain/service/impl/DeleteTaskDomainServiceImpl.java +++ b/src/main/java/com/project/task/domain/service/impl/DeleteTaskDomainServiceImpl.java @@ -7,9 +7,11 @@ import com.project.base.domain.result.Result; import com.project.task.domain.entity.TaskEntity; import com.project.task.domain.service.DeleteTaskDomainService; import com.project.task.domain.service.TaskBaseService; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Arrays; import java.util.Date; import java.util.List; @@ -18,7 +20,12 @@ public class DeleteTaskDomainServiceImpl implements DeleteTaskDomainService { @Autowired private TaskBaseService taskBaseService; @Override - public Result batchDelete(List idList) throws Exception { + public Result batchDelete(String ids) throws Exception { + if (StringUtils.isBlank(ids)) { + throw new BusinessErrorException("id不能为空"); + } + List idList = Arrays.asList(ids.split(",")); + long count = taskBaseService.count(new LambdaQueryWrapper() .in(TaskEntity::getId, idList) .ge(TaskEntity::getStartTime, DateUtil.beginOfDay(new Date()))); diff --git a/src/main/java/com/project/task/domain/service/impl/SearchTaskDomainServiceImpl.java b/src/main/java/com/project/task/domain/service/impl/SearchTaskDomainServiceImpl.java index 5e11954..c03073b 100644 --- a/src/main/java/com/project/task/domain/service/impl/SearchTaskDomainServiceImpl.java +++ b/src/main/java/com/project/task/domain/service/impl/SearchTaskDomainServiceImpl.java @@ -17,7 +17,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; @Service public class SearchTaskDomainServiceImpl implements SearchTaskDomainService { @@ -62,4 +64,10 @@ public class SearchTaskDomainServiceImpl implements SearchTaskDomainService { TaskEntity taskEntity = taskMapper.selectById(id); return Result.success(buildDTO(taskEntity)); } + + @Override + public List selectBatchIds(List taskIdList) { + List taskEntities = taskMapper.selectBatchIds(taskIdList); + return taskEntities.stream().map(taskEntity -> buildDTO(taskEntity)).collect(Collectors.toList()); + } }