Quellcode durchsuchen

3.4.4 update-20250407,bug修改

xiaofei vor 2 Monaten
Ursprung
Commit
706cb3c429
17 geänderte Dateien mit 131 neuen und 125 gelöschten Zeilen
  1. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java
  2. 7 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardModelFourServiceImpl.java
  3. 3 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  4. 16 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintFinishServiceImpl.java
  5. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamDetailController.java
  6. 6 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkInspectedController.java
  7. 40 18
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  8. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java
  9. 2 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanAnswerCardService.java
  10. 4 17
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java
  11. 10 11
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java
  12. 4 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanAnswerCardServiceImpl.java
  13. 8 6
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/TaskServiceImpl.java
  14. 8 37
      teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml
  15. 4 2
      teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml
  16. 6 4
      teachcloud-mark/src/main/resources/mapper/MarkUserQuestionMapper.xml
  17. 8 4
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java

@@ -15,7 +15,6 @@ import com.qmth.distributed.print.business.enums.ExamDataSourceEnum;
 import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.entity.BasicExamStudent;
-import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.enums.CreatePdfTypeEnum;
 import org.springframework.web.multipart.MultipartFile;
@@ -69,9 +68,10 @@ public interface ExamDetailService extends IService<ExamDetail> {
      * 考务数据模板下载
      *
      * @param schoolId 学校id
+     * @param type
      * @return 是否成功
      */
-    void downLoadExaminationTemplate(Long schoolId, HttpServletResponse response) throws IOException;
+    void downLoadExaminationTemplate(Long schoolId, String type, HttpServletResponse response) throws IOException;
 
 
     /**

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

@@ -137,7 +137,7 @@ public class ExamCardModelFourServiceImpl extends ServiceImpl<ExamCardModelFourM
         concurrentService.getReadWriteLock(LockType.CUSTOM_MODEL_FOUR_CARD_SAVE + "-" + schoolId + CardTypeEnum.CUSTOM + params.getTitle()).writeLock().tryLock();
         try {
             QueryWrapper<ExamCardModelFour> checkTitleQueryWrapper = new QueryWrapper<>();
-            checkTitleQueryWrapper.lambda().eq(ExamCardModelFour::getSchoolId, schoolId)
+            checkTitleQueryWrapper.lambda().eq(ExamCardModelFour::getExamId, params.getExamId())
                     .eq(ExamCardModelFour::getTitle, params.getTitle().trim());
             ExamCardModelFour checkTitleExamCardModelFourDb = this.getOne(checkTitleQueryWrapper);
 
@@ -311,10 +311,12 @@ public class ExamCardModelFourServiceImpl extends ServiceImpl<ExamCardModelFourM
             MarkPaper markPaper = markPaperList.get(0);
             markQuestionService.deleteByExamIdAndPaperNumber(markPaper.getExamId(), markPaper.getPaperNumber());
             markQuestionAnswerService.deleteByExamIdAndPaperNumber(markPaper.getExamId(), markPaper.getPaperNumber());
-            ScanAnswerCard scanAnswerCard = scanAnswerCardService.findByExamAndCardIdAndCardSource(markPaper.getExamId(), id, CardSource.WEB);
-            if (scanAnswerCard != null) {
-                scanAnswerCardService.removeById(scanAnswerCard.getId());
-                scanAnswerCardQuestionService.deleteByExamIdAndPaperNumberAndCardNumber(markPaper.getExamId(), markPaper.getPaperNumber(), scanAnswerCard.getNumber());
+            List<ScanAnswerCard> scanAnswerCardList = scanAnswerCardService.findByExamAndCardIdAndCardSource(markPaper.getExamId(), id, CardSource.WEB);
+            if (CollectionUtils.isNotEmpty(scanAnswerCardList)) {
+                for (ScanAnswerCard scanAnswerCard : scanAnswerCardList) {
+                    scanAnswerCardService.removeById(scanAnswerCard.getId());
+                    scanAnswerCardQuestionService.deleteByExamIdAndPaperNumberAndCardNumber(markPaper.getExamId(), markPaper.getPaperNumber(), scanAnswerCard.getNumber());
+                }
             }
         }
         return this.removeById(id);

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

@@ -6,7 +6,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.Update;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -284,7 +283,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void downLoadExaminationTemplate(Long schoolId, HttpServletResponse response) throws IOException {
+    public void downLoadExaminationTemplate(Long schoolId, String type, HttpServletResponse response) throws IOException {
         final String DEFALUT_EXT = ".xlsx";
         final String DEFALUT_CONTENT_TYPE = "application/vnd.ms-excel";
         List<FieldsDto> fieldsNameList = this.findExaminationFields(schoolId);
@@ -310,7 +309,8 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         describeFont.setFontName("宋体");
         describeFont.setColor(IndexedColors.RED.getIndex());
         describeStyle.setFont(describeFont);
-        String describe = SystemConstant.EXAMINATION_DESCRIBE;
+//        String describe = SystemConstant.EXAMINATION_DESCRIBE;
+        String describe = SystemConstant.getDescString(type, basicExamRuleService.getBySchoolId(schoolId).getRequiredFieldList());
         describe = describe.trim();
         XSSFRow rowDescribe = sheet.createRow(0);
         rowDescribe.setHeightInPoints(195); //行高设置成195px

+ 16 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintFinishServiceImpl.java

@@ -14,6 +14,7 @@ import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
+import com.qmth.teachcloud.common.entity.BasicExamStudent;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.service.BasicAttachmentService;
@@ -50,6 +51,8 @@ public class PrintFinishServiceImpl implements PrintFinishService {
     @Resource
     private BasicAttachmentService basicAttachmentService;
     @Resource
+    private BasicExamStudentService basicExamStudentService;
+    @Resource
     private MarkPaperService markPaperService;
     @Resource
     private MarkQuestionService markQuestionService;
@@ -127,8 +130,13 @@ public class PrintFinishServiceImpl implements PrintFinishService {
                     if (markStudent != null) {
                         continue;
                     }
+                    String teachClassName = null;
+                    BasicExamStudent basicExamStudent = basicExamStudentService.getById(examStudent.getBasicStudentId());
+                    if (basicExamStudent != null) {
+                        teachClassName = basicExamStudent.getTeachClassName();
+                    }
                     String paperType = basicCardRule.getExamNumberStyle().equals(ExamNumberStyleEnum.PRINT) || (basicCardRule.getExamNumberStyle().equals(ExamNumberStyleEnum.FILL) && !dto.getOpenAb()) ? examStudent.getPaperType() : null;
-                    MarkStudent student = new MarkStudent(examStudent.getId(), dto.getExamId(), examStudent.getBasicStudentId(), dto.getCourseId(), dto.getPaperNumber(), dto.getCoursePaperId(), dto.getSerialNumber(), paperType, examStudent.getStudentCode(), initExamDetailDto.getPackageCode(), initExamDetailDto.getExamPlace(), initExamDetailDto.getExamRoom(), examStudent.getTeachClazzName(), initExamDetailDto.getExamStartTime(), initExamDetailDto.getExamEndTime(), dto.getCreateId());
+                    MarkStudent student = new MarkStudent(examStudent.getId(), dto.getExamId(), examStudent.getBasicStudentId(), dto.getCourseId(), dto.getPaperNumber(), dto.getCoursePaperId(), dto.getSerialNumber(), paperType, examStudent.getStudentCode(), initExamDetailDto.getPackageCode(), initExamDetailDto.getExamPlace(), initExamDetailDto.getExamRoom(), teachClassName, initExamDetailDto.getExamStartTime(), initExamDetailDto.getExamEndTime(), dto.getCreateId());
                     if (student.getSecretNumber() == null) {
                         student.randomSecretNumber();
                         while (secretNumberSet.contains(student.getSecretNumber())
@@ -184,11 +192,12 @@ public class PrintFinishServiceImpl implements PrintFinishService {
 
     @Override
     public ScanAnswerCard insertScanAnswerCard(ExamDetailCourseInitMarkDto dto, String cardId, String content) {
-        ScanAnswerCard scanAnswerCard = scanAnswerCardService.getByExamIdAndCoursePaperIdAndSerialNumberAndCardId(dto.getExamId(), dto.getCoursePaperId(), dto.getSerialNumber(), Long.valueOf(cardId));
-        if (scanAnswerCard != null) {
-            return scanAnswerCard;
+        List<ScanAnswerCard> scanAnswerCardList = scanAnswerCardService.getByExamIdAndCoursePaperIdAndSerialNumberAndCardId(dto.getExamId(), dto.getCoursePaperId(), dto.getSerialNumber(), Long.valueOf(cardId));
+        if (CollectionUtils.isNotEmpty(scanAnswerCardList)) {
+            return scanAnswerCardList.get(0);
         }
 
+        ScanAnswerCard scanAnswerCard = null;
         File tempFile = SystemConstant.getFileTempDirVar(System.currentTimeMillis() + File.separator + SystemConstant.getNanoId(), SystemConstant.TEMP_PREFIX);
         String rootPath = tempFile.getParent();
         String jsonPath = rootPath + File.separator + cardId + SystemConstant.JSON_PREFIX;
@@ -340,9 +349,11 @@ public class PrintFinishServiceImpl implements PrintFinishService {
                 }
             }
 
-            // 更新卷设置中的状态
+            // 更新卷设置中的状态
             markPaperService.updateQuestionStatus(examId, paperNumber);
             markPaperService.updateGroupStatus(examId, paperNumber);
+            // 更新试卷总分
+            markQuestionService.updateMarkPaperScore(examId, paperNumber);
         } catch (Exception e) {
             log.info("同步结构失败");
         }

+ 2 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamDetailController.java

@@ -208,9 +208,9 @@ public class ExamDetailController {
     @ApiOperation(value = "考务数据导入-模板下载")
     @RequestMapping(value = "/template_download", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "下载成功", response = EditResult.class)})
-    public void downLoadExaminationTemplate() throws IOException {
+    public void downLoadExaminationTemplate(@ApiParam(value = "类型") @RequestParam(required = false) String type) throws IOException {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-        examDetailService.downLoadExaminationTemplate(schoolId, ServletUtil.getResponse());
+        examDetailService.downLoadExaminationTemplate(schoolId, type, ServletUtil.getResponse());
     }
 
     @ApiOperation(value = "考务数据导入-结果导出")

+ 6 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkInspectedController.java

@@ -5,6 +5,7 @@ import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
@@ -12,6 +13,7 @@ import com.qmth.teachcloud.mark.bean.dto.MarkAreaDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
 import com.qmth.teachcloud.mark.dto.mark.score.SettingDto;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveDetailDto;
+import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.params.MarkHeaderResult;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 import com.qmth.teachcloud.mark.service.MarkStudentService;
@@ -81,9 +83,11 @@ public class MarkInspectedController extends BaseController {
     @Aac(auth = false)
     @ApiOperation(value = "主观题检查任务获取")
     @RequestMapping(value = "/subjective/getTask", method = RequestMethod.POST)
-    public Result getSubjectiveInspectedTask(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
+    public Result getSubjectiveInspectedTask(@ApiParam(value = "考生ID") @RequestParam(required = false) Long studentId,
+                                             @ApiParam(value = "考生ID", required = true) @RequestParam Long examId,
+                                             @ApiParam(value = "考生ID", required = true) @RequestParam String paperNumber) {
+        validMarkPaperForInspect(examId, paperNumber);
         Task task = markStudentService.getSubjectiveInspectedTask(studentId);
-        validMarkPaperForInspect(task.getExamId(), task.getPaperNumber());
         return ResultUtil.ok(task);
     }
 

+ 40 - 18
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -12,6 +12,7 @@ import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import com.qmth.teachcloud.common.enums.*;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.ArrayUtils;
@@ -28,10 +29,6 @@ import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.entity.BasicSchool;
 import com.qmth.teachcloud.common.entity.SysConfig;
 import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.LocalCatalogEnum;
-import com.qmth.teachcloud.common.enums.TFCustomTypeEnum;
-import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.util.*;
 
@@ -477,18 +474,18 @@ public class SystemConstant {
     public static final String XLSX = "xlsx";
     public static final String XLS = "xls";
     public static final String EXAMINATION_DESCRIBE = "说明\n" +
-            "1、【学号】必填;\n" +
-            "2、【姓名】必填;\n" +
-            "3、【课程代码】必填,且与命题任务中的课程代码相互对应;\n" +
-            "4、【课程名称】必填,且与命题任务中的课程名称相互对应;\n" +
-            "5、【试卷编号】非必填,且与命题任务中的试卷编号相互对应;\n" +
-            "6、【考点】非必填;\n" +
-            "7、【考场】非必填;\n" +
-            "8、【考试日期】非必填,且格式为文本格式。例如2023-01-01;\n" +
-            "9、【考试时间】非必填,且格式为文本格式。例如10:00-12:00;\n" +
-            "10、【开课学院】必填;\n" +
-            "11、请不要删除此行,也不要删除模板中的任何列。\n" +
-            "12、使用前请先删除样例数据。\n";
+            "【学号】必填;\n" +
+            "【姓名】必填;\n" +
+            "【课程代码】必填,且与命题任务中的课程代码相互对应;\n" +
+            "【课程名称】必填,且与命题任务中的课程名称相互对应;\n" +
+            "【试卷编号】非必填,且与命题任务中的试卷编号相互对应;\n" +
+            "【考点】非必填;\n" +
+            "【考场】非必填;\n" +
+            "【考试日期】非必填,且格式为文本格式。例如2023-01-01;\n" +
+            "【考试时间】非必填,且格式为文本格式。例如10:00-12:00;\n" +
+            "【开课学院】必填;\n" +
+            "请不要删除此行,也不要删除模板中的任何列。\n" +
+            "使用前请先删除样例数据。\n";
 
     public static final String BASIC_EXAM_STUDENT_DESCRIBE = "说明\n" + "1、课程名称、课程代码、姓名、学号、教学班均必填;\n"
             + "2、试卷编号存在时,任课老师、任课老师工号、考试日期、考试时间、考点(校区)、考场(考试教师)均必填\n" + "3、【考试日期】必填,且格式为YYYY-MM-DD。例如2023-01-01;\n"
@@ -1387,8 +1384,8 @@ public class SystemConstant {
         stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), "->", message));
     }
 
-    public static String mergeString(String separator, Object...objects) {
-        if(StringUtils.isBlank(separator)){
+    public static String mergeString(String separator, Object... objects) {
+        if (StringUtils.isBlank(separator)) {
             separator = "#";
         }
         StringJoiner stringJoiner = new StringJoiner(separator);
@@ -1397,4 +1394,29 @@ public class SystemConstant {
         }
         return stringJoiner.toString();
     }
+
+    public static String getDescString(String type, List<EnumResult> requiredFieldList) {
+        StringJoiner string = new StringJoiner("\n");
+        string.add("说明:");
+        if ("EXAM_STUDENT".equals(type)) {
+            for (int i = 1; i <= requiredFieldList.size(); i++) {
+                EnumResult result = requiredFieldList.get(i - 1);
+                if (result.getDisabled()) {
+                    string.add(i + "、" + result.getName() + "必填");
+                } else {
+                    string.add(i + "、" + result.getName() + "非必填");
+                }
+            }
+        } else {
+            for (int i = 1; i <= requiredFieldList.size(); i++) {
+                EnumResult result = requiredFieldList.get(i - 1);
+                if (result.getEnable()) {
+                    string.add(i + "、" + result.getName() + "必填");
+                } else {
+                    string.add(i + "、" + result.getName() + "非必填");
+                }
+            }
+        }
+        return string.toString();
+    }
 }

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java

@@ -45,7 +45,7 @@ public interface MarkService {
 
     void processArbitrate(MarkArbitrateResult markResult, Long userId);
 
-    void checkStudentSubjective(Long studentId, Long examId, String paperNumber, Integer version);
+    void checkStudentSubjective(Long studentId, Long examId, String paperNumber, Integer version, boolean autoCalc);
 
     void buildMarkTask(MarkPaper markPaper);
 

+ 2 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanAnswerCardService.java

@@ -37,7 +37,7 @@ public interface ScanAnswerCardService extends IService<ScanAnswerCard> {
 
     AnswerCardVo cardGet(Long examId, Integer number);
 
-    ScanAnswerCard getByExamIdAndCoursePaperIdAndSerialNumberAndCardId(Long examId, String coursePaperId, Integer serialNumber, Long cardId);
+    List<ScanAnswerCard> getByExamIdAndCoursePaperIdAndSerialNumberAndCardId(Long examId, String coursePaperId, Integer serialNumber, Long cardId);
 
     List<ScanAnswerCard> listByExamIdAndPaperNumber(Long examId, String paperNumber);
 
@@ -57,7 +57,7 @@ public interface ScanAnswerCardService extends IService<ScanAnswerCard> {
      * @param source
      * @return
      */
-    ScanAnswerCard findByExamAndCardIdAndCardSource(Long examId, Long cardId, CardSource source);
+    List<ScanAnswerCard> findByExamAndCardIdAndCardSource(Long examId, Long cardId, CardSource source);
 
     String getCardContentByCardId(Long cardId, ExamModelEnum examModel);
 }

+ 4 - 17
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

@@ -229,18 +229,7 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
             markQuestionAnswerService.saveByMarkQuestion(examId, paperNumber, saveOrUpdateList, false);
         }
         // 更新客观题满分、主观题满分、总分
-        List<MarkQuestion> markQuestions = this.listQuestionByExamIdAndPaperNumber(examId, paperNumber);
-        Double objectiveScore = markQuestions.stream().filter(m -> m.getObjective()).collect(Collectors.summingDouble(m -> m.getTotalScore()));
-        Double subjectiveScore = markQuestions.stream().filter(m -> !m.getObjective()).collect(Collectors.summingDouble(m -> m.getTotalScore()));
-        Double totalScore = markQuestions.stream().collect(Collectors.summingDouble(m -> m.getTotalScore()));
-        UpdateWrapper<MarkPaper> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkPaper::getObjectiveScore, objectiveScore)
-                .set(MarkPaper::getSubjectiveScore, subjectiveScore)
-                .set(MarkPaper::getTotalScore, totalScore)
-                .set(MarkPaper::getQuestionStatus, true)
-                .eq(MarkPaper::getExamId, examId)
-                .eq(MarkPaper::getPaperNumber, paperNumber);
-        markPaperService.update(updateWrapper);
+        this.updateMarkPaperScore(examId, paperNumber);
 
         // 更新评卷员绑定状态
         markPaperService.updateGroupStatus(examId, paperNumber);
@@ -535,11 +524,9 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
     @Override
     public void updateMarkPaperScore(Long examId, String paperNumber) {
         List<MarkQuestion> markQuestions = this.listQuestionByExamIdAndPaperNumber(examId, paperNumber);
-        Double objectiveScore = markQuestions.stream().filter(MarkQuestion::getObjective)
-                .mapToDouble(MarkQuestion::getTotalScore).sum();
-        Double subjectiveScore = markQuestions.stream().filter(m -> !m.getObjective())
-                .mapToDouble(MarkQuestion::getTotalScore).sum();
-        Double totalScore = markQuestions.stream().mapToDouble(MarkQuestion::getTotalScore).sum();
+        Double objectiveScore = markQuestions.stream().filter(m -> m.getObjective() && m.getTotalScore() != null).collect(Collectors.summingDouble(m -> m.getTotalScore()));
+        Double subjectiveScore = markQuestions.stream().filter(m -> !m.getObjective() && m.getTotalScore() != null).collect(Collectors.summingDouble(m -> m.getTotalScore()));
+        Double totalScore = markQuestions.stream().filter(m -> m.getTotalScore() != null).collect(Collectors.summingDouble(m -> m.getTotalScore()));
         UpdateWrapper<MarkPaper> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().set(MarkPaper::getObjectiveScore, objectiveScore)
                 .set(MarkPaper::getSubjectiveScore, subjectiveScore)

+ 10 - 11
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -376,7 +376,7 @@ public class MarkServiceImpl implements MarkService {
         if (calculateQuestion(markQuestion, studentId)) {
             //更新考生分组分数
             updateStudentQuestionScore(studentId, markQuestion, markQuestion.getMarkScore());
-            checkStudentSubjective(studentId, markQuestion.getExamId(), markQuestion.getPaperNumber(), markStudent.getVersion());
+            checkStudentSubjective(studentId, markQuestion.getExamId(), markQuestion.getPaperNumber(), markStudent.getVersion(), false);
         } else {
             markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK);
         }
@@ -384,14 +384,14 @@ public class MarkServiceImpl implements MarkService {
 
     @Override
     @Transactional
-    public void checkStudentSubjective(Long studentId, Long examId, String paperNumber, Integer version) {
+    public void checkStudentSubjective(Long studentId, Long examId, String paperNumber, Integer version, boolean autoCalc) {
         try {
             List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
             List<MarkSubjectiveScore> markSubjectiveScoreList = markSubjectiveScoreService.listByStudentIdAndExamIdAndPn(studentId, examId, paperNumber);
             //校验阅卷题目和评分题目数量和题型是否一致
             if (CollectionUtils.isNotEmpty(markQuestionList) && CollectionUtils.isNotEmpty(markSubjectiveScoreList)
                     && this.megreQuestion(markQuestionList, markSubjectiveScoreList)) {
-                scoreCalculate(studentId, version);
+                scoreCalculate(studentId, version, autoCalc);
             }
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
@@ -427,11 +427,8 @@ public class MarkServiceImpl implements MarkService {
     @Override
     public void buildMarkTask(MarkPaper markPaper) {
         try {
-            if (markPaper.getPaperNumber().equals("1017")) {
-                System.out.println(1);
-            }
             lockService.watch(LockType.EXAM_SUBJECT, markPaper.getExamId(), markPaper.getPaperNumber());
-            log.info("start create library for examId=" + markPaper.getExamId() + ", paperNumber="
+            log.info("start create mark_task for examId=" + markPaper.getExamId() + ", paperNumber="
                     + markPaper.getPaperNumber());
             // 清除缺考考生和违纪考生(违纪考生参与阅卷,update by 2024-10-17)
             List<MarkStudent> markStudentList = markStudentService
@@ -440,10 +437,10 @@ public class MarkServiceImpl implements MarkService {
                 for (MarkStudent student : markStudentList) {
                     try {
                         lockService.waitlock(LockType.STUDENT, student.getId());
-                        log.info("delete library for studentId=" + student.getId());
+                        log.info("delete mark_task for studentId=" + student.getId());
                         this.deleteMarkTaskByStudent(student);
                     } catch (Exception e) {
-                        log.error("delete student library error", e);
+                        log.error("delete student mark_task error", e);
                     } finally {
                         lockService.unlock(LockType.STUDENT, student.getId());
                     }
@@ -749,7 +746,7 @@ public class MarkServiceImpl implements MarkService {
         markSubjectiveScoreService.saveOrUpdateByMultiId(ss);
     }
 
-    private void scoreCalculate(Long studentId, Integer version) {
+    private void scoreCalculate(Long studentId, Integer version, boolean autoCalc) {
         List<ScoreItem> scoreList = new ArrayList<>();
         Map<Integer, List<MarkSubjectiveScore>> mainScoreMap = new HashMap<>();
         Map<Integer, Double> scoreMap = new HashMap<>();
@@ -788,7 +785,9 @@ public class MarkServiceImpl implements MarkService {
         // 全部评完,更新考生主观题得分
 //        markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(),
 //                MarkStudent.buildScoreList(scoreList));
-        markStudentService.updateSubjectiveScoreByVersion(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(), MarkStudent.buildScoreList(scoreList), version);
+        if (autoCalc) {
+            markStudentService.updateSubjectiveScoreByVersion(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(), MarkStudent.buildScoreList(scoreList), version);
+        }
     }
 
     @Override

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

@@ -340,13 +340,13 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
     }
 
     @Override
-    public ScanAnswerCard getByExamIdAndCoursePaperIdAndSerialNumberAndCardId(Long examId, String coursePaperId, Integer serialNumber, Long cardId) {
+    public List<ScanAnswerCard> getByExamIdAndCoursePaperIdAndSerialNumberAndCardId(Long examId, String coursePaperId, Integer serialNumber, Long cardId) {
         QueryWrapper<ScanAnswerCard> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(ScanAnswerCard::getExamId, examId)
                 .eq(ScanAnswerCard::getCoursePaperId, coursePaperId)
                 .eq(ScanAnswerCard::getSerialNumber, serialNumber)
                 .eq(ScanAnswerCard::getCardId, cardId);
-        return this.getOne(queryWrapper);
+        return this.list(queryWrapper);
     }
 
     @Override
@@ -444,12 +444,12 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
      * @return
      */
     @Override
-    public ScanAnswerCard findByExamAndCardIdAndCardSource(Long examId, Long cardId, CardSource source) {
+    public List<ScanAnswerCard> findByExamAndCardIdAndCardSource(Long examId, Long cardId, CardSource source) {
         QueryWrapper<ScanAnswerCard> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(ScanAnswerCard::getExamId, examId)
                 .eq(ScanAnswerCard::getCardId, cardId)
                 .eq(ScanAnswerCard::getSource, source);
-        return this.getOne(queryWrapper);
+        return this.list(queryWrapper);
     }
 
     @Override

+ 8 - 6
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/TaskServiceImpl.java

@@ -10,7 +10,6 @@ import com.qmth.teachcloud.common.enums.mark.MarkProblemStatus;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
-import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
 import com.qmth.teachcloud.mark.dto.mark.manage.*;
 import com.qmth.teachcloud.mark.dto.mark.score.SheetUrlDto;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveAnswerDto;
@@ -22,10 +21,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -221,6 +217,12 @@ public class TaskServiceImpl implements TaskService {
     }
 
     private Double calcTotalScore(List<TaskQuestion> questionList) {
+        // 问题卷,待仲裁,已仲裁-回评中列表分值应该显示空
+        List<MarkTaskStatus> markTaskStatuses = Arrays.asList(MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.ARBITRATED, MarkTaskStatus.PROBLEM);
+        long count = questionList.stream().filter(m -> markTaskStatuses.contains(m.getStatus())).count();
+        if (questionList.size() == count) {
+            return null;
+        }
         return questionList.stream().filter(m -> m.getMarkerScore() != null && MarkTaskStatus.MARKED.equals(m.getStatus())).mapToDouble(m -> m.getMarkerScore()).sum();
     }
 
@@ -253,7 +255,7 @@ public class TaskServiceImpl implements TaskService {
             tq.setMarkerTagList(t.listMarkerTag());
             tq.setHeaderTrackList(t.listHeaderTrack());
             tq.setHeaderTagList(t.listHeaderTag());
-            tq.setMarkerScore(t.getMarkerScore());
+            tq.setMarkerScore(t.getHeaderScore() != null ? t.getHeaderScore() : t.getMarkerScore());
             tq.setSelfMark(t.getUserId() == null || t.getUserId().equals(userId));
             tq.setRejected(t.getStatus().equals(MarkTaskStatus.REJECTED));
             tq.setPrevious(t.getStatus().equals(MarkTaskStatus.MARKED));

+ 8 - 37
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -136,51 +136,22 @@
                         AND (ms.is_breach = 1 OR ms.omr_breach = 1 OR ms.is_manual_breach = 1 OR bes.status = 'B')
                     </when>
                     <otherwise>
-                        AND (ms.is_breach = 0 AND ms.omr_breach = 0 AND ms.is_manual_breach = 0 OR bes.status != 'B')
+                        AND (ms.is_breach = 0 AND ms.omr_breach = 0 AND ms.is_manual_breach = 0 AND bes.status != 'B')
                     </otherwise>
                 </choose>
             </if>
             <if test="startScore != null">
-                <choose>
-                    <when test="startScore == 0">
-                        AND (ms.is_absent = 1 OR ms.is_breach = 1 OR ((ifnull(ms.subjective_score, 0) +
-                        ifnull(ms.objective_score, 0)) &gt;= #{startScore} AND (ifnull(ms.subjective_score,0) +
-                        ifnull(ms.objective_score,0)) &lt;= #{endScore}))
-                    </when>
-                    <otherwise>
-                        AND (ms.is_absent = 0 AND ms.is_breach = 0 AND ((ifnull(ms.subjective_score,0) +
-                        ifnull(ms.objective_score,0)) &gt;= #{startScore} AND (ifnull(ms.subjective_score,0) +
-                        ifnull(ms.objective_score,0)) &lt;= #{endScore}))
-                    </otherwise>
-                </choose>
+                    AND ((ifnull(ms.subjective_score, 0) +
+                    ifnull(ms.objective_score, 0)) &gt;= #{startScore} AND (ifnull(ms.subjective_score,0) +
+                    ifnull(ms.objective_score,0)) &lt;= #{endScore})
             </if>
             <if test="subjectiveStartScore != null">
-                <choose>
-                    <when test="subjectiveStartScore == 0">
-                        AND (ms.is_absent = 1 OR ms.is_breach = 1
-                        OR ((ifnull(ms.subjective_score, 0) &gt;= #{subjectiveStartScore}
-                        AND ifnull(ms.subjective_score, 0) &lt;= #{subjectiveEndScore})))
-                    </when>
-                    <otherwise>
-                        AND (ms.is_absent = 0 AND ms.is_breach = 0
-                        AND ((ifnull(ms.subjective_score, 0) &gt;= #{subjectiveStartScore}
-                        AND ifnull(ms.subjective_score, 0) &lt;= #{subjectiveEndScore})))
-                    </otherwise>
-                </choose>
+                    AND  ((ifnull(ms.subjective_score, 0) &gt;= #{subjectiveStartScore}
+                    AND ifnull(ms.subjective_score, 0) &lt;= #{subjectiveEndScore}))
             </if>
             <if test="objectiveStartScore != null">
-                <choose>
-                    <when test="objectiveStartScore == 0">
-                        AND (ms.is_absent = 1 OR ms.is_breach = 1
-                        OR ((ifnull(ms.objective_score, 0) &gt;= #{objectiveStartScore}
-                        AND ifnull(ms.objective_score, 0) &lt;= #{objectiveEndScore})))
-                    </when>
-                    <otherwise>
-                        AND (ms.is_absent = 0 AND ms.is_breach = 0
-                        AND ((ifnull(ms.objective_score, 0) &gt;= #{objectiveStartScore}
-                        AND ifnull(ms.objective_score, 0) &lt;= #{objectiveEndScore})))
-                    </otherwise>
-                </choose>
+                    AND ((ifnull(ms.objective_score, 0) &gt;= #{objectiveStartScore}
+                    AND ifnull(ms.objective_score, 0) &lt;= #{objectiveEndScore}))
             </if>
             <if test="subScore != null">
                 AND exists (SELECT 1 FROM mark_subjective_score mss WHERE ms.id = mss.student_id AND mss.score =

+ 4 - 2
teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

@@ -62,10 +62,12 @@
             </if>
             <if test="progressStatus != null">
                 <if test="progressStatus == true">
-                    and ifnull(b.totalCount, 0) > 0 AND ifnull(b.totalCount, 0) = ifnull(b.markedCount, 0)
+                    and (mp.status = 'FINISH' or (mp.status = 'FORMAL' and exists (select 1 from mark_question mq where mp.paper_number = mq.paper_number and mq.exam_id = #{examId} and mq.task_count > 0)
+                    and not exists (select 1 from mark_task mt where mp.paper_number = mt.paper_number and mt.exam_id = #{examId} and mt.status in ('WAITING','REJECTED','WAIT_ARBITRATE','PROBLEM'))))
                 </if>
                 <if test="progressStatus == false">
-                    and ifnull(b.totalCount, 0) = 0 OR ifnull(b.totalCount, 0) > ifnull(b.markedCount, 0)
+                    and mp.status = 'FORMAL' and (exists (select 1 from mark_question mq where mp.paper_number = mq.paper_number and mq.exam_id = #{examId} and mq.task_count = 0)
+                    or exists (select 1 from mark_task mt where mp.paper_number = mt.paper_number and mt.exam_id = #{examId} and mt.status in ('WAITING','REJECTED','WAIT_ARBITRATE','PROBLEM')))
                 </if>
             </if>
         </where>

+ 6 - 4
teachcloud-mark/src/main/resources/mapper/MarkUserQuestionMapper.xml

@@ -39,10 +39,10 @@
             basic_course bc ON mq.course_id = bc.id
                 LEFT JOIN
             sys_org so ON bc.teaching_room_id = so.id
-                LEFT JOIN
-            basic_exam be ON muq.exam_id = be.id
-                LEFT JOIN
-            basic_semester bs ON be.semester_id = bs.id
+                 JOIN
+            basic_exam be ON muq.exam_id = be.id and be.enable = true
+                 JOIN
+            basic_semester bs ON be.semester_id = bs.id and bs.enable = true
         <where>
             <if test="examId != null">
                 and mq.exam_id = #{examId}
@@ -166,6 +166,8 @@
             COUNT(1)
         FROM
             mark_paper mp
+             join basic_exam be on mp.exam_id = be.id and be.enable = true
+            join basic_semester bs on be.semester_id = bs.id and bs.enable = true
         <where>
         <if test="status != null and status != ''">
             AND mp.status = #{status}

+ 8 - 4
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

@@ -152,6 +152,10 @@ public class JobServiceImpl implements JobService {
         try {
             List<MarkPaper> markPaperList = markPaperService.listQualityMarkPaperByStatus(MarkPaperStatus.FORMAL, 0);
             for (MarkPaper markPaper : markPaperList) {
+                List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(markPaper.getExamId(), markPaper.getPaperNumber(), false);
+                if (CollectionUtils.isEmpty(markQuestionList) || markQuestionList.stream().filter(m -> m.getTotalScore() == null || m.getIntervalScore() == null).count() > 0) {
+                    continue;
+                }
                 markService.buildMarkTask(markPaper);
                 basicMessageService.smsMarkTask(markPaper.getExamId(), markPaper.getCourseId(), markPaper.getPaperNumber());
             }
@@ -256,17 +260,17 @@ public class JobServiceImpl implements JobService {
         Integer pageSize = 500;
         Page<MarkStudent> page = new Page<>(pageNumber, pageSize);
         List<MarkStudent> markStudentList = markStudentService.findNeedScoreCalculateStudent(page).getRecords();
-        while(CollectionUtils.isNotEmpty(markStudentList)){
+        while (CollectionUtils.isNotEmpty(markStudentList)) {
             for (MarkStudent m : markStudentList) {
                 try {
-                    markService.checkStudentSubjective(m.getId(), m.getExamId(), m.getPaperNumber(), m.getVersion());
+                    markService.checkStudentSubjective(m.getId(), m.getExamId(), m.getPaperNumber(), m.getVersion(), true);
                 } catch (Exception e) {
                     log.error(SystemConstant.LOG_ERROR, e);
                 }
             }
             pageNumber++;
-            page =  new Page<>(pageNumber, pageSize);
-            markStudentList =markStudentService.findNeedScoreCalculateStudent(page).getRecords();
+            page = new Page<>(pageNumber, pageSize);
+            markStudentList = markStudentService.findNeedScoreCalculateStudent(page).getRecords();
         }
     }