caozixuan 4 年之前
父節點
當前提交
f8f133d6f9
共有 15 個文件被更改,包括 1110 次插入1 次删除
  1. 6 0
      distributed-print-business/pom.xml
  2. 85 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/FieldsDto.java
  3. 153 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/ExaminationDetailResult.java
  4. 175 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/ExaminationResult.java
  5. 43 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/SummarizedDataResult.java
  6. 19 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamDetailMapper.java
  7. 81 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java
  8. 10 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBTaskService.java
  9. 134 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  10. 37 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBTaskServiceImpl.java
  11. 40 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/excelListener/ExaminationListener.java
  12. 112 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncExaminationImportTemplateService.java
  13. 99 0
      distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml
  14. 103 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamDetailController.java
  15. 13 0
      distributed-print/src/test/java/com/qmth/distributed/print/ServiceTest.java

+ 6 - 0
distributed-print-business/pom.xml

@@ -80,6 +80,12 @@
             <groupId>com.itextpdf</groupId>
             <artifactId>itextpdf</artifactId>
         </dependency>
+		<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>easyexcel</artifactId>
+			<version>2.2.8</version>
+		</dependency>
     </dependencies>
 
 </project>

+ 85 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/FieldsDto.java

@@ -0,0 +1,85 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+/**
+ * @Description: 考务字段Dto
+ * @Author: CaoZixuan
+ * @Date: 2021-04-07
+ */
+public class FieldsDto {
+
+    /**
+     * 考务字段代码
+     */
+    private String code;
+
+    /**
+     * 考务字段名称
+     */
+    private String name;
+
+    /**
+     * 考务字段是否可用(仅考务规则有)
+     */
+    private Boolean enable;
+
+    /**
+     * 考务字段值(仅考生有)
+     */
+    private String value;
+
+    /**
+     * 索引
+     */
+    private int index;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
+    @Override
+    public String toString() {
+        return "FieldsDto{" +
+                "code='" + code + '\'' +
+                ", name='" + name + '\'' +
+                ", enable=" + enable +
+                ", value='" + value + '\'' +
+                ", index=" + index +
+                '}';
+    }
+}

+ 153 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/ExaminationDetailResult.java

@@ -0,0 +1,153 @@
+package com.qmth.distributed.print.business.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 考务明细查询
+ * @Author: CaoZixuan
+ * @Date: 2021-04-08
+ */
+public class ExaminationDetailResult {
+    @ApiModelProperty(value = "考务数据-学生明细主键")
+    private Long id;
+
+    @ApiModelProperty(value = "印刷计划主键")
+    private Long printPlanId;
+
+    @ApiModelProperty(value = "印刷计划名称")
+    private String printPlanName;
+
+    @ApiModelProperty(value = "课程(代码)")
+    private String courseNameCode;
+
+    @ApiModelProperty(value = "试卷代码")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "考点")
+    private String examPlace;
+
+    @ApiModelProperty(value = "考场")
+    private String examRoom;
+
+    @ApiModelProperty(value = "准考证号")
+    private String ticketNumber;
+
+    @ApiModelProperty(value = "学号")
+    private String studentCode;
+
+    @ApiModelProperty(value = "学生姓名")
+    private String studentName;
+
+    @ApiModelProperty(value = "座位号")
+    private String siteNumber;
+
+    @ApiModelProperty(value = "创建人主键")
+    private Long createId;
+
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getPrintPlanId() {
+        return printPlanId;
+    }
+
+    public void setPrintPlanId(Long printPlanId) {
+        this.printPlanId = printPlanId;
+    }
+
+    public String getPrintPlanName() {
+        return printPlanName;
+    }
+
+    public void setPrintPlanName(String printPlanName) {
+        this.printPlanName = printPlanName;
+    }
+
+    public String getCourseNameCode() {
+        return courseNameCode;
+    }
+
+    public void setCourseNameCode(String courseNameCode) {
+        this.courseNameCode = courseNameCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getTicketNumber() {
+        return ticketNumber;
+    }
+
+    public void setTicketNumber(String ticketNumber) {
+        this.ticketNumber = ticketNumber;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getSiteNumber() {
+        return siteNumber;
+    }
+
+    public void setSiteNumber(String siteNumber) {
+        this.siteNumber = siteNumber;
+    }
+
+    public Long getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(Long createId) {
+        this.createId = createId;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+}

+ 175 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/ExaminationResult.java

@@ -0,0 +1,175 @@
+package com.qmth.distributed.print.business.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 考务数据查询-简略
+ * @Author: CaoZixuan
+ * @Date: 2021-04-07
+ */
+public class ExaminationResult {
+    @ApiModelProperty(value = "examDetailId")
+    private Long id;
+
+    @ApiModelProperty(value = "学校id")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "印刷计划id")
+    private Long printPlanId;
+
+    @ApiModelProperty(value = "印刷计划名称")
+    private String printPlanName;
+
+    @ApiModelProperty(value = "考试开始时间")
+    private Long examStartTime;
+
+    @ApiModelProperty(value = "考试结束时间")
+    private Long examEndTime;
+
+    @ApiModelProperty(value = "考点")
+    private String examPlace;
+
+    @ApiModelProperty(value = "考场")
+    private String examRoom;
+
+    @ApiModelProperty(value = "卷袋号")
+    private String packageCode;
+
+    @ApiModelProperty(value = "课程(代码)")
+    private String courseNameCode;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "科次")
+    private int totalSubjects;
+
+    @ApiModelProperty(value = "创建人id")
+    private Long createId;
+
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    @ApiModelProperty(value = "考务课程表主键组‘,’隔开")
+    private String examDetailCourseIds;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getPrintPlanId() {
+        return printPlanId;
+    }
+
+    public void setPrintPlanId(Long printPlanId) {
+        this.printPlanId = printPlanId;
+    }
+
+    public String getPrintPlanName() {
+        return printPlanName;
+    }
+
+    public void setPrintPlanName(String printPlanName) {
+        this.printPlanName = printPlanName;
+    }
+
+    public Long getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(Long examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public Long getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(Long examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+    public String getCourseNameCode() {
+        return courseNameCode;
+    }
+
+    public void setCourseNameCode(String courseNameCode) {
+        this.courseNameCode = courseNameCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public int getTotalSubjects() {
+        return totalSubjects;
+    }
+
+    public void setTotalSubjects(int totalSubjects) {
+        this.totalSubjects = totalSubjects;
+    }
+
+    public Long getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(Long createId) {
+        this.createId = createId;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getExamDetailCourseIds() {
+        return examDetailCourseIds;
+    }
+
+    public void setExamDetailCourseIds(String examDetailCourseIds) {
+        this.examDetailCourseIds = examDetailCourseIds;
+    }
+}

+ 43 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/SummarizedDataResult.java

@@ -0,0 +1,43 @@
+package com.qmth.distributed.print.business.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 汇总数据查询返回结果
+ * @Author: CaoZixuan
+ * @Date: 2021-04-08
+ */
+public class SummarizedDataResult {
+    @ApiModelProperty(value = "学校id")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "总科次")
+    private int totalSubjects;
+
+    @ApiModelProperty(value = "总卷袋数")
+    private int packageCount;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public int getTotalSubjects() {
+        return totalSubjects;
+    }
+
+    public void setTotalSubjects(int totalSubjects) {
+        this.totalSubjects = totalSubjects;
+    }
+
+    public int getPackageCount() {
+        return packageCount;
+    }
+
+    public void setPackageCount(int packageCount) {
+        this.packageCount = packageCount;
+    }
+}

+ 19 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamDetailMapper.java

@@ -4,6 +4,8 @@ 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.dto.ExamTaskDetailDto;
+import com.qmth.distributed.print.business.bean.result.ExaminationDetailResult;
+import com.qmth.distributed.print.business.bean.result.ExaminationResult;
 import com.qmth.distributed.print.business.entity.ExamDetail;
 import org.apache.ibatis.annotations.Param;
 
@@ -18,4 +20,21 @@ import org.apache.ibatis.annotations.Param;
 public interface ExamDetailMapper extends BaseMapper<ExamDetail> {
 
     IPage<ExamTaskDetailDto> listPrintTask(Long schoolId, String printPlanName, String status, String courseCode, String paperNumber, String examPlace, Long examStartTime, Long examEndTime);
+
+    IPage<ExaminationResult> findBriefPage(@Param("page") Page<ExaminationResult> page,
+                                           @Param("schoolId") Long schoolId,
+                                           @Param("printPlanName") String printPlanName,
+                                           @Param("courseCode") String courseCode,
+                                           @Param("paperNumber") String paperNumber,
+                                           @Param("examPlace") String examPlace,
+                                           @Param("examRoom") String examRoom,
+                                           @Param("packageCode") String packageCode);
+
+    IPage<ExaminationDetailResult> findDetailPage(@Param("page") Page<ExaminationDetailResult> page,
+                                                  @Param("printPlanId") Long printPlanId,
+                                                  @Param("courseCode")  String courseCode,
+                                                  @Param("paperNumber") String paperNumber,
+                                                  @Param("examPlace") String examPlace,
+                                                  @Param("examRoom") String examRoom,
+                                                  @Param("studentParam") String studentParam);
 }

+ 81 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java

@@ -3,9 +3,14 @@ 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.dto.ExamTaskDetailDto;
+import com.qmth.distributed.print.business.bean.dto.FieldsDto;
+import com.qmth.distributed.print.business.bean.result.ExaminationDetailResult;
+import com.qmth.distributed.print.business.bean.result.ExaminationResult;
+import com.qmth.distributed.print.business.bean.result.SummarizedDataResult;
 import com.qmth.distributed.print.business.entity.ExamDetail;
 import com.qmth.distributed.print.business.entity.ExamPrintPlan;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -36,4 +41,80 @@ public interface ExamDetailService extends IService<ExamDetail> {
     Map<String, Object> taskTotalData(String printPlanName, String status, String courseCode, String paperNumber, String examPlace, Long examStartTime, Long examEndTime);
 
     String taskViewPDF(Long id);
+
+    /**
+     * 查询有效的考务字段
+     * @param schoolId 学校id
+     * @return 考务字段
+     */
+    List<FieldsDto> findExaminationFields(Long schoolId);
+
+    /**
+     * 考务数据模板下载
+     * @param schoolId 学校id
+     * @return 是否成功
+     */
+    boolean downLoadExaminationTemplate(Long schoolId);
+
+
+    /**
+     * 查询考务数据-简略
+     * @param schoolId 学校id
+     * @param printPlanName 印刷计划名称
+     * @param courseCode 课程代码
+     * @param paperNumber 试卷编号
+     * @param examPlace 考点
+     * @param examRoom 考场
+     * @param packageCode 卷袋编号
+     * @param pageNumber 分页页码
+     * @param pageSize 分页数量
+     * @return 查询结果
+     */
+    IPage<ExaminationResult> findExaminationBriefPage(Long schoolId,String printPlanName,String courseCode,String paperNumber,
+                                                      String examPlace,String examRoom,String packageCode,int pageNumber,int pageSize);
+
+    /**
+     * 查询考务数据-汇总数据查询
+     * @param schoolId 学校id
+     * @param printPlanName 印刷计划名称
+     * @param courseCode 课程代码
+     * @param paperNumber 试卷编号
+     * @param examPlace 考点
+     * @param examRoom 考场
+     * @param packageCode 卷袋编号
+     * @return 查询结果
+     */
+    SummarizedDataResult findSummarizedData(Long schoolId,String printPlanName,String courseCode,String paperNumber,
+                                            String examPlace,String examRoom,String packageCode);
+
+
+    /**
+     * 查询考务数据-明细
+     * @param printPlanId 印刷计划id
+     * @param courseCode 课程代码
+     * @param paperNumber 试卷编号
+     * @param examPlace 考点
+     * @param examRoom 考场
+     * @param studentParam 学生查询参数
+     * @param pageNumber 分页页码
+     * @param pageSize 分页数量
+     * @return 查询结果
+     */
+    IPage<ExaminationDetailResult> findExaminationDetail(Long printPlanId,String courseCode,String paperNumber,String examPlace,
+                                                         String examRoom,String studentParam,int pageNumber,int pageSize);
+
+    /**
+     * 查询印刷计划下考点数据源
+     * @param printPlaneId 印刷计划id
+     * @return 考点集合
+     */
+    List<String> findExamPlaceDatasource(Long printPlaneId);
+
+    /**
+     * 查询印刷计划下考场数据源
+     * @param printPlaneId 印刷计划id
+     * @return 考场集合
+     */
+    List<String> findExamRoomDatasource(Long printPlaneId);
+
 }

+ 10 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBTaskService.java

@@ -30,6 +30,16 @@ public interface TBTaskService extends IService<TBTask> {
      */
     public Map<String, Object> saveTask(MultipartFile file, TaskTypeEnum taskTypeEnum);
 
+    /**
+     * 保存任务
+     *
+     * @param printPlanId
+     * @param file
+     * @param taskTypeEnum
+     * @return
+     */
+    public Map<String, Object> saveTask(Long printPlanId, MultipartFile file, TaskTypeEnum taskTypeEnum);
+
     /**
      * 保存任务
      *

+ 134 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -1,21 +1,32 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.dto.ExamTaskDetailDto;
+import com.qmth.distributed.print.business.bean.dto.FieldsDto;
+import com.qmth.distributed.print.business.bean.result.ExaminationDetailResult;
+import com.qmth.distributed.print.business.bean.result.ExaminationResult;
+import com.qmth.distributed.print.business.bean.result.SummarizedDataResult;
+import com.qmth.distributed.print.business.entity.BasicExamRule;
 import com.qmth.distributed.print.business.entity.ExamDetail;
+import com.qmth.distributed.print.business.entity.ExamDetailCourse;
 import com.qmth.distributed.print.business.entity.ExamPrintPlan;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.mapper.ExamDetailMapper;
+import com.qmth.distributed.print.business.service.BasicExamRuleService;
 import com.qmth.distributed.print.business.service.ExamDetailCourseService;
 import com.qmth.distributed.print.business.service.ExamDetailService;
+import com.qmth.distributed.print.common.contant.SystemConstant;
+import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -32,6 +43,11 @@ import java.util.stream.Collectors;
 public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDetail> implements ExamDetailService {
     @Resource
     private ExamDetailCourseService examDetailCourseService;
+    @Resource
+    private BasicExamRuleService basicExamRuleService;
+    @Resource
+    private ExamDetailMapper examDetailMapper;
+
 
     @Transactional(rollbackFor = Exception.class)
     @Override
@@ -68,4 +84,122 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     public String taskViewPDF(Long id) {
         return null;
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public List<FieldsDto> findExaminationFields(Long schoolId) {
+        BasicExamRule basicExamRule = basicExamRuleService.getBySchoolId(schoolId);
+        if (basicExamRule == null){
+            throw ExceptionResultEnum.ERROR.exception("找不到该学校考务字段信息 + schoolId" + schoolId);
+        }
+        String requiredFields = basicExamRule.getRequiredFields();
+        String extendFields = basicExamRule.getExtendFields();
+        // 必选字段
+        List<FieldsDto> requiredFieldsList = JSONObject.parseArray(requiredFields,FieldsDto.class);
+        if (requiredFieldsList.stream().anyMatch(e -> !e.getEnable())){
+            throw ExceptionResultEnum.ERROR.exception("该学校考务字段设置存在必选字段禁用的情况 schoolId = " + schoolId);
+        }
+        // 扩展字段
+        List<FieldsDto> extendFieldsList = JSONObject.parseArray(extendFields,FieldsDto.class);
+        List<String> extendCodeList = extendFieldsList.stream().map(FieldsDto::getCode).collect(Collectors.toList());
+        if (extendCodeList.stream().anyMatch(e -> requiredFieldsList.stream().map(FieldsDto::getCode).collect(Collectors.toList()).contains(e))){
+            throw ExceptionResultEnum.ERROR.exception("该学校考务字段设置存在相同的code schoolId = " + schoolId);
+        }
+        // 有效的扩展字段
+        List<FieldsDto> validExtendList = extendFieldsList.stream().filter(FieldsDto::getEnable).collect(Collectors.toList());
+
+        // 有效的考务字段
+        List<FieldsDto> validExaminationFieldList = new ArrayList<>();
+        validExaminationFieldList.addAll(requiredFieldsList);
+        validExaminationFieldList.addAll(validExtendList);
+        System.out.println("---" + validExaminationFieldList);
+
+        List<String> fieldsName = validExaminationFieldList.stream().map(FieldsDto::getName).collect(Collectors.toList());
+        for (String s : fieldsName) {
+            System.out.println(s);
+        }
+        return validExaminationFieldList;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean downLoadExaminationTemplate(Long schoolId) {
+        BasicExamRule basicExamRule = basicExamRuleService.getBySchoolId(schoolId);
+        if (basicExamRule == null){
+            throw ExceptionResultEnum.ERROR.exception("找不到该学校考务字段信息 + schoolId" + schoolId);
+        }
+
+        return false;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public IPage<ExaminationResult> findExaminationBriefPage(Long schoolId, String printPlanName, String courseCode, String paperNumber, String examPlace, String examRoom, String packageCode, int pageNumber, int pageSize) {
+        IPage<ExaminationResult> page = examDetailMapper.findBriefPage(new Page<>(pageNumber,pageSize),schoolId,printPlanName,courseCode,paperNumber,examPlace,examRoom,packageCode);
+        List<ExaminationResult> list = page.getRecords();
+        for (ExaminationResult examinationResult : list) {
+            String examDetailCourseIds = examinationResult.getExamDetailCourseIds();
+            if (examDetailCourseIds == null || examDetailCourseIds.length() == 0){
+                throw ExceptionResultEnum.ERROR.exception("考务数据确实课程信息");
+            }
+            String[] arr = examDetailCourseIds.split(",");
+
+            final String separator = "、";
+            String courseNameCodeStr = "";
+            String paperNumberStr = "";
+            for (String examDetailCourseId : arr) {
+                ExamDetailCourse examDetailCourse = examDetailCourseService.getById(examDetailCourseId);
+                String code = examDetailCourse.getCourseCode();
+                String name = examDetailCourse.getCourseName();
+                String number = examDetailCourse.getPaperNumber();
+                courseNameCodeStr = courseNameCodeStr + name + "(" + code + ")" + separator;
+                paperNumberStr = paperNumberStr + number + separator;
+            }
+            courseNameCodeStr = courseNameCodeStr.substring(0,courseNameCodeStr.length() - separator.length());
+            paperNumberStr = paperNumberStr.substring(0,paperNumberStr.length() - separator.length());
+            examinationResult.setCourseNameCode(courseNameCodeStr);
+            examinationResult.setPaperNumber(paperNumberStr);
+        }
+        return page;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public SummarizedDataResult findSummarizedData(Long schoolId, String printPlanName, String courseCode, String paperNumber, String examPlace, String examRoom, String packageCode) {
+        IPage<ExaminationResult> page = this.findExaminationBriefPage(schoolId, printPlanName, courseCode, paperNumber, examPlace, examRoom, packageCode, SystemConstant.PAGE_NUMBER, SystemConstant.PAGE_SIZE);
+        List<ExaminationResult> list = page.getRecords();
+        int totalSubjects = 0;
+        int packageCount = 0;
+        for (ExaminationResult examinationResult : list) {
+            int subjects = examinationResult.getTotalSubjects();
+            int packages = examinationResult.getCourseNameCode().split("、").length;
+            totalSubjects = totalSubjects + subjects;
+            packageCount = packageCount + packages;
+        }
+        SummarizedDataResult summarizedDataResult = new SummarizedDataResult();
+        summarizedDataResult.setSchoolId(schoolId);
+        summarizedDataResult.setTotalSubjects(totalSubjects);
+        summarizedDataResult.setPackageCount(packageCount);
+        return summarizedDataResult;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public IPage<ExaminationDetailResult> findExaminationDetail(Long printPlanId, String courseCode, String paperNumber, String examPlace, String examRoom, String studentParam, int pageNumber, int pageSize) {
+        return examDetailMapper.findDetailPage(new Page<>(pageNumber,pageSize),printPlanId,courseCode,paperNumber,examPlace,examRoom,studentParam);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public List<String> findExamPlaceDatasource(Long printPlaneId) {
+        List<ExamDetail> examDetail = this.list(new QueryWrapper<ExamDetail>().lambda().eq(ExamDetail::getPrintPlanId,printPlaneId));
+        return examDetail.stream().map(ExamDetail::getExamPlace).distinct().collect(Collectors.toList());
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public List<String> findExamRoomDatasource(Long printPlaneId) {
+        List<ExamDetail> examDetail = this.list(new QueryWrapper<ExamDetail>().lambda().eq(ExamDetail::getPrintPlanId,printPlaneId));
+        return examDetail.stream().map(ExamDetail::getExamRoom).distinct().collect(Collectors.toList());
+    }
 }

+ 37 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBTaskServiceImpl.java

@@ -87,6 +87,43 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
         return map;
     }
 
+    @Override
+    @Transactional
+    public Map<String, Object> saveTask(Long printPlanId, MultipartFile file, TaskTypeEnum taskTypeEnum) {
+        BasicAttachment basicAttachment = null;
+        Map<String, Object> map = null;
+        try {
+            basicAttachment = basicAttachmentService.saveAttachment(file, ServletUtil.getRequestMd5(), UploadFileEnum.FILE);
+            if (Objects.isNull(basicAttachment)) {
+                throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
+            } else {
+                SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+                TBTask tbTask = new TBTask(taskTypeEnum,
+                        TaskStatusEnum.INIT,
+                        basicAttachment.getName(),
+                        basicAttachment.getPath(),
+                        requestUser.getId(),
+                        requestUser.getSchoolId());
+                tbTask.setPrintPlanId(printPlanId);
+                map = new HashMap<>();
+                map.computeIfAbsent(SystemConstant.TASK, v -> tbTask);
+                map.computeIfAbsent(SystemConstant.USER, v -> requestUser);
+                this.save(tbTask);
+            }
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            if (Objects.nonNull(basicAttachment)) {
+                basicAttachmentService.deleteAttachment(basicAttachment);
+            }
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return map;
+    }
+
     /**
      * 保存任务
      *

+ 40 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/excelListener/ExaminationListener.java

@@ -0,0 +1,40 @@
+package com.qmth.distributed.print.business.templete.excelListener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 考务数据监听
+ * @Author: CaoZixuan
+ * @Date: 2021-04-07
+ */
+public class ExaminationListener extends AnalysisEventListener{
+    private List<Map<Integer, String>>  dataList= new ArrayList<>();
+
+    @Override
+    public void invoke(Object o, AnalysisContext analysisContext) {
+        System.out.println("当前行:"+analysisContext.getCurrentRowNum());
+        System.out.println(o);
+        Map<Integer, String> map = new HashMap<>();
+        map.put(analysisContext.readRowHolder().getRowIndex(), String.valueOf(o));
+        dataList.add(map);//数据存储到list,供批量处理,或后续自己业务逻辑处理。
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+    }
+
+    public List<Map<Integer, String>> getDataList() {
+        return dataList;
+    }
+
+    public void setDataList(List<Map<Integer, String>> dataList) {
+        this.dataList = dataList;
+    }
+}

+ 112 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncExaminationImportTemplateService.java

@@ -0,0 +1,112 @@
+package com.qmth.distributed.print.business.templete.execute;
+
+import com.alibaba.excel.ExcelReader;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.distributed.print.business.bean.dto.FieldsDto;
+import com.qmth.distributed.print.business.entity.ExamPrintPlan;
+import com.qmth.distributed.print.business.entity.TBTask;
+import com.qmth.distributed.print.business.enums.TaskStatusEnum;
+import com.qmth.distributed.print.business.service.ExamDetailService;
+import com.qmth.distributed.print.business.service.ExamPrintPlanService;
+import com.qmth.distributed.print.business.templete.excelListener.ExaminationListener;
+import com.qmth.distributed.print.business.templete.importData.AsyncImportTaskTemplete;
+import com.qmth.distributed.print.common.contant.SystemConstant;
+import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
+import com.qmth.distributed.print.common.util.Result;
+import org.omg.CORBA.OBJ_ADAPTER;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.MessageFormat;
+import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 考务数据导入模板
+ * @Author: CaoZixuan
+ * @Date: 2021-04-07
+ */
+@Service
+public class AsyncExaminationImportTemplateService extends AsyncImportTaskTemplete {
+    @Resource
+    private ExamDetailService examDetailService;
+    @Resource
+    private ExamPrintPlanService examPrintPlanService;
+
+    public static final String OBJ_TITLE = "考务数据";
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Result importTask(Map<String, Object> map) throws IOException {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        System.out.println("printPlanId = " + tbTask.getPrintPlanId());
+        InputStream inputStream = super.getUploadFileInputStream(tbTask);
+        StringJoiner stringJoinerSummary = new StringJoiner("\n")
+                .add(MessageFormat.format("{0}{1}{2}", FORMAT_TIME, BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        try {
+            ExaminationListener listener = new ExaminationListener();
+
+            ExcelReader excelReader = new ExcelReader(inputStream, ExcelTypeEnum.XLSX, null, listener);
+            excelReader.read();
+            // 解析的excel数据
+            List<Map<Integer, String>> dataList = listener.getDataList();
+            System.out.println(JSON.toJSONString(dataList));
+
+            // 表头列表
+            List<String> headerList = (List<String>) dataList.get(0);
+            // 该学校有效考务数据
+            List<FieldsDto> fieldsDtoList = examDetailService.findExaminationFields(tbTask.getSchoolId());
+            if (fieldsDtoList.size() == 0){
+                throw ExceptionResultEnum.ERROR.exception("该学校没有设置考务数据");
+            }
+            for (FieldsDto fieldsDto : fieldsDtoList) {
+                if (!headerList.contains(fieldsDto.getName())){
+                    System.out.println("exception " + fieldsDto.getName());
+                    throw ExceptionResultEnum.ERROR.exception("学校考务必填字段 :'" + fieldsDto.getName() + "' 不存在");
+                }
+            }
+            for (FieldsDto fieldsDto : fieldsDtoList) {
+                String name = fieldsDto.getName();
+                String code = fieldsDto.getCode();
+                for (int i = 0;i < headerList.size();i++){
+                    String headName = headerList.get(i);
+                    if (name.equals(headName)){
+                        fieldsDto.setIndex(i);
+                    }
+                }
+            }
+
+            // 组装exam_detail数据
+            Long schoolId = tbTask.getSchoolId();
+            Long printPlanId = tbTask.getPrintPlanId();
+            List<ExamPrintPlan> examPrintPlanList = examPrintPlanService.list(new QueryWrapper<ExamPrintPlan>().lambda().eq(ExamPrintPlan::getSchoolId,schoolId).eq(ExamPrintPlan::getId,printPlanId));
+            if (examPrintPlanList.size() != 1){
+                throw ExceptionResultEnum.ERROR.exception("没有找到对应的考试计划");
+            }
+            String printPlanName = examPrintPlanList.get(0).getName();
+            int examPlaceIndex = fieldsDtoList.stream().filter(e -> "examPlace".equals(e.getCode())).map(FieldsDto::getIndex).collect(Collectors.toList()).get(0);
+
+            // 组装exam_detail_course数据
+
+            // 组装exam_student数据
+
+
+
+
+
+        }catch (Exception e){
+
+        }finally {
+
+        }
+        return null;
+    }
+}

+ 99 - 0
distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml

@@ -28,4 +28,103 @@
     </sql>
     <select id="listPrintTask" resultType="com.qmth.distributed.print.business.bean.dto.ExamTaskDetailDto"></select>
 
+    <select id="findBriefPage" resultType="com.qmth.distributed.print.business.bean.result.ExaminationResult">
+        SELECT
+        det.id AS id,
+        MAX(det.school_id) AS schoolId,
+        MAX(det.print_plan_id) AS printPlanId,
+        MAX(det.print_plan_name) AS printPlanName,
+        MAX(det.exam_start_time) AS examStartTime,
+        MAX(det.exam_end_time) AS examEndTime,
+        MAX(det.exam_place) AS examPlace,
+        MAX(det.total_subjects) AS totalSubjects,
+        MAX(det.exam_room) AS examRoom,
+        MAX(det.package_code) AS packageCode,
+        MAX(det.create_id) AS createId,
+        MAX(det.create_time) AS createTime,
+        GROUP_CONCAT(cou.id) AS examDetailCourseIds,
+        GROUP_CONCAT(cou.course_code) AS courseCodes,
+        GROUP_CONCAT(cou.paper_number) AS paperNumbers
+        FROM
+        exam_detail det
+        INNER JOIN
+        exam_detail_course cou ON det.id = cou.exam_detail_id
+        AND det.school_id = cou.school_id
+        <where>
+            <if test="schoolId != null and schoolId > 0">
+                AND det.school_id = #{schoolId}
+            </if>
+            <if test="printPlanName != null and printPlanName.length > 0">
+                AND det.print_plan_name LIKE CONCAT('%',#{printPlanName},'%')
+            </if>
+            <if test="examPlace != null and examPlace.length > 0">
+                AND det.exam_place LIKE CONCAT('%',#{examPlace},'%')
+            </if>
+            <if test="examRoom != null and examRoom.length > 0">
+                AND det.exam_room LIKE CONCAT('%',#{examRoom},'%')
+            </if>
+            <if test="packageCode != null and packageCode.length > 0">
+                AND det.package_code LIKE CONCAT('%',#{packageCode},'%')
+            </if>
+        </where>
+        GROUP BY det.id
+        <trim prefix="having" suffixOverrides="and">
+            <if test="courseCode != null and courseCode.length > 0">
+                find_in_set(#{courseCode},courseCodes) and
+            </if>
+            <if test="paperNumber != null and paperNumber.length > 0">
+                find_in_set(#{paperNumber},paperNumbers) and
+            </if>
+        </trim>
+    </select>
+    <select id="findDetailPage"
+            resultType="com.qmth.distributed.print.business.bean.result.ExaminationDetailResult">
+        SELECT
+            stu.id AS id,
+            stu.exam_detail_course_id,
+            stu.student_name AS studentName,
+            stu.student_code AS studentCode,
+            stu.ticket_number AS ticketNumber,
+            stu.site_number AS siteNumber,
+            stu.create_id AS createId,
+            stu.create_time AS createTime,
+            CONCAT(cou.course_name,
+                   '(',
+                   cou.course_code,
+                   ')') AS courseNameCode,
+            cou.paper_number AS paperNumber,
+            det.print_plan_id AS printPlanId,
+            det.print_plan_name AS printPlanName,
+            det.exam_place AS examPlace,
+            det.exam_room AS examRoom
+        FROM
+            exam_student stu
+                INNER JOIN
+            exam_detail_course cou ON stu.exam_detail_course_id = cou.id
+                AND stu.school_id = cou.school_id
+                INNER JOIN
+            exam_detail det ON cou.exam_detail_id = det.id
+                AND stu.school_id = det.school_id
+        <where>
+            <if test="printPlanId != null and printPlanId > 0">
+                AND det.print_plan_id = #{printPlanId}
+            </if>
+            <if test="courseCode != null and courseCode.length > 0">
+                AND cou.course_code = #{courseCode}
+            </if>
+            <if test="paperNumber != null and paperNumber.length > 0">
+                AND cou.paper_number = #{paperNumber}
+            </if>
+            <if test="examPlace != null and examPlace.length > 0">
+                AND det.exam_place = #{examPlace}
+            </if>
+            <if test="examRoom != null and examRoom.length > 0">
+                AND det.exam_room = #{examRoom}
+            </if>
+            <if test="studentParam != null and studentParam.length > 0">
+                AND (stu.ticket_number LIKE CONCAT('%',#{studentParam},'%') OR stu.student_code LIKE CONCAT('%',#{studentParam},'%') OR stu.student_name LIKE CONCAT('%',#{studentParam},'%'))
+            </if>
+        </where>
+    </select>
+
 </mapper>

+ 103 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamDetailController.java

@@ -1,9 +1,30 @@
 package com.qmth.distributed.print.api;
 
 
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.entity.TBTask;
+import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
+import com.qmth.distributed.print.business.enums.TaskTypeEnum;
+import com.qmth.distributed.print.business.service.ExamDetailService;
+import com.qmth.distributed.print.business.service.TBTaskService;
+import com.qmth.distributed.print.business.templete.execute.AsyncExaminationImportTemplateService;
+import com.qmth.distributed.print.common.contant.SystemConstant;
+import com.qmth.distributed.print.common.util.Result;
+import com.qmth.distributed.print.common.util.ResultUtil;
+import io.swagger.annotations.*;
 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 javax.annotation.Resource;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * <p>
@@ -13,9 +34,90 @@ import org.springframework.web.bind.annotation.RestController;
  * @author xf
  * @since 2021-03-23
  */
+@Api(tags = "考务数据管理Controller")
 @RestController
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.exam}/print_relate")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.exam}/print")
+@Aac(auth = BOOL.FALSE)
 public class ExamDetailController {
+    @Resource
+    private TBTaskService tbTaskService;
+    @Resource
+    private AsyncExaminationImportTemplateService asyncExaminationImportTemplateService;
+    @Resource
+    private ExamDetailService examDetailService;
+
+    @ApiOperation(value = "异步考务数据批量导入接口")
+    @RequestMapping(value = "/data_import", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    public Result examinationImportAysnc(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
+                                         @ApiParam(value = "学校id", required = true) @RequestParam String schoolId,
+                                         @ApiParam(value = "印刷计划id", required = true) @RequestParam String printPlanId) throws IOException {
+        Map<String, Object> map = tbTaskService.saveTask(SystemConstant.convertIdToLong(printPlanId), file, TaskTypeEnum.EXAMINATION_IMPORT);
+        asyncExaminationImportTemplateService.importTask(map);
+        TBTask tbTask = Objects.nonNull(map.get(SystemConstant.TASK)) ? (TBTask) map.get(SystemConstant.TASK) : null;
+        return Objects.nonNull(tbTask) ? ResultUtil.ok(tbTask.getId()) : ResultUtil.error("创建任务失败");
+    }
+
+    @ApiOperation(value = "考务数据导入-查询")
+    @RequestMapping(value = "/data_list", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findExaminationBrief(@ApiParam(value = "学校主键", required = true) @RequestParam String schoolId,
+                                       @ApiParam(value = "印刷计划名称") @RequestParam(required = false) String printPlanName,
+                                       @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode,
+                                       @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
+                                       @ApiParam(value = "考点") @RequestParam(required = false) String examPlace,
+                                       @ApiParam(value = "考场") @RequestParam(required = false) String examRoom,
+                                       @ApiParam(value = "卷袋号") @RequestParam(required = false) String packageCode,
+                                       @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                                       @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+
+        return ResultUtil.ok(examDetailService.findExaminationBriefPage(SystemConstant.convertIdToLong(schoolId),
+                printPlanName, courseCode, paperNumber, examPlace, examRoom, packageCode, pageNumber, pageSize));
+    }
+
+    @ApiOperation(value = "考务数据导入-汇总数据查询")
+    @RequestMapping(value = "/data_total", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findSummarizedData(@ApiParam(value = "学校主键", required = true) @RequestParam String schoolId,
+                                     @ApiParam(value = "印刷计划名称") @RequestParam(required = false) String printPlanName,
+                                     @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode,
+                                     @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
+                                     @ApiParam(value = "考点") @RequestParam(required = false) String examPlace,
+                                     @ApiParam(value = "考场") @RequestParam(required = false) String examRoom,
+                                     @ApiParam(value = "卷袋号") @RequestParam(required = false) String packageCode) {
+
+        return ResultUtil.ok(examDetailService.findSummarizedData(SystemConstant.convertIdToLong(schoolId),
+                printPlanName, courseCode, paperNumber, examPlace, examRoom, packageCode));
+    }
+
+    @ApiOperation(value = "考务数据导入-查看明细")
+    @RequestMapping(value = "/data_detail", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findExaminationDetail(@ApiParam(value = "印刷计划主键", required = true) @RequestParam String printPlanId,
+                                        @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode,
+                                        @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
+                                        @ApiParam(value = "考点") @RequestParam(required = false) String examPlace,
+                                        @ApiParam(value = "考场") @RequestParam(required = false) String examRoom,
+                                        @ApiParam(value = "学生查询参数") @RequestParam(required = false) String studentParam,
+                                        @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                                        @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+
+        return ResultUtil.ok(examDetailService.findExaminationDetail(SystemConstant.convertIdToLong(printPlanId),
+                courseCode, paperNumber, examPlace, examRoom, studentParam, pageNumber, pageSize));
+    }
+
+    @ApiOperation(value = "考务数据导入-考点模糊查询")
+    @RequestMapping(value = "/data_place_query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findExamPlaceDatasource(@ApiParam(value = "印刷计划主键", required = true) @RequestParam String printPlanId) {
+        return ResultUtil.ok(examDetailService.findExamPlaceDatasource(SystemConstant.convertIdToLong(printPlanId)));
+    }
 
+    @ApiOperation(value = "考务数据导入-考场模糊查询")
+    @RequestMapping(value = "/data_room_query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findExamRoomDatasource(@ApiParam(value = "印刷计划主键", required = true) @RequestParam String printPlanId) {
+        return ResultUtil.ok(examDetailService.findExamRoomDatasource(SystemConstant.convertIdToLong(printPlanId)));
+    }
 }
 

+ 13 - 0
distributed-print/src/test/java/com/qmth/distributed/print/ServiceTest.java

@@ -1,7 +1,10 @@
 package com.qmth.distributed.print;
 
+import com.qmth.distributed.print.api.ExamDetailController;
 import com.qmth.distributed.print.business.bean.result.TemplatePrintInfoResult;
+import com.qmth.distributed.print.business.entity.ExamDetail;
 import com.qmth.distributed.print.business.service.BasicTemplateOrgService;
+import com.qmth.distributed.print.business.service.ExamDetailService;
 import com.qmth.distributed.print.business.service.ExamPrintPlanService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -24,6 +27,10 @@ public class ServiceTest {
     private ExamPrintPlanService examPrintPlanService;
     @Resource
     private BasicTemplateOrgService basicTemplateOrgService;
+    @Resource
+    private ExamDetailService examDetailService;
+    @Resource
+    private ExamDetailController examDetailController;
 
 
     @Test
@@ -41,4 +48,10 @@ public class ServiceTest {
             System.out.println(templatePrintInfoResult);
         }
     }
+
+    @Test
+    public void readExcelTest(){
+        examDetailService.findExaminationFields(101L);
+    }
+
 }