xiatian 3 жил өмнө
parent
commit
9fbc5691f5
16 өөрчлөгдсөн 762 нэмэгдсэн , 285 устгасан
  1. 14 1
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examaudit/ExamAuditEntityConvert.java
  2. 60 1
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examaudit/ExamAuditExcel.java
  3. 49 1
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examaudit/ExamAuditInfo.java
  4. 1 1
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examaudit/ExamAuditMapper.java
  5. 16 14
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examrecord/ExamRecordEntityConvert.java
  6. 47 1
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examrecord/ExamRecordInfo.java
  7. 49 1
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examscore/ExamScoreInfo.java
  8. 219 210
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examstudent/ExamStudentEntityConvert.java
  9. 60 3
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examstudent/ExamStudentExcel.java
  10. 30 2
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examstudent/ExamStudentInfo.java
  11. 39 1
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examstudent/ExamStudentUnFinishedExcel.java
  12. 20 0
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/AsyncExportServiceImpl.java
  13. 24 0
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamAuditServiceImpl.java
  14. 26 7
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamRecordServiceImpl.java
  15. 31 6
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamScoreServiceImpl.java
  16. 77 36
      examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamStudentServiceImpl.java

+ 14 - 1
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examaudit/ExamAuditEntityConvert.java

@@ -26,9 +26,12 @@ import com.google.common.collect.Lists;
 import com.mysql.cj.util.StringUtils;
 
 import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
+import cn.com.qmth.examcloud.commons.util.DateUtil;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.AuditStatus;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.CourseLevel;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.IsSuccess;
+import cn.com.qmth.examcloud.support.cache.CacheHelper;
+import cn.com.qmth.examcloud.support.cache.bean.ExamStageCacheBean;
 
 /**
  * 类信息转换
@@ -84,6 +87,7 @@ public class ExamAuditEntityConvert {
 		}
 		page.getContent().forEach(e -> {
 			ExamAuditExcel excel = new ExamAuditExcel();
+			excel.setExamId(e.getExamId());
 			excel.setExamRecordDataId(e.getExamRecordDataId());
 			/*
 			 * DisciplineType disciplineType =
@@ -91,7 +95,16 @@ public class ExamAuditEntityConvert {
 			 * if(disciplineType!=null){ excel.setDisciplineType(disciplineType.getName());
 			 * }
 			 */
-			excel.setExamStageOrder(e.getExamStageOrder());
+			excel.setExamStageId(e.getExamStageId());
+			if(excel.getExamStageId()!=null) {
+    			ExamStageCacheBean stage=CacheHelper.getExamStage(excel.getExamId(), excel.getExamStageId());
+    			excel.setExamStageOrder(stage.getStageOrder());
+    			excel.setStartTime(stage.getStartTime());
+    			excel.setEndTime(stage.getEndTime());
+    			excel.setExamStage(stage.getStageOrder() + "("
+						+ DateUtil.format(stage.getStartTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + "至"
+						+ DateUtil.format(stage.getEndTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + ")");
+    		}
 			excel.setOrgName(e.getOrgName());
 			excel.setDisciplineType(e.getDisciplineType());
 			excel.setExamName(e.getExamName());

+ 60 - 1
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examaudit/ExamAuditExcel.java

@@ -7,6 +7,8 @@
 
 package cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit;
 
+import java.util.Date;
+
 import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
 import cn.com.qmth.examcloud.support.excel.ExcelProperty;
 
@@ -71,8 +73,24 @@ public class ExamAuditExcel implements JsonSerializable {
     @ExcelProperty(name = "Ip", index = 15)
     private String ip;
     
-    @ExcelProperty(name = "场次号", width = 30, index = 16)
+    private Long examId;
+    
+    @ExcelProperty(name = "场次", width = 30, index = 16)
+    private String examStage;
+    
+    private Long examStageId;
+    
     private Integer examStageOrder;
+    
+    /**
+     * 场次开始时间
+     */
+    private Date startTime;
+    
+    /**
+     * 场次结束时间
+     */
+    private Date endTime;
 
     public Long getExamRecordDataId() {
         return examRecordDataId;
@@ -210,5 +228,46 @@ public class ExamAuditExcel implements JsonSerializable {
 		this.examStageOrder = examStageOrder;
 	}
 
+	public String getExamStage() {
+		return examStage;
+	}
+
+	public void setExamStage(String examStage) {
+		this.examStage = examStage;
+	}
+
+	public Long getExamStageId() {
+		return examStageId;
+	}
+
+	public void setExamStageId(Long examStageId) {
+		this.examStageId = examStageId;
+	}
+
+	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 Long getExamId() {
+		return examId;
+	}
+
+	public void setExamId(Long examId) {
+		this.examId = examId;
+	}
+
+	
     
 }

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

@@ -7,6 +7,8 @@
 
 package cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit;
 
+import java.util.Date;
+
 import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
 import cn.com.qmth.examcloud.support.excel.ExcelProperty;
 
@@ -239,8 +241,22 @@ public class ExamAuditInfo implements JsonSerializable {
     @ExcelProperty(name = "切屏次数", width = 30, index = 15)
     private Integer switchScreenCount;
     
-    @ExcelProperty(name = "场次号", width = 30, index = 16)
+    @ExcelProperty(name = "场次", width = 30, index = 16)
+    private String examStage;
+    
+    private Long examStageId;
+    
     private Integer examStageOrder;
+    
+    /**
+     * 场次开始时间
+     */
+    private Date startTime;
+    
+    /**
+     * 场次结束时间
+     */
+    private Date endTime;
 
     public Long getId() {
         return id;
@@ -586,6 +602,38 @@ public class ExamAuditInfo implements JsonSerializable {
 		this.examStageOrder = examStageOrder;
 	}
 
+	public String getExamStage() {
+		return examStage;
+	}
+
+	public void setExamStage(String examStage) {
+		this.examStage = examStage;
+	}
+
+	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 Long getExamStageId() {
+		return examStageId;
+	}
+
+	public void setExamStageId(Long examStageId) {
+		this.examStageId = examStageId;
+	}
+
 
     
 }

+ 1 - 1
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examaudit/ExamAuditMapper.java

@@ -45,7 +45,7 @@ public class ExamAuditMapper {
         columns.append("record.start_time as paperStartTime,");
         columns.append("record.end_time as paperSubmitTime,");
         columns.append("record.switch_screen_count as switchScreenCount,");
-        columns.append("record.exam_stage_order as examStageOrder,");
+        columns.append("record.exam_stage_id as examStageId,");
         columns.append("GROUP_CONCAT(DISTINCT process.source_ip) ip");
         return columns.toString();
     }

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

@@ -7,6 +7,20 @@
 
 package cn.com.qmth.examcloud.core.oe.admin.service.bean.examrecord;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Component;
+
+import com.google.common.collect.Lists;
+
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.oe.admin.base.Constants;
 import cn.com.qmth.examcloud.core.oe.admin.base.utils.DateUtils;
@@ -23,18 +37,6 @@ import cn.com.qmth.examcloud.support.cache.bean.CourseCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.OrgCacheBean;
 import cn.com.qmth.examcloud.support.helper.ExamCacheTransferHelper;
 import cn.com.qmth.examcloud.web.helpers.GlobalHelper;
-import com.google.common.collect.Lists;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageImpl;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * 类信息转换
@@ -77,7 +79,7 @@ public class ExamRecordEntityConvert {
         info.setIdentityNumber(record.getIdentityNumber());
         info.setCourseId(record.getCourseId());
         info.setSwitchScreenCount(record.getSwitchScreenCount());
-        info.setExamStageOrder(record.getExamStageOrder());
+        info.setExamStageId(record.getExamStageId());
 
         long courseId = record.getCourseId();
         CourseCacheBean courseBean = ExamCacheTransferHelper.getCachedCourse(courseId);
@@ -172,7 +174,7 @@ public class ExamRecordEntityConvert {
         List<ExamRecordInfo> list = entities.stream().map(entity -> of(entity, cahcheMap)).collect(Collectors.toList());
         return new PageImpl<ExamRecordInfo>(list, pageable, page.getTotalElements());
     }
-
+    
     public List<ExamRecordInfo> ofList(List<ExamRecordDataEntity> entities) {
         //缓存
         Map<String, Object> cahcheMap = new HashMap<>();

+ 47 - 1
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examrecord/ExamRecordInfo.java

@@ -359,8 +359,22 @@ public class ExamRecordInfo implements JsonSerializable {
     @ExcelProperty(name = "切屏次数", width = 30, index = 34)
     private Integer switchScreenCount;
     
-    @ExcelProperty(name = "场次号", width = 30, index = 35)
+    @ExcelProperty(name = "场次", width = 30, index = 35)
+    private String examStage;
+    
+    private Long examStageId;
+    
     private Integer examStageOrder;
+    
+    /**
+     * 场次开始时间
+     */
+    private Date stageStartTime;
+    
+    /**
+     * 场次结束时间
+     */
+    private Date stageEndTime;
 
     public Long getId() {
         return id;
@@ -876,5 +890,37 @@ public class ExamRecordInfo implements JsonSerializable {
 		this.examStageOrder = examStageOrder;
 	}
 
+	public String getExamStage() {
+		return examStage;
+	}
+
+	public void setExamStage(String examStage) {
+		this.examStage = examStage;
+	}
+
+	public Long getExamStageId() {
+		return examStageId;
+	}
+
+	public void setExamStageId(Long examStageId) {
+		this.examStageId = examStageId;
+	}
+
+	public Date getStageStartTime() {
+		return stageStartTime;
+	}
+
+	public void setStageStartTime(Date stageStartTime) {
+		this.stageStartTime = stageStartTime;
+	}
+
+	public Date getStageEndTime() {
+		return stageEndTime;
+	}
+
+	public void setStageEndTime(Date stageEndTime) {
+		this.stageEndTime = stageEndTime;
+	}
+
     
 }

+ 49 - 1
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examscore/ExamScoreInfo.java

@@ -7,6 +7,8 @@
 
 package cn.com.qmth.examcloud.core.oe.admin.service.bean.examscore;
 
+import java.util.Date;
+
 import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
 import cn.com.qmth.examcloud.support.excel.ExcelProperty;
 
@@ -165,8 +167,22 @@ public class ExamScoreInfo implements JsonSerializable {
     @ExcelProperty(name = "采集人", width = 30, index = 18)
     private String infoCollector;
     
-    @ExcelProperty(name = "场次号", width = 30, index = 20)
+    @ExcelProperty(name = "场次", width = 30, index = 20)
+    private String examStage;
+    
+    private Long examStageId;
+    
     private Integer examStageOrder;
+    
+    /**
+     * 场次开始时间
+     */
+    private Date stageStartTime;
+    
+    /**
+     * 场次结束时间
+     */
+    private Date stageEndTime;
 
     public Long getExamId() {
         return examId;
@@ -383,6 +399,38 @@ public class ExamScoreInfo implements JsonSerializable {
 	public void setExamStageOrder(Integer examStageOrder) {
 		this.examStageOrder = examStageOrder;
 	}
+
+	public String getExamStage() {
+		return examStage;
+	}
+
+	public void setExamStage(String examStage) {
+		this.examStage = examStage;
+	}
+
+	public Long getExamStageId() {
+		return examStageId;
+	}
+
+	public void setExamStageId(Long examStageId) {
+		this.examStageId = examStageId;
+	}
+
+	public Date getStageStartTime() {
+		return stageStartTime;
+	}
+
+	public void setStageStartTime(Date stageStartTime) {
+		this.stageStartTime = stageStartTime;
+	}
+
+	public Date getStageEndTime() {
+		return stageEndTime;
+	}
+
+	public void setStageEndTime(Date stageEndTime) {
+		this.stageEndTime = stageEndTime;
+	}
     
     
 

+ 219 - 210
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examstudent/ExamStudentEntityConvert.java

@@ -8,6 +8,7 @@
 package cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent;
 
 import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
+import cn.com.qmth.examcloud.commons.util.DateUtil;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamStudentEntity;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.CourseLevel;
 import com.google.common.collect.Lists;
@@ -32,228 +33,236 @@ import java.util.stream.Collectors;
  */
 public class ExamStudentEntityConvert {
 
-    public static ExamStudentEntity of(ExamStudentInfo info) {
-        if (info == null) {
-            return null;
-        }
-        ExamStudentEntity entity = new ExamStudentEntity();
-        entity.setId(info.getId());
-        entity.setExamStudentId(info.getExamStudentId());
-        entity.setExamId(info.getExamId());
-        entity.setStudentId(info.getStudentId());
-        entity.setStudentCode(info.getStudentCode());
-        entity.setStudentName(info.getStudentName());
-        entity.setIdentityNumber(info.getIdentityNumber());
-        entity.setCourseId(info.getCourseId());
-        entity.setCourseCode(info.getCourseCode());
-        entity.setCourseLevel(info.getCourseLevel());
-        entity.setOrgId(info.getOrgId());
-        entity.setRootOrgId(info.getRootOrgId());
-        entity.setSpecialtyCode(info.getSpecialtyCode());
-        entity.setSpecialtyName(info.getSpecialtyName());
-        entity.setPaperType(info.getPaperType());
-        entity.setInfoCollector(info.getInfoCollector());
-        entity.setFinished(info.getFinished());
-        entity.setUsedNum(info.getUsedNum());
-        entity.setExtraNum(info.getExtraNum());
-        return entity;
-    }
+	public static ExamStudentEntity of(ExamStudentInfo info) {
+		if (info == null) {
+			return null;
+		}
+		ExamStudentEntity entity = new ExamStudentEntity();
+		entity.setId(info.getId());
+		entity.setExamStudentId(info.getExamStudentId());
+		entity.setExamId(info.getExamId());
+		entity.setStudentId(info.getStudentId());
+		entity.setStudentCode(info.getStudentCode());
+		entity.setStudentName(info.getStudentName());
+		entity.setIdentityNumber(info.getIdentityNumber());
+		entity.setCourseId(info.getCourseId());
+		entity.setCourseCode(info.getCourseCode());
+		entity.setCourseLevel(info.getCourseLevel());
+		entity.setOrgId(info.getOrgId());
+		entity.setRootOrgId(info.getRootOrgId());
+		entity.setSpecialtyCode(info.getSpecialtyCode());
+		entity.setSpecialtyName(info.getSpecialtyName());
+		entity.setPaperType(info.getPaperType());
+		entity.setInfoCollector(info.getInfoCollector());
+		entity.setFinished(info.getFinished());
+		entity.setUsedNum(info.getUsedNum());
+		entity.setExtraNum(info.getExtraNum());
+		return entity;
+	}
 
-    public static ExamStudentInfo of(ExamStudentEntity entity) {
-        if (entity == null) {
-            return null;
-        }
-        ExamStudentInfo info = new ExamStudentInfo();
-        info.setId(entity.getId());
-        info.setExamStudentId(entity.getExamStudentId());
-        info.setExamId(entity.getExamId());
-        info.setStudentId(entity.getStudentId());
-        info.setStudentCode(entity.getStudentCode());
-        info.setStudentName(entity.getStudentName());
-        info.setIdentityNumber(entity.getIdentityNumber());
-        info.setCourseId(entity.getCourseId());
-        info.setCourseCode(entity.getCourseCode());
-        info.setCourseLevel(CourseLevel.getCourseLevelTitle(entity.getCourseLevel()));
-        info.setOrgId(entity.getOrgId());
-        info.setRootOrgId(entity.getRootOrgId());
-        info.setSpecialtyCode(entity.getSpecialtyCode());
-        info.setSpecialtyName(entity.getSpecialtyName());
-        info.setPaperType(entity.getPaperType());
-        info.setInfoCollector(entity.getInfoCollector());
-        info.setFinished(entity.getFinished());
-        info.setUsedNum(entity.getUsedNum());
-        info.setExtraNum(entity.getExtraNum());
-        info.setGrade(entity.getGrade());
-        info.setExamStageOrder(entity.getExamStageOrder());
-        return info;
-    }
+	public static ExamStudentInfo of(ExamStudentEntity entity) {
+		if (entity == null) {
+			return null;
+		}
+		ExamStudentInfo info = new ExamStudentInfo();
+		info.setId(entity.getId());
+		info.setExamStudentId(entity.getExamStudentId());
+		info.setExamId(entity.getExamId());
+		info.setStudentId(entity.getStudentId());
+		info.setStudentCode(entity.getStudentCode());
+		info.setStudentName(entity.getStudentName());
+		info.setIdentityNumber(entity.getIdentityNumber());
+		info.setCourseId(entity.getCourseId());
+		info.setCourseCode(entity.getCourseCode());
+		info.setCourseLevel(CourseLevel.getCourseLevelTitle(entity.getCourseLevel()));
+		info.setOrgId(entity.getOrgId());
+		info.setRootOrgId(entity.getRootOrgId());
+		info.setSpecialtyCode(entity.getSpecialtyCode());
+		info.setSpecialtyName(entity.getSpecialtyName());
+		info.setPaperType(entity.getPaperType());
+		info.setInfoCollector(entity.getInfoCollector());
+		info.setFinished(entity.getFinished());
+		info.setUsedNum(entity.getUsedNum());
+		info.setExtraNum(entity.getExtraNum());
+		info.setGrade(entity.getGrade());
+		info.setExamStageId(entity.getExamStageId());
+		return info;
+	}
 
-    public static List<ExamStudentExcel> ofExcel(List<ExamStudentInfo> examStudentInfoList) {
-        List<ExamStudentExcel> list = new ArrayList<>();
-        if (examStudentInfoList == null || examStudentInfoList.size() == 0) {
-            return list;
-        }
-        examStudentInfoList.forEach(e -> {
-            ExamStudentExcel excel = new ExamStudentExcel();
-            excel.setStudentCode(e.getStudentCode());
-            excel.setStudentName(e.getStudentName());
-            excel.setIdentityNumber(e.getIdentityNumber());
-            excel.setGrade(e.getGrade());
-            excel.setPhone(e.getPhone());
-            excel.setInfoCollector(e.getInfoCollector());
-            excel.setCourseCode(e.getCourseCode());
-            excel.setCourseName(e.getCourseName());
-            excel.setOrgName(e.getOrgName());
-            excel.setFinished(e.getFinishedStatus());
-            excel.setExamStageOrder(e.getExamStageOrder());
-            list.add(excel);
-        });
-        return list;
-    }
+	public static List<ExamStudentExcel> ofExcel(List<ExamStudentInfo> examStudentInfoList) {
+		List<ExamStudentExcel> list = new ArrayList<>();
+		if (examStudentInfoList == null || examStudentInfoList.size() == 0) {
+			return list;
+		}
+		examStudentInfoList.forEach(e -> {
+			ExamStudentExcel excel = new ExamStudentExcel();
+			excel.setStudentCode(e.getStudentCode());
+			excel.setStudentName(e.getStudentName());
+			excel.setIdentityNumber(e.getIdentityNumber());
+			excel.setGrade(e.getGrade());
+			excel.setPhone(e.getPhone());
+			excel.setInfoCollector(e.getInfoCollector());
+			excel.setCourseCode(e.getCourseCode());
+			excel.setCourseName(e.getCourseName());
+			excel.setOrgName(e.getOrgName());
+			excel.setFinished(e.getFinishedStatus());
+			excel.setExamStageId(e.getExamStageId());
+			excel.setExamId(e.getExamId());
+			list.add(excel);
+		});
+		return list;
+	}
 
-    public static List<ExamStudentUnFinishedExcel> ofUnFinishedExcel(Page<ExamStudentInfo> page) {
-        List<ExamStudentUnFinishedExcel> list = new ArrayList<>();
-        if (page == null || page.getContent() == null) {
-            return list;
-        }
-        page.getContent().forEach(e -> {
-            ExamStudentUnFinishedExcel excel = new ExamStudentUnFinishedExcel();
-            excel.setStudentCode(e.getStudentCode());
-            excel.setStudentName(e.getStudentName());
-            excel.setIdentityNumber(e.getIdentityNumber());
-            excel.setCourseCode(e.getCourseCode());
-            excel.setCourseName(e.getCourseName());
-            excel.setOrgCode(e.getOrgCode());
-            excel.setOrgName(e.getOrgName());
-            excel.setInfoCollector(e.getInfoCollector());
-            excel.setPaperType(e.getPaperType());
-            excel.setSpecialtyName(e.getSpecialtyName());
-            excel.setExamSiteName(e.getExamSiteName());
-            excel.setGrade(e.getGrade());
-            excel.setPhone(e.getPhone());
-            list.add(excel);
-        });
-        return list;
-    }
+	public static List<ExamStudentUnFinishedExcel> ofUnFinishedExcel(Page<ExamStudentInfo> page) {
+		List<ExamStudentUnFinishedExcel> list = new ArrayList<>();
+		if (page == null || page.getContent() == null) {
+			return list;
+		}
+		page.getContent().forEach(e -> {
+			ExamStudentUnFinishedExcel excel = new ExamStudentUnFinishedExcel();
+			excel.setStudentCode(e.getStudentCode());
+			excel.setStudentName(e.getStudentName());
+			excel.setIdentityNumber(e.getIdentityNumber());
+			excel.setCourseCode(e.getCourseCode());
+			excel.setCourseName(e.getCourseName());
+			excel.setOrgCode(e.getOrgCode());
+			excel.setOrgName(e.getOrgName());
+			excel.setInfoCollector(e.getInfoCollector());
+			excel.setPaperType(e.getPaperType());
+			excel.setSpecialtyName(e.getSpecialtyName());
+			excel.setExamSiteName(e.getExamSiteName());
+			excel.setGrade(e.getGrade());
+			excel.setPhone(e.getPhone());
+			list.add(excel);
+		});
+		return list;
+	}
 
+	public static List<ExamStudentUnFinishedExcel> ofUnFinishedExcel(List<ExamStudentInfo> examStudentInfos) {
+		List<ExamStudentUnFinishedExcel> list = new ArrayList<>();
+		if (examStudentInfos == null || examStudentInfos.size() == 0) {
+			return list;
+		}
+		examStudentInfos.forEach(e -> {
+			ExamStudentUnFinishedExcel excel = new ExamStudentUnFinishedExcel();
+			excel.setStudentCode(e.getStudentCode());
+			excel.setStudentName(e.getStudentName());
+			excel.setIdentityNumber(e.getIdentityNumber());
+			excel.setCourseCode(e.getCourseCode());
+			excel.setCourseName(e.getCourseName());
+			excel.setOrgCode(e.getOrgCode());
+			excel.setOrgName(e.getOrgName());
+			excel.setInfoCollector(e.getInfoCollector());
+			excel.setPaperType(e.getPaperType());
+			excel.setSpecialtyName(e.getSpecialtyName());
+			excel.setExamSiteName(e.getExamSiteName());
+			excel.setGrade(e.getGrade());
+			excel.setPhone(e.getPhone());
+			excel.setExamStageOrder(e.getExamStageOrder());
+			excel.setStartTime(e.getStartTime());
+			excel.setEndTime(e.getEndTime());
+			if (e.getExamStageOrder() != null) {
+				excel.setExamStage(e.getExamStageOrder() + "("
+						+ DateUtil.format(e.getStartTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + "至"
+						+ DateUtil.format(e.getEndTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + ")");
+			}
+			list.add(excel);
+		});
+		return list;
+	}
 
-    public static List<ExamStudentUnFinishedExcel> ofUnFinishedExcel(List<ExamStudentInfo> examStudentInfos) {
-        List<ExamStudentUnFinishedExcel> list = new ArrayList<>();
-        if (examStudentInfos == null || examStudentInfos.size() == 0) {
-            return list;
-        }
-        examStudentInfos.forEach(e -> {
-            ExamStudentUnFinishedExcel excel = new ExamStudentUnFinishedExcel();
-            excel.setStudentCode(e.getStudentCode());
-            excel.setStudentName(e.getStudentName());
-            excel.setIdentityNumber(e.getIdentityNumber());
-            excel.setCourseCode(e.getCourseCode());
-            excel.setCourseName(e.getCourseName());
-            excel.setOrgCode(e.getOrgCode());
-            excel.setOrgName(e.getOrgName());
-            excel.setInfoCollector(e.getInfoCollector());
-            excel.setPaperType(e.getPaperType());
-            excel.setSpecialtyName(e.getSpecialtyName());
-            excel.setExamSiteName(e.getExamSiteName());
-            excel.setGrade(e.getGrade());
-            excel.setPhone(e.getPhone());
-            excel.setExamStageOrder(e.getExamStageOrder());
-            list.add(excel);
-        });
-        return list;
-    }
+	public static Page<ExamStudentInfo> of(Page<ExamStudentEntity> page) {
+		Pageable pageable = PageRequest.of(page.getNumber(), page.getSize());
+		List<ExamStudentEntity> entities = page.getContent();
+		if (entities == null || entities.size() == 0) {
+			return new PageImpl<>(Lists.newArrayList(), pageable, page.getTotalElements());
+		}
+		List<ExamStudentInfo> list = entities.stream().map(entity -> of(entity)).collect(Collectors.toList());
+		return new PageImpl<>(list, pageable, page.getTotalElements());
+	}
 
+	public static List<ExamStudentInfo> of(List<HashMap> maps) {
+		if (maps == null || maps.size() == 0) {
+			return Lists.newArrayList();
+		}
+		List<ExamStudentInfo> list = new ArrayList<>();
+		for (Map map : maps) {
+			try {
+				// 转换Map数据
+				ExamStudentInfo info = new ExamStudentInfo();
+				BeanUtils.populate(info, map);
+				// 转换枚举名称
+				info.setCourseLevel(CourseLevel.getCourseLevelTitle(info.getCourseLevel()));
+				list.add(info);
+			} catch (Exception e) {
+				throw new ExamCloudRuntimeException(e.getMessage(), e.getCause());
+			}
+		}
+		return list;
+	}
 
-    public static Page<ExamStudentInfo> of(Page<ExamStudentEntity> page) {
-        Pageable pageable = PageRequest.of(page.getNumber(), page.getSize());
-        List<ExamStudentEntity> entities = page.getContent();
-        if (entities == null || entities.size() == 0) {
-            return new PageImpl<>(Lists.newArrayList(), pageable, page.getTotalElements());
-        }
-        List<ExamStudentInfo> list = entities.stream().map(entity -> of(entity)).collect(Collectors.toList());
-        return new PageImpl<>(list, pageable, page.getTotalElements());
-    }
+	public static List<ExamStudentOrgStatistic> ofList(List<HashMap> maps) {
+		if (maps == null || maps.size() == 0) {
+			return Lists.newArrayList();
+		}
+		List<ExamStudentOrgStatistic> list = new ArrayList<>();
+		for (Map map : maps) {
+			try {
+				// 转换Map数据
+				ExamStudentOrgStatistic info = new ExamStudentOrgStatistic();
+				BeanUtils.populate(info, map);
+				if (info.getTotalCount() == 0 || info.getFinishedCount() == 0) {
+					info.setFinishedPercent("0");
+				} else {
+					double percent = (double) info.getFinishedCount() / info.getTotalCount();
+					info.setFinishedPercent(new DecimalFormat("#.00").format(percent * 100));
+				}
+				list.add(info);
+			} catch (Exception e) {
+				throw new ExamCloudRuntimeException(e.getMessage(), e.getCause());
+			}
+		}
+		return list;
+	}
 
-    public static List<ExamStudentInfo> of(List<HashMap> maps) {
-        if (maps == null || maps.size() == 0) {
-            return Lists.newArrayList();
-        }
-        List<ExamStudentInfo> list = new ArrayList<>();
-        for (Map map : maps) {
-            try {
-                //转换Map数据
-                ExamStudentInfo info = new ExamStudentInfo();
-                BeanUtils.populate(info, map);
-                //转换枚举名称
-                info.setCourseLevel(CourseLevel.getCourseLevelTitle(info.getCourseLevel()));
-                list.add(info);
-            } catch (Exception e) {
-                throw new ExamCloudRuntimeException(e.getMessage(), e.getCause());
-            }
-        }
-        return list;
-    }
+	public static List<CourseCompleteProgressExcel> copyFromCourseProgressInfo(
+			List<CourseProgressInfo> courseProgressInfoList) {
+		List<CourseCompleteProgressExcel> resultList = new ArrayList<>();
+		if (courseProgressInfoList == null || courseProgressInfoList.isEmpty()) {
+			return resultList;
+		}
 
-    public static List<ExamStudentOrgStatistic> ofList(List<HashMap> maps) {
-        if (maps == null || maps.size() == 0) {
-            return Lists.newArrayList();
-        }
-        List<ExamStudentOrgStatistic> list = new ArrayList<>();
-        for (Map map : maps) {
-            try {
-                //转换Map数据
-                ExamStudentOrgStatistic info = new ExamStudentOrgStatistic();
-                BeanUtils.populate(info, map);
-                if (info.getTotalCount() == 0 || info.getFinishedCount() == 0) {
-                    info.setFinishedPercent("0");
-                } else {
-                    double percent = (double) info.getFinishedCount() / info.getTotalCount();
-                    info.setFinishedPercent(new DecimalFormat("#.00").format(percent * 100));
-                }
-                list.add(info);
-            } catch (Exception e) {
-                throw new ExamCloudRuntimeException(e.getMessage(), e.getCause());
-            }
-        }
-        return list;
-    }
+		courseProgressInfoList.forEach(info -> {
+			CourseCompleteProgressExcel excel = new CourseCompleteProgressExcel();
+			excel.setAllNum(info.getAllNum());
+			excel.setCompletedNum(info.getCompletedNum());
+			excel.setCompletedProportion(info.getCompletedProportion());
+			excel.setCourseCode(info.getCourseCode());
+			excel.setCourseName(info.getCourseName());
+			resultList.add(excel);
+		});
 
-    public static List<CourseCompleteProgressExcel> copyFromCourseProgressInfo(List<CourseProgressInfo> courseProgressInfoList) {
-        List<CourseCompleteProgressExcel> resultList = new ArrayList<>();
-        if (courseProgressInfoList == null || courseProgressInfoList.isEmpty()) {
-            return resultList;
-        }
+		return resultList;
+	}
 
-        courseProgressInfoList.forEach(info -> {
-            CourseCompleteProgressExcel excel = new CourseCompleteProgressExcel();
-            excel.setAllNum(info.getAllNum());
-            excel.setCompletedNum(info.getCompletedNum());
-            excel.setCompletedProportion(info.getCompletedProportion());
-            excel.setCourseCode(info.getCourseCode());
-            excel.setCourseName(info.getCourseName());
-            resultList.add(excel);
-        });
+	public static List<OrgCompleteProgressExcel> copyFromExamStudentOrgStatistic(
+			List<ExamStudentOrgStatistic> examStudentOrgStatisticList) {
+		List<OrgCompleteProgressExcel> resultList = new ArrayList<>();
+		if (examStudentOrgStatisticList == null || examStudentOrgStatisticList.isEmpty()) {
+			return resultList;
+		}
 
-        return resultList;
-    }
+		examStudentOrgStatisticList.forEach(info -> {
+			OrgCompleteProgressExcel excel = new OrgCompleteProgressExcel();
+			excel.setFinishedCount(info.getFinishedCount());
+			excel.setFinishedPercent(info.getFinishedPercent());
+			excel.setOrgCode(info.getOrgCode());
+			excel.setOrgName(info.getOrgName());
+			excel.setTotalCount(info.getTotalCount());
+			resultList.add(excel);
+		});
 
-    public static List<OrgCompleteProgressExcel> copyFromExamStudentOrgStatistic(List<ExamStudentOrgStatistic> examStudentOrgStatisticList) {
-        List<OrgCompleteProgressExcel> resultList = new ArrayList<>();
-        if (examStudentOrgStatisticList == null || examStudentOrgStatisticList.isEmpty()) {
-            return resultList;
-        }
-
-        examStudentOrgStatisticList.forEach(info -> {
-            OrgCompleteProgressExcel excel = new OrgCompleteProgressExcel();
-            excel.setFinishedCount(info.getFinishedCount());
-            excel.setFinishedPercent(info.getFinishedPercent());
-            excel.setOrgCode(info.getOrgCode());
-            excel.setOrgName(info.getOrgName());
-            excel.setTotalCount(info.getTotalCount());
-            resultList.add(excel);
-        });
-
-        return resultList;
-    }
+		return resultList;
+	}
 
 }

+ 60 - 3
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examstudent/ExamStudentExcel.java

@@ -8,9 +8,10 @@
 package cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent;
 
 
-import cn.com.qmth.examcloud.support.excel.ExcelProperty;
-
 import java.io.Serializable;
+import java.util.Date;
+
+import cn.com.qmth.examcloud.support.excel.ExcelProperty;
 
 /**
  * 考生信息-Excel格式
@@ -50,8 +51,24 @@ public class ExamStudentExcel implements Serializable {
     @ExcelProperty(name = "完成状态", index = 10)
     private String finished;
     
-    @ExcelProperty(name = "场次号", width = 30, index = 11)
+    private Long examId;
+    
+    @ExcelProperty(name = "场次", width = 30, index = 11)
+    private String examStage;
+    
+    private Long examStageId;
+    
     private Integer examStageOrder;
+    
+    /**
+     * 场次开始时间
+     */
+    private Date stageStartTime;
+    
+    /**
+     * 场次结束时间
+     */
+    private Date stageEndTime;
 
     public String getStudentCode() {
         return studentCode;
@@ -140,6 +157,46 @@ public class ExamStudentExcel implements Serializable {
 	public void setExamStageOrder(Integer examStageOrder) {
 		this.examStageOrder = examStageOrder;
 	}
+
+	public Long getExamId() {
+		return examId;
+	}
+
+	public void setExamId(Long examId) {
+		this.examId = examId;
+	}
+
+	public String getExamStage() {
+		return examStage;
+	}
+
+	public void setExamStage(String examStage) {
+		this.examStage = examStage;
+	}
+
+	public Long getExamStageId() {
+		return examStageId;
+	}
+
+	public void setExamStageId(Long examStageId) {
+		this.examStageId = examStageId;
+	}
+
+	public Date getStageStartTime() {
+		return stageStartTime;
+	}
+
+	public void setStageStartTime(Date stageStartTime) {
+		this.stageStartTime = stageStartTime;
+	}
+
+	public Date getStageEndTime() {
+		return stageEndTime;
+	}
+
+	public void setStageEndTime(Date stageEndTime) {
+		this.stageEndTime = stageEndTime;
+	}
     
     
 

+ 30 - 2
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examstudent/ExamStudentInfo.java

@@ -7,11 +7,12 @@
 
 package cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent;
 
+import java.util.Date;
+import java.util.List;
+
 import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examrecord.ExamRecordFileAnswerInfo;
 
-import java.util.List;
-
 /**
  * 考生信息
  *
@@ -183,6 +184,16 @@ public class ExamStudentInfo implements JsonSerializable {
      * 场次号
      */
     private Integer examStageOrder;
+    
+    /**
+     * 场次开始时间
+     */
+    private Date startTime;
+    
+    /**
+     * 场次结束时间
+     */
+    private Date endTime;
 
     public Long getId() {
         return id;
@@ -440,4 +451,21 @@ public class ExamStudentInfo implements JsonSerializable {
         this.examStageOrder = examStageOrder;
     }
 
+	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;
+	}
+
+    
 }

+ 39 - 1
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/examstudent/ExamStudentUnFinishedExcel.java

@@ -7,6 +7,8 @@
 
 package cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent;
 
+import java.util.Date;
+
 import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
 import cn.com.qmth.examcloud.support.excel.ExcelProperty;
 
@@ -56,9 +58,21 @@ public class ExamStudentUnFinishedExcel implements JsonSerializable {
 
     @ExcelProperty(name = "年级", index = 13)
     private String grade;
-    @ExcelProperty(name = "场次号", index = 14)
+    @ExcelProperty(name = "场次", index = 14)
+    private String examStage;
+    
     private Integer examStageOrder;
     
+    /**
+     * 场次开始时间
+     */
+    private Date startTime;
+    
+    /**
+     * 场次结束时间
+     */
+    private Date endTime;
+    
     public String getStudentCode() {
         return studentCode;
     }
@@ -170,6 +184,30 @@ public class ExamStudentUnFinishedExcel implements JsonSerializable {
 	public void setExamStageOrder(Integer examStageOrder) {
 		this.examStageOrder = examStageOrder;
 	}
+
+	public String getExamStage() {
+		return examStage;
+	}
+
+	public void setExamStage(String examStage) {
+		this.examStage = examStage;
+	}
+
+	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;
+	}
     
     
 

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

@@ -7,6 +7,7 @@ package cn.com.qmth.examcloud.core.oe.admin.service.impl;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.util.DateUtil;
 import cn.com.qmth.examcloud.commons.util.JsonMapper;
 import cn.com.qmth.examcloud.core.oe.admin.base.utils.Check;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.ExportTaskStatus;
@@ -25,6 +26,7 @@ import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentQ
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.exporttask.ExportTaskInfo;
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
 import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamStageCacheBean;
 import cn.com.qmth.examcloud.support.excel.ExcelExportUtil;
 import cn.com.qmth.examcloud.support.filestorage.FileStorageUtil;
 import cn.com.qmth.examcloud.support.helper.IdentityNumberHelper;
@@ -103,6 +105,7 @@ public class AsyncExportServiceImpl implements AsyncExportService {
                 return;
             }
             examRecords = ExamStudentEntityConvert.ofExcel(examStudentInfoList);
+            fillStage(examRecords);
 
         } catch (Exception e) {
             LOG.error(e.getMessage(), e);
@@ -148,6 +151,23 @@ public class AsyncExportServiceImpl implements AsyncExportService {
             FileUtils.deleteQuietly(tempFile);
         }
     }
+    
+    private void fillStage(List<ExamStudentExcel> list) {
+    	if(CollectionUtils.isEmpty(list)) {
+    		return;
+    	}
+    	for(ExamStudentExcel info:list) {
+    		if(info.getExamStageId()!=null) {
+    			ExamStageCacheBean stage=CacheHelper.getExamStage(info.getExamId(), info.getExamStageId());
+    			info.setExamStageOrder(stage.getStageOrder());
+    			info.setStageStartTime(stage.getStartTime());
+    			info.setStageEndTime(stage.getEndTime());
+    			info.setExamStage(stage.getStageOrder() + "("
+						+ DateUtil.format(stage.getStartTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + "至"
+						+ DateUtil.format(stage.getEndTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + ")");
+    		}
+    	}
+    }
 
     @Override
     public void exportExamRecordDetails(String jsonParams, User user) {

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

@@ -9,6 +9,7 @@ package cn.com.qmth.examcloud.core.oe.admin.service.impl;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.util.DateUtil;
 import cn.com.qmth.examcloud.core.oe.admin.base.jpa.Searcher;
 import cn.com.qmth.examcloud.core.oe.admin.base.jpa.SpecUtils;
 import cn.com.qmth.examcloud.core.oe.admin.base.jpa.SqlWrapper;
@@ -21,14 +22,18 @@ import cn.com.qmth.examcloud.core.oe.admin.service.*;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit.*;
 import cn.com.qmth.examcloud.marking.api.MarkWorkCloudService;
 import cn.com.qmth.examcloud.marking.api.request.AppendMarkWorkPaperReq;
+import cn.com.qmth.examcloud.support.cache.CacheHelper;
 import cn.com.qmth.examcloud.support.cache.bean.CourseCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamStageCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.OrgCacheBean;
 import cn.com.qmth.examcloud.support.enums.FaceBiopsyScheme;
 import cn.com.qmth.examcloud.support.helper.ExamCacheTransferHelper;
 import cn.com.qmth.examcloud.support.helper.FaceBiopsyHelper;
 import cn.com.qmth.examcloud.web.helpers.GlobalHelper;
 import com.google.common.collect.Lists;
+
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.hibernate.query.NativeQuery;
 import org.hibernate.transform.Transformers;
@@ -186,6 +191,7 @@ public class ExamAuditServiceImpl implements ExamAuditService {
             examAuditInfo.setObjectiveScore(String.valueOf(examScore.getObjectiveScore()));
 
         }
+        fillStage(list);
         return new PageImpl<ExamAuditInfo>(list, pageable, totalSize);
     }
 
@@ -230,8 +236,26 @@ public class ExamAuditServiceImpl implements ExamAuditService {
             examAuditInfo.setObjectiveScore(String.valueOf(examScore.getObjectiveScore()));
 
         }
+        fillStage(list);
         return list;
     }
+    
+    private void fillStage(List<ExamAuditInfo> list) {
+    	if(CollectionUtils.isEmpty(list)) {
+    		return;
+    	}
+    	for(ExamAuditInfo info:list) {
+    		if(info.getExamStageId()!=null) {
+    			ExamStageCacheBean stage=CacheHelper.getExamStage(info.getExamId(), info.getExamStageId());
+    			info.setExamStageOrder(stage.getStageOrder());
+    			info.setStartTime(stage.getStartTime());
+    			info.setEndTime(stage.getEndTime());
+    			info.setExamStage(stage.getStageOrder() + "("
+						+ DateUtil.format(stage.getStartTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + "至"
+						+ DateUtil.format(stage.getEndTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + ")");
+    		}
+    	}
+    }
 
 
     private SqlWrapper getSqlWrapper(ExamAuditQuery query) {

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

@@ -9,6 +9,7 @@ package cn.com.qmth.examcloud.core.oe.admin.service.impl;
 
 import cn.com.qmth.examcloud.api.commons.enums.ExamType;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.util.DateUtil;
 import cn.com.qmth.examcloud.core.basic.api.StudentCloudService;
 import cn.com.qmth.examcloud.core.basic.api.bean.StudentBean;
 import cn.com.qmth.examcloud.core.basic.api.request.GetStudentListByIdsReq;
@@ -36,6 +37,7 @@ import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentI
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
 import cn.com.qmth.examcloud.support.cache.bean.CourseCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamStageCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.OrgCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.StudentCacheBean;
 import cn.com.qmth.examcloud.support.enums.ExamProperties;
@@ -148,7 +150,7 @@ public class ExamRecordServiceImpl implements ExamRecordService {
             "record_data.paper_struct_id paperStructId," +
             "record_data.info_collector infoCollector," +
             "record_data.switch_screen_count switchScreenCount," +
-            "record_data.exam_stage_order examStageOrder," +
+            "record_data.exam_stage_id examStageId," +
             "audit.audit_user_name audit_user_name," +
             "GROUP_CONCAT(DISTINCT process.source_ip) ip," +
             "eoes.objective_score objectiveTotalScore," +
@@ -206,7 +208,7 @@ public class ExamRecordServiceImpl implements ExamRecordService {
             "record_data.paper_struct_id paper_struct_id," +
             "record_data.info_collector info_collector," +
             "record_data.switch_screen_count switchScreenCount," +
-            "record_data.exam_stage_order examStageOrder," +
+            "record_data.exam_stage_id examStageId," +
             "audit.audit_user_name audit_user_name," +
             "GROUP_CONCAT(DISTINCT process.source_ip) ip" +
             " from ec_oe_exam_record_data record_data " +
@@ -366,9 +368,26 @@ public class ExamRecordServiceImpl implements ExamRecordService {
         long total = countExamRecordDetailListForPage(query);
         Pageable pageable = PageRequest.of(query.getPageNo() - 1, query.getPageSize());
         Page<ExamRecordDataEntity> page = new PageImpl<ExamRecordDataEntity>(examRecordDataList, pageable, total);
-        return examRecordEntityConvert.of(page);
+        Page<ExamRecordInfo> ret=examRecordEntityConvert.of(page);
+        fillStage(ret.getContent());
+        return ret;
+    }
+    private void fillStage(List<ExamRecordInfo> list) {
+    	if(CollectionUtils.isEmpty(list)) {
+    		return;
+    	}
+    	for(ExamRecordInfo info:list) {
+    		if(info.getExamStageId()!=null) {
+    			ExamStageCacheBean stage=CacheHelper.getExamStage(info.getExamId(), info.getExamStageId());
+    			info.setExamStageOrder(stage.getStageOrder());
+    			info.setStageStartTime(stage.getStartTime());
+    			info.setStageEndTime(stage.getEndTime());
+    			info.setExamStage(stage.getStageOrder() + "("
+						+ DateUtil.format(stage.getStartTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + "至"
+						+ DateUtil.format(stage.getEndTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + ")");
+    		}
+    	}
     }
-
     private ExamRecordDataEntity getExamRecordDataEntityByResultSet(ResultSet rs) throws SQLException {
         ExamRecordDataEntity examRecordData = new ExamRecordDataEntity();
         examRecordData.setId(rs.getLong("id"));
@@ -395,8 +414,8 @@ public class ExamRecordServiceImpl implements ExamRecordService {
         examRecordData.setIp(rs.getString("ip"));
         examRecordData.setAuditUserName(rs.getString("audit_user_name"));
         examRecordData.setSwitchScreenCount(rs.getInt("switchScreenCount"));
-        if(rs.getString("examStageOrder")!=null) {
-        	examRecordData.setExamStageOrder(rs.getInt("examStageOrder"));
+        if(rs.getString("examStageId")!=null) {
+        	examRecordData.setExamStageId(rs.getLong("examStageId"));
         }
 
         return examRecordData;
@@ -719,6 +738,7 @@ public class ExamRecordServiceImpl implements ExamRecordService {
         if (ExamType.ONLINE.name().equals(examType) || ExamType.ONLINE_HOMEWORK.name().equals(examType)) {
             setVirtualCameraNames(examRecordDataList);
         }
+        fillStage(examRecordDataList);
         return examRecordDataList;
     }
 
@@ -916,7 +936,6 @@ public class ExamRecordServiceImpl implements ExamRecordService {
 
         RowMapper<ExamRecordInfo> rowMapper = new BeanPropertyRowMapper<ExamRecordInfo>(ExamRecordInfo.class);
         List<ExamRecordInfo> ret = jdbcTemplate.query(sqlBuilder.toString(), rowMapper);
-
         return ret;
     }
 

+ 31 - 6
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamScoreServiceImpl.java

@@ -7,6 +7,7 @@
 
 package cn.com.qmth.examcloud.core.oe.admin.service.impl;
 
+import cn.com.qmth.examcloud.commons.util.DateUtil;
 import cn.com.qmth.examcloud.core.oe.admin.base.jpa.SpecUtils;
 import cn.com.qmth.examcloud.core.oe.admin.base.utils.Check;
 import cn.com.qmth.examcloud.core.oe.admin.base.utils.CommonUtil;
@@ -24,12 +25,16 @@ import cn.com.qmth.examcloud.core.oe.admin.service.bean.examscore.ExamScoreInfo;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examscore.ExamScoreQuery;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examscore.ObjectiveScoreInfo;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentInfo;
+import cn.com.qmth.examcloud.support.cache.CacheHelper;
 import cn.com.qmth.examcloud.support.cache.bean.CourseCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamStageCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.OrgCacheBean;
 import cn.com.qmth.examcloud.support.enums.ExamProperties;
 import cn.com.qmth.examcloud.support.helper.ExamCacheTransferHelper;
 import com.google.common.collect.Lists;
+
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -101,8 +106,26 @@ public class ExamScoreServiceImpl implements ExamScoreService {
             ExamSettingsCacheBean examBean = ExamCacheTransferHelper.getDefaultCachedExam(query.getExamId());
             examScoreList.add(of(examStudent, examBean, markingType));
         });
+        fillStage(examScoreList);
         return new PageImpl<ExamScoreInfo>(examScoreList, pageable, page.getTotalElements());
     }
+    
+    private void fillStage(List<ExamScoreInfo> list) {
+    	if(CollectionUtils.isEmpty(list)) {
+    		return;
+    	}
+    	for(ExamScoreInfo info:list) {
+    		if(info.getExamStageId()!=null) {
+    			ExamStageCacheBean stage=CacheHelper.getExamStage(info.getExamId(), info.getExamStageId());
+    			info.setExamStageOrder(stage.getStageOrder());
+    			info.setStageStartTime(stage.getStartTime());
+    			info.setStageEndTime(stage.getEndTime());
+    			info.setExamStage(stage.getStageOrder() + "("
+						+ DateUtil.format(stage.getStartTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + "至"
+						+ DateUtil.format(stage.getEndTime(), DateUtil.DatePatterns.CHINA_DEFAULT) + ")");
+    		}
+    	}
+    }
 
     /**
      * 封装成绩统计结果
@@ -128,7 +151,7 @@ public class ExamScoreServiceImpl implements ExamScoreService {
         examScore.setInfoCollector(examStudent.getInfoCollector());
         examScore.setSpecialtyName(examStudent.getSpecialtyName());
         examScore.setGrade(examStudent.getGrade());
-        examScore.setExamStageOrder(examStudent.getExamStageOrder());
+        examScore.setExamStageId(examStudent.getExamStageId());
         Long examTimes = examBean.getExamTimes();
         if (examTimes != null) {
             Integer extraExamNum = examStudent.getExtraNum() == null ? 0 : examStudent.getExtraNum();
@@ -173,6 +196,7 @@ public class ExamScoreServiceImpl implements ExamScoreService {
 
                 examScoreInfoList.add(convertToExamScoreInfo(examStudent, courseBean, orgBean, markingType));
             }
+            fillStage(examScoreInfoList);
             return examScoreInfoList;
         }
     }
@@ -182,7 +206,7 @@ public class ExamScoreServiceImpl implements ExamScoreService {
         StringBuffer sql = new StringBuffer();
         sql.append("select id,exam_student_id,exam_id,course_id,course_code,course_level,finished,student_id,student_code,student_name,identity_number"
                 + ",info_collector,root_org_id,org_id,paper_type,used_num,extra_num"
-                + ",specialty_code,specialty_name,grade,exam_stage_order from ec_oe_exam_student where 1=1 ");
+                + ",specialty_code,specialty_name,grade,exam_stage_id from ec_oe_exam_student where 1=1 ");
         if (query.getOrgId() != null) {
             sql.append(" and org_id=" + query.getOrgId());
         }
@@ -252,7 +276,7 @@ public class ExamScoreServiceImpl implements ExamScoreService {
         StringBuffer sql = new StringBuffer();
         sql.append("select id,exam_student_id,exam_id,course_id,course_code,course_level,finished,student_id,student_code,student_name,identity_number"
                 + ",info_collector,root_org_id,org_id,paper_type,used_num,extra_num"
-                + ",specialty_code,specialty_name,grade,exam_stage_order from ec_oe_exam_student where 1=1 ");
+                + ",specialty_code,specialty_name,grade,exam_stage_id from ec_oe_exam_student where 1=1 ");
         if (query.getOrgId() != null) {
             sql.append(" and org_id=" + query.getOrgId());
         }
@@ -304,6 +328,7 @@ public class ExamScoreServiceImpl implements ExamScoreService {
 
             examScoreInfoList.add(convertToExamScoreInfo(examStudent, courseBean, orgBean, markingType));
         }
+        fillStage(examScoreInfoList);
         return examScoreInfoList;
     }
 
@@ -315,7 +340,7 @@ public class ExamScoreServiceImpl implements ExamScoreService {
         ExamSettingsCacheBean examBean = ExamCacheTransferHelper.getCachedExam(examStudent.getExamId(),
                 examStudent.getStudentId(), examStudent.getExamStageId());
         ExamScoreInfo examScore = new ExamScoreInfo();
-        examScore.setExamStageOrder(examStudent.getExamStageOrder());
+        examScore.setExamStageId(examStudent.getExamStageId());
         examScore.setExamId(examStudent.getExamId());
         examScore.setExamName(examBean.getName());
         examScore.setStudentId(examStudent.getStudentId());
@@ -473,8 +498,8 @@ public class ExamScoreServiceImpl implements ExamScoreService {
         examStudentEntity.setSpecialtyCode(rs.getString("specialty_code"));
         examStudentEntity.setSpecialtyName(rs.getString("specialty_name"));
         examStudentEntity.setGrade(rs.getString("grade"));
-        if(rs.getString("exam_stage_order")!=null) {
-        	examStudentEntity.setExamStageOrder(rs.getInt("exam_stage_order"));
+        if(rs.getString("exam_stage_id")!=null) {
+        	examStudentEntity.setExamStageId(rs.getLong("exam_stage_id"));
         }
         return examStudentEntity;
     }

+ 77 - 36
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamStudentServiceImpl.java

@@ -7,6 +7,44 @@
 
 package cn.com.qmth.examcloud.core.oe.admin.service.impl;
 
+import static cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentMapper.statisticFinishedColumns;
+import static cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentMapper.statisticOrgColumns;
+
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.query.NativeQuery;
+import org.hibernate.transform.Transformers;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Pageable;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+
 import cn.com.qmth.examcloud.api.commons.enums.ExamSpecialSettingsType;
 import cn.com.qmth.examcloud.api.commons.enums.ExamType;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
@@ -30,10 +68,20 @@ import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamStudentEntity;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.CourseLevel;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.ExamRecordStatus;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.FinishStatus;
-import cn.com.qmth.examcloud.core.oe.admin.service.*;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordService;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamStudentFinalScoreService;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamStudentService;
+import cn.com.qmth.examcloud.core.oe.admin.service.GainBaseDataService;
+import cn.com.qmth.examcloud.core.oe.admin.service.LocalCacheService;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.OnHandExamInfo;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examrecord.ExamRecordFileAnswerInfo;
-import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.*;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.CourseProgressInfo;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentEntityConvert;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentFinishedStatistic;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentInfo;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentOrgStatistic;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentPartInfo;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentQuery;
 import cn.com.qmth.examcloud.core.oe.admin.service.cache.ExamStudentCache;
 import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
 import cn.com.qmth.examcloud.examwork.api.ExamStudentCloudService;
@@ -44,7 +92,12 @@ import cn.com.qmth.examcloud.examwork.api.request.GetOngoingExamListReq;
 import cn.com.qmth.examcloud.examwork.api.response.GetExamStudentResp;
 import cn.com.qmth.examcloud.examwork.api.response.GetOngoingExamListResp;
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
-import cn.com.qmth.examcloud.support.cache.bean.*;
+import cn.com.qmth.examcloud.support.cache.bean.CourseCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamPropertyCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamStageCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.OrgCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.StudentCacheBean;
 import cn.com.qmth.examcloud.support.enums.ExamProperties;
 import cn.com.qmth.examcloud.support.examing.ExamBoss;
 import cn.com.qmth.examcloud.support.filestorage.FileStorageUtil;
@@ -52,34 +105,6 @@ import cn.com.qmth.examcloud.support.helper.ExamCacheTransferHelper;
 import cn.com.qmth.examcloud.support.helper.FaceBiopsyHelper;
 import cn.com.qmth.examcloud.support.redis.RedisKeyHelper;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
-import com.alibaba.fastjson.JSONObject;
-import com.google.common.collect.Lists;
-import org.apache.commons.lang3.StringUtils;
-import org.hibernate.query.NativeQuery;
-import org.hibernate.transform.Transformers;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageImpl;
-import org.springframework.data.domain.Pageable;
-import org.springframework.jdbc.core.BeanPropertyRowMapper;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.persistence.EntityManager;
-import javax.persistence.Query;
-import java.math.BigDecimal;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.text.DecimalFormat;
-import java.util.*;
-import java.util.stream.Collectors;
-
-import static cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentMapper.statisticFinishedColumns;
-import static cn.com.qmth.examcloud.core.oe.admin.service.bean.examstudent.ExamStudentMapper.statisticOrgColumns;
 
 /**
  * 考生信息接口
@@ -246,7 +271,7 @@ public class ExamStudentServiceImpl implements ExamStudentService {
 
         sql.append(",student_id,student_code,student_name,identity_number"
                 + ",info_collector,root_org_id,org_id,paper_type,used_num,extra_num"
-                + ",specialty_code,specialty_name,grade,t1.exam_stage_order from ec_oe_exam_student t1 where 1=1 ");
+                + ",specialty_code,specialty_name,grade,t1.exam_stage_id from ec_oe_exam_student t1 where 1=1 ");
         sql.append(selectExamStudentConfitionSql(query, examBean.getExamType()));
         sql.append(" order by id desc");
         int currentNum = (query.getPageNo() - 1) * query.getPageSize();
@@ -281,8 +306,23 @@ public class ExamStudentServiceImpl implements ExamStudentService {
         cahcheMap.clear();
         Pageable pageable = SpecUtils.buildPageable(query.getPageNo(), query.getPageSize());
         long totalSize = countExamStudent(query, examBean.getExamType());
+        fillStage(examStudentInfoList);
         return new PageImpl<>(examStudentInfoList, pageable, totalSize);
     }
+    
+    private void fillStage(List<ExamStudentInfo> list) {
+    	if(CollectionUtils.isEmpty(list)) {
+    		return;
+    	}
+    	for(ExamStudentInfo info:list) {
+    		if(info.getExamStageId()!=null) {
+    			ExamStageCacheBean stage=CacheHelper.getExamStage(info.getExamId(), info.getExamStageId());
+    			info.setExamStageOrder(stage.getStageOrder());
+    			info.setStartTime(stage.getStartTime());
+    			info.setEndTime(stage.getEndTime());
+    		}
+    	}
+    }
 
     private long countExamStudent(ExamStudentQuery query, String examType) {
         //查询条件
@@ -398,7 +438,7 @@ public class ExamStudentServiceImpl implements ExamStudentService {
 
         sql.append(",student_id,student_code,student_name,identity_number"
                 + ",info_collector,root_org_id,org_id,paper_type,used_num,extra_num"
-                + ",specialty_code,specialty_name,grade,exam_stage_order from ec_oe_exam_student t1 where 1=1 ");
+                + ",specialty_code,specialty_name,grade,exam_stage_id from ec_oe_exam_student t1 where 1=1 ");
         sql.append(selectExamStudentConfitionSql(query, examBean.getExamType()));
         int currentNum = (pageNo - 1) * pageSize;
         sql.append(" order by id limit " + currentNum + "," + pageSize);
@@ -429,7 +469,7 @@ public class ExamStudentServiceImpl implements ExamStudentService {
 
         sql.append(",student_id,student_code,student_name,identity_number"
                 + ",info_collector,root_org_id,org_id,paper_type,used_num,extra_num"
-                + ",specialty_code,specialty_name,grade,t1.exam_stage_order stageOrder from ec_oe_exam_student t1 where 1=1 ");
+                + ",specialty_code,specialty_name,grade,t1.exam_stage_id from ec_oe_exam_student t1 where 1=1 ");
         sql.append(selectExamStudentConfitionSql(query, examBean.getExamType()));
         sql.append(" order by id desc");
 
@@ -460,6 +500,7 @@ public class ExamStudentServiceImpl implements ExamStudentService {
             }
         }
         cahcheMap.clear();
+        fillStage(examStudentInfoList);
         return examStudentInfoList;
     }
 
@@ -618,8 +659,8 @@ public class ExamStudentServiceImpl implements ExamStudentService {
         examStudentEntity.setSpecialtyCode(rs.getString("specialty_code"));
         examStudentEntity.setSpecialtyName(rs.getString("specialty_name"));
         examStudentEntity.setGrade(rs.getString("grade"));
-        if(rs.getString("exam_stage_order")!=null) {
-        	examStudentEntity.setExamStageOrder(rs.getInt("exam_stage_order"));
+        if(rs.getString("exam_stage_id")!=null) {
+        	examStudentEntity.setExamStageId(rs.getLong("exam_stage_id"));
         }
         
         return examStudentEntity;