Sfoglia il codice sorgente

新增统分定时任务

wangliang 3 mesi fa
parent
commit
f1fd3013b1

+ 4 - 0
distributed-print/install/mysql/upgrade/3.4.4.sql

@@ -175,3 +175,7 @@ ALTER TABLE mark_student ADD version INTEGER DEFAULT 1
 
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1015', '获取识别对照任务', '/api/scan/task/omr/getTask', 'URL', '970', '44', 'AUTH', '1', '1', '1');
 UPDATE `sys_privilege` SET `related` = '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1007,1009,1010,1013,1014,1015,1148,3072,3073,3074,3075' WHERE (`id` = '970');
+
+INSERT INTO sys_config
+(id, school_id, org_id, config_key, config_name, config_value, remark, enable, sort, create_id, create_time, update_id, update_time)
+VALUES(51, NULL, NULL, 'mark.score.calculate.job.db.limit', '统分查询考生条数', 'limit 0,500', NULL, 1, 20, 1, NULL, NULL, NULL);

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -195,6 +195,7 @@ public class SystemConstant {
     public static final String TEACHCLOUD_PRINT_HOST_DEFAULT_URL = "teachcloud.print.host.default.url";
     public static final String TEACHCLOUD_REPORT_HOST_DEFAULT_URL = "teachcloud.report.host.default.url";
     public static final String SCHOOL_FONT_TEMPLATE = "school.font.template";
+    public static final String MARK_SCORE_CALCULATE_JOB_DB_LIMIT = "mark.score.calculate.job.db.limit";
 
     public static final String OPEN_FLOW_MESSAGE_PUSH = "open.flow.message.push";//是否开启消息推送
     public static final String FLOW_MESSAGE_TYPE = "flow.message.type";//消息类型,标准/非标准

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

@@ -153,5 +153,13 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
      * @return
      */
     int updateSubjectiveScoreByVersion(@Param("studentId") Long studentId, @Param("status") String status, @Param("score") Double score,
-                                           @Param("scoreList") String scoreList, @Param("version") Integer version);
+                                       @Param("scoreList") String scoreList, @Param("version") Integer version);
+
+    /**
+     * 查找需要统分考生
+     *
+     * @param limit
+     * @return
+     */
+    List<MarkStudent> findNeedScoreCalculateStudent(@Param("limit") String limit);
 }

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

@@ -1,100 +1,100 @@
-package com.qmth.teachcloud.mark.service;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.qmth.teachcloud.common.entity.MarkQuestion;
-import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.mark.dto.mark.manage.Task;
-import com.qmth.teachcloud.mark.dto.mark.mark.MarkSettingDto;
-import com.qmth.teachcloud.mark.dto.mark.mark.MarkStatusDto;
-import com.qmth.teachcloud.mark.dto.mark.mark.SubmitResult;
-import com.qmth.teachcloud.mark.entity.*;
-import com.qmth.teachcloud.mark.enums.QuestionModel;
-import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
-import com.qmth.teachcloud.mark.params.MarkResult;
-import io.lettuce.core.GeoArgs.Sort;
-
-import java.util.List;
-
-/**
- * <p>
- * 评卷相关 服务类
- */
-public interface MarkService {
-
-    /**
-     * 释放某个评卷员已完成的评卷任务
-     *
-     * @param submitResult 评卷结果
-     */
-    void releaseTask(SubmitResult submitResult, Long userId);
-
-    int applyCurrentCount(MarkQuestion markQuestion);
-
-    void releaseByMarkUserGroup(MarkUserQuestion markUserGroup);
-
-    int applyCurrentCount(MarkQuestion markQuestion, Long markUserGroupId);
-
-    void resetMarker(MarkUserQuestion markUserGroup);
-
-    void updateMarkedCount(Long examId, String paperNumber, Long questionId);
-
-    boolean rejectMarkTask(MarkProblemHistory markProblemHistory, MarkTask markTask, Long userId);
-
-    String getGroupKey(MarkQuestion markQuestion);
-
-    void updateQuality(MarkUserQuestion markUserGroup);
-
-    boolean needUpdateQuality(MarkUserQuestion marker, int expireMinutes);
-
-    void processArbitrate(MarkHeaderGroupResult markResult, Long userId);
-
-    void checkStudentSubjective(Long studentId, Long unGroupQuestionCount, String paperNumber);
-
-    void buildMarkTask(MarkPaper markPaper);
-
-    void deleteMarkTaskByStudent(MarkStudent student);
-
-    void updateGroupAllCount(Long examId, String paperNumber);
-
-    MarkSettingDto getSetting(SysUser user, Long examId, String paperNumber);
-
-    MarkStatusDto getStatus(Long userId, Long examId, String paperNumber);
-
-    Task getTask(Long userId, Long examId, String paperNumber, QuestionModel questionModel);
-
-    /**
-     * /** 释放某个大题的锁定任务
-     */
-//    void releaseByMarkGroup(MarkGroup markGroup);
-
-    void releaseByStudent(MarkStudent student);
-
-    /**
-     * 申请领取某个任务
-     */
-    boolean applyStudent(MarkStudent student, Long userId);
-
-    void submitHeaderTask(List<MarkHeaderGroupResult> markResult, MarkStudent markUserGroup);
-
-    IPage<Task> getHistory(Long userId, int pageNumber, int pageSize, Sort sort, String order, Long examId, String paperNumber, String secretNumber, Double markerScore);
-
-    SubmitResult saveTask(Long examId, String paperNumber, Long userId, MarkResult markResult);
-
-    void clear(Long userId, Long examId, String paperNumber);
-
-    boolean applyTask(MarkTask t, Long userId);
-
-    boolean applyTask(Long examId, String paperNumber, Long studentId, Integer taskNumber, Long userId);
-
-    boolean hasApplied(MarkTask t, Long userId);
-
-    void deleteInitMarkData(Long examId, String paperNumber);
-
-    void calcObjectiveScore(MarkPaper markPaper);
-
-    void updateMarkGroupStatus(Long examId, String paperNumber);
-
-    void checkStudentSubjectiveScore(Long examId, String coursePaperId, long unGroupQuestionCount);
-
-    boolean rejectMarkTask(MarkTask markTask, Long userId, String reason);
-}
+package com.qmth.teachcloud.mark.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.mark.dto.mark.manage.Task;
+import com.qmth.teachcloud.mark.dto.mark.mark.MarkSettingDto;
+import com.qmth.teachcloud.mark.dto.mark.mark.MarkStatusDto;
+import com.qmth.teachcloud.mark.dto.mark.mark.SubmitResult;
+import com.qmth.teachcloud.mark.entity.*;
+import com.qmth.teachcloud.mark.enums.QuestionModel;
+import com.qmth.teachcloud.mark.params.MarkHeaderGroupResult;
+import com.qmth.teachcloud.mark.params.MarkResult;
+import io.lettuce.core.GeoArgs.Sort;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 评卷相关 服务类
+ */
+public interface MarkService {
+
+    /**
+     * 释放某个评卷员已完成的评卷任务
+     *
+     * @param submitResult 评卷结果
+     */
+    void releaseTask(SubmitResult submitResult, Long userId);
+
+    int applyCurrentCount(MarkQuestion markQuestion);
+
+    void releaseByMarkUserGroup(MarkUserQuestion markUserGroup);
+
+    int applyCurrentCount(MarkQuestion markQuestion, Long markUserGroupId);
+
+    void resetMarker(MarkUserQuestion markUserGroup);
+
+    void updateMarkedCount(Long examId, String paperNumber, Long questionId);
+
+    boolean rejectMarkTask(MarkProblemHistory markProblemHistory, MarkTask markTask, Long userId);
+
+    String getGroupKey(MarkQuestion markQuestion);
+
+    void updateQuality(MarkUserQuestion markUserGroup);
+
+    boolean needUpdateQuality(MarkUserQuestion marker, int expireMinutes);
+
+    void processArbitrate(MarkHeaderGroupResult markResult, Long userId);
+
+    void checkStudentSubjective(Long studentId, Long examId, String paperNumber, Integer version);
+
+    void buildMarkTask(MarkPaper markPaper);
+
+    void deleteMarkTaskByStudent(MarkStudent student);
+
+    void updateGroupAllCount(Long examId, String paperNumber);
+
+    MarkSettingDto getSetting(SysUser user, Long examId, String paperNumber);
+
+    MarkStatusDto getStatus(Long userId, Long examId, String paperNumber);
+
+    Task getTask(Long userId, Long examId, String paperNumber, QuestionModel questionModel);
+
+    /**
+     * /** 释放某个大题的锁定任务
+     */
+//    void releaseByMarkGroup(MarkGroup markGroup);
+
+    void releaseByStudent(MarkStudent student);
+
+    /**
+     * 申请领取某个任务
+     */
+    boolean applyStudent(MarkStudent student, Long userId);
+
+    void submitHeaderTask(List<MarkHeaderGroupResult> markResult, MarkStudent markUserGroup);
+
+    IPage<Task> getHistory(Long userId, int pageNumber, int pageSize, Sort sort, String order, Long examId, String paperNumber, String secretNumber, Double markerScore);
+
+    SubmitResult saveTask(Long examId, String paperNumber, Long userId, MarkResult markResult);
+
+    void clear(Long userId, Long examId, String paperNumber);
+
+    boolean applyTask(MarkTask t, Long userId);
+
+    boolean applyTask(Long examId, String paperNumber, Long studentId, Integer taskNumber, Long userId);
+
+    boolean hasApplied(MarkTask t, Long userId);
+
+    void deleteInitMarkData(Long examId, String paperNumber);
+
+    void calcObjectiveScore(MarkPaper markPaper);
+
+    void updateMarkGroupStatus(Long examId, String paperNumber);
+
+    void checkStudentSubjectiveScore(Long examId, String coursePaperId, long unGroupQuestionCount);
+
+    boolean rejectMarkTask(MarkTask markTask, Long userId, String reason);
+}

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

@@ -280,5 +280,12 @@ public interface MarkStudentService extends IService<MarkStudent> {
      * @return
      */
     int updateSubjectiveScoreByVersion(Long studentId, SubjectiveStatus status, Double score,
-                                           String scoreList, Integer version);
+                                       String scoreList, Integer version);
+
+    /**
+     * 查找需要统分考生
+     *
+     * @return
+     */
+    List<MarkStudent> findNeedScoreCalculateStudent();
 }

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

@@ -358,22 +358,24 @@ public class MarkServiceImpl implements MarkService {
         if (calculateQuestionId(markQuestion, studentId)) {
             //更新考生分组分数
             updateStudentQuestionScore(studentId, markQuestion, result);
-            checkStudentSubjective(studentId, markQuestion.getExamId(), markQuestion.getPaperNumber());
+//            checkStudentSubjective(studentId, markQuestion.getExamId(), markQuestion.getPaperNumber(), version);
         } else {
             markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, null, null);
         }
     }
 
     @Override
-    public void checkStudentSubjective(Long studentId, Long examId, String paperNumber) {
+    @Transactional
+    public void checkStudentSubjective(Long studentId, Long examId, String paperNumber, Integer version) {
         long unBindMarkerQuestionCount = markQuestionService.countUnBindMarkerByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
         long questionCount = markQuestionService.countByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
         long subjectiveScoreCount = markSubjectiveScoreService.countByStudentId(studentId);
         // 主观题数大于0,主观题全部绑定了评卷员,考生小题分数数量等于主观题数量
         if (questionCount > 0 && unBindMarkerQuestionCount == 0 && questionCount == subjectiveScoreCount) {
-            scoreCalculate(studentId);
+            scoreCalculate(studentId, version);
         } else {//否则更新该学生主观题状态为未阅卷
-            markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, null, null);
+//            markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, null, null);
+            markStudentService.updateSubjectiveScoreByVersion(studentId, SubjectiveStatus.MARKED, null, null, version);
         }
     }
 
@@ -573,7 +575,7 @@ public class MarkServiceImpl implements MarkService {
         markSubjectiveScoreService.saveOrUpdateByMultiId(ss);
     }
 
-    private void scoreCalculate(Long studentId) {
+    private void scoreCalculate(Long studentId, Integer version) {
         List<ScoreItem> scoreList = new ArrayList<>();
         Map<Integer, List<MarkSubjectiveScore>> mainScoreMap = new HashMap<>();
         Map<Integer, Double> scoreMap = new HashMap<>();
@@ -610,8 +612,9 @@ public class MarkServiceImpl implements MarkService {
             totalScore = totalScore.add(BigDecimal.valueOf(scoreMap.get(mainNumber)));
         }
         // 全部评完,更新考生主观题得分
-        markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(),
-                MarkStudent.buildScoreList(scoreList));
+//        markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(),
+//                MarkStudent.buildScoreList(scoreList));
+        markStudentService.updateSubjectiveScoreByVersion(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(), MarkStudent.buildScoreList(scoreList), version);
     }
 
     @Override

+ 14 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -152,6 +152,9 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     @Resource
     private BasicCourseService basicCourseService;
 
+    @Resource
+    CommonCacheService commonCacheService;
+
     @Override
     public List<String> listClassByExamIdAndCourseCode(Long examId, String paperNumber) {
         MarkStudentQuery markStudentQuery = new MarkStudentQuery();
@@ -2465,4 +2468,15 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         Objects.requireNonNull(status, "主观题状态不能为空");
         return this.baseMapper.updateSubjectiveScoreByVersion(studentId, status.name(), score, scoreList, version);
     }
+
+    /**
+     * 查找需要统分考生
+     *
+     * @return
+     */
+    @Override
+    public List<MarkStudent> findNeedScoreCalculateStudent() {
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(SystemConstant.MARK_SCORE_CALCULATE_JOB_DB_LIMIT);
+        return this.baseMapper.findNeedScoreCalculateStudent(Objects.isNull(sysConfig) ? "limit 0,500" : sysConfig.getConfigValue());
+    }
 }

+ 16 - 0
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -1074,4 +1074,20 @@
             </if>
         </where>
     </update>
+
+    <select id="findNeedScoreCalculateStudent" resultType="com.qmth.teachcloud.mark.entity.MarkStudent">
+        select ms.* from mark_student ms
+        <where>
+            exists(select 1 from mark_paper mp
+        where mp.status = 'FORMAL' and mp.upload_count > 0 and exists(select 1 from basic_exam be
+        where exists(select 1 from basic_school bs where bs.enable = true and bs.id = be.school_id)
+        and be.enable = true and be.id = mp.exam_id) and ms.exam_id = mp.exam_id and ms.paper_number = mp.paper_number)
+        and (ms.subjective_status = 'UNMARK' or ms.subjective_score = 0 or ms.subjective_score is null)
+        and ms.is_upload = true and (ms.is_absent = true or ms.is_manual_absent = true or omr_absent = true)
+        /*and exists(select 1 from mark_task mt where ms.id = mt.student_id)*/
+        <if test="limit != null and limit != ''">
+            #{limit}
+        </if>
+        </where>
+    </select>
 </mapper>

+ 7 - 1
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

@@ -21,6 +21,7 @@ import com.qmth.teachcloud.common.util.DateDisposeUtils;
 import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.data.service.TSyncDataService;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
+import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.lock.LockService;
@@ -248,7 +249,12 @@ public class JobServiceImpl implements JobService {
      */
     @Override
     public void markScoreCalculate() {
-        log.info("markScoreCalculate is come in");
+        List<MarkStudent> markStudentList = markStudentService.findNeedScoreCalculateStudent();
+        if (CollectionUtils.isNotEmpty(markStudentList)) {
+            for (MarkStudent m : markStudentList) {
+                markService.checkStudentSubjective(m.getId(), m.getExamId(), m.getPaperNumber(), m.getVersion());
+            }
+        }
     }
 
     /**