فهرست منبع

监考待审导出

qinchao 4 سال پیش
والد
کامیت
4631d97f21

+ 9 - 0
examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/controller/ExamRecordController.java

@@ -96,6 +96,15 @@ public class ExamRecordController extends ControllerSupport {
         return examRecordWaitingAuditList;
     }
 
+    @GetMapping("/waiting/audit/export/async")
+    @ApiOperation(value = "导出“监考待审”(异步)")
+    public void exportWaitingAudit(@RequestParam String query, HttpServletResponse response) {
+        User user=getAccessUser();
+        asyncExportService.exportWaitingAudit(query, user);
+        AsyncExportConcurrentUtil.checkOrStartJob();
+        ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "监考待审-导出","导出条件:"+query));
+    }
+
     @PostMapping("/waiting/audit/next")
     @ApiOperation(value = "查询“监考待审”下一条记录")
     public Long getExamRecordWaitingAuditNextId(@RequestBody ExamRecordQuery query,

+ 2 - 0
examcloud-core-oe-admin-dao/src/main/java/cn/com/qmth/examcloud/core/oe/admin/dao/enums/ExportTaskType.java

@@ -12,6 +12,8 @@ public enum ExportTaskType {
 
     EXAM_DETAIL("考试明细"),
 
+    WAITING_AUDIT("监考待审"),
+
     SCORE_STATISTIC("成绩统计"),
     
     EXAM_SCHEDULING("考试进度");

+ 3 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/AsyncExportService.java

@@ -21,10 +21,13 @@ public interface AsyncExportService {
     
     void exportExamScheduling(String jsonParams,User user);
 
+    void exportWaitingAudit(String query, User user);
+
 	void asyncExportExamScheduling(Long taskId, ExamStudentQuery req);
 
 	void asyncExportExamRecordDetails(Long taskId, ExamRecordQuery req);
 
 	void asyncExportExamScoreStatistics(Long taskId, ExamScoreQuery req);
 
+    void asyncExportWaitingAudit(Long taskId, ExamRecordQuery req);
 }

+ 8 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/ExamRecordService.java

@@ -49,6 +49,14 @@ public interface ExamRecordService {
      */
     Page<ExamRecordInfo> getExamRecordWaitingAuditList(ExamRecordQuery query);
 
+    /**
+     * 查询“监考待审”列表(分页)
+     *
+     * @param query
+     * @return
+     */
+    List<ExamRecordInfo> getExamRecordWaitingAudit(ExamRecordQuery query);
+
 	/**
 	 * Description 查询“监考待审”下一条记录
 	 *

+ 7 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examrecord/ExamRecordEntityConvert.java

@@ -171,6 +171,13 @@ public class ExamRecordEntityConvert {
         return new PageImpl<ExamRecordInfo>(list, pageable, page.getTotalElements());
     }
 
+    public List<ExamRecordInfo> ofList(List<ExamRecordDataEntity> entities) {
+        //缓存
+        Map<String,Object> cahcheMap = new HashMap<>();
+        List<ExamRecordInfo> list = entities.stream().map(entity -> of(entity,cahcheMap)).collect(Collectors.toList());
+        return list;
+    }
+
 
     public List<ExamRecordInfo> of(List<ExamRecordDataEntity> entities) {
     	//缓存

+ 13 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/exporttask/ExportTask.java

@@ -47,6 +47,8 @@ public class ExportTask extends Thread {
 					examScores(et);
 				} else if (ExportTaskType.EXAM_SCHEDULING.equals(et.getType())) {
 					examScheduling(et);
+				} else if (ExportTaskType.WAITING_AUDIT.equals(et.getType())) {
+					examWaitingAudit(et);
 				}
 				exportTaskService.endExportTask(et.getId());
 			} catch (Exception e) {
@@ -57,6 +59,17 @@ public class ExportTask extends Thread {
 		}
 	}
 
+	/**
+	 * 监考待审
+	 *
+	 * @param et
+	 */
+	private void examWaitingAudit(ExportTaskEntity et) {
+		ExamRecordQuery req = new JsonMapper().parseJson(et.getExportParam(), ExamRecordQuery.class);
+		req.setRootOrgId(et.getRootOrgId());
+		asyncExportService.asyncExportWaitingAudit(et.getId(), req);
+	}
+
 	/**
 	 * 考试明细
 	 * 

+ 87 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/AsyncExportServiceImpl.java

@@ -13,6 +13,9 @@ import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
+import cn.com.qmth.examcloud.api.commons.enums.ExamType;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamCaptureService;
+import cn.com.qmth.examcloud.support.helper.IdentityNumberHelper;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
@@ -73,6 +76,9 @@ public class AsyncExportServiceImpl implements AsyncExportService {
 	@Autowired
 	private ExamStudentService examStudentService;
 
+	@Autowired
+	private ExamCaptureService examCaptureService;
+
 	@Override
 	public void exportExamScheduling(String jsonParams, User user) {
 		ExamStudentQuery req = new JsonMapper().parseJson(jsonParams, ExamStudentQuery.class);
@@ -296,6 +302,87 @@ public class AsyncExportServiceImpl implements AsyncExportService {
 		}
 	}
 
+	@Override
+	public void asyncExportWaitingAudit(Long taskId, ExamRecordQuery req) {
+		List<ExamRecordInfo> examRecords;
+		try {
+			examRecords = examRecordService.getExamRecordWaitingAudit(req);
+
+			if (CollectionUtils.isEmpty(examRecords)) {
+				exportTaskService.updateExportTaskStatus(taskId, ExportTaskStatus.ERROR, "当前条件暂无数据,任务终止");
+				return;
+			}
+			String examType = examRecords.get(0).getExamType();
+			for (ExamRecordInfo examRecordInfo : examRecords) {
+				examRecordInfo.setIdentityNumber(
+						IdentityNumberHelper.conceal(examRecordInfo.getRootOrgId(), examRecordInfo.getIdentityNumber()));
+				if (ExamType.ONLINE.name().equals(examType) || ExamType.ONLINE_HOMEWORK.name().equals(examType)) {
+					examRecordInfo.setVirtualCameraNames(examCaptureService.getVirtualCameraNames(examRecordInfo.getDataId()));
+				}
+			}
+
+		} catch (Exception e) {
+			LOG.error(e.getMessage());
+			if (e instanceof StatusException) {
+				exportTaskService.updateExportTaskStatus(taskId, ExportTaskStatus.ERROR,
+						((StatusException) e).getDesc());
+			} else {
+				exportTaskService.updateExportTaskStatus(taskId, ExportTaskStatus.ERROR, "导出数据异常");
+			}
+			return;
+		}
+		// 导出文件的存储路径
+		String examName = examRecords.get(0).getExamName();
+		final String filePath = String.format("/%s/%s/%s/%s/%s_监考待审.xlsx", TASK_EXPORT_DIR, req.getRootOrgId(),
+				dateDir(), randomUUID(), examName);
+		String tempFilePath = systemConfig.getTempDataDir() + File.separator + filePath;
+		File tempFile = new File(tempFilePath);
+		try {
+			tempFile.getParentFile().mkdirs();
+			tempFile.createNewFile();
+		} catch (IOException e) {
+			LOG.error(e.getMessage());
+			exportTaskService.updateExportTaskStatus(taskId, ExportTaskStatus.ERROR, "生成导出文件异常");
+			return;
+		}
+		try (FileOutputStream out = new FileOutputStream(tempFile);) {
+
+			ExcelExportUtil.exportExcel(ExamRecordInfo.class, examRecords, out);
+
+			// 上传至文件服务器
+			FileStoragePathEnvInfo env = new FileStoragePathEnvInfo();
+			env.setRootOrgId(String.valueOf(req.getRootOrgId()));
+			env.setRelativePath(filePath);
+			YunPathInfo oss = FileStorageUtil.saveFile(TASK_EXPORT_DIR, env, tempFile, null);
+
+			LOG.info("asyncExportWaitingAudit finished... " + oss.getRelativePath());
+			exportTaskService.updateExportTaskStatus(taskId, ExportTaskStatus.SUCCESS, null, oss.getRelativePath());
+		} catch (Exception e) {
+			LOG.info("asyncExportWaitingAudit error... " + e.getMessage());
+			exportTaskService.updateExportTaskStatus(taskId, ExportTaskStatus.ERROR, "上传至文件服务器异常");
+		} finally {
+			FileUtils.deleteQuietly(tempFile);
+		}
+	}
+
+	@Override
+	public void exportWaitingAudit(String query, User user) {
+		ExamStudentQuery req = new JsonMapper().parseJson(query, ExamStudentQuery.class);
+		req.setRootOrgId(user.getRootOrgId());
+		Check.isNull(req, "请求参数不能为空!");
+		Check.isNull(req.getExamId(), "请先选择考试批次!");
+
+		// 创建导出任务
+		ExportTaskInfo task = new ExportTaskInfo();
+		task.setRootOrgId(user.getRootOrgId());
+		task.setExamId(req.getExamId());
+		task.setType(ExportTaskType.WAITING_AUDIT);
+		task.setStatus(ExportTaskStatus.WAITING);
+		task.setCreator(user.getUserId());
+		task.setJsonParams(query);
+		exportTaskService.addExportTask(task);
+	}
+
 	private String randomUUID() {
 		return UUID.randomUUID().toString().replace("-", "");
 	}

+ 34 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamRecordServiceImpl.java

@@ -250,6 +250,40 @@ public class ExamRecordServiceImpl implements ExamRecordService {
         return this.getExamRecordList(query);
     }
 
+    @Override
+    public List<ExamRecordInfo> getExamRecordWaitingAudit(ExamRecordQuery query) {
+        Check.isNull(query, "查询参数不能为空!");
+        //默认条件
+        query.setIsAudit(false);
+        query.addRecordStatus(ExamRecordStatus.EXAM_END.name());
+        query.addRecordStatus(ExamRecordStatus.EXAM_OVERDUE.name());
+
+        Check.isNull(query, "查询参数不能为空!");
+        //查询条件
+        StringBuilder sqlBuilder = new StringBuilder();
+        //待审核(按原先的sql,多了一个ip字段)
+        sqlBuilder.append(EXAM_RECORD_SQL);
+        sqlBuilder.append(buildExamRecordCommonSelectCondition(query));
+        if (query.getIsWarn() != null) {
+            //只查有异常未审核
+            if (query.getIsWarn()) {
+                sqlBuilder.append(" and record_data.is_warn  = 1 and record_data.is_audit = 0 ");
+            } else {
+                sqlBuilder.append(" and record_data.is_warn  = 0 ");
+            }
+        } else {
+            sqlBuilder.append(" and ((record_data.is_warn = 0) OR (record_data.is_warn  = 1 and record_data.is_audit = 0))");
+        }
+        sqlBuilder.append(" and record_data.is_illegality = 0");
+        //查询分页记录
+        sqlBuilder.append(" group by record_data.id ");
+
+        sqlBuilder.append(" order by record_data.id desc");
+        List<ExamRecordDataEntity> entities = jdbcTemplate.query(sqlBuilder.toString(), (rs, rowNum) -> getExamRecordDataEntityByResultSet(rs));
+
+        return examRecordEntityConvert.ofList(entities);
+    }
+
     @Override
     public Long getExamRecordWaitingAuditNextId(ExamRecordQuery query, Long examRecordDataId, String next) {
         Check.isNull(query, "查询参数不能为空!");