wangwei 6 years ago
parent
commit
b1f76755a4

+ 19 - 0
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/CopyExamStudentRepo.java

@@ -0,0 +1,19 @@
+package cn.com.qmth.examcloud.task.dao;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import cn.com.qmth.examcloud.task.dao.entity.CopyExamStudentEntity;
+import cn.com.qmth.examcloud.task.dao.entity.CopyExamStudentPK;
+import cn.com.qmth.examcloud.task.dao.enums.CopyExamStudentStatus;
+
+@Repository
+public interface CopyExamStudentRepo
+		extends
+			JpaRepository<CopyExamStudentEntity, CopyExamStudentPK>,
+			JpaSpecificationExecutor<CopyExamStudentEntity> {
+
+	CopyExamStudentEntity findFirstByStatusOrderByCreationTime(CopyExamStudentStatus status);
+
+}

+ 89 - 0
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/CopyExamStudentEntity.java

@@ -0,0 +1,89 @@
+package cn.com.qmth.examcloud.task.dao.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.Table;
+
+import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
+import cn.com.qmth.examcloud.task.dao.enums.CopyExamStudentStatus;
+
+/**
+ * 考生复制
+ *
+ * @author WANGWEI
+ * @date 2018年8月2日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Entity
+@Table(name = "EC_T_COPY_EXAM_STUDENT")
+@IdClass(CopyExamStudentPK.class)
+public class CopyExamStudentEntity extends JpaEntity {
+
+	private static final long serialVersionUID = 1066874132817953168L;
+
+	private Long rootOrgId;
+
+	/**
+	 * copy from
+	 */
+	@Id
+	private Long examId1;
+
+	/**
+	 * copy to
+	 */
+	@Id
+	private Long examId2;
+
+	/**
+	 * 考试ID开始值
+	 */
+	private Long start;
+
+	/**
+	 * 状态
+	 */
+	private CopyExamStudentStatus status;
+
+	public Long getRootOrgId() {
+		return rootOrgId;
+	}
+
+	public void setRootOrgId(Long rootOrgId) {
+		this.rootOrgId = rootOrgId;
+	}
+
+	public Long getExamId1() {
+		return examId1;
+	}
+
+	public void setExamId1(Long examId1) {
+		this.examId1 = examId1;
+	}
+
+	public Long getExamId2() {
+		return examId2;
+	}
+
+	public void setExamId2(Long examId2) {
+		this.examId2 = examId2;
+	}
+
+	public Long getStart() {
+		return start;
+	}
+
+	public void setStart(Long start) {
+		this.start = start;
+	}
+
+	public CopyExamStudentStatus getStatus() {
+		return status;
+	}
+
+	public void setStatus(CopyExamStudentStatus status) {
+		this.status = status;
+	}
+
+}

+ 45 - 0
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/CopyExamStudentPK.java

@@ -0,0 +1,45 @@
+package cn.com.qmth.examcloud.task.dao.entity;
+
+import java.io.Serializable;
+
+/**
+ * 类注释
+ *
+ * @author WANGWEI
+ * @date 2018年9月12日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public class CopyExamStudentPK implements Serializable {
+
+	/**
+	 * 属性注释
+	 */
+	private static final long serialVersionUID = -5781237290039063837L;
+
+	/**
+	 * copy from
+	 */
+	private Long examId1;
+
+	/**
+	 * copy to
+	 */
+	private Long examId2;
+
+	public Long getExamId1() {
+		return examId1;
+	}
+
+	public void setExamId1(Long examId1) {
+		this.examId1 = examId1;
+	}
+
+	public Long getExamId2() {
+		return examId2;
+	}
+
+	public void setExamId2(Long examId2) {
+		this.examId2 = examId2;
+	}
+
+}

+ 34 - 0
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/enums/CopyExamStudentStatus.java

@@ -0,0 +1,34 @@
+package cn.com.qmth.examcloud.task.dao.enums;
+
+/**
+ * 类注释
+ *
+ * @author WANGWEI
+ * @date 2018年7月31日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public enum CopyExamStudentStatus {
+
+	NONE("未开始"), PROCESSING("数据处理中"), COMPLETE("数据处理完毕");
+
+	// ===========================================================================
+
+	/**
+	 * 描述
+	 */
+	private String desc;
+
+	/**
+	 * 构造函数
+	 *
+	 * @param desc
+	 */
+	private CopyExamStudentStatus(String desc) {
+		this.desc = desc;
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+
+}

+ 128 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/CopyExamStudentTask.java

@@ -0,0 +1,128 @@
+package cn.com.qmth.examcloud.task.service.job;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import com.google.common.collect.Lists;
+
+import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
+import cn.com.qmth.examcloud.examwork.api.ExamStudentCloudService;
+import cn.com.qmth.examcloud.examwork.api.request.CopyExamStudentsReq;
+import cn.com.qmth.examcloud.examwork.api.request.LockExamStudentsReq;
+import cn.com.qmth.examcloud.examwork.api.request.UnlockExamStudentsReq;
+import cn.com.qmth.examcloud.examwork.api.response.CopyExamStudentsResp;
+import cn.com.qmth.examcloud.task.base.AbstractTask;
+import cn.com.qmth.examcloud.task.base.ScheduleJob;
+import cn.com.qmth.examcloud.task.base.TaskTracker;
+import cn.com.qmth.examcloud.task.dao.CopyExamStudentRepo;
+import cn.com.qmth.examcloud.task.dao.entity.CopyExamStudentEntity;
+import cn.com.qmth.examcloud.task.dao.enums.CopyExamStudentStatus;
+
+/**
+ * 考生复制任务
+ *
+ * @author WANGWEI
+ * @date 2018年9月12日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Component("copyExamStudentTask")
+public class CopyExamStudentTask extends AbstractTask {
+
+	@Value("${$dir}")
+	private String dir;
+
+	@Autowired
+	TaskTracker TaskTracker;
+
+	@Autowired
+	CopyExamStudentRepo copyExamStudentRepo;
+
+	@Autowired
+	ExamCloudService examCloudService;
+
+	@Autowired
+	ExamStudentCloudService examStudentCloudService;
+
+	@Override
+	public void run(ScheduleJob scheduleJob) throws Exception {
+		CopyExamStudentEntity entity = copyExamStudentRepo
+				.findFirstByStatusOrderByCreationTime(CopyExamStudentStatus.PROCESSING);
+
+		if (null == entity) {
+			entity = copyExamStudentRepo
+					.findFirstByStatusOrderByCreationTime(CopyExamStudentStatus.NONE);
+		}
+
+		if (null == entity) {
+			return;
+		}
+
+		entity.setStatus(CopyExamStudentStatus.PROCESSING);
+
+		copyExamStudentRepo.save(entity);
+
+		process(entity);
+
+	}
+
+	/**
+	 * 方法注释
+	 *
+	 * @author WANGWEI
+	 * @param entity
+	 */
+	private void process(CopyExamStudentEntity entity) {
+
+		List<Long> examIdList = Lists.newArrayList();
+		examIdList.add(entity.getExamId1());
+		examIdList.add(entity.getExamId2());
+
+		// 锁定
+		LockExamStudentsReq lockReq = new LockExamStudentsReq();
+		lockReq.setExamIdList(examIdList);
+		examCloudService.lockExamStudents(lockReq);
+
+		try {
+			copy(entity);
+		} finally {
+			// 解锁
+			UnlockExamStudentsReq unlockReq = new UnlockExamStudentsReq();
+			unlockReq.setExamIdList(examIdList);
+			examCloudService.unlockExamStudents(unlockReq);
+		}
+
+	}
+
+	/**
+	 * 方法注释
+	 *
+	 * @author WANGWEI
+	 * @param entity
+	 */
+	private void copy(CopyExamStudentEntity entity) {
+		Long start = entity.getStart();
+
+		CopyExamStudentsReq req = new CopyExamStudentsReq();
+		req.setExamId1(entity.getExamId1());
+		req.setExamId2(entity.getExamId2());
+
+		while (true) {
+			req.setStart(start);
+			CopyExamStudentsResp resp = examStudentCloudService.copyExamStudents(req);
+			Long next = resp.getNext();
+			if (next.equals(start)) {
+				break;
+			} else {
+				start = next;
+			}
+		}
+	}
+
+	@Override
+	public TaskTracker getTaskTracker() {
+		return TaskTracker;
+	}
+}