Browse Source

3.4.5 update-20250506,bug修改

xiaofei 1 month ago
parent
commit
28119f7d4b

+ 9 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkInspectedController.java

@@ -125,4 +125,13 @@ public class MarkInspectedController extends BaseController {
 
         return ResultUtil.ok(markStudentService.findScoreByAiMark(examId, paperNumber));
     }
+
+    @ApiOperation(value = "获取AI智能失败数量")
+    @RequestMapping(value = "/ai/mark/abnormal/count", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "AI智能评卷任务数量", response = MarkAiScoreDto.class)})
+    public Result getAiMarkAbnormalCount(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                                              @ApiParam(value = "试卷编码", required = true) @RequestParam String paperNumber) {
+
+        return ResultUtil.ok(markStudentService.findScoreByAiMark(examId, paperNumber));
+    }
 }

+ 9 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/archivescore/ArchiveStudentVo.java

@@ -70,6 +70,7 @@ public class ArchiveStudentVo {
 
     @ExcelProperty(name = "违纪状态", width = 20, index = 11)
     private String breachDisplay;
+    private Boolean aiMarkAbnormal;
 
     public String getCourseCode() {
         return courseCode;
@@ -319,6 +320,14 @@ public class ArchiveStudentVo {
         this.scanStatus = scanStatus;
     }
 
+    public Boolean getAiMarkAbnormal() {
+        return aiMarkAbnormal;
+    }
+
+    public void setAiMarkAbnormal(Boolean aiMarkAbnormal) {
+        this.aiMarkAbnormal = aiMarkAbnormal;
+    }
+
     public List<ScoreItem> getScoreList(boolean objective) {
         List<ScoreItem> scoreList = new LinkedList<ScoreItem>();
         try {

+ 9 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/score/StudentScoreDetailDto.java

@@ -63,6 +63,7 @@ public class StudentScoreDetailDto {
     private Boolean manualBreach;
 
     private String breachDisplay;
+    private Boolean aiMarkAbnormal;
 
     public String getCollegeName() {
         return collegeName;
@@ -408,6 +409,14 @@ public class StudentScoreDetailDto {
         this.breachDisplay = breachDisplay;
     }
 
+    public Boolean getAiMarkAbnormal() {
+        return aiMarkAbnormal;
+    }
+
+    public void setAiMarkAbnormal(Boolean aiMarkAbnormal) {
+        this.aiMarkAbnormal = aiMarkAbnormal;
+    }
+
     public List<ScoreItem> getScoreList(boolean objective, List<MarkQuestion> questionList) {
         List<ScoreItem> scoreList = new LinkedList<ScoreItem>();
         try {

+ 10 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java

@@ -207,6 +207,8 @@ public class MarkStudent implements Serializable {
     @ApiModelProperty(value = "版本号")
     private Integer version = 1;
 
+    private Boolean aiMarkAbnormal;
+
     public MarkStudent() {
     }
 
@@ -772,6 +774,14 @@ public class MarkStudent implements Serializable {
         this.missScan = missScan;
     }
 
+    public Boolean getAiMarkAbnormal() {
+        return aiMarkAbnormal;
+    }
+
+    public void setAiMarkAbnormal(Boolean aiMarkAbnormal) {
+        this.aiMarkAbnormal = aiMarkAbnormal;
+    }
+
     public List<FilePathVo> listSheetPath() {
         return StringUtils.isNotBlank(this.sheetPath) ? JSON.parseArray(this.sheetPath, FilePathVo.class) : Collections.emptyList();
     }

+ 2 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkStudentMapper.java

@@ -180,4 +180,6 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
      * @return
      */
     List<MarkAiScoreDto> findScoreByAiMark(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
+
+    List<Long> listAiMarkAbnormal(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
 }

+ 3 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java

@@ -310,4 +310,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
      * @return
      */
     List<MarkAiScoreDto> findScoreByAiMark(Long examId, String paperNumber);
+    List<Long> listAiMarkAbnormal(Long examId, String paperNumber);
+
+    int countByExamIdAndPaperNumberAndAiMarkAbnormal(Long examId, String paperNumber, boolean aiMarkAbnormal);
 }

+ 28 - 23
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java

@@ -260,32 +260,37 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                         stringJoiner.add(courseInfo + "考生正在统分中,无法结束评卷");
                         continue;
                     }
-                    // 未全部扫描,不能结束
-                    if (markStudentService.countUnexistByExamIdAndPaperNumber(examId, paperNumber) > 0) {
-                        stringJoiner.add(courseInfo + "有考生未扫描未核对,请在扫描客户端进行确认操作后再结束阅卷");
-                        continue;
-                    }
-                    // 识别缺考未确认完,不能结束
-                    if (markStudentService.countOmrAbsentStudent(examId, paperNumber, false) > 0) {
-                        stringJoiner.add(courseInfo + "识别缺考记录未核对,请在扫描客户端进行确认操作后再结束阅卷");
-                        continue;
-                    }
-                    // 人工绑定未做完,不能结束
-                    if (markStudentService.getAssignedCount(examId, false, markPaper.getCourseId(), markPaper.getCoursePaperId(), MarkPaperStatus.FORMAL, null) > 0) {
-                        stringJoiner.add(courseInfo + "人工绑定记录未核对,请在扫描客户端进行确认操作后再结束阅卷");
-                        continue;
-                    }
-                    // 卷型检查未做完,不能结束
-                    if (markStudentService.getPaperTypeCheckCount(examId, markPaper.getCourseId(), markPaper.getCoursePaperId(), PaperTypeCheckStatus.WAITING, null) > 0) {
-                        stringJoiner.add(courseInfo + "卷型检查记录未核对,请在扫描客户端进行确认操作后再结束阅卷");
-                        continue;
-                    }
-                    // 客观题检查未做完,不能结束
-                    if (scanOmrTaskService.getFinishStudentCountByExamAndUserId(examId, markPaper.getCourseId(), markPaper.getCoursePaperId(), OmrTaskStatus.WAITING.name(), null) > 0) {
-                        stringJoiner.add(courseInfo + "客观题存在识别嫌疑需要人工确认,请在扫描客户端进行确认操作后再结束阅卷");
+
+                    if(markStudentService.countByExamIdAndPaperNumberAndAiMarkAbnormal(examId, paperNumber, true) > 0){
+                        stringJoiner.add(courseInfo + "有考生AI评卷异常,请人工给分后再结束阅卷");
                         continue;
                     }
                 }
+                // 未全部扫描,不能结束
+                if (markStudentService.countUnexistByExamIdAndPaperNumber(examId, paperNumber) > 0) {
+                    stringJoiner.add(courseInfo + "有考生未扫描未核对,请在扫描客户端进行确认操作后再结束阅卷");
+                    continue;
+                }
+                // 识别缺考未确认完,不能结束
+                if (markStudentService.countOmrAbsentStudent(examId, paperNumber, false) > 0) {
+                    stringJoiner.add(courseInfo + "识别缺考记录未核对,请在扫描客户端进行确认操作后再结束阅卷");
+                    continue;
+                }
+                // 人工绑定未做完,不能结束
+                if (markStudentService.getAssignedCount(examId, false, markPaper.getCourseId(), markPaper.getCoursePaperId(), MarkPaperStatus.FORMAL, null) > 0) {
+                    stringJoiner.add(courseInfo + "人工绑定记录未核对,请在扫描客户端进行确认操作后再结束阅卷");
+                    continue;
+                }
+                // 卷型检查未做完,不能结束
+                if (markStudentService.getPaperTypeCheckCount(examId, markPaper.getCourseId(), markPaper.getCoursePaperId(), PaperTypeCheckStatus.WAITING, null) > 0) {
+                    stringJoiner.add(courseInfo + "卷型检查记录未核对,请在扫描客户端进行确认操作后再结束阅卷");
+                    continue;
+                }
+                // 客观题检查未做完,不能结束
+                if (scanOmrTaskService.getFinishStudentCountByExamAndUserId(examId, markPaper.getCourseId(), markPaper.getCoursePaperId(), OmrTaskStatus.WAITING.name(), null) > 0) {
+                    stringJoiner.add(courseInfo + "客观题存在识别嫌疑需要人工确认,请在扫描客户端进行确认操作后再结束阅卷");
+                    continue;
+                }
 
                 // 结束评卷时,文档进行归档
                 markDocumentService.initMarkDocument(basicExam, markPaper);

+ 32 - 6
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -77,6 +77,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.constraints.NotNull;
 import java.awt.*;
 import java.awt.color.ColorSpace;
+import java.awt.geom.FlatteningPathIterator;
 import java.awt.image.BufferedImage;
 import java.awt.image.ColorConvertOp;
 import java.io.*;
@@ -178,8 +179,9 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     @Override
     public void updateSubjectiveStatusAndScore(Long studentId, SubjectiveStatus status) {
         UpdateWrapper<MarkStudent> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkStudent::getSubjectiveStatus, status).
-                set(MarkStudent::getSubjectiveScore, null)
+        updateWrapper.lambda().set(MarkStudent::getSubjectiveStatus, status)
+                .set(MarkStudent::getSubjectiveScore, null)
+                .set(MarkStudent::getAiMarkAbnormal, false)
                 .set(MarkStudent::getSubjectiveScoreList, null)
                 .set(MarkStudent::getCheckUserId, null)
                 .set(MarkStudent::getCheckTime, null)
@@ -331,6 +333,11 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                 }
             }
 
+            // AI评卷异常
+            if (scoreDetailDto.getAiMarkAbnormal()) {
+                throw ExceptionResultEnum.ERROR.exception("[" + scoreDetailDto.getStudentName() + "]AI评卷任务异常,请人工给分后再导出");
+            }
+
             // 格式化分数
             scoreDetailDto.setObjectiveScore(Calculator.round(scoreDetailDto.getObjectiveScore(), 1));
             scoreDetailDto.setSubjectiveScore(Calculator.round(scoreDetailDto.getSubjectiveScore(), 1));
@@ -690,6 +697,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             ScanAnswerCard answerCard = answerCardService.findByExamAndNumber(student.getExamId(),
                     student.getCardNumber());
             student.setUpload(true);
+            student.setUploadTime(System.currentTimeMillis());
             student.setIncomplete(paperCount != answerCard.getPaperCount());
             student.setScanStatus(ScanStatus.SCANNED);
             student.setMissScan(false);
@@ -1438,6 +1446,10 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             List<ArchiveStudentVo> ret = baseMapper.studentList(sysUser.getSchoolId(), query, dpr);
 
             for (ArchiveStudentVo s : ret) {
+                // AI评卷异常
+                if (s.getAiMarkAbnormal()) {
+                    throw ExceptionResultEnum.ERROR.exception("[" + s.getStudentName() + "]AI评卷任务异常,请人工给分后再导出");
+                }
                 List<CellValue> valueList = new ArrayList<>();
                 valueList.add(CellValue.of(s.getStudentName()));
                 valueList.add(CellValue.of(s.getStudentCode()));
@@ -1911,7 +1923,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             if (CollectionUtils.isNotEmpty(studentIdList)) {
                 markArchiveStudents = markArchiveStudentService.listByStudentIds(studentIdList);
             }
-            if(CollectionUtils.isNotEmpty(markArchiveStudents)) {
+            if (CollectionUtils.isNotEmpty(markArchiveStudents)) {
                 for (MarkArchiveStudent markArchiveStudent : markArchiveStudents) {
                     List<TaskQuestion> taskQuestionList = JSON.parseArray(markArchiveStudent.getSubjectiveQuestions(), TaskQuestion.class);
                     Map<Integer, Double> listMap = taskQuestionList.stream().collect(Collectors.groupingBy(m -> m.getMainNumber(), Collectors.summingDouble(n -> n.getMarkerScore())));
@@ -1920,8 +1932,8 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                     }
                 }
                 MarkArchiveStudent markArchiveStudent = markArchiveStudents.get(0);
-                if(markArchiveStudent!= null) {
-                    if(StringUtils.isNotBlank(markArchiveStudent.getObjectiveQuestions())) {
+                if (markArchiveStudent != null) {
+                    if (StringUtils.isNotBlank(markArchiveStudent.getObjectiveQuestions())) {
                         List<StudentObjectiveAnswerDto> taskQuestions = JSON.parseArray(markArchiveStudent.getObjectiveQuestions(), StudentObjectiveAnswerDto.class);
                         for (StudentObjectiveAnswerDto taskQuestion : taskQuestions) {
                             MarkQuestion markQuestion = new MarkQuestion();
@@ -1933,7 +1945,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                             questionDatasource.add(markQuestion);
                         }
                     }
-                    if(StringUtils.isNotBlank(markArchiveStudent.getSubjectiveQuestions())) {
+                    if (StringUtils.isNotBlank(markArchiveStudent.getSubjectiveQuestions())) {
                         List<TaskQuestion> taskQuestions = JSON.parseArray(markArchiveStudent.getSubjectiveQuestions(), TaskQuestion.class);
                         for (TaskQuestion taskQuestion : taskQuestions) {
                             MarkQuestion markQuestion = new MarkQuestion();
@@ -2754,4 +2766,18 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     public List<MarkAiScoreDto> findScoreByAiMark(Long examId, String paperNumber) {
         return this.baseMapper.findScoreByAiMark(examId, paperNumber);
     }
+
+    @Override
+    public List<Long> listAiMarkAbnormal(Long examId, String paperNumber) {
+        return this.baseMapper.listAiMarkAbnormal(examId, paperNumber);
+    }
+
+    @Override
+    public int countByExamIdAndPaperNumberAndAiMarkAbnormal(Long examId, String paperNumber, boolean aiMarkAbnormal) {
+        QueryWrapper<MarkStudent> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkStudent::getExamId, examId)
+                .eq(MarkStudent::getPaperNumber, paperNumber)
+                .eq(MarkStudent::getAiMarkAbnormal, aiMarkAbnormal);
+        return this.count(queryWrapper);
+    }
 }

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

@@ -395,7 +395,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
                 .set(MarkTask::getStatus, status)
                 .set(MarkTask::getUserId, userId)
                 .set(MarkTask::getMarkerScore, markerScore)
-                .set(MarkTask::getMarkerTrackList, JSON.toJSONString(trackList))
+                .set(CollectionUtils.isNotEmpty(trackList), MarkTask::getMarkerTrackList, JSON.toJSONString(trackList))
                 .set(MarkTask::getMarkerTime, now)
                 .set(MarkTask::getMarkerSpent, spent)
                 .set(MarkTask::getHeaderId, null)

+ 7 - 2
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -77,7 +77,8 @@
         bes.status studentStatus,
         ms.is_breach breach,
         ms.omr_breach omrBreach,
-        ifnull(ms.is_manual_breach,0) manualBreach
+        ifnull(ms.is_manual_breach,0) manualBreach,
+        ms.ai_mark_abnormal aiMarkAbnormal
         FROM
         (select * from mark_student where exam_id = #{examId} and paper_number = #{paperNumber}) ms
         LEFT JOIN
@@ -445,7 +446,8 @@
                bc.name courseName,
                concat(su.real_name,'(', su.login_name, ')') teacherName,
                bes.exam_start_time examStartTime,
-               bes.exam_end_time examEndTime
+               bes.exam_end_time examEndTime,
+               bes.ai_mark_abnormal aiMarkAbnormal
         from mark_student s
             left join basic_exam_student bes on s.basic_student_id = bes.id
             left join sys_user su on bes.teacher_id = su.id
@@ -1125,4 +1127,7 @@
         where (t.studentTotalScore = t.totalScore or t.studentTotalScore <![CDATA[ < ]]> passScore)
         order by t.studentTotalScore
     </select>
+    <select id="listAiMarkAbnormal" resultType="java.lang.Long">
+        select id from mark_student where exam_id = #{examId} and paper_number = #{paperNumber} and ai_mark_abnormal = true
+    </select>
 </mapper>