Explorar o código

3.4.5 update-20250418,新功能开发

xiaofei hai 2 meses
pai
achega
c0509c5724

+ 2 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkTaskController.java

@@ -54,9 +54,10 @@ public class MarkTaskController extends BaseController {
                        @ApiParam(value = "密号") @RequestParam(required = false) String secretNumber,
                        @ApiParam(value = "教学班") @RequestParam(required = false) String teachClassName,
                        @ApiParam(value = "小题得分") @RequestParam(required = false) Double subScore,
+                       @ApiParam(value = "是否AI评卷") @RequestParam(required = false) Boolean aiMarked,
                        @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                        @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        IPage<MarkTaskDto> markTaskDtoIPage = markTaskService.pageMarkTask(examId, paperNumber, questionId, loginName, status, studentCode, secretNumber, teachClassName, subScore, pageNumber, pageSize);
+        IPage<MarkTaskDto> markTaskDtoIPage = markTaskService.pageMarkTask(examId, paperNumber, questionId, loginName, status, studentCode, secretNumber, teachClassName, subScore,aiMarked, pageNumber, pageSize);
         return ResultUtil.ok(markTaskDtoIPage);
     }
 

+ 3 - 1
distributed-print/src/main/resources/application-base.properties

@@ -97,7 +97,9 @@ com.qmth.logging.file-path=/opt/logs/distributed-print.log
 com.qmth.sms.server=https://solar.qmth.com.cn
 com.qmth.data.upgrade.run-mode=start
 com.qmth.solar.app-code=teachcloud
-com.qmth.solar.app-version=3.4.4
+com.qmth.solar.app-version=3.4.5
+sys.config.ocrKey=41a9c68b71c9486db62de90980bd7e9a
+sys.config.ocrSecret=yhe22bNXMRljatkvJA4f56by9dIAJBjv
 
 #============================================================================
 # \u914D\u7F6EJobStore

+ 5 - 2
distributed-print/src/main/resources/application.properties

@@ -12,7 +12,7 @@ spring.application.name=teachcloud
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=teachcloud-3.4.4
+db.name=teachcloud-3.4.5
 db.username=root
 db.password=12345678
 
@@ -100,7 +100,10 @@ com.qmth.logging.file-path=/Users/xiaofei/qmth/temporary/zxzk/log/distributed-pr
 com.qmth.sms.server=https://solar.qmth.com.cn
 com.qmth.data.upgrade.run-mode=start
 com.qmth.solar.app-code=teachcloud
-com.qmth.solar.app-version=3.4.4
+com.qmth.solar.app-version=3.4.5
+
+sys.config.ocrKey=41a9c68b71c9486db62de90980bd7e9a
+sys.config.ocrSecret=yhe22bNXMRljatkvJA4f56by9dIAJBjv
 
 
 #============================================================================

+ 20 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/domain/SysDomain.java

@@ -53,6 +53,10 @@ public class SysDomain implements Serializable {
 //        this.reportUrl = reportUrl;
 //    }
 
+    private String ocrKey;
+
+    private String ocrSecret;
+
     public String getHtmlToPdfUrl() {
         return htmlToPdfUrl;
     }
@@ -76,4 +80,20 @@ public class SysDomain implements Serializable {
     public void setServerUpload(String serverUpload) {
         this.serverUpload = serverUpload;
     }
+
+    public String getOcrKey() {
+        return ocrKey;
+    }
+
+    public void setOcrKey(String ocrKey) {
+        this.ocrKey = ocrKey;
+    }
+
+    public String getOcrSecret() {
+        return ocrSecret;
+    }
+
+    public void setOcrSecret(String ocrSecret) {
+        this.ocrSecret = ocrSecret;
+    }
 }

+ 9 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkTaskTrackDto.java

@@ -10,6 +10,7 @@ public class MarkTaskTrackDto {
     private List<String> sheetUrls;
     private List<PictureConfig> picList;
     private List<TrackDTO> trackList;
+    private List<TrackDTO> headerTrackList;
     private MarkTaskTrackOcrDto ocr;
     private MarkAiQuestionParam markAiQuestionParam;
 
@@ -37,6 +38,14 @@ public class MarkTaskTrackDto {
         this.trackList = trackList;
     }
 
+    public List<TrackDTO> getHeaderTrackList() {
+        return headerTrackList;
+    }
+
+    public void setHeaderTrackList(List<TrackDTO> headerTrackList) {
+        this.headerTrackList = headerTrackList;
+    }
+
     public MarkTaskTrackOcrDto getOcr() {
         return ocr;
     }

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkTaskMapper.java

@@ -46,7 +46,7 @@ public interface MarkTaskMapper extends BaseMapper<MarkTask> {
 
     int countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("classNames") List<String> classNames, @Param("questionIds") List<Long> questionIds, @Param("statusList") MarkTaskStatus[] statusList, @Param("questionSize") Integer questionSize);
 
-    IPage<MarkTaskDto> pageMarkTask(@Param("page") Page<Object> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("loginName") String loginName, @Param("status") MarkTaskStatus status, @Param("studentCode") String studentCode, @Param("secretNumber") String secretNumber, @Param("teachClassName") String teachClassName, @Param("subScore") Double subScore);
+    IPage<MarkTaskDto> pageMarkTask(@Param("page") Page<Object> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("loginName") String loginName, @Param("status") MarkTaskStatus status, @Param("studentCode") String studentCode, @Param("secretNumber") String secretNumber, @Param("teachClassName") String teachClassName, @Param("subScore") Double subScore, @Param("aiMarked") Boolean aiMarked);
 
     MarkManageDto selectMarkedCountAndTotalCount(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
 

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

@@ -89,7 +89,7 @@ public interface MarkTaskService extends IService<MarkTask> {
 
     int countByExamIdAndPaperNumber(Long examId, String paperNumber);
 
-    IPage<MarkTaskDto> pageMarkTask(Long examId, String paperNumber, Long questionId, String loginName, MarkTaskStatus status, String studentCode, String secretNumber, String teachClassName, Double subScore, Integer pageNumber, Integer pageSize);
+    IPage<MarkTaskDto> pageMarkTask(Long examId, String paperNumber, Long questionId, String loginName, MarkTaskStatus status, String studentCode, String secretNumber, String teachClassName, Double subScore, Boolean aiMarked, Integer pageNumber, Integer pageSize);
 
     void rejectMarkTask(Long id, String rejectReason);
 

+ 12 - 24
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

@@ -203,8 +203,6 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
                         // 用来判断是否保存过
                         markQuestion.setUpdateId(sysUser.getId());
                         markQuestion.setUpdateTime(System.currentTimeMillis());
-                        // 是否需要清除OCR识别结果
-                        markQuestion.setClearOcrResult(!question.getObjective() && question.getTotalScore() - markQuestion.getTotalScore() != 0);
                         saveOrUpdateList.add(markQuestion);
                         markQuestionList.remove(markQuestion);
                     } else {
@@ -774,7 +772,12 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
             throw ExceptionResultEnum.ERROR.exception("该题已开始评卷,不允许双评改单评");
         }
 
-        if (doubleRate > 0 && doubleMarkParam.getArbitrateThreshold() > 0 && doubleMarkParam.getArbitrateThreshold() > markQuestion.getTotalScore()) {
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        if(oldDoubleRate > 0 && doubleRate == 0 && MarkPaperAiMark.MAN_MACHINE.equals(markPaper.getAiMark())){
+            throw ExceptionResultEnum.ERROR.exception("人机双评模式,不允许双评改单评");
+        }
+
+        if (doubleRate == 100 && doubleMarkParam.getArbitrateThreshold() > 0 && doubleMarkParam.getArbitrateThreshold() > markQuestion.getTotalScore()) {
             throw ExceptionResultEnum.ERROR.exception("仲裁阈值不能大于小题满分");
         }
 
@@ -785,28 +788,13 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
                 .eq(MarkQuestion::getId, doubleMarkParam.getQuestionId());
         this.update(updateWrapper);
 
-        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
-        if (MarkPaperAiMark.MAN_MACHINE.equals(markPaper.getAiMark()) && oldDoubleRate - doubleRate != 0) {
-            throw ExceptionResultEnum.ERROR.exception("人机双评模式,不允许进行单、双评切换");
-        }
-
         // 单、双评切换修改,不删除任务,补发二评任务
-        if (oldDoubleRate == 0 && doubleRate == 100) {
-            this.updateMarkedCount(questionId, 0);
-            this.updateTaskCount(questionId, 0);
-            if (lockService.trylock(LockType.QUESTION_UPDATE, questionId)) {
-                // 考生主观题重新统分
-                markService.checkStudentSubjectiveScore(examId, markPaper.getCoursePaperId());
-                markSyncService.deleteMarkedByQuestion(markQuestion, false);
-            }
-        } else if (oldDoubleRate == 100 && doubleRate == 0) {
-            this.updateMarkedCount(questionId, 0);
-            this.updateTaskCount(questionId, 0);
-            if (lockService.trylock(LockType.QUESTION_UPDATE, questionId)) {
-                // 考生主观题重新统分
-                markService.checkStudentSubjectiveScore(examId, markPaper.getCoursePaperId());
-                markSyncService.deleteMarkedByQuestion(markQuestion, true);
-            }
+        this.updateMarkedCount(questionId, 0);
+        this.updateTaskCount(questionId, 0);
+        if (lockService.trylock(LockType.QUESTION_UPDATE, questionId)) {
+            // 考生主观题重新统分
+            markService.checkStudentSubjectiveScore(examId, markPaper.getCoursePaperId());
+            markSyncService.deleteMarkedByQuestion(markQuestion, oldDoubleRate > 0 && doubleRate == 0);
         }
     }
 

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

@@ -18,6 +18,7 @@ import com.qmth.boot.core.retrofit.utils.UploadFile;
 import com.qmth.teachcloud.common.bean.dto.mark.PictureConfig;
 import com.qmth.teachcloud.common.bean.marking.MarkConfigItem;
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
+import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.BasicSchool;
@@ -80,6 +81,8 @@ public class MarkServiceImpl implements MarkService {
     @Resource
     private BasicCourseMapper basicCourseMapper;
     @Resource
+    private DictionaryConfig dictionaryConfig;
+    @Resource
     private AiService aiService;
     @Resource
     private FileUploadService fileUploadService;
@@ -1617,7 +1620,7 @@ public class MarkServiceImpl implements MarkService {
                         request.setStudentAnswer(studentQuestionAnswer);
                         request.setStandardAnswer(buildStandardAnswer(markAiQuestionParam));
                         // AI评卷
-                        AutoScoreResult autoScoreResult = aiService.autoScore(request, AiUtil.signatureAi(basicSchool));
+                        AutoScoreResult autoScoreResult = aiService.autoScore(request, AiUtil.signature(basicSchool));
                         long endTime = System.currentTimeMillis();
                         submitAiTask(t, aiUser.getId(), markQuestion, autoScoreResult, buildTrack(markAiQuestionParam.getMode(), autoScoreResult, markQuestion, markOcrStudentQuestions), endTime - startTime);
                         t.setAiMarkErrorMsg(null);
@@ -1829,7 +1832,7 @@ public class MarkServiceImpl implements MarkService {
                 // OCR识别
                 String ocrResult;
                 try {
-                    ocrResult = ocrApiClient.forImage(AiUtil.signatureOcr(basicSchool), OcrType.HANDWRITING, UploadFile.build("image", "", file));
+                    ocrResult = ocrApiClient.forImage(AiUtil.signatureOcr(dictionaryConfig.sysDomain()), OcrType.HANDWRITING, UploadFile.build("image", "", file));
                 } catch (Exception e) {
                     throw ExceptionResultEnum.ERROR.exception("OCR识别失败" + ",考号[" + markStudent.getStudentCode() + "。" + e.getMessage());
                 }

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

@@ -17,7 +17,6 @@ import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
 import com.qmth.teachcloud.mark.dto.mark.manage.*;
-import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
@@ -420,8 +419,8 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public IPage<MarkTaskDto> pageMarkTask(Long examId, String paperNumber, Long questionId, String loginName, MarkTaskStatus status, String studentCode, String secretNumber, String teachClassName, Double subScore, Integer pageNumber, Integer pageSize) {
-        IPage<MarkTaskDto> markTaskDtoIPage = this.baseMapper.pageMarkTask(new Page<>(pageNumber, pageSize), examId, paperNumber, questionId, loginName, status, studentCode, secretNumber, teachClassName, subScore);
+    public IPage<MarkTaskDto> pageMarkTask(Long examId, String paperNumber, Long questionId, String loginName, MarkTaskStatus status, String studentCode, String secretNumber, String teachClassName, Double subScore, Boolean aiMarked, Integer pageNumber, Integer pageSize) {
+        IPage<MarkTaskDto> markTaskDtoIPage = this.baseMapper.pageMarkTask(new Page<>(pageNumber, pageSize), examId, paperNumber, questionId, loginName, status, studentCode, secretNumber, teachClassName, subScore, aiMarked);
         for (MarkTaskDto record : markTaskDtoIPage.getRecords()) {
             record.setStatusDisplay(record.getStatus().getName());
             // 分组题目

+ 3 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/TaskServiceImpl.java

@@ -394,8 +394,9 @@ public class TaskServiceImpl implements TaskService {
         MarkStudent markStudent = markStudentService.getById(markTask.getStudentId());
         markTaskTrackDto.setSheetUrls(teachcloudCommonService.fileMarkPreview(markStudent.getSheetPathList()));
         MarkQuestion markQuestion = markQuestionService.getById(markTask.getQuestionId());
-        markTaskTrackDto.setPicList(markQuestion.getPictureConfigs());
-        markTaskTrackDto.setTrackList(StringUtils.isNotBlank(markTask.getHeaderTrackList()) ? markTask.listHeaderTrack() : markTask.listMarkerTrack());
+        markTaskTrackDto.setPicList(StringUtils.isNotBlank(markQuestion.getPicList()) ? JSON.parseArray(markQuestion.getPicList(), PictureConfig.class) : null);
+        markTaskTrackDto.setTrackList(markTask.listMarkerTrack());
+        markTaskTrackDto.setHeaderTrackList(markTask.listHeaderTrack());
         MarkTaskTrackOcrDto markTaskTrackOcrDto = new MarkTaskTrackOcrDto();
         if (StringUtils.isNotBlank(markTask.getAiMarkErrorMsg())) {
             markTaskTrackOcrDto.setErrorMsg(markTask.getAiMarkErrorMsg());

+ 9 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/AiUtil.java

@@ -2,11 +2,14 @@ package com.qmth.teachcloud.mark.utils;
 
 import com.qmth.boot.core.retrofit.utils.SignatureInfo;
 import com.qmth.teachcloud.common.bean.dto.mark.PictureConfig;
+import com.qmth.teachcloud.common.config.DictionaryConfig;
+import com.qmth.teachcloud.common.domain.SysDomain;
 import com.qmth.teachcloud.common.entity.BasicSchool;
 import com.qmth.teachcloud.common.entity.BasicSemester;
 import com.qmth.teachcloud.mark.dto.ai.SheetImageDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
 
+import javax.annotation.Resource;
 import javax.imageio.ImageIO;
 import javax.imageio.ImageReadParam;
 import javax.imageio.ImageReader;
@@ -19,13 +22,16 @@ import java.util.Iterator;
 
 public class AiUtil {
 
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
     public static SignatureInfo signature(BasicSchool school) {
         return SignatureInfo.secret(school.getAccessKey(), school.getAccessSecret());
     }
 
-    public static SignatureInfo signatureOcr(BasicSchool school) {
-         String accessKey = "41a9c68b71c9486db62de90980bd7e9a";
-         String accessSecret = "yhe22bNXMRljatkvJA4f56by9dIAJBjv";
+    public static SignatureInfo signatureOcr(SysDomain sysDomain) {
+         String accessKey = sysDomain.getOcrKey();
+         String accessSecret = sysDomain.getOcrSecret();
         return SignatureInfo.secret(accessKey, accessSecret);
     }
 

+ 3 - 0
teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

@@ -367,6 +367,9 @@
                 <if test="subScore != null">
                     and marker_score = #{subScore}
                 </if>
+                <if test="aiMarked != null">
+                    and ai_marked = #{aiMarked}
+                </if>
              ) mt
                 LEFT JOIN
             (SELECT