xiatian пре 5 година
родитељ
комит
6d2216ab66

+ 24 - 0
examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/provider/ExamRecordForMarkingCloudServiceProvider.java

@@ -17,6 +17,7 @@ import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordDataEntity;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordForMarkingEntity;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamStudentEntity;
 import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordForMarkingService;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordQuestionsService;
 import cn.com.qmth.examcloud.web.helpers.GlobalHelper;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import com.google.common.collect.Lists;
@@ -64,6 +65,9 @@ public class ExamRecordForMarkingCloudServiceProvider extends ControllerSupport
     @Autowired
     private ExamRecordForMarkingRepo examRecordForMarkingRepo;
 
+    @Autowired
+    private ExamRecordQuestionsService examRecordQuestionsService;
+    
     @Override
     @ApiOperation(value = "根据条件查询阅卷需要的信息")
     @PostMapping("/findExamRecordForMarkingInfo")
@@ -275,4 +279,24 @@ public class ExamRecordForMarkingCloudServiceProvider extends ControllerSupport
         examRecordForMarkingRepo.updateBatchNum(req.getIdList(),req.getBatchNum());
     }
 
+    @Override
+    @PostMapping("/saveExamRecordForMarking")
+    public void saveExamRecordForMarking(@RequestBody SaveExamRecordForMarkingReq req) {
+        ExamRecordForMarkingEntity examRecordForMarkingExists = examRecordForMarkingRepo.findByExamRecordDataId(req.getExamRecordDataId());
+        if (examRecordForMarkingExists != null) {
+            return;
+        }
+        ExamRecordForMarkingEntity examRecordForMarking = new ExamRecordForMarkingEntity();
+        examRecordForMarking.setExamId(req.getExamId());
+        examRecordForMarking.setExamRecordDataId(req.getExamRecordDataId());
+        examRecordForMarking.setExamStudentId(req.getExamStudentId());
+        examRecordForMarking.setBasePaperId(req.getBasePaperId());
+        examRecordForMarking.setPaperType(req.getPaperType());
+        examRecordForMarking.setCourseId(req.getCourseId());
+        examRecordForMarking.setObjectiveScore(req.getObjectiveScore());
+        int subjectiveAnswerLength = examRecordQuestionsService.calculationSubjectiveAnswerLength(req.getExamRecordDataId());
+        examRecordForMarking.setSubjectiveAnswerLength(subjectiveAnswerLength);
+        examRecordForMarkingRepo.save(examRecordForMarking);
+    }
+
 }

+ 82 - 0
examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/provider/ExamScoreNoticeQueueCloudServiceProvider.java

@@ -0,0 +1,82 @@
+package cn.com.qmth.examcloud.core.oe.admin.api.provider;
+
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.com.qmth.examcloud.commons.util.OKHttpUtil;
+import cn.com.qmth.examcloud.core.oe.admin.api.ExamScoreNoticeQueueCloudService;
+import cn.com.qmth.examcloud.core.oe.admin.dao.ExamScoreNoticeQueueRepo;
+import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamScoreNoticeQueueEntity;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamScoreObtainQueueService;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.NotifyUrlInfo;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+@Api(tags = "定时发送获取分数通知接口")
+@RestController
+@RequestMapping("${$rmp.cloud.oe}/examScoreNoticeQueue")
+public class ExamScoreNoticeQueueCloudServiceProvider extends ControllerSupport
+		implements ExamScoreNoticeQueueCloudService {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -2622841462905285211L;
+
+	@Autowired
+	private ExamScoreNoticeQueueRepo examScoreNoticeQueueRepo;
+	@Autowired
+	private ExamScoreObtainQueueService examScoreObtainQueueService;
+
+	/**
+	 * 定时发送分数获取通知 定时任务每5分钟发送一次
+	 */
+	@ApiOperation(value = "定时发送获取分数通知接口")
+	@PostMapping("/sendObtainScoreNotice")
+	@Override
+	public void sendObtainScoreNotice() {
+		log.info("开始执行sendObtainScoreNotice");
+		// 获取所有的通知队列
+		List<ExamScoreNoticeQueueEntity> examScoreNoticeQueueList = examScoreNoticeQueueRepo.findAll();
+		if (examScoreNoticeQueueList == null || examScoreNoticeQueueList.size() == 0) {
+			return;
+		}
+		for (ExamScoreNoticeQueueEntity noticeEntity : examScoreNoticeQueueList) {
+			// 获取当前组织机构的通知对象
+			NotifyUrlInfo notifyUrlInfo = examScoreObtainQueueService.getNotifyUrlInfo(noticeEntity.getRootOrgId());
+			// 只有配置了通知接口的才发送通知
+			if (StringUtils.isNotBlank(notifyUrlInfo.getNotifyUrl())) {
+				try {
+					OKHttpUtil.call(notifyUrlInfo.getHttpMethod(), notifyUrlInfo.getNotifyUrl());
+					// 发送通知没有问题,则清除通知队列中数据
+					examScoreNoticeQueueRepo.deleteById(noticeEntity.getRootOrgId());
+				} catch (Exception e) {
+					if (e instanceof UnknownHostException || e instanceof SocketException) {
+						try {
+							// 如果是由于连接超时,或者读取数据超时导致异常,需要对发送通知失败次数进行累加
+							long failTimes = noticeEntity.getFailTimes() == null ? 0
+									: noticeEntity.getFailTimes().longValue();
+							noticeEntity.setFailTimes(failTimes + 1);
+							noticeEntity.setUpdateTime(new Date());
+							examScoreNoticeQueueRepo.save(noticeEntity);
+						} catch (Exception e1) {
+							log.error("examScoreNoticeQueueRepo.save exception:" + e1.getMessage(), e1);
+						}
+					}
+					log.error("OeExamScoreNoticeQueueCloudServiceProvider-sendObtainScoreNotice:" + e.getMessage(), e);
+				}
+			}
+		}
+		log.info("结束执行sendObtainScoreNotice");
+	}
+
+}

+ 81 - 37
examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/provider/ExamScoreObtainQueueCloudServiceProvider.java

@@ -1,5 +1,10 @@
 package cn.com.qmth.examcloud.core.oe.admin.api.provider;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -11,7 +16,10 @@ import cn.com.qmth.examcloud.core.oe.admin.api.request.DeleteExamScoreQueueReq;
 import cn.com.qmth.examcloud.core.oe.admin.api.request.GetTopExamScoreQueueReq;
 import cn.com.qmth.examcloud.core.oe.admin.api.response.GetTopExamScoreQueueResp;
 import cn.com.qmth.examcloud.core.oe.admin.base.utils.Check;
+import cn.com.qmth.examcloud.core.oe.admin.base.utils.DateUtils;
+import cn.com.qmth.examcloud.core.oe.admin.dao.ExamScoreNoticeQueueRepo;
 import cn.com.qmth.examcloud.core.oe.admin.dao.ExamScoreObtainQueueRepo;
+import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamScoreNoticeQueueEntity;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamScoreObtainQueueEntity;
 import cn.com.qmth.examcloud.web.helpers.GlobalHelper;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
@@ -21,44 +29,80 @@ import io.swagger.annotations.ApiOperation;
 @Api(tags = "考试分数队列接口")
 @RestController
 @RequestMapping("${$rmp.cloud.oe}/examScoreObtainQueue")
-public class ExamScoreObtainQueueCloudServiceProvider extends ControllerSupport implements ExamScoreObtainQueueCloudService{
+public class ExamScoreObtainQueueCloudServiceProvider extends ControllerSupport
+        implements ExamScoreObtainQueueCloudService {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 9204539038969246524L;
+
+    @Autowired
+    private ExamScoreObtainQueueRepo examScoreObtainQueueRepo;
+
+    @Autowired
+    private ExamScoreNoticeQueueRepo examScoreNoticeQueueRepo;
 
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 9204539038969246524L;
-	
-	@Autowired
-	private ExamScoreObtainQueueRepo examScoreObtainQueueRepo;
-	
-	@Override
-	@ApiOperation(value = "获取当前机构分数队列顶层记录")
-	@PostMapping("/getTopExamScoreQueue")
-	public GetTopExamScoreQueueResp getTopExamScoreQueue(@RequestBody GetTopExamScoreQueueReq req) {
-		Check.isNull(req.getRootOrgId(), "顶级机构ID不能为空");
-		ExamScoreObtainQueueEntity examScoreObtainQueue = examScoreObtainQueueRepo.findTopByRootOrgIdAndIsValidOrderByIdAsc(req.getRootOrgId(), true);
-		GetTopExamScoreQueueResp getTopExamScoreQueueResp = new GetTopExamScoreQueueResp();
-		getTopExamScoreQueueResp.setIsEmpty(true);
-		if(examScoreObtainQueue!=null){
-			getTopExamScoreQueueResp.setExamId(examScoreObtainQueue.getExamId());
-			getTopExamScoreQueueResp.setQueueId(examScoreObtainQueue.getId());
-			getTopExamScoreQueueResp.setExamRecordDataId(examScoreObtainQueue.getExamRecordDataId());
-			getTopExamScoreQueueResp.setIsEmpty(false);
-		}
-		return getTopExamScoreQueueResp;
-	}
+    @Override
+    @ApiOperation(value = "获取当前机构分数队列顶层记录")
+    @PostMapping("/getTopExamScoreQueue")
+    public GetTopExamScoreQueueResp getTopExamScoreQueue(@RequestBody GetTopExamScoreQueueReq req) {
+        Check.isNull(req.getRootOrgId(), "顶级机构ID不能为空");
+        ExamScoreObtainQueueEntity examScoreObtainQueue = examScoreObtainQueueRepo
+                .findTopByRootOrgIdAndIsValidOrderByIdAsc(req.getRootOrgId(), true);
+        GetTopExamScoreQueueResp getTopExamScoreQueueResp = new GetTopExamScoreQueueResp();
+        getTopExamScoreQueueResp.setIsEmpty(true);
+        if (examScoreObtainQueue != null) {
+            getTopExamScoreQueueResp.setExamId(examScoreObtainQueue.getExamId());
+            getTopExamScoreQueueResp.setQueueId(examScoreObtainQueue.getId());
+            getTopExamScoreQueueResp.setExamRecordDataId(examScoreObtainQueue.getExamRecordDataId());
+            getTopExamScoreQueueResp.setIsEmpty(false);
+        }
+        return getTopExamScoreQueueResp;
+    }
 
-	@Override
-	@ApiOperation(value = "删除分数队列记录")
-	@PostMapping("/deleteExamScoreQueue")
-	public void deleteExamScoreQueue(@RequestBody DeleteExamScoreQueueReq req) {
-		Check.isNull(req.getQueueId(), "队列ID不能为空");
-		Check.isNull(req.getRootOrgId(), "顶级机构ID不能为空");
-		ExamScoreObtainQueueEntity examScoreObtainQueue =GlobalHelper.getEntity(examScoreObtainQueueRepo,req.getQueueId(),ExamScoreObtainQueueEntity.class);
-		if(examScoreObtainQueue!=null && examScoreObtainQueue.getRootOrgId().equals(req.getRootOrgId())){
-			examScoreObtainQueue.setIsValid(false);
-			examScoreObtainQueueRepo.save(examScoreObtainQueue);
-		}
-	}
+    @Override
+    @ApiOperation(value = "删除分数队列记录")
+    @PostMapping("/deleteExamScoreQueue")
+    public void deleteExamScoreQueue(@RequestBody DeleteExamScoreQueueReq req) {
+        Check.isNull(req.getQueueId(), "队列ID不能为空");
+        Check.isNull(req.getRootOrgId(), "顶级机构ID不能为空");
+        ExamScoreObtainQueueEntity examScoreObtainQueue = GlobalHelper.getEntity(examScoreObtainQueueRepo,
+                req.getQueueId(), ExamScoreObtainQueueEntity.class);
+        if (examScoreObtainQueue != null && examScoreObtainQueue.getRootOrgId().equals(req.getRootOrgId())) {
+            examScoreObtainQueue.setIsValid(false);
+            examScoreObtainQueueRepo.save(examScoreObtainQueue);
+        }
+    }
 
+    /**
+     * 定时更新获取分数通知队列
+     * 
+     */
+    @ApiOperation(value = "定时更新获取分数通知队列")
+    @PostMapping("/updateObtainScoreNodifyQueue")
+    @Override
+    public void updateObtainScoreNodifyQueue() {
+        Date now = new Date();
+        Date twoHoursBefore = DateUtils.addHours(now, -2);
+        // 1.查找超过创建超过2小时,且通知队列中不存在的待获取的数据
+        List<ExamScoreObtainQueueEntity> toObtainQueueList = examScoreObtainQueueRepo
+                .findByCreationTimeLessThanEquals(twoHoursBefore);
+        // 1.1如果不存在,不作任何处理
+        if (toObtainQueueList == null || toObtainQueueList.isEmpty()) {
+            return;
+        }
+        // 1.2如果存在,则创建相应组织机构的通知队列
+        List<Long> rootOrgList = toObtainQueueList.stream().map(ExamScoreObtainQueueEntity::getRootOrgId).distinct()
+                .collect(Collectors.<Long> toList());
+        List<ExamScoreNoticeQueueEntity> noticeQueueEntityList = new ArrayList<ExamScoreNoticeQueueEntity>();
+        rootOrgList.forEach(ro -> {
+            ExamScoreNoticeQueueEntity noticeQueueEntity = new ExamScoreNoticeQueueEntity();
+            noticeQueueEntity.setRootOrgId(ro);
+            noticeQueueEntity.setCreationTime(now);
+            noticeQueueEntityList.add(noticeQueueEntity);
+        });
+        // 批量插入通知队列
+        examScoreNoticeQueueRepo.saveAll(noticeQueueEntityList);
+    }
 }