Przeglądaj źródła

Merge remote-tracking branch 'origin/dev' into dev

wangliang 4 lat temu
rodzic
commit
3d550c5b40

+ 6 - 0
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -119,6 +119,12 @@ public class SystemConstant {
     //重新算分锁
     public static final String REDIS_LOCK_CALCULATE_SCORE_PREFIX = "lock:calculate_score:exam_id_";
     
+    //试卷导入锁
+    public static final String REDIS_LOCK_PAPER_IMPORT_PREFIX = "lock:paper_import:exam_id_";
+    
+    //重新算分和试卷导入互斥锁
+    public static final String REDIS_LOCK_CALCULATE_SCORE_PAPER_IMPORT_PREFIX = "lock:calculate_score_paper_import:exam_id_";
+    
     //交卷锁
     public static final String REDIS_LOCK_FINISH_EXXAM_PREFIX = "lock:finish_exxam:record_id_";
     /**

+ 3 - 0
themis-business/src/main/java/com/qmth/themis/business/dao/TEExamMapper.java

@@ -6,6 +6,7 @@ import com.qmth.themis.business.dto.response.TEExamDto;
 import com.qmth.themis.business.dto.response.TEExamQueryDto;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.enums.InvigilateMonitorStatusEnum;
+import com.qmth.themis.business.enums.ScoreStatusEnum;
 
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -66,4 +67,6 @@ public interface TEExamMapper extends BaseMapper<TEExam> {
     public List<TEExam> examPrivilegeQuery(@Param("userId") Long userId);
 
 	public void updateInvigilateMonitorStatus(@Param("monitorStatus") InvigilateMonitorStatusEnum monitorStatus,@Param("examId") Long examId);
+
+	public void updateScoreStatus(@Param("scoreStatus") ScoreStatusEnum scoreStatus,@Param("examId") Long examId);
 }

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/entity/TEExam.java

@@ -164,7 +164,7 @@ public class TEExam extends BaseEntity {
     @TableField(value = "ip_allow")
     private String ipAllow;
 
-    @ApiModelProperty(value = "算分状态,never:从未算分,calculating:正在算分,finish:算分完成")
+    @ApiModelProperty(value = "算分状态,never:从未算分,calculating:正在算分,finish:算分完成,need_calculate:需要算分")
     @TableField(value = "score_status")
     private ScoreStatusEnum scoreStatus;
 

+ 3 - 1
themis-business/src/main/java/com/qmth/themis/business/enums/ScoreStatusEnum.java

@@ -12,7 +12,9 @@ public enum ScoreStatusEnum {
 
     CALCULATING("正在算分"),
 
-    FINISH("算分完成");
+    FINISH("算分完成"),
+    
+    NEED_CALCULATE("需要算分");
 
     private String code;
 

+ 3 - 0
themis-business/src/main/java/com/qmth/themis/business/service/TEExamService.java

@@ -9,6 +9,7 @@ import com.qmth.themis.business.dto.response.TEExamDto;
 import com.qmth.themis.business.dto.response.TEExamQueryDto;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.enums.InvigilateMonitorStatusEnum;
+import com.qmth.themis.business.enums.ScoreStatusEnum;
 import com.qmth.themis.business.enums.SystemOperationEnum;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -196,6 +197,8 @@ public interface TEExamService extends IService<TEExam> {
 	void calculateScore(Long examId, Long taskId);
 
 	void updateInvigilateMonitorStatus(InvigilateMonitorStatusEnum monitorStatus, Long examId);
+
+	void updateScoreStatus(ScoreStatusEnum scoreStatus, Long examId);
 	
 	
 }

+ 33 - 6
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qmth.themis.business.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.themis.business.bean.exam.*;
@@ -1186,15 +1187,27 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
      */
     @Override
     public void calculateScore(Long examId, Long taskId) {
-        int timeOutSecond = 60 * 5;
+        int timeOutSecond = 60 * 60 * 5;
         String lockKey = SystemConstant.REDIS_LOCK_CALCULATE_SCORE_PREFIX + examId;
-        Boolean lock = redisUtil.lock(lockKey, timeOutSecond);
-        if (!lock) {
-            return;
-        }
+        String multLockKey = SystemConstant.REDIS_LOCK_CALCULATE_SCORE_PAPER_IMPORT_PREFIX + examId;
+        
         TBTaskHistory task = null;
         Long recordId = null;
         try {
+        	Boolean lock = redisUtil.lock(lockKey, timeOutSecond);
+            if (!lock) {
+            	throw new BusinessException("该考试批次有正在进行的重新算分");
+            }
+            
+            //重新算分和试卷导入互斥锁
+	        Boolean multLock = redisUtil.lock(multLockKey, timeOutSecond);
+	        if (!multLock) {
+	        	throw new BusinessException("该考试批次有正在进行的试卷导入");
+	        }
+	        
+        	TEExamService examService = SpringContextHolder.getBean(TEExamService.class);
+        	teExamMapper.updateScoreStatus(ScoreStatusEnum.CALCULATING, examId);
+        	examService.updateExamCacheBean(examId);
             task = tbTaskHistoryService.getById(taskId);
             task.setStatus(TaskStatusEnum.RUNNING);
             tbTaskHistoryService.saveOrUpdate(task);
@@ -1214,12 +1227,13 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                             recordId = rc.getId();
                             toeExamRecordService.calculateScore(rc.getId());
                         }
-                        redisUtil.expire(lockKey, timeOutSecond);
                     }
                     task.setProgress(getPercentage(index, total));
                     tbTaskHistoryService.saveOrUpdate(task);
                 }
             }
+            teExamMapper.updateScoreStatus(ScoreStatusEnum.FINISH, examId);
+            examService.updateExamCacheBean(examId);
             task.setSummary("处理成功");
             task.setProgress(100.0);
             task.setStatus(TaskStatusEnum.FINISH);
@@ -1229,8 +1243,15 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
             task.setSummary("处理出错");
             task.setStatus(TaskStatusEnum.FINISH);
             task.setFinishTime(System.currentTimeMillis());
+            JSONObject json = new JSONObject();
+            String reportFilePath="file/"+sdf.format(new Date()) + "/" + uuid() + SystemConstant.TXT_PREFIX;
+            json.put("path", reportFilePath);
+            json.put("type", SystemConstant.OSS);
+            OssUtil.ossUploadContent(systemConfig.getOssEnv(3), reportFilePath, e.getMessage());
+            task.setReportFilePath(json.toJSONString());
         } finally {
             redisUtil.releaseLock(lockKey);
+            redisUtil.releaseLock(multLockKey);
         }
         tbTaskHistoryService.saveOrUpdate(task);
     }
@@ -1257,4 +1278,10 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
     public void updateInvigilateMonitorStatus(InvigilateMonitorStatusEnum monitorStatus, Long examId) {
         teExamMapper.updateInvigilateMonitorStatus(monitorStatus, examId);
     }
+    
+    @Transactional
+    @Override
+    public void updateScoreStatus(ScoreStatusEnum scoreStatus, Long examId) {
+        teExamMapper.updateScoreStatus(scoreStatus, examId);
+    }
 }

+ 31 - 0
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamPaperImportTemplete.java

@@ -34,6 +34,7 @@ import com.qmth.themis.business.entity.TEExamCourse;
 import com.qmth.themis.business.entity.TEExamPaper;
 import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.EncryptModeEnum;
+import com.qmth.themis.business.enums.ScoreStatusEnum;
 import com.qmth.themis.business.enums.TaskStatusEnum;
 import com.qmth.themis.business.service.TEExamCourseService;
 import com.qmth.themis.business.service.TEExamPaperService;
@@ -42,6 +43,7 @@ import com.qmth.themis.business.service.TOeExamRecordService;
 import com.qmth.themis.business.templete.TaskImportCommon;
 import com.qmth.themis.business.templete.TaskImportTemplete;
 import com.qmth.themis.business.util.OssUtil;
+import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
@@ -72,6 +74,10 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
 	
 	@Resource
 	TOeExamRecordService examRecordService;
+	
+
+    @Resource
+    RedisUtil redisUtil;
 
 	@Override
 	@Transactional
@@ -108,6 +114,7 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
 	}
 
 	private void dispose(File file, Map<String, Object> map, StringBuilder result) throws IOException {
+		
 		Long examId = (Long) map.get("examId");
 
 		TEExam teExam = teExamService.getById(examId);
@@ -118,7 +125,24 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
 		String tempDir = SystemConstant.TEMP_FILES_DIR;
 		String dir = tempDir + "/" + uuid() + "/";
 		File dfile = new File(dir);
+		
+		String lockKey = SystemConstant.REDIS_LOCK_PAPER_IMPORT_PREFIX + examId;
+		
+		String multLockKey = SystemConstant.REDIS_LOCK_CALCULATE_SCORE_PAPER_IMPORT_PREFIX + examId;
 		try {
+			int timeOutSecond = 60 * 60;
+			//试卷导入锁
+	        Boolean lock = redisUtil.lock(lockKey, timeOutSecond);
+	        if (!lock) {
+	        	throw new BusinessException("该考试批次有正在进行的试卷导入");
+	        }
+	        
+	        //重新算分和试卷导入互斥锁
+	        Boolean multLock = redisUtil.lock(multLockKey, timeOutSecond);
+	        if (!multLock) {
+	        	throw new BusinessException("该考试批次有正在进行的重新算分");
+	        }
+			
 			dfile.mkdirs();
 			FileUtil.unZip(dfile, file);
 			if (!hasErr(map, dir, examId, dfile, result)) {
@@ -130,7 +154,14 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
 			} else {
 				throw new BusinessException("校验失败");
 			}
+			TOeExamRecord er=examRecordService.findOneByExamId(examId, null);
+			Boolean processAnswer = (Boolean) map.get("processAnswer");
+			if(er!=null&&processAnswer) {
+				teExamService.updateScoreStatus(ScoreStatusEnum.NEED_CALCULATE, examId);
+			}
 		} finally {
+			redisUtil.releaseLock(lockKey);
+			redisUtil.releaseLock(multLockKey);
 			FileUtil.deleteFolder(dir);
 		}
 	}

+ 10 - 0
themis-business/src/main/java/com/qmth/themis/business/util/OssUtil.java

@@ -222,4 +222,14 @@ public class OssUtil {
         PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, path, inputStream);
         ossClient.putObject(putObjectRequest);
     }
+    
+    public static void ossUploadContent(Map<String, Object> map, String path, String fileContent) {
+        String endpoint = String.valueOf(map.get(SystemConstant.END_POINT));
+        String accessKeyId = String.valueOf(map.get(SystemConstant.ACCESS_KEY_ID));
+        String accessKeySecret = String.valueOf(map.get(SystemConstant.ACCESS_KEY_SECRET));
+        String bucketName = String.valueOf(map.get(SystemConstant.BUCKET));
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, path, new ByteArrayInputStream(fileContent.getBytes()));
+        ossClient.putObject(putObjectRequest);
+    }
 }

+ 5 - 0
themis-business/src/main/resources/mapper/TEExamMapper.xml

@@ -176,4 +176,9 @@
     <update id="updateInvigilateMonitorStatus">
     	update t_e_exam set monitor_status=#{monitorStatus} where id=#{examId}
     </update>
+    
+    <update id="updateScoreStatus">
+    	update t_e_exam set score_status=#{scoreStatus} where id=#{examId}
+    </update>
+    
 </mapper>