wangwei 6 年之前
父節點
當前提交
0b53c9c1b2
共有 24 個文件被更改,包括 2024 次插入2024 次删除
  1. 96 96
      examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/controller/CopyExamStudentController.java
  2. 230 230
      examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/controller/ExamStudentImportController.java
  3. 85 85
      examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/controller/JobController.java
  4. 1 1
      examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/controller/bean/ExamStudentImportDomain.java
  5. 189 189
      examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/provider/DataSyncCloudServiceProvider.java
  6. 59 59
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/AbstractTask.java
  7. 57 57
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/DistributionJob.java
  8. 4 4
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/QuartzManager.java
  9. 94 94
      examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/CopyExamStudentEntity.java
  10. 102 102
      examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/DataSyncEntity.java
  11. 1 1
      examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/ExamStudentImportEntity.java
  12. 414 414
      examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/ExamStudentTempEntity.java
  13. 1 1
      examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/ScheduleJobEntity.java
  14. 103 103
      examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/TaskTraceEntity.java
  15. 76 76
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/DefaultTaskTracker.java
  16. 86 86
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/impl/DataSyncServiceImpl.java
  17. 74 74
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/DataSyncTask.java
  18. 92 92
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/ExamStudentImportCleanTask.java
  19. 2 2
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/ExamStudentImportDataProcessingTask.java
  20. 2 2
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/ExamStudentImportParsingFileTask.java
  21. 7 7
      examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/TaskApp.java
  22. 39 39
      examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/AppSelfInspection.java
  23. 115 115
      examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/DefaultWebMvcConfigurerAdapter.java
  24. 95 95
      examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/JdbcTemplateHolder.java

+ 96 - 96
examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/controller/CopyExamStudentController.java

@@ -1,96 +1,96 @@
-package cn.com.qmth.examcloud.task.api.controller;
-
-import java.util.List;
-
-import javax.transaction.Transactional;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.google.common.collect.Lists;
-
-import cn.com.qmth.examcloud.commons.base.exception.StatusException;
-import cn.com.qmth.examcloud.commons.web.security.bean.User;
-import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
-import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
-import cn.com.qmth.examcloud.examwork.api.bean.ExamBean;
-import cn.com.qmth.examcloud.examwork.api.request.GetExamReq;
-import cn.com.qmth.examcloud.examwork.api.request.LockExamStudentsReq;
-import cn.com.qmth.examcloud.task.dao.CopyExamStudentRepo;
-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;
-import io.swagger.annotations.ApiOperation;
-
-/**
- * 考生复制
- *
- * @author WANGWEI
- * @date 2018年9月12日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Transactional
-@RestController
-@RequestMapping("${$rmp.ctr.task}" + "copyExamStudent")
-public class CopyExamStudentController extends ControllerSupport {
-
-	@Value("${$dir}")
-	private String dir;
-
-	@Autowired
-	CopyExamStudentRepo copyExamStudentRepo;
-
-	@Autowired
-	ExamCloudService examCloudService;
-
-	@ApiOperation(value = "添加考生复制任务")
-	@PostMapping("addCopyTask")
-	public void addCopyTask(@RequestParam(required = true) Long examId1,
-			@RequestParam(required = true) Long examId2) {
-
-		User accessUser = getAccessUser();
-		Long rootOrgId = accessUser.getRootOrgId();
-
-		GetExamReq req = new GetExamReq();
-		req.setRootOrgId(rootOrgId);
-
-		req.setId(examId1);
-		ExamBean exam1 = examCloudService.getExam(req).getExamBean();
-
-		req.setId(examId2);
-		ExamBean exam2 = examCloudService.getExam(req).getExamBean();
-
-		CopyExamStudentPK pk = new CopyExamStudentPK(examId1, examId2);
-		CopyExamStudentEntity one = copyExamStudentRepo.findOne(pk);
-
-		if (null != one && (!one.getStatus().equals(CopyExamStudentStatus.COMPLETE))) {
-			throw new StatusException("T-620001", "复制中,请勿重复操作");
-		}
-
-		if (null == one) {
-			one = new CopyExamStudentEntity();
-			one.setExamId1(exam1.getId());
-			one.setExamId2(exam2.getId());
-			one.setRootOrgId(rootOrgId);
-		}
-
-		one.setStart(1L);
-		one.setStatus(CopyExamStudentStatus.NONE);
-
-		// 锁定
-		List<Long> examIdList = Lists.newArrayList();
-		examIdList.add(one.getExamId1());
-		examIdList.add(one.getExamId2());
-
-		LockExamStudentsReq lockReq = new LockExamStudentsReq();
-		lockReq.setExamIdList(examIdList);
-		examCloudService.lockExamStudents(lockReq);
-
-		copyExamStudentRepo.save(one);
-	}
-
-}
+package cn.com.qmth.examcloud.task.api.controller;
+
+import java.util.List;
+
+import javax.transaction.Transactional;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.google.common.collect.Lists;
+
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
+import cn.com.qmth.examcloud.examwork.api.bean.ExamBean;
+import cn.com.qmth.examcloud.examwork.api.request.GetExamReq;
+import cn.com.qmth.examcloud.examwork.api.request.LockExamStudentsReq;
+import cn.com.qmth.examcloud.task.dao.CopyExamStudentRepo;
+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;
+import cn.com.qmth.examcloud.web.security.bean.User;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 考生复制
+ *
+ * @author WANGWEI
+ * @date 2018年9月12日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Transactional
+@RestController
+@RequestMapping("${$rmp.ctr.task}" + "copyExamStudent")
+public class CopyExamStudentController extends ControllerSupport {
+
+	@Value("${$dir}")
+	private String dir;
+
+	@Autowired
+	CopyExamStudentRepo copyExamStudentRepo;
+
+	@Autowired
+	ExamCloudService examCloudService;
+
+	@ApiOperation(value = "添加考生复制任务")
+	@PostMapping("addCopyTask")
+	public void addCopyTask(@RequestParam(required = true) Long examId1,
+			@RequestParam(required = true) Long examId2) {
+
+		User accessUser = getAccessUser();
+		Long rootOrgId = accessUser.getRootOrgId();
+
+		GetExamReq req = new GetExamReq();
+		req.setRootOrgId(rootOrgId);
+
+		req.setId(examId1);
+		ExamBean exam1 = examCloudService.getExam(req).getExamBean();
+
+		req.setId(examId2);
+		ExamBean exam2 = examCloudService.getExam(req).getExamBean();
+
+		CopyExamStudentPK pk = new CopyExamStudentPK(examId1, examId2);
+		CopyExamStudentEntity one = copyExamStudentRepo.findOne(pk);
+
+		if (null != one && (!one.getStatus().equals(CopyExamStudentStatus.COMPLETE))) {
+			throw new StatusException("T-620001", "复制中,请勿重复操作");
+		}
+
+		if (null == one) {
+			one = new CopyExamStudentEntity();
+			one.setExamId1(exam1.getId());
+			one.setExamId2(exam2.getId());
+			one.setRootOrgId(rootOrgId);
+		}
+
+		one.setStart(1L);
+		one.setStatus(CopyExamStudentStatus.NONE);
+
+		// 锁定
+		List<Long> examIdList = Lists.newArrayList();
+		examIdList.add(one.getExamId1());
+		examIdList.add(one.getExamId2());
+
+		LockExamStudentsReq lockReq = new LockExamStudentsReq();
+		lockReq.setExamIdList(examIdList);
+		examCloudService.lockExamStudents(lockReq);
+
+		copyExamStudentRepo.save(one);
+	}
+
+}

+ 230 - 230
examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/controller/ExamStudentImportController.java

@@ -1,230 +1,230 @@
-package cn.com.qmth.examcloud.task.api.controller;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.criteria.Predicate;
-import javax.transaction.Transactional;
-
-import org.apache.commons.fileupload.disk.DiskFileItem;
-import org.apache.commons.io.FileUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
-
-import com.google.common.collect.Lists;
-
-import cn.com.qmth.examcloud.commons.base.util.DateUtil;
-import cn.com.qmth.examcloud.commons.base.util.DateUtil.DatePatterns;
-import cn.com.qmth.examcloud.commons.base.util.PathUtil;
-import cn.com.qmth.examcloud.commons.web.helpers.page.PageInfo;
-import cn.com.qmth.examcloud.commons.web.security.bean.User;
-import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
-import cn.com.qmth.examcloud.core.basic.api.OrgCloudService;
-import cn.com.qmth.examcloud.core.basic.api.bean.OrgBean;
-import cn.com.qmth.examcloud.core.basic.api.request.GetOrgReq;
-import cn.com.qmth.examcloud.core.basic.api.response.GetOrgResp;
-import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
-import cn.com.qmth.examcloud.examwork.api.bean.ExamBean;
-import cn.com.qmth.examcloud.examwork.api.request.GetExamReq;
-import cn.com.qmth.examcloud.examwork.api.response.GetExamResp;
-import cn.com.qmth.examcloud.task.api.controller.bean.ExamStudentImportDomain;
-import cn.com.qmth.examcloud.task.dao.ExamStudentImportRepo;
-import cn.com.qmth.examcloud.task.dao.entity.ExamStudentImportEntity;
-import cn.com.qmth.examcloud.task.dao.enums.ExamStudentImportStatus;
-import io.swagger.annotations.ApiOperation;
-
-/**
- * 考生导入
- *
- * @author WANGWEI
- * @date 2018年7月31日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Transactional
-@RestController
-@RequestMapping("${$rmp.ctr.task}" + "examStudentImport")
-public class ExamStudentImportController extends ControllerSupport {
-
-	@Value("${$dir}")
-	private String dir;
-
-	private static final String EXAM_STUDENT_IMPORT_FILES = "exam_student_import_files";
-
-	@Autowired
-	ExamStudentImportRepo examStudentImportRepo;
-
-	@Autowired
-	OrgCloudService orgCloudService;
-
-	@Autowired
-	ExamCloudService examCloudService;
-
-	@ApiOperation(value = "导入考试学生", notes = "导入")
-	@PostMapping("/import")
-	public void importExamStudent(@RequestParam Long examId,
-			@RequestParam CommonsMultipartFile file) throws Exception {
-		User accessUser = getAccessUser();
-		Long rootOrgId = accessUser.getRootOrgId();
-
-		GetExamReq req = new GetExamReq();
-		req.setId(examId);
-		req.setRootOrgId(accessUser.getRootOrgId());
-		examCloudService.getExam(req);
-
-		DiskFileItem item = (DiskFileItem) file.getFileItem();
-		File storeLocation = item.getStoreLocation();
-		String originalFilename = file.getOriginalFilename();
-
-		String suffix = originalFilename.substring(originalFilename.indexOf("."));
-		long batchId = System.currentTimeMillis();
-		String name = new StringBuilder().append(rootOrgId).append("_").append(examId).append("_")
-				.append(DateUtil.getNow(DatePatterns.YYYYMMDDHHMM)).toString();
-
-		String destFileName = name + suffix;
-		String resultFileName = name + ".txt";
-
-		String destFilePath = PathUtil
-				.getCanonicalPath(dir + "/" + EXAM_STUDENT_IMPORT_FILES + "/" + destFileName);
-		File destFile = new File(destFilePath);
-
-		FileUtils.copyFile(storeLocation, destFile);
-
-		ExamStudentImportEntity examStudentImport = new ExamStudentImportEntity();
-		examStudentImport.setBatchId(batchId);
-		examStudentImport.setFailNum(0L);
-		examStudentImport.setSuccessNum(0L);
-		examStudentImport.setTotalNum(0L);
-		examStudentImport.setFilePath(destFileName);
-		examStudentImport.setResultFilePath(resultFileName);
-		examStudentImport.setStatus(ExamStudentImportStatus.NONE);
-		examStudentImport.setRootOrgId(rootOrgId);
-		examStudentImport.setExamId(examId);
-		examStudentImport.setFileName(originalFilename);
-
-		examStudentImportRepo.saveAndFlush(examStudentImport);
-	}
-
-	@ApiOperation(value = "查询导入记录", notes = "")
-	@GetMapping("/all/{curPage}/{pageSize}")
-	public PageInfo<ExamStudentImportDomain> getExamStudentImportList(@PathVariable Integer curPage,
-			@PathVariable Integer pageSize) {
-		User accessUser = getAccessUser();
-		Long rootOrgId = accessUser.getRootOrgId();
-
-		Specification<ExamStudentImportEntity> specification = (root, query, cb) -> {
-			List<Predicate> predicates = new ArrayList<>();
-			if (!isSuperAdmin()) {
-				predicates.add(cb.equal(root.get("rootOrgId"), rootOrgId));
-			}
-
-			return cb.and(predicates.toArray(new Predicate[predicates.size()]));
-		};
-
-		Pageable pageable = new PageRequest(curPage, pageSize, Sort.Direction.DESC, "creationTime");
-		Page<ExamStudentImportEntity> list = examStudentImportRepo.findAll(specification, pageable);
-
-		List<ExamStudentImportDomain> ret = Lists.newArrayList();
-
-		for (ExamStudentImportEntity cur : list) {
-			ExamStudentImportDomain domain = new ExamStudentImportDomain();
-			domain.setBatchId(cur.getBatchId());
-			domain.setExamId(cur.getExamId());
-			domain.setFailNum(cur.getFailNum());
-			domain.setFileName(cur.getFileName());
-			domain.setFilePath(cur.getFilePath());
-			domain.setId(cur.getId());
-			domain.setResultFilePath(cur.getResultFilePath());
-			domain.setRootOrgId(cur.getRootOrgId());
-			domain.setStatus(cur.getStatus().name());
-			domain.setStatusDesc(cur.getStatus().getDesc());
-			domain.setSuccessNum(cur.getSuccessNum());
-			domain.setTotalNum(cur.getTotalNum());
-			domain.setErrorDesc(cur.getErrorDesc());
-			domain.setCreationTime(cur.getCreationTime());
-			domain.setUpdateTime(cur.getUpdateTime());
-
-			GetExamReq req = new GetExamReq();
-			req.setId(domain.getExamId());
-			req.setRootOrgId(domain.getRootOrgId());
-			GetExamResp examResp = examCloudService.getExam(req);
-			ExamBean examBean = examResp.getExamBean();
-			domain.setExamName(examBean.getName());
-
-			GetOrgReq getOrgReq = new GetOrgReq();
-			getOrgReq.setOrgId(domain.getRootOrgId());
-			getOrgReq.setRootOrgId(rootOrgId);
-			GetOrgResp getOrgResp = orgCloudService.getOrg(getOrgReq);
-			OrgBean org = getOrgResp.getOrg();
-			domain.setRootOrgName(org.getName());
-
-			ret.add(domain);
-		}
-
-		return new PageInfo<ExamStudentImportDomain>(list, ret);
-	}
-
-	@ApiOperation(value = "下载报告")
-	@GetMapping("/getReports/{id}")
-	public void importFileTemplate(@PathVariable Long id) {
-
-		ExamStudentImportEntity entity = examStudentImportRepo.findOne(id);
-		String resultFilePath = entity.getResultFilePath();
-
-		if (!isSuperAdmin()) {
-			if (!entity.getRootOrgId().equals(getRootOrgId())) {
-				exportFile(resultFilePath, "非法请求.".getBytes());
-			}
-		}
-
-		String path = PathUtil
-				.getCanonicalPath(dir + "/" + EXAM_STUDENT_IMPORT_FILES + "/" + resultFilePath);
-
-		File file = new File(path);
-
-		if (!file.exists()) {
-			exportFile(resultFilePath, "报告未生成.".getBytes());
-		}
-
-		exportFile(resultFilePath, file);
-	}
-
-	@ApiOperation(value = "下载导入文件")
-	@GetMapping("/getUploadedFile/{id}")
-	public void getUploadedFile(@PathVariable Long id) {
-
-		ExamStudentImportEntity entity = examStudentImportRepo.findOne(id);
-		String fileName = entity.getFileName();
-
-		if (!isSuperAdmin()) {
-			if (!entity.getRootOrgId().equals(getRootOrgId())) {
-				exportFile(fileName, "非法请求.".getBytes());
-			}
-		}
-
-		String filePath = entity.getFilePath();
-		String path = PathUtil
-				.getCanonicalPath(dir + "/" + EXAM_STUDENT_IMPORT_FILES + "/" + filePath);
-
-		File file = new File(path);
-
-		if (!file.exists()) {
-			exportFile(fileName, "文件不存在.".getBytes());
-		}
-
-		exportFile(fileName, file);
-	}
-
-}
+package cn.com.qmth.examcloud.task.api.controller;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.criteria.Predicate;
+import javax.transaction.Transactional;
+
+import org.apache.commons.fileupload.disk.DiskFileItem;
+import org.apache.commons.io.FileUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import com.google.common.collect.Lists;
+
+import cn.com.qmth.examcloud.commons.util.DateUtil;
+import cn.com.qmth.examcloud.commons.util.PathUtil;
+import cn.com.qmth.examcloud.commons.util.DateUtil.DatePatterns;
+import cn.com.qmth.examcloud.core.basic.api.OrgCloudService;
+import cn.com.qmth.examcloud.core.basic.api.bean.OrgBean;
+import cn.com.qmth.examcloud.core.basic.api.request.GetOrgReq;
+import cn.com.qmth.examcloud.core.basic.api.response.GetOrgResp;
+import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
+import cn.com.qmth.examcloud.examwork.api.bean.ExamBean;
+import cn.com.qmth.examcloud.examwork.api.request.GetExamReq;
+import cn.com.qmth.examcloud.examwork.api.response.GetExamResp;
+import cn.com.qmth.examcloud.task.api.controller.bean.ExamStudentImportDomain;
+import cn.com.qmth.examcloud.task.dao.ExamStudentImportRepo;
+import cn.com.qmth.examcloud.task.dao.entity.ExamStudentImportEntity;
+import cn.com.qmth.examcloud.task.dao.enums.ExamStudentImportStatus;
+import cn.com.qmth.examcloud.web.helpers.page.PageInfo;
+import cn.com.qmth.examcloud.web.security.bean.User;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 考生导入
+ *
+ * @author WANGWEI
+ * @date 2018年7月31日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Transactional
+@RestController
+@RequestMapping("${$rmp.ctr.task}" + "examStudentImport")
+public class ExamStudentImportController extends ControllerSupport {
+
+	@Value("${$dir}")
+	private String dir;
+
+	private static final String EXAM_STUDENT_IMPORT_FILES = "exam_student_import_files";
+
+	@Autowired
+	ExamStudentImportRepo examStudentImportRepo;
+
+	@Autowired
+	OrgCloudService orgCloudService;
+
+	@Autowired
+	ExamCloudService examCloudService;
+
+	@ApiOperation(value = "导入考试学生", notes = "导入")
+	@PostMapping("/import")
+	public void importExamStudent(@RequestParam Long examId,
+			@RequestParam CommonsMultipartFile file) throws Exception {
+		User accessUser = getAccessUser();
+		Long rootOrgId = accessUser.getRootOrgId();
+
+		GetExamReq req = new GetExamReq();
+		req.setId(examId);
+		req.setRootOrgId(accessUser.getRootOrgId());
+		examCloudService.getExam(req);
+
+		DiskFileItem item = (DiskFileItem) file.getFileItem();
+		File storeLocation = item.getStoreLocation();
+		String originalFilename = file.getOriginalFilename();
+
+		String suffix = originalFilename.substring(originalFilename.indexOf("."));
+		long batchId = System.currentTimeMillis();
+		String name = new StringBuilder().append(rootOrgId).append("_").append(examId).append("_")
+				.append(DateUtil.getNow(DatePatterns.YYYYMMDDHHMM)).toString();
+
+		String destFileName = name + suffix;
+		String resultFileName = name + ".txt";
+
+		String destFilePath = PathUtil
+				.getCanonicalPath(dir + "/" + EXAM_STUDENT_IMPORT_FILES + "/" + destFileName);
+		File destFile = new File(destFilePath);
+
+		FileUtils.copyFile(storeLocation, destFile);
+
+		ExamStudentImportEntity examStudentImport = new ExamStudentImportEntity();
+		examStudentImport.setBatchId(batchId);
+		examStudentImport.setFailNum(0L);
+		examStudentImport.setSuccessNum(0L);
+		examStudentImport.setTotalNum(0L);
+		examStudentImport.setFilePath(destFileName);
+		examStudentImport.setResultFilePath(resultFileName);
+		examStudentImport.setStatus(ExamStudentImportStatus.NONE);
+		examStudentImport.setRootOrgId(rootOrgId);
+		examStudentImport.setExamId(examId);
+		examStudentImport.setFileName(originalFilename);
+
+		examStudentImportRepo.saveAndFlush(examStudentImport);
+	}
+
+	@ApiOperation(value = "查询导入记录", notes = "")
+	@GetMapping("/all/{curPage}/{pageSize}")
+	public PageInfo<ExamStudentImportDomain> getExamStudentImportList(@PathVariable Integer curPage,
+			@PathVariable Integer pageSize) {
+		User accessUser = getAccessUser();
+		Long rootOrgId = accessUser.getRootOrgId();
+
+		Specification<ExamStudentImportEntity> specification = (root, query, cb) -> {
+			List<Predicate> predicates = new ArrayList<>();
+			if (!isSuperAdmin()) {
+				predicates.add(cb.equal(root.get("rootOrgId"), rootOrgId));
+			}
+
+			return cb.and(predicates.toArray(new Predicate[predicates.size()]));
+		};
+
+		Pageable pageable = new PageRequest(curPage, pageSize, Sort.Direction.DESC, "creationTime");
+		Page<ExamStudentImportEntity> list = examStudentImportRepo.findAll(specification, pageable);
+
+		List<ExamStudentImportDomain> ret = Lists.newArrayList();
+
+		for (ExamStudentImportEntity cur : list) {
+			ExamStudentImportDomain domain = new ExamStudentImportDomain();
+			domain.setBatchId(cur.getBatchId());
+			domain.setExamId(cur.getExamId());
+			domain.setFailNum(cur.getFailNum());
+			domain.setFileName(cur.getFileName());
+			domain.setFilePath(cur.getFilePath());
+			domain.setId(cur.getId());
+			domain.setResultFilePath(cur.getResultFilePath());
+			domain.setRootOrgId(cur.getRootOrgId());
+			domain.setStatus(cur.getStatus().name());
+			domain.setStatusDesc(cur.getStatus().getDesc());
+			domain.setSuccessNum(cur.getSuccessNum());
+			domain.setTotalNum(cur.getTotalNum());
+			domain.setErrorDesc(cur.getErrorDesc());
+			domain.setCreationTime(cur.getCreationTime());
+			domain.setUpdateTime(cur.getUpdateTime());
+
+			GetExamReq req = new GetExamReq();
+			req.setId(domain.getExamId());
+			req.setRootOrgId(domain.getRootOrgId());
+			GetExamResp examResp = examCloudService.getExam(req);
+			ExamBean examBean = examResp.getExamBean();
+			domain.setExamName(examBean.getName());
+
+			GetOrgReq getOrgReq = new GetOrgReq();
+			getOrgReq.setOrgId(domain.getRootOrgId());
+			getOrgReq.setRootOrgId(rootOrgId);
+			GetOrgResp getOrgResp = orgCloudService.getOrg(getOrgReq);
+			OrgBean org = getOrgResp.getOrg();
+			domain.setRootOrgName(org.getName());
+
+			ret.add(domain);
+		}
+
+		return new PageInfo<ExamStudentImportDomain>(list, ret);
+	}
+
+	@ApiOperation(value = "下载报告")
+	@GetMapping("/getReports/{id}")
+	public void importFileTemplate(@PathVariable Long id) {
+
+		ExamStudentImportEntity entity = examStudentImportRepo.findOne(id);
+		String resultFilePath = entity.getResultFilePath();
+
+		if (!isSuperAdmin()) {
+			if (!entity.getRootOrgId().equals(getRootOrgId())) {
+				exportFile(resultFilePath, "非法请求.".getBytes());
+			}
+		}
+
+		String path = PathUtil
+				.getCanonicalPath(dir + "/" + EXAM_STUDENT_IMPORT_FILES + "/" + resultFilePath);
+
+		File file = new File(path);
+
+		if (!file.exists()) {
+			exportFile(resultFilePath, "报告未生成.".getBytes());
+		}
+
+		exportFile(resultFilePath, file);
+	}
+
+	@ApiOperation(value = "下载导入文件")
+	@GetMapping("/getUploadedFile/{id}")
+	public void getUploadedFile(@PathVariable Long id) {
+
+		ExamStudentImportEntity entity = examStudentImportRepo.findOne(id);
+		String fileName = entity.getFileName();
+
+		if (!isSuperAdmin()) {
+			if (!entity.getRootOrgId().equals(getRootOrgId())) {
+				exportFile(fileName, "非法请求.".getBytes());
+			}
+		}
+
+		String filePath = entity.getFilePath();
+		String path = PathUtil
+				.getCanonicalPath(dir + "/" + EXAM_STUDENT_IMPORT_FILES + "/" + filePath);
+
+		File file = new File(path);
+
+		if (!file.exists()) {
+			exportFile(fileName, "文件不存在.".getBytes());
+		}
+
+		exportFile(fileName, file);
+	}
+
+}

+ 85 - 85
examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/controller/JobController.java

@@ -1,85 +1,85 @@
-package cn.com.qmth.examcloud.task.api.controller;
-
-import javax.transaction.Transactional;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
-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.base.exception.StatusException;
-import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
-import cn.com.qmth.examcloud.task.base.QuartzManager;
-import cn.com.qmth.examcloud.task.base.ScheduleJob;
-import cn.com.qmth.examcloud.task.dao.ScheduleJobRepo;
-import cn.com.qmth.examcloud.task.dao.entity.ScheduleJobEntity;
-import io.swagger.annotations.ApiOperation;
-
-@Transactional
-@RestController
-@RequestMapping("${$rmp.ctr.task}" + "job")
-public class JobController extends ControllerSupport {
-
-	@Autowired
-	private ScheduleJobRepo scheduleJobEntityRepo;
-
-	@Autowired
-	private QuartzManager quartzManager;
-
-	@ApiOperation(value = "启动job")
-	@PostMapping("/executeJob/{jobName}")
-	public void executeJob(@PathVariable String jobName) {
-		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
-		quartzManager.addJob(scheduleJob);
-	}
-
-	@ApiOperation(value = "暂停job")
-	@PostMapping("/pauseJob/{jobName}")
-	public void pauseJob(@PathVariable String jobName) {
-		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
-		quartzManager.pauseJob(scheduleJob);
-	}
-
-	@ApiOperation(value = "从暂停中恢复job")
-	@PostMapping("/resumeJob/{jobName}")
-	public void resumeJob(@PathVariable String jobName) {
-		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
-		quartzManager.resumeJob(scheduleJob);
-	}
-
-	@ApiOperation(value = "删除job")
-	@PostMapping("/deleteJob/{jobName}")
-	public void deleteJob(@PathVariable String jobName) {
-		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
-		quartzManager.deleteJob(scheduleJob);
-	}
-
-	/**
-	 * 获取可用job
-	 *
-	 * @author WANGWEI
-	 * @param jobName
-	 * @return
-	 */
-	private ScheduleJob getEnableScheduleJob(String jobName) {
-		ScheduleJobEntity jobEntity = scheduleJobEntityRepo.findByJobName(jobName);
-		if (null == jobEntity) {
-			throw new StatusException("T-100001", "任务不存在");
-		}
-
-		if (!jobEntity.getEnable()) {
-			throw new StatusException("T-100002", "任务被禁用");
-		}
-
-		ScheduleJob scheduleJob = new ScheduleJob();
-		scheduleJob.setJobName(jobEntity.getJobName());
-		scheduleJob.setJobGroup(jobEntity.getJobGroup());
-		scheduleJob.setSpringBean(jobEntity.getSpringBean());
-		scheduleJob.setCronExpression(jobEntity.getCronExpression());
-		scheduleJob.setStateful(jobEntity.getStateful());
-
-		return scheduleJob;
-	}
-
-}
+package cn.com.qmth.examcloud.task.api.controller;
+
+import javax.transaction.Transactional;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+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.exception.StatusException;
+import cn.com.qmth.examcloud.task.base.QuartzManager;
+import cn.com.qmth.examcloud.task.base.ScheduleJob;
+import cn.com.qmth.examcloud.task.dao.ScheduleJobRepo;
+import cn.com.qmth.examcloud.task.dao.entity.ScheduleJobEntity;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+import io.swagger.annotations.ApiOperation;
+
+@Transactional
+@RestController
+@RequestMapping("${$rmp.ctr.task}" + "job")
+public class JobController extends ControllerSupport {
+
+	@Autowired
+	private ScheduleJobRepo scheduleJobEntityRepo;
+
+	@Autowired
+	private QuartzManager quartzManager;
+
+	@ApiOperation(value = "启动job")
+	@PostMapping("/executeJob/{jobName}")
+	public void executeJob(@PathVariable String jobName) {
+		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
+		quartzManager.addJob(scheduleJob);
+	}
+
+	@ApiOperation(value = "暂停job")
+	@PostMapping("/pauseJob/{jobName}")
+	public void pauseJob(@PathVariable String jobName) {
+		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
+		quartzManager.pauseJob(scheduleJob);
+	}
+
+	@ApiOperation(value = "从暂停中恢复job")
+	@PostMapping("/resumeJob/{jobName}")
+	public void resumeJob(@PathVariable String jobName) {
+		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
+		quartzManager.resumeJob(scheduleJob);
+	}
+
+	@ApiOperation(value = "删除job")
+	@PostMapping("/deleteJob/{jobName}")
+	public void deleteJob(@PathVariable String jobName) {
+		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
+		quartzManager.deleteJob(scheduleJob);
+	}
+
+	/**
+	 * 获取可用job
+	 *
+	 * @author WANGWEI
+	 * @param jobName
+	 * @return
+	 */
+	private ScheduleJob getEnableScheduleJob(String jobName) {
+		ScheduleJobEntity jobEntity = scheduleJobEntityRepo.findByJobName(jobName);
+		if (null == jobEntity) {
+			throw new StatusException("T-100001", "任务不存在");
+		}
+
+		if (!jobEntity.getEnable()) {
+			throw new StatusException("T-100002", "任务被禁用");
+		}
+
+		ScheduleJob scheduleJob = new ScheduleJob();
+		scheduleJob.setJobName(jobEntity.getJobName());
+		scheduleJob.setJobGroup(jobEntity.getJobGroup());
+		scheduleJob.setSpringBean(jobEntity.getSpringBean());
+		scheduleJob.setCronExpression(jobEntity.getCronExpression());
+		scheduleJob.setStateful(jobEntity.getStateful());
+
+		return scheduleJob;
+	}
+
+}

+ 1 - 1
examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/controller/bean/ExamStudentImportDomain.java

@@ -5,7 +5,7 @@ import java.util.Date;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 
-import cn.com.qmth.examcloud.commons.web.cloud.api.JsonSerializable;
+import cn.com.qmth.examcloud.web.cloud.api.JsonSerializable;
 
 /**
  * 考生导入

+ 189 - 189
examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/provider/DataSyncCloudServiceProvider.java

@@ -1,189 +1,189 @@
-package cn.com.qmth.examcloud.task.api.provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import cn.com.qmth.examcloud.commons.base.util.PropertiesUtil;
-import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
-import cn.com.qmth.examcloud.task.api.DataSyncCloudService;
-import cn.com.qmth.examcloud.task.api.request.SyncCourseReq;
-import cn.com.qmth.examcloud.task.api.request.SyncExamReq;
-import cn.com.qmth.examcloud.task.api.request.SyncExamStudentReq;
-import cn.com.qmth.examcloud.task.api.request.SyncOrgReq;
-import cn.com.qmth.examcloud.task.api.request.SyncSpecialtyReq;
-import cn.com.qmth.examcloud.task.api.request.SyncStudentReq;
-import cn.com.qmth.examcloud.task.api.request.SyncUserReq;
-import cn.com.qmth.examcloud.task.api.response.SyncCourseResp;
-import cn.com.qmth.examcloud.task.api.response.SyncExamResp;
-import cn.com.qmth.examcloud.task.api.response.SyncExamStudentResp;
-import cn.com.qmth.examcloud.task.api.response.SyncOrgResp;
-import cn.com.qmth.examcloud.task.api.response.SyncSpecialtyResp;
-import cn.com.qmth.examcloud.task.api.response.SyncStudentResp;
-import cn.com.qmth.examcloud.task.api.response.SyncUserResp;
-import cn.com.qmth.examcloud.task.service.DataSyncService;
-
-/**
- * 数据同步
- *
- * @author WANGWEI
- * @date 2018年8月2日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@RestController
-@RequestMapping("${$rmp.cloud.task}" + "dataSync")
-public class DataSyncCloudServiceProvider extends ControllerSupport
-		implements
-			DataSyncCloudService {
-
-	private static final long serialVersionUID = -2880611326177571371L;
-
-	@Autowired
-	DataSyncService dataSyncService;
-
-	private Boolean async() {
-		boolean async = PropertiesUtil.getBoolean("$sync.async", true);
-		return async;
-	}
-
-	@PostMapping("syncCourse")
-	@Override
-	public SyncCourseResp syncCourse(@RequestBody SyncCourseReq req) {
-		cn.com.qmth.examcloud.commons.api.request.SyncCourseReq r = new cn.com.qmth.examcloud.commons.api.request.SyncCourseReq();
-		r.setCode(req.getCode());
-		r.setEnable(req.getEnable());
-		r.setId(req.getId());
-		r.setLevel(req.getLevel());
-		r.setName(req.getName());
-		r.setRootOrgId(req.getRootOrgId());
-		r.setSyncType(req.getSyncType());
-		dataSyncService.sync("syncCourse", r, async(), true);
-
-		SyncCourseResp resp = new SyncCourseResp();
-		return resp;
-	}
-
-	@PostMapping("syncOrg")
-	@Override
-	public SyncOrgResp syncOrg(@RequestBody SyncOrgReq req) {
-		cn.com.qmth.examcloud.commons.api.request.SyncOrgReq r = new cn.com.qmth.examcloud.commons.api.request.SyncOrgReq();
-		r.setEnable(req.getEnable());
-		r.setId(req.getId());
-		r.setName(req.getName());
-		r.setParentId(req.getParentId());
-		r.setRootId(req.getRootId());
-		r.setSyncType(req.getSyncType());
-		dataSyncService.sync("syncOrg", r, async(), true);
-
-		SyncOrgResp resp = new SyncOrgResp();
-		return resp;
-	}
-
-	@PostMapping("syncStudent")
-	@Override
-	public SyncStudentResp syncStudent(@RequestBody SyncStudentReq req) {
-
-		cn.com.qmth.examcloud.commons.api.request.SyncStudentReq r = new cn.com.qmth.examcloud.commons.api.request.SyncStudentReq();
-		r.setEnable(req.getEnable());
-		r.setId(req.getId());
-		r.setIdentityNumber(req.getIdentityNumber());
-		r.setName(req.getName());
-		r.setOrgCode(req.getOrgCode());
-		r.setOrgId(req.getOrgId());
-		r.setOrgName(req.getOrgName());
-		r.setPhoneNumber(req.getPhoneNumber());
-		r.setPhotoPath(req.getPhotoPath());
-		r.setRootOrgId(req.getRootOrgId());
-		r.setSecurityPhone(req.getSecurityPhone());
-		r.setStudentCode(req.getStudentCode());
-		r.setSyncType(req.getSyncType());
-
-		dataSyncService.sync("syncStudent", r, async(), true);
-
-		SyncStudentResp resp = new SyncStudentResp();
-		return resp;
-	}
-
-	@PostMapping("syncSpecialty")
-	@Override
-	public SyncSpecialtyResp syncSpecialty(@RequestBody SyncSpecialtyReq req) {
-
-		return null;
-	}
-
-	@PostMapping("syncExam")
-	@Override
-	public SyncExamResp syncExam(@RequestBody SyncExamReq req) {
-		cn.com.qmth.examcloud.commons.api.request.SyncExamReq r = new cn.com.qmth.examcloud.commons.api.request.SyncExamReq();
-		r.setId(req.getId());
-		r.setBeginTime(req.getBeginTime());
-		r.setDuration(req.getDuration());
-		r.setEnable(req.getEnable());
-		r.setEndTime(req.getEndTime());
-		r.setExamTimes(req.getExamTimes());
-		r.setExamType(req.getExamType());
-		r.setName(req.getName());
-		r.setRemark(req.getRemark());
-		r.setRootOrgId(req.getRootOrgId());
-		r.setRootOrgName(req.getRootOrgName());
-		r.setSyncType(req.getSyncType());
-
-		dataSyncService.sync("syncExam", r, async(), true);
-		SyncExamResp resp = new SyncExamResp();
-		return resp;
-	}
-
-	@PostMapping("syncExamStudent")
-	@Override
-	public SyncExamStudentResp syncExamStudent(@RequestBody SyncExamStudentReq req) {
-		cn.com.qmth.examcloud.commons.api.request.SyncExamStudentReq r = new cn.com.qmth.examcloud.commons.api.request.SyncExamStudentReq();
-		r.setSyncType(req.getSyncType());
-		r.setCourseCode(req.getCourseCode());
-		r.setCourseLevel(req.getCourseLevel());
-		r.setCourseName(req.getCourseName());
-		r.setExamId(req.getExamId());
-		r.setExamName(req.getExamName());
-		r.setId(req.getId());
-		r.setIdentityNumber(req.getIdentityNumber());
-		r.setPaperType(req.getPaperType());
-		r.setRootOrgId(req.getRootOrgId());
-		r.setStudentCode(req.getStudentCode());
-		r.setStudentName(req.getStudentName());
-		r.setStudentId(req.getStudentId());
-		r.setOrgId(req.getOrgId());
-		r.setOrgName(req.getOrgName());
-		r.setOrgCode(req.getOrgCode());
-		r.setCourseId(req.getCourseId());
-		r.setSpecialtyName(req.getSpecialtyName());
-		r.setGrade(req.getGrade());
-		r.setRemark(req.getRemark());
-		r.setInfoCollector(req.getInfoCollector());
-		r.setExamSite(req.getExamSite());
-
-		dataSyncService.sync("syncExamStudent", r, async(), true);
-		SyncExamStudentResp resp = new SyncExamStudentResp();
-		return resp;
-	}
-
-	@PostMapping("syncUser")
-	@Override
-	public SyncUserResp syncUser(@RequestBody SyncUserReq req) {
-		cn.com.qmth.examcloud.commons.api.request.SyncUserReq r = new cn.com.qmth.examcloud.commons.api.request.SyncUserReq();
-		r.setEnable(req.getEnable());
-		r.setId(req.getId());
-		r.setLoginName(req.getLoginName());
-		r.setName(req.getName());
-		r.setOrgId(req.getOrgId());
-		r.setPassword(req.getPassword());
-		r.setPhoneNumber(req.getPhoneNumber());
-		r.setRootOrgId(req.getRootOrgId());
-		r.setSyncType(req.getSyncType());
-
-		dataSyncService.sync("syncUser", r, async(), true);
-		SyncUserResp resp = new SyncUserResp();
-		return resp;
-	}
-
-}
+package cn.com.qmth.examcloud.task.api.provider;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.com.qmth.examcloud.commons.util.PropertiesUtil;
+import cn.com.qmth.examcloud.task.api.DataSyncCloudService;
+import cn.com.qmth.examcloud.task.api.request.SyncCourseReq;
+import cn.com.qmth.examcloud.task.api.request.SyncExamReq;
+import cn.com.qmth.examcloud.task.api.request.SyncExamStudentReq;
+import cn.com.qmth.examcloud.task.api.request.SyncOrgReq;
+import cn.com.qmth.examcloud.task.api.request.SyncSpecialtyReq;
+import cn.com.qmth.examcloud.task.api.request.SyncStudentReq;
+import cn.com.qmth.examcloud.task.api.request.SyncUserReq;
+import cn.com.qmth.examcloud.task.api.response.SyncCourseResp;
+import cn.com.qmth.examcloud.task.api.response.SyncExamResp;
+import cn.com.qmth.examcloud.task.api.response.SyncExamStudentResp;
+import cn.com.qmth.examcloud.task.api.response.SyncOrgResp;
+import cn.com.qmth.examcloud.task.api.response.SyncSpecialtyResp;
+import cn.com.qmth.examcloud.task.api.response.SyncStudentResp;
+import cn.com.qmth.examcloud.task.api.response.SyncUserResp;
+import cn.com.qmth.examcloud.task.service.DataSyncService;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+
+/**
+ * 数据同步
+ *
+ * @author WANGWEI
+ * @date 2018年8月2日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@RestController
+@RequestMapping("${$rmp.cloud.task}" + "dataSync")
+public class DataSyncCloudServiceProvider extends ControllerSupport
+		implements
+			DataSyncCloudService {
+
+	private static final long serialVersionUID = -2880611326177571371L;
+
+	@Autowired
+	DataSyncService dataSyncService;
+
+	private Boolean async() {
+		boolean async = PropertiesUtil.getBoolean("$sync.async", true);
+		return async;
+	}
+
+	@PostMapping("syncCourse")
+	@Override
+	public SyncCourseResp syncCourse(@RequestBody SyncCourseReq req) {
+		cn.com.qmth.examcloud.commons.api.request.SyncCourseReq r = new cn.com.qmth.examcloud.commons.api.request.SyncCourseReq();
+		r.setCode(req.getCode());
+		r.setEnable(req.getEnable());
+		r.setId(req.getId());
+		r.setLevel(req.getLevel());
+		r.setName(req.getName());
+		r.setRootOrgId(req.getRootOrgId());
+		r.setSyncType(req.getSyncType());
+		dataSyncService.sync("syncCourse", r, async(), true);
+
+		SyncCourseResp resp = new SyncCourseResp();
+		return resp;
+	}
+
+	@PostMapping("syncOrg")
+	@Override
+	public SyncOrgResp syncOrg(@RequestBody SyncOrgReq req) {
+		cn.com.qmth.examcloud.commons.api.request.SyncOrgReq r = new cn.com.qmth.examcloud.commons.api.request.SyncOrgReq();
+		r.setEnable(req.getEnable());
+		r.setId(req.getId());
+		r.setName(req.getName());
+		r.setParentId(req.getParentId());
+		r.setRootId(req.getRootId());
+		r.setSyncType(req.getSyncType());
+		dataSyncService.sync("syncOrg", r, async(), true);
+
+		SyncOrgResp resp = new SyncOrgResp();
+		return resp;
+	}
+
+	@PostMapping("syncStudent")
+	@Override
+	public SyncStudentResp syncStudent(@RequestBody SyncStudentReq req) {
+
+		cn.com.qmth.examcloud.commons.api.request.SyncStudentReq r = new cn.com.qmth.examcloud.commons.api.request.SyncStudentReq();
+		r.setEnable(req.getEnable());
+		r.setId(req.getId());
+		r.setIdentityNumber(req.getIdentityNumber());
+		r.setName(req.getName());
+		r.setOrgCode(req.getOrgCode());
+		r.setOrgId(req.getOrgId());
+		r.setOrgName(req.getOrgName());
+		r.setPhoneNumber(req.getPhoneNumber());
+		r.setPhotoPath(req.getPhotoPath());
+		r.setRootOrgId(req.getRootOrgId());
+		r.setSecurityPhone(req.getSecurityPhone());
+		r.setStudentCode(req.getStudentCode());
+		r.setSyncType(req.getSyncType());
+
+		dataSyncService.sync("syncStudent", r, async(), true);
+
+		SyncStudentResp resp = new SyncStudentResp();
+		return resp;
+	}
+
+	@PostMapping("syncSpecialty")
+	@Override
+	public SyncSpecialtyResp syncSpecialty(@RequestBody SyncSpecialtyReq req) {
+
+		return null;
+	}
+
+	@PostMapping("syncExam")
+	@Override
+	public SyncExamResp syncExam(@RequestBody SyncExamReq req) {
+		cn.com.qmth.examcloud.commons.api.request.SyncExamReq r = new cn.com.qmth.examcloud.commons.api.request.SyncExamReq();
+		r.setId(req.getId());
+		r.setBeginTime(req.getBeginTime());
+		r.setDuration(req.getDuration());
+		r.setEnable(req.getEnable());
+		r.setEndTime(req.getEndTime());
+		r.setExamTimes(req.getExamTimes());
+		r.setExamType(req.getExamType());
+		r.setName(req.getName());
+		r.setRemark(req.getRemark());
+		r.setRootOrgId(req.getRootOrgId());
+		r.setRootOrgName(req.getRootOrgName());
+		r.setSyncType(req.getSyncType());
+
+		dataSyncService.sync("syncExam", r, async(), true);
+		SyncExamResp resp = new SyncExamResp();
+		return resp;
+	}
+
+	@PostMapping("syncExamStudent")
+	@Override
+	public SyncExamStudentResp syncExamStudent(@RequestBody SyncExamStudentReq req) {
+		cn.com.qmth.examcloud.commons.api.request.SyncExamStudentReq r = new cn.com.qmth.examcloud.commons.api.request.SyncExamStudentReq();
+		r.setSyncType(req.getSyncType());
+		r.setCourseCode(req.getCourseCode());
+		r.setCourseLevel(req.getCourseLevel());
+		r.setCourseName(req.getCourseName());
+		r.setExamId(req.getExamId());
+		r.setExamName(req.getExamName());
+		r.setId(req.getId());
+		r.setIdentityNumber(req.getIdentityNumber());
+		r.setPaperType(req.getPaperType());
+		r.setRootOrgId(req.getRootOrgId());
+		r.setStudentCode(req.getStudentCode());
+		r.setStudentName(req.getStudentName());
+		r.setStudentId(req.getStudentId());
+		r.setOrgId(req.getOrgId());
+		r.setOrgName(req.getOrgName());
+		r.setOrgCode(req.getOrgCode());
+		r.setCourseId(req.getCourseId());
+		r.setSpecialtyName(req.getSpecialtyName());
+		r.setGrade(req.getGrade());
+		r.setRemark(req.getRemark());
+		r.setInfoCollector(req.getInfoCollector());
+		r.setExamSite(req.getExamSite());
+
+		dataSyncService.sync("syncExamStudent", r, async(), true);
+		SyncExamStudentResp resp = new SyncExamStudentResp();
+		return resp;
+	}
+
+	@PostMapping("syncUser")
+	@Override
+	public SyncUserResp syncUser(@RequestBody SyncUserReq req) {
+		cn.com.qmth.examcloud.commons.api.request.SyncUserReq r = new cn.com.qmth.examcloud.commons.api.request.SyncUserReq();
+		r.setEnable(req.getEnable());
+		r.setId(req.getId());
+		r.setLoginName(req.getLoginName());
+		r.setName(req.getName());
+		r.setOrgId(req.getOrgId());
+		r.setPassword(req.getPassword());
+		r.setPhoneNumber(req.getPhoneNumber());
+		r.setRootOrgId(req.getRootOrgId());
+		r.setSyncType(req.getSyncType());
+
+		dataSyncService.sync("syncUser", r, async(), true);
+		SyncUserResp resp = new SyncUserResp();
+		return resp;
+	}
+
+}

+ 59 - 59
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/AbstractTask.java

@@ -1,59 +1,59 @@
-package cn.com.qmth.examcloud.task.base;
-
-import cn.com.qmth.examcloud.commons.base.exception.ExamCloudRuntimeException;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
-
-/**
- * 任务调度抽象类
- *
- * @author WANGWEI
- * @date 2018年3月7日
- * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
- */
-public abstract class AbstractTask implements Task {
-
-	protected ExamCloudLog taskLog = ExamCloudLogFactory.getLog("TASK_LOGGER");
-
-	protected ExamCloudLog debugLog = ExamCloudLogFactory.getLog(this.getClass());
-
-	public abstract TaskTracker getTaskTracker();
-
-	public abstract void run(ScheduleJob scheduleJob) throws Exception;
-
-	@Override
-	public void execute(ScheduleJob scheduleJob, String traceId) {
-		try {
-			getTaskTracker().start(scheduleJob, traceId);
-		} catch (Exception e) {
-			taskLog.error("[TASK TRACKER]. start", e);
-		}
-		if (taskLog.isDebugEnabled()) {
-			taskLog.debug("[TASK IN]. detail: " + JsonUtil.toJson(scheduleJob));
-		}
-		try {
-			run(scheduleJob);
-		} catch (Exception e) {
-			try {
-				getTaskTracker().whenException(scheduleJob, traceId, e);
-			} catch (Exception ex) {
-				taskLog.error("[TASK TRACKER]. whenException", ex);
-			}
-			if (taskLog.isErrorEnabled()) {
-				taskLog.error("[TASK EXCEPTION]. detail: " + JsonUtil.toJson(scheduleJob), e);
-			}
-			throw new ExamCloudRuntimeException(e);
-		}
-		try {
-			getTaskTracker().onEnd(scheduleJob, traceId);
-		} catch (Exception e) {
-			taskLog.error("[TASK TRACKER]. onEnd", e);
-		}
-		if (taskLog.isDebugEnabled()) {
-			taskLog.debug("[TASK OUT]. detail: " + JsonUtil.toJson(scheduleJob));
-		}
-
-	}
-
-}
+package cn.com.qmth.examcloud.task.base;
+
+import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.commons.util.JsonUtil;
+
+/**
+ * 任务调度抽象类
+ *
+ * @author WANGWEI
+ * @date 2018年3月7日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+public abstract class AbstractTask implements Task {
+
+	protected ExamCloudLog taskLog = ExamCloudLogFactory.getLog("TASK_LOGGER");
+
+	protected ExamCloudLog debugLog = ExamCloudLogFactory.getLog(this.getClass());
+
+	public abstract TaskTracker getTaskTracker();
+
+	public abstract void run(ScheduleJob scheduleJob) throws Exception;
+
+	@Override
+	public void execute(ScheduleJob scheduleJob, String traceId) {
+		try {
+			getTaskTracker().start(scheduleJob, traceId);
+		} catch (Exception e) {
+			taskLog.error("[TASK TRACKER]. start", e);
+		}
+		if (taskLog.isDebugEnabled()) {
+			taskLog.debug("[TASK IN]. detail: " + JsonUtil.toJson(scheduleJob));
+		}
+		try {
+			run(scheduleJob);
+		} catch (Exception e) {
+			try {
+				getTaskTracker().whenException(scheduleJob, traceId, e);
+			} catch (Exception ex) {
+				taskLog.error("[TASK TRACKER]. whenException", ex);
+			}
+			if (taskLog.isErrorEnabled()) {
+				taskLog.error("[TASK EXCEPTION]. detail: " + JsonUtil.toJson(scheduleJob), e);
+			}
+			throw new ExamCloudRuntimeException(e);
+		}
+		try {
+			getTaskTracker().onEnd(scheduleJob, traceId);
+		} catch (Exception e) {
+			taskLog.error("[TASK TRACKER]. onEnd", e);
+		}
+		if (taskLog.isDebugEnabled()) {
+			taskLog.debug("[TASK OUT]. detail: " + JsonUtil.toJson(scheduleJob));
+		}
+
+	}
+
+}

+ 57 - 57
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/DistributionJob.java

@@ -1,57 +1,57 @@
-package cn.com.qmth.examcloud.task.base;
-
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.MDC;
-
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.base.logging.SLF4JImpl;
-import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
-import cn.com.qmth.examcloud.commons.base.util.ThreadLocalUtil;
-import cn.com.qmth.examcloud.commons.web.support.SpringContextHolder;
-
-/**
- * 并行任务分发器
- *
- * @author WANGWEI
- * @date 2018年3月7日
- * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
- */
-public class DistributionJob implements Job {
-	private static final ExamCloudLog TASK_LOG = ExamCloudLogFactory.getLog("TASK_LOGGER");
-
-	@Override
-	public void execute(JobExecutionContext context) throws JobExecutionException {
-		String traceId = ThreadLocalUtil.next();
-		// 设置MDC
-		if (TASK_LOG instanceof SLF4JImpl) {
-			MDC.put("TRACE_ID", traceId);
-		}
-		ScheduleJob scheduleJob = null;
-		try {
-			scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
-
-			if (TASK_LOG.isDebugEnabled()) {
-				TASK_LOG.debug("distribute job. job detail :" + JsonUtil.toJson(scheduleJob));
-			}
-			Object bean = SpringContextHolder.getBean(scheduleJob.getSpringBean());
-
-			Task task = (Task) bean;
-			task.execute(scheduleJob, traceId);
-		} catch (Exception e) {
-			if (TASK_LOG.isErrorEnabled()) {
-				TASK_LOG.error("fail to distribute job. job detail :" + JsonUtil.toJson(scheduleJob), e);
-			}
-			throw new JobExecutionException(e);
-		} finally {
-			// 清理MDC
-			if (TASK_LOG instanceof SLF4JImpl) {
-				MDC.clear();
-			}
-		}
-
-	}
-
-}
+package cn.com.qmth.examcloud.task.base;
+
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.MDC;
+
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.commons.logging.SLF4JImpl;
+import cn.com.qmth.examcloud.commons.util.JsonUtil;
+import cn.com.qmth.examcloud.commons.util.ThreadLocalUtil;
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
+
+/**
+ * 并行任务分发器
+ *
+ * @author WANGWEI
+ * @date 2018年3月7日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+public class DistributionJob implements Job {
+	private static final ExamCloudLog TASK_LOG = ExamCloudLogFactory.getLog("TASK_LOGGER");
+
+	@Override
+	public void execute(JobExecutionContext context) throws JobExecutionException {
+		String traceId = ThreadLocalUtil.next();
+		// 设置MDC
+		if (TASK_LOG instanceof SLF4JImpl) {
+			MDC.put("TRACE_ID", traceId);
+		}
+		ScheduleJob scheduleJob = null;
+		try {
+			scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
+
+			if (TASK_LOG.isDebugEnabled()) {
+				TASK_LOG.debug("distribute job. job detail :" + JsonUtil.toJson(scheduleJob));
+			}
+			Object bean = SpringContextHolder.getBean(scheduleJob.getSpringBean());
+
+			Task task = (Task) bean;
+			task.execute(scheduleJob, traceId);
+		} catch (Exception e) {
+			if (TASK_LOG.isErrorEnabled()) {
+				TASK_LOG.error("fail to distribute job. job detail :" + JsonUtil.toJson(scheduleJob), e);
+			}
+			throw new JobExecutionException(e);
+		} finally {
+			// 清理MDC
+			if (TASK_LOG instanceof SLF4JImpl) {
+				MDC.clear();
+			}
+		}
+
+	}
+
+}

+ 4 - 4
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/QuartzManager.java

@@ -21,10 +21,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 import org.springframework.stereotype.Component;
 
-import cn.com.qmth.examcloud.commons.base.exception.ExamCloudRuntimeException;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
+import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.commons.util.JsonUtil;
 
 /**
  * Quartz 管理器

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

@@ -1,94 +1,94 @@
-package cn.com.qmth.examcloud.task.dao.entity;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-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;
-
-	/**
-	 * 状态
-	 */
-	@Column(nullable = false)
-	@Enumerated(EnumType.STRING)
-	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;
-	}
-
-}
+package cn.com.qmth.examcloud.task.dao.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.Table;
+
+import cn.com.qmth.examcloud.task.dao.enums.CopyExamStudentStatus;
+import cn.com.qmth.examcloud.web.jpa.JpaEntity;
+
+/**
+ * 考生复制
+ *
+ * @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;
+
+	/**
+	 * 状态
+	 */
+	@Column(nullable = false)
+	@Enumerated(EnumType.STRING)
+	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;
+	}
+
+}

+ 102 - 102
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/DataSyncEntity.java

@@ -1,102 +1,102 @@
-package cn.com.qmth.examcloud.task.dao.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-import javax.persistence.Table;
-
-import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
-
-/**
- * 数据同步
- *
- * @author WANGWEI
- * @date 2018年8月2日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Entity
-@Table(name = "EC_T_DATA_SYNC")
-public class DataSyncEntity extends JpaEntity {
-
-	private static final long serialVersionUID = 1066874132817953168L;
-
-	@Id
-	@GeneratedValue
-	private Long id;
-
-	/**
-	 * 同步请求组件
-	 */
-	private String component;
-
-	/**
-	 * 方法(反射调用)
-	 */
-	private String methodName;
-
-	/**
-	 * 参数类型
-	 */
-	private String paramType;
-
-	/**
-	 * 参数json
-	 */
-	@Lob
-	private String paramJson;
-
-	/**
-	 * 同步次数
-	 */
-	private int syncNum;
-
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public String getComponent() {
-		return component;
-	}
-
-	public void setComponent(String component) {
-		this.component = component;
-	}
-
-	public String getMethodName() {
-		return methodName;
-	}
-
-	public void setMethodName(String methodName) {
-		this.methodName = methodName;
-	}
-
-	public String getParamType() {
-		return paramType;
-	}
-
-	public void setParamType(String paramType) {
-		this.paramType = paramType;
-	}
-
-	public String getParamJson() {
-		return paramJson;
-	}
-
-	public void setParamJson(String paramJson) {
-		this.paramJson = paramJson;
-	}
-
-	public int getSyncNum() {
-		return syncNum;
-	}
-
-	public void setSyncNum(int syncNum) {
-		this.syncNum = syncNum;
-	}
-
-}
+package cn.com.qmth.examcloud.task.dao.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.Table;
+
+import cn.com.qmth.examcloud.web.jpa.JpaEntity;
+
+/**
+ * 数据同步
+ *
+ * @author WANGWEI
+ * @date 2018年8月2日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Entity
+@Table(name = "EC_T_DATA_SYNC")
+public class DataSyncEntity extends JpaEntity {
+
+	private static final long serialVersionUID = 1066874132817953168L;
+
+	@Id
+	@GeneratedValue
+	private Long id;
+
+	/**
+	 * 同步请求组件
+	 */
+	private String component;
+
+	/**
+	 * 方法(反射调用)
+	 */
+	private String methodName;
+
+	/**
+	 * 参数类型
+	 */
+	private String paramType;
+
+	/**
+	 * 参数json
+	 */
+	@Lob
+	private String paramJson;
+
+	/**
+	 * 同步次数
+	 */
+	private int syncNum;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getComponent() {
+		return component;
+	}
+
+	public void setComponent(String component) {
+		this.component = component;
+	}
+
+	public String getMethodName() {
+		return methodName;
+	}
+
+	public void setMethodName(String methodName) {
+		this.methodName = methodName;
+	}
+
+	public String getParamType() {
+		return paramType;
+	}
+
+	public void setParamType(String paramType) {
+		this.paramType = paramType;
+	}
+
+	public String getParamJson() {
+		return paramJson;
+	}
+
+	public void setParamJson(String paramJson) {
+		this.paramJson = paramJson;
+	}
+
+	public int getSyncNum() {
+		return syncNum;
+	}
+
+	public void setSyncNum(int syncNum) {
+		this.syncNum = syncNum;
+	}
+
+}

+ 1 - 1
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/ExamStudentImportEntity.java

@@ -8,8 +8,8 @@ import javax.persistence.Id;
 import javax.persistence.Index;
 import javax.persistence.Table;
 
-import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
 import cn.com.qmth.examcloud.task.dao.enums.ExamStudentImportStatus;
+import cn.com.qmth.examcloud.web.jpa.JpaEntity;
 
 /**
  * 考生导入表

+ 414 - 414
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/ExamStudentTempEntity.java

@@ -1,414 +1,414 @@
-package cn.com.qmth.examcloud.task.dao.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.Table;
-
-import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
-
-/**
- * 考生临时表
- *
- * @author WANGWEI
- * @date 2018年7月13日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Entity
-@Table(name = "EC_T_EXAM_STUDENT_TMP", indexes = {
-		@Index(name = "IDX_T_EXAM_STU_001001", columnList = "batchId", unique = false)})
-public class ExamStudentTempEntity extends JpaEntity {
-
-	private static final long serialVersionUID = -6030503185547639031L;
-
-	@Id
-	@GeneratedValue
-	private Long id;
-
-	/**
-	 * 批次ID
-	 */
-	private Long batchId;
-
-	/**
-	 * 状态码
-	 */
-	private String statusCode;
-
-	/**
-	 * 状态描述
-	 */
-	private String statusDesc;
-
-	/**
-	 * 姓名
-	 */
-	private String name;
-
-	/**
-	 * 考试ID
-	 */
-	private Long examId;
-
-	/**
-	 * 学校id
-	 */
-	private Long rootOrgId;
-
-	/**
-	 * 学习中心id
-	 */
-	private Long orgId;
-
-	/**
-	 * 学习中心code
-	 */
-	private String orgCode;
-
-	/**
-	 * 学习中心名称
-	 */
-	private String orgName;
-
-	/**
-	 * 学号
-	 */
-	private String studentCode;
-
-	/**
-	 * 身份证号
-	 */
-	private String identityNumber;
-
-	/**
-	 * 课程ID
-	 */
-	private Long courseId;
-
-	/**
-	 * 课程code
-	 */
-	private String courseCode;
-
-	/**
-	 * 课程名称
-	 */
-	private String courseName;
-
-	/**
-	 * 课程等级
-	 */
-	private String courseLevel;
-
-	/**
-	 * 试卷类型
-	 */
-	private String paperType;
-
-	/**
-	 * 专业名称
-	 */
-	private String specialtyName;
-
-	/**
-	 * 专业code
-	 */
-	private String specialtyCode;
-
-	/**
-	 * 年级
-	 */
-	private String grade;
-
-	/**
-	 * 学生用户id
-	 */
-	private Long studentId;
-
-	/**
-	 * 考点
-	 */
-	private String examSite;
-
-	/**
-	 * 信息采集人
-	 */
-	private String infoCollector;
-
-	/**
-	 * 学生电话
-	 */
-	private String phone;
-
-	/**
-	 * excel行号
-	 */
-	private Long lineNum;
-
-	/**
-	 * 扩展属性1
-	 */
-	private String ext1;
-
-	/**
-	 * 扩展属性2
-	 */
-	private String ext2;
-
-	/**
-	 * 扩展属性3
-	 */
-	private String ext3;
-
-	/**
-	 * 扩展属性4
-	 */
-	private String ext4;
-
-	/**
-	 * 扩展属性5
-	 */
-	private String ext5;
-
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public Long getBatchId() {
-		return batchId;
-	}
-
-	public void setBatchId(Long batchId) {
-		this.batchId = batchId;
-	}
-
-	public String getStatusCode() {
-		return statusCode;
-	}
-
-	public void setStatusCode(String statusCode) {
-		this.statusCode = statusCode;
-	}
-
-	public String getStatusDesc() {
-		return statusDesc;
-	}
-
-	public void setStatusDesc(String statusDesc) {
-		this.statusDesc = statusDesc;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public Long getExamId() {
-		return examId;
-	}
-
-	public void setExamId(Long examId) {
-		this.examId = examId;
-	}
-
-	public Long getRootOrgId() {
-		return rootOrgId;
-	}
-
-	public void setRootOrgId(Long rootOrgId) {
-		this.rootOrgId = rootOrgId;
-	}
-
-	public Long getOrgId() {
-		return orgId;
-	}
-
-	public void setOrgId(Long orgId) {
-		this.orgId = orgId;
-	}
-
-	public String getOrgCode() {
-		return orgCode;
-	}
-
-	public void setOrgCode(String orgCode) {
-		this.orgCode = orgCode;
-	}
-
-	public String getOrgName() {
-		return orgName;
-	}
-
-	public void setOrgName(String orgName) {
-		this.orgName = orgName;
-	}
-
-	public String getStudentCode() {
-		return studentCode;
-	}
-
-	public void setStudentCode(String studentCode) {
-		this.studentCode = studentCode;
-	}
-
-	public String getIdentityNumber() {
-		return identityNumber;
-	}
-
-	public void setIdentityNumber(String identityNumber) {
-		this.identityNumber = identityNumber;
-	}
-
-	public Long getCourseId() {
-		return courseId;
-	}
-
-	public void setCourseId(Long courseId) {
-		this.courseId = courseId;
-	}
-
-	public String getCourseCode() {
-		return courseCode;
-	}
-
-	public void setCourseCode(String courseCode) {
-		this.courseCode = courseCode;
-	}
-
-	public String getCourseName() {
-		return courseName;
-	}
-
-	public void setCourseName(String courseName) {
-		this.courseName = courseName;
-	}
-
-	public String getCourseLevel() {
-		return courseLevel;
-	}
-
-	public void setCourseLevel(String courseLevel) {
-		this.courseLevel = courseLevel;
-	}
-
-	public String getPaperType() {
-		return paperType;
-	}
-
-	public void setPaperType(String paperType) {
-		this.paperType = paperType;
-	}
-
-	public String getSpecialtyName() {
-		return specialtyName;
-	}
-
-	public void setSpecialtyName(String specialtyName) {
-		this.specialtyName = specialtyName;
-	}
-
-	public String getSpecialtyCode() {
-		return specialtyCode;
-	}
-
-	public void setSpecialtyCode(String specialtyCode) {
-		this.specialtyCode = specialtyCode;
-	}
-
-	public String getGrade() {
-		return grade;
-	}
-
-	public void setGrade(String grade) {
-		this.grade = grade;
-	}
-
-	public Long getStudentId() {
-		return studentId;
-	}
-
-	public void setStudentId(Long studentId) {
-		this.studentId = studentId;
-	}
-
-	public String getExamSite() {
-		return examSite;
-	}
-
-	public void setExamSite(String examSite) {
-		this.examSite = examSite;
-	}
-
-	public String getInfoCollector() {
-		return infoCollector;
-	}
-
-	public void setInfoCollector(String infoCollector) {
-		this.infoCollector = infoCollector;
-	}
-
-	public String getPhone() {
-		return phone;
-	}
-
-	public void setPhone(String phone) {
-		this.phone = phone;
-	}
-
-	public Long getLineNum() {
-		return lineNum;
-	}
-
-	public void setLineNum(Long lineNum) {
-		this.lineNum = lineNum;
-	}
-
-	public String getExt1() {
-		return ext1;
-	}
-
-	public void setExt1(String ext1) {
-		this.ext1 = ext1;
-	}
-
-	public String getExt2() {
-		return ext2;
-	}
-
-	public void setExt2(String ext2) {
-		this.ext2 = ext2;
-	}
-
-	public String getExt3() {
-		return ext3;
-	}
-
-	public void setExt3(String ext3) {
-		this.ext3 = ext3;
-	}
-
-	public String getExt4() {
-		return ext4;
-	}
-
-	public void setExt4(String ext4) {
-		this.ext4 = ext4;
-	}
-
-	public String getExt5() {
-		return ext5;
-	}
-
-	public void setExt5(String ext5) {
-		this.ext5 = ext5;
-	}
-
-}
+package cn.com.qmth.examcloud.task.dao.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.Table;
+
+import cn.com.qmth.examcloud.web.jpa.JpaEntity;
+
+/**
+ * 考生临时表
+ *
+ * @author WANGWEI
+ * @date 2018年7月13日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Entity
+@Table(name = "EC_T_EXAM_STUDENT_TMP", indexes = {
+		@Index(name = "IDX_T_EXAM_STU_001001", columnList = "batchId", unique = false)})
+public class ExamStudentTempEntity extends JpaEntity {
+
+	private static final long serialVersionUID = -6030503185547639031L;
+
+	@Id
+	@GeneratedValue
+	private Long id;
+
+	/**
+	 * 批次ID
+	 */
+	private Long batchId;
+
+	/**
+	 * 状态码
+	 */
+	private String statusCode;
+
+	/**
+	 * 状态描述
+	 */
+	private String statusDesc;
+
+	/**
+	 * 姓名
+	 */
+	private String name;
+
+	/**
+	 * 考试ID
+	 */
+	private Long examId;
+
+	/**
+	 * 学校id
+	 */
+	private Long rootOrgId;
+
+	/**
+	 * 学习中心id
+	 */
+	private Long orgId;
+
+	/**
+	 * 学习中心code
+	 */
+	private String orgCode;
+
+	/**
+	 * 学习中心名称
+	 */
+	private String orgName;
+
+	/**
+	 * 学号
+	 */
+	private String studentCode;
+
+	/**
+	 * 身份证号
+	 */
+	private String identityNumber;
+
+	/**
+	 * 课程ID
+	 */
+	private Long courseId;
+
+	/**
+	 * 课程code
+	 */
+	private String courseCode;
+
+	/**
+	 * 课程名称
+	 */
+	private String courseName;
+
+	/**
+	 * 课程等级
+	 */
+	private String courseLevel;
+
+	/**
+	 * 试卷类型
+	 */
+	private String paperType;
+
+	/**
+	 * 专业名称
+	 */
+	private String specialtyName;
+
+	/**
+	 * 专业code
+	 */
+	private String specialtyCode;
+
+	/**
+	 * 年级
+	 */
+	private String grade;
+
+	/**
+	 * 学生用户id
+	 */
+	private Long studentId;
+
+	/**
+	 * 考点
+	 */
+	private String examSite;
+
+	/**
+	 * 信息采集人
+	 */
+	private String infoCollector;
+
+	/**
+	 * 学生电话
+	 */
+	private String phone;
+
+	/**
+	 * excel行号
+	 */
+	private Long lineNum;
+
+	/**
+	 * 扩展属性1
+	 */
+	private String ext1;
+
+	/**
+	 * 扩展属性2
+	 */
+	private String ext2;
+
+	/**
+	 * 扩展属性3
+	 */
+	private String ext3;
+
+	/**
+	 * 扩展属性4
+	 */
+	private String ext4;
+
+	/**
+	 * 扩展属性5
+	 */
+	private String ext5;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getBatchId() {
+		return batchId;
+	}
+
+	public void setBatchId(Long batchId) {
+		this.batchId = batchId;
+	}
+
+	public String getStatusCode() {
+		return statusCode;
+	}
+
+	public void setStatusCode(String statusCode) {
+		this.statusCode = statusCode;
+	}
+
+	public String getStatusDesc() {
+		return statusDesc;
+	}
+
+	public void setStatusDesc(String statusDesc) {
+		this.statusDesc = statusDesc;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Long getExamId() {
+		return examId;
+	}
+
+	public void setExamId(Long examId) {
+		this.examId = examId;
+	}
+
+	public Long getRootOrgId() {
+		return rootOrgId;
+	}
+
+	public void setRootOrgId(Long rootOrgId) {
+		this.rootOrgId = rootOrgId;
+	}
+
+	public Long getOrgId() {
+		return orgId;
+	}
+
+	public void setOrgId(Long orgId) {
+		this.orgId = orgId;
+	}
+
+	public String getOrgCode() {
+		return orgCode;
+	}
+
+	public void setOrgCode(String orgCode) {
+		this.orgCode = orgCode;
+	}
+
+	public String getOrgName() {
+		return orgName;
+	}
+
+	public void setOrgName(String orgName) {
+		this.orgName = orgName;
+	}
+
+	public String getStudentCode() {
+		return studentCode;
+	}
+
+	public void setStudentCode(String studentCode) {
+		this.studentCode = studentCode;
+	}
+
+	public String getIdentityNumber() {
+		return identityNumber;
+	}
+
+	public void setIdentityNumber(String identityNumber) {
+		this.identityNumber = identityNumber;
+	}
+
+	public Long getCourseId() {
+		return courseId;
+	}
+
+	public void setCourseId(Long courseId) {
+		this.courseId = courseId;
+	}
+
+	public String getCourseCode() {
+		return courseCode;
+	}
+
+	public void setCourseCode(String courseCode) {
+		this.courseCode = courseCode;
+	}
+
+	public String getCourseName() {
+		return courseName;
+	}
+
+	public void setCourseName(String courseName) {
+		this.courseName = courseName;
+	}
+
+	public String getCourseLevel() {
+		return courseLevel;
+	}
+
+	public void setCourseLevel(String courseLevel) {
+		this.courseLevel = courseLevel;
+	}
+
+	public String getPaperType() {
+		return paperType;
+	}
+
+	public void setPaperType(String paperType) {
+		this.paperType = paperType;
+	}
+
+	public String getSpecialtyName() {
+		return specialtyName;
+	}
+
+	public void setSpecialtyName(String specialtyName) {
+		this.specialtyName = specialtyName;
+	}
+
+	public String getSpecialtyCode() {
+		return specialtyCode;
+	}
+
+	public void setSpecialtyCode(String specialtyCode) {
+		this.specialtyCode = specialtyCode;
+	}
+
+	public String getGrade() {
+		return grade;
+	}
+
+	public void setGrade(String grade) {
+		this.grade = grade;
+	}
+
+	public Long getStudentId() {
+		return studentId;
+	}
+
+	public void setStudentId(Long studentId) {
+		this.studentId = studentId;
+	}
+
+	public String getExamSite() {
+		return examSite;
+	}
+
+	public void setExamSite(String examSite) {
+		this.examSite = examSite;
+	}
+
+	public String getInfoCollector() {
+		return infoCollector;
+	}
+
+	public void setInfoCollector(String infoCollector) {
+		this.infoCollector = infoCollector;
+	}
+
+	public String getPhone() {
+		return phone;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public Long getLineNum() {
+		return lineNum;
+	}
+
+	public void setLineNum(Long lineNum) {
+		this.lineNum = lineNum;
+	}
+
+	public String getExt1() {
+		return ext1;
+	}
+
+	public void setExt1(String ext1) {
+		this.ext1 = ext1;
+	}
+
+	public String getExt2() {
+		return ext2;
+	}
+
+	public void setExt2(String ext2) {
+		this.ext2 = ext2;
+	}
+
+	public String getExt3() {
+		return ext3;
+	}
+
+	public void setExt3(String ext3) {
+		this.ext3 = ext3;
+	}
+
+	public String getExt4() {
+		return ext4;
+	}
+
+	public void setExt4(String ext4) {
+		this.ext4 = ext4;
+	}
+
+	public String getExt5() {
+		return ext5;
+	}
+
+	public void setExt5(String ext5) {
+		this.ext5 = ext5;
+	}
+
+}

+ 1 - 1
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/ScheduleJobEntity.java

@@ -7,7 +7,7 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
 
-import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
+import cn.com.qmth.examcloud.web.jpa.JpaEntity;
 
 /**
  * 任务配置

+ 103 - 103
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/TaskTraceEntity.java

@@ -1,104 +1,104 @@
-package cn.com.qmth.examcloud.task.dao.entity;
-
-import java.util.Date;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.Lob;
-import javax.persistence.Table;
-
-import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
-
-/**
- * 任务执行记录
- *
- * @author WANGWEI
- * @date 2018年3月7日
- * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
- */
-@Entity
-@Table(name = "EC_T_TASK_TRACE", indexes = {
-		@Index(name = "IDX_TASK_TRACE_TRACEID", columnList = "traceId")})
-public class TaskTraceEntity extends JpaEntity {
-
-	private static final long serialVersionUID = -1638993747996917970L;
-
-	@Id
-	@GeneratedValue
-	private Long id;
-
-	@Column(unique = false, nullable = false)
-	private Long jobId;
-
-	@Column(nullable = false)
-	private String traceId;
-
-	private String jobStatus;
-
-	private Date startTime;
-
-	private Date endTime;
-
-	@Lob
-	private String exception;
-
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public Long getJobId() {
-		return jobId;
-	}
-
-	public void setJobId(Long jobId) {
-		this.jobId = jobId;
-	}
-
-	public String getTraceId() {
-		return traceId;
-	}
-
-	public void setTraceId(String traceId) {
-		this.traceId = traceId;
-	}
-
-	public String getJobStatus() {
-		return jobStatus;
-	}
-
-	public void setJobStatus(String jobStatus) {
-		this.jobStatus = jobStatus;
-	}
-
-	public Date getStartTime() {
-		return startTime;
-	}
-
-	public void setStartTime(Date startTime) {
-		this.startTime = startTime;
-	}
-
-	public Date getEndTime() {
-		return endTime;
-	}
-
-	public void setEndTime(Date endTime) {
-		this.endTime = endTime;
-	}
-
-	public String getException() {
-		return exception;
-	}
-
-	public void setException(String exception) {
-		this.exception = exception;
-	}
-
+package cn.com.qmth.examcloud.task.dao.entity;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.Lob;
+import javax.persistence.Table;
+
+import cn.com.qmth.examcloud.web.jpa.JpaEntity;
+
+/**
+ * 任务执行记录
+ *
+ * @author WANGWEI
+ * @date 2018年3月7日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+@Entity
+@Table(name = "EC_T_TASK_TRACE", indexes = {
+		@Index(name = "IDX_TASK_TRACE_TRACEID", columnList = "traceId")})
+public class TaskTraceEntity extends JpaEntity {
+
+	private static final long serialVersionUID = -1638993747996917970L;
+
+	@Id
+	@GeneratedValue
+	private Long id;
+
+	@Column(unique = false, nullable = false)
+	private Long jobId;
+
+	@Column(nullable = false)
+	private String traceId;
+
+	private String jobStatus;
+
+	private Date startTime;
+
+	private Date endTime;
+
+	@Lob
+	private String exception;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getJobId() {
+		return jobId;
+	}
+
+	public void setJobId(Long jobId) {
+		this.jobId = jobId;
+	}
+
+	public String getTraceId() {
+		return traceId;
+	}
+
+	public void setTraceId(String traceId) {
+		this.traceId = traceId;
+	}
+
+	public String getJobStatus() {
+		return jobStatus;
+	}
+
+	public void setJobStatus(String jobStatus) {
+		this.jobStatus = jobStatus;
+	}
+
+	public Date getStartTime() {
+		return startTime;
+	}
+
+	public void setStartTime(Date startTime) {
+		this.startTime = startTime;
+	}
+
+	public Date getEndTime() {
+		return endTime;
+	}
+
+	public void setEndTime(Date endTime) {
+		this.endTime = endTime;
+	}
+
+	public String getException() {
+		return exception;
+	}
+
+	public void setException(String exception) {
+		this.exception = exception;
+	}
+
 }

+ 76 - 76
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/DefaultTaskTracker.java

@@ -1,76 +1,76 @@
-package cn.com.qmth.examcloud.task.service;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.Date;
-
-import javax.transaction.Transactional;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import cn.com.qmth.examcloud.commons.base.exception.StatusException;
-import cn.com.qmth.examcloud.task.base.ScheduleJob;
-import cn.com.qmth.examcloud.task.base.TaskTracker;
-import cn.com.qmth.examcloud.task.dao.TaskTraceRepo;
-import cn.com.qmth.examcloud.task.dao.entity.TaskTraceEntity;
-
-/**
- * 类注释
- *
- * @author WANGWEI
- * @date 2018年7月25日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Component
-public class DefaultTaskTracker implements TaskTracker {
-
-	@Autowired
-	TaskTraceRepo taskTraceRepo;
-
-	@Transactional
-	@Override
-	public void start(ScheduleJob scheduleJob, String traceId) {
-		TaskTraceEntity entity = new TaskTraceEntity();
-		entity.setJobId(scheduleJob.getJobId());
-		entity.setStartTime(new Date());
-		entity.setTraceId(traceId);
-		entity.setJobStatus("启动");
-		taskTraceRepo.save(entity);
-	}
-
-	@Transactional
-	@Override
-	public void whenException(ScheduleJob scheduleJob, String traceId, Exception e) {
-		TaskTraceEntity entity = taskTraceRepo.findByTraceId(traceId);
-		entity.setJobStatus("异常");
-		entity.setEndTime(new Date());
-
-		if (e instanceof StatusException) {
-			entity.setException(((StatusException) e).toJson());
-		} else {
-			entity.setException(getStackTrace(e));
-		}
-
-		taskTraceRepo.save(entity);
-	}
-
-	private String getStackTrace(Throwable throwable) {
-		Writer result = new StringWriter();
-		PrintWriter printWriter = new PrintWriter(result);
-		throwable.printStackTrace(printWriter);
-		return result.toString();
-	}
-
-	@Transactional
-	@Override
-	public void onEnd(ScheduleJob scheduleJob, String traceId) {
-		TaskTraceEntity entity = taskTraceRepo.findByTraceId(traceId);
-		entity.setJobStatus("成功");
-		entity.setEndTime(new Date());
-		taskTraceRepo.save(entity);
-
-	}
-
-}
+package cn.com.qmth.examcloud.task.service;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Date;
+
+import javax.transaction.Transactional;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.task.base.ScheduleJob;
+import cn.com.qmth.examcloud.task.base.TaskTracker;
+import cn.com.qmth.examcloud.task.dao.TaskTraceRepo;
+import cn.com.qmth.examcloud.task.dao.entity.TaskTraceEntity;
+
+/**
+ * 类注释
+ *
+ * @author WANGWEI
+ * @date 2018年7月25日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Component
+public class DefaultTaskTracker implements TaskTracker {
+
+	@Autowired
+	TaskTraceRepo taskTraceRepo;
+
+	@Transactional
+	@Override
+	public void start(ScheduleJob scheduleJob, String traceId) {
+		TaskTraceEntity entity = new TaskTraceEntity();
+		entity.setJobId(scheduleJob.getJobId());
+		entity.setStartTime(new Date());
+		entity.setTraceId(traceId);
+		entity.setJobStatus("启动");
+		taskTraceRepo.save(entity);
+	}
+
+	@Transactional
+	@Override
+	public void whenException(ScheduleJob scheduleJob, String traceId, Exception e) {
+		TaskTraceEntity entity = taskTraceRepo.findByTraceId(traceId);
+		entity.setJobStatus("异常");
+		entity.setEndTime(new Date());
+
+		if (e instanceof StatusException) {
+			entity.setException(((StatusException) e).toJson());
+		} else {
+			entity.setException(getStackTrace(e));
+		}
+
+		taskTraceRepo.save(entity);
+	}
+
+	private String getStackTrace(Throwable throwable) {
+		Writer result = new StringWriter();
+		PrintWriter printWriter = new PrintWriter(result);
+		throwable.printStackTrace(printWriter);
+		return result.toString();
+	}
+
+	@Transactional
+	@Override
+	public void onEnd(ScheduleJob scheduleJob, String traceId) {
+		TaskTraceEntity entity = taskTraceRepo.findByTraceId(traceId);
+		entity.setJobStatus("成功");
+		entity.setEndTime(new Date());
+		taskTraceRepo.save(entity);
+
+	}
+
+}

+ 86 - 86
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/impl/DataSyncServiceImpl.java

@@ -1,86 +1,86 @@
-package cn.com.qmth.examcloud.task.service.impl;
-
-import java.lang.reflect.Method;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import cn.com.qmth.examcloud.commons.api.HandleSyncCloudService;
-import cn.com.qmth.examcloud.commons.api.request.SyncBaseRequest;
-import cn.com.qmth.examcloud.commons.base.exception.StatusException;
-import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
-import cn.com.qmth.examcloud.commons.base.util.PropertiesUtil;
-import cn.com.qmth.examcloud.commons.base.util.RegExpUtil;
-import cn.com.qmth.examcloud.task.dao.DataSyncRepo;
-import cn.com.qmth.examcloud.task.dao.entity.DataSyncEntity;
-import cn.com.qmth.examcloud.task.service.DataSyncService;
-
-/**
- * 类注释
- *
- * @author WANGWEI
- * @date 2018年9月19日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Service
-public class DataSyncServiceImpl implements DataSyncService {
-
-	@Autowired
-	DataSyncRepo dataSyncRepo;
-
-	@Autowired
-	HandleSyncCloudService handleSyncCloudService;
-
-	@Override
-	public void sync(String methodName, SyncBaseRequest req, Boolean async, Boolean retry) {
-		String group = PropertiesUtil.getString("$sync." + methodName + ".group");
-		if (StringUtils.isBlank(group)) {
-			throw new StatusException("T-001001", "group is not configured");
-		}
-
-		List<String> componentList = RegExpUtil.findAll(group, "[^\\,]+");
-
-		for (String component : componentList) {
-			sync(component, methodName, req, async, retry);
-		}
-	}
-
-	@Override
-	public void sync(String component, String methodName, SyncBaseRequest req, Boolean async,
-			Boolean retry) {
-		String url = PropertiesUtil.getString("$sync." + methodName + ".component." + component);
-		req.setUrl(url);
-
-		if (async) {
-			DataSyncEntity entity = new DataSyncEntity();
-			entity.setComponent(component);
-			entity.setMethodName(methodName);
-			entity.setParamType(req.getClass().getName());
-			entity.setSyncNum(0);
-			entity.setParamJson(JsonUtil.toJson(req));
-			dataSyncRepo.saveAndFlush(entity);
-		} else {
-			try {
-				Method method = handleSyncCloudService.getClass().getMethod(methodName,
-						req.getClass());
-				method.invoke(handleSyncCloudService, req);
-			} catch (Exception e) {
-				if (retry) {
-					DataSyncEntity entity = new DataSyncEntity();
-					entity.setComponent(component);
-					entity.setMethodName(methodName);
-					entity.setParamType(req.getClass().getName());
-					entity.setSyncNum(0);
-					entity.setParamJson(JsonUtil.toJson(req));
-					dataSyncRepo.saveAndFlush(entity);
-				} else {
-					throw new RuntimeException(e);
-				}
-			}
-		}
-
-	}
-
-}
+package cn.com.qmth.examcloud.task.service.impl;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.examcloud.commons.api.HandleSyncCloudService;
+import cn.com.qmth.examcloud.commons.api.request.SyncBaseRequest;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.util.JsonUtil;
+import cn.com.qmth.examcloud.commons.util.PropertiesUtil;
+import cn.com.qmth.examcloud.commons.util.RegExpUtil;
+import cn.com.qmth.examcloud.task.dao.DataSyncRepo;
+import cn.com.qmth.examcloud.task.dao.entity.DataSyncEntity;
+import cn.com.qmth.examcloud.task.service.DataSyncService;
+
+/**
+ * 类注释
+ *
+ * @author WANGWEI
+ * @date 2018年9月19日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Service
+public class DataSyncServiceImpl implements DataSyncService {
+
+	@Autowired
+	DataSyncRepo dataSyncRepo;
+
+	@Autowired
+	HandleSyncCloudService handleSyncCloudService;
+
+	@Override
+	public void sync(String methodName, SyncBaseRequest req, Boolean async, Boolean retry) {
+		String group = PropertiesUtil.getString("$sync." + methodName + ".group");
+		if (StringUtils.isBlank(group)) {
+			throw new StatusException("T-001001", "group is not configured");
+		}
+
+		List<String> componentList = RegExpUtil.findAll(group, "[^\\,]+");
+
+		for (String component : componentList) {
+			sync(component, methodName, req, async, retry);
+		}
+	}
+
+	@Override
+	public void sync(String component, String methodName, SyncBaseRequest req, Boolean async,
+			Boolean retry) {
+		String url = PropertiesUtil.getString("$sync." + methodName + ".component." + component);
+		req.setUrl(url);
+
+		if (async) {
+			DataSyncEntity entity = new DataSyncEntity();
+			entity.setComponent(component);
+			entity.setMethodName(methodName);
+			entity.setParamType(req.getClass().getName());
+			entity.setSyncNum(0);
+			entity.setParamJson(JsonUtil.toJson(req));
+			dataSyncRepo.saveAndFlush(entity);
+		} else {
+			try {
+				Method method = handleSyncCloudService.getClass().getMethod(methodName,
+						req.getClass());
+				method.invoke(handleSyncCloudService, req);
+			} catch (Exception e) {
+				if (retry) {
+					DataSyncEntity entity = new DataSyncEntity();
+					entity.setComponent(component);
+					entity.setMethodName(methodName);
+					entity.setParamType(req.getClass().getName());
+					entity.setSyncNum(0);
+					entity.setParamJson(JsonUtil.toJson(req));
+					dataSyncRepo.saveAndFlush(entity);
+				} else {
+					throw new RuntimeException(e);
+				}
+			}
+		}
+
+	}
+
+}

+ 74 - 74
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/DataSyncTask.java

@@ -1,74 +1,74 @@
-package cn.com.qmth.examcloud.task.service.job;
-
-import java.util.List;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import cn.com.qmth.examcloud.commons.api.request.SyncBaseRequest;
-import cn.com.qmth.examcloud.commons.base.exception.StatusException;
-import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
-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.DataSyncRepo;
-import cn.com.qmth.examcloud.task.dao.entity.DataSyncEntity;
-import cn.com.qmth.examcloud.task.service.DataSyncService;
-
-/**
- * 数据同步任务
- *
- * @author WANGWEI
- * @date 2018年8月2日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Component("dataSyncTask")
-public class DataSyncTask extends AbstractTask {
-
-	@Autowired
-	TaskTracker TaskTracker;
-
-	@Autowired
-	DataSyncRepo dataSyncRepo;
-
-	@Autowired
-	DataSyncService dataSyncService;
-
-	@Override
-	public TaskTracker getTaskTracker() {
-		return TaskTracker;
-	}
-
-	@Override
-	public void run(ScheduleJob scheduleJob) throws Exception {
-
-		String component = scheduleJob.getExt1();
-
-		while (true) {
-			List<DataSyncEntity> list = dataSyncRepo.findTop10ByComponentOrderById(component);
-
-			if (CollectionUtils.isEmpty(list)) {
-				break;
-			}
-
-			for (DataSyncEntity cur : list) {
-				String paramType = cur.getParamType();
-				Class<?> c = Class.forName(paramType);
-				Object obj = JsonUtil.fromJson(cur.getParamJson(), c);
-				SyncBaseRequest req = (SyncBaseRequest) obj;
-
-				String methodName = cur.getMethodName();
-				try {
-					dataSyncService.sync(component, methodName, req, false, false);
-					dataSyncRepo.delete(cur);
-				} catch (Exception e) {
-					dataSyncRepo.increaseSyncNum(cur.getId());
-					throw new StatusException("T-102001", "同步失败");
-				}
-			}
-
-		}
-	}
-
-}
+package cn.com.qmth.examcloud.task.service.job;
+
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.commons.api.request.SyncBaseRequest;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.util.JsonUtil;
+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.DataSyncRepo;
+import cn.com.qmth.examcloud.task.dao.entity.DataSyncEntity;
+import cn.com.qmth.examcloud.task.service.DataSyncService;
+
+/**
+ * 数据同步任务
+ *
+ * @author WANGWEI
+ * @date 2018年8月2日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Component("dataSyncTask")
+public class DataSyncTask extends AbstractTask {
+
+	@Autowired
+	TaskTracker TaskTracker;
+
+	@Autowired
+	DataSyncRepo dataSyncRepo;
+
+	@Autowired
+	DataSyncService dataSyncService;
+
+	@Override
+	public TaskTracker getTaskTracker() {
+		return TaskTracker;
+	}
+
+	@Override
+	public void run(ScheduleJob scheduleJob) throws Exception {
+
+		String component = scheduleJob.getExt1();
+
+		while (true) {
+			List<DataSyncEntity> list = dataSyncRepo.findTop10ByComponentOrderById(component);
+
+			if (CollectionUtils.isEmpty(list)) {
+				break;
+			}
+
+			for (DataSyncEntity cur : list) {
+				String paramType = cur.getParamType();
+				Class<?> c = Class.forName(paramType);
+				Object obj = JsonUtil.fromJson(cur.getParamJson(), c);
+				SyncBaseRequest req = (SyncBaseRequest) obj;
+
+				String methodName = cur.getMethodName();
+				try {
+					dataSyncService.sync(component, methodName, req, false, false);
+					dataSyncRepo.delete(cur);
+				} catch (Exception e) {
+					dataSyncRepo.increaseSyncNum(cur.getId());
+					throw new StatusException("T-102001", "同步失败");
+				}
+			}
+
+		}
+	}
+
+}

+ 92 - 92
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/ExamStudentImportCleanTask.java

@@ -1,92 +1,92 @@
-package cn.com.qmth.examcloud.task.service.job;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
-import javax.persistence.criteria.Predicate;
-
-import org.apache.commons.io.FileUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-import cn.com.qmth.examcloud.commons.base.util.PathUtil;
-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.ExamStudentImportRepo;
-import cn.com.qmth.examcloud.task.dao.ExamStudentTempRepo;
-import cn.com.qmth.examcloud.task.dao.entity.ExamStudentImportEntity;
-
-/**
- * 考生导入-数据清理
- *
- * @author WANGWEI
- * @date 2018年7月31日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Transactional
-@Component("examStudentImportCleanTask")
-public class ExamStudentImportCleanTask extends AbstractTask {
-
-	@Value("${$dir}")
-	private String dir;
-
-	@Autowired
-	TaskTracker TaskTracker;
-
-	private static final String EXAM_STUDENT_IMPORT_FILES = "exam_student_import_files";
-
-	@Autowired
-	ExamStudentImportRepo examStudentImportRepo;
-
-	@Autowired
-	ExamStudentTempRepo examStudentTempRepo;
-
-	@Override
-	public void run(ScheduleJob scheduleJob) throws Exception {
-		Specification<ExamStudentImportEntity> specification = (root, query, cb) -> {
-			List<Predicate> predicates = new ArrayList<>();
-			// 清理过去30天前的数据
-			Calendar c = Calendar.getInstance();
-			c.setTime(new Date());
-			c.add(Calendar.DATE, -30);
-			Date d = c.getTime();
-			Predicate p3 = cb.lessThan(root.get("creationTime"), d);
-			predicates.add(p3);
-
-			return cb.and(predicates.toArray(new Predicate[predicates.size()]));
-		};
-
-		Pageable pageable = new PageRequest(0, 100, Sort.Direction.ASC, "creationTime");
-		Page<ExamStudentImportEntity> list = examStudentImportRepo.findAll(specification, pageable);
-		for (ExamStudentImportEntity cur : list) {
-
-			examStudentTempRepo.deleteByBatchId(cur.getBatchId());
-
-			String destFilePath = PathUtil.getCanonicalPath(
-					dir + "/" + EXAM_STUDENT_IMPORT_FILES + "/" + cur.getFilePath());
-			String resultFilePath = PathUtil.getCanonicalPath(
-					dir + "/" + EXAM_STUDENT_IMPORT_FILES + "/" + cur.getResultFilePath());
-
-			FileUtils.deleteQuietly(new File(destFilePath));
-			FileUtils.deleteQuietly(new File(resultFilePath));
-
-			examStudentImportRepo.delete(cur);
-		}
-	}
-
-	@Override
-	public TaskTracker getTaskTracker() {
-		return TaskTracker;
-	}
-}
+package cn.com.qmth.examcloud.task.service.job;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.criteria.Predicate;
+
+import org.apache.commons.io.FileUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.examcloud.commons.util.PathUtil;
+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.ExamStudentImportRepo;
+import cn.com.qmth.examcloud.task.dao.ExamStudentTempRepo;
+import cn.com.qmth.examcloud.task.dao.entity.ExamStudentImportEntity;
+
+/**
+ * 考生导入-数据清理
+ *
+ * @author WANGWEI
+ * @date 2018年7月31日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Transactional
+@Component("examStudentImportCleanTask")
+public class ExamStudentImportCleanTask extends AbstractTask {
+
+	@Value("${$dir}")
+	private String dir;
+
+	@Autowired
+	TaskTracker TaskTracker;
+
+	private static final String EXAM_STUDENT_IMPORT_FILES = "exam_student_import_files";
+
+	@Autowired
+	ExamStudentImportRepo examStudentImportRepo;
+
+	@Autowired
+	ExamStudentTempRepo examStudentTempRepo;
+
+	@Override
+	public void run(ScheduleJob scheduleJob) throws Exception {
+		Specification<ExamStudentImportEntity> specification = (root, query, cb) -> {
+			List<Predicate> predicates = new ArrayList<>();
+			// 清理过去30天前的数据
+			Calendar c = Calendar.getInstance();
+			c.setTime(new Date());
+			c.add(Calendar.DATE, -30);
+			Date d = c.getTime();
+			Predicate p3 = cb.lessThan(root.get("creationTime"), d);
+			predicates.add(p3);
+
+			return cb.and(predicates.toArray(new Predicate[predicates.size()]));
+		};
+
+		Pageable pageable = new PageRequest(0, 100, Sort.Direction.ASC, "creationTime");
+		Page<ExamStudentImportEntity> list = examStudentImportRepo.findAll(specification, pageable);
+		for (ExamStudentImportEntity cur : list) {
+
+			examStudentTempRepo.deleteByBatchId(cur.getBatchId());
+
+			String destFilePath = PathUtil.getCanonicalPath(
+					dir + "/" + EXAM_STUDENT_IMPORT_FILES + "/" + cur.getFilePath());
+			String resultFilePath = PathUtil.getCanonicalPath(
+					dir + "/" + EXAM_STUDENT_IMPORT_FILES + "/" + cur.getResultFilePath());
+
+			FileUtils.deleteQuietly(new File(destFilePath));
+			FileUtils.deleteQuietly(new File(resultFilePath));
+
+			examStudentImportRepo.delete(cur);
+		}
+	}
+
+	@Override
+	public TaskTracker getTaskTracker() {
+		return TaskTracker;
+	}
+}

+ 2 - 2
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/ExamStudentImportDataProcessingTask.java

@@ -18,8 +18,8 @@ import org.springframework.stereotype.Component;
 
 import com.google.common.collect.Maps;
 
-import cn.com.qmth.examcloud.commons.base.exception.StatusException;
-import cn.com.qmth.examcloud.commons.base.util.PathUtil;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.util.PathUtil;
 import cn.com.qmth.examcloud.core.basic.api.CourseCloudService;
 import cn.com.qmth.examcloud.core.basic.api.OrgCloudService;
 import cn.com.qmth.examcloud.core.basic.api.StudentCloudService;

+ 2 - 2
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/ExamStudentImportParsingFileTask.java

@@ -20,8 +20,8 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
-import cn.com.qmth.examcloud.commons.base.helpers.poi.ExcelReader;
-import cn.com.qmth.examcloud.commons.base.util.PathUtil;
+import cn.com.qmth.examcloud.commons.helpers.poi.ExcelReader;
+import cn.com.qmth.examcloud.commons.util.PathUtil;
 import cn.com.qmth.examcloud.task.base.AbstractTask;
 import cn.com.qmth.examcloud.task.base.ScheduleJob;
 import cn.com.qmth.examcloud.task.base.TaskTracker;

+ 7 - 7
examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/TaskApp.java

@@ -25,13 +25,13 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.PropertyAccessor;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.base.logging.SLF4JImpl;
-import cn.com.qmth.examcloud.commons.web.boot.ExamCloudApp;
-import cn.com.qmth.examcloud.commons.web.redis.RedisClient;
-import cn.com.qmth.examcloud.commons.web.redis.RedisClientImpl;
-import cn.com.qmth.examcloud.commons.web.support.CustomResponseErrorHandler;
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.commons.logging.SLF4JImpl;
+import cn.com.qmth.examcloud.web.boot.ExamCloudApp;
+import cn.com.qmth.examcloud.web.redis.RedisClient;
+import cn.com.qmth.examcloud.web.redis.RedisClientImpl;
+import cn.com.qmth.examcloud.web.support.CustomResponseErrorHandler;
 
 @SpringBootApplication(scanBasePackages = {"cn.com.qmth"})
 @EnableJpaRepositories(basePackages = {"cn.com.qmth"})

+ 39 - 39
examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/AppSelfInspection.java

@@ -1,39 +1,39 @@
-package cn.com.qmth.examcloud.task.starter.config;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import cn.com.qmth.examcloud.commons.web.support.RemoteProcedureCallTester;
-
-/**
- * 应用自检
- *
- * @author WANGWEI
- * @date 2018年6月21日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Component
-@Order(1)
-public class AppSelfInspection implements ApplicationRunner {
-
-	@Autowired
-	private RemoteProcedureCallTester remoteCallTester;
-
-	/**
-	 * 自检
-	 *
-	 * @author WANGWEI
-	 */
-	private void inspect() {
-		remoteCallTester.testRestTemplate("EC-CORE-BASIC", "EC-CORE-EXAMWORK");
-	}
-
-	@Override
-	public void run(ApplicationArguments args) throws Exception {
-		inspect();
-	}
-
-}
+package cn.com.qmth.examcloud.task.starter.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.web.support.RemoteProcedureCallTester;
+
+/**
+ * 应用自检
+ *
+ * @author WANGWEI
+ * @date 2018年6月21日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Component
+@Order(1)
+public class AppSelfInspection implements ApplicationRunner {
+
+	@Autowired
+	private RemoteProcedureCallTester remoteCallTester;
+
+	/**
+	 * 自检
+	 *
+	 * @author WANGWEI
+	 */
+	private void inspect() {
+		remoteCallTester.testRestTemplate("EC-CORE-BASIC", "EC-CORE-EXAMWORK");
+	}
+
+	@Override
+	public void run(ApplicationArguments args) throws Exception {
+		inspect();
+	}
+
+}

+ 115 - 115
examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/DefaultWebMvcConfigurerAdapter.java

@@ -1,115 +1,115 @@
-package cn.com.qmth.examcloud.task.starter.config;
-
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
-
-import com.google.common.collect.Sets;
-
-import cn.com.qmth.examcloud.commons.base.util.PathUtil;
-import cn.com.qmth.examcloud.commons.base.util.PropertiesUtil;
-import cn.com.qmth.examcloud.commons.base.util.RegExpUtil;
-import cn.com.qmth.examcloud.commons.web.interceptor.FirstInterceptor;
-import cn.com.qmth.examcloud.commons.web.redis.RedisClient;
-import cn.com.qmth.examcloud.commons.web.security.RequestPermissionInterceptor;
-import cn.com.qmth.examcloud.commons.web.security.SpringCloudInterceptor;
-import cn.com.qmth.examcloud.commons.web.security.bean.Role;
-import cn.com.qmth.examcloud.commons.web.security.bean.User;
-import cn.com.qmth.examcloud.commons.web.security.enums.RoleMeta;
-
-/**
- * 默认WebMvcConfigurer
- *
- * @author WANGWEI
- * @date 2018年5月22日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Configuration
-public class DefaultWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
-
-	@Autowired
-	RedisClient redisClient;
-
-	static {
-		PropertiesUtil.configure(PathUtil.getResoucePath("security-mapping.properties"));
-	}
-
-	@Override
-	public void addInterceptors(InterceptorRegistry registry) {
-		registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");
-
-		SpringCloudInterceptor springCloudInterceptor = new SpringCloudInterceptor();
-		springCloudInterceptor.setRedisClient(redisClient);
-		registry.addInterceptor(springCloudInterceptor).addPathPatterns("/**");
-
-		RequestPermissionInterceptor requestPermissionInterceptor = getRequestPermissionInterceptor();
-		requestPermissionInterceptor.configure("security-exclusions.conf");
-		registry.addInterceptor(requestPermissionInterceptor).addPathPatterns("/**");
-
-		super.addInterceptors(registry);
-	}
-
-	@Bean
-	public RequestPermissionInterceptor getRequestPermissionInterceptor() {
-		return new RequestPermissionInterceptor(redisClient) {
-
-			@Override
-			public boolean hasPermission(String mappingPath, User user) {
-				List<Role> roleList = user.getRoleList();
-
-				if (CollectionUtils.isEmpty(roleList)) {
-					return false;
-				}
-
-				for (Role role : roleList) {
-					if (role.getRoleCode().equals(RoleMeta.SUPER_ADMIN.name())) {
-						return true;
-					}
-				}
-
-				// 权限组集合
-				String privilegeGroups = PropertiesUtil.getString(mappingPath);
-				if (StringUtils.isBlank(privilegeGroups)) {
-					return true;
-				}
-
-				// 用户权限集合
-				Set<String> rolePrivilegeList = Sets.newHashSet();
-				Long rootOrgId = user.getRootOrgId();
-				for (Role role : roleList) {
-					String key = "$_P_" + rootOrgId + "_" + role.getRoleId();
-					String rolePrivileges = redisClient.get(key, String.class);
-
-					List<String> rpList = RegExpUtil.findAll(rolePrivileges, "\\w+");
-					rolePrivilegeList.addAll(rpList);
-				}
-
-				List<String> privilegeGroupList = RegExpUtil.findAll(privilegeGroups, "[^\\;]+");
-
-				for (String pg : privilegeGroupList) {
-					pg = pg.trim();
-					if (StringUtils.isBlank(pg)) {
-						continue;
-					}
-
-					List<String> pList = RegExpUtil.findAll(pg, "[^\\,]+");
-					if (rolePrivilegeList.containsAll(pList)) {
-						return true;
-					} else {
-						continue;
-					}
-				}
-
-				return false;
-			}
-
-		};
-	}
-}
+package cn.com.qmth.examcloud.task.starter.config;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+import com.google.common.collect.Sets;
+
+import cn.com.qmth.examcloud.commons.util.PathUtil;
+import cn.com.qmth.examcloud.commons.util.PropertiesUtil;
+import cn.com.qmth.examcloud.commons.util.RegExpUtil;
+import cn.com.qmth.examcloud.web.interceptor.FirstInterceptor;
+import cn.com.qmth.examcloud.web.redis.RedisClient;
+import cn.com.qmth.examcloud.web.security.RequestPermissionInterceptor;
+import cn.com.qmth.examcloud.web.security.SpringCloudInterceptor;
+import cn.com.qmth.examcloud.web.security.bean.Role;
+import cn.com.qmth.examcloud.web.security.bean.User;
+import cn.com.qmth.examcloud.web.security.enums.RoleMeta;
+
+/**
+ * 默认WebMvcConfigurer
+ *
+ * @author WANGWEI
+ * @date 2018年5月22日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Configuration
+public class DefaultWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
+
+	@Autowired
+	RedisClient redisClient;
+
+	static {
+		PropertiesUtil.configure(PathUtil.getResoucePath("security-mapping.properties"));
+	}
+
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");
+
+		SpringCloudInterceptor springCloudInterceptor = new SpringCloudInterceptor();
+		springCloudInterceptor.setRedisClient(redisClient);
+		registry.addInterceptor(springCloudInterceptor).addPathPatterns("/**");
+
+		RequestPermissionInterceptor requestPermissionInterceptor = getRequestPermissionInterceptor();
+		requestPermissionInterceptor.configure("security-exclusions.conf");
+		registry.addInterceptor(requestPermissionInterceptor).addPathPatterns("/**");
+
+		super.addInterceptors(registry);
+	}
+
+	@Bean
+	public RequestPermissionInterceptor getRequestPermissionInterceptor() {
+		return new RequestPermissionInterceptor(redisClient) {
+
+			@Override
+			public boolean hasPermission(String mappingPath, User user) {
+				List<Role> roleList = user.getRoleList();
+
+				if (CollectionUtils.isEmpty(roleList)) {
+					return false;
+				}
+
+				for (Role role : roleList) {
+					if (role.getRoleCode().equals(RoleMeta.SUPER_ADMIN.name())) {
+						return true;
+					}
+				}
+
+				// 权限组集合
+				String privilegeGroups = PropertiesUtil.getString(mappingPath);
+				if (StringUtils.isBlank(privilegeGroups)) {
+					return true;
+				}
+
+				// 用户权限集合
+				Set<String> rolePrivilegeList = Sets.newHashSet();
+				Long rootOrgId = user.getRootOrgId();
+				for (Role role : roleList) {
+					String key = "$_P_" + rootOrgId + "_" + role.getRoleId();
+					String rolePrivileges = redisClient.get(key, String.class);
+
+					List<String> rpList = RegExpUtil.findAll(rolePrivileges, "\\w+");
+					rolePrivilegeList.addAll(rpList);
+				}
+
+				List<String> privilegeGroupList = RegExpUtil.findAll(privilegeGroups, "[^\\;]+");
+
+				for (String pg : privilegeGroupList) {
+					pg = pg.trim();
+					if (StringUtils.isBlank(pg)) {
+						continue;
+					}
+
+					List<String> pList = RegExpUtil.findAll(pg, "[^\\,]+");
+					if (rolePrivilegeList.containsAll(pList)) {
+						return true;
+					} else {
+						continue;
+					}
+				}
+
+				return false;
+			}
+
+		};
+	}
+}

+ 95 - 95
examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/JdbcTemplateHolder.java

@@ -1,95 +1,95 @@
-package cn.com.qmth.examcloud.task.starter.config;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.sql.DataSource;
-
-import org.springframework.jdbc.core.JdbcTemplate;
-
-import cn.com.qmth.examcloud.commons.base.util.DBUtil;
-
-/**
- * JDBC模板
- *
- * @author WANGWEI
- * @date 2018年8月3日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public class JdbcTemplateHolder {
-
-	private static Map<String, JdbcTemplate> jdbcTemplates = new ConcurrentHashMap<String, JdbcTemplate>();
-
-	private static final Object LOCK = new Object();
-
-	public enum DataSourceName {
-		/**
-		 * 基础信息
-		 */
-		CORE_BASIC("$ds.core.basic"),
-		/**
-		 * 考务
-		 */
-		CORE_EXAMWORK("$ds.core.examwork"),
-		/**
-		 * 题库
-		 */
-		CORE_QUESTION("$ds.core.question"),
-		/**
-		 * 阅卷
-		 */
-		CORE_MARKING("$ds.core.marking"),
-		/**
-		 * 网考
-		 */
-		CORE_OE("$ds.core.oe");
-
-		private String configName;
-
-		private DataSourceName(String configName) {
-			this.configName = configName;
-		}
-
-		public String getConfigName() {
-			return configName;
-		}
-
-	}
-
-	/**
-	 * 启动初始化
-	 *
-	 * @author WANGWEI
-	 */
-	public static void init() {
-		// getJdbcTemplate(DataSourceName.CORE_BASIC);
-		// getJdbcTemplate(DataSourceName.CORE_EXAMWORK);
-		// getJdbcTemplate(DataSourceName.CORE_MARKING);
-		// getJdbcTemplate(DataSourceName.CORE_OE);
-		// getJdbcTemplate(DataSourceName.CORE_QUESTION);
-	}
-
-	/**
-	 * 获取 JdbcTemplate
-	 *
-	 * @author WANGWEI
-	 * @param dataSourceName
-	 * @return
-	 */
-	public static JdbcTemplate getJdbcTemplate(DataSourceName dataSourceName) {
-		JdbcTemplate jdbcTemplate = jdbcTemplates.get(dataSourceName.name());
-		if (null == jdbcTemplate) {
-			synchronized (LOCK) {
-				jdbcTemplate = jdbcTemplates.get(dataSourceName.name());
-				if (null == jdbcTemplate) {
-					DataSource dataSource = DBUtil.getDataSource(dataSourceName.getConfigName());
-					jdbcTemplate = new JdbcTemplate(dataSource);
-					jdbcTemplates.put(dataSourceName.name(), jdbcTemplate);
-				}
-			}
-		}
-
-		return jdbcTemplate;
-	}
-
-}
+package cn.com.qmth.examcloud.task.starter.config;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.sql.DataSource;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import cn.com.qmth.examcloud.commons.util.DBUtil;
+
+/**
+ * JDBC模板
+ *
+ * @author WANGWEI
+ * @date 2018年8月3日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public class JdbcTemplateHolder {
+
+	private static Map<String, JdbcTemplate> jdbcTemplates = new ConcurrentHashMap<String, JdbcTemplate>();
+
+	private static final Object LOCK = new Object();
+
+	public enum DataSourceName {
+		/**
+		 * 基础信息
+		 */
+		CORE_BASIC("$ds.core.basic"),
+		/**
+		 * 考务
+		 */
+		CORE_EXAMWORK("$ds.core.examwork"),
+		/**
+		 * 题库
+		 */
+		CORE_QUESTION("$ds.core.question"),
+		/**
+		 * 阅卷
+		 */
+		CORE_MARKING("$ds.core.marking"),
+		/**
+		 * 网考
+		 */
+		CORE_OE("$ds.core.oe");
+
+		private String configName;
+
+		private DataSourceName(String configName) {
+			this.configName = configName;
+		}
+
+		public String getConfigName() {
+			return configName;
+		}
+
+	}
+
+	/**
+	 * 启动初始化
+	 *
+	 * @author WANGWEI
+	 */
+	public static void init() {
+		// getJdbcTemplate(DataSourceName.CORE_BASIC);
+		// getJdbcTemplate(DataSourceName.CORE_EXAMWORK);
+		// getJdbcTemplate(DataSourceName.CORE_MARKING);
+		// getJdbcTemplate(DataSourceName.CORE_OE);
+		// getJdbcTemplate(DataSourceName.CORE_QUESTION);
+	}
+
+	/**
+	 * 获取 JdbcTemplate
+	 *
+	 * @author WANGWEI
+	 * @param dataSourceName
+	 * @return
+	 */
+	public static JdbcTemplate getJdbcTemplate(DataSourceName dataSourceName) {
+		JdbcTemplate jdbcTemplate = jdbcTemplates.get(dataSourceName.name());
+		if (null == jdbcTemplate) {
+			synchronized (LOCK) {
+				jdbcTemplate = jdbcTemplates.get(dataSourceName.name());
+				if (null == jdbcTemplate) {
+					DataSource dataSource = DBUtil.getDataSource(dataSourceName.getConfigName());
+					jdbcTemplate = new JdbcTemplate(dataSource);
+					jdbcTemplates.put(dataSourceName.name(), jdbcTemplate);
+				}
+			}
+		}
+
+		return jdbcTemplate;
+	}
+
+}