qinchao %!s(int64=4) %!d(string=hai) anos
pai
achega
b06bb29015
Modificáronse 11 ficheiros con 305 adicións e 56 borrados
  1. 14 0
      examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/controller/ExamAuditController.java
  2. 2 0
      examcloud-core-oe-admin-dao/src/main/java/cn/com/qmth/examcloud/core/oe/admin/dao/enums/ExportTaskType.java
  3. 4 0
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/AsyncExportService.java
  4. 8 0
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/ExamAuditService.java
  5. 8 0
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/ExamRecordService.java
  6. 15 0
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examaudit/ExamAuditInfo.java
  7. 7 0
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examrecord/ExamRecordEntityConvert.java
  8. 14 0
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/exporttask/ExportTask.java
  9. 86 0
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/AsyncExportServiceImpl.java
  10. 108 56
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamAuditServiceImpl.java
  11. 39 0
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamRecordServiceImpl.java

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

@@ -13,6 +13,8 @@ import java.util.Set;
 
 import javax.servlet.http.HttpServletResponse;
 
+import cn.com.qmth.examcloud.core.oe.admin.service.AsyncExportService;
+import cn.com.qmth.examcloud.core.oe.admin.service.util.AsyncExportConcurrentUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -72,6 +74,9 @@ public class ExamAuditController extends ControllerSupport {
     @Autowired
     private IllegallyTypeRepo illegallyTypeRepo;
 
+    @Autowired
+    private AsyncExportService asyncExportService;
+
     @PostMapping("/list")
     @ApiOperation(value = "查询“监考已审”列表(分页)")
     public Page<ExamAuditInfo> getExamAuditList(@RequestBody ExamAuditQuery query) {
@@ -85,6 +90,15 @@ public class ExamAuditController extends ControllerSupport {
         return examAuditList;
     }
 
+    @GetMapping("export/async")
+    @ApiOperation(value = "导出“监考已审”(异步)")
+    public void exportExamAuditList(@RequestParam String query) {
+        User user=getAccessUser();
+        asyncExportService.exportExamAuditList(query, user);
+        AsyncExportConcurrentUtil.checkOrStartJob();
+        ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "监考已审-导出","导出条件:"+query));
+    }
+
     @PostMapping("/discipline/list")
     @ApiOperation(value = "查询“违纪名单”列表(分页)")
     public Page<ExamAuditInfo> getExamAuditUnPassList(@RequestBody ExamAuditQuery 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("考试明细"),
 
+    AUDIT("监考已审"),
+
     SCORE_STATISTIC("成绩统计"),
     
     EXAM_SCHEDULING("考试进度");

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

@@ -6,6 +6,7 @@
 package cn.com.qmth.examcloud.core.oe.admin.service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit.ExamAuditQuery;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examrecord.ExamRecordQuery;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examscore.ExamScoreQuery;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentQuery;
@@ -21,10 +22,13 @@ public interface AsyncExportService {
     
     void exportExamScheduling(String jsonParams,User user);
 
+    void exportExamAuditList(String query, User user);
+
 	void asyncExportExamScheduling(Long taskId, ExamStudentQuery req);
 
 	void asyncExportExamRecordDetails(Long taskId, ExamRecordQuery req);
 
 	void asyncExportExamScoreStatistics(Long taskId, ExamScoreQuery req);
 
+    void asyncExportExamAuditList(Long taskId, ExamAuditQuery query);
 }

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

@@ -34,6 +34,14 @@ public interface ExamAuditService {
      */
     Page<ExamAuditInfo> getExamAuditList(ExamAuditQuery query);
 
+    /**
+     * 查询监考已审列表
+     *
+     * @param query
+     * @return
+     */
+    List<ExamAuditInfo> getExamAudit(ExamAuditQuery query);
+
 
     /**
      * 获取审核信息

+ 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 查询“监考待审”下一条记录
 	 *

+ 15 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examaudit/ExamAuditInfo.java

@@ -8,6 +8,7 @@
 package cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit;
 
 import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+import cn.com.qmth.examcloud.support.excel.ExcelProperty;
 
 /**
  * 监考已审信息
@@ -25,21 +26,25 @@ public class ExamAuditInfo implements JsonSerializable {
      */
     private Long id;
 
+    @ExcelProperty(name = "考试记录id", width = 30, index = 1)
     private Long examRecordDataId;
 
     /**
      * 审核状态
      */
+    @ExcelProperty(name = "审核结果", width = 30, index = 13)
     private String status;
     /**
      * 违纪详情
      */
     private String disciplineDetail;
 
+    @ExcelProperty(name = "审核说明", width = 30, index = 12)
     private String disciplineType;
     /**
      * 审核人姓名
      */
+    @ExcelProperty(name = "审核人", width = 30, index = 14)
     private String auditUserName;
 
     /**
@@ -65,14 +70,17 @@ public class ExamAuditInfo implements JsonSerializable {
     /**
      * 学号
      */
+    @ExcelProperty(name = "学号", width = 30, index = 4)
     private String studentCode;
     /**
      * 学生姓名
      */
+    @ExcelProperty(name = "姓名", width = 30, index = 2)
     private String studentName;
     /**
      * 身份证号
      */
+    @ExcelProperty(name = "身份证号", width = 30, index = 3)
     private String identityNumber;
     /**
      * 课程ID
@@ -85,10 +93,12 @@ public class ExamAuditInfo implements JsonSerializable {
     /**
      * 课程名称
      */
+    @ExcelProperty(name = "课程", width = 30, index = 5)
     private String courseName;
     /**
      * 课程层次
      */
+    @ExcelProperty(name = "课程层次", width = 30, index = 6)
     private String courseLevel;
     /**
      * 学习中心ID
@@ -121,6 +131,7 @@ public class ExamAuditInfo implements JsonSerializable {
     /**
      * 第几次考试
      */
+    @ExcelProperty(name = "考试次数", width = 30, index = 11)
     private Integer examOrder;
     /**
      * 是否为重考
@@ -137,6 +148,7 @@ public class ExamAuditInfo implements JsonSerializable {
     /**
      * 抓拍比对成功次数
      */
+    @ExcelProperty(name = "成功次数", width = 30, index = 8)
     private Integer faceSuccessCount;
     /**
      * 抓拍比对失败次数
@@ -145,14 +157,17 @@ public class ExamAuditInfo implements JsonSerializable {
     /**
      * 抓拍存在陌生人的次数
      */
+    @ExcelProperty(name = "陌生人记录", width = 30, index = 9)
     private Integer faceStrangerCount;
     /**
      * 抓拍比对总次数
      */
+    @ExcelProperty(name = "校验次数", width = 30, index = 7)
     private Integer faceTotalCount;
     /**
      * 抓拍比对成功比率
      */
+    @ExcelProperty(name = "人脸识别成功率(%)", width = 30, index = 10)
     private Double faceSuccessPercent;
     /**
      * 活体检测结果

+ 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) {
     	//缓存

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

@@ -6,6 +6,7 @@ import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExportTaskEntity;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.ExportTaskType;
 import cn.com.qmth.examcloud.core.oe.admin.service.AsyncExportService;
 import cn.com.qmth.examcloud.core.oe.admin.service.ExportTaskService;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit.ExamAuditQuery;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examrecord.ExamRecordQuery;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examscore.ExamScoreQuery;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentQuery;
@@ -47,6 +48,8 @@ public class ExportTask extends Thread {
 					examScores(et);
 				} else if (ExportTaskType.EXAM_SCHEDULING.equals(et.getType())) {
 					examScheduling(et);
+				} else if (ExportTaskType.AUDIT.equals(et.getType())) {
+					examAudit(et);
 				}
 				exportTaskService.endExportTask(et.getId());
 			} catch (Exception e) {
@@ -57,6 +60,17 @@ public class ExportTask extends Thread {
 		}
 	}
 
+	/**
+	 * 监考已审
+	 *
+	 * @param et
+	 */
+	private void examAudit(ExportTaskEntity et) {
+		ExamAuditQuery req = new JsonMapper().parseJson(et.getExportParam(), ExamAuditQuery.class);
+		req.setRootOrgId(et.getRootOrgId());
+		asyncExportService.asyncExportExamAuditList(et.getId(), req);
+	}
+
 	/**
 	 * 考试明细
 	 * 

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

@@ -13,6 +13,12 @@ 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.ExamAuditService;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamCaptureService;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit.ExamAuditInfo;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit.ExamAuditQuery;
+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 +79,9 @@ public class AsyncExportServiceImpl implements AsyncExportService {
 	@Autowired
 	private ExamStudentService examStudentService;
 
+	@Autowired
+	private ExamAuditService examAuditService;
+
 	@Override
 	public void exportExamScheduling(String jsonParams, User user) {
 		ExamStudentQuery req = new JsonMapper().parseJson(jsonParams, ExamStudentQuery.class);
@@ -296,6 +305,83 @@ public class AsyncExportServiceImpl implements AsyncExportService {
 		}
 	}
 
+	@Override
+	public void asyncExportExamAuditList(Long taskId, ExamAuditQuery req) {
+		List<ExamAuditInfo> auditInfos;
+		try {
+			auditInfos = examAuditService.getExamAudit(req);
+
+			if (CollectionUtils.isEmpty(auditInfos)) {
+				exportTaskService.updateExportTaskStatus(taskId, ExportTaskStatus.ERROR, "当前条件暂无数据,任务终止");
+				return;
+			}
+			for (ExamAuditInfo examAuditInfo : auditInfos) {
+				examAuditInfo.setIdentityNumber(
+						IdentityNumberHelper.conceal(req.getRootOrgId(), examAuditInfo.getIdentityNumber()));
+			}
+
+		} 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 = auditInfos.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(ExamAuditInfo.class, auditInfos, 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("asyncExportExamAuditList finished... " + oss.getRelativePath());
+			exportTaskService.updateExportTaskStatus(taskId, ExportTaskStatus.SUCCESS, null, oss.getRelativePath());
+		} catch (Exception e) {
+			LOG.info("asyncExportExamAuditList error... " + e.getMessage());
+			exportTaskService.updateExportTaskStatus(taskId, ExportTaskStatus.ERROR, "上传至文件服务器异常");
+		} finally {
+			FileUtils.deleteQuietly(tempFile);
+		}
+	}
+
+	@Override
+	public void exportExamAuditList(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.AUDIT);
+		task.setStatus(ExportTaskStatus.WAITING);
+		task.setCreator(user.getUserId());
+		task.setJsonParams(query);
+		exportTaskService.addExportTask(task);
+	}
+
 	private String randomUUID() {
 		return UUID.randomUUID().toString().replace("-", "");
 	}

+ 108 - 56
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamAuditServiceImpl.java

@@ -118,6 +118,113 @@ public class ExamAuditServiceImpl implements ExamAuditService {
         Check.isNull(query.getExamId(), "请先选择考试批次!");
         //封装查询条件
         Pageable pageable = SpecUtils.buildPageable(query.getPageNo(), query.getPageSize());
+
+        final String columns = ExamAuditMapper.defaultColumns();
+        SqlWrapper wrapper = getSqlWrapper(query);
+
+        long totalSize = 0;
+        //查询总记录数
+        if (query.getSelectType() == null || query.getSelectType() != SelectType.EXPORT) {
+            final String count = "count(0)";
+            final String leftJoin = "LEFT JOIN ec_oe_exam_process_record AS process ON record.id = process.exam_record_data_id";
+            String countSql = wrapper.build().replace(columns, count).replace(leftJoin," ");
+            Query countQuery = entityManager.createNativeQuery(countSql);
+            BigInteger element = (BigInteger) countQuery.getSingleResult();
+            totalSize = element.longValue();
+            if (totalSize == 0) {
+                return new PageImpl<>(Lists.newArrayList(), pageable, totalSize);
+            }
+        }
+
+        wrapper.groupBy("record.id ");
+        //查询分页记录
+        wrapper.orderBy("record.update_time", true);//需求调整20200816:按审核时间排序
+        Query dataQuery = entityManager.createNativeQuery(wrapper.build());
+
+//        dataQuery.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(HashMap.class));
+        dataQuery.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
+        if (query.getSelectType() == null || query.getSelectType() != SelectType.EXPORT) {
+            dataQuery.setFirstResult((int) pageable.getOffset());
+            dataQuery.setMaxResults(pageable.getPageSize());
+        }
+        List resultList = dataQuery.getResultList();
+
+        List<ExamAuditInfo> list = ExamAuditEntityConvert.of(resultList);
+
+        for (ExamAuditInfo examAuditInfo : list) {
+            OrgCacheBean orgBean = gainBaseDataService.getOrgBean(examAuditInfo.getOrgId());
+            examAuditInfo.setOrgName(orgBean.getName());
+
+            //将违纪类型重赋值为文本,万恶的历史原因,不该这么做的。TODO 待优化
+            if (StringUtils.isNotEmpty(examAuditInfo.getDisciplineType())) {
+                IllegallyTypeEntity illegallyType = illegallyTypeService.getIllegallyType(orgBean.getRootId(), examAuditInfo.getDisciplineType());
+                examAuditInfo.setDisciplineType(illegallyType.getName());
+            }
+
+
+            CourseCacheBean courseBean = ExamCacheTransferHelper.getCachedCourse(examAuditInfo.getCourseId());
+            examAuditInfo.setCourseName(courseBean.getName());
+            examAuditInfo.setCourseCode(courseBean.getCode());
+            examAuditInfo.setCourseLevel(CourseLevel.getCourseLevel(courseBean.getLevel()).getTitle());
+
+            //考试名称
+            ExamSettingsCacheBean examBean = ExamCacheTransferHelper.getDefaultCachedExam(query.getExamId());
+            examAuditInfo.setExamName(examBean.getName());
+
+            //客观分
+            ExamScoreEntity examScore = examScoreRepo.findByExamRecordDataId(examAuditInfo.getExamRecordDataId());
+            examAuditInfo.setObjectiveScore(String.valueOf(examScore.getObjectiveScore()));
+
+        }
+        return new PageImpl<ExamAuditInfo>(list, pageable, totalSize);
+    }
+
+    @Override
+    public List<ExamAuditInfo> getExamAudit(ExamAuditQuery query) {
+        Check.isNull(query, "查询参数不能为空!");
+        Check.isNull(query.getExamId(), "请先选择考试批次!");
+
+        SqlWrapper wrapper = getSqlWrapper(query);
+
+        wrapper.groupBy("record.id ");
+        //查询分页记录
+        wrapper.orderBy("record.update_time", true);//需求调整20200816:按审核时间排序
+        Query dataQuery = entityManager.createNativeQuery(wrapper.build());
+        dataQuery.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
+
+        List resultList = dataQuery.getResultList();
+
+        List<ExamAuditInfo> list = ExamAuditEntityConvert.of(resultList);
+
+        for (ExamAuditInfo examAuditInfo : list) {
+            OrgCacheBean orgBean = gainBaseDataService.getOrgBean(examAuditInfo.getOrgId());
+            examAuditInfo.setOrgName(orgBean.getName());
+
+            //将违纪类型重赋值为文本,万恶的历史原因,不该这么做的。TODO 待优化
+            if (StringUtils.isNotEmpty(examAuditInfo.getDisciplineType())) {
+                IllegallyTypeEntity illegallyType = illegallyTypeService.getIllegallyType(orgBean.getRootId(), examAuditInfo.getDisciplineType());
+                examAuditInfo.setDisciplineType(illegallyType.getName());
+            }
+
+            CourseCacheBean courseBean = ExamCacheTransferHelper.getCachedCourse(examAuditInfo.getCourseId());
+            examAuditInfo.setCourseName(courseBean.getName());
+            examAuditInfo.setCourseCode(courseBean.getCode());
+            examAuditInfo.setCourseLevel(CourseLevel.getCourseLevel(courseBean.getLevel()).getTitle());
+
+            //考试名称
+            ExamSettingsCacheBean examBean = ExamCacheTransferHelper.getDefaultCachedExam(query.getExamId());
+            examAuditInfo.setExamName(examBean.getName());
+
+            //客观分
+            ExamScoreEntity examScore = examScoreRepo.findByExamRecordDataId(examAuditInfo.getExamRecordDataId());
+            examAuditInfo.setObjectiveScore(String.valueOf(examScore.getObjectiveScore()));
+
+        }
+        return list;
+    }
+
+
+    private SqlWrapper getSqlWrapper(ExamAuditQuery query){
         final String columns = ExamAuditMapper.defaultColumns();
         SqlWrapper wrapper = new SqlWrapper()
                 .select(columns).from("ec_oe_exam_audit").as("audit")
@@ -177,62 +284,7 @@ public class ExamAuditServiceImpl implements ExamAuditService {
             wrapper.and().gte("audit.update_time", query.getAuditStartTime());
             wrapper.and().lte("audit.update_time", query.getAuditEndTime());
         }
-
-        long totalSize = 0;
-        //查询总记录数
-        if (query.getSelectType() == null || query.getSelectType() != SelectType.EXPORT) {
-            final String count = "count(0)";
-            final String leftJoin = "LEFT JOIN ec_oe_exam_process_record AS process ON record.id = process.exam_record_data_id";
-            String countSql = wrapper.build().replace(columns, count).replace(leftJoin," ");
-            Query countQuery = entityManager.createNativeQuery(countSql);
-            BigInteger element = (BigInteger) countQuery.getSingleResult();
-            totalSize = element.longValue();
-            if (totalSize == 0) {
-                return new PageImpl<>(Lists.newArrayList(), pageable, totalSize);
-            }
-        }
-
-        wrapper.groupBy("record.id ");
-        //查询分页记录
-        wrapper.orderBy("record.update_time", true);//需求调整20200816:按审核时间排序
-        Query dataQuery = entityManager.createNativeQuery(wrapper.build());
-
-//        dataQuery.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(HashMap.class));
-        dataQuery.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
-        if (query.getSelectType() == null || query.getSelectType() != SelectType.EXPORT) {
-            dataQuery.setFirstResult((int) pageable.getOffset());
-            dataQuery.setMaxResults(pageable.getPageSize());
-        }
-        List resultList = dataQuery.getResultList();
-
-        List<ExamAuditInfo> list = ExamAuditEntityConvert.of(resultList);
-
-        for (ExamAuditInfo examAuditInfo : list) {
-            OrgCacheBean orgBean = gainBaseDataService.getOrgBean(examAuditInfo.getOrgId());
-            examAuditInfo.setOrgName(orgBean.getName());
-
-            //将违纪类型重赋值为文本,万恶的历史原因,不该这么做的。TODO 待优化
-            if (StringUtils.isNotEmpty(examAuditInfo.getDisciplineType())) {
-                IllegallyTypeEntity illegallyType = illegallyTypeService.getIllegallyType(orgBean.getRootId(), examAuditInfo.getDisciplineType());
-                examAuditInfo.setDisciplineType(illegallyType.getName());
-            }
-
-
-            CourseCacheBean courseBean = ExamCacheTransferHelper.getCachedCourse(examAuditInfo.getCourseId());
-            examAuditInfo.setCourseName(courseBean.getName());
-            examAuditInfo.setCourseCode(courseBean.getCode());
-            examAuditInfo.setCourseLevel(CourseLevel.getCourseLevel(courseBean.getLevel()).getTitle());
-
-            //考试名称
-            ExamSettingsCacheBean examBean = ExamCacheTransferHelper.getDefaultCachedExam(query.getExamId());
-            examAuditInfo.setExamName(examBean.getName());
-
-            //客观分
-            ExamScoreEntity examScore = examScoreRepo.findByExamRecordDataId(examAuditInfo.getExamRecordDataId());
-            examAuditInfo.setObjectiveScore(String.valueOf(examScore.getObjectiveScore()));
-
-        }
-        return new PageImpl<ExamAuditInfo>(list, pageable, totalSize);
+        return wrapper;
     }
 
     @Override

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

@@ -157,6 +157,7 @@ public class ExamRecordServiceImpl implements ExamRecordService {
             "record_data.paper_type paperType," +
             "record_data.paper_struct_id paperStructId," +
             "record_data.info_collector infoCollector," +
+            "audit.audit_user_name audit_user_name," +
             "GROUP_CONCAT(DISTINCT process.source_ip) ip," +
 			"eoes.objective_score objectiveTotalScore," +
 			"eoes.subjective_score subjectiveTotalScore," +
@@ -166,6 +167,7 @@ public class ExamRecordServiceImpl implements ExamRecordService {
             
             " from ec_oe_exam_record_data record_data " +
             " LEFT JOIN ec_oe_exam_process_record AS process ON record_data.id = process.exam_record_data_id " +
+            " LEFT JOIN ec_oe_exam_audit AS audit ON record_data.id = audit.exam_record_data_id " +
             " LEFT JOIN ec_oe_exam_score eoes ON  record_data.id = eoes.exam_record_data_id "+
             " LEFT JOIN ec_oe_exam_student eoest ON  record_data.exam_student_id = eoest.exam_student_id "+
             " where 1=1";
@@ -235,6 +237,7 @@ public class ExamRecordServiceImpl implements ExamRecordService {
     @Override
     public Page<ExamRecordInfo> getExamRecordDetailListForPage(ExamRecordQuery query) {
         Check.isNull(query, "查询参数不能为空!");
+        Check.isNull(query.getExamId(), "请先选择考试批次!");
         query.addRecordStatus(ExamRecordStatus.EXAM_END.name());
         query.addRecordStatus(ExamRecordStatus.EXAM_OVERDUE.name());
         return this.loadData(_getExamRecordDetailListForPage(query), query.getExamId());
@@ -243,6 +246,7 @@ public class ExamRecordServiceImpl implements ExamRecordService {
     @Override
     public Page<ExamRecordInfo> getExamRecordWaitingAuditList(ExamRecordQuery query) {
         Check.isNull(query, "查询参数不能为空!");
+        Check.isNull(query.getExamId(), "请先选择考试批次!");
         //默认条件
         query.setIsAudit(false);
         query.addRecordStatus(ExamRecordStatus.EXAM_END.name());
@@ -250,9 +254,43 @@ 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());
+
+        //查询条件
+        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, "查询参数不能为空!");
+        Check.isNull(query.getExamId(), "请先选择考试批次!");
         //默认条件
         query.setIsWarn(true);
         query.setIsAudit(false);
@@ -302,6 +340,7 @@ public class ExamRecordServiceImpl implements ExamRecordService {
         //分页条件
         int currentNum = (query.getPageNo() - 1) * query.getPageSize();
         Check.isNull(query, "查询参数不能为空!");
+        Check.isNull(query.getExamId(), "请先选择考试批次!");
         //查询条件
         StringBuilder sqlBuilder = new StringBuilder();
         sqlBuilder.append(EXAM_RECORD_SQL);