浏览代码

批次管理-查询、导入考生

xiaof 3 年之前
父节点
当前提交
a042be6547
共有 25 个文件被更改,包括 1087 次插入39 次删除
  1. 0 1
      src/main/java/cn/com/qmth/print/manage/controller/ConditionController.java
  2. 11 28
      src/main/java/cn/com/qmth/print/manage/controller/ExamController.java
  3. 46 0
      src/main/java/cn/com/qmth/print/manage/controller/ExamStudentController.java
  4. 8 0
      src/main/java/cn/com/qmth/print/manage/dao/ExamUserRelationDao.java
  5. 1 1
      src/main/java/cn/com/qmth/print/manage/dto/EnumDto.java
  6. 87 0
      src/main/java/cn/com/qmth/print/manage/dto/StudentDTO.java
  7. 13 0
      src/main/java/cn/com/qmth/print/manage/entity/ExamEntity.java
  8. 1 1
      src/main/java/cn/com/qmth/print/manage/enums/GroupType.java
  9. 1 1
      src/main/java/cn/com/qmth/print/manage/enums/RecordStatus.java
  10. 10 0
      src/main/java/cn/com/qmth/print/manage/service/ExamService.java
  11. 8 0
      src/main/java/cn/com/qmth/print/manage/service/ExamStudentService.java
  12. 8 0
      src/main/java/cn/com/qmth/print/manage/service/ExamUserRelationService.java
  13. 51 3
      src/main/java/cn/com/qmth/print/manage/service/impl/ExamServiceImpl.java
  14. 111 4
      src/main/java/cn/com/qmth/print/manage/service/impl/ExamStudentServiceImpl.java
  15. 21 0
      src/main/java/cn/com/qmth/print/manage/service/impl/ExamUserRelationServiceImpl.java
  16. 58 0
      src/main/java/cn/com/qmth/print/manage/service/query/ExamQuery.java
  17. 77 0
      src/main/java/cn/com/qmth/print/manage/service/query/ExamStudentQuery.java
  18. 60 0
      src/main/java/cn/com/qmth/print/manage/utils/excel/ColumnSetting.java
  19. 48 0
      src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelError.java
  20. 34 0
      src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelProperty.java
  21. 104 0
      src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelReader.java
  22. 7 0
      src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelReaderHandle.java
  23. 70 0
      src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelUtils.java
  24. 186 0
      src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelWriter.java
  25. 66 0
      src/main/java/cn/com/qmth/print/manage/vo/ExamVo.java

+ 0 - 1
src/main/java/cn/com/qmth/print/manage/controller/ConditionController.java

@@ -3,7 +3,6 @@ package cn.com.qmth.print.manage.controller;
 import cn.com.qmth.print.manage.entity.ExamStudentEntity;
 import cn.com.qmth.print.manage.entity.ExamStudentEntity;
 import cn.com.qmth.print.manage.enums.GroupType;
 import cn.com.qmth.print.manage.enums.GroupType;
 import cn.com.qmth.print.manage.enums.RecordStatus;
 import cn.com.qmth.print.manage.enums.RecordStatus;
-import cn.com.qmth.print.manage.enums.dto.EnumDto;
 import cn.com.qmth.print.manage.service.ExamStudentService;
 import cn.com.qmth.print.manage.service.ExamStudentService;
 import cn.com.qmth.print.manage.utils.result.ResultUtil;
 import cn.com.qmth.print.manage.utils.result.ResultUtil;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.constant.ApiConstant;

+ 11 - 28
src/main/java/cn/com/qmth/print/manage/controller/ExamController.java

@@ -1,13 +1,17 @@
 package cn.com.qmth.print.manage.controller;
 package cn.com.qmth.print.manage.controller;
 
 
+import cn.com.qmth.print.manage.entity.ExamEntity;
 import cn.com.qmth.print.manage.entity.UserEntity;
 import cn.com.qmth.print.manage.entity.UserEntity;
 import cn.com.qmth.print.manage.service.ExamService;
 import cn.com.qmth.print.manage.service.ExamService;
+import cn.com.qmth.print.manage.service.query.ExamQuery;
+import cn.com.qmth.print.manage.service.query.ExamStudentQuery;
 import cn.com.qmth.print.manage.service.query.UserQuery;
 import cn.com.qmth.print.manage.service.query.UserQuery;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.constant.ApiConstant;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
 /**
 /**
@@ -27,8 +31,8 @@ public class ExamController {
      * @return
      * @return
      */
      */
     @RequestMapping(value = "/page", method = RequestMethod.POST)
     @RequestMapping(value = "/page", method = RequestMethod.POST)
-    public Object page(@Validated UserQuery query) {
-        return null;
+    public Object page(@Validated ExamQuery query) {
+        return examService.pageQuery(query);
     }
     }
 
 
     /**
     /**
@@ -37,41 +41,20 @@ public class ExamController {
      * @return
      * @return
      */
      */
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     @RequestMapping(value = "/list", method = RequestMethod.POST)
-    public Object list() {
-        return null;
+    public Object list(@RequestParam Long orgId) {
+        return examService.listByOrgId(orgId);
     }
     }
 
 
 
 
     /**
     /**
      * 新增/修改批次
      * 新增/修改批次
      *
      *
-     * @param user
+     * @param exam
      * @return
      * @return
      */
      */
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @RequestMapping(value = "/save", method = RequestMethod.POST)
-    public Object save(UserEntity user) {
-
-        return null;
-    }
-
-    /**
-     * 导入考生数据
-     *
-     * @return
-     */
-    @RequestMapping(value = "/import", method = RequestMethod.POST)
-    public Object importFile() {
-        return null;
-    }
-
-    /**
-     * 分页考生详情
-     *
-     * @return
-     */
-    @RequestMapping(value = "/student_detail", method = RequestMethod.POST)
-    public Object studentDetail() {
-        return null;
+    public Object save(ExamEntity exam) {
+        return examService.saveExam(exam);
     }
     }
 
 
 }
 }

+ 46 - 0
src/main/java/cn/com/qmth/print/manage/controller/ExamStudentController.java

@@ -0,0 +1,46 @@
+package cn.com.qmth.print.manage.controller;
+
+import cn.com.qmth.print.manage.service.ExamStudentService;
+import cn.com.qmth.print.manage.service.query.ExamStudentQuery;
+import com.qmth.boot.api.constant.ApiConstant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * @Date: 2021/11/16.
+ */
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/student")
+public class ExamStudentController {
+
+    @Autowired
+    private ExamStudentService examStudentService;
+
+    /**
+     * 导入考生数据
+     *
+     * @return
+     */
+    @RequestMapping(value = "/import", method = RequestMethod.POST)
+    public Object importFile(@RequestParam Long examId, @RequestParam MultipartFile file) throws IOException {
+        return examStudentService.importStudents(examId, file);
+    }
+
+    /**
+     * 分页考生详情
+     *
+     * @return
+     */
+    @RequestMapping(value = "/detail", method = RequestMethod.POST)
+    public Object studentDetail(@Validated ExamStudentQuery query) {
+        return examStudentService.pageStudent(query);
+    }
+
+}

+ 8 - 0
src/main/java/cn/com/qmth/print/manage/dao/ExamUserRelationDao.java

@@ -0,0 +1,8 @@
+package cn.com.qmth.print.manage.dao;
+
+import cn.com.qmth.print.manage.entity.ExamUserRelationEntity;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ExamUserRelationDao extends BaseMapper<ExamUserRelationEntity> {
+
+}

+ 1 - 1
src/main/java/cn/com/qmth/print/manage/enums/dto/EnumDto.java → src/main/java/cn/com/qmth/print/manage/dto/EnumDto.java

@@ -1,4 +1,4 @@
-package cn.com.qmth.print.manage.enums.dto;
+package cn.com.qmth.print.manage.dto;
 
 
 /**
 /**
  * @Date: 2021/3/23.
  * @Date: 2021/3/23.

+ 87 - 0
src/main/java/cn/com/qmth/print/manage/dto/StudentDTO.java

@@ -0,0 +1,87 @@
+package cn.com.qmth.print.manage.dto;
+
+import cn.com.qmth.print.manage.utils.excel.ExcelProperty;
+
+import java.io.Serializable;
+
+public class StudentDTO implements Serializable {
+
+    private static final long serialVersionUID = -4556126416794102992L;
+
+    @ExcelProperty(index = 1, name = "准考证号", type = 2)
+    private String examNumber;
+
+    @ExcelProperty(index = 2, name = "学号", type = 2)
+    private String studentCode;
+
+    @ExcelProperty(index = 3, name = "姓名", type = 2)
+    private String name;
+
+    @ExcelProperty(index = 4, name = "科目代码", type = 2)
+    private String courseCode;
+
+    @ExcelProperty(index = 5, name = "科目名称", type = 2)
+    private String courseName;
+
+    @ExcelProperty(index = 6, name = "考点", type = 2)
+    private String examSite;
+
+    @ExcelProperty(index = 7, name = "考场", type = 2)
+    private String examRoom;
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    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 getExamSite() {
+        return examSite;
+    }
+
+    public void setExamSite(String examSite) {
+        this.examSite = examSite;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+}

+ 13 - 0
src/main/java/cn/com/qmth/print/manage/entity/ExamEntity.java

@@ -4,8 +4,11 @@ import cn.com.qmth.print.manage.entity.base.AuditingEntity;
 import cn.com.qmth.print.manage.enums.CheckSort;
 import cn.com.qmth.print.manage.enums.CheckSort;
 import cn.com.qmth.print.manage.enums.GroupType;
 import cn.com.qmth.print.manage.enums.GroupType;
 
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 
+import java.util.List;
+
 @TableName("pm_exam")
 @TableName("pm_exam")
 public class ExamEntity extends AuditingEntity {
 public class ExamEntity extends AuditingEntity {
 
 
@@ -21,6 +24,9 @@ public class ExamEntity extends AuditingEntity {
 
 
     private CheckSort checkSort;
     private CheckSort checkSort;
 
 
+    @TableField(exist = false)
+    private String userIds;
+
     public Long getOrgId() {
     public Long getOrgId() {
         return orgId;
         return orgId;
     }
     }
@@ -61,4 +67,11 @@ public class ExamEntity extends AuditingEntity {
         this.checkSort = checkSort;
         this.checkSort = checkSort;
     }
     }
 
 
+    public String getUserIds() {
+        return userIds;
+    }
+
+    public void setUserIds(String userIds) {
+        this.userIds = userIds;
+    }
 }
 }

+ 1 - 1
src/main/java/cn/com/qmth/print/manage/enums/GroupType.java

@@ -1,6 +1,6 @@
 package cn.com.qmth.print.manage.enums;
 package cn.com.qmth.print.manage.enums;
 
 
-import cn.com.qmth.print.manage.enums.dto.EnumDto;
+import cn.com.qmth.print.manage.dto.EnumDto;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;

+ 1 - 1
src/main/java/cn/com/qmth/print/manage/enums/RecordStatus.java

@@ -1,6 +1,6 @@
 package cn.com.qmth.print.manage.enums;
 package cn.com.qmth.print.manage.enums;
 
 
-import cn.com.qmth.print.manage.enums.dto.EnumDto;
+import cn.com.qmth.print.manage.dto.EnumDto;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;

+ 10 - 0
src/main/java/cn/com/qmth/print/manage/service/ExamService.java

@@ -2,8 +2,18 @@ package cn.com.qmth.print.manage.service;
 
 
 import cn.com.qmth.print.manage.entity.ExamEntity;
 import cn.com.qmth.print.manage.entity.ExamEntity;
 
 
+import cn.com.qmth.print.manage.service.query.ExamQuery;
+import cn.com.qmth.print.manage.vo.ExamVo;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 
+import java.util.List;
+
 public interface ExamService extends IService<ExamEntity> {
 public interface ExamService extends IService<ExamEntity> {
 
 
+    List<ExamEntity> listByOrgId(Long orgId);
+
+    Long saveExam(ExamEntity exam);
+
+    IPage<ExamVo> pageQuery(ExamQuery query);
 }
 }

+ 8 - 0
src/main/java/cn/com/qmth/print/manage/service/ExamStudentService.java

@@ -3,8 +3,12 @@ package cn.com.qmth.print.manage.service;
 import cn.com.qmth.print.manage.entity.ExamStudentEntity;
 import cn.com.qmth.print.manage.entity.ExamStudentEntity;
 import cn.com.qmth.print.manage.enums.GroupType;
 import cn.com.qmth.print.manage.enums.GroupType;
 
 
+import cn.com.qmth.print.manage.service.query.ExamStudentQuery;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
 
 
+import java.io.IOException;
 import java.util.List;
 import java.util.List;
 
 
 public interface ExamStudentService extends IService<ExamStudentEntity> {
 public interface ExamStudentService extends IService<ExamStudentEntity> {
@@ -14,4 +18,8 @@ public interface ExamStudentService extends IService<ExamStudentEntity> {
     Long findSortNoByExamIdAndGroupTypeAndSort(Long examId, GroupType type, String groupName, boolean isAse);
     Long findSortNoByExamIdAndGroupTypeAndSort(Long examId, GroupType type, String groupName, boolean isAse);
 
 
     List<ExamStudentEntity> listByExamId(Long examId);
     List<ExamStudentEntity> listByExamId(Long examId);
+
+    IPage<ExamStudentEntity> pageStudent(ExamStudentQuery query);
+
+    Object importStudents(Long examId, MultipartFile file) throws IOException;
 }
 }

+ 8 - 0
src/main/java/cn/com/qmth/print/manage/service/ExamUserRelationService.java

@@ -0,0 +1,8 @@
+package cn.com.qmth.print.manage.service;
+
+import cn.com.qmth.print.manage.entity.ExamUserRelationEntity;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface ExamUserRelationService extends IService<ExamUserRelationEntity> {
+    void deleteByExamId(Long id);
+}

+ 51 - 3
src/main/java/cn/com/qmth/print/manage/service/impl/ExamServiceImpl.java

@@ -1,14 +1,62 @@
 package cn.com.qmth.print.manage.service.impl;
 package cn.com.qmth.print.manage.service.impl;
 
 
-import org.springframework.stereotype.Service;
-
 import cn.com.qmth.print.manage.dao.ExamDao;
 import cn.com.qmth.print.manage.dao.ExamDao;
 import cn.com.qmth.print.manage.entity.ExamEntity;
 import cn.com.qmth.print.manage.entity.ExamEntity;
+import cn.com.qmth.print.manage.entity.ExamUserRelationEntity;
 import cn.com.qmth.print.manage.service.ExamService;
 import cn.com.qmth.print.manage.service.ExamService;
-
+import cn.com.qmth.print.manage.service.ExamUserRelationService;
+import cn.com.qmth.print.manage.service.query.ExamQuery;
+import cn.com.qmth.print.manage.vo.ExamVo;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.core.exception.StatusException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 
 @Service
 @Service
 public class ExamServiceImpl extends ServiceImpl<ExamDao, ExamEntity> implements ExamService {
 public class ExamServiceImpl extends ServiceImpl<ExamDao, ExamEntity> implements ExamService {
 
 
+    @Autowired
+    ExamUserRelationService examUserRelationService;
+
+    @Override
+    public List<ExamEntity> listByOrgId(Long orgId) {
+        QueryWrapper<ExamEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ExamEntity::getOrgId, orgId).orderByDesc(ExamEntity::getId);
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public Long saveExam(ExamEntity exam) {
+        if (exam.getId() != null) {
+            ExamEntity examEntity = this.getById(exam.getId());
+            if (examEntity == null) {
+                throw new StatusException("批次不存在");
+            }
+
+            // 删除用户绑定
+            examUserRelationService.deleteByExamId(exam.getId());
+        }
+        this.saveOrUpdate(exam);
+
+        // 保存用户绑定
+        String[] userIds = exam.getUserIds().split(",");
+        for (String userId : userIds) {
+            ExamUserRelationEntity examUserRelationEntity = new ExamUserRelationEntity();
+            examUserRelationEntity.setExamId(exam.getId());
+            examUserRelationEntity.setUserId(Long.valueOf(userId));
+            examUserRelationService.save(examUserRelationEntity);
+        }
+        return exam.getId();
+    }
+
+    @Override
+    public IPage<ExamVo> pageQuery(ExamQuery query) {
+        return null;
+    }
 }
 }

+ 111 - 4
src/main/java/cn/com/qmth/print/manage/service/impl/ExamStudentServiceImpl.java

@@ -1,19 +1,33 @@
 package cn.com.qmth.print.manage.service.impl;
 package cn.com.qmth.print.manage.service.impl;
 
 
-import org.apache.commons.lang.StringUtils;
-import org.springframework.stereotype.Service;
-
 import cn.com.qmth.print.manage.dao.ExamStudentDao;
 import cn.com.qmth.print.manage.dao.ExamStudentDao;
+import cn.com.qmth.print.manage.dto.StudentDTO;
 import cn.com.qmth.print.manage.entity.ExamStudentEntity;
 import cn.com.qmth.print.manage.entity.ExamStudentEntity;
 import cn.com.qmth.print.manage.enums.GroupType;
 import cn.com.qmth.print.manage.enums.GroupType;
 import cn.com.qmth.print.manage.service.ExamStudentService;
 import cn.com.qmth.print.manage.service.ExamStudentService;
-
+import cn.com.qmth.print.manage.service.query.ExamStudentQuery;
+import cn.com.qmth.print.manage.utils.excel.ExcelError;
+import cn.com.qmth.print.manage.utils.excel.ExcelReader;
+import cn.com.qmth.print.manage.utils.excel.ExcelReaderHandle;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.core.exception.StatusException;
 import com.qmth.boot.core.exception.StatusException;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.web.multipart.MultipartFile;
 
 
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
+import java.util.StringJoiner;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
 
 
 @Service
 @Service
 public class ExamStudentServiceImpl extends ServiceImpl<ExamStudentDao, ExamStudentEntity> implements
 public class ExamStudentServiceImpl extends ServiceImpl<ExamStudentDao, ExamStudentEntity> implements
@@ -63,4 +77,97 @@ public class ExamStudentServiceImpl extends ServiceImpl<ExamStudentDao, ExamStud
         queryWrapper.lambda().eq(ExamStudentEntity::getExamId, examId);
         queryWrapper.lambda().eq(ExamStudentEntity::getExamId, examId);
         return this.list(queryWrapper);
         return this.list(queryWrapper);
     }
     }
+
+    @Override
+    public IPage<ExamStudentEntity> pageStudent(ExamStudentQuery query) {
+        QueryWrapper<ExamStudentEntity> queryWrapper = new QueryWrapper<>();
+        if (query.getExamId() == null) {
+            throw new StatusException("请选择批次");
+        }
+        queryWrapper.lambda().eq(ExamStudentEntity::getExamId, query.getExamId());
+        if (StringUtils.isNotBlank(query.getExamNumber())) {
+            queryWrapper.lambda().eq(ExamStudentEntity::getExamNumber, query.getExamNumber());
+        }
+        if (StringUtils.isNotBlank(query.getCourseCode())) {
+            queryWrapper.lambda().eq(ExamStudentEntity::getCourseCode, query.getCourseCode());
+        }
+        if (StringUtils.isNotBlank(query.getExamSite())) {
+            queryWrapper.lambda().eq(ExamStudentEntity::getExamSite, query.getExamSite());
+        }
+        if (StringUtils.isNotBlank(query.getExamRoom())) {
+            queryWrapper.lambda().eq(ExamStudentEntity::getExamRoom, query.getExamRoom());
+        }
+        Page page = new Page(query.getPageNumber(), query.getPageSize());
+        return this.page(page, queryWrapper);
+    }
+
+    @Transactional
+    @Override
+    public List<ExcelError> importStudents(Long examId, MultipartFile file) throws IOException {
+        List<ExamStudentEntity> studentList = new ArrayList<>();
+        ExcelReader excelReader = new ExcelReader(StudentDTO.class);
+        AtomicLong aLong = new AtomicLong(1L);
+        List<ExcelError> excelErrors = excelReader.reader(file.getInputStream(), obj -> {
+            try {
+                StudentDTO dto = (StudentDTO) obj;
+                ExamStudentEntity examStudentEntity = new ExamStudentEntity();
+                examStudentEntity.setExamId(examId);
+                examStudentEntity.setExamNumber(dto.getExamNumber());
+                examStudentEntity.setStudentCode(dto.getStudentCode());
+                examStudentEntity.setName(dto.getName());
+                examStudentEntity.setCourseCode(dto.getCourseCode().concat("_").concat(dto.getCourseName()));
+                examStudentEntity.setExamSite(dto.getExamSite());
+                examStudentEntity.setExamRoom(dto.getExamRoom());
+                examStudentEntity.setSortNo(aLong.getAndIncrement());
+                studentList.add(examStudentEntity);
+                return null;
+            } catch (RuntimeException e) {
+                //手动回滚
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                ExcelError excelError = new ExcelError();
+                excelError.setExcelErrorType(e.getMessage());
+                return excelError;
+            }
+        });
+        String errors = errorsString(excelErrors);
+        if (errors.length() > 0) {
+            throw new StatusException(errors);
+        }
+
+        if (!CollectionUtils.isEmpty(studentList)) {
+            List<ExamStudentEntity> data = new ArrayList<>();
+            for (ExamStudentEntity stu : studentList) {
+                if (data.size() == 2000) {
+                    this.saveBatch(data);
+                    data.clear();
+                }
+                data.add(stu);
+            }
+            //将剩下的数据也导入
+            if (!data.isEmpty()) {
+                this.saveBatch(data);
+            }
+        }
+        return excelErrors;
+    }
+
+    /**
+     * 拼接导入异常信息
+     *
+     * @param excelErrors
+     * @return
+     */
+    private String errorsString(List<ExcelError> excelErrors) {
+        StringJoiner sj = new StringJoiner(";");
+        if (!excelErrors.isEmpty() && excelErrors.size() > 0) {
+            int forint = excelErrors.size() < 10 ? excelErrors.size() : 9;
+            for (int i = 0; i < forint; i++) {
+                ExcelError excelError = excelErrors.get(i);
+                StringBuffer sb = new StringBuffer();
+                sb.append("第").append(excelError.getRow()).append("行,").append(excelError.getExcelErrorType());
+                sj.add(sb.toString());
+            }
+        }
+        return sj.toString();
+    }
 }
 }

+ 21 - 0
src/main/java/cn/com/qmth/print/manage/service/impl/ExamUserRelationServiceImpl.java

@@ -0,0 +1,21 @@
+package cn.com.qmth.print.manage.service.impl;
+
+import cn.com.qmth.print.manage.dao.ExamUserRelationDao;
+import cn.com.qmth.print.manage.entity.ExamUserRelationEntity;
+import cn.com.qmth.print.manage.service.ExamUserRelationService;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Date: 2021/11/17.
+ */
+@Service
+public class ExamUserRelationServiceImpl extends ServiceImpl<ExamUserRelationDao, ExamUserRelationEntity> implements ExamUserRelationService {
+    @Override
+    public void deleteByExamId(Long examId) {
+        UpdateWrapper<ExamUserRelationEntity> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(ExamUserRelationEntity::getExamId, examId);
+        this.remove(updateWrapper);
+    }
+}

+ 58 - 0
src/main/java/cn/com/qmth/print/manage/service/query/ExamQuery.java

@@ -0,0 +1,58 @@
+package cn.com.qmth.print.manage.service.query;
+
+import cn.com.qmth.print.manage.entity.ExamEntity;
+import com.qmth.boot.mybatis.query.BaseQuery;
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+@Validated
+public class ExamQuery extends BaseQuery<ExamEntity> {
+
+    private static final long serialVersionUID = 3260496142491163981L;
+
+    private String name;
+
+    private Long orgId;
+
+    @NotNull
+    private boolean enable;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public boolean isEnable() {
+        return enable;
+    }
+
+    public void setEnable(boolean enable) {
+        this.enable = enable;
+    }
+
+    @Min(1)
+    public long getPageNumber() {
+        return super.getPageNumber();
+    }
+
+    @Min(1)
+    @Max(100)
+    public long getPageSize() {
+        return super.getPageSize();
+    }
+
+}

+ 77 - 0
src/main/java/cn/com/qmth/print/manage/service/query/ExamStudentQuery.java

@@ -0,0 +1,77 @@
+package cn.com.qmth.print.manage.service.query;
+
+import cn.com.qmth.print.manage.entity.ExamStudentEntity;
+import com.qmth.boot.mybatis.query.BaseQuery;
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+@Validated
+public class ExamStudentQuery extends BaseQuery<ExamStudentEntity> {
+
+    private static final long serialVersionUID = 3260496142491163981L;
+
+    private Long examId;
+
+    private String examNumber;
+
+    private String courseCode;
+
+    private String examSite;
+
+    private String examRoom;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    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 getExamSite() {
+        return examSite;
+    }
+
+    public void setExamSite(String examSite) {
+        this.examSite = examSite;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    @Min(1)
+    public long getPageNumber() {
+        return super.getPageNumber();
+    }
+
+    @Min(1)
+    @Max(100)
+    public long getPageSize() {
+        return super.getPageSize();
+    }
+
+}

+ 60 - 0
src/main/java/cn/com/qmth/print/manage/utils/excel/ColumnSetting.java

@@ -0,0 +1,60 @@
+package cn.com.qmth.print.manage.utils.excel;
+
+/**
+ * Created by zhengmin on 2016/6/22.
+ */
+public class ColumnSetting implements Comparable<ColumnSetting> {
+
+    private String header;
+    private String fieldName;
+    private int width;
+    private int index;
+
+    public ColumnSetting(String header,String fieldName, int width, int index) {
+        this.header = header;
+        this.fieldName = fieldName;
+        this.width = width;
+        this.index = index;
+    }
+
+    public String getHeader() {
+        return header;
+    }
+
+    public void setHeader(String header) {
+        this.header = header;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public void setWidth(int width) {
+        this.width = width;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
+    public String getFieldName() {
+		return fieldName;
+	}
+
+	public void setFieldName(String fieldName) {
+		this.fieldName = fieldName;
+	}
+
+	@Override
+    public int compareTo(ColumnSetting columnSetting) {
+        if (index < columnSetting.getIndex())
+            return - 1 ;
+        if (index > columnSetting.getIndex())
+            return 1 ;
+        return 0 ;
+    }
+}

+ 48 - 0
src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelError.java

@@ -0,0 +1,48 @@
+package cn.com.qmth.print.manage.utils.excel;
+/**
+ * 
+ * @Description: excel导入错误
+ * @author ting.yin
+ * @date 2016年8月19日
+ */
+public class ExcelError {
+
+	/**
+	 * 错误行数
+	 */
+	private int row;
+
+	/**
+	 * 错误类型
+	 */
+	private String excelErrorType;
+
+	public ExcelError() {
+
+	}
+
+	public ExcelError(int row, String excelErrorType) {
+		this.row = row;
+		this.excelErrorType = excelErrorType;
+	}
+	
+	public ExcelError(String excelErrorType) {
+		this.excelErrorType = excelErrorType;
+	}
+	public int getRow() {
+		return row;
+	}
+
+	public void setRow(int row) {
+		this.row = row;
+	}
+
+	public String getExcelErrorType() {
+		return excelErrorType;
+	}
+
+	public void setExcelErrorType(String excelErrorType) {
+		this.excelErrorType = excelErrorType;
+	}
+
+}

+ 34 - 0
src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelProperty.java

@@ -0,0 +1,34 @@
+package cn.com.qmth.print.manage.utils.excel;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhengmin on 2016/6/22.
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExcelProperty {
+	/**
+	 * 导出时列名
+	 */
+    String name() default "";
+    
+	/**
+	 * 导出时列宽
+	 */
+    int width() default 0;
+	/**
+	 * 排序
+	 */
+    int index();
+    /**
+     * 类型
+     * 0:导入(读excel)
+     * 1:导出(写excel)
+     * 2:导入&导出
+     */
+    int type() default 2;
+}

+ 104 - 0
src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelReader.java

@@ -0,0 +1,104 @@
+package cn.com.qmth.print.manage.utils.excel;
+
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.*;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 
+ * @Description: 读取excel
+ * @author ting.yin
+ * @date 2016年8月19日
+ */
+public class ExcelReader extends ExcelUtils {
+
+	public ExcelReader(Class<?> dataClass) {
+		super(dataClass,true);
+	}
+
+	/**
+	 * 
+	 * @param inputStream
+	 *            输入流
+	 * @param handle
+	 *            单个对象处理器
+	 * @return 错误信息集合
+	 */
+	public List<ExcelError> reader(InputStream inputStream,
+			ExcelReaderHandle handle) {
+		List<ExcelError> excelErrors = new ArrayList<ExcelError>();
+		try {
+			Workbook wb = WorkbookFactory.create(inputStream);
+			Sheet sheet = wb.getSheetAt(0);
+			//校验表头信息
+			Row row0 = sheet.getRow(0);
+			for (int j = 0; j < this.getColumnSettings().size(); j++) {
+				ColumnSetting columnSetting = this.getColumnSettings().get(j);
+				Cell cell = row0.getCell(columnSetting.getIndex() - 1);
+				String obj = String.valueOf(convert(cell));
+				if(!Objects.equals(columnSetting.getHeader(), obj)){
+					ExcelError error = new ExcelError();
+					error.setRow(1);
+					error.setExcelErrorType("表头格式有误,请检查");
+					excelErrors.add(error);
+					return excelErrors;
+				}
+			}
+			for (int i = 1; i <= sheet.getLastRowNum(); i++) {
+				Row row = sheet.getRow(i);
+				if (row == null) {
+					return excelErrors;
+				}
+				Object dto = getDataClass().newInstance();
+//				FieldAccess access = FieldAccess.get(getDataClass());
+				for (int j = 0; j < this.getColumnSettings().size(); j++) {
+					ColumnSetting columnSetting = this.getColumnSettings().get(j);
+					Cell cell = row.getCell(columnSetting.getIndex() - 1);
+					Object obj = convert(cell);
+					Field field = getDataClass().getDeclaredField(columnSetting.getFieldName());
+					field.setAccessible(true);
+					field.set(dto, obj);
+				}
+				ExcelError error = handle.handle(dto);
+				if (error != null) {
+					error.setRow(i+1);
+					excelErrors.add(error);
+				}
+			}
+		}catch (InvalidFormatException e) {
+				e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				inputStream.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return excelErrors;
+	}
+
+	private Object convert(Cell cell) {
+		if(cell!=null){
+			switch (cell.getCellType()) {
+			case Cell.CELL_TYPE_STRING:
+				return cell.getStringCellValue().toString();
+			case Cell.CELL_TYPE_BOOLEAN:
+				return String.valueOf(cell.getBooleanCellValue());
+			case Cell.CELL_TYPE_NUMERIC:
+				return Math.round(cell.getNumericCellValue());
+			}
+		}
+		
+		return null;
+	}
+}

+ 7 - 0
src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelReaderHandle.java

@@ -0,0 +1,7 @@
+package cn.com.qmth.print.manage.utils.excel;
+
+public interface ExcelReaderHandle {
+	
+	ExcelError handle(Object dto) throws Exception;
+
+}

+ 70 - 0
src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelUtils.java

@@ -0,0 +1,70 @@
+package cn.com.qmth.print.manage.utils.excel;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Created by zhengmin on 2016/8/17.
+ */
+@SuppressWarnings("rawtypes")
+public abstract class ExcelUtils {
+
+	private Class dataClass;
+    private List<ColumnSetting> columnSettings;
+    
+    public ExcelUtils(Class<?> dataClass , boolean isRead){
+        this.dataClass = dataClass;
+        this.columnSettings = getColumnSettings(dataClass,isRead);
+    }
+
+    public Class getDataClass() {
+        return dataClass;
+    }
+
+    public void setDataClass(Class dataClass) {
+        this.dataClass = dataClass;
+    }
+
+    public List<ColumnSetting> getColumnSettings() {
+        return columnSettings;
+    }
+
+    public void setColumnSettings(List<ColumnSetting> columnSettings) {
+        this.columnSettings = columnSettings;
+    }
+
+    /**
+     * 提取ExcelProperty注解类的字段信息
+     * @param dataClass 需要解析excel的数据类型
+     * @return
+     */
+    protected List<ColumnSetting> getColumnSettings(Class<?> dataClass, boolean isRead){
+		List<ColumnSetting> columnSettings = new ArrayList<>();
+		Field[] fileds = dataClass.getDeclaredFields();
+		for (Field field : fileds) {
+			ExcelProperty exportProperty = field.getAnnotation(ExcelProperty.class);
+			if (exportProperty != null) {
+				if (isRead) {
+					if (exportProperty.type() == 0 || exportProperty.type() == 2) {
+						ColumnSetting columnSetting = new ColumnSetting(
+								exportProperty.name(),field.getName(),exportProperty.width(),
+								exportProperty.index());
+						columnSettings.add(columnSetting);
+					}
+				}else{
+					if (exportProperty.type() == 1 || exportProperty.type() == 2) {
+						ColumnSetting columnSetting = new ColumnSetting(
+								exportProperty.name(), field.getName(),exportProperty.width(),
+								exportProperty.index());
+						columnSettings.add(columnSetting);
+					}
+				}
+			}
+		}
+		Collections.sort(columnSettings);
+		return columnSettings;
+    }
+    
+}

+ 186 - 0
src/main/java/cn/com/qmth/print/manage/utils/excel/ExcelWriter.java

@@ -0,0 +1,186 @@
+package cn.com.qmth.print.manage.utils.excel;
+
+import org.apache.poi.xssf.usermodel.*;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by dizhi on 2016/6/19.
+ */
+public class ExcelWriter extends ExcelUtils{
+
+
+    public ExcelWriter(Class<?> dataClass){
+        super(dataClass,false);
+    }
+
+    /**
+     * 写入excel
+     * @param sheetName sheet名称
+     * @param dataset 数据集合
+     * @param out 输出流
+     */
+    public void write(String sheetName,Collection<?> dataset, OutputStream out) {
+        // 声明一个工作薄
+        XSSFWorkbook workbook = new XSSFWorkbook();
+        // 生成一个表格
+        XSSFSheet sheet = workbook.createSheet(sheetName);
+
+        // 设置表格默认列宽度为15个字节
+        sheet.setDefaultColumnWidth((short) 15);
+        // 生成一个样式
+        XSSFCellStyle style = workbook.createCellStyle();
+        // 设置这些样式
+//        style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
+//        style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
+//        style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
+//        style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
+//        style.setBorderRight(XSSFCellStyle.BORDER_THIN);
+//        style.setBorderTop(XSSFCellStyle.BORDER_THIN);
+//        style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
+        // 生成一个字体
+//        XSSFFont font = workbook.createFont();
+//        font.setColor(HSSFColor.VIOLET.index);
+//        font.setFontHeightInPoints((short) 12);
+//        font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
+//        // 把字体应用到当前的样式
+//        style.setFont(font);
+//        // 生成并设置另一个样式
+//        XSSFCellStyle style2 = workbook.createCellStyle();
+//        style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
+//        style2.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
+//        style2.setBorderBottom(XSSFCellStyle.BORDER_THIN);
+//        style2.setBorderLeft(XSSFCellStyle.BORDER_THIN);
+//        style2.setBorderRight(XSSFCellStyle.BORDER_THIN);
+//        style2.setBorderTop(XSSFCellStyle.BORDER_THIN);
+//        style2.setAlignment(XSSFCellStyle.ALIGN_CENTER);
+//        style2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
+//        // 生成另一个字体
+//        XSSFFont font2 = workbook.createFont();
+//        font2.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
+        // 把字体应用到当前的样式
+        //style2.setFont(font2);
+
+        // 声明一个画图的顶级管理器
+        //HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+        // 定义注释的大小和位置,详见文档
+//        XSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
+//                0, 0, 0, (short) 4, 2, (short) 6, 5));
+//        // 设置注释内容
+//        comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
+//        // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
+//        comment.setAuthor("leno");
+
+        List<ColumnSetting> columnSettings = this.getColumnSettings();
+
+        // 产生表格标题行
+        XSSFRow row = sheet.createRow(0);
+        for (short i = 0; i < columnSettings.size(); i++) {
+            XSSFCell cell = row.createCell(i);
+            cell.setCellStyle(style);
+            XSSFRichTextString text = new XSSFRichTextString(columnSettings.get(i).getHeader());
+            cell.setCellValue(text);
+            if(columnSettings.get(i).getWidth() > 0){
+                sheet.setColumnWidth(i,columnSettings.get(i).getWidth()*256);
+            }
+        }
+
+        // 遍历集合数据,产生数据行
+        //Iterator<?> it = dataset.iterator();
+        int index = 0;
+        for(Object obj : dataset) {
+            index++;
+            row = sheet.createRow(index);
+            //T t = (T) it.next();
+            // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
+            for (short i = 0; i < columnSettings.size(); i++) {
+                XSSFCell cell = row.createCell(i);
+                //cell.setCellStyle(style2);
+                String fieldName = columnSettings.get(i).getFieldName();
+
+                try {
+                	Field field=this.getDataClass().getDeclaredField(fieldName);
+                	field.setAccessible(true);
+                    Object value = field.get(obj);
+                    // 判断值的类型后进行强制类型转换
+                    String textValue = null;
+                    // if (value instanceof Integer) {
+                    // int intValue = (Integer) value;
+                    // cell.setCellValue(intValue);
+                    // } else if (value instanceof Float) {
+                    // float fValue = (Float) value;
+                    // textValue = new HSSFRichTextString(
+                    // String.valueOf(fValue));
+                    // cell.setCellValue(textValue);
+                    // } else if (value instanceof Double) {
+                    // double dValue = (Double) value;
+                    // textValue = new HSSFRichTextString(
+                    // String.valueOf(dValue));
+                    // cell.setCellValue(textValue);
+                    // } else if (value instanceof Long) {
+                    // long longValue = (Long) value;
+                    // cell.setCellValue(longValue);
+                    // }
+                    if (value instanceof Boolean) {
+                        boolean bValue = (Boolean) value;
+                        textValue = "是";
+                        if (!bValue) {
+                            textValue = "否";
+                        }
+                    } else if (value instanceof Date) {
+                        Date date = (Date) value;
+                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                        textValue = sdf.format(date);
+                    }
+                    else {
+                        // 其它数据类型都当作字符串简单处理
+                        textValue = String.valueOf(value);
+                    }
+                    // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
+                    if (textValue != null) {
+                        Pattern p = Pattern.compile("^//d+(//.//d+)?$");
+                        Matcher matcher = p.matcher(textValue);
+                        if (matcher.matches()) {
+                            // 是数字当作double处理
+                            cell.setCellValue(Double.parseDouble(textValue));
+                        } else {
+                            XSSFRichTextString richString = new XSSFRichTextString(
+                                    textValue);
+
+                            cell.setCellValue(richString);
+                        }
+                    }
+                } catch (NoSuchFieldException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                } catch (IllegalAccessException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                } catch (SecurityException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                } catch (IllegalArgumentException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                } finally {
+                    // 清理资源
+                }
+            }
+            
+        }
+        try {
+            workbook.write(out);
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+}

+ 66 - 0
src/main/java/cn/com/qmth/print/manage/vo/ExamVo.java

@@ -0,0 +1,66 @@
+package cn.com.qmth.print.manage.vo;
+
+import cn.com.qmth.print.manage.entity.ExamEntity;
+
+public class ExamVo extends ExamEntity {
+
+    private String orgName;
+
+    private Integer studentCount;
+
+    private Integer checkCount;
+
+    private Integer checkNormalLCount;
+
+    private Integer breakCount;
+
+    private Integer breakNormalLCount;
+
+    public String getOrgName() {
+        return orgName;
+    }
+
+    public void setOrgName(String orgName) {
+        this.orgName = orgName;
+    }
+
+    public Integer getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(Integer studentCount) {
+        this.studentCount = studentCount;
+    }
+
+    public Integer getCheckCount() {
+        return checkCount;
+    }
+
+    public void setCheckCount(Integer checkCount) {
+        this.checkCount = checkCount;
+    }
+
+    public Integer getCheckNormalLCount() {
+        return checkNormalLCount;
+    }
+
+    public void setCheckNormalLCount(Integer checkNormalLCount) {
+        this.checkNormalLCount = checkNormalLCount;
+    }
+
+    public Integer getBreakCount() {
+        return breakCount;
+    }
+
+    public void setBreakCount(Integer breakCount) {
+        this.breakCount = breakCount;
+    }
+
+    public Integer getBreakNormalLCount() {
+        return breakNormalLCount;
+    }
+
+    public void setBreakNormalLCount(Integer breakNormalLCount) {
+        this.breakNormalLCount = breakNormalLCount;
+    }
+}