Jelajahi Sumber

3.3.0 update

xiaofei 1 tahun lalu
induk
melakukan
ae75a1f87f
29 mengubah file dengan 436 tambahan dan 208 penghapusan
  1. 44 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamDetailCourseFieldsDto.java
  2. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExaminationImportDto.java
  3. 0 61
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExtendFieldsDto.java
  4. 0 99
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/FieldsDto.java
  5. 26 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/examRule/CodeName.java
  6. 17 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/examRule/CodeNameEnable.java
  7. 26 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/examRule/CodeNameEnableDisabled.java
  8. 17 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/examRule/CodeNameEnableValue.java
  9. 36 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/examRule/FieldsDto.java
  10. 50 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/SingleExamStudentAddParam.java
  11. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetailCourse.java
  12. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamStudent.java
  13. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamStudentMapper.java
  14. 6 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailCourseService.java
  15. 1 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java
  16. 3 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamStudentService.java
  17. 1 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamRuleServiceImpl.java
  18. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ClientServiceImpl.java
  19. 91 23
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailCourseServiceImpl.java
  20. 9 7
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  21. 6 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamStudentServiceImpl.java
  22. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncExaminationImportTemplateService.java
  23. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  24. 2 2
      distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml
  25. 10 3
      distributed-print-business/src/main/resources/mapper/ExamStudentMapper.xml
  26. 2 0
      distributed-print-business/src/main/resources/mapper/TeachCourseMapper.xml
  27. 8 0
      distributed-print/install/mysql/upgrade/3.3.0.sql
  28. 30 4
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamDetailController.java
  29. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

+ 44 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamDetailCourseFieldsDto.java

@@ -0,0 +1,44 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.distributed.print.business.bean.examRule.CodeName;
+import com.qmth.distributed.print.business.entity.ExamDetailCourse;
+
+import java.util.List;
+
+public class ExamDetailCourseFieldsDto {
+
+    private ExamDetailCourse examDetailCourse;
+
+    /**
+     * 基础必填字段
+     */
+    private List<CodeName> requiredFields;
+    /**
+     * 扩展字段
+     */
+    private List<CodeName> extendFields;
+
+    public ExamDetailCourse getExamDetailCourse() {
+        return examDetailCourse;
+    }
+
+    public void setExamDetailCourse(ExamDetailCourse examDetailCourse) {
+        this.examDetailCourse = examDetailCourse;
+    }
+
+    public List<CodeName> getRequiredFields() {
+        return requiredFields;
+    }
+
+    public void setRequiredFields(List<CodeName> requiredFields) {
+        this.requiredFields = requiredFields;
+    }
+
+    public List<CodeName> getExtendFields() {
+        return extendFields;
+    }
+
+    public void setExtendFields(List<CodeName> extendFields) {
+        this.extendFields = extendFields;
+    }
+}

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExaminationImportDto.java

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.business.bean.dto;
 
+import com.qmth.distributed.print.business.bean.examRule.CodeNameEnableValue;
+import com.qmth.distributed.print.business.bean.examRule.FieldsDto;
 import com.qmth.teachcloud.common.annotation.ExcelDBFieldDesc;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -71,6 +73,8 @@ public class ExaminationImportDto {
     @ApiModelProperty(value = "课程创建的任务序号")
     private String sequence;
 
+    @ApiModelProperty(value = "备选字段集合")
+    private List<CodeNameEnableValue> requiredFieldList;
     @ApiModelProperty(value = "备选字段集合")
     private List<FieldsDto> secondaryFieldList;
 
@@ -185,6 +189,14 @@ public class ExaminationImportDto {
         this.sequence = sequence;
     }
 
+    public List<CodeNameEnableValue> getRequiredFieldList() {
+        return requiredFieldList;
+    }
+
+    public void setRequiredFieldList(List<CodeNameEnableValue> requiredFieldList) {
+        this.requiredFieldList = requiredFieldList;
+    }
+
     public List<FieldsDto> getSecondaryFieldList() {
         return secondaryFieldList;
     }

+ 0 - 61
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExtendFieldsDto.java

@@ -1,61 +0,0 @@
-package com.qmth.distributed.print.business.bean.dto;
-
-/**
- * @Description: 考务学生-扩展字段
- * @Author: CaoZixuan
- * @Date: 2021-04-21
- */
-public class ExtendFieldsDto {
-
-    /**
-     * 考务字段代码
-     */
-    private String code;
-
-    /**
-     * 考务字段名称
-     */
-    private String name;
-
-    /**
-     * 考务字段是否可用(仅考务规则有)
-     */
-    private Boolean enable;
-
-    /**
-     * 考务字段值(仅考生有)
-     */
-    private String value;
-
-    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;
-    }
-}

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

@@ -1,99 +0,0 @@
-package com.qmth.distributed.print.business.bean.dto;
-
-import io.swagger.annotations.ApiModelProperty;
-
-/**
- * @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;
-
-    @ApiModelProperty(value = "字段级别(必选字段 - 'primary'、扩展字段 - 'secondary')")
-    private String level;
-
-    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;
-    }
-
-    public String getLevel() {
-        return level;
-    }
-
-    public void setLevel(String level) {
-        this.level = level;
-    }
-
-    @Override
-    public String toString() {
-        return "FieldsDto{" +
-                "code='" + code + '\'' +
-                ", name='" + name + '\'' +
-                ", enable=" + enable +
-                ", value='" + value + '\'' +
-                ", index=" + index +
-                ", level='" + level + '\'' +
-                '}';
-    }
-}

+ 26 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/examRule/CodeName.java

@@ -0,0 +1,26 @@
+package com.qmth.distributed.print.business.bean.examRule;
+
+/**
+ * basic_exam_rule表中sign_scope、package_scope字段对应实体
+ */
+public class CodeName {
+
+    private String code;
+    private String name;
+
+    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;
+    }
+}

+ 17 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/examRule/CodeNameEnable.java

@@ -0,0 +1,17 @@
+package com.qmth.distributed.print.business.bean.examRule;
+
+/**
+ * basic_card_rule表中required_fields、extend_fields字段对应实体
+ */
+public class CodeNameEnable extends CodeName {
+
+    private Boolean enable;
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+}

+ 26 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/examRule/CodeNameEnableDisabled.java

@@ -0,0 +1,26 @@
+package com.qmth.distributed.print.business.bean.examRule;
+
+/**
+ * basic_exam_rule表中required_fields、extend_fields字段对应实体
+ */
+public class CodeNameEnableDisabled extends CodeNameEnable {
+
+    private boolean disabled;
+    private int ordinal;
+
+    public boolean isDisabled() {
+        return disabled;
+    }
+
+    public void setDisabled(boolean disabled) {
+        this.disabled = disabled;
+    }
+
+    public int getOrdinal() {
+        return ordinal;
+    }
+
+    public void setOrdinal(int ordinal) {
+        this.ordinal = ordinal;
+    }
+}

+ 17 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/examRule/CodeNameEnableValue.java

@@ -0,0 +1,17 @@
+package com.qmth.distributed.print.business.bean.examRule;
+
+/**
+ * exam_student表中required_fields、extend_fields字段对应实体
+ */
+public class CodeNameEnableValue extends CodeNameEnable{
+
+    private String value;
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}

+ 36 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/examRule/FieldsDto.java

@@ -0,0 +1,36 @@
+package com.qmth.distributed.print.business.bean.examRule;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 考务字段Dto
+ * @Author: CaoZixuan
+ * @Date: 2021-04-07
+ */
+public class FieldsDto extends CodeNameEnableValue {
+
+    /**
+     * 索引
+     */
+    private int index;
+
+    @ApiModelProperty(value = "字段级别(必选字段 - 'primary'、扩展字段 - 'secondary')")
+    private String level;
+
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+}

+ 50 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/SingleExamStudentAddParam.java

@@ -0,0 +1,50 @@
+package com.qmth.distributed.print.business.bean.params;
+
+import com.qmth.distributed.print.business.bean.examRule.CodeNameEnableValue;
+import com.qmth.distributed.print.business.entity.ExamDetailCourse;
+import com.qmth.teachcloud.common.base.BasePage;
+
+import java.util.List;
+
+/**
+ * 新增考生request
+ */
+public class SingleExamStudentAddParam extends BasePage {
+
+    private Long examId;
+    private ExamDetailCourse examDetailCourse;
+    private List<CodeNameEnableValue> requiredFields;
+    private List<CodeNameEnableValue> extendFields;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public ExamDetailCourse getExamDetailCourse() {
+        return examDetailCourse;
+    }
+
+    public void setExamDetailCourse(ExamDetailCourse examDetailCourse) {
+        this.examDetailCourse = examDetailCourse;
+    }
+
+    public List<CodeNameEnableValue> getRequiredFields() {
+        return requiredFields;
+    }
+
+    public void setRequiredFields(List<CodeNameEnableValue> requiredFields) {
+        this.requiredFields = requiredFields;
+    }
+
+    public List<CodeNameEnableValue> getExtendFields() {
+        return extendFields;
+    }
+
+    public void setExtendFields(List<CodeNameEnableValue> extendFields) {
+        this.extendFields = extendFields;
+    }
+}

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetailCourse.java

@@ -42,6 +42,9 @@ public class ExamDetailCourse extends BaseEntity implements Serializable {
     @TableField("paper_number")
     private String paperNumber;
 
+    @TableField("course_paper_id")
+    private String coursePaperId;
+
     @TableField("total_subjects")
     private Integer totalSubjects;
 
@@ -125,6 +128,14 @@ public class ExamDetailCourse extends BaseEntity implements Serializable {
         this.paperNumber = paperNumber;
     }
 
+    public String getCoursePaperId() {
+        return coursePaperId;
+    }
+
+    public void setCoursePaperId(String coursePaperId) {
+        this.coursePaperId = coursePaperId;
+    }
+
     public Integer getTotalSubjects() {
         return totalSubjects;
     }

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamStudent.java

@@ -64,6 +64,9 @@ public class ExamStudent extends BaseEntity implements Serializable {
     @TableField("print_card")
     private Integer printCard;
 
+    @TableField("required_fields")
+    private String requiredFields;
+
     @TableField("extend_fields")
     private String extendFields;
 
@@ -202,6 +205,14 @@ public class ExamStudent extends BaseEntity implements Serializable {
         this.printCard = printCard;
     }
 
+    public String getRequiredFields() {
+        return requiredFields;
+    }
+
+    public void setRequiredFields(String requiredFields) {
+        this.requiredFields = requiredFields;
+    }
+
     public String getExtendFields() {
         return extendFields;
     }

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamStudentMapper.java

@@ -60,4 +60,6 @@ public interface ExamStudentMapper extends BaseMapper<ExamStudent> {
     List<String> listTicketNumberByExamId(@Param("examId") Long examId);
 
     List<String> listUserClass(@Param("schoolId") Long schoolId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber);
+
+    ExamStudent listByExamDetailCourseIdLimit1(@Param("schoolId") Long schoolId, @Param("examDetailCourseId") Long examDetailCourseId);
 }

+ 6 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailCourseService.java

@@ -3,7 +3,9 @@ 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.ExamDetailCourseDto;
+import com.qmth.distributed.print.business.bean.dto.ExamDetailCourseFieldsDto;
 import com.qmth.distributed.print.business.bean.dto.SyncExamTaskDto;
+import com.qmth.distributed.print.business.bean.params.SingleExamStudentAddParam;
 import com.qmth.distributed.print.business.entity.ExamDetailCourse;
 import com.qmth.distributed.print.business.enums.ExamTaskSyncStatusEnum;
 import com.qmth.distributed.print.business.enums.SyncCardTypeEnum;
@@ -45,4 +47,8 @@ public interface ExamDetailCourseService extends IService<ExamDetailCourse> {
     List<String> listPaperNumberByPrintPlanId(String param, List<Long> printPlanIdList, Set<Long> orgIds);
 
     List<ExamDetailCourse> listByExamDetailId(Long examDetailId);
+
+    List<ExamDetailCourseFieldsDto> listExamDetailPaperNumber(Long examDetailId);
+
+    boolean addExamStudent(SingleExamStudentAddParam singleExamStudentAddParam);
 }

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

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.dto.*;
+import com.qmth.distributed.print.business.bean.examRule.FieldsDto;
 import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 import com.qmth.distributed.print.business.bean.result.ExaminationDetailResult;
 import com.qmth.distributed.print.business.bean.result.ExaminationResult;

+ 3 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamStudentService.java

@@ -22,7 +22,7 @@ import java.util.Map;
  */
 public interface ExamStudentService extends IService<ExamStudent> {
 
-    List<String> listByExamDetailCourseId(String examDetailCourseId);
+    List<String> listPaperTypeByExamDetailCourseId(String examDetailCourseId);
 
     Map<String, Object> getStudentDetail(Long id);
 
@@ -52,4 +52,6 @@ public interface ExamStudentService extends IService<ExamStudent> {
     void removeByExamDetailCourseId(Long id);
 
     List<String> listUserClass(Long schoolId, Long examId, String paperNumber);
+
+    ExamStudent listByExamDetailCourseIdLimit1(Long schoolId, Long examDetailCourseId);
 }

+ 1 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamRuleServiceImpl.java

@@ -4,10 +4,8 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.distributed.print.business.bean.dto.FieldsDto;
+import com.qmth.distributed.print.business.bean.examRule.FieldsDto;
 import com.qmth.distributed.print.business.entity.BasicExamRule;
-import com.qmth.distributed.print.business.entity.ExamPrintPlan;
-import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.enums.RequiredFieldsEnum;
 import com.qmth.distributed.print.business.mapper.BasicExamRuleMapper;
 import com.qmth.distributed.print.business.service.BasicExamRuleService;
@@ -19,7 +17,6 @@ import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
-import org.springframework.util.DigestUtils;
 
 import javax.annotation.Resource;
 import java.util.*;

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ClientServiceImpl.java

@@ -335,7 +335,7 @@ public class ClientServiceImpl implements ClientService {
                 for (Map<String, Object> examDetailCours : examDetailCourses) {
                     String examDetailCourseId = examDetailCours.get("examDetailCourseId").toString();
                     // 考生使用卷型
-                    List<String> studentPaperTypes = examStudentService.listByExamDetailCourseId(examDetailCourseId);
+                    List<String> studentPaperTypes = examStudentService.listPaperTypeByExamDetailCourseId(examDetailCourseId);
                     Object exposedPaperType = examDetailCours.get("exposedPaperType");
                     Set<String> exposedPaperSet = Objects.isNull(exposedPaperType) ? new HashSet<>() : new HashSet<>(Arrays.asList(exposedPaperType.toString().split(",")));
                     Object unexposedPaperType = examDetailCours.get("unexposedPaperType");

+ 91 - 23
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailCourseServiceImpl.java

@@ -1,37 +1,33 @@
 package com.qmth.distributed.print.business.service.impl;
 
 import com.alibaba.fastjson.JSON;
-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.ExamDetailCourseDto;
-import com.qmth.distributed.print.business.bean.dto.SyncExamTaskDto;
+import com.qmth.distributed.print.business.bean.dto.ExamDetailCourseFieldsDto;
+import com.qmth.distributed.print.business.bean.examRule.CodeName;
+import com.qmth.distributed.print.business.bean.examRule.CodeNameEnable;
+import com.qmth.distributed.print.business.bean.examRule.CodeNameEnableValue;
+import com.qmth.distributed.print.business.bean.params.SingleExamStudentAddParam;
 import com.qmth.distributed.print.business.entity.ExamDetailCourse;
-import com.qmth.distributed.print.business.enums.CardTypeEnum;
+import com.qmth.distributed.print.business.entity.ExamStudent;
 import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
 import com.qmth.distributed.print.business.enums.ExamStatusEnum;
-import com.qmth.distributed.print.business.enums.SyncCardTypeEnum;
 import com.qmth.distributed.print.business.mapper.ExamDetailCourseMapper;
-import com.qmth.distributed.print.business.service.ExamCardService;
 import com.qmth.distributed.print.business.service.ExamDetailCourseService;
-import com.qmth.distributed.print.business.service.ExamTaskDetailService;
+import com.qmth.distributed.print.business.service.ExamStudentService;
 import com.qmth.teachcloud.common.bean.result.TbTaskDetailResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
-import com.qmth.teachcloud.common.entity.SysOrg;
 import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.enums.CardCreateMethodEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.service.SysOrgService;
-import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ServletUtil;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.lang.reflect.Field;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -47,16 +43,7 @@ import java.util.stream.Collectors;
 public class ExamDetailCourseServiceImpl extends ServiceImpl<ExamDetailCourseMapper, ExamDetailCourse> implements ExamDetailCourseService {
 
     @Resource
-    private ExamTaskDetailService examTaskDetailService;
-
-    @Resource
-    private ExamCardService examCardService;
-
-    @Resource
-    private SysOrgService sysOrgService;
-
-    @Resource
-    private TeachcloudCommonService teachcloudCommonService;
+    private ExamStudentService examStudentService;
 
     @Override
     public List<Map<String, Object>> listClientByExamDetailIdAndStatus(Long examDetailId) {
@@ -120,4 +107,85 @@ public class ExamDetailCourseServiceImpl extends ServiceImpl<ExamDetailCourseMap
                 .eq(ExamDetailCourse::getExamDetailId, examDetailId);
         return this.list(queryWrapper);
     }
+
+    @Override
+    public List<ExamDetailCourseFieldsDto> listExamDetailPaperNumber(Long examDetailId) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        QueryWrapper<ExamDetailCourse> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ExamDetailCourse::getSchoolId, schoolId)
+                .eq(ExamDetailCourse::getExamDetailId, examDetailId)
+                .orderByAsc(ExamDetailCourse::getCourseCode);
+        List<ExamDetailCourse> examDetailCourseList = this.list(queryWrapper);
+        List<ExamDetailCourseFieldsDto> examDetailCourseFieldsDtoList = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(examDetailCourseList)) {
+            for (ExamDetailCourse examDetailCourse : examDetailCourseList) {
+                ExamDetailCourseFieldsDto examDetailCourseFieldsDto = new ExamDetailCourseFieldsDto();
+                examDetailCourseFieldsDto.setExamDetailCourse(examDetailCourse);
+                // 查询一条考生数据,拿到使用的必填字段和扩展字段
+                ExamStudent examStudent = examStudentService.listByExamDetailCourseIdLimit1(schoolId, examDetailCourse.getId());
+                List<CodeName> requireds = new ArrayList<>();
+                List<CodeName> extendes = new ArrayList<>();
+                if (examStudent != null) {
+                    List<CodeNameEnableValue> studentRequiredFieldList = JSON.parseArray(examStudent.getRequiredFields(), CodeNameEnableValue.class);
+                    if (CollectionUtils.isNotEmpty(studentRequiredFieldList)) {
+                        requireds = studentRequiredFieldList.stream().map(m -> {
+                            CodeName codeName = new CodeName();
+                            codeName.setCode(m.getCode());
+                            codeName.setName(m.getName());
+                            return codeName;
+                        }).collect(Collectors.toList());
+                    }
+                    List<CodeNameEnableValue> studentExtendFieldList = JSON.parseArray(examStudent.getExtendFields(), CodeNameEnableValue.class);
+                    if (CollectionUtils.isNotEmpty(studentExtendFieldList)) {
+                        extendes = studentExtendFieldList.stream().map(m -> {
+                            CodeName codeName = new CodeName();
+                            codeName.setCode(m.getCode());
+                            codeName.setName(m.getName());
+                            return codeName;
+                        }).collect(Collectors.toList());
+                    }
+                }
+                examDetailCourseFieldsDto.setRequiredFields(requireds);
+                examDetailCourseFieldsDto.setExtendFields(extendes);
+                examDetailCourseFieldsDtoList.add(examDetailCourseFieldsDto);
+            }
+        }
+        return examDetailCourseFieldsDtoList;
+    }
+
+    @Override
+    public boolean addExamStudent(SingleExamStudentAddParam singleExamStudentAddParam) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        ExamStudent examStudent = new ExamStudent();
+
+        try {
+            Field[] examinationImportDtoFields = examStudent.getClass().getDeclaredFields();
+            for (CodeNameEnableValue requiredField : singleExamStudentAddParam.getRequiredFields()) {
+                for (Field examinationImportDtoField : examinationImportDtoFields) {
+                    if(!examinationImportDtoField.getName().equals(requiredField.getCode())){
+                        continue;
+                    }
+                    examinationImportDtoField.setAccessible(true);
+                    examinationImportDtoField.set(requiredField.getCode(), requiredField.getValue());
+                }
+            }
+        } catch (IllegalAccessException e) {
+            throw ExceptionResultEnum.ERROR.exception("必选字段赋值失败");
+        }
+
+        examStudent.setId(SystemConstant.getDbUuid());
+        examStudent.setSchoolId(schoolId);
+        examStudent.setExamId(singleExamStudentAddParam.getExamId());
+        examStudent.setExamDetailCourseId(singleExamStudentAddParam.getExamDetailCourse().getId());
+        examStudent.setPaperNumber(singleExamStudentAddParam.getExamDetailCourse().getPaperNumber());
+        examStudent.setCoursePaperId(singleExamStudentAddParam.getExamDetailCourse().getCoursePaperId());
+        examStudent.setExtendFields(JSON.toJSONString(singleExamStudentAddParam.getExtendFields()));
+        examStudent.setCreateId(sysUser.getId());
+        examStudent.setCreateTime(System.currentTimeMillis());
+        examStudentService.save(examStudent);
+
+        // todo 往exam_student表插入扫描数据
+        return false;
+    }
 }

+ 9 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -5,13 +5,14 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.Update;
 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.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.*;
+import com.qmth.distributed.print.business.bean.examRule.CodeNameEnableValue;
+import com.qmth.distributed.print.business.bean.examRule.FieldsDto;
 import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 import com.qmth.distributed.print.business.bean.result.ExaminationDetailResult;
 import com.qmth.distributed.print.business.bean.result.ExaminationResult;
@@ -750,7 +751,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             String clazzName = examinationImportDto.getClazzName();
 
             List<FieldsDto> fieldsDtoList = examinationImportDto.getSecondaryFieldList();
-            List<ExtendFieldsDto> extendFieldsDtoList = this.getExtendFieldsByFields(fieldsDtoList);
+            List<CodeNameEnableValue> extendFieldsDtoList = this.getExtendFieldsByFields(fieldsDtoList);
 
             ExamStudent examStudent = new ExamStudent();
             examStudent.setId(SystemConstant.getDbUuid());
@@ -762,6 +763,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             examStudent.setStudentCode(studentCode);
             examStudent.setStudentName(studentName);
             examStudent.setTicketNumber(ticketNumber);
+            examStudent.setRequiredFields(JSON.toJSONString(examinationImportDto.getRequiredFieldList()));
             examStudent.setExtendFields(JSON.toJSONString(extendFieldsDtoList));
             examStudent.setSiteNumber(siteNumber);
             examStudent.setCollegeName(collegeName);
@@ -1245,12 +1247,12 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         examStudentService.remove(new QueryWrapper<ExamStudent>().lambda().in(ExamStudent::getId, examStudentIds));
     }
 
-    private List<ExtendFieldsDto> getExtendFieldsByFields(List<FieldsDto> fieldsDtoList) {
-        List<ExtendFieldsDto> extendFieldsDtoList = new ArrayList<>();
+    private List<CodeNameEnableValue> getExtendFieldsByFields(List<FieldsDto> fieldsDtoList) {
+        List<CodeNameEnableValue> extendFieldsDtoList = new ArrayList<>();
         for (FieldsDto fieldsDto : fieldsDtoList) {
-            ExtendFieldsDto extendFieldsDto = new ExtendFieldsDto();
-            BeanUtils.copyProperties(fieldsDto, extendFieldsDto);
-            extendFieldsDtoList.add(extendFieldsDto);
+            CodeNameEnableValue codeNameEnableValue = new CodeNameEnableValue();
+            BeanUtils.copyProperties(fieldsDto, codeNameEnableValue);
+            extendFieldsDtoList.add(codeNameEnableValue);
         }
         return extendFieldsDtoList;
     }

+ 6 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamStudentServiceImpl.java

@@ -41,7 +41,7 @@ public class ExamStudentServiceImpl extends ServiceImpl<ExamStudentMapper, ExamS
     ExamDetailCourseMapper examDetailCourseMapper;
 
     @Override
-    public List<String> listByExamDetailCourseId(String examDetailCourseId) {
+    public List<String> listPaperTypeByExamDetailCourseId(String examDetailCourseId) {
         QueryWrapper<ExamStudent> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(ExamStudent::getExamDetailCourseId, examDetailCourseId);
         List<ExamStudent> examStudents = this.list(queryWrapper);
@@ -136,4 +136,9 @@ public class ExamStudentServiceImpl extends ServiceImpl<ExamStudentMapper, ExamS
     public List<String> listUserClass(Long schoolId, Long examId, String paperNumber) {
         return this.baseMapper.listUserClass(schoolId, examId, paperNumber);
     }
+
+    @Override
+    public ExamStudent listByExamDetailCourseIdLimit1(Long schoolId, Long examDetailCourseId) {
+        return this.baseMapper.listByExamDetailCourseIdLimit1(schoolId, examDetailCourseId);
+    }
 }

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

@@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.ExaminationImportDto;
-import com.qmth.distributed.print.business.bean.dto.FieldsDto;
+import com.qmth.distributed.print.business.bean.examRule.FieldsDto;
 import com.qmth.distributed.print.business.service.ExamDetailService;
 import com.qmth.distributed.print.business.service.ExamTaskService;
 import com.qmth.distributed.print.business.templete.importData.AsyncImportTaskTemplete;

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -11,6 +11,8 @@ import com.google.gson.Gson;
 import com.itextpdf.text.DocumentException;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.*;
+import com.qmth.distributed.print.business.bean.examRule.CodeNameEnableValue;
+import com.qmth.distributed.print.business.bean.examRule.FieldsDto;
 import com.qmth.distributed.print.business.bean.params.DownloadPaperFileParam;
 import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 import com.qmth.distributed.print.business.bean.result.DictionaryResult;
@@ -783,6 +785,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
 
             ExaminationImportDto examinationImportDto = new ExaminationImportDto();
             Field[] examinationImportDtoFields = examinationImportDto.getClass().getDeclaredFields();
+            List<CodeNameEnableValue> requiredFields = new ArrayList<>();
             for (FieldsDto fieldsDto : fieldsDtoList) {
                 boolean match = false;
                 String name = fieldsDto.getName();
@@ -814,6 +817,14 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                             examinationImportDtoField.setAccessible(true);
                             examinationImportDtoField.set(examinationImportDto, cellValue);
                             match = true;
+
+                            // 匹配上为必选字段
+                            CodeNameEnableValue codeNameEnableValue = new CodeNameEnableValue();
+                            codeNameEnableValue.setCode(code);
+                            codeNameEnableValue.setName(name);
+                            codeNameEnableValue.setEnable(true);
+                            codeNameEnableValue.setValue(cellValue);
+                            requiredFields.add(codeNameEnableValue);
                             break;
                         }
                     }
@@ -828,6 +839,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                     }
                 }
             }
+            examinationImportDto.setRequiredFieldList(requiredFields);
             examinationImportDto.setSecondaryFieldList(secondaryFieldList);
             examinationImportDto.setSchoolId(schoolId);
             // 解析时间

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

@@ -214,10 +214,10 @@
         GROUP BY det.id
         <trim prefix="having" suffixOverrides="and">
             <if test="courseCode != null and courseCode != ''">
-                find_in_set(#{courseCode},courseCodes) and
+                find_in_set(#{courseCode},courseNameCode) and
             </if>
             <if test="paperNumber != null and paperNumber != ''">
-                find_in_set(#{paperNumber},paperNumbers) and
+                find_in_set(#{paperNumber},paperNumber) and
             </if>
         </trim>
          order by det.id desc

+ 10 - 3
distributed-print-business/src/main/resources/mapper/ExamStudentMapper.xml

@@ -13,15 +13,14 @@
         <result column="site_number" property="siteNumber"/>
         <result column="print_paper" property="printPaper"/>
         <result column="print_card" property="printCard"/>
+        <result column="required_fields" property="requiredFields"/>
         <result column="extend_fields" property="extendFields"/>
         <result column="paper_type" property="paperType"/>
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id
-        ,
-        school_id, exam_detail_course_id, student_name, student_code, ticket_number, site_number, print_paper, print_card, extend_fields, paper_type
+        select id,school_id, exam_detail_course_id, student_name, student_code, ticket_number, site_number, print_paper, print_card, required_fields, extend_fields, paper_type from exam_student
     </sql>
     <insert id="insertBatch">
         insert into exam_student (id, school_id, org_id, exam_id, exam_detail_course_id, student_name, student_code,paper_number,
@@ -315,4 +314,12 @@
           AND paper_number = #{paperNumber}
           AND clazz_name IS NOT NULL
     </select>
+    <select id="listByExamDetailCourseIdLimit1" resultMap="BaseResultMap">
+        <include refid="Base_Column_List"></include>
+        <where>
+             and school_id = #{schoolId}
+            and exam_detail_course_id = #{examDetailCourseId}
+        </where>
+        limit 1
+    </select>
 </mapper>

+ 2 - 0
distributed-print-business/src/main/resources/mapper/TeachCourseMapper.xml

@@ -43,6 +43,7 @@
                 LEFT JOIN
             sys_org so ON su.org_id = so.id
         <where>
+            su.enable = true
             <if test="schoolId != null">
                 AND tc.school_id = #{schoolId}
             </if>
@@ -62,6 +63,7 @@
                 LEFT JOIN
             sys_org so ON su.org_id = so.id
         <where>
+            su.enable = true
             <if test="orgIdList != null and orgIdList != '' and orgIdList.size() > 0">
                 AND su.org_id IN
                 <foreach collection="orgIdList" item="item" index="index" open="(" separator="," close=")">

+ 8 - 0
distributed-print/install/mysql/upgrade/3.3.0.sql

@@ -1,4 +1,5 @@
 ALTER TABLE `exam_student` ADD COLUMN `course_paper_id` VARCHAR(45) NULL COMMENT '试卷编号(交互)' AFTER `paper_number`;
+ALTER TABLE `exam_detail_course` ADD COLUMN `course_paper_id` VARCHAR(45) NULL COMMENT '试卷编号(交互)' AFTER `paper_number`;
 
 ALTER TABLE `sys_user` ADD COLUMN `ui_setting` TEXT NULL COMMENT '阅卷参数' AFTER `historic_name`;
 
@@ -135,3 +136,10 @@ DELETE FROM `sys_privilege` WHERE (`id` = '431');
 DELETE FROM `sys_privilege` WHERE (`id` = '435');
 DELETE FROM `sys_privilege` WHERE (`id` = '792');
 DELETE FROM `sys_privilege` WHERE (`id` = '793');
+UPDATE `sys_privilege` SET `name` = '查看详情' WHERE (`id` = '320');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('327', '新增考生', '/api/admin/exam/print/add_student', 'URL', '44', '8', 'AUTH', '1', '1', '1');
+UPDATE `sys_privilege` SET `related` = '55,327,328' WHERE (`id` = '320');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('328', '查询考场下试卷列表', '/api/admin/exam/print/list_exam_detail_course', 'URL', '44', '9', 'AUTH', '1', '1', '1');
+ALTER TABLE `exam_student` ADD COLUMN `required_fields` MEDIUMTEXT NULL COMMENT '基础字段' AFTER `print_card`;
+
+

+ 30 - 4
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamDetailController.java

@@ -1,7 +1,10 @@
 package com.qmth.distributed.print.api;
 
+import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.params.SingleExamStudentAddParam;
 import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.service.ExamDetailCourseService;
 import com.qmth.distributed.print.business.service.ExamDetailService;
 import com.qmth.distributed.print.business.service.ExamStudentService;
 import com.qmth.distributed.print.business.templete.execute.AsyncExaminationExportTemplateService;
@@ -20,10 +23,7 @@ import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import io.swagger.annotations.*;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
@@ -56,6 +56,8 @@ public class ExamDetailController {
     @Resource
     private ExamDetailService examDetailService;
     @Resource
+    private ExamDetailCourseService examDetailCourseService;
+    @Resource
     private ExamStudentService examStudentService;
     @Resource
     private BasicRoleDataPermissionService basicRoleDataPermissionService;
@@ -254,5 +256,29 @@ public class ExamDetailController {
         examDetailService.dataDelete(id);
         return ResultUtil.ok(true);
     }
+
+    /**
+     * 获取新增考生考务字段
+     * @param examDetailId 考场ID
+     */
+    @Aac(auth = false)
+    @ApiOperation(value = "考务数据导入-查看详情-新增考生-考场科目")
+    @RequestMapping(value = "/list_exam_detail_course", method = RequestMethod.POST)
+    public Result listExamDetailPaperNumber(@ApiParam(value = "考务场次ID", required = true) @RequestParam Long examDetailId) {
+        return ResultUtil.ok(examDetailCourseService.listExamDetailPaperNumber(examDetailId));
+    }
+
+    /**
+     * 新增考生-保存
+     * @param singleExamStudentAddParam 请求参数
+     * @return
+     */
+    @Aac(auth = false)
+    @ApiOperation(value = "考务数据导入-查看详情-新增考生-保存")
+    @RequestMapping(value = "/add_exam_student", method = RequestMethod.POST)
+    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.ADD)
+    public Result addExamStudent(@RequestBody SingleExamStudentAddParam singleExamStudentAddParam) {
+        return ResultUtil.ok(examDetailCourseService.addExamStudent(singleExamStudentAddParam));
+    }
 }
 

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -262,7 +262,7 @@ public class SystemConstant {
     public static final String JSON_PREFIX = ".json";
     public static final String FTL_PREFIX = ".ftl";
     public static final String ZIP_PREFIX = ".zip";
-    public static final String TXT_PREFIX = ".json";
+    public static final String TXT_PREFIX = ".txt";
     public static final String WINDOWS = "Windows";
 
     public static final String EXCEL_PREFIX = ".xlsx";