|
@@ -1,825 +1,825 @@
|
|
|
-package cn.com.qmth.examcloud.service.examwork.service;
|
|
|
-
|
|
|
-import java.io.InputStream;
|
|
|
-import java.sql.ResultSet;
|
|
|
-import java.sql.SQLException;
|
|
|
-import java.text.DecimalFormat;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
-
|
|
|
-import javax.persistence.criteria.Predicate;
|
|
|
-
|
|
|
-import cn.com.qmth.examcloud.common.util.BeanCopierUtil;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.dao.ExamOrgTimeRepo;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.entity.ExamOrgTime;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.enums.ExamType;
|
|
|
-
|
|
|
-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.data.domain.Sort;
|
|
|
-import org.springframework.data.domain.Sort.Direction;
|
|
|
-import org.springframework.data.jpa.domain.Specification;
|
|
|
-import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
-import org.springframework.jdbc.core.RowMapper;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-import org.springframework.util.StringUtils;
|
|
|
-
|
|
|
-import cn.com.qmth.examcloud.common.dto.core.Course;
|
|
|
-import cn.com.qmth.examcloud.common.dto.core.Org;
|
|
|
-import cn.com.qmth.examcloud.common.dto.core.Student;
|
|
|
-import cn.com.qmth.examcloud.common.dto.core.User;
|
|
|
-import cn.com.qmth.examcloud.common.dto.core.enums.UserType;
|
|
|
-import cn.com.qmth.examcloud.common.dto.examwork.CommonExamStudent;
|
|
|
-import cn.com.qmth.examcloud.common.util.ErrorMsg;
|
|
|
-import cn.com.qmth.examcloud.common.util.excel.ExcelError;
|
|
|
-import cn.com.qmth.examcloud.common.util.excel.ExcelReader;
|
|
|
-import cn.com.qmth.examcloud.common.util.excel.ExcelReaderHandle;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.assembler.ExamStudentAssembler;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.dao.ExamRepo;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.dao.ExamStudentRepo;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.dto.ExamStudentDTO;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.dto.OrgExamInfoDTO;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.entity.Exam;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.entity.ExamStudent;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.service.rpc.CourseService;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.service.rpc.OrgService;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.service.rpc.SpecialtyService;
|
|
|
-import cn.com.qmth.examcloud.service.examwork.service.rpc.StudentService;
|
|
|
-
|
|
|
-/**
|
|
|
- * 考试学生服务类
|
|
|
- * Created by songyue on 17/1/14.
|
|
|
- */
|
|
|
-@Service
|
|
|
-public class ExamStudentService {
|
|
|
-
|
|
|
- protected static final Logger log = LoggerFactory.getLogger(ExamStudentService.class);
|
|
|
-
|
|
|
- @Autowired
|
|
|
- ExamStudentRepo examStudentRepo;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- ExamRepo examRepo;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- ExamStudentAssembler examStudentAssembler;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- StudentService studentService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- CourseService courseService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- OrgService orgService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private JdbcTemplate jdbcTemplate;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- SpecialtyService specialtyService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- ExamOrgTimeRepo examOrgTimeRepo;
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取所有考试学生(分页)
|
|
|
- * @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 examStudent
|
|
|
- * @return
|
|
|
- */
|
|
|
- public ExamStudent saveExamStudent(ExamStudent examStudent)throws Exception{
|
|
|
- checkExamStudent(examStudent);
|
|
|
- return saveStudent(examStudent);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 导入考试学生
|
|
|
- * @return
|
|
|
- */
|
|
|
- public List<ExcelError> importExamStudent(Long examId, InputStream inputStream) {
|
|
|
- log.info("导入考生开始");
|
|
|
- Exam exam = examRepo.findOne(examId);
|
|
|
- List<ExcelError> excelErrors = new ArrayList<ExcelError>();
|
|
|
- if(exam == null){
|
|
|
- ExcelError excelError = new ExcelError(1,"请先创建考试");
|
|
|
- excelErrors.add(excelError);
|
|
|
- return excelErrors;
|
|
|
- }
|
|
|
- List<ExamStudent> examStudents = new ArrayList<ExamStudent>();
|
|
|
- ExcelReader excelReader = new ExcelReader(ExamStudentDTO.class);
|
|
|
- excelErrors = excelReader.reader(inputStream, new ExcelReaderHandle() {
|
|
|
- @Override
|
|
|
- public ExcelError handle(Object obj) {
|
|
|
- ExamStudentDTO dto = (ExamStudentDTO) obj;
|
|
|
- dto.setRootOrgId(exam.getOrgId());
|
|
|
- dto.setExam(exam);
|
|
|
- ExcelError error = importCheck(dto);
|
|
|
- if (error == null) {
|
|
|
- examStudents.add(examStudentAssembler.toDomain(dto));
|
|
|
- }
|
|
|
- int stu_num = examStudents.size();
|
|
|
- if (stu_num % 5000 == 0) {
|
|
|
- saveStudentList(examStudents);
|
|
|
- log.info("已导入"+stu_num+"条数据");
|
|
|
- }
|
|
|
- return error;
|
|
|
- }
|
|
|
-
|
|
|
- });
|
|
|
- int stu_num = examStudents.size();
|
|
|
- saveStudentList(examStudents);
|
|
|
- log.info("已导入"+stu_num+"条数据");
|
|
|
- log.info("导入考生结束");
|
|
|
- return excelErrors;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- private void saveStudentList(List<ExamStudent> examStudents) {
|
|
|
- for (ExamStudent examStudent : examStudents) {
|
|
|
- saveStudent(examStudent);
|
|
|
- }
|
|
|
- examStudents.removeAll(examStudents);
|
|
|
- }
|
|
|
-
|
|
|
- private ExamStudent saveStudent(ExamStudent examStudent){
|
|
|
- if(examStudent.getStudentId() == null){
|
|
|
- Student student = new Student();
|
|
|
- student.setIdentityNumber(examStudent.getIdentityNumber());
|
|
|
- student.setName(examStudent.getName());
|
|
|
- student.setStudentCode(examStudent.getStudentCode());
|
|
|
- student.setRootOrgId(examStudent.getRootOrgId());
|
|
|
- student.setOrgId(examStudent.getOrgId());
|
|
|
- User user = new User();
|
|
|
- user.setOrgId(examStudent.getOrgId());
|
|
|
- user.setEnable(true);
|
|
|
- user.setType(UserType.STUDENT);
|
|
|
- user.setRootOrgId(examStudent.getRootOrgId());
|
|
|
- student.setUser(user);
|
|
|
- student = studentService.addStudent(student);
|
|
|
- examStudent.setStudentId(student.getId());
|
|
|
- }else{
|
|
|
- Student student = studentService.getStudent(examStudent.getStudentId());
|
|
|
- student.setOrgId(examStudent.getOrgId());
|
|
|
- student.setName(examStudent.getName());
|
|
|
- student.setRootOrgId(examStudent.getRootOrgId());
|
|
|
- student.setStudentCode(examStudent.getStudentCode());
|
|
|
- student.setIdentityNumber(examStudent.getIdentityNumber());
|
|
|
- studentService.updateStudent(student);
|
|
|
- }
|
|
|
- examStudent.setFinished(false);
|
|
|
- examStudent.setGraduated(false);
|
|
|
- examStudent.setDegree(false);
|
|
|
- examStudent.setRepair(false);
|
|
|
- return examStudentRepo.save(examStudent);
|
|
|
- }
|
|
|
-
|
|
|
- public void checkExamStudent(ExamStudent examStudent){
|
|
|
- if(examStudent.getId() != null){
|
|
|
- if(examStudentRepo.checkExamStuById(examStudent.getExam().getId(),
|
|
|
- examStudent.getRootOrgId(),
|
|
|
- examStudent.getIdentityNumber(),
|
|
|
- examStudent.getCourseCode(),
|
|
|
- examStudent.getId()) > 0){
|
|
|
- throw new RuntimeException("该考生已存在");
|
|
|
- }
|
|
|
- }else{
|
|
|
- if(examStudentRepo.checkExamStu(examStudent.getExam().getId(),
|
|
|
- examStudent.getRootOrgId(),
|
|
|
- examStudent.getIdentityNumber(),
|
|
|
- examStudent.getCourseCode()) > 0){
|
|
|
- throw new RuntimeException("该考生已存在");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 考生导入验证
|
|
|
- * @param dto
|
|
|
- * @return
|
|
|
- */
|
|
|
- public ExcelError importCheck(ExamStudentDTO dto){
|
|
|
- if(StringUtils.isEmpty(dto.getName())){
|
|
|
- return new ExcelError("姓名不能为空");
|
|
|
- }
|
|
|
- if(StringUtils.isEmpty(dto.getStudentCode())||StringUtils.isEmpty(dto.getIdentityNumber())){
|
|
|
- return new ExcelError("学号或身份证号不能为空");
|
|
|
- }else{
|
|
|
- if(!StringUtils.isEmpty(dto.getStudentCode()) && dto.getStudentCode().length() < 6){
|
|
|
- return new ExcelError("学号至少为6位");
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(dto.getIdentityNumber()) && dto.getIdentityNumber().length() < 6){
|
|
|
- return new ExcelError("身份证号至少为6位");
|
|
|
- }
|
|
|
- }
|
|
|
- if(StringUtils.isEmpty(dto.getCourseCode())){
|
|
|
- return new ExcelError("课程代码不能为空");
|
|
|
- }
|
|
|
- if(StringUtils.isEmpty(dto.getOrgCode())){
|
|
|
- return new ExcelError("学习中心代码不能为空");
|
|
|
- }
|
|
|
-// if(StringUtils.isEmpty(dto.getSpecialtyCode())){
|
|
|
-// return new ExcelError("专业代码不能为空");
|
|
|
-// }
|
|
|
-//
|
|
|
-// Specialty specialty = specialtyService.findByOrgIdAndCode(dto.getOrgId(),dto.getSpecialtyCode());
|
|
|
-// if(specialty == null || !specialty.getEnable()){
|
|
|
-// return new ExcelError("专业代码不存在/被禁用");
|
|
|
-// }
|
|
|
-// dto.setSpecialtyName(specialty.getName());
|
|
|
-
|
|
|
- Course course = courseService.findByOrgIdAndCode(dto.getRootOrgId(), dto.getCourseCode());
|
|
|
- if(course == null || !course.getEnable()){
|
|
|
- return new ExcelError("课程不存在/被禁用");
|
|
|
- }
|
|
|
- dto.setCourseLevel(course.getLevel().toString());
|
|
|
- dto.setCourseName(course.getName());
|
|
|
- Org org = orgService.findByParentIdAndCode(dto.getRootOrgId(), dto.getOrgCode());
|
|
|
- if(org == null || !org.getEnable()){
|
|
|
- return new ExcelError("学习中心不存在/禁用");
|
|
|
- }
|
|
|
- dto.setOrgId(org.getId());
|
|
|
- dto.setOrgName(org.getName());
|
|
|
- stuCheck(dto);
|
|
|
- if(StringUtils.isEmpty(dto.getPaperType())){
|
|
|
- dto.setPaperType("O");
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- public void stuCheck(ExamStudentDTO dto){
|
|
|
- ExamStudent examStudent = null;
|
|
|
- if(!StringUtils.isEmpty(dto.getIdentityNumber())) {
|
|
|
- examStudent = examStudentRepo.findFirstByExamId(dto.getExam().getId(), dto.getCourseCode(), dto.getIdentityNumber());
|
|
|
- }else{
|
|
|
- examStudent = examStudentRepo.findFirstByExamId(dto.getExam().getId(), dto.getCourseCode(), dto.getStudentCode());
|
|
|
- }
|
|
|
- if(examStudent != null){
|
|
|
- dto.setId(examStudent.getId());
|
|
|
- dto.setStudentId(examStudent.getStudentId());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 照片检验
|
|
|
- * @param examId
|
|
|
- * @return
|
|
|
- */
|
|
|
- public List<ErrorMsg> photoCheck(Long examId) {
|
|
|
- List<ErrorMsg> msgs = new ArrayList<ErrorMsg>();
|
|
|
- List<ExamStudent> examStudents = examStudentRepo.findByExamId(examId);
|
|
|
- for (ExamStudent examStudent : examStudents) {
|
|
|
- ErrorMsg errorMsg = null;
|
|
|
- if(!StringUtils.isEmpty(examStudent.getStudentCode())){
|
|
|
-
|
|
|
- errorMsg = new ErrorMsg(examStudent.getStudentCode());
|
|
|
- }else if(!StringUtils.isEmpty(examStudent.getIdentityNumber())){
|
|
|
-
|
|
|
- errorMsg = new ErrorMsg(examStudent.getIdentityNumber());
|
|
|
- }
|
|
|
- if(errorMsg != null){
|
|
|
- msgs.add(errorMsg);
|
|
|
- }
|
|
|
- }
|
|
|
- return msgs;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取重考考生
|
|
|
- * @param examCriteria
|
|
|
- * @param curPage
|
|
|
- * @param pageSize
|
|
|
- * @return
|
|
|
- */
|
|
|
- public Page<ExamStudent> getReexamineStudent(CommonExamStudent examCriteria,Integer curPage,Integer pageSize){
|
|
|
- if(examCriteria.getExamId() == null){
|
|
|
- return null;
|
|
|
- }
|
|
|
- StringBuffer sql = new StringBuffer();
|
|
|
- sql.append("select "
|
|
|
- + "t1.id id,"
|
|
|
- + "t1.exam_id exam_id,"
|
|
|
- + "t1.org_id org_id,"
|
|
|
- + "t1.org_name org_name,"
|
|
|
- + "t1.course_code course_code,"
|
|
|
- + "t1.course_name course_name,"
|
|
|
- + "t1.course_level course_level,"
|
|
|
- + "t1.name name,"
|
|
|
- + "t1.student_code student_code,"
|
|
|
- + "t1.identity_number identity_number"
|
|
|
- + " from ecs_exam_student t1 "
|
|
|
- + " where t1.exam_id="+examCriteria.getExamId());
|
|
|
- sql.append(" and t1.normal_exam_times >= ( select t2.exam_times from ecs_exam t2 where t2.id = t1.exam_id ) ");
|
|
|
- //没设置重考的或者设置了重考,重考已完成的
|
|
|
- sql.append(" and ((t1.is_reexamine is null OR t1.is_reexamine = 0) OR (t1.is_reexamine = 1 and t1.reexamine_completed = 1)) ");
|
|
|
- sql.append(" and NOT EXISTS ( select * from oe_exam_record t3 where t3.exam_student_id = t1.id and t3.status = 'EXAM_ING') ");
|
|
|
- sql.append(getSqlSpecification(examCriteria));
|
|
|
- sql.append(" limit "+(curPage-1)*pageSize+","+pageSize);
|
|
|
-
|
|
|
- Exam exam = examRepo.findOne(examCriteria.getExamId());
|
|
|
- List<ExamStudent> examStudents = this.jdbcTemplate.query(sql.toString(), new RowMapper<ExamStudent>(){
|
|
|
- @Override
|
|
|
- public ExamStudent mapRow(ResultSet rs, int arg)throws SQLException {
|
|
|
- ExamStudent examStudent = new ExamStudent();
|
|
|
- examStudent.setId(rs.getLong("id"));
|
|
|
- examStudent.setExam(exam);
|
|
|
- examStudent.setOrgId(rs.getLong("org_id"));
|
|
|
- examStudent.setOrgName(rs.getString("org_name"));
|
|
|
- examStudent.setCourseCode(rs.getString("course_code"));
|
|
|
- examStudent.setCourseName(rs.getString("course_name"));
|
|
|
- examStudent.setCourseLevel(rs.getString("course_level"));
|
|
|
- examStudent.setName(rs.getString("name"));
|
|
|
- examStudent.setStudentCode(rs.getString("student_code"));
|
|
|
- examStudent.setIdentityNumber(rs.getString("identity_number"));
|
|
|
- return examStudent;
|
|
|
- }
|
|
|
- });
|
|
|
- int total = countReexamineStudent(examCriteria);
|
|
|
- return new PageImpl<>(examStudents,null,total);
|
|
|
- }
|
|
|
-
|
|
|
- private int countReexamineStudent(CommonExamStudent examCriteria) {
|
|
|
- StringBuffer sql = new StringBuffer();
|
|
|
- sql.append("select count(t1.id) from ecs_exam_student t1 where t1.normal_exam_times = ( "+
|
|
|
- " select t2.exam_times from ecs_exam t2 where t2.id = t1.exam_id "+
|
|
|
- ")");
|
|
|
- sql.append(" and t1.exam_id="+examCriteria.getExamId());
|
|
|
- //没设置重考的或者设置了重考,重考已完成的
|
|
|
- sql.append(" and ((t1.is_reexamine is null OR t1.is_reexamine = 0) OR (t1.is_reexamine = 1 and t1.reexamine_completed = 1)) ");
|
|
|
- sql.append(" and NOT EXISTS ( select * from oe_exam_record t3 where t3.exam_student_id = t1.id and t3.status = 'EXAM_ING') ");
|
|
|
- sql.append(getSqlSpecification(examCriteria));
|
|
|
- return this.jdbcTemplate.queryForObject(sql.toString(), Integer.class);
|
|
|
- }
|
|
|
-
|
|
|
- private String getSqlSpecification(CommonExamStudent examCriteria){
|
|
|
- StringBuffer sql = new StringBuffer("");
|
|
|
- if(!StringUtils.isEmpty(examCriteria.getOrgId())){
|
|
|
- sql.append(" and t1.org_id = "+examCriteria.getOrgId());
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(examCriteria.getName())){
|
|
|
- sql.append(" and t1.name LIKE '%"+examCriteria.getName()+"%'");
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(examCriteria.getStudentCode())){
|
|
|
- sql.append(" and t1.student_code LIKE '%"+examCriteria.getStudentCode()+"%'");
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(examCriteria.getCourseCode())){
|
|
|
- sql.append(" and t1.course_code = '"+examCriteria.getCourseCode()+"'");
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(examCriteria.getCourseLevel())){
|
|
|
- sql.append(" and t1.course_level = '"+examCriteria.getCourseLevel()+"'");
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(examCriteria.getIdentityNumber())){
|
|
|
- sql.append(" and t1.identity_number LIKE '%"+examCriteria.getIdentityNumber()+"%'");
|
|
|
- }
|
|
|
- sql.append(" order by t1.id ");
|
|
|
- return sql.toString();
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 生成查询条件
|
|
|
- * @param examCriteria
|
|
|
- * @return
|
|
|
- */
|
|
|
- private Specification<ExamStudent> getSpecification(ExamStudentDTO examCriteria) {
|
|
|
- Specification<ExamStudent> specification = (root, query, cb) -> {
|
|
|
- List<Predicate> predicates = new ArrayList<>();
|
|
|
- if(!StringUtils.isEmpty(examCriteria.getStudentId())){
|
|
|
- predicates.add(cb.equal(root.get("studentId"),examCriteria.getStudentId()));
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(examCriteria.getRootOrgId())){
|
|
|
- predicates.add(cb.equal(root.get("rootOrgId"),examCriteria.getRootOrgId()));
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(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(!StringUtils.isEmpty(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(!StringUtils.isEmpty(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(!StringUtils.isEmpty(examCriteria.getDegree())){
|
|
|
- predicates.add(cb.equal(root.get("degree"),examCriteria.getDegree()));
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(examCriteria.getRepair())){
|
|
|
- predicates.add(cb.equal(root.get("repair"),examCriteria.getRepair()));
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(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(!StringUtils.isEmpty(examCriteria.getStudentId())){
|
|
|
- predicates.add(cb.equal(root.get("studentId"),examCriteria.getStudentId()));
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(examCriteria.getRootOrgId())){
|
|
|
- predicates.add(cb.equal(root.get("rootOrgId"),examCriteria.getRootOrgId()));
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(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(!StringUtils.isEmpty(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(!StringUtils.isEmpty(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(!StringUtils.isEmpty(examCriteria.getDegree())){
|
|
|
- predicates.add(cb.equal(root.get("degree"),examCriteria.getDegree()));
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(examCriteria.getRepair())){
|
|
|
- predicates.add(cb.equal(root.get("repair"),examCriteria.getRepair()));
|
|
|
- }
|
|
|
- if(!StringUtils.isEmpty(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.setNormalExamTimes(null);
|
|
|
- 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();
|
|
|
- }
|
|
|
-
|
|
|
- public void deleteExamStudent(List<Long> ids)throws Exception{
|
|
|
- List<ExamStudent> examStudents = examStudentRepo.findByIdIn(ids);
|
|
|
- for(ExamStudent examStudent : examStudents){
|
|
|
- if(examStudent.getExam().getCanStuDel()){
|
|
|
- examStudentRepo.delete(examStudent);
|
|
|
- }else{
|
|
|
- throw new RuntimeException(examStudent.getName()+"已开始考试,不能删除");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public void deleteExamStudents(Long examId)throws Exception{
|
|
|
- Exam exam = examRepo.findOne(examId);
|
|
|
- if(exam.getCanStuDel()){
|
|
|
- examStudentRepo.deleteByExamId(examId);
|
|
|
- }else{
|
|
|
- throw new RuntimeException("该考试已开始,不能删除");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 学习中心考试进度信息
|
|
|
- * @param examId
|
|
|
- * @param orgCode
|
|
|
- * @return
|
|
|
- */
|
|
|
- public List<OrgExamInfoDTO> findOrgExamInfos(String examId, String orgCode){
|
|
|
- if(!StringUtils.hasLength(examId)){
|
|
|
- return null;
|
|
|
- }
|
|
|
- StringBuilder sql = new StringBuilder();
|
|
|
- sql.append("select t.org_id orgid,"+
|
|
|
- " t.org_code orgcode,"+
|
|
|
- " t.org_name orgname,"+
|
|
|
- " count(t.id) allNum,"+
|
|
|
- " sum(case when t.finished = 1 then 1 else 0 end) completedNum "+
|
|
|
- " from ecs_exam_student t"+
|
|
|
- " where t.exam_id = ?");
|
|
|
- if(StringUtils.hasLength(orgCode)){
|
|
|
- sql.append(" and t.org_code = '"+orgCode+"'");
|
|
|
- }
|
|
|
- sql.append(" group by t.org_id, t.org_name order by t.org_id");
|
|
|
- return jdbcTemplate.query(sql.toString(),new Object[]{examId}, new RowMapper<OrgExamInfoDTO>(){
|
|
|
- @Override
|
|
|
- public OrgExamInfoDTO mapRow(ResultSet rs, int rowNum)throws SQLException {
|
|
|
- OrgExamInfoDTO orgExamInfoDTO = new OrgExamInfoDTO();
|
|
|
- orgExamInfoDTO.setOrgId(rs.getLong("orgid")+"");
|
|
|
- orgExamInfoDTO.setOrgCode(rs.getString("orgcode"));
|
|
|
- orgExamInfoDTO.setOrgName(rs.getString("orgname"));
|
|
|
- orgExamInfoDTO.setAllNum(rs.getInt("allNum"));
|
|
|
- orgExamInfoDTO.setCompletedNum(rs.getInt("completedNum"));
|
|
|
- if(orgExamInfoDTO.getCompletedNum()==0){
|
|
|
- orgExamInfoDTO.setProportion("0");
|
|
|
- }else{
|
|
|
- DecimalFormat df = new DecimalFormat("#.00");
|
|
|
- double proportion = (double) orgExamInfoDTO.getCompletedNum()/ orgExamInfoDTO.getAllNum();
|
|
|
- orgExamInfoDTO.setProportion(df.format(proportion*100));
|
|
|
- }
|
|
|
- return orgExamInfoDTO;
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 根据考试和学习中心查询课程
|
|
|
- * @param examId
|
|
|
- * @param orgId
|
|
|
- * @return
|
|
|
- */
|
|
|
- public List<Course> findCoursesFromExamStudent(String examId,String orgId){
|
|
|
- List<Object> paramsList = new ArrayList<Object>();
|
|
|
- if(StringUtils.isEmpty(examId)){
|
|
|
- return null;
|
|
|
- }
|
|
|
- StringBuilder sql = new StringBuilder();
|
|
|
- paramsList.add(examId);
|
|
|
- sql.append("SELECT t.course_code course_code,"
|
|
|
- + "t.course_level course_level,"
|
|
|
- + "t.course_name course_name "+
|
|
|
- " FROM ecs_exam_student t "+
|
|
|
- " where t.exam_id = ? ");
|
|
|
-
|
|
|
- if(!StringUtils.isEmpty(orgId)){
|
|
|
- sql.append(" and t.org_id = ? ");
|
|
|
- paramsList.add(orgId);
|
|
|
- }
|
|
|
- sql.append(" group by course_code");
|
|
|
- Object[] params = new Object[paramsList.size()];
|
|
|
- for(int i = 0;i<paramsList.size();i++){
|
|
|
- params[i] = paramsList.get(i);
|
|
|
- }
|
|
|
- return jdbcTemplate.query(sql.toString(),params,new RowMapper<Course>(){
|
|
|
- @Override
|
|
|
- public Course mapRow(ResultSet resultSet, int rowNum) throws SQLException {
|
|
|
- Course course = new Course();
|
|
|
- course.setCode(resultSet.getString("course_code"));
|
|
|
- course.setName(resultSet.getString("course_name"));
|
|
|
- return course;
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 当考生进入考试时
|
|
|
- * 1.设置考生不缺考
|
|
|
- * 2.考生考试次数加1
|
|
|
- * @param examStuId
|
|
|
- */
|
|
|
- public void updateExamStudentInfo(Long examStuId){
|
|
|
- ExamStudent examStudent = examStudentRepo.findOne(examStuId);
|
|
|
- examStudent.setFinished(true);
|
|
|
- /**
|
|
|
- * 进入考试时,判断正常考试次数是否小于考试信息(ecs_exam)中的考试次数
|
|
|
- * 如果是,考试次数加一,将重考标识设置成false
|
|
|
- */
|
|
|
- long examTimes = examStudent.getExam().getExamTimes();
|
|
|
- if(examTimes > examStudent.getNormalExamTimes()){
|
|
|
- examStudent.setNormalExamTimes(examStudent.getNormalExamTimes()+1);
|
|
|
- examStudent.setIsReexamine(null);
|
|
|
- examStudent.setReexamineCompleted(null);
|
|
|
- }
|
|
|
- //考生开始重考时,将重考已完成设置为true
|
|
|
- if(examStudent.getIsReexamine()!=null&&examStudent.getIsReexamine()){
|
|
|
- examStudent.setReexamineCompleted(true);
|
|
|
- }
|
|
|
- examStudentRepo.save(examStudent);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 设置考生重考信息
|
|
|
- * @param commonExamStudent
|
|
|
- */
|
|
|
- public void setExamStudentIsReexamine(CommonExamStudent commonExamStudent){
|
|
|
- if(commonExamStudent.getId() == null){
|
|
|
- return;
|
|
|
- }
|
|
|
- ExamStudent examStudent = examStudentRepo.findOne(commonExamStudent.getId());
|
|
|
- if(examStudent!=null){
|
|
|
- examStudent.setIsReexamine(true);
|
|
|
- //设置了重考,但考生重考未完成,考生开始重考时,该字段改为true
|
|
|
- examStudent.setReexamineCompleted(false);
|
|
|
- examStudent.setReexamineType(commonExamStudent.getReexamineType());
|
|
|
- examStudent.setReexamineDetail(commonExamStudent.getReexamineDetail());
|
|
|
- examStudentRepo.save(examStudent);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 按照数量限制查询考生
|
|
|
- * @param examId 考试ID
|
|
|
- * @param startLimit 数量开始限制
|
|
|
- * @param endLimit 数量结束限制
|
|
|
- * @return
|
|
|
- */
|
|
|
- public List<ExamStudent> getExamStudentByLimit(Long examId, Integer startLimit,Integer endLimit) {
|
|
|
- if(examId==null||startLimit==null||endLimit==null||startLimit>endLimit){
|
|
|
- return null;
|
|
|
- }
|
|
|
- return examStudentRepo.findByLimit(examId, startLimit-1,(endLimit-startLimit+1));
|
|
|
- }
|
|
|
-}
|
|
|
+package cn.com.qmth.examcloud.service.examwork.service;
|
|
|
+
|
|
|
+import java.io.InputStream;
|
|
|
+import java.sql.ResultSet;
|
|
|
+import java.sql.SQLException;
|
|
|
+import java.text.DecimalFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+import javax.persistence.criteria.Predicate;
|
|
|
+
|
|
|
+import cn.com.qmth.examcloud.common.util.BeanCopierUtil;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.dao.ExamOrgTimeRepo;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.entity.ExamOrgTime;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.enums.ExamType;
|
|
|
+
|
|
|
+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.data.domain.Sort;
|
|
|
+import org.springframework.data.domain.Sort.Direction;
|
|
|
+import org.springframework.data.jpa.domain.Specification;
|
|
|
+import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
+import org.springframework.jdbc.core.RowMapper;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
+
|
|
|
+import cn.com.qmth.examcloud.common.dto.core.Course;
|
|
|
+import cn.com.qmth.examcloud.common.dto.core.Org;
|
|
|
+import cn.com.qmth.examcloud.common.dto.core.Student;
|
|
|
+import cn.com.qmth.examcloud.common.dto.core.User;
|
|
|
+import cn.com.qmth.examcloud.common.dto.core.enums.UserType;
|
|
|
+import cn.com.qmth.examcloud.common.dto.examwork.CommonExamStudent;
|
|
|
+import cn.com.qmth.examcloud.common.util.ErrorMsg;
|
|
|
+import cn.com.qmth.examcloud.common.util.excel.ExcelError;
|
|
|
+import cn.com.qmth.examcloud.common.util.excel.ExcelReader;
|
|
|
+import cn.com.qmth.examcloud.common.util.excel.ExcelReaderHandle;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.assembler.ExamStudentAssembler;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.dao.ExamRepo;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.dao.ExamStudentRepo;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.dto.ExamStudentDTO;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.dto.OrgExamInfoDTO;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.entity.Exam;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.entity.ExamStudent;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.service.rpc.CourseService;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.service.rpc.OrgService;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.service.rpc.SpecialtyService;
|
|
|
+import cn.com.qmth.examcloud.service.examwork.service.rpc.StudentService;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 考试学生服务类
|
|
|
+ * Created by songyue on 17/1/14.
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class ExamStudentService {
|
|
|
+
|
|
|
+ protected static final Logger log = LoggerFactory.getLogger(ExamStudentService.class);
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ ExamStudentRepo examStudentRepo;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ ExamRepo examRepo;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ ExamStudentAssembler examStudentAssembler;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ StudentService studentService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ CourseService courseService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ OrgService orgService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private JdbcTemplate jdbcTemplate;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ SpecialtyService specialtyService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ ExamOrgTimeRepo examOrgTimeRepo;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有考试学生(分页)
|
|
|
+ * @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 examStudent
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public ExamStudent saveExamStudent(ExamStudent examStudent)throws Exception{
|
|
|
+ checkExamStudent(examStudent);
|
|
|
+ return saveStudent(examStudent);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 导入考试学生
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<ExcelError> importExamStudent(Long examId, InputStream inputStream) {
|
|
|
+ log.info("导入考生开始");
|
|
|
+ Exam exam = examRepo.findOne(examId);
|
|
|
+ List<ExcelError> excelErrors = new ArrayList<ExcelError>();
|
|
|
+ if(exam == null){
|
|
|
+ ExcelError excelError = new ExcelError(1,"请先创建考试");
|
|
|
+ excelErrors.add(excelError);
|
|
|
+ return excelErrors;
|
|
|
+ }
|
|
|
+ List<ExamStudent> examStudents = new ArrayList<ExamStudent>();
|
|
|
+ ExcelReader excelReader = new ExcelReader(ExamStudentDTO.class);
|
|
|
+ excelErrors = excelReader.reader(inputStream, new ExcelReaderHandle() {
|
|
|
+ @Override
|
|
|
+ public ExcelError handle(Object obj) {
|
|
|
+ ExamStudentDTO dto = (ExamStudentDTO) obj;
|
|
|
+ dto.setRootOrgId(exam.getOrgId());
|
|
|
+ dto.setExam(exam);
|
|
|
+ ExcelError error = importCheck(dto);
|
|
|
+ if (error == null) {
|
|
|
+ examStudents.add(examStudentAssembler.toDomain(dto));
|
|
|
+ }
|
|
|
+ int stu_num = examStudents.size();
|
|
|
+ if (stu_num % 5000 == 0) {
|
|
|
+ saveStudentList(examStudents);
|
|
|
+ log.info("已导入"+stu_num+"条数据");
|
|
|
+ }
|
|
|
+ return error;
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ int stu_num = examStudents.size();
|
|
|
+ saveStudentList(examStudents);
|
|
|
+ log.info("已导入"+stu_num+"条数据");
|
|
|
+ log.info("导入考生结束");
|
|
|
+ return excelErrors;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void saveStudentList(List<ExamStudent> examStudents) {
|
|
|
+ for (ExamStudent examStudent : examStudents) {
|
|
|
+ saveStudent(examStudent);
|
|
|
+ }
|
|
|
+ examStudents.removeAll(examStudents);
|
|
|
+ }
|
|
|
+
|
|
|
+ private ExamStudent saveStudent(ExamStudent examStudent){
|
|
|
+ if(examStudent.getStudentId() == null){
|
|
|
+ Student student = new Student();
|
|
|
+ student.setIdentityNumber(examStudent.getIdentityNumber());
|
|
|
+ student.setName(examStudent.getName());
|
|
|
+ student.setStudentCode(examStudent.getStudentCode());
|
|
|
+ student.setRootOrgId(examStudent.getRootOrgId());
|
|
|
+ student.setOrgId(examStudent.getOrgId());
|
|
|
+ User user = new User();
|
|
|
+ user.setOrgId(examStudent.getOrgId());
|
|
|
+ user.setEnable(true);
|
|
|
+ user.setType(UserType.STUDENT);
|
|
|
+ user.setRootOrgId(examStudent.getRootOrgId());
|
|
|
+ student.setUser(user);
|
|
|
+ student = studentService.addStudent(student);
|
|
|
+ examStudent.setStudentId(student.getId());
|
|
|
+ }else{
|
|
|
+ Student student = studentService.getStudent(examStudent.getStudentId());
|
|
|
+ student.setOrgId(examStudent.getOrgId());
|
|
|
+ student.setName(examStudent.getName());
|
|
|
+ student.setRootOrgId(examStudent.getRootOrgId());
|
|
|
+ student.setStudentCode(examStudent.getStudentCode());
|
|
|
+ student.setIdentityNumber(examStudent.getIdentityNumber());
|
|
|
+ studentService.updateStudent(student);
|
|
|
+ }
|
|
|
+ examStudent.setFinished(false);
|
|
|
+ examStudent.setGraduated(false);
|
|
|
+ examStudent.setDegree(false);
|
|
|
+ examStudent.setRepair(false);
|
|
|
+ return examStudentRepo.save(examStudent);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void checkExamStudent(ExamStudent examStudent){
|
|
|
+ if(examStudent.getId() != null){
|
|
|
+ if(examStudentRepo.checkExamStuById(examStudent.getExam().getId(),
|
|
|
+ examStudent.getRootOrgId(),
|
|
|
+ examStudent.getIdentityNumber(),
|
|
|
+ examStudent.getCourseCode(),
|
|
|
+ examStudent.getId()) > 0){
|
|
|
+ throw new RuntimeException("该考生已存在");
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if(examStudentRepo.checkExamStu(examStudent.getExam().getId(),
|
|
|
+ examStudent.getRootOrgId(),
|
|
|
+ examStudent.getIdentityNumber(),
|
|
|
+ examStudent.getCourseCode()) > 0){
|
|
|
+ throw new RuntimeException("该考生已存在");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 考生导入验证
|
|
|
+ * @param dto
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public ExcelError importCheck(ExamStudentDTO dto){
|
|
|
+ if(StringUtils.isEmpty(dto.getName())){
|
|
|
+ return new ExcelError("姓名不能为空");
|
|
|
+ }
|
|
|
+ if(StringUtils.isEmpty(dto.getStudentCode())||StringUtils.isEmpty(dto.getIdentityNumber())){
|
|
|
+ return new ExcelError("学号或身份证号不能为空");
|
|
|
+ }else{
|
|
|
+ if(!StringUtils.isEmpty(dto.getStudentCode()) && dto.getStudentCode().length() < 6){
|
|
|
+ return new ExcelError("学号至少为6位");
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(dto.getIdentityNumber()) && dto.getIdentityNumber().length() < 6){
|
|
|
+ return new ExcelError("身份证号至少为6位");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(StringUtils.isEmpty(dto.getCourseCode())){
|
|
|
+ return new ExcelError("课程代码不能为空");
|
|
|
+ }
|
|
|
+ if(StringUtils.isEmpty(dto.getOrgCode())){
|
|
|
+ return new ExcelError("学习中心代码不能为空");
|
|
|
+ }
|
|
|
+// if(StringUtils.isEmpty(dto.getSpecialtyCode())){
|
|
|
+// return new ExcelError("专业代码不能为空");
|
|
|
+// }
|
|
|
+//
|
|
|
+// Specialty specialty = specialtyService.findByOrgIdAndCode(dto.getOrgId(),dto.getSpecialtyCode());
|
|
|
+// if(specialty == null || !specialty.getEnable()){
|
|
|
+// return new ExcelError("专业代码不存在/被禁用");
|
|
|
+// }
|
|
|
+// dto.setSpecialtyName(specialty.getName());
|
|
|
+
|
|
|
+ Course course = courseService.findByOrgIdAndCode(dto.getRootOrgId(), dto.getCourseCode());
|
|
|
+ if(course == null || !course.getEnable()){
|
|
|
+ return new ExcelError("课程不存在/被禁用");
|
|
|
+ }
|
|
|
+ dto.setCourseLevel(course.getLevel().toString());
|
|
|
+ dto.setCourseName(course.getName());
|
|
|
+ Org org = orgService.findByParentIdAndCode(dto.getRootOrgId(), dto.getOrgCode());
|
|
|
+ if(org == null || !org.getEnable()){
|
|
|
+ return new ExcelError("学习中心不存在/禁用");
|
|
|
+ }
|
|
|
+ dto.setOrgId(org.getId());
|
|
|
+ dto.setOrgName(org.getName());
|
|
|
+ stuCheck(dto);
|
|
|
+ if(StringUtils.isEmpty(dto.getPaperType())){
|
|
|
+ dto.setPaperType("O");
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void stuCheck(ExamStudentDTO dto){
|
|
|
+ ExamStudent examStudent = null;
|
|
|
+ if(!StringUtils.isEmpty(dto.getIdentityNumber())) {
|
|
|
+ examStudent = examStudentRepo.findFirstByExamId(dto.getExam().getId(), dto.getCourseCode(), dto.getIdentityNumber());
|
|
|
+ }else{
|
|
|
+ examStudent = examStudentRepo.findFirstByExamId(dto.getExam().getId(), dto.getCourseCode(), dto.getStudentCode());
|
|
|
+ }
|
|
|
+ if(examStudent != null){
|
|
|
+ dto.setId(examStudent.getId());
|
|
|
+ dto.setStudentId(examStudent.getStudentId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 照片检验
|
|
|
+ * @param examId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<ErrorMsg> photoCheck(Long examId) {
|
|
|
+ List<ErrorMsg> msgs = new ArrayList<ErrorMsg>();
|
|
|
+ List<ExamStudent> examStudents = examStudentRepo.findByExamId(examId);
|
|
|
+ for (ExamStudent examStudent : examStudents) {
|
|
|
+ ErrorMsg errorMsg = null;
|
|
|
+ if(!StringUtils.isEmpty(examStudent.getStudentCode())){
|
|
|
+
|
|
|
+ errorMsg = new ErrorMsg(examStudent.getStudentCode());
|
|
|
+ }else if(!StringUtils.isEmpty(examStudent.getIdentityNumber())){
|
|
|
+
|
|
|
+ errorMsg = new ErrorMsg(examStudent.getIdentityNumber());
|
|
|
+ }
|
|
|
+ if(errorMsg != null){
|
|
|
+ msgs.add(errorMsg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return msgs;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取重考考生
|
|
|
+ * @param examCriteria
|
|
|
+ * @param curPage
|
|
|
+ * @param pageSize
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Page<ExamStudent> getReexamineStudent(CommonExamStudent examCriteria,Integer curPage,Integer pageSize){
|
|
|
+ if(examCriteria.getExamId() == null){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ StringBuffer sql = new StringBuffer();
|
|
|
+ sql.append("select "
|
|
|
+ + "t1.id id,"
|
|
|
+ + "t1.exam_id exam_id,"
|
|
|
+ + "t1.org_id org_id,"
|
|
|
+ + "t1.org_name org_name,"
|
|
|
+ + "t1.course_code course_code,"
|
|
|
+ + "t1.course_name course_name,"
|
|
|
+ + "t1.course_level course_level,"
|
|
|
+ + "t1.name name,"
|
|
|
+ + "t1.student_code student_code,"
|
|
|
+ + "t1.identity_number identity_number"
|
|
|
+ + " from ecs_exam_student t1 "
|
|
|
+ + " where t1.exam_id="+examCriteria.getExamId());
|
|
|
+ sql.append(" and t1.normal_exam_times >= ( select t2.exam_times from ecs_exam t2 where t2.id = t1.exam_id ) ");
|
|
|
+ //没设置重考的或者设置了重考,重考已完成的
|
|
|
+ sql.append(" and ((t1.is_reexamine is null OR t1.is_reexamine = 0) OR (t1.is_reexamine = 1 and t1.reexamine_completed = 1)) ");
|
|
|
+ sql.append(" and NOT EXISTS ( select * from oe_exam_record t3 where t3.exam_student_id = t1.id and t3.status = 'EXAM_ING') ");
|
|
|
+ sql.append(getSqlSpecification(examCriteria));
|
|
|
+ sql.append(" limit "+(curPage-1)*pageSize+","+pageSize);
|
|
|
+
|
|
|
+ Exam exam = examRepo.findOne(examCriteria.getExamId());
|
|
|
+ List<ExamStudent> examStudents = this.jdbcTemplate.query(sql.toString(), new RowMapper<ExamStudent>(){
|
|
|
+ @Override
|
|
|
+ public ExamStudent mapRow(ResultSet rs, int arg)throws SQLException {
|
|
|
+ ExamStudent examStudent = new ExamStudent();
|
|
|
+ examStudent.setId(rs.getLong("id"));
|
|
|
+ examStudent.setExam(exam);
|
|
|
+ examStudent.setOrgId(rs.getLong("org_id"));
|
|
|
+ examStudent.setOrgName(rs.getString("org_name"));
|
|
|
+ examStudent.setCourseCode(rs.getString("course_code"));
|
|
|
+ examStudent.setCourseName(rs.getString("course_name"));
|
|
|
+ examStudent.setCourseLevel(rs.getString("course_level"));
|
|
|
+ examStudent.setName(rs.getString("name"));
|
|
|
+ examStudent.setStudentCode(rs.getString("student_code"));
|
|
|
+ examStudent.setIdentityNumber(rs.getString("identity_number"));
|
|
|
+ return examStudent;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ int total = countReexamineStudent(examCriteria);
|
|
|
+ return new PageImpl<>(examStudents,null,total);
|
|
|
+ }
|
|
|
+
|
|
|
+ private int countReexamineStudent(CommonExamStudent examCriteria) {
|
|
|
+ StringBuffer sql = new StringBuffer();
|
|
|
+ sql.append("select count(t1.id) from ecs_exam_student t1 where t1.normal_exam_times = ( "+
|
|
|
+ " select t2.exam_times from ecs_exam t2 where t2.id = t1.exam_id "+
|
|
|
+ ")");
|
|
|
+ sql.append(" and t1.exam_id="+examCriteria.getExamId());
|
|
|
+ //没设置重考的或者设置了重考,重考已完成的
|
|
|
+ sql.append(" and ((t1.is_reexamine is null OR t1.is_reexamine = 0) OR (t1.is_reexamine = 1 and t1.reexamine_completed = 1)) ");
|
|
|
+ sql.append(" and NOT EXISTS ( select * from oe_exam_record t3 where t3.exam_student_id = t1.id and t3.status = 'EXAM_ING') ");
|
|
|
+ sql.append(getSqlSpecification(examCriteria));
|
|
|
+ return this.jdbcTemplate.queryForObject(sql.toString(), Integer.class);
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getSqlSpecification(CommonExamStudent examCriteria){
|
|
|
+ StringBuffer sql = new StringBuffer("");
|
|
|
+ if(!StringUtils.isEmpty(examCriteria.getOrgId())){
|
|
|
+ sql.append(" and t1.org_id = "+examCriteria.getOrgId());
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(examCriteria.getName())){
|
|
|
+ sql.append(" and t1.name LIKE '%"+examCriteria.getName()+"%'");
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(examCriteria.getStudentCode())){
|
|
|
+ sql.append(" and t1.student_code LIKE '%"+examCriteria.getStudentCode()+"%'");
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(examCriteria.getCourseCode())){
|
|
|
+ sql.append(" and t1.course_code = '"+examCriteria.getCourseCode()+"'");
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(examCriteria.getCourseLevel())){
|
|
|
+ sql.append(" and t1.course_level = '"+examCriteria.getCourseLevel()+"'");
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(examCriteria.getIdentityNumber())){
|
|
|
+ sql.append(" and t1.identity_number LIKE '%"+examCriteria.getIdentityNumber()+"%'");
|
|
|
+ }
|
|
|
+ sql.append(" order by t1.id ");
|
|
|
+ return sql.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成查询条件
|
|
|
+ * @param examCriteria
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Specification<ExamStudent> getSpecification(ExamStudentDTO examCriteria) {
|
|
|
+ Specification<ExamStudent> specification = (root, query, cb) -> {
|
|
|
+ List<Predicate> predicates = new ArrayList<>();
|
|
|
+ if(!StringUtils.isEmpty(examCriteria.getStudentId())){
|
|
|
+ predicates.add(cb.equal(root.get("studentId"),examCriteria.getStudentId()));
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(examCriteria.getRootOrgId())){
|
|
|
+ predicates.add(cb.equal(root.get("rootOrgId"),examCriteria.getRootOrgId()));
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(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(!StringUtils.isEmpty(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(!StringUtils.isEmpty(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(!StringUtils.isEmpty(examCriteria.getDegree())){
|
|
|
+ predicates.add(cb.equal(root.get("degree"),examCriteria.getDegree()));
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(examCriteria.getRepair())){
|
|
|
+ predicates.add(cb.equal(root.get("repair"),examCriteria.getRepair()));
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(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(!StringUtils.isEmpty(examCriteria.getStudentId())){
|
|
|
+ predicates.add(cb.equal(root.get("studentId"),examCriteria.getStudentId()));
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(examCriteria.getRootOrgId())){
|
|
|
+ predicates.add(cb.equal(root.get("rootOrgId"),examCriteria.getRootOrgId()));
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(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(!StringUtils.isEmpty(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(!StringUtils.isEmpty(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(!StringUtils.isEmpty(examCriteria.getDegree())){
|
|
|
+ predicates.add(cb.equal(root.get("degree"),examCriteria.getDegree()));
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(examCriteria.getRepair())){
|
|
|
+ predicates.add(cb.equal(root.get("repair"),examCriteria.getRepair()));
|
|
|
+ }
|
|
|
+ if(!StringUtils.isEmpty(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.setNormalExamTimes(null);
|
|
|
+ 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();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void deleteExamStudent(List<Long> ids)throws Exception{
|
|
|
+ List<ExamStudent> examStudents = examStudentRepo.findByIdIn(ids);
|
|
|
+ for(ExamStudent examStudent : examStudents){
|
|
|
+ if(examStudent.getExam().getCanStuDel()){
|
|
|
+ examStudentRepo.delete(examStudent);
|
|
|
+ }else{
|
|
|
+ throw new RuntimeException(examStudent.getName()+"已开始考试,不能删除");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void deleteExamStudents(Long examId)throws Exception{
|
|
|
+ Exam exam = examRepo.findOne(examId);
|
|
|
+ if(exam.getCanStuDel()){
|
|
|
+ examStudentRepo.deleteByExamId(examId);
|
|
|
+ }else{
|
|
|
+ throw new RuntimeException("该考试已开始,不能删除");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 学习中心考试进度信息
|
|
|
+ * @param examId
|
|
|
+ * @param orgCode
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<OrgExamInfoDTO> findOrgExamInfos(String examId, String orgCode){
|
|
|
+ if(!StringUtils.hasLength(examId)){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ StringBuilder sql = new StringBuilder();
|
|
|
+ sql.append("select t.org_id orgid,"+
|
|
|
+ " t.org_code orgcode,"+
|
|
|
+ " t.org_name orgname,"+
|
|
|
+ " count(t.id) allNum,"+
|
|
|
+ " sum(case when t.finished = 1 then 1 else 0 end) completedNum "+
|
|
|
+ " from ecs_exam_student t"+
|
|
|
+ " where t.exam_id = ?");
|
|
|
+ if(StringUtils.hasLength(orgCode)){
|
|
|
+ sql.append(" and t.org_code = '"+orgCode+"'");
|
|
|
+ }
|
|
|
+ sql.append(" group by t.org_id, t.org_name order by t.org_id");
|
|
|
+ return jdbcTemplate.query(sql.toString(),new Object[]{examId}, new RowMapper<OrgExamInfoDTO>(){
|
|
|
+ @Override
|
|
|
+ public OrgExamInfoDTO mapRow(ResultSet rs, int rowNum)throws SQLException {
|
|
|
+ OrgExamInfoDTO orgExamInfoDTO = new OrgExamInfoDTO();
|
|
|
+ orgExamInfoDTO.setOrgId(rs.getLong("orgid")+"");
|
|
|
+ orgExamInfoDTO.setOrgCode(rs.getString("orgcode"));
|
|
|
+ orgExamInfoDTO.setOrgName(rs.getString("orgname"));
|
|
|
+ orgExamInfoDTO.setAllNum(rs.getInt("allNum"));
|
|
|
+ orgExamInfoDTO.setCompletedNum(rs.getInt("completedNum"));
|
|
|
+ if(orgExamInfoDTO.getCompletedNum()==0){
|
|
|
+ orgExamInfoDTO.setProportion("0");
|
|
|
+ }else{
|
|
|
+ DecimalFormat df = new DecimalFormat("#.00");
|
|
|
+ double proportion = (double) orgExamInfoDTO.getCompletedNum()/ orgExamInfoDTO.getAllNum();
|
|
|
+ orgExamInfoDTO.setProportion(df.format(proportion*100));
|
|
|
+ }
|
|
|
+ return orgExamInfoDTO;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据考试和学习中心查询课程
|
|
|
+ * @param examId
|
|
|
+ * @param orgId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<Course> findCoursesFromExamStudent(String examId,String orgId){
|
|
|
+ List<Object> paramsList = new ArrayList<Object>();
|
|
|
+ if(StringUtils.isEmpty(examId)){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ StringBuilder sql = new StringBuilder();
|
|
|
+ paramsList.add(examId);
|
|
|
+ sql.append("SELECT t.course_code course_code,"
|
|
|
+ + "t.course_level course_level,"
|
|
|
+ + "t.course_name course_name "+
|
|
|
+ " FROM ecs_exam_student t "+
|
|
|
+ " where t.exam_id = ? ");
|
|
|
+
|
|
|
+ if(!StringUtils.isEmpty(orgId)){
|
|
|
+ sql.append(" and t.org_id = ? ");
|
|
|
+ paramsList.add(orgId);
|
|
|
+ }
|
|
|
+ sql.append(" group by course_code");
|
|
|
+ Object[] params = new Object[paramsList.size()];
|
|
|
+ for(int i = 0;i<paramsList.size();i++){
|
|
|
+ params[i] = paramsList.get(i);
|
|
|
+ }
|
|
|
+ return jdbcTemplate.query(sql.toString(),params,new RowMapper<Course>(){
|
|
|
+ @Override
|
|
|
+ public Course mapRow(ResultSet resultSet, int rowNum) throws SQLException {
|
|
|
+ Course course = new Course();
|
|
|
+ course.setCode(resultSet.getString("course_code"));
|
|
|
+ course.setName(resultSet.getString("course_name"));
|
|
|
+ return course;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 当考生进入考试时
|
|
|
+ * 1.设置考生不缺考
|
|
|
+ * 2.考生考试次数加1
|
|
|
+ * @param examStuId
|
|
|
+ */
|
|
|
+ public void updateExamStudentInfo(Long examStuId){
|
|
|
+ ExamStudent examStudent = examStudentRepo.findOne(examStuId);
|
|
|
+ examStudent.setFinished(true);
|
|
|
+ /**
|
|
|
+ * 进入考试时,判断正常考试次数是否小于考试信息(ecs_exam)中的考试次数
|
|
|
+ * 如果是,考试次数加一,将重考标识设置成false
|
|
|
+ */
|
|
|
+ long examTimes = examStudent.getExam().getExamTimes();
|
|
|
+ if(examTimes > examStudent.getNormalExamTimes()){
|
|
|
+ examStudent.setNormalExamTimes(examStudent.getNormalExamTimes()+1);
|
|
|
+ examStudent.setIsReexamine(null);
|
|
|
+ examStudent.setReexamineCompleted(null);
|
|
|
+ }
|
|
|
+ //考生开始重考时,将重考已完成设置为true
|
|
|
+ if(examStudent.getIsReexamine()!=null&&examStudent.getIsReexamine()){
|
|
|
+ examStudent.setReexamineCompleted(true);
|
|
|
+ }
|
|
|
+ examStudentRepo.save(examStudent);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置考生重考信息
|
|
|
+ * @param commonExamStudent
|
|
|
+ */
|
|
|
+ public void setExamStudentIsReexamine(CommonExamStudent commonExamStudent){
|
|
|
+ if(commonExamStudent.getId() == null){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ ExamStudent examStudent = examStudentRepo.findOne(commonExamStudent.getId());
|
|
|
+ if(examStudent!=null){
|
|
|
+ examStudent.setIsReexamine(true);
|
|
|
+ //设置了重考,但考生重考未完成,考生开始重考时,该字段改为true
|
|
|
+ examStudent.setReexamineCompleted(false);
|
|
|
+ examStudent.setReexamineType(commonExamStudent.getReexamineType());
|
|
|
+ examStudent.setReexamineDetail(commonExamStudent.getReexamineDetail());
|
|
|
+ examStudentRepo.save(examStudent);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按照数量限制查询考生
|
|
|
+ * @param examId 考试ID
|
|
|
+ * @param startLimit 数量开始限制
|
|
|
+ * @param endLimit 数量结束限制
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<ExamStudent> getExamStudentByLimit(Long examId, Integer startLimit,Integer endLimit) {
|
|
|
+ if(examId==null||startLimit==null||endLimit==null||startLimit>endLimit){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return examStudentRepo.findByLimit(examId, startLimit-1,(endLimit-startLimit+1));
|
|
|
+ }
|
|
|
+}
|