Browse Source

考试期间拍照上传

master
luoweijian 1 month ago
parent
commit
f6191a0ed3
  1. 6
      src/main/java/com/project/ding/utils/DingUtil.java
  2. 4
      src/main/java/com/project/exam/application/ExamRecordApplicationService.java
  3. 16
      src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java
  4. 7
      src/main/java/com/project/exam/controller/ExamRecordController.java
  5. 18
      src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java
  6. 2
      src/main/java/com/project/exam/domain/dto/ExamRecordPictureDTO.java
  7. 22
      src/main/java/com/project/exam/domain/entity/ExamRecordEntity.java
  8. 14
      src/main/java/com/project/exam/domain/enums/ExamRecordPassTextEnum.java
  9. 13
      src/main/java/com/project/exam/domain/param/ExamRecordParam.java
  10. 10
      src/main/java/com/project/exam/domain/service/AdminSearchExamRecordDomainService.java
  11. 95
      src/main/java/com/project/exam/domain/service/impl/AdminSearchExamRecordDomainServiceImpl.java
  12. 5
      src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java
  13. 7
      src/main/java/com/project/information/config/MinioProperties.java
  14. 25
      src/main/java/com/project/information/utils/MinIoUtils.java
  15. 3
      src/main/java/com/project/task/domain/dto/TaskDTO.java
  16. 5
      src/main/java/com/project/task/domain/entity/TaskEntity.java

6
src/main/java/com/project/ding/utils/DingUtil.java

@ -55,8 +55,8 @@ public class DingUtil {
List<DepartmentDTO> list = getAllDepartment();
List<DingUserDTO> userList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
List<DingUserDTO> userInDepartment = getUserIdInDepartment(list.get(i).getId());
for (DepartmentDTO departmentDTO : list) {
List<DingUserDTO> userInDepartment = getUserIdInDepartment(departmentDTO.getId());
userList.addAll(userInDepartment);
}
return userList;
@ -71,7 +71,7 @@ public class DingUtil {
List<DingUserDTO> userInDepartment = getUserIdInDepartment(list.get(i).getId());
userList.addAll(userInDepartment.stream()
.map(UserDTO::fromDingUserDTO)
.collect(Collectors.toList()));
.toList());
}
return userList.stream()
.collect(Collectors.toMap(

4
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<String> stepSave(Long recordId, int index, String answer) throws Exception;
Result<ExamRecordPictureDTO> savePicture(MultipartFile file, Long recordId) throws Exception;
Result<PageResult<ExamRecordDTO>> adminSearch(ExamRecordParam param) throws Exception;
}

16
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<PageResult<ExamRecordDTO>> adminSearch(ExamRecordParam param) throws Exception {
return adminSearchExamRecordDomainService.adminSearch(param);
}
@Override
public Result<ExamRecordDTO> assemblePaper(Long taskId) throws Exception {
return Result.success(assemblePaperDomainService.assemblePaper(taskId , SecurityUtils.getUserId()));

7
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<PageResult<ExamRecordDTO>> adminSearch(ExamRecordParam param) throws Exception{
return examRecordApplicationService.adminSearch(param);
}
@PostMapping("/assemblePaper")
public Result<ExamRecordDTO> assemblePaper(Long taskId) throws Exception{
return examRecordApplicationService.assemblePaper(taskId);

18
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<QuestionSnapshotDTO> answerSnapshotDTOList;
private Long taskId;
private TaskDTO taskDTO;
private Long businessId;
private Long lineId;
private Long subLineId;
private String subLineName;
private String taskName;
private List<ExamRecordPictureDTO> pictureDTOList = new ArrayList<>();
@Data
public static class QuestionSnapshotDTO {
private Long questionId;

2
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;
}

22
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;

14
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<String> {
Pass("通过" , "<span style='color: #333333;'>通过</span>") ,
Fail("未通过" , "<span style='color: #ff0000;'>未通过</span>");
private final String value;
private final String html;
}

13
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;
}

10
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<PageResult<ExamRecordDTO>> adminSearch(ExamRecordParam param) throws Exception;
}

95
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<PageResult<ExamRecordDTO>> adminSearch(ExamRecordParam param) throws Exception {
LambdaQueryWrapper<ExamRecordEntity> 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<ExamRecordEntity> examRecordEntityIPage = examRecordBaseService.page(
PageConverter.toMpPage(param),
queryWrapper);
IPage<ExamRecordDTO> examRecordDTOIPage = examRecordEntityIPage.convert(this::buildDTO);
return Result.page(examRecordDTOIPage);
}
private ExamRecordDTO buildDTO(ExamRecordEntity entity) {
ExamRecordDTO dto = entity.toDTO(ExamRecordDTO::new);
// 抓拍照片信息,只查三个
List<ExamRecordPictureDTO> 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;
}
}

5
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);

7
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 = "";
}

25
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 {
//单文件,不需要合并

3
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;
}

5
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")

Loading…
Cancel
Save