diff --git a/common/src/main/java/com/sdm/common/validator/annotation/EnumValue.java b/common/src/main/java/com/sdm/common/validator/annotation/EnumValue.java new file mode 100644 index 00000000..ac18b783 --- /dev/null +++ b/common/src/main/java/com/sdm/common/validator/annotation/EnumValue.java @@ -0,0 +1,21 @@ +package com.sdm.common.validator.annotation; + +import com.sdm.common.validator.validator.EnumValueValidator; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.FIELD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = EnumValueValidator.class) +public @interface EnumValue { + String message() default "无效的枚举值"; + Class[] groups() default {}; + Class[] payload() default {}; + Class> enumClass(); + String enumMethod() default "isValid"; +} \ No newline at end of file diff --git a/common/src/main/java/com/sdm/common/validator/validator/EnumValueValidator.java b/common/src/main/java/com/sdm/common/validator/validator/EnumValueValidator.java new file mode 100644 index 00000000..0e0cdb08 --- /dev/null +++ b/common/src/main/java/com/sdm/common/validator/validator/EnumValueValidator.java @@ -0,0 +1,34 @@ +package com.sdm.common.validator.validator; + +import com.sdm.common.validator.annotation.EnumValue; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +import java.lang.reflect.Method; + +public class EnumValueValidator implements ConstraintValidator { + + private Class> enumClass; + private String enumMethod; + + @Override + public void initialize(EnumValue constraintAnnotation) { + enumClass = constraintAnnotation.enumClass(); + enumMethod = constraintAnnotation.enumMethod(); + } + + @Override + public boolean isValid(Object value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + try { + // 通过反射调用枚举的校验方法 + Method method = enumClass.getMethod(enumMethod, value.getClass()); + Boolean result = (Boolean) method.invoke(null, value); + return result != null && result; + } catch (Exception e) { + return false; + } + } +} diff --git a/project/src/main/java/com/sdm/project/common/TaskQryTypeEnum.java b/project/src/main/java/com/sdm/project/common/TaskQryTypeEnum.java new file mode 100644 index 00000000..3a859b7a --- /dev/null +++ b/project/src/main/java/com/sdm/project/common/TaskQryTypeEnum.java @@ -0,0 +1,29 @@ +package com.sdm.project.common; + +public enum TaskQryTypeEnum { + EXEC(0, "我执行的"), + ATTENTION(1, "我关注的"), + ALL(2, "所有"), + ISSUE(3, "我分发的"); + + private final Integer code; + private final String desc; + + TaskQryTypeEnum(Integer code, String desc) { + this.code = code; + this.desc = desc; + } + + public Integer getCode() { + return code; + } + + public static boolean isValid(Integer code) { + for (TaskQryTypeEnum type : values()) { + if (type.getCode() == code) { + return true; + } + } + return false; + } +} 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 7bc805d6..4ca29f5a 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationTaskController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationTaskController.java @@ -69,7 +69,7 @@ public class SimulationTaskController { */ @PostMapping("/list") @Operation(summary = "任务列表(我执行的、我关注的、所有)", description = "任务列表(我执行的、我关注的、所有)") - public SdmResponse list(@RequestBody SpdmTaskListReq req) { + public SdmResponse list(@Validated @RequestBody SpdmTaskListReq req) { return taskService.list(req); } @@ -80,7 +80,7 @@ public class SimulationTaskController { */ @PostMapping("/count") @Operation(summary = "任务列表计数(我执行的、我关注的、所有)", description = "任务列表计数(我执行的、我关注的、所有)") - public SdmResponse countByStatus(@RequestBody SpdmTaskListReq req) { + public SdmResponse countByStatus(@Validated @RequestBody SpdmTaskListReq req) { return taskService.countByStatus(req); } diff --git a/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java b/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java index ac769f85..bbe3ebfa 100644 --- a/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java +++ b/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java @@ -2,6 +2,8 @@ package com.sdm.project.model.req; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.sdm.common.validator.annotation.EnumValue; +import com.sdm.project.common.TaskQryTypeEnum; import com.sdm.project.model.bo.TaskNodeTag; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -23,6 +25,7 @@ public class SpdmTaskListReq { * 任务类型,0:我执行的 1:我关注的 2:所有 3-我分发的 */ @NotNull(message = "type不能为空") + @EnumValue(enumClass = TaskQryTypeEnum.class, message = "type任务类型无效") private Integer type; /** 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 3070c7b5..a21b929e 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 @@ -86,12 +86,9 @@ public class TaskServiceImpl implements ITaskService { log.error("公司和工号都不能为空"); return SdmResponse.failed("公司和工号都不能为空"); } - // 0:我执行的 1:我关注的 2:所有 + // 0:我执行的 1:我关注的 2:所有 3:我分发的 Integer type = req.getType(); - if (type != 0 && type != 1 && type != 2) { - log.error("type必须为0或1或2"); - return SdmResponse.failed("公司和工号都不能为空"); - } + if (StringUtils.isNotBlank(req.getExeStatus())) { req.setExeStatusList(Arrays.stream(req.getExeStatus().split(",")).toList()); } @@ -246,12 +243,10 @@ public class TaskServiceImpl implements ITaskService { } // task.setPMemberList(eachMemberList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType())).toList()); // task.setEMemberList(eachMemberList.stream().filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType())).toList()); - List pUserIdList = eachMemberList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType())).map(SpdmTaskMemberVo::getUserId).distinct().toList(); + // 由于我分发的、我执行的、我关注的、所有任务,都需要展示仿真负责人,故将负责人抽成方法调用 + setPMemberList(task, eachMemberList); + // 只有所有任务需要展示仿真执行人 List eUserIdList = eachMemberList.stream().filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType())).map(SpdmTaskMemberVo::getUserId).distinct().toList(); - if (CollectionUtils.isNotEmpty(pUserIdList)) { - SdmResponse> cidUserResp= sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(pUserIdList).build()); - task.setPMemberList(cidUserResp.getData()); - } if (CollectionUtils.isNotEmpty(eUserIdList)) { SdmResponse> cidUserResp= sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(eUserIdList).build()); task.setEMemberList(cidUserResp.getData()); @@ -304,6 +299,30 @@ public class TaskServiceImpl implements ITaskService { } List myTaskIdList = taskMemberVoList.stream().map(SpdmTaskMemberVo::getTaskId).toList(); taskList = taskList.stream().filter(task -> myTaskIdList.contains(task.getUuid())).toList(); + + for (SpdmTaskVo task : taskList) { + setPMemberList(task, taskMemberVoList); + } + } + } else if (type == 3) { + // 仿真负责人是当前用户 + if (CollectionUtils.isNotEmpty(taskMemberVoList)) { + SdmResponse cidUserResp = sysUserFeignClient.queryUserDetail(UserQueryReq.builder().userId(userId).build()); + if (ObjectUtils.isEmpty(cidUserResp.getData())) { + log.error("根据jobNumber:{},未查询到用户", userId); + return SdmResponse.success(new ArrayList<>()); + } + taskMemberVoList = taskMemberVoList.stream().filter(taskMember -> MemberTypeEnum.PRINCIPAL.getCode().equals(taskMember.getType()) && userId.equals(taskMember.getUserId())).toList(); + if (CollectionUtils.isEmpty(taskMemberVoList)) { + log.error("任务列表中未查询到仿真负责人"); + return SdmResponse.success(new ArrayList<>()); + } + List myTaskIdList = taskMemberVoList.stream().map(SpdmTaskMemberVo::getTaskId).toList(); + taskList = taskList.stream().filter(task -> myTaskIdList.contains(task.getUuid())).toList(); + + for (SpdmTaskVo task : taskList) { + setPMemberList(task, taskMemberVoList); + } } } else { SdmResponse cidUserResp = sysUserFeignClient.queryUserDetail(UserQueryReq.builder().userId(userId).build()); @@ -327,6 +346,9 @@ public class TaskServiceImpl implements ITaskService { List myTaskIdList = taskAttentionMemberVoList.stream().map(SpdmTaskAttentionMemberVo::getTaskId).toList(); taskList = taskList.stream().filter(task -> myTaskIdList.contains(task.getUuid())).toList(); + for (SpdmTaskVo task : taskList) { + setPMemberList(task, taskMemberVoList); + } } if (CollectionUtils.isEmpty(taskList)) { log.error("taskList为空"); @@ -442,6 +464,15 @@ public class TaskServiceImpl implements ITaskService { return SdmResponse.success(jsonObject); } + private void setPMemberList(SpdmTaskVo task, List eachMemberList) { + // 由于我分发的、我执行的、我关注的、所有任务,都需要展示仿真负责人,故将负责人抽成方法调用 + List pUserIdList = eachMemberList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType())).map(SpdmTaskMemberVo::getUserId).distinct().toList(); + if (CollectionUtils.isNotEmpty(pUserIdList)) { + SdmResponse> cidUserResp= sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(pUserIdList).build()); + task.setPMemberList(cidUserResp.getData()); + } + } + @Override public SdmResponse countByStatus(SpdmTaskListReq req) { String tenantId = ThreadLocalContext.getCompany(); @@ -451,12 +482,8 @@ public class TaskServiceImpl implements ITaskService { log.error("公司和工号都不能为空"); return SdmResponse.failed("公司和工号都不能为空"); } - // 0:我执行的 1:我关注的 2:所有 + // 0:我执行的 1:我关注的 2:所有 3:我分发的 Integer type = req.getType(); - if (type != 0 && type != 1 && type != 2) { - log.error("type必须为0或1或2"); - return SdmResponse.failed("公司和工号都不能为空"); - } List allTaskList = mapper.getTaskList(tenantId, req); // 今明任务 @@ -513,16 +540,26 @@ public class TaskServiceImpl implements ITaskService { log.error("根据jobNumber:{},未查询到用户", userId); return SdmResponse.success(new ArrayList<>()); } - CIDUserResp cidUser = cidUserResp.getData(); - taskMemberVoList = taskMemberVoList.stream().filter(taskMember -> MemberTypeEnum.EXECUTOR.getCode().equals(taskMember.getType())).toList(); + taskMemberVoList = taskMemberVoList.stream().filter(taskMember -> MemberTypeEnum.EXECUTOR.getCode().equals(taskMember.getType()) && userId.equals(taskMember.getUserId())).toList(); if (CollectionUtils.isEmpty(taskMemberVoList)) { - log.error("任务列表中未查询到仿真执行人1"); + log.error("任务列表中未查询到仿真执行人"); return SdmResponse.success(new ArrayList<>()); } - Long curUserId = cidUser.getUserId(); - taskMemberVoList = taskMemberVoList.stream().filter(member -> curUserId.equals(member.getUserId())).toList(); + List myTaskIdList = taskMemberVoList.stream().map(SpdmTaskMemberVo::getTaskId).toList(); + taskList = taskList.stream().filter(task -> myTaskIdList.contains(task.getUuid())).toList(); + countTask(taskList, todayTmrTaskList, taskCountResp); + } + } else if (type == 3) { + // 仿真负责人是当前用户 + if (CollectionUtils.isNotEmpty(taskMemberVoList)) { + SdmResponse cidUserResp = sysUserFeignClient.queryUserDetail(UserQueryReq.builder().userId(userId).build()); + if (ObjectUtils.isEmpty(cidUserResp.getData())) { + log.error("根据jobNumber:{},未查询到用户", userId); + return SdmResponse.success(new ArrayList<>()); + } + taskMemberVoList = taskMemberVoList.stream().filter(taskMember -> MemberTypeEnum.PRINCIPAL.getCode().equals(taskMember.getType()) && userId.equals(taskMember.getUserId())).toList(); if (CollectionUtils.isEmpty(taskMemberVoList)) { - log.error("任务列表中未查询到仿真执行人2"); + log.error("任务列表中未查询到仿真负责人"); return SdmResponse.success(new ArrayList<>()); } List myTaskIdList = taskMemberVoList.stream().map(SpdmTaskMemberVo::getTaskId).toList(); diff --git a/system/src/main/java/com/sdm/system/controller/SysUserController.java b/system/src/main/java/com/sdm/system/controller/SysUserController.java index 358eec6d..8b8613a8 100644 --- a/system/src/main/java/com/sdm/system/controller/SysUserController.java +++ b/system/src/main/java/com/sdm/system/controller/SysUserController.java @@ -84,7 +84,7 @@ public class SysUserController implements ISysUserFeignClient { */ @Operation(summary = "根据用户ids查询用户列表") @PostMapping("/listUserByIds") - public SdmResponse> listUserByIds(@Parameter(description = "用户查询请求参数") @RequestBody @Validated UserQueryReq req) { + public SdmResponse> listUserByIds(@Parameter(description = "用户查询请求参数") @RequestBody UserQueryReq req) { return ISysUserService.listUserByIds(req); }