diff --git a/src/main/java/com/project/ding/utils/DingUtil.java b/src/main/java/com/project/ding/utils/DingUtil.java index 8e7243b..1653575 100644 --- a/src/main/java/com/project/ding/utils/DingUtil.java +++ b/src/main/java/com/project/ding/utils/DingUtil.java @@ -55,8 +55,8 @@ public class DingUtil { List list = getAllDepartment(); List userList = new ArrayList<>(); - for (int i = 0; i < list.size(); i++) { - List userInDepartment = getUserIdInDepartment(list.get(i).getId()); + for (DepartmentDTO departmentDTO : list) { + List userInDepartment = getUserIdInDepartment(departmentDTO.getId()); userList.addAll(userInDepartment); } return userList; @@ -71,7 +71,7 @@ public class DingUtil { List userInDepartment = getUserIdInDepartment(list.get(i).getId()); userList.addAll(userInDepartment.stream() .map(UserDTO::fromDingUserDTO) - .collect(Collectors.toList())); + .toList()); } return userList.stream() .collect(Collectors.toMap( diff --git a/src/main/java/com/project/exam/application/ExamRecordApplicationService.java b/src/main/java/com/project/exam/application/ExamRecordApplicationService.java index 2d78605..8078285 100644 --- a/src/main/java/com/project/exam/application/ExamRecordApplicationService.java +++ b/src/main/java/com/project/exam/application/ExamRecordApplicationService.java @@ -1,8 +1,10 @@ package com.project.exam.application; +import com.project.base.domain.result.PageResult; import com.project.base.domain.result.Result; import com.project.exam.domain.dto.ExamRecordDTO; import com.project.exam.domain.dto.ExamRecordPictureDTO; +import com.project.exam.domain.param.ExamRecordParam; import org.springframework.web.multipart.MultipartFile; public interface ExamRecordApplicationService { @@ -14,4 +16,6 @@ public interface ExamRecordApplicationService { Result stepSave(Long recordId, int index, String answer) throws Exception; Result savePicture(MultipartFile file, Long recordId) throws Exception; + + Result> adminSearch(ExamRecordParam param) throws Exception; } diff --git a/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java b/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java index 7ce897c..1b8a394 100644 --- a/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java +++ b/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java @@ -1,14 +1,13 @@ package com.project.exam.application.impl; +import com.project.base.domain.result.PageResult; import com.project.base.domain.result.Result; import com.project.ding.utils.SecurityUtils; import com.project.exam.application.ExamRecordApplicationService; import com.project.exam.domain.dto.ExamRecordDTO; import com.project.exam.domain.dto.ExamRecordPictureDTO; -import com.project.exam.domain.service.AssemblePaperDomainService; -import com.project.exam.domain.service.SaveExamRecordPictureDomainService; -import com.project.exam.domain.service.StepSaveExamRecordDomainService; -import com.project.exam.domain.service.SubmitPaperDomainService; +import com.project.exam.domain.param.ExamRecordParam; +import com.project.exam.domain.service.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -27,6 +26,15 @@ public class ExamRecordApplicationServiceImpl implements ExamRecordApplicationSe @Autowired private SaveExamRecordPictureDomainService saveExamRecordPictureDomainService; + @Autowired + private AdminSearchExamRecordDomainService adminSearchExamRecordDomainService; + + + @Override + public Result> adminSearch(ExamRecordParam param) throws Exception { + return adminSearchExamRecordDomainService.adminSearch(param); + } + @Override public Result assemblePaper(Long taskId) throws Exception { return Result.success(assemblePaperDomainService.assemblePaper(taskId , SecurityUtils.getUserId())); diff --git a/src/main/java/com/project/exam/controller/ExamRecordController.java b/src/main/java/com/project/exam/controller/ExamRecordController.java index dd95c7a..7cc5fe2 100644 --- a/src/main/java/com/project/exam/controller/ExamRecordController.java +++ b/src/main/java/com/project/exam/controller/ExamRecordController.java @@ -1,10 +1,12 @@ package com.project.exam.controller; +import com.project.base.domain.result.PageResult; import com.project.base.domain.result.Result; import com.project.exam.application.ExamRecordApplicationService; import com.project.exam.domain.dto.ExamRecordDTO; import com.project.exam.domain.dto.ExamRecordPictureDTO; +import com.project.exam.domain.param.ExamRecordParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -16,6 +18,11 @@ import org.springframework.web.multipart.MultipartFile; public class ExamRecordController { @Autowired private ExamRecordApplicationService examRecordApplicationService; + + @PostMapping("/adminSearch") + public Result> adminSearch(ExamRecordParam param) throws Exception{ + return examRecordApplicationService.adminSearch(param); + } @PostMapping("/assemblePaper") public Result assemblePaper(Long taskId) throws Exception{ return examRecordApplicationService.assemblePaper(taskId); diff --git a/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java b/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java index 9d2c5cb..ea94ef7 100644 --- a/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java +++ b/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java @@ -7,6 +7,7 @@ import com.project.task.domain.dto.TaskDTO; import lombok.Data; import org.springframework.beans.BeanUtils; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; @@ -17,13 +18,28 @@ public class ExamRecordDTO extends BaseDTO { private Long id; private Long taskUserId; private Double score; - private Boolean pass; + private Boolean pass = Boolean.FALSE; + + private String passText; + + private String passHtml; + private Date startTime; private Date submitTime; private List answerSnapshotDTOList; private Long taskId; private TaskDTO taskDTO; + + private Long businessId; + private Long lineId; + private Long subLineId; + private String subLineName; + + private String taskName; + + private List pictureDTOList = new ArrayList<>(); + @Data public static class QuestionSnapshotDTO { private Long questionId; diff --git a/src/main/java/com/project/exam/domain/dto/ExamRecordPictureDTO.java b/src/main/java/com/project/exam/domain/dto/ExamRecordPictureDTO.java index 7684c01..d500af0 100644 --- a/src/main/java/com/project/exam/domain/dto/ExamRecordPictureDTO.java +++ b/src/main/java/com/project/exam/domain/dto/ExamRecordPictureDTO.java @@ -11,4 +11,6 @@ public class ExamRecordPictureDTO extends BaseDTO { private String fileSuffix; private String filePath; + private String previewUrl; + } diff --git a/src/main/java/com/project/exam/domain/entity/ExamRecordEntity.java b/src/main/java/com/project/exam/domain/entity/ExamRecordEntity.java index d347d55..897889e 100644 --- a/src/main/java/com/project/exam/domain/entity/ExamRecordEntity.java +++ b/src/main/java/com/project/exam/domain/entity/ExamRecordEntity.java @@ -24,7 +24,8 @@ import java.util.function.Supplier; @Data @Table(name = "evaluator_exam_record" , - indexes = {@Index(name = "Idx_taskUserId", columnList = "task_user_id")}) + indexes = {@Index(name = "Idx_taskUserId", columnList = "task_user_id") , + @Index(name = "Idx_businessId_lineId_subLineId" , columnList = "business_id , line_id , sub_line_id")}) @Entity @TableName(value = "evaluator_exam_record" , autoResultMap = true) @EqualsAndHashCode(callSuper = true) @@ -33,6 +34,25 @@ public class ExamRecordEntity extends BaseEntity { @Id private Long id; + @Column(name = "business_id") + @TableField("business_id") + @Comment("事业部ID") + private Long businessId; + + @Column(name = "line_id") + @Comment("所属产品线ID") + @TableField("line_id") + private Long lineId; + + @Column(name = "sub_line_id") + @Comment("所属子产品线ID") + @TableField("sub_line_id") + private Long subLineId; + + @Column(name = "task_name" , columnDefinition="varchar(550) comment '任务名称'") + @TableField("task_name") + private String taskName; + @TableField("task_user_id") @Column(name = "task_user_id" , columnDefinition="bigint(20) comment '关联TaskUserEntity'") private Long taskUserId; diff --git a/src/main/java/com/project/exam/domain/enums/ExamRecordPassTextEnum.java b/src/main/java/com/project/exam/domain/enums/ExamRecordPassTextEnum.java new file mode 100644 index 0000000..1a60b1b --- /dev/null +++ b/src/main/java/com/project/exam/domain/enums/ExamRecordPassTextEnum.java @@ -0,0 +1,14 @@ +package com.project.exam.domain.enums; + +import com.project.base.domain.enums.HasValueEnum; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum ExamRecordPassTextEnum implements HasValueEnum { + Pass("通过" , "通过") , + Fail("未通过" , "未通过"); + private final String value; + private final String html; +} diff --git a/src/main/java/com/project/exam/domain/param/ExamRecordParam.java b/src/main/java/com/project/exam/domain/param/ExamRecordParam.java new file mode 100644 index 0000000..e43cfff --- /dev/null +++ b/src/main/java/com/project/exam/domain/param/ExamRecordParam.java @@ -0,0 +1,13 @@ +package com.project.exam.domain.param; + +import com.project.base.domain.param.BaseParam; +import lombok.Data; + +@Data +public class ExamRecordParam extends BaseParam { + private Long businessId; + private Long lineId; + private Long subLineId; + + private String taskName; +} diff --git a/src/main/java/com/project/exam/domain/service/AdminSearchExamRecordDomainService.java b/src/main/java/com/project/exam/domain/service/AdminSearchExamRecordDomainService.java new file mode 100644 index 0000000..fd162f0 --- /dev/null +++ b/src/main/java/com/project/exam/domain/service/AdminSearchExamRecordDomainService.java @@ -0,0 +1,10 @@ +package com.project.exam.domain.service; + +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; +import com.project.exam.domain.dto.ExamRecordDTO; +import com.project.exam.domain.param.ExamRecordParam; + +public interface AdminSearchExamRecordDomainService { + Result> adminSearch(ExamRecordParam param) throws Exception; +} diff --git a/src/main/java/com/project/exam/domain/service/impl/AdminSearchExamRecordDomainServiceImpl.java b/src/main/java/com/project/exam/domain/service/impl/AdminSearchExamRecordDomainServiceImpl.java new file mode 100644 index 0000000..4fd2504 --- /dev/null +++ b/src/main/java/com/project/exam/domain/service/impl/AdminSearchExamRecordDomainServiceImpl.java @@ -0,0 +1,95 @@ +package com.project.exam.domain.service.impl; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; +import com.project.base.domain.utils.PageConverter; +import com.project.exam.domain.dto.ExamRecordDTO; +import com.project.exam.domain.dto.ExamRecordPictureDTO; +import com.project.exam.domain.entity.ExamRecordEntity; +import com.project.exam.domain.entity.ExamRecordPictureEntity; +import com.project.exam.domain.enums.ExamRecordPassTextEnum; +import com.project.exam.domain.param.ExamRecordParam; +import com.project.exam.domain.service.AdminSearchExamRecordDomainService; +import com.project.exam.domain.service.ExamRecordBaseService; +import com.project.exam.domain.service.ExamRecordPictureBaseService; +import com.project.information.domain.entity.ProductLineEntity; +import com.project.information.domain.service.ProductLineBaseService; +import com.project.information.utils.MinIoUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +@Service +public class AdminSearchExamRecordDomainServiceImpl implements AdminSearchExamRecordDomainService { + + @Autowired + private ExamRecordBaseService examRecordBaseService; + + @Autowired + private ProductLineBaseService productLineBaseService; + + @Autowired + private ExamRecordPictureBaseService examRecordPictureBaseService; + + @Autowired + private MinIoUtils minIoUtils; + + @Override + public Result> adminSearch(ExamRecordParam param) throws Exception { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (Objects.nonNull(param.getBusinessId())) { + queryWrapper.eq(ExamRecordEntity::getBusinessId , param.getBusinessId()); + } + if (Objects.nonNull(param.getLineId())) { + queryWrapper.eq(ExamRecordEntity::getLineId , param.getLineId()); + } + if (Objects.nonNull(param.getSubLineId())) { + queryWrapper.eq(ExamRecordEntity::getSubLineId , param.getSubLineId()); + } + if (StrUtil.isNotBlank(param.getTaskName())) { + queryWrapper.eq(ExamRecordEntity::getTaskName , param.getTaskName()); + } + + IPage examRecordEntityIPage = examRecordBaseService.page( + PageConverter.toMpPage(param), + queryWrapper); + IPage examRecordDTOIPage = examRecordEntityIPage.convert(this::buildDTO); + + return Result.page(examRecordDTOIPage); + } + + private ExamRecordDTO buildDTO(ExamRecordEntity entity) { + ExamRecordDTO dto = entity.toDTO(ExamRecordDTO::new); + // 抓拍照片信息,只查三个 + List pictureDTOList = examRecordPictureBaseService.lambdaQuery() + .eq(ExamRecordPictureEntity::getExamRecordId, entity.getId()) + .last("LIMIT 3").list() + .stream().map(this::buildPictureDTO).toList(); + dto.setPictureDTOList(pictureDTOList); + if (Objects.nonNull(dto.getSubLineId())) { + ProductLineEntity productLine = productLineBaseService.getById(dto.getSubLineId()); + dto.setSubLineName(productLine.getName()); + } + if (BooleanUtil.isTrue(dto.getPass())) { + dto.setPassText(ExamRecordPassTextEnum.Pass.getValue()); + dto.setPassHtml(ExamRecordPassTextEnum.Pass.getHtml()); + } else { + dto.setPassText(ExamRecordPassTextEnum.Fail.getValue()); + dto.setPassHtml(ExamRecordPassTextEnum.Fail.getHtml()); + } + + return dto; + } + + private ExamRecordPictureDTO buildPictureDTO(ExamRecordPictureEntity entity) { + ExamRecordPictureDTO dto = entity.toDTO(ExamRecordPictureDTO::new); + dto.setPreviewUrl(minIoUtils.getPreviewUrl(entity.getFilePath())); + return dto; + } +} diff --git a/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java b/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java index 65be34f..81ddfe0 100644 --- a/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java +++ b/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java @@ -146,6 +146,11 @@ public class AssemblePaperDomainServiceImpl implements AssemblePaperDomainServic recordDTO.setTaskDTO(taskDTO); recordDTO.setTaskUserId(taskUserDTO.getId()); recordDTO.setStartTime(new Date()); + recordDTO.setTaskId(taskId); + recordDTO.setBusinessId(taskDTO.getBusinessId()); + recordDTO.setLineId(taskDTO.getLineId()); + recordDTO.setSubLineId(taskDTO.getSubLineId()); + recordDTO.setTaskName(taskDTO.getName()); recordDTO.setAnswerSnapshotDTOList(buildPaperSnapshot(selectedQuestionList)); ExamRecordDTO examRecordDTO = examRecordBaseService.saveDTO(recordDTO, ExamRecordEntity::new, ExamRecordDTO::new); return buildExamRecordDomainService.buildDTO(examRecordDTO); diff --git a/src/main/java/com/project/information/config/MinioProperties.java b/src/main/java/com/project/information/config/MinioProperties.java index d31e2dd..e313d6f 100644 --- a/src/main/java/com/project/information/config/MinioProperties.java +++ b/src/main/java/com/project/information/config/MinioProperties.java @@ -21,4 +21,11 @@ public class MinioProperties { private String secretKey; private String bucket; + /** + * 临时访问时限 + */ + private Integer tempAccessTimeLimit = 2; + + private String tempAccessFileUrl = ""; + } \ No newline at end of file diff --git a/src/main/java/com/project/information/utils/MinIoUtils.java b/src/main/java/com/project/information/utils/MinIoUtils.java index 982f43a..2f008af 100644 --- a/src/main/java/com/project/information/utils/MinIoUtils.java +++ b/src/main/java/com/project/information/utils/MinIoUtils.java @@ -98,6 +98,31 @@ public class MinIoUtils { return result; } + /** + * 生成临时访问链接 + * @param objectName + * @return + */ + public String getPreviewUrl(String objectName) { + + try { + String previewUrl = customMinioClient.getPresignedObjectUrl( + GetPresignedObjectUrlArgs.builder() + .method(Method.GET) + .bucket(minioProperties.getBucket()) + .object(objectName) + .expiry(minioProperties.getTempAccessTimeLimit(), TimeUnit.HOURS) + .build() + ); + if (StrUtil.isNotBlank(minioProperties.getTempAccessFileUrl())) { + previewUrl = previewUrl.replace(minioProperties.getEndpoint() , minioProperties.getTempAccessFileUrl()); + } + return previewUrl; + } catch (Exception e) { + log.error("生成预览链接失败", e); + return ""; + } + } public StreamInfoDTO mergeMultipartUpload(String objectName, String uploadId) { try { //单文件,不需要合并 diff --git a/src/main/java/com/project/task/domain/dto/TaskDTO.java b/src/main/java/com/project/task/domain/dto/TaskDTO.java index c3d541b..4bbb98b 100644 --- a/src/main/java/com/project/task/domain/dto/TaskDTO.java +++ b/src/main/java/com/project/task/domain/dto/TaskDTO.java @@ -47,4 +47,7 @@ public class TaskDTO extends BaseDTO { private String examResultText; + private Long businessId; + + } diff --git a/src/main/java/com/project/task/domain/entity/TaskEntity.java b/src/main/java/com/project/task/domain/entity/TaskEntity.java index 64a8131..d9d06f1 100644 --- a/src/main/java/com/project/task/domain/entity/TaskEntity.java +++ b/src/main/java/com/project/task/domain/entity/TaskEntity.java @@ -45,6 +45,11 @@ public class TaskEntity extends BaseEntity { @TableField("end_time") private Date endTime; + @Column(name = "business_id") + @TableField("business_id") + @Comment("事业部ID") + private Long businessId; + @Column(name = "line_id") @Comment("产品线ID") @TableField("line_id")