diff --git a/src/main/java/com/project/exam/application/ExamRecordApplicationService.java b/src/main/java/com/project/exam/application/ExamRecordApplicationService.java index e0b439d..2d78605 100644 --- a/src/main/java/com/project/exam/application/ExamRecordApplicationService.java +++ b/src/main/java/com/project/exam/application/ExamRecordApplicationService.java @@ -2,6 +2,8 @@ package com.project.exam.application; import com.project.base.domain.result.Result; import com.project.exam.domain.dto.ExamRecordDTO; +import com.project.exam.domain.dto.ExamRecordPictureDTO; +import org.springframework.web.multipart.MultipartFile; public interface ExamRecordApplicationService { @@ -10,4 +12,6 @@ public interface ExamRecordApplicationService { Result submitPaper(Long recordId) throws Exception; Result stepSave(Long recordId, int index, String answer) throws Exception; + + Result savePicture(MultipartFile file, Long recordId) 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 aeffbc1..7ce897c 100644 --- a/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java +++ b/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java @@ -4,11 +4,14 @@ 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 org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; @Service public class ExamRecordApplicationServiceImpl implements ExamRecordApplicationService { @@ -21,11 +24,19 @@ public class ExamRecordApplicationServiceImpl implements ExamRecordApplicationSe @Autowired private SubmitPaperDomainService submitPaperDomainService; + @Autowired + private SaveExamRecordPictureDomainService saveExamRecordPictureDomainService; + @Override public Result assemblePaper(Long taskId) throws Exception { return Result.success(assemblePaperDomainService.assemblePaper(taskId , SecurityUtils.getUserId())); } + @Override + public Result savePicture(MultipartFile file, Long recordId) throws Exception { + return saveExamRecordPictureDomainService.savePicture(file , recordId); + } + @Override public Result submitPaper(Long recordId) throws Exception { return Result.success(submitPaperDomainService.submitPaper(recordId)); diff --git a/src/main/java/com/project/exam/controller/AdminExamRecordController.java b/src/main/java/com/project/exam/controller/AdminExamRecordController.java new file mode 100644 index 0000000..29b6a92 --- /dev/null +++ b/src/main/java/com/project/exam/controller/AdminExamRecordController.java @@ -0,0 +1,16 @@ +package com.project.exam.controller; + + +import com.project.exam.application.ExamRecordApplicationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/admin/examRecord") +public class AdminExamRecordController { + + @Autowired + private ExamRecordApplicationService examRecordApplicationService; + +} diff --git a/src/main/java/com/project/exam/controller/ExamRecordController.java b/src/main/java/com/project/exam/controller/ExamRecordController.java index 6cf48a9..dd95c7a 100644 --- a/src/main/java/com/project/exam/controller/ExamRecordController.java +++ b/src/main/java/com/project/exam/controller/ExamRecordController.java @@ -4,10 +4,12 @@ package com.project.exam.controller; 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 org.springframework.beans.factory.annotation.Autowired; 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.multipart.MultipartFile; @RestController @RequestMapping("/api/examRecord") @@ -30,4 +32,10 @@ public class ExamRecordController { } + @PostMapping("/savePicture") + public Result savePicture(MultipartFile file, Long recordId) throws Exception { + return examRecordApplicationService.savePicture(file , recordId); + } + + } diff --git a/src/main/java/com/project/exam/domain/dto/ExamRecordPictureDTO.java b/src/main/java/com/project/exam/domain/dto/ExamRecordPictureDTO.java new file mode 100644 index 0000000..7684c01 --- /dev/null +++ b/src/main/java/com/project/exam/domain/dto/ExamRecordPictureDTO.java @@ -0,0 +1,14 @@ +package com.project.exam.domain.dto; + +import com.project.base.domain.dto.BaseDTO; +import lombok.Data; + +@Data +public class ExamRecordPictureDTO extends BaseDTO { + private Long id; + private Long examRecordId; + private String name; + private String fileSuffix; + private String filePath; + +} diff --git a/src/main/java/com/project/exam/domain/entity/ExamRecordPictureEntity.java b/src/main/java/com/project/exam/domain/entity/ExamRecordPictureEntity.java new file mode 100644 index 0000000..5d63907 --- /dev/null +++ b/src/main/java/com/project/exam/domain/entity/ExamRecordPictureEntity.java @@ -0,0 +1,39 @@ +package com.project.exam.domain.entity; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.project.base.domain.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@Table(name = "evaluator_exam_record_picture" , + indexes = {@Index(name = "Idx_examRecordId", columnList = "exam_record_id")}) +@Entity +@TableName(value = "evaluator_exam_record_picture" , autoResultMap = true) +@EqualsAndHashCode(callSuper = true) +public class ExamRecordPictureEntity extends BaseEntity { + @TableId(type = IdType.ASSIGN_ID) + @Id + private Long id; + + @TableField("exam_record_id") + @Column(name = "exam_record_id" , columnDefinition="bigint(20) comment '关联ExamRecordEntity'") + private Long examRecordId; + + @Column(name = "name" , columnDefinition="varchar(550) comment '文件名称'") + private String name; + + @Column(name = "file_suffix" , columnDefinition="varchar(50) comment '文件后缀'") + @TableField("file_suffix") + private String fileSuffix; + + + @Column(name = "file_path" , columnDefinition="varchar(550) comment '文件存储路径'") + @TableField("file_path") + private String filePath; +} diff --git a/src/main/java/com/project/exam/domain/service/ExamRecordPictureBaseService.java b/src/main/java/com/project/exam/domain/service/ExamRecordPictureBaseService.java new file mode 100644 index 0000000..55c339b --- /dev/null +++ b/src/main/java/com/project/exam/domain/service/ExamRecordPictureBaseService.java @@ -0,0 +1,7 @@ +package com.project.exam.domain.service; + +import com.project.base.domain.service.IBaseService; +import com.project.exam.domain.entity.ExamRecordPictureEntity; + +public interface ExamRecordPictureBaseService extends IBaseService { +} diff --git a/src/main/java/com/project/exam/domain/service/SaveExamRecordPictureDomainService.java b/src/main/java/com/project/exam/domain/service/SaveExamRecordPictureDomainService.java new file mode 100644 index 0000000..8113e8e --- /dev/null +++ b/src/main/java/com/project/exam/domain/service/SaveExamRecordPictureDomainService.java @@ -0,0 +1,10 @@ +package com.project.exam.domain.service; + +import com.project.base.domain.result.Result; +import com.project.exam.domain.dto.ExamRecordPictureDTO; +import org.springframework.web.multipart.MultipartFile; + +public interface SaveExamRecordPictureDomainService { + + Result savePicture(MultipartFile file, Long recordId) throws Exception; +} diff --git a/src/main/java/com/project/exam/domain/service/impl/ExamRecordPictureBaseServiceImpl.java b/src/main/java/com/project/exam/domain/service/impl/ExamRecordPictureBaseServiceImpl.java new file mode 100644 index 0000000..1ef67a4 --- /dev/null +++ b/src/main/java/com/project/exam/domain/service/impl/ExamRecordPictureBaseServiceImpl.java @@ -0,0 +1,13 @@ +package com.project.exam.domain.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.project.exam.domain.entity.ExamRecordPictureEntity; +import com.project.exam.domain.service.ExamRecordPictureBaseService; +import com.project.exam.mapper.ExamRecordPictureMapper; +import org.springframework.stereotype.Service; + + +@Service +public class ExamRecordPictureBaseServiceImpl extends ServiceImpl implements ExamRecordPictureBaseService { + +} diff --git a/src/main/java/com/project/exam/domain/service/impl/SaveExamRecordPictureDomainServiceImpl.java b/src/main/java/com/project/exam/domain/service/impl/SaveExamRecordPictureDomainServiceImpl.java new file mode 100644 index 0000000..656a495 --- /dev/null +++ b/src/main/java/com/project/exam/domain/service/impl/SaveExamRecordPictureDomainServiceImpl.java @@ -0,0 +1,54 @@ +package com.project.exam.domain.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.IdUtil; +import com.project.base.domain.exception.BusinessErrorException; +import com.project.base.domain.result.Result; +import com.project.exam.domain.dto.ExamRecordPictureDTO; +import com.project.exam.domain.entity.ExamRecordPictureEntity; +import com.project.exam.domain.service.ExamRecordPictureBaseService; +import com.project.exam.domain.service.SaveExamRecordPictureDomainService; +import com.project.information.utils.MinIoUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Date; +import java.util.Objects; + +@Service +public class SaveExamRecordPictureDomainServiceImpl implements SaveExamRecordPictureDomainService { + @Autowired + private MinIoUtils minIoUtils; + + @Autowired + private ExamRecordPictureBaseService examRecordPictureBaseService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Result savePicture(MultipartFile file, Long recordId) throws Exception { + if (Objects.isNull(recordId)) { + throw new BusinessErrorException("考试记录id不能为空"); + } + if (Objects.isNull(file)) { + throw new BusinessErrorException("上传图片不能为空"); + } + String fileName = file.getOriginalFilename(); + String filePath = String.format("%s/%s/%s.%s", + DateUtil.format(new Date(), "yyyyMMdd"), + recordId, + IdUtil.fastSimpleUUID(), + FileNameUtil.extName(fileName)); + minIoUtils.uploadFile(file.getInputStream() , filePath); + ExamRecordPictureDTO pictureDTO = new ExamRecordPictureDTO(); + pictureDTO.setName(fileName); + pictureDTO.setFilePath(filePath); + pictureDTO.setFileSuffix(FileUtil.getSuffix(fileName)); + pictureDTO.setExamRecordId(recordId); + + return Result.success(examRecordPictureBaseService.saveDTO(pictureDTO , ExamRecordPictureEntity::new , ExamRecordPictureDTO::new)); + } +} diff --git a/src/main/java/com/project/exam/mapper/ExamRecordPictureMapper.java b/src/main/java/com/project/exam/mapper/ExamRecordPictureMapper.java new file mode 100644 index 0000000..a69b226 --- /dev/null +++ b/src/main/java/com/project/exam/mapper/ExamRecordPictureMapper.java @@ -0,0 +1,9 @@ +package com.project.exam.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.project.exam.domain.entity.ExamRecordPictureEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ExamRecordPictureMapper extends BaseMapper { +} diff --git a/src/main/java/com/project/information/domain/dto/InformationDTO.java b/src/main/java/com/project/information/domain/dto/InformationDTO.java index 0c69fe9..19fbe0f 100644 --- a/src/main/java/com/project/information/domain/dto/InformationDTO.java +++ b/src/main/java/com/project/information/domain/dto/InformationDTO.java @@ -12,6 +12,8 @@ public class InformationDTO extends BaseDTO { private String name; private String filePath; private Integer parseStatus; + private String fileSuffix; + } diff --git a/src/main/java/com/project/information/domain/service/impl/UploadInformationDomainServiceImpl.java b/src/main/java/com/project/information/domain/service/impl/UploadInformationDomainServiceImpl.java index 50df81d..9d9b365 100644 --- a/src/main/java/com/project/information/domain/service/impl/UploadInformationDomainServiceImpl.java +++ b/src/main/java/com/project/information/domain/service/impl/UploadInformationDomainServiceImpl.java @@ -2,6 +2,7 @@ package com.project.information.domain.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -108,6 +109,7 @@ public class UploadInformationDomainServiceImpl implements UploadInformationDoma informationDTO.setSubLineId(subLineId); informationDTO.setSubLineName(productLine.getName()); informationDTO.setName(fileName); + informationDTO.setFileSuffix(FileUtil.getSuffix(fileName)); informationDTO.setFilePath(filePath); informationDTO.setParseStatus(InformationParseStatusEnum.NotStart.getValue()); informationBaseService.save(informationDTO.toEntity(InformationEntity::new));