Browse Source

3.4.4 update-20250408,bug修改

xiaofei 2 tháng trước cách đây
mục cha
commit
6fdf1fb979

+ 3 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/GenericExamCardModelFourParams.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.bean.params;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.distributed.print.business.enums.ExamCardStatusEnum;
@@ -33,6 +34,7 @@ public class GenericExamCardModelFourParams implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long courseId;
 
+    @JsonIgnore
     @ApiModelProperty(value = "题卡内容附件")
     private MultipartFile contentFile;
 
@@ -40,6 +42,7 @@ public class GenericExamCardModelFourParams implements Serializable {
     private String contentMd5;
 
     @ApiModelProperty(value = "题卡html附件")
+    @JsonIgnore
     private MultipartFile htmlContentFile;
 
     @ApiModelProperty(value = "题卡html附件md5")

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

@@ -134,7 +134,7 @@ public class ExamCardModelFourServiceImpl extends ServiceImpl<ExamCardModelFourM
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         ExamCardModelFour examCardModelFour = null;
-        concurrentService.getReadWriteLock(LockType.CUSTOM_MODEL_FOUR_CARD_SAVE + "-" + schoolId + CardTypeEnum.CUSTOM + params.getTitle()).writeLock().tryLock();
+        concurrentService.getReadWriteLock(LockType.CUSTOM_MODEL_FOUR_CARD_SAVE + "-" + params.getExamId() + CardTypeEnum.CUSTOM + params.getTitle()).writeLock().tryLock();
         try {
             QueryWrapper<ExamCardModelFour> checkTitleQueryWrapper = new QueryWrapper<>();
             checkTitleQueryWrapper.lambda().eq(ExamCardModelFour::getExamId, params.getExamId())
@@ -210,7 +210,7 @@ public class ExamCardModelFourServiceImpl extends ServiceImpl<ExamCardModelFourM
                 ResultUtil.error(e.getMessage());
             }
         } finally {
-            concurrentService.getReadWriteLock(LockType.CUSTOM_MODEL_FOUR_CARD_SAVE + "-" + schoolId + CardTypeEnum.CUSTOM + params.getTitle()).writeLock().unlock();
+            concurrentService.getReadWriteLock(LockType.CUSTOM_MODEL_FOUR_CARD_SAVE + "-" + params.getExamId() + CardTypeEnum.CUSTOM + params.getTitle()).writeLock().unlock();
         }
         return map;
     }

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

@@ -153,10 +153,11 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
      * @param score
      * @param scoreList
      * @param version
+     * @param autoCalc
      * @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("autoCalc") boolean autoCalc);
 
     /**
      * 查找需要统分考生

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

@@ -15,6 +15,7 @@ import com.qmth.teachcloud.mark.params.MarkResultQuestion;
 import io.lettuce.core.GeoArgs.Sort;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -27,6 +28,8 @@ public interface MarkService {
 
     int applyCurrentCount(MarkQuestion markQuestion);
 
+    Set<Long> listCurrentStudent(Long examId, String paperNumber);
+
     void releaseByMarkUserGroup(MarkUserQuestion markUserGroup);
 
     int applyCurrentCount(MarkQuestion markQuestion, Long markUserGroupId);
@@ -79,7 +82,8 @@ public interface MarkService {
 
     void clear(Long userId, Long examId, String paperNumber);
 
-    boolean applyTask(Long examId, String paperNumber, Long studentId, Long userId, Set<Long> questions,  List<Long> taskIds);
+    boolean applyTask(Long examId, String paperNumber, Long studentId, Long userId, Set<Long> questions, List<Long> taskIds);
+
     boolean applyTask(Long examId, String paperNumber, Long studentId, Long userId, Set<Long> questions);
 
     boolean hasApplied(MarkTask t, Long userId);

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

@@ -57,7 +57,7 @@ import com.qmth.teachcloud.mark.params.MarkHeaderResult;
  */
 public interface MarkStudentService extends IService<MarkStudent> {
 
-    List<String> listClassByExamIdAndCourseCode(Long examId, String paperNumber);
+    List<String> listClassByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     void updateSubjectiveStatusAndScore(Long studentId, SubjectiveStatus status);
 
@@ -150,6 +150,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
     int countByExamIdAndSecretNumber(Long examId, String secretNumber);
 
     List<MarkStudent> listByExamIdAndCoursePaperId(Long examId, String coursePaperId);
+    List<MarkStudent> listByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     IPage<AnswerQueryVo> query(AnswerQueryDomain query);
 
@@ -282,10 +283,11 @@ public interface MarkStudentService extends IService<MarkStudent> {
      * @param score
      * @param scoreList
      * @param version
+     * @param autoCalc
      * @return
      */
     int updateSubjectiveScoreByVersion(Long studentId, SubjectiveStatus status, Double score,
-                                       String scoreList, Integer version);
+                                       String scoreList, Integer version, boolean autoCalc);
 
     /**
      * 查找需要统分考生
@@ -299,4 +301,6 @@ public interface MarkStudentService extends IService<MarkStudent> {
     TaskArchive studentQuestionTrack(Long studentId);
 
     String getCardContent(MarkStudentVo markStudent);
+
+    Set<Long> listStudentIds(Long examId, String paperNumber, List<String> classNames);
 }

+ 25 - 17
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -133,6 +133,12 @@ public class MarkServiceImpl implements MarkService {
         return count;
     }
 
+    @Override
+    public Set<Long> listCurrentStudent(Long examId, String paperNumber) {
+        TaskLock taskLock = TaskLockUtil.getFormalTask(examId + "_" + paperNumber);
+        return taskLock.list().stream().map(m -> Long.valueOf(m.get("studentId").toString())).collect(Collectors.toSet());
+    }
+
     private TaskLock getTaskLock(MarkQuestion markQuestion) {
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(markQuestion.getExamId(),
                 markQuestion.getPaperNumber());
@@ -785,9 +791,7 @@ public class MarkServiceImpl implements MarkService {
         // 全部评完,更新考生主观题得分
 //        markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(),
 //                MarkStudent.buildScoreList(scoreList));
-        if (autoCalc) {
-            markStudentService.updateSubjectiveScoreByVersion(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(), MarkStudent.buildScoreList(scoreList), version);
-        }
+        markStudentService.updateSubjectiveScoreByVersion(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(), MarkStudent.buildScoreList(scoreList), version, autoCalc);
     }
 
     @Override
@@ -854,7 +858,7 @@ public class MarkServiceImpl implements MarkService {
                 dto = new MarkStatusDto(markQuestionService.getById(question.getQuestionId()), markUserPaper.getMarkedQuestionId());
                 List<Long> questionIds = Arrays.asList(question.getQuestionId());
                 MarkStatusDto statusDto = getDto(dto, examId, paperNumber, userId, classNames, questionIds);
-                statusDto.setLeftCount(countLeftCountForSingle(statusDto.getLeftCount(), question.getQuestionId(), userId, classNames));
+                statusDto.setLeftCount(countLeftCountForSingle(examId, paperNumber, statusDto.getLeftCount(), question.getQuestionId(), userId, classNames));
                 dtoList.add(statusDto);
             }
         } else if (QuestionModel.MULTI.equals(questionModel)) {
@@ -868,20 +872,24 @@ public class MarkServiceImpl implements MarkService {
         return dtoList;
     }
 
-    private int countLeftCountForSingle(int leftCount, Long questionId, Long userId, List<String> classNames) {
+    private int countLeftCountForSingle(Long examId, String paperNumber, int leftCount, Long questionId, Long userId, List<String> classNames) {
         MarkQuestion markQuestion = markQuestionService.getById(questionId);
+        Set<Long> currentStudent = this.listCurrentStudent(examId, paperNumber);
+
+        int userCurrentCount = this.applyCurrentCount(markQuestion, userId);
         if (CollectionUtils.isEmpty(classNames)) {
-            int currentCount = this.applyCurrentCount(markQuestion);
-            int userCurrentCount = this.applyCurrentCount(markQuestion, userId);
-            return leftCount - currentCount + userCurrentCount;
+            return leftCount - currentStudent.size() + userCurrentCount;
         } else {
-            List<MarkUserClass> markUserClassList = markUserClassService.listByExamIdAndPaperNumber(markQuestion.getExamId(), markQuestion.getPaperNumber());
-            Set<MarkUserClass> markUserClasses = markUserClassList.stream().filter(m -> classNames.contains(m.getClassName()) && !m.getUserId().equals(userId)).collect(Collectors.toSet());
-            int count = 0;
-            for (MarkUserClass markUserClass : markUserClasses) {
-                count += this.applyCurrentCount(markQuestion, markUserClass.getUserId());
-            }
-            return leftCount - count;
+//            List<MarkUserClass> markUserClassList = markUserClassService.listByExamIdAndPaperNumber(markQuestion.getExamId(), markQuestion.getPaperNumber());
+//            Set<MarkUserClass> markUserClasses = markUserClassList.stream().filter(m -> classNames.contains(m.getClassName()) && !m.getUserId().equals(userId)).collect(Collectors.toSet());
+//            int count = 0;
+//            for (MarkUserClass markUserClass : markUserClasses) {
+//                count += this.applyCurrentCount(markQuestion, markUserClass.getUserId());
+//            }
+//            return leftCount - count;
+            Set<Long> studentIds = markStudentService.listStudentIds(examId, paperNumber, classNames);
+            Collection<Long> collection = CollectionUtils.intersection(currentStudent, studentIds);
+            return leftCount - collection.size() + userCurrentCount;
         }
     }
 
@@ -982,8 +990,8 @@ public class MarkServiceImpl implements MarkService {
             headerHistory.setCreateTime(System.currentTimeMillis());
             markHeaderHistoryService.save(headerHistory);
         }
-        markSubjectiveScore.setScore(score);
-        markSubjectiveScoreService.saveOrUpdateByMultiId(markSubjectiveScore);
+//        markSubjectiveScore.setScore(score);
+//        markSubjectiveScoreService.saveOrUpdateByMultiId(markSubjectiveScore);
 
         // 记录日志
 //        if (CollectionUtils.isNotEmpty(basicOperationLogs)) {

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

@@ -165,16 +165,13 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     private ScanAnswerCardService scanAnswerCardService;
 
     @Override
-    public List<String> listClassByExamIdAndCourseCode(Long examId, String paperNumber) {
-        MarkStudentQuery markStudentQuery = new MarkStudentQuery();
-        markStudentQuery.setExamId(examId);
-        markStudentQuery.setPaperNumber(paperNumber);
-        List<MarkStudentVo> markStudentList = this.listMarkStudentVo(markStudentQuery);
+    public List<String> listClassByExamIdAndPaperNumber(Long examId, String paperNumber) {
+        List<MarkStudent> markStudentList = this.listByExamIdAndPaperNumber(examId, paperNumber);
 
         List<String> classNameList = new ArrayList<>();
         if (CollectionUtils.isNotEmpty(markStudentList)) {
             classNameList = markStudentList.stream().filter(m -> StringUtils.isNotBlank(m.getTeachClassName()))
-                    .map(MarkStudentVo::getTeachClassName).distinct().collect(Collectors.toList());
+                    .map(MarkStudent::getTeachClassName).distinct().collect(Collectors.toList());
         }
         return classNameList;
     }
@@ -963,6 +960,13 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         return this.list(queryWrapper);
     }
 
+    @Override
+    public List<MarkStudent> listByExamIdAndPaperNumber(Long examId, String paperNumber) {
+        QueryWrapper<MarkStudent> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkStudent::getExamId, examId).eq(MarkStudent::getPaperNumber, paperNumber);
+        return this.list(queryWrapper);
+    }
+
     @Override
     public IPage<AnswerQueryVo> query(AnswerQueryDomain query) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
@@ -2493,13 +2497,14 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
      * @param score
      * @param scoreList
      * @param version
+     * @param autoCalc
      * @return
      */
     @Override
     @Transactional
-    public int updateSubjectiveScoreByVersion(Long studentId, SubjectiveStatus status, Double score, String scoreList, Integer version) {
+    public int updateSubjectiveScoreByVersion(Long studentId, SubjectiveStatus status, Double score, String scoreList, Integer version, boolean autoCalc) {
         Objects.requireNonNull(status, "主观题状态不能为空");
-        int update = this.baseMapper.updateSubjectiveScoreByVersion(studentId, status.name(), score, scoreList, version);
+        int update = this.baseMapper.updateSubjectiveScoreByVersion(studentId, status.name(), score, scoreList, version, autoCalc);
         if (Objects.nonNull(version) && update == 0) {
             throw ExceptionResultEnum.ERROR.exception("版本号发生改变,更新失败");
         }
@@ -2570,4 +2575,15 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         }
         return null;
     }
+
+    @Override
+    public Set<Long> listStudentIds(Long examId, String paperNumber, List<String> classNames) {
+        QueryWrapper<MarkStudent> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().select(MarkStudent::getId)
+                .eq(MarkStudent::getExamId, examId)
+                .eq(MarkStudent::getPaperNumber, paperNumber)
+                .in(MarkStudent::getTeachClassName, classNames);
+        List<MarkStudent> students = this.list(queryWrapper);
+        return students.stream().map(MarkStudent::getId).collect(Collectors.toSet());
+    }
 }

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

@@ -85,7 +85,7 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
     @Override
     public MarkUserClassDto listMarkUserClassByExamIdAndPaperNumber(Long examId, String paperNumber) {
         // 课程下所有班级数据
-        List<String> paperNumberClassList = markStudentService.listClassByExamIdAndCourseCode(examId, paperNumber);
+        List<String> paperNumberClassList = markStudentService.listClassByExamIdAndPaperNumber(examId, paperNumber);
         List<MarkUser> markUserList = markUserQuestionService.listUserByExamIdAndPaperNumber(examId, paperNumber);
 
         MarkUserClassDto markUserClassDto = new MarkUserClassDto();
@@ -118,7 +118,7 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
         String paperNumber = markClassUserParams.getPaperNumber();
 
         // 校验班级是否绑定完成
-        List<String> listUserClass = markStudentService.listClassByExamIdAndCourseCode(examId, paperNumber);
+        List<String> listUserClass = markStudentService.listClassByExamIdAndPaperNumber(examId, paperNumber);
         if (CollectionUtils.isNotEmpty(listUserClass)) {
             List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
             for (MarkQuestion markQuestion : markQuestionList) {

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/TaskLock.java

@@ -191,7 +191,7 @@ public class TaskLock {
         LockNode node = head.next;
         while (node != null) {
             Map<String, Object> map = new HashMap<>();
-            map.put("taskId", node.getId());
+            map.put("studentId", node.getId());
             map.put("markerId", node.getOwner());
             map.put("questions", JSON.toJSONString(node.getQuestions()));
             map.put("time", DateDisposeUtils.parseDateToStr(DateDisposeUtils.YYYY_MM_DD_HH_MM_SS, new Date(node.getTime())));

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

@@ -1058,7 +1058,7 @@
             <if test="studentId != null and studentId != ''">
                 AND t.id = #{studentId}
             </if>
-            <if test="version != null and version != ''">
+            <if test="version != null and version != '' and autoCalc == true">
                 AND t.version = #{version}
             </if>
         </where>