Browse Source

3.4.0 update

xiaofei 11 tháng trước cách đây
mục cha
commit
358ee41d60
15 tập tin đã thay đổi với 478 bổ sung409 xóa
  1. 121 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/query/BasicExamStudentPageQuery.java
  2. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/query/BasicExamStudentQuery.java
  3. 4 10
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicExamStudentMapper.java
  4. 5 8
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicExamStudentService.java
  5. 18 53
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamStudentServiceImpl.java
  6. 20 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  7. 65 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncBasicExamStudentExportService.java
  8. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/DownloadLogicService.java
  9. 41 13
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/DownloadLogicServiceImpl.java
  10. 165 188
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/ImportLogicServiceImpl.java
  11. 25 99
      distributed-print-business/src/main/resources/mapper/BasicExamStudentMapper.xml
  12. 1 0
      distributed-print-business/src/main/resources/mapper/ConditionMapper.xml
  13. 8 31
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicExamStudentController.java
  14. 1 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/TaskTypeEnum.java
  15. 1 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

+ 121 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/query/BasicExamStudentPageQuery.java

@@ -0,0 +1,121 @@
+package com.qmth.distributed.print.business.bean.query;
+
+import com.qmth.teachcloud.common.base.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 考生管理查询条件
+ */
+public class BasicExamStudentPageQuery extends BasePage {
+
+    @ApiModelProperty(value = "学期ID")
+    private Long semesterId;
+    @ApiModelProperty(value = "考试ID")
+    private Long examId;
+    @ApiModelProperty(value = "开课学院ID")
+    private Long openCollegeId;
+    @ApiModelProperty(value = "课程ID")
+    private Long courseId;
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+    @ApiModelProperty(value = "教师(工号/姓名)")
+    private String teacher;
+    @ApiModelProperty(value = "学院")
+    private String college;
+    @ApiModelProperty(value = "专业")
+    private String major;
+    @ApiModelProperty(value = "教学班(模糊查询)")
+    private String teachClassName;
+    @ApiModelProperty(value = "行政班(模糊查询)")
+    private String className;
+    @ApiModelProperty(value = "考生信息(姓名/学号)")
+    private String examStudentInfo;
+
+    public Long getSemesterId() {
+        return semesterId;
+    }
+
+    public void setSemesterId(Long semesterId) {
+        this.semesterId = semesterId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public Long getOpenCollegeId() {
+        return openCollegeId;
+    }
+
+    public void setOpenCollegeId(Long openCollegeId) {
+        this.openCollegeId = openCollegeId;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getTeacher() {
+        return teacher;
+    }
+
+    public void setTeacher(String teacher) {
+        this.teacher = teacher;
+    }
+
+    public String getCollege() {
+        return college;
+    }
+
+    public void setCollege(String college) {
+        this.college = college;
+    }
+
+    public String getMajor() {
+        return major;
+    }
+
+    public void setMajor(String major) {
+        this.major = major;
+    }
+
+    public String getTeachClassName() {
+        return teachClassName;
+    }
+
+    public void setTeachClassName(String teachClassName) {
+        this.teachClassName = teachClassName;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getExamStudentInfo() {
+        return examStudentInfo;
+    }
+
+    public void setExamStudentInfo(String examStudentInfo) {
+        this.examStudentInfo = examStudentInfo;
+    }
+}

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/BasicExamStudentQuery.java → distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/query/BasicExamStudentQuery.java

@@ -1,4 +1,4 @@
-package com.qmth.distributed.print.business.bean;
+package com.qmth.distributed.print.business.bean.query;
 
 public class BasicExamStudentQuery {
     private Long schoolId;

+ 4 - 10
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicExamStudentMapper.java

@@ -3,7 +3,8 @@ package com.qmth.distributed.print.business.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.distributed.print.business.bean.BasicExamStudentQuery;
+import com.qmth.distributed.print.business.bean.query.BasicExamStudentPageQuery;
+import com.qmth.distributed.print.business.bean.query.BasicExamStudentQuery;
 import com.qmth.distributed.print.business.bean.dto.ExamStudentDto;
 import com.qmth.distributed.print.business.bean.result.BasicExamStudentResult;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
@@ -22,19 +23,12 @@ import java.util.List;
  */
 public interface BasicExamStudentMapper extends BaseMapper<BasicExamStudent> {
 
-    IPage<BasicExamStudentResult> findBasicExamStudentPage(@Param("iPage") Page<BasicExamStudentResult> iPage,
-                                                           @Param("schoolId") Long schoolId, @Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("openCollegeId") Long openCollegeId,
-                                                           @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("teacher") String teacher, @Param("college") String college,
-                                                           @Param("major") String major, @Param("teachClassName") String teachClassName, @Param("className") String className,
-                                                           @Param("examStudentInfo") String examStudentInfo, @Param("dpr") DataPermissionRule dpr);
+    IPage<BasicExamStudentResult> findBasicExamStudentPage(@Param("iPage") Page<BasicExamStudentResult> iPage, @Param("query") BasicExamStudentPageQuery query, @Param("dpr") DataPermissionRule dpr);
 
     /**
      * 列表查询
      */
-    List<BasicExamStudentResult> findBasicExamStudentList(@Param("schoolId") Long schoolId, @Param("semesterId") Long semesterId, @Param("examId") Long examId,
-                                                          @Param("courseId") Long courseId, @Param("teacher") String teacher, @Param("college") String college,
-                                                          @Param("major") String major, @Param("teachClazz") String teachClazz, @Param("examStudentInfo") String examStudentInfo,
-                                                          @Param("dpr") DataPermissionRule dpr);
+    List<BasicExamStudentResult> findBasicExamStudentPage(@Param("query") BasicExamStudentPageQuery query, @Param("dpr") DataPermissionRule dpr);
 
     /**
      * 查询被绑定的考生字典

+ 5 - 8
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicExamStudentService.java

@@ -2,7 +2,8 @@ package com.qmth.distributed.print.business.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.qmth.distributed.print.business.bean.BasicExamStudentQuery;
+import com.qmth.distributed.print.business.bean.query.BasicExamStudentPageQuery;
+import com.qmth.distributed.print.business.bean.query.BasicExamStudentQuery;
 import com.qmth.distributed.print.business.bean.dto.DeleteBasicExamStudentStatusDto;
 import com.qmth.distributed.print.business.bean.dto.ExamStudentDto;
 import com.qmth.distributed.print.business.bean.params.BasicExamStudentParam;
@@ -13,7 +14,6 @@ import com.qmth.teachcloud.common.entity.BasicExamStudent;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.BasicExamStudentStatusEnum;
 
-import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -26,14 +26,12 @@ import java.util.List;
  */
 public interface BasicExamStudentService extends IService<BasicExamStudent> {
 
-    IPage<BasicExamStudentResult> page(Long semesterId, Long examId, Long openCollegeId, Long courseId, String paperNumber, String teacher,
-                                       String college, String major, String teachClassName, String className, String examStudentInfo, int pageNumber, int pageSize);
+    IPage<BasicExamStudentResult> queryPage(BasicExamStudentPageQuery query);
 
     /**
      * 列表查询
      */
-    List<BasicExamStudentResult> list(SysUser requestUser, Long semesterId, Long examId, Long courseId, String teacher,
-                                      String college, String major, String teachClazz, String examStudentInfo);
+    List<BasicExamStudentResult> exportList(BasicExamStudentPageQuery query, SysUser sysUser, Long privilegeId);
 
     /**
      * 新增编辑
@@ -47,8 +45,7 @@ public interface BasicExamStudentService extends IService<BasicExamStudent> {
     /**
      * 导出
      */
-    void exportLogic(HttpServletResponse response, Long semesterId, Long examId, Long courseId, String teacher,
-                     String college, String major, String teachClazz, String examStudentInfo) throws Exception;
+    void exportLogic(BasicExamStudentPageQuery query) throws Exception;
 
     /**
      * 批量删除

+ 18 - 53
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamStudentServiceImpl.java

@@ -6,31 +6,27 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 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.qmth.distributed.print.business.bean.BasicExamStudentQuery;
-import com.qmth.distributed.print.business.bean.dto.BasicExamStudentDto;
+import com.qmth.distributed.print.business.bean.query.BasicExamStudentPageQuery;
+import com.qmth.distributed.print.business.bean.query.BasicExamStudentQuery;
 import com.qmth.distributed.print.business.bean.dto.DeleteBasicExamStudentStatusDto;
 import com.qmth.distributed.print.business.bean.dto.ExamStudentDto;
 import com.qmth.distributed.print.business.bean.params.BasicExamStudentParam;
 import com.qmth.distributed.print.business.bean.result.BasicExamStudentResult;
 import com.qmth.distributed.print.business.entity.BasicExamRule;
-import com.qmth.distributed.print.business.entity.ExamDetailCourse;
 import com.qmth.distributed.print.business.entity.ExamStudent;
 import com.qmth.distributed.print.business.entity.ExamTaskDetail;
 import com.qmth.distributed.print.business.enums.RequiredFieldsEnum;
 import com.qmth.distributed.print.business.mapper.BasicExamStudentMapper;
 import com.qmth.distributed.print.business.service.*;
+import com.qmth.distributed.print.business.templete.execute.AsyncBasicExamStudentExportService;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableDisabledValue;
 import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableValue;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.*;
-import com.qmth.teachcloud.common.enums.BasicExamStudentStatusEnum;
-import com.qmth.teachcloud.common.enums.EnumResult;
-import com.qmth.teachcloud.common.enums.ExamModelEnum;
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.ConvertUtil;
-import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkStudent;
@@ -44,11 +40,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
 import java.lang.reflect.Field;
 import java.util.*;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * <p>
@@ -86,29 +80,19 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
     @Resource
     private ExamTaskDetailService examTaskDetailService;
     @Resource
-    private ExamDetailService examDetailService;
+    private ExamStudentService examStudentService;
     @Resource
-    private ExamDetailCourseService examDetailCourseService;
+    private TBTaskService tbTaskService;
     @Resource
-    private ExamStudentService examStudentService;
+    private AsyncBasicExamStudentExportService asyncBasicExamStudentExportService;
 
     @Override
-    public IPage<BasicExamStudentResult> page(Long semesterId, Long examId, Long openCollegeId, Long courseId, String paperNumber,
-                                              String teacher, String college, String major, String teachClassName, String className, String examStudentInfo, int pageNumber,
-                                              int pageSize) {
+    public IPage<BasicExamStudentResult> queryPage(BasicExamStudentPageQuery query) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-
-        teacher = SystemConstant.translateSpecificSign(teacher);
-        college = SystemConstant.translateSpecificSign(college);
-        major = SystemConstant.translateSpecificSign(major);
-        examStudentInfo = SystemConstant.translateSpecificSign(examStudentInfo);
-        teachClassName = SystemConstant.translateSpecificSign(teachClassName);
-        className = SystemConstant.translateSpecificSign(className);
-
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(requestUser.getSchoolId(), requestUser.getId(),
                 ServletUtil.getRequest().getServletPath());
-        IPage<BasicExamStudentResult> page = this.baseMapper.findBasicExamStudentPage(new Page<>(pageNumber, pageSize),
-                requestUser.getSchoolId(), semesterId, examId, openCollegeId, courseId, paperNumber, teacher, college, major, teachClassName, className, examStudentInfo, dpr);
+        query.setSchoolId(requestUser.getSchoolId());
+        IPage<BasicExamStudentResult> page = this.baseMapper.findBasicExamStudentPage(new Page<>(query.getPageNumber(), query.getPageSize()), query, dpr);
         for (BasicExamStudentResult record : page.getRecords()) {
             Long examStartTime = record.getExamStartTime();
             Long examEndTime = record.getExamEndTime();
@@ -124,20 +108,9 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
     }
 
     @Override
-    public List<BasicExamStudentResult> list(SysUser requestUser, Long semesterId, Long examId, Long courseId,
-                                             String teacher, String college, String major, String teachClazz, String examStudentInfo) {
-        Long schoolId = requestUser.getSchoolId();
-
-        teacher = SystemConstant.translateSpecificSign(teacher);
-        college = SystemConstant.translateSpecificSign(college);
-        major = SystemConstant.translateSpecificSign(major);
-        examStudentInfo = SystemConstant.translateSpecificSign(examStudentInfo);
-        teachClazz = SystemConstant.translateSpecificSign(teachClazz);
-
-        DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(schoolId, requestUser.getId(),
-                ServletUtil.getRequest().getServletPath());
-        List<BasicExamStudentResult> list = this.baseMapper.findBasicExamStudentList(schoolId, semesterId, examId,
-                courseId, teacher, college, major, teachClazz, examStudentInfo, dpr);
+    public List<BasicExamStudentResult> exportList(BasicExamStudentPageQuery query, SysUser sysUser, Long privilegeId) {
+        DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(privilegeId, sysUser);
+        List<BasicExamStudentResult> list = this.baseMapper.findBasicExamStudentPage(query, dpr);
         for (BasicExamStudentResult basicExamStudentResult : list) {
             Long examStartTime = basicExamStudentResult.getExamStartTime();
             Long examEndTime = basicExamStudentResult.getExamEndTime();
@@ -166,19 +139,11 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
     }
 
     @Override
-    public void exportLogic(HttpServletResponse response, Long semesterId, Long examId, Long courseId, String teacher, String college, String major, String teachClazz, String examStudentInfo)
-            throws Exception {
-        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        List<BasicExamStudentResult> list = this.list(requestUser, semesterId, examId, courseId, teacher, college,
-                major, teachClazz, examStudentInfo);
-        List<BasicExamStudentDto> exportDto = list.stream().flatMap(e -> {
-            BasicExamStudentDto basicExamStudentDto = new BasicExamStudentDto();
-            BeanUtils.copyProperties(e, basicExamStudentDto);
-            return Stream.of(basicExamStudentDto);
-        }).collect(Collectors.toList());
-
-        // 生成excel文件
-        ExcelUtil.excelExport("考生字典数据", BasicExamStudentDto.class, exportDto, response);
+    public void exportLogic(BasicExamStudentPageQuery query) {
+        Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.BASIC_EXAM_STUDENT_EXPORT, null, (SysUser) ServletUtil.getRequestUser());
+        map.put("query",query);
+        map.put("privilegeId", ServletUtil.getCurrentPrivilegeId());
+        asyncBasicExamStudentExportService.exportTask(map);
     }
 
     @Transactional

+ 20 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.google.gson.Gson;
-import com.qmth.distributed.print.business.bean.BasicExamStudentQuery;
+import com.qmth.distributed.print.business.bean.query.BasicExamStudentQuery;
 import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.dto.approvalForm.*;
 import com.qmth.distributed.print.business.bean.dto.examObject.ExamObjectDto;
@@ -1560,12 +1560,26 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
     @Override
     public void delete(Long id) {
-        // 命题任务生成,命题老师未提交前允许删除
-        ExamTask examTask = this.getById(id);
-        if (examTask != null && examTask.getStatus().equals(ExamStatusEnum.SUBMIT)) {
-            throw ExceptionResultEnum.ERROR.exception("命题老师已提交,不能删除");
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        List<SysRole> sysRoleList = sysUserRoleService.listRoleByUserId(sysUser.getId());
+        boolean isSchoolAdmin = false;
+        for (SysRole sysRole : sysRoleList) {
+            if (RoleTypeEnum.SCHOOL_ADMIN.equals(sysRole.getType())) {
+                isSchoolAdmin = true;
+                break;
+            }
+        }
+        if (isSchoolAdmin) {
+            // 学校管理员,可以删除
+            this.applyDelete(id);
+        } else {
+            // 命题任务生成,命题老师未提交前允许删除
+            ExamTask examTask = this.getById(id);
+            if (examTask != null && examTask.getStatus().equals(ExamStatusEnum.SUBMIT)) {
+                throw ExceptionResultEnum.ERROR.exception("命题老师已提交,不能删除");
+            }
+            this.removeByExamTaskId(id);
         }
-        this.removeByExamTaskId(id);
     }
 
     @Transactional

+ 65 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncBasicExamStudentExportService.java

@@ -0,0 +1,65 @@
+package com.qmth.distributed.print.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.templete.export.AsyncExportTaskTemplete;
+import com.qmth.distributed.print.business.templete.service.DownloadLogicService;
+import com.qmth.distributed.print.business.templete.service.TaskLogicService;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.service.TBTaskService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * 考生导出
+ */
+@Service
+public class AsyncBasicExamStudentExportService extends AsyncExportTaskTemplete {
+
+    public static final String OBJ_TITLE = "试卷、题卡pdf导出";
+    private final static Logger log = LoggerFactory.getLogger(AsyncBasicExamStudentExportService.class);
+
+    @Override
+    public Result exportTask(Map<String, Object> map) {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+
+        StringJoiner stringJoinerSummary = new StringJoiner("\n")
+                .add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        TBTaskService tbTaskService = SpringContextHolder.getBean(TBTaskService.class);
+        tbTaskService.updateById(tbTask);
+        try {
+            DownloadLogicService downloadLogicService = SpringContextHolder.getBean(DownloadLogicService.class);
+            downloadLogicService.executeExportBasicExamStudentLogic(map);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, map.get(SystemConstant.DATA_COUNT), FINISH_SIZE));
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            tbTask.setStatus(TaskStatusEnum.FINISH);
+            tbTaskService.updateById(tbTask);
+        }
+        return ResultUtil.ok();
+    }
+}

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/DownloadLogicService.java

@@ -53,4 +53,6 @@ public interface DownloadLogicService {
     Map<String, Object> executeDownloadScoreLogic(Map<String, Object> map) throws Exception;
 
     Map<String, Object> executeDownloadPaperFileBatch(Map<String, Object> map) throws Exception;
+
+    void executeExportBasicExamStudentLogic(Map<String, Object> map);
 }

+ 41 - 13
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/DownloadLogicServiceImpl.java

@@ -9,6 +9,8 @@ import com.google.gson.Gson;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.params.DownloadPaperFileParam;
+import com.qmth.distributed.print.business.bean.query.BasicExamStudentPageQuery;
+import com.qmth.distributed.print.business.bean.result.BasicExamStudentResult;
 import com.qmth.distributed.print.business.bean.result.TSyncExamStudentScoreResult;
 import com.qmth.distributed.print.business.entity.ExamCard;
 import com.qmth.distributed.print.business.entity.TSyncExamStudentScore;
@@ -19,9 +21,11 @@ import com.qmth.distributed.print.business.enums.PaperFileDownloadExposureStatus
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.service.DownloadLogicService;
 import com.qmth.distributed.print.business.util.CreatePdfUtil;
+import com.qmth.distributed.print.business.util.PdfUtil;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.bean.result.DictionaryResult;
+import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
 import com.qmth.teachcloud.common.bean.vo.PrintPathVo;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
@@ -38,6 +42,7 @@ import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -50,6 +55,8 @@ import java.io.File;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @Description: 任务处理逻辑impl
@@ -62,10 +69,6 @@ import java.util.*;
 public class DownloadLogicServiceImpl implements DownloadLogicService {
     private final static Logger log = LoggerFactory.getLogger(DownloadLogicServiceImpl.class);
 
-    @Resource
-    ExamPrintPlanService examPrintPlanService;
-    @Resource
-    ExamTaskService examTaskService;
     @Resource
     ExamTaskDetailService examTaskDetailService;
     @Resource
@@ -79,20 +82,12 @@ public class DownloadLogicServiceImpl implements DownloadLogicService {
     @Resource
     CreatePdfUtil createPdfUtil;
     @Resource
-    TBTaskPdfService tbTaskPdfService;
-    @Resource
     BasicRoleDataPermissionService basicRoleDataPermissionService;
     @Resource
-    SysUserService sysUserService;
-    @Resource
     FileStoreUtil fileStoreUtil;
     @Resource
     SysOrgService sysOrgService;
     @Resource
-    TCStatisticsService tcStatisticsService;
-    @Resource
-    TCStatisticsTempService tcStatisticsTempService;
-    @Resource
     TSyncExamStudentScoreService tSyncExamStudentScoreService;
     @Resource
     @Lazy
@@ -102,6 +97,8 @@ public class DownloadLogicServiceImpl implements DownloadLogicService {
     @Resource
     TeachClazzService teachClazzService;
     @Resource
+    private BasicExamStudentService basicExamStudentService;
+    @Resource
     DictionaryConfig dictionaryConfig;
     @Resource
     FileUploadService fileUploadService;
@@ -607,7 +604,7 @@ public class DownloadLogicServiceImpl implements DownloadLogicService {
                     if (downloadCard) {
                         Long cardId = Long.valueOf(paperInfoVo.getCardId());
                         ExamCard examCard = examCardService.getById(cardId);
-                        Optional.ofNullable(examCard).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程["+examTaskDetailDto.getCourseName()+"("+examTaskDetailDto.getCourseCode()+")]、试卷编号["+examTaskDetailDto.getPaperNumber()+"]命题任务未找到卷型["+paperInfoVo.getName()+"]题卡"));
+                        Optional.ofNullable(examCard).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("课程[" + examTaskDetailDto.getCourseName() + "(" + examTaskDetailDto.getCourseCode() + ")]、试卷编号[" + examTaskDetailDto.getPaperNumber() + "]命题任务未找到卷型[" + paperInfoVo.getName() + "]题卡"));
 
                         String cardHtmlPath = zipLocalRootPath + File.separator + secondPath + File.separator + "题卡" + SystemConstant.HYPHEN + paperInfoVo.getName() + SystemConstant.HYPHEN + fileNamePath;
                         String cardPdfPath = zipLocalRootPath + File.separator + secondPath + File.separator + "题卡" + SystemConstant.HYPHEN + paperInfoVo.getName() + SystemConstant.HYPHEN + fileNamePath;
@@ -666,6 +663,37 @@ public class DownloadLogicServiceImpl implements DownloadLogicService {
         return map;
     }
 
+    @Override
+    public void executeExportBasicExamStudentLogic(Map<String, Object> map) {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        SysUser sysUser = (SysUser) map.get(SystemConstant.USER);
+        Long privilegeId = (Long) map.get("privilegeId");
+        File file = null;
+        try {
+            BasicExamStudentPageQuery query = (BasicExamStudentPageQuery) map.get("query");
+            List<BasicExamStudentResult> list = basicExamStudentService.exportList(query, sysUser, privilegeId);
+            List<BasicExamStudentDto> examStudentDtoList = list.stream().flatMap(e -> {
+                BasicExamStudentDto basicExamStudentDto = new BasicExamStudentDto();
+                BeanUtils.copyProperties(e, basicExamStudentDto);
+                return Stream.of(basicExamStudentDto);
+            }).collect(Collectors.toList());
+
+            file = SystemConstant.getFileTempDirVar(SystemConstant.EXCEL_PREFIX);
+            // 生成excel文件
+            ExcelUtil.excelExportLocal(file, BasicExamStudentDto.class, examStudentDtoList);
+            String fileName = SystemConstant.getNanoId() + SystemConstant.EXCEL_PREFIX;
+            FilePathVo filePathVo = fileUploadService.uploadFile(file, UploadFileEnum.FILE, fileName);
+            tbTask.setResultFilePath(JSON.toJSONString(filePathVo));
+            map.put(SystemConstant.DATA_COUNT, examStudentDtoList.size());
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        } finally {
+            if (Objects.nonNull(file)) {
+                file.delete();
+            }
+        }
+    }
+
     /**
      * 验证机构是否存在
      *

+ 165 - 188
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/ImportLogicServiceImpl.java

@@ -112,7 +112,7 @@ public class ImportLogicServiceImpl implements ImportLogicService {
         BasicExamStudentParseDto basicExamStudentParseDto;
         try {
             // 解析excel文件内容
-            basicExamStudentParseDto = this.parseBasicExamStudent(schoolId, inputStream);
+            basicExamStudentParseDto = this.parseImportExamStudentData(schoolId, inputStream);
         } catch (Exception e) {
             SystemConstant.addSummary(stringJoinerSummary, "解析导入文件内容结束,解析失败。" + e.getMessage());
             throw ExceptionResultEnum.ERROR.exception(e.getMessage());
@@ -134,8 +134,6 @@ public class ImportLogicServiceImpl implements ImportLogicService {
         boolean needPaperNumber = (basicSchool.getHasPaperNumber() != null && basicSchool.getHasPaperNumber()) || ExamModelEnum.MODEL4.equals(basicExam.getExamModel());
         // 试卷编号->课程
         Map<String, Long> paperNumberCourseIdMap = new HashMap<>();
-        // 课程+教学班->任课老师
-        Map<String, Long> courseTeachClassTeacherMap = new HashMap<>();
         Map<String, Long> basicCourseIdMap = new HashMap<>();
         // 课程学号唯一
         List<String> courseCodeStudentCodeList = new ArrayList<>();
@@ -176,39 +174,43 @@ public class ImportLogicServiceImpl implements ImportLogicService {
             }
 
             // 解析考试日期和考试时间
-            try {
-                Map<String, Object> timeMap = ConvertUtil.analyzeExamTime(basicExamStudentImport.getExamDate(), basicExamStudentImport.getExamTime());
-                basicExamStudent.setExamStartTime(Long.valueOf(String.valueOf(timeMap.get("startTime"))));
-                basicExamStudent.setExamEndTime(Long.valueOf(String.valueOf(timeMap.get("endTime"))));
-            } catch (Exception e) {
-                stringJoiner.add(e.getMessage());
+            if (StringUtils.isNoneBlank(basicExamStudentImport.getExamDate(), basicExamStudentImport.getExamTime())) {
+                try {
+                    Map<String, Object> timeMap = ConvertUtil.analyzeExamTime(basicExamStudentImport.getExamDate(), basicExamStudentImport.getExamTime());
+                    basicExamStudent.setExamStartTime(Long.valueOf(String.valueOf(timeMap.get("startTime"))));
+                    basicExamStudent.setExamEndTime(Long.valueOf(String.valueOf(timeMap.get("endTime"))));
+                } catch (Exception e) {
+                    stringJoiner.add(e.getMessage());
+                }
             }
 
             // 校验课程开课学院和课程代码
-            String key = basicExamStudentImport.getCourseCode() + SystemConstant.HYPHEN + basicExamStudentImport.getTeachingRoomName();
-            if (!basicCourseIdMap.containsKey(key)) {
-                List<SysOrg> sysOrgList = sysOrgService.getSecondOrg(schoolId, basicExamStudentImport.getTeachingRoomName());
-                if (CollectionUtils.isEmpty(sysOrgList)) {
-                    stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]在学院层级不存在");
-                } else if (sysOrgList.size() == 1) {
-                    SysOrg sysOrg = sysOrgList.get(0);
-                    // 校验课程代码和开课学院
-                    BasicCourse basicCourse = basicCourseService.getByTeachRoomIdAndCode(sysOrg.getId(), basicExamStudentImport.getCourseCode());
-                    if (Objects.isNull(basicCourse)) {
-                        stringJoiner.add("课程代码[" + basicExamStudentImport.getCourseCode() + "]在开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]不存在");
+            if (StringUtils.isNoneBlank(basicExamStudentImport.getCourseCode(), basicExamStudentImport.getTeachingRoomName())) {
+                String key = basicExamStudentImport.getCourseCode() + SystemConstant.HYPHEN + basicExamStudentImport.getTeachingRoomName();
+                if (!basicCourseIdMap.containsKey(key)) {
+                    List<SysOrg> sysOrgList = sysOrgService.getSecondOrg(schoolId, basicExamStudentImport.getTeachingRoomName());
+                    if (CollectionUtils.isEmpty(sysOrgList)) {
+                        stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]在学院层级不存在");
+                    } else if (sysOrgList.size() == 1) {
+                        SysOrg sysOrg = sysOrgList.get(0);
+                        // 校验课程代码和开课学院
+                        BasicCourse basicCourse = basicCourseService.getByTeachRoomIdAndCode(sysOrg.getId(), basicExamStudentImport.getCourseCode());
+                        if (Objects.isNull(basicCourse)) {
+                            stringJoiner.add("课程代码[" + basicExamStudentImport.getCourseCode() + "]在开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]不存在");
+                        } else {
+                            basicExamStudent.setCourseId(basicCourse.getId());
+                            basicCourseIdMap.put(key, basicCourse.getId());
+                        }
                     } else {
-                        basicExamStudent.setCourseId(basicCourse.getId());
-                        basicCourseIdMap.put(key, basicCourse.getId());
+                        stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]存在多个");
                     }
                 } else {
-                    stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]存在多个");
+                    basicExamStudent.setCourseId(basicCourseIdMap.get(key));
                 }
-            } else {
-                basicExamStudent.setCourseId(basicCourseIdMap.get(key));
             }
 
             // 校验任课老师工号和姓名
-            if (StringUtils.isNotBlank(basicExamStudentImport.getTeacherCode()) && StringUtils.isNotBlank(basicExamStudentImport.getTeacherName())) {
+            if (StringUtils.isNoneBlank(basicExamStudentImport.getTeacherCode(), basicExamStudentImport.getTeacherName())) {
                 SysUser sysUser = sysUserService.getByLoginName(schoolId, basicExamStudentImport.getTeacherCode());
                 if (sysUser == null) {
                     stringJoiner.add("任课老师工号[" + basicExamStudentImport.getTeacherCode() + "]用户不存在");
@@ -304,7 +306,7 @@ public class ImportLogicServiceImpl implements ImportLogicService {
         SystemConstant.addSummary(stringJoinerSummary, "开始解析导入文件内容");
         BasicExamStudentParseDto basicExamStudentParseDto;
         try {
-            basicExamStudentParseDto = this.parseBasicExamStudent(schoolId, inputStream);
+            basicExamStudentParseDto = this.parseImportExamStudentData(schoolId, inputStream);
         } catch (Exception e) {
             SystemConstant.addSummary(stringJoinerSummary, "解析导入文件内容结束,解析失败。" + e.getMessage());
             throw ExceptionResultEnum.ERROR.exception(e.getMessage());
@@ -324,8 +326,6 @@ public class ImportLogicServiceImpl implements ImportLogicService {
         Map<String, Long> basicCourseIdMap = new HashMap<>();
         // 课程学号唯一
         List<String> courseCodeStudentCodeList = new ArrayList<>();
-        // 课程+教学班->任课老师
-        Map<String, Long> courseTeachClassTeacherMap = new HashMap<>();
         // 是否有错误提示
         boolean hasError = false;
 
@@ -345,37 +345,41 @@ public class ImportLogicServiceImpl implements ImportLogicService {
             });
 
             // 校验课程
-            String key = basicExamStudentImport.getCourseCode() + SystemConstant.HYPHEN + basicExamStudentImport.getTeachingRoomName();
-            if (!basicCourseIdMap.containsKey(key)) {
-                List<SysOrg> sysOrgList = sysOrgService.getSecondOrg(schoolId, basicExamStudentImport.getTeachingRoomName());
-                if (CollectionUtils.isEmpty(sysOrgList)) {
-                    stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]在学院层级不存在");
-                } else {
-                    SysOrg sysOrg = sysOrgList.get(0);
-                    // 校验课程代码和开课学院
-                    BasicCourse basicCourse = basicCourseService.getByTeachRoomIdAndCode(sysOrg.getId(), basicExamStudentImport.getCourseCode());
-                    if (Objects.isNull(basicCourse)) {
-                        stringJoiner.add("课程代码[" + basicExamStudentImport.getCourseCode() + "]在开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]不存在");
+            if (StringUtils.isNoneBlank(basicExamStudentImport.getCourseCode(), basicExamStudentImport.getTeachingRoomName())) {
+                String key = basicExamStudentImport.getCourseCode() + SystemConstant.HYPHEN + basicExamStudentImport.getTeachingRoomName();
+                if (!basicCourseIdMap.containsKey(key)) {
+                    List<SysOrg> sysOrgList = sysOrgService.getSecondOrg(schoolId, basicExamStudentImport.getTeachingRoomName());
+                    if (CollectionUtils.isEmpty(sysOrgList)) {
+                        stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]在学院层级不存在");
                     } else {
-                        basicExamStudent.setCourseId(basicCourse.getId());
-                        basicCourseIdMap.put(key, basicCourse.getId());
+                        SysOrg sysOrg = sysOrgList.get(0);
+                        // 校验课程代码和开课学院
+                        BasicCourse basicCourse = basicCourseService.getByTeachRoomIdAndCode(sysOrg.getId(), basicExamStudentImport.getCourseCode());
+                        if (Objects.isNull(basicCourse)) {
+                            stringJoiner.add("课程代码[" + basicExamStudentImport.getCourseCode() + "]在开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]不存在");
+                        } else {
+                            basicExamStudent.setCourseId(basicCourse.getId());
+                            basicCourseIdMap.put(key, basicCourse.getId());
+                        }
                     }
+                } else {
+                    basicExamStudent.setCourseId(basicCourseIdMap.get(key));
                 }
-            } else {
-                basicExamStudent.setCourseId(basicCourseIdMap.get(key));
             }
 
             //校验任课老师
-            SysUser sysUser = sysUserService.getByLoginName(schoolId, basicExamStudentImport.getTeacherCode());
-            if (sysUser == null) {
-                stringJoiner.add("任课老师工号[" + basicExamStudentImport.getTeacherCode() + "]用户不存在");
-            } else {
-                if (!sysUser.getEnable()) {
-                    stringJoiner.add("任课老师工号[" + basicExamStudentImport.getTeacherCode() + "]用户已禁用");
-                } else if (!sysUser.getRealName().equals(basicExamStudentImport.getTeacherName())) {
-                    stringJoiner.add("任课老师[" + basicExamStudentImport.getTeacherName() + "]与用户管理中姓名[" + sysUser.getRealName() + "]不一致");
+            if (StringUtils.isNotBlank(basicExamStudentImport.getTeacherCode())) {
+                SysUser sysUser = sysUserService.getByLoginName(schoolId, basicExamStudentImport.getTeacherCode());
+                if (sysUser == null) {
+                    stringJoiner.add("任课老师工号[" + basicExamStudentImport.getTeacherCode() + "]用户不存在");
                 } else {
-                    basicExamStudent.setTeacherId(sysUser.getId());
+                    if (!sysUser.getEnable()) {
+                        stringJoiner.add("任课老师工号[" + basicExamStudentImport.getTeacherCode() + "]用户已禁用");
+                    } else if (!sysUser.getRealName().equals(basicExamStudentImport.getTeacherName())) {
+                        stringJoiner.add("任课老师[" + basicExamStudentImport.getTeacherName() + "]与用户管理中姓名[" + sysUser.getRealName() + "]不一致");
+                    } else {
+                        basicExamStudent.setTeacherId(sysUser.getId());
+                    }
                 }
             }
 
@@ -480,7 +484,7 @@ public class ImportLogicServiceImpl implements ImportLogicService {
         SystemConstant.addSummary(stringJoinerSummary, "开始解析文件内容");
         BasicExamStudentParseDto basicExamStudentParseDto;
         try {
-            basicExamStudentParseDto = this.parseExamStudent(schoolId, inputStream);
+            basicExamStudentParseDto = this.parseImportExamStudentData(schoolId, inputStream);
         } catch (Exception e) {
             SystemConstant.addSummary(stringJoinerSummary, "解析文件内容结束,解析失败。" + e.getMessage());
             throw ExceptionResultEnum.ERROR.exception(e.getMessage());
@@ -508,8 +512,6 @@ public class ImportLogicServiceImpl implements ImportLogicService {
 
         // 课程学号唯一
         List<String> courseCodeStudentCodeList = new ArrayList<>();
-        // 课程+教学班->任课老师
-        Map<String, Long> courseTeachClassTeacherMap = new HashMap<>();
         // 是否有错误提示
         boolean hasError = false;
 
@@ -543,35 +545,39 @@ public class ImportLogicServiceImpl implements ImportLogicService {
             }
 
             // 解析并校验考试日期、考试时间
-            try {
-                Map<String, Object> timeMap = ConvertUtil.analyzeExamTime(basicExamStudentImport.getExamDate(), basicExamStudentImport.getExamTime());
-                basicExamStudent.setExamStartTime(Long.valueOf(String.valueOf(timeMap.get("startTime"))));
-                basicExamStudent.setExamEndTime(Long.valueOf(String.valueOf(timeMap.get("endTime"))));
-            } catch (Exception e) {
-                stringJoiner.add(e.getMessage());
+            if (StringUtils.isNoneBlank(basicExamStudentImport.getExamDate(), basicExamStudentImport.getExamTime())) {
+                try {
+                    Map<String, Object> timeMap = ConvertUtil.analyzeExamTime(basicExamStudentImport.getExamDate(), basicExamStudentImport.getExamTime());
+                    basicExamStudent.setExamStartTime(Long.valueOf(String.valueOf(timeMap.get("startTime"))));
+                    basicExamStudent.setExamEndTime(Long.valueOf(String.valueOf(timeMap.get("endTime"))));
+                } catch (Exception e) {
+                    stringJoiner.add(e.getMessage());
+                }
             }
 
             // 校验开课学院是否存在该课程代码
-            String key = basicExamStudentImport.getCourseCode() + SystemConstant.HYPHEN + basicExamStudentImport.getTeachingRoomName();
-            if (!basicCourseIdMap.containsKey(key)) {
-                List<SysOrg> sysOrgList = sysOrgService.getSecondOrg(schoolId, basicExamStudentImport.getTeachingRoomName());
-                if (CollectionUtils.isEmpty(sysOrgList)) {
-                    stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]在学院层级不存在");
-                } else if (sysOrgList.size() == 1) {
-                    SysOrg sysOrg = sysOrgList.get(0);
-                    // 校验课程代码和开课学院
-                    BasicCourse basicCourse = courseCodeNameInBasicCourseMap.get(sysOrg.getId().toString().concat(basicExamStudentImport.getCourseCode()));
-                    if (Objects.isNull(basicCourse)) {
-                        stringJoiner.add("课程代码[" + basicExamStudentImport.getCourseCode() + "]在开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]不存在");
+            if (StringUtils.isNoneBlank(basicExamStudentImport.getCourseCode(), basicExamStudentImport.getTeachingRoomName())) {
+                String key = basicExamStudentImport.getCourseCode() + SystemConstant.HYPHEN + basicExamStudentImport.getTeachingRoomName();
+                if (!basicCourseIdMap.containsKey(key)) {
+                    List<SysOrg> sysOrgList = sysOrgService.getSecondOrg(schoolId, basicExamStudentImport.getTeachingRoomName());
+                    if (CollectionUtils.isEmpty(sysOrgList)) {
+                        stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]在学院层级不存在");
+                    } else if (sysOrgList.size() == 1) {
+                        SysOrg sysOrg = sysOrgList.get(0);
+                        // 校验课程代码和开课学院
+                        BasicCourse basicCourse = courseCodeNameInBasicCourseMap.get(sysOrg.getId().toString().concat(basicExamStudentImport.getCourseCode()));
+                        if (Objects.isNull(basicCourse)) {
+                            stringJoiner.add("课程代码[" + basicExamStudentImport.getCourseCode() + "]在开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]不存在");
+                        } else {
+                            basicExamStudent.setCourseId(basicCourse.getId());
+                            basicCourseIdMap.put(key, basicCourse.getId());
+                        }
                     } else {
-                        basicExamStudent.setCourseId(basicCourse.getId());
-                        basicCourseIdMap.put(key, basicCourse.getId());
+                        stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]存在多个");
                     }
                 } else {
-                    stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]存在多个");
+                    basicExamStudent.setCourseId(basicCourseIdMap.get(key));
                 }
-            } else {
-                basicExamStudent.setCourseId(basicCourseIdMap.get(key));
             }
 
             // 校验试卷编号和课程代码对应关系,试卷编号只能绑定一个课程
@@ -587,25 +593,27 @@ public class ImportLogicServiceImpl implements ImportLogicService {
             }
 
             // 校验试卷编号课程代码是否已命题且命题任务中课程代码是否一致
-            if (paperNumberMap.containsKey(basicExamStudent.getPaperNumber())) {
-                List<ExamTask> examTasks = paperNumberMap.get(basicExamStudent.getPaperNumber());
-                if (examTasks.size() > 1) {
-                    stringJoiner.add(String.format("试卷编号[%s]在考试[%s]下有多条命题任务,请联系管理员处理", basicExamStudent.getPaperNumber(), basicExam.getName()));
-                } else {
-                    Long courseId = paperNumberCourseIdInMap.get(basicExamStudent.getPaperNumber());
-                    ExamTask examTask = examTasks.get(0);
-                    if (!examTask.getCourseId().equals(courseId)) {
-                        stringJoiner.add(String.format("试卷编号[%s]对应课程代码与命题任务中对应课程代码不一致", basicExamStudent.getPaperNumber()));
+            if (StringUtils.isNotBlank(basicExamStudent.getPaperNumber())) {
+                if (paperNumberMap.containsKey(basicExamStudent.getPaperNumber())) {
+                    List<ExamTask> examTasks = paperNumberMap.get(basicExamStudent.getPaperNumber());
+                    if (examTasks.size() > 1) {
+                        stringJoiner.add(String.format("试卷编号[%s]在考试[%s]下有多条命题任务,请联系管理员处理", basicExamStudent.getPaperNumber(), basicExam.getName()));
                     } else {
-                        basicExamStudent.setCoursePaperId(String.valueOf(examTask.getId()));
+                        Long courseId = paperNumberCourseIdInMap.get(basicExamStudent.getPaperNumber());
+                        ExamTask examTask = examTasks.get(0);
+                        if (!examTask.getCourseId().equals(courseId)) {
+                            stringJoiner.add(String.format("试卷编号[%s]对应课程代码与命题任务中对应课程代码不一致", basicExamStudent.getPaperNumber()));
+                        } else {
+                            basicExamStudent.setCoursePaperId(String.valueOf(examTask.getId()));
+                        }
                     }
+                } else {
+                    stringJoiner.add(String.format("试卷编号[%s]未命题", basicExamStudent.getPaperNumber()));
                 }
-            } else {
-                stringJoiner.add(String.format("试卷编号[%s]未命题", basicExamStudent.getPaperNumber()));
             }
 
             //校验任课老师是否存在,且工号和姓名是否与系统一致
-            if (StringUtils.isNotBlank(basicExamStudentImport.getTeacherCode()) && StringUtils.isNotBlank(basicExamStudentImport.getTeacherName())) {
+            if (StringUtils.isNoneBlank(basicExamStudentImport.getTeacherCode(), basicExamStudentImport.getTeacherName())) {
                 SysUser sysUser = sysUserService.getByLoginName(schoolId, basicExamStudentImport.getTeacherCode());
                 if (sysUser == null) {
                     stringJoiner.add("任课老师工号[" + basicExamStudentImport.getTeacherCode() + "]用户不存在");
@@ -632,32 +640,36 @@ public class ImportLogicServiceImpl implements ImportLogicService {
             }
 
             // 校验试卷编号学号是否已生成印刷任务
-            int studentCount = examStudentService.countByExamIdAndPaperNumberAndStudentCode(examId, basicExamStudent.getPaperNumber(), basicExamStudent.getStudentCode());
-            if (studentCount > 0) {
-                stringJoiner.add("试卷编号[" + basicExamStudent.getPaperNumber() + "]、学号[" + basicExamStudent.getStudentCode() + "]已有印刷任务,不允许重复导入");
-            } else {
-                if (basicExamStudent.getCourseId() != null) {
-                    // 校验课程学号唯一
-                    String courseCodeStudentCodeKey = basicExamStudent.getCourseId() + basicExamStudent.getStudentCode();
-                    if (courseCodeStudentCodeList.contains(courseCodeStudentCodeKey)) {
-                        stringJoiner.add("课程代码[" + basicExamStudentImport.getCourseCode() + "]已存在学号[" + basicExamStudentImport.getStudentCode() + "]的考生数据");
-                    } else {
-                        courseCodeStudentCodeList.add(courseCodeStudentCodeKey);
-                    }
+            if (StringUtils.isNoneBlank(basicExamStudent.getPaperNumber(), basicExamStudent.getStudentCode())) {
+                int studentCount = examStudentService.countByExamIdAndPaperNumberAndStudentCode(examId, basicExamStudent.getPaperNumber(), basicExamStudent.getStudentCode());
+                if (studentCount > 0) {
+                    stringJoiner.add("试卷编号[" + basicExamStudent.getPaperNumber() + "]、学号[" + basicExamStudent.getStudentCode() + "]已有印刷任务,不允许重复导入");
+                } else {
+                    if (basicExamStudent.getCourseId() != null) {
+                        // 校验课程学号唯一
+                        String courseCodeStudentCodeKey = basicExamStudent.getCourseId() + basicExamStudent.getStudentCode();
+                        if (courseCodeStudentCodeList.contains(courseCodeStudentCodeKey)) {
+                            stringJoiner.add("课程代码[" + basicExamStudentImport.getCourseCode() + "]已存在学号[" + basicExamStudentImport.getStudentCode() + "]的考生数据");
+                        } else {
+                            courseCodeStudentCodeList.add(courseCodeStudentCodeKey);
+                        }
 
-                    if (courseIdStudentCodeMap.containsKey(basicExamStudent.getCourseId() + SystemConstant.HYPHEN + basicExamStudent.getStudentCode())) {
-                        BasicExamStudent basicStudent = courseIdStudentCodeMap.get(basicExamStudent.getCourseId() + SystemConstant.HYPHEN + basicExamStudent.getStudentCode());
-                        basicExamStudent.setId(basicStudent.getId());
+                        if (courseIdStudentCodeMap.containsKey(basicExamStudent.getCourseId() + SystemConstant.HYPHEN + basicExamStudent.getStudentCode())) {
+                            BasicExamStudent basicStudent = courseIdStudentCodeMap.get(basicExamStudent.getCourseId() + SystemConstant.HYPHEN + basicExamStudent.getStudentCode());
+                            basicExamStudent.setId(basicStudent.getId());
+                        }
                     }
                 }
             }
 
             // 校验试卷编号、考试日期、考试时间、考点、考场是否已命题
-            List<ExamDetail> examDetailList = examDetailService.listExamDetailByExamIdAndCourseIdAndPaperNumber(examId, basicExamStudent.getCourseId(), basicExamStudent.getPaperNumber());
-            if (CollectionUtils.isNotEmpty(examDetailList)) {
-                long count = examDetailList.stream().filter(m -> basicExamStudent.getExamStartTime().equals(m.getExamStartTime()) && basicExamStudent.getExamEndTime().equals(m.getExamEndTime()) && basicExamStudent.getExamPlace().equals(m.getExamPlace()) && basicExamStudent.getExamRoom().equals(m.getExamRoom())).count();
-                if (count != 0) {
-                    stringJoiner.add("试卷编号[" + basicExamStudentImport.getPaperNumber() + "]、考试日期[" + basicExamStudentImport.getExamDate() + "]、考试时间[" + basicExamStudentImport.getExamTime() + "]、考场[" + basicExamStudentImport.getExamPlace() + "]、考点[" + basicExamStudentImport.getExamRoom() + "]已有印刷任务");
+            if (basicExamStudent.getCourseId() != null && StringUtils.isNotBlank(basicExamStudent.getPaperNumber())) {
+                List<ExamDetail> examDetailList = examDetailService.listExamDetailByExamIdAndCourseIdAndPaperNumber(examId, basicExamStudent.getCourseId(), basicExamStudent.getPaperNumber());
+                if (CollectionUtils.isNotEmpty(examDetailList)) {
+                    long count = examDetailList.stream().filter(m -> basicExamStudent.getExamStartTime().equals(m.getExamStartTime()) && basicExamStudent.getExamEndTime().equals(m.getExamEndTime()) && basicExamStudent.getExamPlace().equals(m.getExamPlace()) && basicExamStudent.getExamRoom().equals(m.getExamRoom())).count();
+                    if (count != 0) {
+                        stringJoiner.add("试卷编号[" + basicExamStudentImport.getPaperNumber() + "]、考试日期[" + basicExamStudentImport.getExamDate() + "]、考试时间[" + basicExamStudentImport.getExamTime() + "]、考场[" + basicExamStudentImport.getExamPlace() + "]、考点[" + basicExamStudentImport.getExamRoom() + "]已有印刷任务");
+                    }
                 }
             }
 
@@ -688,7 +700,7 @@ public class ImportLogicServiceImpl implements ImportLogicService {
         return map;
     }
 
-    private BasicExamStudentParseDto parseBasicExamStudent(Long schoolId, InputStream inputStream) {
+    private BasicExamStudentParseDto parseImportExamStudentData(Long schoolId, InputStream inputStream) {
         ExcelReader excelReader = ExcelReader.create(ExcelType.XLSX, inputStream, 1);
         List<DataMap> dataMapList;
         try {
@@ -721,91 +733,56 @@ public class ImportLogicServiceImpl implements ImportLogicService {
 
             AtomicInteger i = new AtomicInteger(2);
             dataMapList.forEach(m -> {
-                BasicExamStudentImport basicExamStudentImport = new BasicExamStudentImport();
-                basicExamStudentImport.setRowIndex(i.getAndIncrement());
-                Class<BasicExamStudentImport> aClass = (Class<BasicExamStudentImport>) basicExamStudentImport.getClass();
-                for (Map.Entry<String, String> entry : m.entrySet()) {
-                    // 必填字段
-                    if (requiredMap.containsKey(entry.getKey())) {
-                        EnumResult enumResult = requiredMap.get(entry.getKey());
-                        try {
-                            Field declaredField = aClass.getDeclaredField(enumResult.getCode());
-                            declaredField.setAccessible(true);
-                            declaredField.set(basicExamStudentImport, StringUtils.deleteWhitespace(entry.getValue()));
-                        } catch (NoSuchFieldException e) {
-                            throw ExceptionResultEnum.ERROR.exception("未获取到表头为[" + entry.getKey() + "]的属性值");
-                        } catch (IllegalAccessException e) {
-                            throw ExceptionResultEnum.ERROR.exception("表头为[" + entry.getKey() + "]的值赋值失败");
+                if (m.size() > 0) {
+                    BasicExamStudentImport basicExamStudentImport = new BasicExamStudentImport();
+                    basicExamStudentImport.setRowIndex(i.getAndIncrement());
+                    Class<BasicExamStudentImport> aClass = (Class<BasicExamStudentImport>) basicExamStudentImport.getClass();
+                    for (Map.Entry<String, String> entry : m.entrySet()) {
+                        // 必填字段
+                        if (requiredMap.containsKey(entry.getKey())) {
+                            EnumResult enumResult = requiredMap.get(entry.getKey());
+                            try {
+                                Field declaredField = aClass.getDeclaredField(enumResult.getCode());
+                                declaredField.setAccessible(true);
+                                declaredField.set(basicExamStudentImport, StringUtils.deleteWhitespace(entry.getValue()));
+                            } catch (NoSuchFieldException e) {
+                                throw ExceptionResultEnum.ERROR.exception("未获取到表头为[" + entry.getKey() + "]的属性值");
+                            } catch (IllegalAccessException e) {
+                                throw ExceptionResultEnum.ERROR.exception("表头为[" + entry.getKey() + "]的值赋值失败");
+                            }
+                            basicExamStudentImport.getRequiredFieldList().add(new CodeNameEnableDisabledValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), enumResult.getDisabled(), StringUtils.isNotBlank(entry.getValue()) ? entry.getValue() : null));
+                        }
+                        // 扩展字段
+                        if (extendMap.containsKey(entry.getKey())) {
+                            EnumResult enumResult = extendMap.get(entry.getKey());
+                            basicExamStudentImport.getExtendFieldList().add(new CodeNameEnableDisabledValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), enumResult.getDisabled(), StringUtils.isNotBlank(entry.getValue()) ? entry.getValue() : null));
                         }
-                        basicExamStudentImport.getRequiredFieldList().add(new CodeNameEnableDisabledValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), enumResult.getDisabled(), StringUtils.isNotBlank(entry.getValue()) ? entry.getValue() : ""));
-                    }
-                    // 扩展字段
-                    if (extendMap.containsKey(entry.getKey())) {
-                        EnumResult enumResult = extendMap.get(entry.getKey());
-                        basicExamStudentImport.getExtendFieldList().add(new CodeNameEnableDisabledValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), enumResult.getDisabled(), StringUtils.isNotBlank(entry.getValue()) ? entry.getValue() : ""));
                     }
-                }
-                list.add(basicExamStudentImport);
-            });
-        }
-        basicExamStudentParseDto.setBasicExamStudentImportList(list);
-        return basicExamStudentParseDto;
-    }
 
-    private BasicExamStudentParseDto parseExamStudent(Long schoolId, InputStream inputStream) {
-        ExcelReader excelReader = ExcelReader.create(ExcelType.XLSX, inputStream, 1);
-        List<DataMap> dataMapList = null;
-        try {
-            dataMapList = excelReader.getDataMapList();
-        } catch (Exception e) {
-            throw ExceptionResultEnum.ERROR.exception("读取excel内容失败");
-        }
-        BasicExamStudentParseDto basicExamStudentParseDto = new BasicExamStudentParseDto();
-        List<BasicExamStudentImport> list = new ArrayList<>();
-        if (CollectionUtils.isNotEmpty(dataMapList)) {
-            String[] columnNames = excelReader.getColumnNames();
-
-            BasicExamRule basicExamRule = basicExamRuleService.getBySchoolId(schoolId);
-            if (basicExamRule == null) {
-                throw ExceptionResultEnum.ERROR.exception("通用规则未设置");
-            }
-
-            Map<String, EnumResult> requiredMap = basicExamRule.getRequiredFieldList().stream().filter(m -> m.getEnable()).collect(Collectors.toMap(EnumResult::getName, e -> e));
-            Map<String, EnumResult> extendMap = basicExamRule.getExtendFieldList().stream().filter(m -> m.getEnable()).collect(Collectors.toMap(EnumResult::getName, e -> e));
-
-            // 通用规则表头
-            List<String> actualTitleList = Stream.concat(requiredMap.keySet().stream(), extendMap.keySet().stream()).collect(Collectors.toList());
-            if (!CollectionUtils.isEqualCollection(Arrays.asList(columnNames), actualTitleList)) {
-                throw ExceptionResultEnum.ERROR.exception("表头有误,表头字段应为【" + String.join(",", actualTitleList) + "】");
-            }
-
-            basicExamStudentParseDto.setColumnNames(columnNames);
-
-            dataMapList.forEach(m -> {
-                BasicExamStudentImport basicExamStudentImport = new BasicExamStudentImport();
-                Class<BasicExamStudentImport> aClass = (Class<BasicExamStudentImport>) basicExamStudentImport.getClass();
-                for (Map.Entry<String, String> entry : m.entrySet()) {
+                    List<CodeNameEnableDisabledValue> requiredFieldList = basicExamStudentImport.getRequiredFieldList();
                     // 必填字段
-                    if (requiredMap.containsKey(entry.getKey())) {
-                        EnumResult enumResult = requiredMap.get(entry.getKey());
-                        try {
-                            Field declaredField = aClass.getDeclaredField(enumResult.getCode());
-                            declaredField.setAccessible(true);
-                            declaredField.set(basicExamStudentImport, StringUtils.deleteWhitespace(entry.getValue()));
-                        } catch (NoSuchFieldException e) {
-                            throw ExceptionResultEnum.ERROR.exception("未获取到表头为[" + entry.getKey() + "]的属性值");
-                        } catch (IllegalAccessException e) {
-                            throw ExceptionResultEnum.ERROR.exception("表头为[" + entry.getKey() + "]的值赋值失败");
+                    if (requiredMap.keySet().size() > requiredFieldList.size()) {
+                        for (String s : requiredMap.keySet()) {
+                            Optional<CodeNameEnableDisabledValue> optional = basicExamStudentImport.getRequiredFieldList().stream().filter(r -> s.equals(r.getName())).findFirst();
+                            if (!optional.isPresent()) {
+                                EnumResult enumResult = requiredMap.get(s);
+                                basicExamStudentImport.getRequiredFieldList().add(new CodeNameEnableDisabledValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), enumResult.getDisabled(), null));
+                            }
                         }
-                        basicExamStudentImport.getRequiredFieldList().add(new CodeNameEnableDisabledValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), enumResult.getDisabled(), StringUtils.isNotBlank(entry.getValue()) ? entry.getValue() : ""));
                     }
+                    List<CodeNameEnableDisabledValue> extendFieldList = basicExamStudentImport.getExtendFieldList();
                     // 扩展字段
-                    if (extendMap.containsKey(entry.getKey())) {
-                        EnumResult enumResult = extendMap.get(entry.getKey());
-                        basicExamStudentImport.getExtendFieldList().add(new CodeNameEnableDisabledValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), enumResult.getDisabled(), StringUtils.isNotBlank(entry.getValue()) ? entry.getValue() : ""));
+                    if (extendMap.keySet().size() > extendFieldList.size()) {
+                        for (String s : extendMap.keySet()) {
+                            Optional<CodeNameEnableDisabledValue> optional = basicExamStudentImport.getExtendFieldList().stream().filter(r -> s.equals(r.getName())).findFirst();
+                            if (!optional.isPresent()) {
+                                EnumResult enumResult = extendMap.get(s);
+                                basicExamStudentImport.getExtendFieldList().add(new CodeNameEnableDisabledValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), enumResult.getDisabled(), null));
+                            }
+                        }
                     }
+                    list.add(basicExamStudentImport);
                 }
-                list.add(basicExamStudentImport);
             });
         }
         basicExamStudentParseDto.setBasicExamStudentImportList(list);

+ 25 - 99
distributed-print-business/src/main/resources/mapper/BasicExamStudentMapper.xml

@@ -41,48 +41,48 @@
                 LEFT JOIN
             sys_org so ON bc.teaching_room_id = so.id
         <where>
-            <if test="schoolId != null and schoolId != ''">
-                AND bes.school_id = #{schoolId}
+            <if test="query.schoolId != null">
+                AND bes.school_id = #{query.schoolId}
             </if>
-            <if test="semesterId != null">
-                AND bes.semester_id = #{semesterId}
+            <if test="query.semesterId != null">
+                AND bes.semester_id = #{query.semesterId}
             </if>
-            <if test="examId != null">
-                AND bes.exam_id = #{examId}
+            <if test="query.examId != null">
+                AND bes.exam_id = #{query.examId}
             </if>
-            <if test="openCollegeId != null">
-                AND bc.teaching_room_id = #{openCollegeId}
+            <if test="query.openCollegeId != null">
+                AND bc.teaching_room_id = #{query.openCollegeId}
             </if>
-            <if test="courseId != null">
-                AND bes.course_id = #{courseId}
+            <if test="query.courseId != null">
+                AND bes.course_id = #{query.courseId}
             </if>
-            <if test="paperNumber != null and paperNumber != ''">
-                AND bes.paper_number = #{paperNumber}
+            <if test="query.paperNumber != null and query.paperNumber != ''">
+                AND bes.paper_number = #{query.paperNumber}
             </if>
-            <if test="teacher != null and teacher != ''">
-                AND (teacher.real_name LIKE CONCAT('%',#{teacher},'%') OR teacher.code LIKE CONCAT('%',#{teacher},'%'))
+            <if test="query.teacher != null and query.teacher != ''">
+                AND (teacher.real_name LIKE CONCAT('%',#{query.teacher},'%') OR teacher.code LIKE CONCAT('%',#{query.teacher},'%'))
             </if>
-            <if test="college != null and college != ''">
-                AND bes.college_name LIKE CONCAT('%',#{college},'%')
+            <if test="query.college != null and query.college != ''">
+                AND bes.college_name LIKE CONCAT('%',#{query.college},'%')
             </if>
-            <if test="major != null and major != ''">
-                AND bes.major_name LIKE CONCAT('%',#{major},'%')
+            <if test="query.major != null and query.major != ''">
+                AND bes.major_name LIKE CONCAT('%',#{query.major},'%')
             </if>
-            <if test="teachClassName != null and teachClassName != ''">
-                AND bes.teach_class_name LIKE CONCAT('%',#{teachClassName},'%')
+            <if test="query.teachClassName != null and query.teachClassName != ''">
+                AND bes.teach_class_name LIKE CONCAT('%',#{query.teachClassName},'%')
             </if>
-            <if test="className != null and className != ''">
-                AND bes.class_name LIKE CONCAT('%',#{className},'%')
+            <if test="query.className != null and query.className != ''">
+                AND bes.class_name LIKE CONCAT('%',#{query.className},'%')
             </if>
-            <if test="examStudentInfo != null and examStudentInfo != ''">
-                AND (bes.student_code LIKE CONCAT('%',#{examStudentInfo},'%') OR bes.student_name LIKE CONCAT('%',#{examStudentInfo},'%'))
+            <if test="query.examStudentInfo != null and query.examStudentInfo != ''">
+                AND (bes.student_code LIKE CONCAT('%',#{query.examStudentInfo},'%') OR bes.student_name LIKE CONCAT('%',#{query.examStudentInfo},'%'))
             </if>
             <if test="dpr != null">
                 <if test="dpr.requestUserId != null">
                     AND bes.create_id = #{dpr.requestUserId}
                 </if>
                 <if test="dpr.courseUserId != null">
-                    AND EXISTS( SELECT 1 FROM (select course_id from teach_course where exam_id = #{examId} and user_id = #{dpr.courseUserId}) tc WHERE tc.course_id = bes.course_id)
+                    AND EXISTS( SELECT 1 FROM (select course_id from teach_course where exam_id = #{query.examId} and user_id = #{dpr.courseUserId}) tc WHERE tc.course_id = bes.course_id)
                 </if>
                 <if test="dpr.orgIdSet != null and dpr.orgIdSet != '' and dpr.orgIdSet.size > 0">
                     AND bc.teaching_room_id IN
@@ -94,80 +94,6 @@
         </where>
         order by bes.course_id, bes.student_code
     </select>
-    <select id="findBasicExamStudentList"
-            resultType="com.qmth.distributed.print.business.bean.result.BasicExamStudentResult">
-        SELECT
-            bes.id,
-            bes.course_id courseId,
-            bc.name AS courseName,
-            bc.code AS courseCode,
-            bes.student_name AS studentName,
-            bes.student_code AS studentCode,
-            bes.college_name AS collegeName,
-            bes.major_name AS majorName,
-            bes.teach_class_name AS teachClassName,
-            bes.class_name AS className,
-            bes.paper_number AS paperNumber,
-            bes.paper_type paperType,
-            bes.status,
-            teacher.real_name AS teacherName,
-            teacher.code AS teacherCode,
-            bes.exam_start_time AS examStartTime,
-            bes.exam_end_time AS examEndTime,
-            bes.exam_place AS examPlace,
-            bes.exam_room AS examRoom,
-            so.name teachingRoomName
-        FROM
-            basic_exam_student bes
-                LEFT JOIN
-            basic_course bc ON bes.course_id = bc.id
-                LEFT JOIN
-            sys_user teacher ON bes.teacher_id = teacher.id
-                LEFT JOIN
-            sys_user su ON bes.create_id = su.id
-                LEFT JOIN
-            sys_org so ON bc.teaching_room_id = so.id
-        <where>
-            <if test="schoolId != null and schoolId != ''">
-                AND bes.school_id = #{schoolId}
-            </if>
-            <if test="semesterId != null">
-                AND bes.semester_id = #{semesterId}
-            </if>
-            <if test="examId != null">
-                AND bes.exam_id = #{examId}
-            </if>
-            <if test="courseId != null">
-                AND bes.course_id LIKE CONCAT('%',#{courseId},'%')
-            </if>
-            <if test="teacher != null and teacher != ''">
-                AND (teacher.real_name LIKE CONCAT('%',#{teacher},'%') OR teacher.code LIKE CONCAT('%',#{teacher},'%'))
-            </if>
-            <if test="college != null and college != ''">
-                AND bes.college_name LIKE CONCAT('%',#{college},'%')
-            </if>
-            <if test="major != null and major != ''">
-                AND bes.major LIKE CONCAT('%',#{major},'%')
-            </if>
-            <if test="teachClazz != null and teachClazz != ''">
-                AND tbc.clazz_name LIKE CONCAT('%',#{teachClazz},'%')
-            </if>
-            <if test="examStudentInfo != null and examStudentInfo != ''">
-                AND (bes.student_code LIKE CONCAT('%',#{examStudentInfo},'%') OR bes.student_name LIKE CONCAT('%',#{examStudentInfo},'%'))
-            </if>
-            <if test="dpr != null">
-                <if test="dpr.requestUserId != null">
-                    AND bes.create_id = #{dpr.requestUserId}
-                </if>
-                <if test="dpr.orgIdSet != null and dpr.orgIdSet != '' and dpr.orgIdSet.size > 0">
-                    AND bc.teaching_room_id IN
-                    <foreach collection="dpr.orgIdSet" item="item" index="index" open="(" separator="," close=")">
-                        #{item}
-                    </foreach>
-                </if>
-            </if>
-        </where>
-    </select>
     <select id="findBoundBasicExamStudentNames" resultType="java.lang.String">
         SELECT
             bes.student_name AS studentName

+ 1 - 0
distributed-print-business/src/main/resources/mapper/ConditionMapper.xml

@@ -933,6 +933,7 @@
                 </foreach>
             </if>
         </if>
+        and bes.paper_number is not null
     </select>
     <select id="listCourseForPrintCount" resultType="com.qmth.teachcloud.common.entity.BasicCourse">
         select

+ 8 - 31
distributed-print/src/main/java/com/qmth/distributed/print/api/BasicExamStudentController.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.api;
 
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.params.BasicExamStudentParam;
+import com.qmth.distributed.print.business.bean.query.BasicExamStudentPageQuery;
 import com.qmth.distributed.print.business.bean.result.BasicExamStudentResult;
 import com.qmth.distributed.print.business.service.BasicExamStudentService;
 import com.qmth.distributed.print.business.service.PrintCommonService;
@@ -23,10 +24,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
 import java.util.List;
 import java.util.Map;
 
@@ -57,27 +55,14 @@ public class BasicExamStudentController {
     @ApiOperation(value = "分页查询")
     @RequestMapping(value = "/page", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = BasicExamStudentResult.class)})
-    public Result findBasicExamStudentPage(@ApiParam(value = "学期id") @RequestParam(required = false) Long semesterId,
-                                           @ApiParam(value = "考试id") @RequestParam(required = false) Long examId,
-                                           @ApiParam(value = "开课学院ID") @RequestParam(required = false) Long openCollegeId,
-                                           @ApiParam(value = "课程ID") @RequestParam(required = false) Long courseId,
-                                           @ApiParam(value = "课程ID") @RequestParam(required = false) String paperNumber,
-                                           @ApiParam(value = "教师(工号/姓名)") @RequestParam(required = false) String teacher,
-                                           @ApiParam(value = "学院") @RequestParam(required = false) String college,
-                                           @ApiParam(value = "专业") @RequestParam(required = false) String major,
-                                           @ApiParam(value = "教学班(模糊查询)") @RequestParam(required = false) String teachClassName,
-                                           @ApiParam(value = "行政班(模糊查询)") @RequestParam(required = false) String className,
-                                           @ApiParam(value = "考生信息(姓名/学号)") @RequestParam(required = false) String examStudentInfo,
-                                           @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                           @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        if (semesterId == null) {
+    public Result findBasicExamStudentPage(@ApiParam(value = "查询条件") BasicExamStudentPageQuery query) {
+        if (query.getSemesterId() == null) {
             throw ExceptionResultEnum.ERROR.exception("请选择学期");
         }
-        if (examId == null) {
+        if (query.getExamId() == null) {
             throw ExceptionResultEnum.ERROR.exception("请选择考试");
         }
-        return ResultUtil.ok(basicExamStudentService.page(semesterId, examId,openCollegeId, courseId, paperNumber, teacher,
-                college, major, teachClassName, className, examStudentInfo, pageNumber, pageSize));
+        return ResultUtil.ok(basicExamStudentService.queryPage(query));
     }
 
     @ApiOperation(value = "新增/编辑")
@@ -129,17 +114,8 @@ public class BasicExamStudentController {
     @RequestMapping(value = "/export", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Result.class)})
     @OperationLogDetail(operationType = OperationTypeEnum.EXPORT)
-    public void export(@ApiParam(value = "学期id") @RequestParam(required = false) String semesterId,
-                       @ApiParam(value = "考试id") @RequestParam(required = false) String examId,
-                       @ApiParam(value = "课程编号") @RequestParam(required = false) Long courseId,
-                       @ApiParam(value = "教师(工号/姓名)") @RequestParam(required = false) String teacher,
-                       @ApiParam(value = "学院") @RequestParam(required = false) String college,
-                       @ApiParam(value = "专业") @RequestParam(required = false) String major,
-                       @ApiParam(value = "教学班(模糊查询)") @RequestParam(required = false) String teachClazz,
-                       @ApiParam(value = "考生信息(姓名/学号)") @RequestParam(required = false) String examStudentInfo, HttpServletResponse response) throws Exception {
-        basicExamStudentService.exportLogic(response, SystemConstant.convertIdToLong(semesterId),
-                SystemConstant.convertIdToLong(examId), courseId, teacher, college, major, teachClazz,
-                examStudentInfo);
+    public void export(@ApiParam(value = "查询条件") BasicExamStudentPageQuery query) throws Exception {
+        basicExamStudentService.exportLogic(query);
     }
 
     @ApiOperation(value = "删除时查询考生扫描阅卷状态")
@@ -148,6 +124,7 @@ public class BasicExamStudentController {
     public Result status(@ApiParam(value = "考生id集合", required = true) @RequestParam List<Long> idList) {
         return ResultUtil.ok(basicExamStudentService.getStudentMarkStatus(idList));
     }
+
     @ApiOperation(value = "删除")
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = Result.class)})

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/TaskTypeEnum.java

@@ -12,6 +12,7 @@ import java.util.Objects;
 public enum TaskTypeEnum {
     USER_IMPORT("用户导入"),
     BASIC_EXAM_STUDENT_IMPORT("考生导入"),
+    BASIC_EXAM_STUDENT_EXPORT("考生导出"),
     BASIC_EXAM_STUDENT_TEACHER_IMPORT("考生任课老师导入"),
     MARK_STUDENT_IMPORT("阅卷数据导入"),
     COURSE_DIMENSION_IMPORT("课程知识点导入"),

+ 1 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

@@ -110,6 +110,7 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
                 }
                 question.setExamId(examId);
                 question.setPaperNumber(paperNumber);
+                question.setPaperType(markPaper.getPaperType());
                 question.setCreateId(sysUser.getId());
                 question.setCreateTime(System.currentTimeMillis());
                 // 用来判断是否保存过