فهرست منبع

3.4.6 20250619 bug修复

xiaofei 2 روز پیش
والد
کامیت
3bcd771e83

+ 3 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DownloadServiceImpl.java

@@ -25,11 +25,8 @@ import com.qmth.teachcloud.common.mapper.BasicAttachmentMapper;
 import com.qmth.teachcloud.common.service.AttachmentCommonService;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
 import com.qmth.teachcloud.common.service.SysUserService;
-import com.qmth.teachcloud.common.util.Base64Util;
-import com.qmth.teachcloud.common.util.ConvertUtil;
+import com.qmth.teachcloud.common.util.*;
 import com.qmth.distributed.print.business.util.ExamTaskUtil;
-import com.qmth.teachcloud.common.util.HtmlToPdfUtil;
-import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -160,7 +157,8 @@ public class DownloadServiceImpl implements DownloadService {
             }
             String zipName = examTask.getCourseName() + "未曝光试卷" + SystemConstant.ZIP_PREFIX;
             SysUser sysUser = sysUserService.getById(ServletUtil.getRequestUserId());
-            attachmentCommonService.zipFiles(response, rootPath, zipName, fileList, new String(Base64Util.decode(sysUser.getPassword())));
+//            attachmentCommonService.zipFiles(response, rootPath, zipName, fileList, new String(Base64Util.decode(sysUser.getPassword())));
+            FileUtil.downloadEncryptZip(response, new File(rootPath), zipName, new String(Base64Util.decode(sysUser.getPassword())));
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
         } finally {

+ 3 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardModelFourServiceImpl.java

@@ -522,11 +522,11 @@ public class ExamCardModelFourServiceImpl extends ServiceImpl<ExamCardModelFourM
             }
 
             String zipFileName = title + SystemConstant.ZIP_PREFIX;
-            SysUser sysUser = sysUserService.getById(ServletUtil.getRequestUserId());
+//            SysUser sysUser = sysUserService.getById(ServletUtil.getRequestUserId());
             if (output) {
-                FileUtil.downloadEncryptZip(ServletUtil.getResponse(), downloadPathFile, zipFileName, new String(Base64Util.decode(sysUser.getPassword())));
+                FileUtil.downloadEncryptZip(ServletUtil.getResponse(), downloadPathFile, zipFileName, null);
             } else {
-                FileUtil.downloadEncryptZip(downloadPathFile, zipFileName, new String(Base64Util.decode(sysUser.getPassword())));
+                FileUtil.downloadEncryptZip(downloadPathFile, zipFileName, null);
             }
             map.put("rootPath", rootPath);
             map.put("zipFilePath", rootPath + File.separator + zipFileName);

+ 42 - 47
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java

@@ -504,8 +504,8 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
             }
 
             String zipFileName = title + SystemConstant.ZIP_PREFIX;
-            SysUser sysUser = sysUserService.getById(ServletUtil.getRequestUserId());
-            FileUtil.downloadEncryptZip(response, downloadPathFile, zipFileName, new String(Base64Util.decode(sysUser.getPassword())));
+//            SysUser sysUser = sysUserService.getById(ServletUtil.getRequestUserId());
+            FileUtil.downloadEncryptZip(response, downloadPathFile, zipFileName, null);
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
@@ -517,56 +517,51 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
 
     @Override
     public List<CardJpgResult> listCardImage(Long examId, String paperNumber, Integer serialNumber) {
-        ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamIdAndPaperNumberAndSerialNumber(examId, paperNumber, serialNumber);
-        List<CardJpgResult> cardJpgResultList = new ArrayList<>();
-
-        if (examTaskDetail == null) {
-            BasicExam basicExam = basicExamService.getById(examId);
-            if (ExamModelEnum.MODEL4.equals(basicExam.getExamModel())) {
-                MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
-                if (markPaper != null) {
-                    ExamCardModelFour examCardModelFour = this.baseMapper.getExamCardModelFourByExamIdAndCourseId(examId, markPaper.getCourseId());
-                    if (examCardModelFour != null) {
-                        List<ConvertJpgStorage> convertJpgStorageList = JSONObject.parseArray(examCardModelFour.getJpgAttachment(), ConvertJpgStorage.class);
-                        cardJpgResultList.addAll(convertJpgStorageList.stream().flatMap(e -> {
-                            BasicAttachment basicAttachment = basicAttachmentService.getById(e.getAttachmentId());
-
-                            CardJpgResult cardJpgResult = new CardJpgResult();
-                            cardJpgResult.setName(basicAttachment.getName());
-                            cardJpgResult.setIndex(e.getIndex());
-                            cardJpgResult.setPath(teachcloudCommonService.filePreview(basicAttachment.getPath()));
-                            return Stream.of(cardJpgResult);
-                        }).collect(Collectors.toList()));
+        // 1.优先取扫描卡格式图片
+        List<CardJpgResult> cardJpgResultList = scanAnswerCardService.listPageImage(examId, paperNumber);
+
+        if (CollectionUtils.isEmpty(cardJpgResultList)) {
+            ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamIdAndPaperNumberAndSerialNumber(examId, paperNumber, serialNumber);
+            if (examTaskDetail == null) {
+                BasicExam basicExam = basicExamService.getById(examId);
+                if (ExamModelEnum.MODEL4.equals(basicExam.getExamModel())) {
+                    MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+                    if (markPaper != null) {
+                        ExamCardModelFour examCardModelFour = this.baseMapper.getExamCardModelFourByExamIdAndCourseId(examId, markPaper.getCourseId());
+                        if (examCardModelFour != null) {
+                            List<ConvertJpgStorage> convertJpgStorageList = JSONObject.parseArray(examCardModelFour.getJpgAttachment(), ConvertJpgStorage.class);
+                            cardJpgResultList.addAll(convertJpgStorageList.stream().flatMap(e -> {
+                                BasicAttachment basicAttachment = basicAttachmentService.getById(e.getAttachmentId());
+
+                                CardJpgResult cardJpgResult = new CardJpgResult();
+                                cardJpgResult.setName(basicAttachment.getName());
+                                cardJpgResult.setIndex(e.getIndex());
+                                cardJpgResult.setPath(teachcloudCommonService.filePreview(basicAttachment.getPath()));
+                                return Stream.of(cardJpgResult);
+                            }).collect(Collectors.toList()));
+                        }
                     }
                 }
-            }
-            if (CollectionUtils.isNotEmpty(cardJpgResultList)) {
-                return cardJpgResultList;
-            } else {
-                return scanAnswerCardService.listPageImage(examId, paperNumber);
-            }
-        }
+            } else if (Objects.nonNull(examTaskDetail) && Objects.nonNull(examTaskDetail.getPaperAttachmentIds())) {
+                List<PaperInfoVo> paperInfoVoList = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds());
+                // AB卷共用同一份题卡
+                ExamCard examCard = this.getById(paperInfoVoList.get(0).getCardId());
+                if (examCard == null || StringUtils.isBlank(examCard.getJpgAttachment())) {
+                    return Collections.emptyList();
+                }
+
+                List<ConvertJpgStorage> convertJpgStorageList = JSONObject.parseArray(examCard.getJpgAttachment(), ConvertJpgStorage.class);
+                cardJpgResultList.addAll(convertJpgStorageList.stream().flatMap(e -> {
+                    BasicAttachment basicAttachment = basicAttachmentService.getById(e.getAttachmentId());
 
-        if (Objects.nonNull(examTaskDetail) && Objects.nonNull(examTaskDetail.getPaperAttachmentIds())) {
-            List<PaperInfoVo> paperInfoVoList = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds());
-            // AB卷共用同一份题卡
-            ExamCard examCard = this.getById(paperInfoVoList.get(0).getCardId());
-            if (examCard == null || StringUtils.isBlank(examCard.getJpgAttachment())) {
-                return Collections.emptyList();
+                    CardJpgResult cardJpgResult = new CardJpgResult();
+                    cardJpgResult.setName(basicAttachment.getName());
+                    cardJpgResult.setIndex(e.getIndex());
+                    cardJpgResult.setPath(teachcloudCommonService.filePreview(basicAttachment.getPath()));
+                    return Stream.of(cardJpgResult);
+                }).collect(Collectors.toList()));
             }
 
-            List<ConvertJpgStorage> convertJpgStorageList = JSONObject.parseArray(examCard.getJpgAttachment(), ConvertJpgStorage.class);
-            cardJpgResultList.addAll(convertJpgStorageList.stream().flatMap(e -> {
-                BasicAttachment basicAttachment = basicAttachmentService.getById(e.getAttachmentId());
-
-                CardJpgResult cardJpgResult = new CardJpgResult();
-                cardJpgResult.setName(basicAttachment.getName());
-                cardJpgResult.setIndex(e.getIndex());
-                cardJpgResult.setPath(teachcloudCommonService.filePreview(basicAttachment.getPath()));
-                return Stream.of(cardJpgResult);
-            }).collect(Collectors.toList()));
-        } else {
-            return scanAnswerCardService.listPageImage(examId, paperNumber);
         }
         return cardJpgResultList;
     }

+ 3 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/ConvertUtil.java

@@ -99,7 +99,7 @@ public class ConvertUtil {
         DateTime startDate = DateDisposeUtils.parseExamDateTime(startTimeStr);
         DateTime endDate = DateDisposeUtils.parseExamDateTime(endTimeStr);
         if (Objects.isNull(startDate) || Objects.isNull(endDate)) {
-            throw ExceptionResultEnum.ERROR.exception("考试日期正确格式为[2023-01-01或2023/01/01]");
+            throw ExceptionResultEnum.ERROR.exception("考试日期正确格式为[2023-01-01或2023/01/01],考试时间正确格式为[08:00-10:00]");
         }
 
         Date start = new Date(startDate.getTime()), end = new Date(endDate.getTime());
@@ -112,10 +112,10 @@ public class ConvertUtil {
             startTime = startDate.getTime();
             endTime = endDate.getTime();
         } catch (ApiException e) {
-            throw ExceptionResultEnum.ERROR.exception("考试日期正确格式为[2023-01-01或2023/09/01],考试时间正确格式为[08:00-10:00]");
+            throw ExceptionResultEnum.ERROR.exception("考试日期正确格式为[2023-01-01或2023/01/01],考试时间正确格式为[08:00-10:00]");
         }
         if (startTime < 0 || endTime < 0) {
-            throw ExceptionResultEnum.ERROR.exception("考试日期正确格式为[2023-01-01或2023/09/01],考试时间正确格式为[08:00-10:00]");
+            throw ExceptionResultEnum.ERROR.exception("考试日期正确格式为[2023-01-01或2023/01/01],考试时间正确格式为[08:00-10:00]");
         }
         if (startTime >= endTime) {
             throw ExceptionResultEnum.ERROR.exception("开始时间不能大于结束时间");

+ 3 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/FileUtil.java

@@ -623,9 +623,9 @@ public class FileUtil {
      * @param zipFileName      压缩zip文件路径+文件名
      */
     public static void downloadEncryptZip(HttpServletResponse response, File downloadPathFile, String zipFileName, String password) {
-        if (StringUtils.isBlank(password)) {
-            password = SystemConstant.ZIP_ENCRYPT_PWD;
-        }
+//        if (StringUtils.isBlank(password)) {
+//            password = SystemConstant.ZIP_ENCRYPT_PWD;
+//        }
         // 压缩zip文件和图片保存文件夹放在同一级
         File zipFile = new File(downloadPathFile.getParent(), zipFileName);
         try {

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/Zip4jUtil.java

@@ -94,7 +94,7 @@ public class Zip4jUtil {
             throw ExceptionResultEnum.ERROR.exception("压缩文件必须为zip");
         }
         Optional.ofNullable(destPath).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("压缩路径不能为空"));
-        Optional.ofNullable(password).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("压缩密码不能为空"));
+//        Optional.ofNullable(password).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("压缩密码不能为空"));
         commonZipFile(scrPath, destPath, null, password);
     }
 

+ 13 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/MarkStatusDto.java

@@ -49,6 +49,11 @@ public class MarkStatusDto {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long markedQuestionId;
 
+    /**
+     * 个人评卷分配阅卷数量
+     */
+    private Integer topCount;
+
     public MarkStatusDto() {
     }
 
@@ -138,4 +143,12 @@ public class MarkStatusDto {
     public void setMarkedQuestionId(Long markedQuestionId) {
         this.markedQuestionId = markedQuestionId;
     }
+
+    public Integer getTopCount() {
+        return topCount;
+    }
+
+    public void setTopCount(Integer topCount) {
+        this.topCount = topCount;
+    }
 }

+ 11 - 4
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.core.concurrent.service.ConcurrentService;
 import com.qmth.boot.tools.excel.ExcelWriter;
 import com.qmth.boot.tools.excel.enums.ExcelType;
 import com.qmth.boot.tools.io.ZipReader;
@@ -48,10 +49,8 @@ import com.qmth.teachcloud.mark.dto.mark.score.MarkAiScoreDto;
 import com.qmth.teachcloud.mark.dto.mark.score.MarkPaperPackageDto;
 import com.qmth.teachcloud.mark.dto.mark.score.SettingDto;
 import com.qmth.teachcloud.mark.entity.*;
-import com.qmth.teachcloud.mark.enums.CardSource;
-import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
-import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
-import com.qmth.teachcloud.mark.enums.PaperTypeCheckStatus;
+import com.qmth.teachcloud.mark.enums.*;
+import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.mapper.MarkPaperMapper;
 import com.qmth.teachcloud.mark.service.*;
 import com.qmth.teachcloud.mark.utils.Calculator;
@@ -63,6 +62,7 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -119,6 +119,8 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
     private FileStoreUtils fileStoreUtils;
     @Resource
     private MarkFileService markFileService;
+    @Autowired
+    private LockService lockService;
 
     @Override
     public IPage<MarkSettingDto> listPaperSetting(Long examId, Long openCollegeId, Long courseId, String paperNumber, Boolean groupStatus, Integer pageNumber, Integer pageSize) {
@@ -250,6 +252,11 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                     }
                 }
 
+                if (lockService.isLocked(LockType.SCORE_CALCULATE, markPaper.getId())){
+                    stringJoiner.add(courseInfo + "客观题正在统分,无法结束评卷");
+                    continue;
+                }
+
                 // 主观题是否全部分组
                 List<MarkQuestion> markQuestionSubjectiveList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
                 // 没有主观题,不校验考生评卷

+ 5 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -1015,6 +1015,11 @@ public class MarkServiceImpl implements MarkService {
         dto.setPersonCount(markTaskService.countPersonByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, classNames, questionIds, MarkTaskStatus.WAITING, MarkTaskStatus.REJECTED));
         //问题卷数量
         dto.setProblemCount(markProblemHistoryService.countByExamIdAndPaperNumberAndStatusAndClassNameIn(examId, paperNumber, MarkProblemStatus.WAITING, classNames));
+        // 只有一个小题时,查询分配评卷数量
+        if (CollectionUtils.size(questionIds) == 1) {
+            MarkUserQuestion markUserQuestion = markUserQuestionService.getByExamIdAndPaperNumberAndQuestionIdAndUserId(examId, paperNumber, questionIds.get(0), userId);
+            dto.setTopCount(markUserQuestion != null ? markUserQuestion.getTopCount() : null);
+        }
         return dto;
     }
 

+ 8 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -346,7 +346,12 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
 
             // 任务已全部评完,但未统分
             if (this.countUnmarkByExamIdAndPaperNumberAndStudentId(examId, paperNumber, scoreDetailDto.getStudentId()) > 0) {
-                throw ExceptionResultEnum.ERROR.exception("[" + scoreDetailDto.getStudentName() + "]考生正在统分中,无法结束评卷");
+                throw ExceptionResultEnum.ERROR.exception("[" + scoreDetailDto.getStudentName() + "]考生正在统分中,请等待完成后导出成绩");
+            }
+
+            // 客观题统分中
+            if (lockService.isLocked(LockType.SCORE_CALCULATE, markPaper.getId())){
+                throw ExceptionResultEnum.ERROR.exception("[" + scoreDetailDto.getStudentName() + "]客观题正在统分,请等待完成后导出成绩");
             }
 
             // 格式化分数
@@ -1558,8 +1563,8 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             log.debug("导出Excel结束");
 
             String zipFileName = downloadPathFile.getName() + SystemConstant.ZIP_PREFIX;
-            SysUser sysUser1 = sysUserService.getById(ServletUtil.getRequestUserId());
-            FileUtil.downloadEncryptZip(response, downloadPathFile, zipFileName, new String(Base64Util.decode(sysUser1.getPassword())));
+//            SysUser sysUser1 = sysUserService.getById(ServletUtil.getRequestUserId());
+            FileUtil.downloadEncryptZip(response, downloadPathFile, zipFileName, null);
         } catch (Exception e) {
             throw new RuntimeException(e);
         } finally {