wangwei 6 лет назад
Родитель
Сommit
6cbd73373e

+ 78 - 62
examcloud-core-examwork-api-provider/src/main/java/cn/com/qmth/examcloud/core/examwork/api/controller/ExamStudentController.java

@@ -1,12 +1,12 @@
 package cn.com.qmth.examcloud.core.examwork.api.controller;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.persistence.criteria.Predicate;
-import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.commons.lang3.StringUtils;
@@ -25,25 +25,35 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.google.common.collect.Lists;
 
+import cn.com.qmth.examcloud.commons.base.exception.StatusException;
+import cn.com.qmth.examcloud.commons.base.util.PathUtil;
 import cn.com.qmth.examcloud.commons.web.helpers.page.PageInfo;
 import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
+import cn.com.qmth.examcloud.core.basic.api.CourseCloudService;
+import cn.com.qmth.examcloud.core.basic.api.OrgCloudService;
 import cn.com.qmth.examcloud.core.basic.api.StudentCloudService;
+import cn.com.qmth.examcloud.core.basic.api.bean.CourseBean;
+import cn.com.qmth.examcloud.core.basic.api.bean.OrgBean;
+import cn.com.qmth.examcloud.core.basic.api.bean.StudentBean;
+import cn.com.qmth.examcloud.core.basic.api.request.GetCourseReq;
+import cn.com.qmth.examcloud.core.basic.api.request.GetOrgReq;
+import cn.com.qmth.examcloud.core.basic.api.request.GetStudentReq;
 import cn.com.qmth.examcloud.core.basic.api.request.InsertOrUpdateStudentReq;
+import cn.com.qmth.examcloud.core.basic.api.response.GetCourseResp;
+import cn.com.qmth.examcloud.core.basic.api.response.GetOrgResp;
+import cn.com.qmth.examcloud.core.basic.api.response.GetStudentResp;
 import cn.com.qmth.examcloud.core.basic.api.response.InsertOrUpdateStudentResp;
 import cn.com.qmth.examcloud.core.examwork.api.controller.bean.ExamStudentDomain;
-import cn.com.qmth.examcloud.core.examwork.base.util.ExportUtils;
 import cn.com.qmth.examcloud.core.examwork.dao.ExamRepo;
 import cn.com.qmth.examcloud.core.examwork.dao.ExamStudentRepo;
-import cn.com.qmth.examcloud.core.examwork.dao.bean.ExamStudentAssembler;
-import cn.com.qmth.examcloud.core.examwork.dao.bean.ExamStudentDTO;
+import cn.com.qmth.examcloud.core.examwork.dao.entity.Exam;
 import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamStudent;
+import cn.com.qmth.examcloud.core.examwork.service.ExamStudentService;
 import cn.com.qmth.examcloud.core.examwork.service.bean.ExamStudentInfo;
-import cn.com.qmth.examcloud.core.examwork.service.impl.ExamStudentServiceImpl;
 import io.swagger.annotations.ApiOperation;
 
 /**
@@ -58,10 +68,7 @@ public class ExamStudentController extends ControllerSupport {
 	ExamStudentRepo examStudentRepo;
 
 	@Autowired
-	ExamStudentServiceImpl examStudentService;
-
-	@Autowired
-	ExamStudentAssembler examStudentAssembler;
+	ExamStudentService examStudentService;
 
 	@Autowired
 	ExamRepo examRepo;
@@ -69,21 +76,24 @@ public class ExamStudentController extends ControllerSupport {
 	@Autowired
 	StudentCloudService studentCloudService;
 
-	@GetMapping("/query")
-	public List<ExamStudent> find(
-			@RequestParam(value = "student_id", required = false) Long studentId) {
-
-		return examStudentRepo.findAll((root, query, cb) -> {
+	@Autowired
+	CourseCloudService courseCloudService;
 
-			List<Predicate> predicates = new ArrayList<Predicate>();
+	@Autowired
+	OrgCloudService orgCloudService;
 
-			if (studentId != null) {
-				predicates.add(cb.equal(root.get("studentId"), studentId));
-			}
+	/**
+	 * 方法注释
+	 *
+	 * @author WANGWEI
+	 * @param studentId
+	 * @return
+	 */
+	@ApiOperation(value = "查询学生的所有考试")
+	@GetMapping("/byStudentId/{studentId}")
+	public List<ExamStudent> getExamStudentListByStudentId(@PathVariable Long studentId) {
 
-			Predicate[] pre = new Predicate[predicates.size()];
-			return query.where(predicates.toArray(pre)).getRestriction();
-		});
+		return examStudentRepo.findByStudentId(studentId);
 	}
 
 	/**
@@ -109,7 +119,7 @@ public class ExamStudentController extends ControllerSupport {
 			}
 
 			if (null != examCriteria.getExamId()) {
-				predicates.add(cb.equal(root.get("exam").get("id"), examCriteria.getExamId()));
+				predicates.add(cb.equal(root.get("examId"), examCriteria.getExamId()));
 			}
 			if (StringUtils.isNotEmpty(examCriteria.getStudentName())) {
 				predicates.add(cb.like(root.get("name"),
@@ -145,9 +155,6 @@ public class ExamStudentController extends ControllerSupport {
 				predicates.add(cb.like(root.get("infoCollector"),
 						toSqlSearchPattern(examCriteria.getInfoCollector())));
 			}
-			if (examCriteria.getFinished() != null) {
-				predicates.add(cb.equal(root.get("finished"), examCriteria.getFinished()));
-			}
 
 			return cb.and(predicates.toArray(new Predicate[predicates.size()]));
 		};
@@ -160,37 +167,60 @@ public class ExamStudentController extends ControllerSupport {
 		List<ExamStudentDomain> ret = Lists.newArrayList();
 
 		for (ExamStudent cur : examStudents) {
+			Exam exam = examRepo.findOne(cur.getExamId());
+			GetCourseReq req = new GetCourseReq();
+			req.setId(cur.getCourseId());
+			GetCourseResp getCourseResp = courseCloudService.getCourse(req);
+			CourseBean courseBean = getCourseResp.getCourseBean();
+			GetOrgReq getOrgReq = new GetOrgReq();
+			getOrgReq.setOrgId(cur.getOrgId());
+			GetOrgResp getOrgResp = orgCloudService.getOrg(getOrgReq);
+			OrgBean org = getOrgResp.getOrg();
+
+			GetStudentReq getStudentReq = new GetStudentReq();
+			GetStudentResp getStudentResp = studentCloudService.getStudent(getStudentReq);
+			StudentBean studentBean = getStudentResp.getStudentInfo();
+
 			ExamStudentDomain bean = new ExamStudentDomain();
 			bean.setId(cur.getId());
-			bean.setExamId(cur.getExam().getId());
-			bean.setExamName(cur.getExam().getName());
+			bean.setExamId(exam.getId());
+			bean.setExamName(exam.getName());
 			bean.setStudentId(cur.getStudentId());
 			bean.setStudentName(cur.getName());
 			bean.setStudentCode(cur.getStudentCode());
 			bean.setIdentityNumber(cur.getIdentityNumber());
-			bean.setCourseCode(cur.getCourseCode());
-			bean.setCourseName(cur.getCourseName());
+			bean.setCourseCode(courseBean.getCode());
+			bean.setCourseName(courseBean.getName());
 			bean.setInfoCollector(cur.getInfoCollector());
 			bean.setOrgId(cur.getOrgId());
-			bean.setOrgCode(cur.getOrgCode());
-			bean.setOrgName(cur.getOrgName());
+			bean.setOrgCode(org.getCode());
+			bean.setOrgName(org.getName());
 			bean.setPaperType(cur.getPaperType());
-			bean.setPhone(cur.getPhone());
+			bean.setPhone(studentBean.getPhoneNumber());
 			bean.setGrade(cur.getGrade());
 			bean.setSpecialtyName(cur.getSpecialtyName());
 			bean.setExamSite(cur.getExamSite());
-			bean.setFinished(cur.getFinished());
-			bean.setExamType(cur.getExam().getExamType().name());
+			bean.setExamType(exam.getExamType().name());
 			bean.setUpdateTime(cur.getUpdateTime());
 			ret.add(bean);
 		}
 		return new PageInfo<ExamStudentDomain>(examStudents, ret);
 	}
 
+	/**
+	 * 方法注释
+	 *
+	 * @author WANGWEI
+	 * @param id
+	 * @return
+	 */
 	@ApiOperation(value = "按ID查询考试学生", notes = "ID查询")
-	@GetMapping("/{id}")
+	@GetMapping("{id}")
 	public ExamStudent getExamStudentById(@PathVariable Long id) {
-		ExamStudent es = examStudentService.findById(id);
+		ExamStudent es = examStudentRepo.findOne(id);
+		if (null == es) {
+			throw new StatusException("E-520001", "考生不存在");
+		}
 		return es;
 	}
 
@@ -198,15 +228,13 @@ public class ExamStudentController extends ControllerSupport {
 	 * 方法注释
 	 *
 	 * @author WANGWEI
-	 * @param request
 	 * @param examStudent
 	 * @return
 	 */
 	@Transactional
 	@ApiOperation(value = "新增考试学生", notes = "新增")
 	@PostMapping()
-	public ExamStudentDomain addExamStudent(HttpServletRequest request,
-			@RequestBody ExamStudentDomain examStudent) {
+	public ExamStudentDomain addExamStudent(@RequestBody ExamStudentDomain examStudent) {
 		trim(examStudent);
 		Long rootOrgId = getRootOrgId();
 		examStudent.setRootOrgId(rootOrgId);
@@ -296,10 +324,10 @@ public class ExamStudentController extends ControllerSupport {
 	@ApiOperation(value = "按ID删除考试学生", notes = "删除")
 	@DeleteMapping("/{ids}")
 	public List<Long> deleteExamStudent(@PathVariable String ids) {
-		List<Long> examStuIds = Stream.of(ids.split(",")).map(s -> Long.parseLong(s.trim()))
+		List<Long> idList = Stream.of(ids.split(",")).map(s -> Long.parseLong(s.trim()))
 				.collect(Collectors.toList());
-		examStudentService.deleteExamStudent(examStuIds);
-		return examStuIds;
+		examStudentService.deleteExamStudentsByStudentIds(idList);
+		return idList;
 	}
 
 	/**
@@ -313,34 +341,22 @@ public class ExamStudentController extends ControllerSupport {
 	@Transactional
 	@DeleteMapping("/exam/{examId}")
 	public Long deleteExamStudents(@PathVariable Long examId) {
-		examStudentService.deleteExamStudents(examId);
+		examStudentService.deleteExamStudentsByExamId(examId);
 		return examId;
 	}
 
 	@ApiOperation(value = "下载导入模板", notes = "下载导入模板")
-	@GetMapping("/download")
-	public void importFileTemplate(HttpServletResponse response) {
-		List<ExamStudentDTO> list = new ArrayList<ExamStudentDTO>();
-		ExportUtils.exportEXCEL("考生导入模板", ExamStudentDTO.class, list, response);
-	}
-
-	@ApiOperation(value = "导出考试学生带条件", notes = "导出")
-	@GetMapping("/export")
-	public void exportExamStudent(@ModelAttribute ExamStudentDTO examCriteria,
-			HttpServletResponse response) {
-		List<ExamStudentDTO> list = new ArrayList<ExamStudentDTO>();
-		examStudentService.getAllExamStudent(examCriteria).forEach(c -> {
-			list.add(examStudentAssembler.toDTO(c));
-		});
-		ExportUtils.exportEXCEL("课程列表", ExamStudentDTO.class, list, response);
-
+	@GetMapping("/downloadTemplate")
+	public void downloadTemplate(HttpServletResponse response) {
+		String resoucePath = PathUtil.getResoucePath("studentImportTemplate.xlsx");
+		exportFile("考生导入模板.xlsx", new File(resoucePath));
 	}
 
 	@ApiOperation(value = "复制考试学生", notes = "复制")
 	@Transactional
 	@PostMapping("/copy/{sourceExamId}/{targetExamId}")
-	public void copyExamStudent(@PathVariable Long sourceExamId, @PathVariable Long targetExamId) {
-		examStudentService.copyExamStudent(sourceExamId, targetExamId);
+	public void copyExamStudents(@PathVariable Long sourceExamId, @PathVariable Long targetExamId) {
+		// 任务模块处理
 	}
 
 }

+ 1 - 11
examcloud-core-examwork-api-provider/src/main/java/cn/com/qmth/examcloud/core/examwork/api/controller/bean/ExamStudentDomain.java

@@ -29,8 +29,6 @@ public class ExamStudentDomain implements JsonSerializable {
 
 	private String examName;
 
-	private Boolean finished;
-
 	private Long rootOrgId;
 
 	private Long orgId;
@@ -78,7 +76,7 @@ public class ExamStudentDomain implements JsonSerializable {
 	private String examType;
 
 	private Date updateTime;
-	
+
 	public Long getId() {
 		return id;
 	}
@@ -263,14 +261,6 @@ public class ExamStudentDomain implements JsonSerializable {
 		this.grade = grade;
 	}
 
-	public Boolean getFinished() {
-		return finished;
-	}
-
-	public void setFinished(Boolean finished) {
-		this.finished = finished;
-	}
-
 	public String getExamType() {
 		return examType;
 	}

+ 3 - 7
examcloud-core-examwork-dao/src/main/java/cn/com/qmth/examcloud/core/examwork/dao/ExamStudentRepo.java

@@ -12,7 +12,6 @@ import org.springframework.data.repository.query.Param;
 import org.springframework.data.repository.query.QueryByExampleExecutor;
 import org.springframework.transaction.annotation.Transactional;
 
-import cn.com.qmth.examcloud.core.examwork.dao.entity.Exam;
 import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamStudent;
 
 public interface ExamStudentRepo
@@ -24,6 +23,8 @@ public interface ExamStudentRepo
 
 	List<ExamStudent> findByExamId(Long examId);
 
+	List<ExamStudent> findByStudentId(Long examId);
+
 	@Query("select s from ExamStudent s where s.exam.id=?1 group by s.courseCode order by s.courseCode")
 	List<ExamStudent> findDistinctCourseCode(Long examId);
 
@@ -61,17 +62,13 @@ public interface ExamStudentRepo
 
 	List<ExamStudent> findByOrgId(Long orgId);
 
-	@Transactional
 	@Modifying
 	@Query("delete from ExamStudent s where s.exam.id = ?1")
 	void deleteByExamId(Long examId);
 
-	int countByExamIdAndFinished(Long examId, Boolean finished);
-
 	@Query(nativeQuery = true, value = "select org_id, org_name, finished, count(id) from ecs_exam_student  where exam_id = :examId group by org_id, org_name, finished")
 	List<Object[]> countByCampusAndFinished(@Param("examId") Long examId);
 
-	@Transactional
 	@Modifying
 	@Query("update ExamStudent e set e.finished = ?2 where e.id = ?1")
 	void updateForFinished(Long id, Boolean finished);
@@ -79,6 +76,5 @@ public interface ExamStudentRepo
 	@Query(value = "SELECT * FROM ecs_exam_student t WHERE t.exam_id = ?1 order by id desc limit ?2,?3 ", nativeQuery = true)
 	public List<ExamStudent> findByLimit(Long examId, Integer startLimit, Integer endLimit);
 
-	List<ExamStudent> findByExamAndStudentIdAndCourseCodeOrderByUpdateTimeDesc(Exam exam, Long studentId,
-			String courseCode);
+	ExamStudent findByExamIdAndStudentIdAndCourseId(Long examId, Long studentId, Long courseId);
 }

+ 0 - 75
examcloud-core-examwork-dao/src/main/java/cn/com/qmth/examcloud/core/examwork/dao/bean/ExamStudentAssembler.java

@@ -1,75 +0,0 @@
-package cn.com.qmth.examcloud.core.examwork.dao.bean;
-
-import org.springframework.stereotype.Component;
-
-import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamStudent;
-
-@Component
-public class ExamStudentAssembler {
-	
-	public ExamStudentDTO toDTO(ExamStudent examStudent){
-		ExamStudentDTO dto = null;
-		if(examStudent != null){
-			dto = new ExamStudentDTO();
-			dto.setCourseCode(examStudent.getCourseCode());
-			dto.setCourseLevel(examStudent.getCourseLevel());
-			dto.setCourseName(examStudent.getCourseName());
-			dto.setDegree(examStudent.getDegree());
-			dto.setExam(examStudent.getExam());
-			dto.setExamNumber(examStudent.getExamNumber());
-			dto.setExamSite(examStudent.getExamSite());
-			dto.setFinished(examStudent.getFinished());
-			dto.setGrade(examStudent.getGrade());
-			dto.setGraduated(examStudent.getGraduated());
-			dto.setId(examStudent.getId());
-			dto.setIdentityNumber(examStudent.getIdentityNumber());
-			dto.setName(examStudent.getName());
-			dto.setOrgCode(examStudent.getOrgCode());
-			dto.setOrgName(examStudent.getOrgName());
-			dto.setOrgId(examStudent.getOrgId());
-			dto.setRemark(examStudent.getRemark());
-			dto.setPaperType(examStudent.getPaperType());
-			dto.setRepair(examStudent.getRepair());
-			dto.setRootOrgId(examStudent.getRootOrgId());
-			dto.setSpecialtyCode(examStudent.getSpecialtyCode());
-			dto.setSpecialtyName(examStudent.getSpecialtyName());
-			dto.setStudentCode(examStudent.getStudentCode());
-		}
-		return dto;
-	}
-	
-	public ExamStudent toDomain(ExamStudentDTO dto){
-		ExamStudent domain = null;
-		if(dto != null){
-			domain = new ExamStudent();
-			domain.setCourseCode(dto.getCourseCode());
-			domain.setCourseLevel(dto.getCourseLevel());
-			domain.setCourseName(dto.getCourseName());
-			domain.setDegree(dto.getDegree());
-			domain.setExam(dto.getExam());
-			domain.setExamNumber(dto.getExamNumber());
-			domain.setExamSite(dto.getExamSite());
-			domain.setFinished(dto.getFinished());
-			domain.setGrade(dto.getGrade());
-			domain.setGraduated(dto.getGraduated());
-			domain.setId(dto.getId());
-			domain.setIdentityNumber(dto.getIdentityNumber());
-			domain.setName(dto.getName());
-			domain.setOrgCode(dto.getOrgCode());
-			domain.setOrgId(dto.getOrgId());
-			domain.setOrgName(dto.getOrgName());
-			domain.setPaperType(dto.getPaperType());
-			domain.setRemark(dto.getRemark());
-			domain.setRepair(dto.getRepair());
-			domain.setRootOrgId(dto.getRootOrgId());
-			domain.setSpecialtyCode(dto.getSpecialtyCode());
-			domain.setSpecialtyName(dto.getSpecialtyName());
-			domain.setStudentCode(dto.getStudentCode());
-			domain.setInfoCollector(dto.getInfoCollector());
-			domain.setPhone(dto.getPhone());
-			domain.setStudentId(dto.getStudentId());
-		}
-		return domain;
-	}
-	
-}

+ 0 - 328
examcloud-core-examwork-dao/src/main/java/cn/com/qmth/examcloud/core/examwork/dao/bean/ExamStudentDTO.java

@@ -1,328 +0,0 @@
-package cn.com.qmth.examcloud.core.examwork.dao.bean;
-
-import cn.com.qmth.examcloud.commons.base.util.excel.ExcelProperty;
-import cn.com.qmth.examcloud.commons.web.cloud.api.JsonSerializable;
-import cn.com.qmth.examcloud.core.examwork.dao.entity.Exam;
-
-public class ExamStudentDTO implements JsonSerializable{
-
-	private static final long serialVersionUID = 757982847766860857L;
-
-	private Long id;
-	
-	@ExcelProperty(index = 0,name = "姓名")
-	private String name;
-
-	private Exam exam;
-
-	private Long examId;
-	/**
-	 * 学校id
-	 */
-    private Long rootOrgId;
-	/**
-	 * 学习中心id
-	 */
-    private Long orgId;
-
-    @ExcelProperty(index = 1,name = "学号")
-	private String studentCode;
-    @ExcelProperty(index = 2,name = "身份证号")
-	private String identityNumber;
-    /**
-	 * 学习中心code
-	 */
-    @ExcelProperty(index = 3,name = "学习中心代码")
-    private String orgCode;
-    @ExcelProperty(index = 4,name = "学习中心名称")
-    private String orgName;
-    
-	private String examNumber;
-	
-	@ExcelProperty(index = 5,name = "课程代码")
-	private String courseCode;
-	
-	@ExcelProperty(index = 6,name = "课程名称")
-	private String courseName;
-	
-	private String courseLevel;
-	
-	/**
-	 * 试卷类型
-	 */
-	@ExcelProperty(index = 7,name = "试卷类型")
-	private String paperType;
-	/**
-	 * 学位
-	 */
-	private Boolean degree;
-
-	private String specialtyCode;
-
-	@ExcelProperty(index = 8,name = "专业")
-	private String specialtyName;
-	
-	/**
-	 * 是否重修
-	 */
-	private Boolean repair;
-	
-	/**
-	 * 是否毕业
-	 */
-	private Boolean graduated;
-
-	private String remark;
-	
-	private Long studentId;
-	/**
-	 * 是否缺考 
-	 */
-	private Boolean finished;
-	/**
-	 * 考点
-     */
-	@ExcelProperty(index = 9,name = "考点")
-	private String examSite;
-
-	@ExcelProperty(index = 10,name = "信息采集人")
-	private String infoCollector;
-	
-	@ExcelProperty(index = 11,name = "学生电话")
-	private String phone;
-	/**
-	 * 年级
-	 */
-	@ExcelProperty(index = 12,name = "年级")
-	private String grade;
-
-
-	private Boolean isEntranceExam;
-	
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public Exam getExam() {
-		return exam;
-	}
-
-	public void setExam(Exam exam) {
-		this.exam = exam;
-	}
-
-	public String getStudentCode() {
-		return studentCode;
-	}
-
-	public void setStudentCode(String studentCode) {
-		this.studentCode = studentCode;
-	}
-
-	public String getIdentityNumber() {
-		return identityNumber;
-	}
-
-	public void setIdentityNumber(String identityNumber) {
-		this.identityNumber = identityNumber;
-	}
-
-	public String getExamNumber() {
-		return examNumber;
-	}
-
-	public void setExamNumber(String examNumber) {
-		this.examNumber = examNumber;
-	}
-
-	public String getCourseCode() {
-		return courseCode;
-	}
-
-	public void setCourseCode(String courseCode) {
-		this.courseCode = courseCode;
-	}
-
-	public String getCourseName() {
-		return courseName;
-	}
-
-	public void setCourseName(String courseName) {
-		this.courseName = courseName;
-	}
-
-	public String getSpecialtyCode() {
-		return specialtyCode;
-	}
-
-	public void setSpecialtyCode(String specialtyCode) {
-		this.specialtyCode = specialtyCode;
-	}
-
-	public String getRemark() {
-		return remark;
-	}
-
-	public void setRemark(String remark) {
-		this.remark = remark;
-	}
-
-	public String getGrade() {
-		return grade;
-	}
-
-	public void setGrade(String grade) {
-		this.grade = grade;
-	}
-
-	public Long getRootOrgId() {
-		return rootOrgId;
-	}
-
-	public void setRootOrgId(Long rootOrgId) {
-		this.rootOrgId = rootOrgId;
-	}
-
-	public Long getOrgId() {
-		return orgId;
-	}
-
-	public void setOrgId(Long orgId) {
-		this.orgId = orgId;
-	}
-
-	public String getOrgCode() {
-		return orgCode;
-	}
-
-	public void setOrgCode(String orgCode) {
-		this.orgCode = orgCode;
-	}
-
-	public String getPaperType() {
-		return paperType;
-	}
-
-	public void setPaperType(String paperType) {
-		this.paperType = paperType;
-	}
-
-	public String getCourseLevel() {
-		return courseLevel;
-	}
-
-	public void setCourseLevel(String courseLevel) {
-		this.courseLevel = courseLevel;
-	}
-
-	public Boolean getDegree() {
-		return degree;
-	}
-
-	public void setDegree(Boolean degree) {
-		this.degree = degree;
-	}
-
-	public Boolean getRepair() {
-		return repair;
-	}
-
-	public void setRepair(Boolean repair) {
-		this.repair = repair;
-	}
-
-	public Boolean getGraduated() {
-		return graduated;
-	}
-
-	public void setGraduated(Boolean graduated) {
-		this.graduated = graduated;
-	}
-
-	public Boolean getFinished() {
-		return finished;
-	}
-
-	public void setFinished(Boolean finished) {
-		this.finished = finished;
-	}
-
-	public Long getStudentId() {
-		return studentId;
-	}
-
-	public void setStudentId(Long studentId) {
-		this.studentId = studentId;
-	}
-
-	public String getExamSite() {
-		return examSite;
-	}
-
-	public void setExamSite(String examSite) {
-		this.examSite = examSite;
-	}
-
-	public Long getExamId() {
-		return examId;
-	}
-
-	public void setExamId(Long examId) {
-		this.examId = examId;
-	}
-
-	public String getOrgName() {
-		return orgName;
-	}
-
-	public void setOrgName(String orgName) {
-		this.orgName = orgName;
-	}
-	
-	public String getInfoCollector() {
-		return infoCollector;
-	}
-
-	public void setInfoCollector(String infoCollector) {
-		this.infoCollector = infoCollector;
-	}
-
-	public String getPhone() {
-		return phone;
-	}
-
-	public void setPhone(String phone) {
-		this.phone = phone;
-	}
-
-	public String getSpecialtyName() {
-		return specialtyName;
-	}
-
-	public void setSpecialtyName(String specialtyName) {
-		this.specialtyName = specialtyName;
-	}
-
-	public Boolean getEntranceExam() {
-		return isEntranceExam;
-	}
-
-	public void setEntranceExam(Boolean entranceExam) {
-		isEntranceExam = entranceExam;
-	}
-
-	public ExamStudentDTO() {
-	}
-}

+ 26 - 284
examcloud-core-examwork-dao/src/main/java/cn/com/qmth/examcloud/core/examwork/dao/entity/ExamStudent.java

@@ -3,11 +3,7 @@ package cn.com.qmth.examcloud.core.examwork.dao.entity;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
 import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.validation.constraints.NotNull;
 
 import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
 
@@ -15,7 +11,7 @@ import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
  * Created by songyue on 17/1/13.
  */
 @Entity
-@Table(name = "ecs_exam_student")
+@Table(name = "EC_E_EXAM_STUDENT")
 public class ExamStudent extends JpaEntity {
 
 	private static final long serialVersionUID = 757531976286006550L;
@@ -24,17 +20,24 @@ public class ExamStudent extends JpaEntity {
 	@GeneratedValue
 	private Long id;
 
-	@NotNull
+	/**
+	 * 学生用户id
+	 */
+	private Long studentId;
+
+	/**
+	 * 考生姓名
+	 */
 	private String name;
 
-	@ManyToOne
-	@JoinColumn(name = "examId")
-	private Exam exam;
+	/**
+	 * 考试
+	 */
+	private Long examId;
 
 	/**
 	 * 学校id
 	 */
-	@NotNull
 	private Long rootOrgId;
 
 	/**
@@ -47,11 +50,6 @@ public class ExamStudent extends JpaEntity {
 	 */
 	private String orgCode;
 
-	/**
-	 * 学习中心名称
-	 */
-	private String orgName;
-
 	/**
 	 * 学号
 	 */
@@ -62,75 +60,31 @@ public class ExamStudent extends JpaEntity {
 	 */
 	private String identityNumber;
 
-	private String examNumber;
-
 	/**
 	 * 课程ID
 	 */
 	private Long courseId;
 
-	/**
-	 * 课程code
-	 */
-	private String courseCode;
-
-	/**
-	 * 课程名称
-	 */
-	private String courseName;
-
-	/**
-	 * 课程等级
-	 */
-	private String courseLevel;
-
 	/**
 	 * 试卷类型
 	 */
 	private String paperType;
 
-	/**
-	 * 学位
-	 */
-	private Boolean degree;
-
 	/**
 	 * 专业名称
 	 */
 	private String specialtyName;
 
-	/**
-	 * 专业code
-	 */
-	private String specialtyCode;
-
-	/**
-	 * 是否重修
-	 */
-	private Boolean repair;
-
 	/**
 	 * 年级
 	 */
 	private String grade;
 
 	/**
-	 * 是否毕业
+	 * 备注
 	 */
-	private Boolean graduated;
-
 	private String remark;
 
-	/**
-	 * 是否考完
-	 */
-	private Boolean finished;
-
-	/**
-	 * 学生用户id
-	 */
-	private Long studentId;
-
 	/**
 	 * 考点
 	 */
@@ -141,58 +95,6 @@ public class ExamStudent extends JpaEntity {
 	 */
 	private String infoCollector;
 
-	/**
-	 * 学生电话
-	 */
-	private String phone;
-
-	/**
-	 * 正常考试次数 不含重考
-	 */
-	private Integer normalExamTimes;
-
-	/**
-	 * 是否为重考
-	 */
-	private Boolean isReexamine;
-
-	/**
-	 * 重考原因类型
-	 */
-	private String reexamineType;
-
-	/**
-	 * 重考原因详情
-	 */
-	private String reexamineDetail;
-
-	/**
-	 * 重考已完成 true:是 false:否
-	 */
-	private Boolean reexamineCompleted;
-
-	/**
-	 * 考试开始时间(针对学生,网考使用)
-	 */
-	@Transient
-	private String examBeginTime;
-
-	/**
-	 * 考试结束时间(针对学生,网考使用)
-	 */
-	@Transient
-	private String examEndTime;
-
-	/**
-	 * 是否可上传
-	 */
-	private Boolean canUpload;
-
-	/**
-	 * 试卷袋编码
-	 */
-	private String packageCode;
-
 	public Long getId() {
 		return id;
 	}
@@ -201,6 +103,14 @@ public class ExamStudent extends JpaEntity {
 		this.id = id;
 	}
 
+	public Long getStudentId() {
+		return studentId;
+	}
+
+	public void setStudentId(Long studentId) {
+		this.studentId = studentId;
+	}
+
 	public String getName() {
 		return name;
 	}
@@ -209,12 +119,12 @@ public class ExamStudent extends JpaEntity {
 		this.name = name;
 	}
 
-	public Exam getExam() {
-		return exam;
+	public Long getExamId() {
+		return examId;
 	}
 
-	public void setExam(Exam exam) {
-		this.exam = exam;
+	public void setExamId(Long examId) {
+		this.examId = examId;
 	}
 
 	public Long getRootOrgId() {
@@ -241,14 +151,6 @@ public class ExamStudent extends JpaEntity {
 		this.orgCode = orgCode;
 	}
 
-	public String getOrgName() {
-		return orgName;
-	}
-
-	public void setOrgName(String orgName) {
-		this.orgName = orgName;
-	}
-
 	public String getStudentCode() {
 		return studentCode;
 	}
@@ -265,14 +167,6 @@ public class ExamStudent extends JpaEntity {
 		this.identityNumber = identityNumber;
 	}
 
-	public String getExamNumber() {
-		return examNumber;
-	}
-
-	public void setExamNumber(String examNumber) {
-		this.examNumber = examNumber;
-	}
-
 	public Long getCourseId() {
 		return courseId;
 	}
@@ -281,30 +175,6 @@ public class ExamStudent extends JpaEntity {
 		this.courseId = courseId;
 	}
 
-	public String getCourseCode() {
-		return courseCode;
-	}
-
-	public void setCourseCode(String courseCode) {
-		this.courseCode = courseCode;
-	}
-
-	public String getCourseName() {
-		return courseName;
-	}
-
-	public void setCourseName(String courseName) {
-		this.courseName = courseName;
-	}
-
-	public String getCourseLevel() {
-		return courseLevel;
-	}
-
-	public void setCourseLevel(String courseLevel) {
-		this.courseLevel = courseLevel;
-	}
-
 	public String getPaperType() {
 		return paperType;
 	}
@@ -313,14 +183,6 @@ public class ExamStudent extends JpaEntity {
 		this.paperType = paperType;
 	}
 
-	public Boolean getDegree() {
-		return degree;
-	}
-
-	public void setDegree(Boolean degree) {
-		this.degree = degree;
-	}
-
 	public String getSpecialtyName() {
 		return specialtyName;
 	}
@@ -329,22 +191,6 @@ public class ExamStudent extends JpaEntity {
 		this.specialtyName = specialtyName;
 	}
 
-	public String getSpecialtyCode() {
-		return specialtyCode;
-	}
-
-	public void setSpecialtyCode(String specialtyCode) {
-		this.specialtyCode = specialtyCode;
-	}
-
-	public Boolean getRepair() {
-		return repair;
-	}
-
-	public void setRepair(Boolean repair) {
-		this.repair = repair;
-	}
-
 	public String getGrade() {
 		return grade;
 	}
@@ -353,14 +199,6 @@ public class ExamStudent extends JpaEntity {
 		this.grade = grade;
 	}
 
-	public Boolean getGraduated() {
-		return graduated;
-	}
-
-	public void setGraduated(Boolean graduated) {
-		this.graduated = graduated;
-	}
-
 	public String getRemark() {
 		return remark;
 	}
@@ -369,22 +207,6 @@ public class ExamStudent extends JpaEntity {
 		this.remark = remark;
 	}
 
-	public Boolean getFinished() {
-		return finished;
-	}
-
-	public void setFinished(Boolean finished) {
-		this.finished = finished;
-	}
-
-	public Long getStudentId() {
-		return studentId;
-	}
-
-	public void setStudentId(Long studentId) {
-		this.studentId = studentId;
-	}
-
 	public String getExamSite() {
 		return examSite;
 	}
@@ -401,84 +223,4 @@ public class ExamStudent extends JpaEntity {
 		this.infoCollector = infoCollector;
 	}
 
-	public String getPhone() {
-		return phone;
-	}
-
-	public void setPhone(String phone) {
-		this.phone = phone;
-	}
-
-	public Integer getNormalExamTimes() {
-		return normalExamTimes;
-	}
-
-	public void setNormalExamTimes(Integer normalExamTimes) {
-		this.normalExamTimes = normalExamTimes;
-	}
-
-	public Boolean getIsReexamine() {
-		return isReexamine;
-	}
-
-	public void setIsReexamine(Boolean isReexamine) {
-		this.isReexamine = isReexamine;
-	}
-
-	public String getReexamineType() {
-		return reexamineType;
-	}
-
-	public void setReexamineType(String reexamineType) {
-		this.reexamineType = reexamineType;
-	}
-
-	public String getReexamineDetail() {
-		return reexamineDetail;
-	}
-
-	public void setReexamineDetail(String reexamineDetail) {
-		this.reexamineDetail = reexamineDetail;
-	}
-
-	public Boolean getReexamineCompleted() {
-		return reexamineCompleted;
-	}
-
-	public void setReexamineCompleted(Boolean reexamineCompleted) {
-		this.reexamineCompleted = reexamineCompleted;
-	}
-
-	public String getExamBeginTime() {
-		return examBeginTime;
-	}
-
-	public void setExamBeginTime(String examBeginTime) {
-		this.examBeginTime = examBeginTime;
-	}
-
-	public String getExamEndTime() {
-		return examEndTime;
-	}
-
-	public void setExamEndTime(String examEndTime) {
-		this.examEndTime = examEndTime;
-	}
-
-	public Boolean getCanUpload() {
-		return canUpload;
-	}
-
-	public void setCanUpload(Boolean canUpload) {
-		this.canUpload = canUpload;
-	}
-
-	public String getPackageCode() {
-		return packageCode;
-	}
-
-	public void setPackageCode(String packageCode) {
-		this.packageCode = packageCode;
-	}
-
 }

+ 13 - 0
examcloud-core-examwork-service/src/main/java/cn/com/qmth/examcloud/core/examwork/service/ExamStudentService.java

@@ -1,9 +1,22 @@
 package cn.com.qmth.examcloud.core.examwork.service;
 
+import java.util.List;
+
 import cn.com.qmth.examcloud.core.examwork.service.bean.ExamStudentInfo;
 
+/**
+ * 类注释
+ *
+ * @author WANGWEI
+ * @date 2018年8月16日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
 public interface ExamStudentService {
 
 	public ExamStudentInfo saveExamStudent(ExamStudentInfo examStudentInfo);
 
+	public void deleteExamStudentsByExamId(Long examId);
+
+	public void deleteExamStudentsByStudentIds(List<Long> studentIds);
+
 }

+ 1 - 1
examcloud-core-examwork-service/src/main/java/cn/com/qmth/examcloud/core/examwork/service/impl/ExamService.java

@@ -103,7 +103,7 @@ public class ExamService {
 			if (exam.getCanStuDel()) {
 				// 删除学习中心考试时间
 				examOrgTimeRepo.deleteByExamId(exam.getId());
-				examStudentService.deleteExamStudents(exam.getId());
+				examStudentService.deleteExamStudentsByExamId(exam.getId());
 				examRepo.delete(exam);
 			} else {
 				throw new StatusException("", "[ " + exam.getName() + " ] 已经开始,不能删除");

+ 20 - 355
examcloud-core-examwork-service/src/main/java/cn/com/qmth/examcloud/core/examwork/service/impl/ExamStudentServiceImpl.java

@@ -1,25 +1,16 @@
 package cn.com.qmth.examcloud.core.examwork.service.impl;
 
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.criteria.Predicate;
-
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 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.Pageable;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.commons.base.exception.StatusException;
-import cn.com.qmth.examcloud.commons.base.util.BeanCopierUtil;
 import cn.com.qmth.examcloud.core.basic.api.CourseCloudService;
 import cn.com.qmth.examcloud.core.basic.api.OrgCloudService;
 import cn.com.qmth.examcloud.core.basic.api.StudentCloudService;
@@ -35,12 +26,8 @@ import cn.com.qmth.examcloud.core.basic.api.response.SaveCourseResp;
 import cn.com.qmth.examcloud.core.examwork.dao.ExamOrgTimeRepo;
 import cn.com.qmth.examcloud.core.examwork.dao.ExamRepo;
 import cn.com.qmth.examcloud.core.examwork.dao.ExamStudentRepo;
-import cn.com.qmth.examcloud.core.examwork.dao.bean.ExamStudentAssembler;
-import cn.com.qmth.examcloud.core.examwork.dao.bean.ExamStudentDTO;
 import cn.com.qmth.examcloud.core.examwork.dao.entity.Exam;
-import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamOrgTime;
 import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamStudent;
-import cn.com.qmth.examcloud.core.examwork.dao.enums.ExamType;
 import cn.com.qmth.examcloud.core.examwork.service.ExamStudentService;
 import cn.com.qmth.examcloud.core.examwork.service.bean.ExamStudentInfo;
 
@@ -58,9 +45,6 @@ public class ExamStudentServiceImpl implements ExamStudentService {
 	@Autowired
 	ExamRepo examRepo;
 
-	@Autowired
-	ExamStudentAssembler examStudentAssembler;
-
 	@Autowired
 	ExamOrgTimeRepo examOrgTimeRepo;
 
@@ -76,325 +60,21 @@ public class ExamStudentServiceImpl implements ExamStudentService {
 	@Autowired
 	CourseCloudService courseCloudService;
 
-	/**
-	 * 获取所有考试学生(分页)
-	 * 
-	 * @param examCriteria
-	 * @param pageable
-	 * @return
-	 * @return
-	 */
-	public Page<ExamStudent> getAllExamStudent(ExamStudentDTO examCriteria, Pageable pageable) {
-		Specification<ExamStudent> specification = getPageSpecification(examCriteria);
-		Page<ExamStudent> examStudents = examStudentRepo.findAll(specification, pageable);
-		processExamStudent(examStudents.getContent());
-		return examStudents;
-	}
-
-	/**
-	 * 获取所有考试学生
-	 * 
-	 * @param examCriteria
-	 * @return
-	 * @return
-	 */
-	public List<ExamStudent> getAllExamStudent(ExamStudentDTO examCriteria) {
-		Specification<ExamStudent> specification = getSpecification(examCriteria);
-		List<ExamStudent> examStudents = examStudentRepo.findAll(specification,
-				new Sort(Direction.DESC, "id"));
-		processExamStudent(examStudents);
-		return examStudents;
-	}
-
-	/**
-	 * 处理考生集合(设置学习中心考试时间)
-	 * 
-	 * @param examStudents
-	 */
-	private void processExamStudent(List<ExamStudent> examStudents) {
-		for (ExamStudent examStudent : examStudents) {
-			// 设置学习中心考试时间
-			setExamOrgTime(examStudent);
-		}
-	}
-
-	/**
-	 * 设置学习中心考试时间
-	 * 
-	 * @param examStudent
-	 */
-	private void setExamOrgTime(ExamStudent examStudent) {
-		Exam exam = examStudent.getExam();
-		if (exam != null) {
-			if (exam.getExamType() == ExamType.OFFLINE) {
-				Long examId = exam.getId();
-				Long orgId = examStudent.getOrgId();
-				ExamOrgTime examOrgTime = examOrgTimeRepo.findFirstByExamIdAndOrgId(examId, orgId);
-				if (examOrgTime != null) {
-					String examBeginTime = String.valueOf(examOrgTime.getBeginTime().getTime());
-					String examEndTime = String.valueOf(examOrgTime.getEndTime().getTime());
-					examStudent.setExamBeginTime(examBeginTime);
-					examStudent.setExamEndTime(examEndTime);
-					examStudent.setCanUpload(getCanUpload(examOrgTime));
-				}
-			} else {
-				String examBeginTime = String.valueOf(exam.getBeginTime().getTime());
-				String examEndTime = String.valueOf(exam.getEndTime().getTime());
-				examStudent.setExamBeginTime(examBeginTime);
-				examStudent.setExamEndTime(examEndTime);
-			}
-		}
-	}
-
-	private Boolean getCanUpload(ExamOrgTime examOrgTime) {
-		if (examOrgTime.getCanUpload() == null) {
-			Date now = new Date();
-			if (now.after(examOrgTime.getEndTime())) {
-				return false;
-			} else {
-				return true;
-			}
-		} else {
-			return examOrgTime.getCanUpload();
-		}
-	}
-
-	public ExamStudent findById(Long id) {
-		ExamStudent examStudent = examStudentRepo.findOne(id);
-		setExamOrgTime(examStudent);
-		return examStudent;
-	}
-
-	/**
-	 * 按考试批次获取学生
-	 * 
-	 * @param examId
-	 * @return
-	 * @return
-	 */
-	public Page<ExamStudent> getExamStudentByExamId(Long examId, Pageable pageable) {
-		return examStudentRepo.findByExamId(examId, pageable);
-	}
-
-	/**
-	 * 生成查询条件
-	 * 
-	 * @param examCriteria
-	 * @return
-	 */
-	private Specification<ExamStudent> getSpecification(ExamStudentDTO examCriteria) {
-		Specification<ExamStudent> specification = (root, query, cb) -> {
-			List<Predicate> predicates = new ArrayList<>();
-			if (null != examCriteria.getStudentId()) {
-				predicates.add(cb.equal(root.get("studentId"), examCriteria.getStudentId()));
-			}
-			if (null != examCriteria.getRootOrgId()) {
-				predicates.add(cb.equal(root.get("rootOrgId"), examCriteria.getRootOrgId()));
-			}
-			if (null != examCriteria.getOrgId()) {
-				predicates.add(cb.equal(root.get("orgId"), examCriteria.getOrgId()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getOrgName())) {
-				predicates.add(cb.like(root.get("orgName"), "%" + examCriteria.getOrgName() + "%"));
-			}
-			if (null != examCriteria.getExamId()) {
-				predicates.add(cb.equal(root.get("exam").get("id"), examCriteria.getExamId()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getName())) {
-				predicates.add(cb.like(root.get("name"), "%" + examCriteria.getName() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getStudentCode())) {
-				predicates.add(cb.like(root.get("studentCode"),
-						"%" + examCriteria.getStudentCode() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getCourseCode())) {
-				predicates.add(cb.equal(root.get("courseCode"), examCriteria.getCourseCode()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getCourseLevel())) {
-				predicates.add(cb.equal(root.get("courseLevel"), examCriteria.getCourseLevel()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getCourseName())) {
-				predicates.add(
-						cb.like(root.get("courseName"), "%" + examCriteria.getCourseName() + "%"));
-			}
-			if (null != examCriteria.getFinished()) {
-				predicates.add(cb.equal(root.get("finished"), examCriteria.getFinished()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getExamSite())) {
-				predicates
-						.add(cb.like(root.get("examSite"), "%" + examCriteria.getExamSite() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getIdentityNumber())) {
-				predicates.add(
-						cb.equal(root.get("identityNumber"), examCriteria.getIdentityNumber()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getSpecialtyName())) {
-				predicates.add(cb.like(root.get("specialtyName"),
-						"%" + examCriteria.getSpecialtyName() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getPaperType())) {
-				predicates.add(cb.equal(root.get("paperType"), examCriteria.getPaperType()));
-			}
-			if (null != examCriteria.getDegree()) {
-				predicates.add(cb.equal(root.get("degree"), examCriteria.getDegree()));
-			}
-			if (null != examCriteria.getRepair()) {
-				predicates.add(cb.equal(root.get("repair"), examCriteria.getRepair()));
-			}
-			if (null != examCriteria.getGraduated()) {
-				predicates.add(cb.equal(root.get("graduated"), examCriteria.getGraduated()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getGrade())) {
-				predicates.add(cb.like(root.get("grade"), "%" + examCriteria.getGrade() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getExamNumber())) {
-				predicates.add(
-						cb.like(root.get("examNumber"), "%" + examCriteria.getExamNumber() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getInfoCollector())) {
-				predicates.add(cb.like(root.get("infoCollector"),
-						"%" + examCriteria.getInfoCollector() + "%"));
-			}
-			return cb.and(predicates.toArray(new Predicate[predicates.size()]));
-		};
-		return specification;
-	}
-
-	/**
-	 * 生成查询条件
-	 * 
-	 * @param examCriteria
-	 * @return
-	 */
-	private Specification<ExamStudent> getPageSpecification(ExamStudentDTO examCriteria) {
-		Specification<ExamStudent> specification = (root, query, cb) -> {
-			List<Predicate> predicates = new ArrayList<>();
-			if (null != examCriteria.getStudentId()) {
-				predicates.add(cb.equal(root.get("studentId"), examCriteria.getStudentId()));
-			}
-			if (null != examCriteria.getRootOrgId()) {
-				predicates.add(cb.equal(root.get("rootOrgId"), examCriteria.getRootOrgId()));
-			}
-			if (null != examCriteria.getOrgId()) {
-				predicates.add(cb.equal(root.get("orgId"), examCriteria.getOrgId()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getOrgName())) {
-				predicates.add(cb.like(root.get("orgName"), "%" + examCriteria.getOrgName() + "%"));
-			}
-			if (null != examCriteria.getExamId()) {
-				predicates.add(cb.equal(root.get("exam").get("id"), examCriteria.getExamId()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getName())) {
-				predicates.add(cb.like(root.get("name"), "%" + examCriteria.getName() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getStudentCode())) {
-				predicates.add(cb.like(root.get("studentCode"),
-						"%" + examCriteria.getStudentCode() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getCourseCode())) {
-				predicates.add(cb.equal(root.get("courseCode"), examCriteria.getCourseCode()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getCourseLevel())) {
-				predicates.add(cb.equal(root.get("courseLevel"), examCriteria.getCourseLevel()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getCourseName())) {
-				predicates.add(
-						cb.like(root.get("courseName"), "%" + examCriteria.getCourseName() + "%"));
-			}
-			if (null != examCriteria.getFinished()) {
-				predicates.add(cb.equal(root.get("finished"), examCriteria.getFinished()));
-			}
-
-			if (!StringUtils.isEmpty(examCriteria.getExamSite())) {
-				predicates
-						.add(cb.like(root.get("examSite"), "%" + examCriteria.getExamSite() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getIdentityNumber())) {
-				predicates.add(cb.like(root.get("identityNumber"),
-						"%" + examCriteria.getIdentityNumber() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getSpecialtyName())) {
-				predicates.add(cb.like(root.get("specialtyName"),
-						"%" + examCriteria.getSpecialtyName() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getPaperType())) {
-				predicates.add(cb.equal(root.get("paperType"), examCriteria.getPaperType()));
-			}
-			if (null != examCriteria.getDegree()) {
-				predicates.add(cb.equal(root.get("degree"), examCriteria.getDegree()));
-			}
-			if (null != examCriteria.getRepair()) {
-				predicates.add(cb.equal(root.get("repair"), examCriteria.getRepair()));
-			}
-			if (null != examCriteria.getGraduated()) {
-				predicates.add(cb.equal(root.get("graduated"), examCriteria.getGraduated()));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getGrade())) {
-				predicates.add(cb.like(root.get("grade"), "%" + examCriteria.getGrade() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getExamNumber())) {
-				predicates.add(
-						cb.like(root.get("examNumber"), "%" + examCriteria.getExamNumber() + "%"));
-			}
-			if (!StringUtils.isEmpty(examCriteria.getInfoCollector())) {
-				predicates.add(cb.like(root.get("infoCollector"),
-						"%" + examCriteria.getInfoCollector() + "%"));
-			}
-			return cb.and(predicates.toArray(new Predicate[predicates.size()]));
-		};
-		return specification;
-	}
-
-	/**
-	 * 复制考生
-	 * 
-	 * @param sourceExamId
-	 * @param targetExamId
-	 */
-	public void copyExamStudent(Long sourceExamId, Long targetExamId) {
-		List<ExamStudent> sourceExamStudents = examStudentRepo.findByExamId(sourceExamId);
-		List<ExamStudent> targetExamStudents = new ArrayList<ExamStudent>();
-		Exam targetExam = examRepo.findOne(targetExamId);
-		sourceExamStudents.stream().forEach(examStudent -> {
-			if (examStudentRepo.checkExamStu(targetExam.getId(), examStudent.getRootOrgId(),
-					examStudent.getIdentityNumber(), examStudent.getCourseCode()) == 0) {
-				ExamStudent tempStudent = BeanCopierUtil.copyProperties(examStudent,
-						ExamStudent.class);
-				tempStudent.setId(null);
-				tempStudent.setFinished(false);
-				tempStudent.setGraduated(false);
-				tempStudent.setDegree(false);
-				tempStudent.setRepair(false);
-				tempStudent.setCanUpload(false);
-				tempStudent.setIsReexamine(false);
-				tempStudent.setNormalExamTimes(0);
-				tempStudent.setIsReexamine(null);
-				tempStudent.setReexamineType(null);
-				tempStudent.setReexamineDetail(null);
-				tempStudent.setReexamineCompleted(null);
-				tempStudent.setExam(targetExam);
-				targetExamStudents.add(tempStudent);
-			}
-		});
-		examStudentRepo.save(targetExamStudents);
-		sourceExamStudents.clear();
-		targetExamStudents.clear();
-	}
-
 	/**
 	 * 方法注释
 	 *
 	 * @author WANGWEI
 	 * @param ids
 	 */
-	public void deleteExamStudent(List<Long> ids) {
+	@Override
+	public void deleteExamStudentsByStudentIds(List<Long> ids) {
 		List<ExamStudent> examStudents = examStudentRepo.findByIdIn(ids);
 		for (ExamStudent examStudent : examStudents) {
-			if (examStudent.getExam().getCanStuDel()) {
-				examStudentRepo.delete(examStudent);
-			} else {
+			// 网考判断
+			if (System.currentTimeMillis() > 0) {
 				throw new StatusException("E-150112", examStudent.getName() + "已开始考试,不能删除");
 			}
+			examStudentRepo.delete(examStudent);
 		}
 	}
 
@@ -404,13 +84,14 @@ public class ExamStudentServiceImpl implements ExamStudentService {
 	 * @author WANGWEI
 	 * @param examId
 	 */
-	public void deleteExamStudents(Long examId) {
+	@Override
+	public void deleteExamStudentsByExamId(Long examId) {
 		Exam exam = examRepo.findOne(examId);
-		if (exam.getCanStuDel()) {
-			examStudentRepo.deleteByExamId(examId);
-		} else {
+		// 已经开考
+		if (exam.getBeginTime().after(new Date())) {
 			throw new StatusException("E-150113", "该考试已开始,不能删除");
 		}
+		examStudentRepo.deleteByExamId(examId);
 	}
 
 	/*
@@ -487,42 +168,26 @@ public class ExamStudentServiceImpl implements ExamStudentService {
 		SaveCourseResp saveCourseResp = courseCloudService.saveCourse(saveCourseReq);
 		CourseBean courseBean = saveCourseResp.getCourseBean();
 
-		List<ExamStudent> examStudentList = examStudentRepo
-				.findByExamAndStudentIdAndCourseCodeOrderByUpdateTimeDesc(exam, studentInfo.getId(),
-						courseBean.getCode());
+		ExamStudent examStudent = examStudentRepo.findByExamIdAndStudentIdAndCourseId(exam.getId(),
+				studentInfo.getId(), courseBean.getId());
 
-		ExamStudent examStudent = null;
-
-		if (1 < examStudentList.size()) {
-			// 数据需要修正
-			throw new StatusException("E-100008", "考生数据重复. studentId: " + studentInfo.getId());
-		} else if (1 == examStudentList.size()) {
-			examStudent = examStudentList.get(0);
-		} else {
+		if (null == examStudent) {
 			examStudent = new ExamStudent();
-			examStudent.setNormalExamTimes(0);
-			examStudent.setFinished(false);
-			examStudent.setIsReexamine(false);
-			examStudent.setCanUpload(false);
 		}
+
 		examStudent.setInfoCollector(examStudentInfo.getInfoCollector());
 		examStudent.setName(studentInfo.getName());
 		examStudent.setRootOrgId(rootOrgId);
 
 		examStudent.setCourseId(courseBean.getId());
-		examStudent.setCourseCode(courseBean.getCode());
-		examStudent.setCourseName(courseBean.getName());
-		examStudent.setCourseLevel(courseBean.getLevel());
 
-		examStudent.setExam(exam);
+		examStudent.setExamId(exam.getId());
 		examStudent.setIdentityNumber(studentInfo.getIdentityNumber());
 		examStudent.setStudentCode(studentInfo.getStudentCode());
 		examStudent.setPaperType(paperType);
 		examStudent.setStudentId(studentInfo.getId());
 		examStudent.setOrgId(studentInfo.getOrgId());
-		examStudent.setOrgName(studentInfo.getOrgName());
 		examStudent.setOrgCode(studentInfo.getOrgCode());
-		examStudent.setPhone(studentInfo.getPhoneNumber());
 		examStudent.setGrade(examStudentInfo.getGrade());
 		examStudent.setSpecialtyName(examStudentInfo.getSpecialtyName());
 		examStudent.setExamSite(examStudentInfo.getExamSite());
@@ -532,11 +197,11 @@ public class ExamStudentServiceImpl implements ExamStudentService {
 
 		ExamStudentInfo ret = new ExamStudentInfo();
 		ret.setId(saved.getId());
-		ret.setCourseCode(saved.getCourseCode());
-		ret.setCourseLevel(saved.getCourseLevel());
-		ret.setCourseName(saved.getCourseName());
-		ret.setExamId(saved.getExam().getId());
-		ret.setExamName(saved.getExam().getName());
+		ret.setCourseCode(courseBean.getCode());
+		ret.setCourseLevel(courseBean.getLevel());
+		ret.setCourseName(courseBean.getName());
+		ret.setExamId(exam.getId());
+		ret.setExamName(exam.getName());
 		ret.setIdentityNumber(saved.getIdentityNumber());
 		ret.setStudentCode(saved.getStudentCode());
 		ret.setPaperType(saved.getPaperType());