ソースを参照

Merge remote-tracking branch 'origin/dev_v3.3.1' into dev_v3.3.1

wangliang 1 年間 前
コミット
6a54eb7387
78 ファイル変更1667 行追加1059 行削除
  1. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/CourseEvaluationParam.java
  2. 17 28
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/TeachClazzParams.java
  3. 44 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/TeachCourseSelectParam.java
  4. 9 8
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/TeachStudentBatchParam.java
  5. 24 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/TeacherTeamParam.java
  6. 58 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/BasicTeachClazzResult.java
  7. 5 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TeachClazzResult.java
  8. 13 12
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TeachCourseResult.java
  9. 20 19
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TeachClazz.java
  10. 20 20
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TeachCourse.java
  11. 5 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TeachStudent.java
  12. 9 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/CourseEvaluationTypeEnum.java
  13. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicTeachClazzMapper.java
  14. 5 10
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TeachClazzMapper.java
  15. 9 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TeachCourseMapper.java
  16. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicTeachClazzService.java
  17. 3 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ConditionService.java
  18. 12 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/CourseEvaluationService.java
  19. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java
  20. 6 8
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TeachClazzService.java
  21. 20 13
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TeachCourseService.java
  22. 7 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TeachStudentService.java
  23. 7 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicTeachClazzServiceImpl.java
  24. 10 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ConditionServiceImpl.java
  25. 23 9
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/CourseEvaluationServiceImpl.java
  26. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  27. 33 33
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskPrintServiceImpl.java
  28. 106 100
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  29. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java
  30. 64 68
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TeachClazzServiceImpl.java
  31. 195 150
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TeachCourseServiceImpl.java
  32. 101 101
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TeachStudentServiceImpl.java
  33. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  34. 18 0
      distributed-print-business/src/main/resources/db/log/脚本-caozx.sql
  35. 15 0
      distributed-print-business/src/main/resources/mapper/BasicTeachClazzMapper.xml
  36. 4 8
      distributed-print-business/src/main/resources/mapper/TeachClazzMapper.xml
  37. 11 8
      distributed-print-business/src/main/resources/mapper/TeachCourseMapper.xml
  38. 8 12
      distributed-print-business/src/main/resources/mapper/TeachStudentMapper.xml
  39. 4 1
      distributed-print/install/mysql/upgrade/3.3.1.sql
  40. 35 36
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicCourseController.java
  41. 29 32
      distributed-print/src/main/java/com/qmth/distributed/print/api/ConditionController.java
  42. 7 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/CourseEvaluationController.java
  43. 24 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskApplyController.java
  44. 0 18
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskAuditController.java
  45. 34 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysAdminSetController.java
  46. 21 61
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java
  47. 8 5
      distributed-print/src/main/java/com/qmth/distributed/print/api/TeachClazzController.java
  48. 25 12
      distributed-print/src/main/java/com/qmth/distributed/print/api/TeachCourseController.java
  49. 24 25
      distributed-print/src/main/java/com/qmth/distributed/print/api/TeachStudentController.java
  50. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkClassController.java
  51. 40 5
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkDocumentController.java
  52. 8 8
      distributed-print/src/main/resources/application.properties
  53. 0 6
      distributed-print/src/test/java/com/qmth/distributed/print/ServiceTest.java
  54. 5 25
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/mark/setting/MarkClassUserParams.java
  55. 40 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/mark/setting/MarkGroupClassUserParams.java
  56. 1 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  57. 15 9
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/BasicCourseMapper.java
  58. 7 5
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicCourseService.java
  59. 8 8
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java
  60. 3 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/FileUploadServiceImpl.java
  61. 14 0
      teachcloud-common/src/main/resources/mapper/BasicCourseMapper.xml
  62. 45 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkUserClassDetailDto.java
  63. 10 37
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkUserClassDto.java
  64. 12 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkDocument.java
  65. 11 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/DocumentType.java
  66. 1 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserClassMapper.java
  67. 3 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkDocumentService.java
  68. 5 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkFileService.java
  69. 4 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java
  70. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserClassService.java
  71. 5 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanPackageService.java
  72. 57 45
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkDocumentServiceImpl.java
  73. 25 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkFileServiceImpl.java
  74. 15 11
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java
  75. 67 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  76. 68 36
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserClassServiceImpl.java
  77. 52 13
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPackageServiceImpl.java
  78. 12 0
      teachcloud-mark/src/main/resources/mapper/MarkUserClassMapper.xml

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/CourseEvaluationParam.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.bean.params;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.CourseEvaluationTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 import org.hibernate.validator.constraints.Length;
 import org.hibernate.validator.constraints.Range;
@@ -36,6 +37,9 @@ public class CourseEvaluationParam {
     @Length(min = 1, message = "缺少评价方式描述")
     private String evaluationDesc;
 
+    @ApiModelProperty("评价方式类型")
+    private CourseEvaluationTypeEnum type;
+
     public Long getExamId() {
         return examId;
     }
@@ -67,4 +71,12 @@ public class CourseEvaluationParam {
     public void setEvaluationDesc(String evaluationDesc) {
         this.evaluationDesc = evaluationDesc;
     }
+
+    public CourseEvaluationTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(CourseEvaluationTypeEnum type) {
+        this.type = type;
+    }
 }

+ 17 - 28
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/TeachClazzParams.java

@@ -8,7 +8,9 @@ import io.swagger.annotations.ApiModelProperty;
 import org.hibernate.validator.constraints.Length;
 import org.hibernate.validator.constraints.Range;
 
+import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * @Description: 教学班级编辑参数
@@ -19,42 +21,29 @@ public class TeachClazzParams {
 
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "班级id(修改时必填)")
-    @DBVerify(value = "班级id")
-    @EditKey
-    private Long id;
+    @NotEmpty
+    @Range(min = 1L,message = "请选择班级")
+    private List<Long> idList;
 
     @JsonSerialize(using = ToStringSerializer.class)
-    @ApiModelProperty(value = "基础课程主键")
-    @NotNull(message = "请选择基础课程")
-    @Range(min = 1L, message = "请选择基础课程")
-    private Long basicCourseId;
-
-    @ApiModelProperty(value = "教学班级名称")
-    @NotNull(message = "请输入教学班级名称")
-    @Length(min = 1,message = "请输入教学班级名称")
-    private String teachClazzName;
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
+    @ApiModelProperty(value = "教学课程id")
+    @NotNull(message = "教学课程id")
+    @Range(min = 1L, message = "请选择课程")
+    private Long teachCourseId;
 
-    public Long getBasicCourseId() {
-        return basicCourseId;
+    public List<Long> getIdList() {
+        return idList;
     }
 
-    public void setBasicCourseId(Long basicCourseId) {
-        this.basicCourseId = basicCourseId;
+    public void setIdList(List<Long> idList) {
+        this.idList = idList;
     }
 
-    public String getTeachClazzName() {
-        return teachClazzName;
+    public Long getTeachCourseId() {
+        return teachCourseId;
     }
 
-    public void setTeachClazzName(String teachClazzName) {
-        this.teachClazzName = teachClazzName;
+    public void setTeachCourseId(Long teachCourseId) {
+        this.teachCourseId = teachCourseId;
     }
 }

+ 44 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/TeachCourseSelectParam.java

@@ -0,0 +1,44 @@
+package com.qmth.distributed.print.business.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @Description: 教学课程选择参数
+ * @Author: CaoZixuan
+ * @Date: 2024-03-05
+ */
+public class TeachCourseSelectParam {
+
+    @ApiModelProperty("考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "缺少考试")
+    @Range(min = 1L, message = "缺少考试")
+    private Long examId;
+
+    @ApiModelProperty("课程编号集合")
+    @NotEmpty(message = "缺少课程编号集合")
+    private List<String> courseCodeList;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public List<String> getCourseCodeList() {
+        return courseCodeList;
+    }
+
+    public void setCourseCodeList(List<String> courseCodeList) {
+        this.courseCodeList = courseCodeList;
+    }
+}

+ 9 - 8
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/TeachStudentBatchParam.java

@@ -6,7 +6,9 @@ import com.qmth.teachcloud.common.annotation.DBVerify;
 import io.swagger.annotations.ApiModelProperty;
 import org.hibernate.validator.constraints.Range;
 
+import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -20,14 +22,13 @@ public class TeachStudentBatchParam {
     @ApiModelProperty(value = "教学班级主键")
     @NotNull(message = "请选择教学班级")
     @Range(min = 1L, message = "请选择教学班级")
-    @DBVerify(value = "教学班级id",required = true)
     private Long teachClazzId;
 
-
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "学生字典id集合")
-    @NotNull(message = "请选择要添加的学生")
-    private Set<Long> basicStudentIdSet;
+    @NotEmpty(message = "请选择要添加的学生")
+    @Range(min = 1L, message = "请选择要添加的学生")
+    private List<Long> basicExamStudentIdList;
 
     public Long getTeachClazzId() {
         return teachClazzId;
@@ -37,11 +38,11 @@ public class TeachStudentBatchParam {
         this.teachClazzId = teachClazzId;
     }
 
-    public Set<Long> getBasicStudentIdSet() {
-        return basicStudentIdSet;
+    public List<Long> getBasicExamStudentIdList() {
+        return basicExamStudentIdList;
     }
 
-    public void setBasicStudentIdSet(Set<Long> basicStudentIdSet) {
-        this.basicStudentIdSet = basicStudentIdSet;
+    public void setBasicExamStudentIdList(List<Long> basicExamStudentIdList) {
+        this.basicExamStudentIdList = basicExamStudentIdList;
     }
 }

+ 24 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/TeacherTeamParam.java

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.business.bean.params;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
 import org.hibernate.validator.constraints.Length;
 import org.hibernate.validator.constraints.Range;
@@ -12,6 +14,7 @@ import javax.validation.constraints.NotNull;
  * @Date: 2023-03-16
  */
 public class TeacherTeamParam {
+
     @ApiModelProperty("姓名")
     @NotNull(message = "请填写姓名")
     @Length(message = "请填写姓名")
@@ -23,8 +26,15 @@ public class TeacherTeamParam {
     private String teacherCode;
 
     @ApiModelProperty("基础课程id")
-    @NotNull(message = "请选择课程")
-    private Long basicCourseId;
+    @NotNull(message = "缺少考试")
+    @Range(min = 1L, message = "缺少考试")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+
+    @ApiModelProperty("课程编号")
+    @NotNull(message = "缺少课程编号")
+    @Length(min = 1, message = "缺少课程编号")
+    private String courseCode;
 
     public String getTeacherName() {
         return teacherName;
@@ -42,11 +52,19 @@ public class TeacherTeamParam {
         this.teacherCode = teacherCode;
     }
 
-    public Long getBasicCourseId() {
-        return basicCourseId;
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
     }
 
-    public void setBasicCourseId(Long basicCourseId) {
-        this.basicCourseId = basicCourseId;
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
     }
 }

+ 58 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/BasicTeachClazzResult.java

@@ -0,0 +1,58 @@
+package com.qmth.distributed.print.business.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 教学班字典查询结果
+ * @Author: CaoZixuan
+ * @Date: 2024-03-06
+ */
+public class BasicTeachClazzResult {
+    @ApiModelProperty(value = "班级id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+
+    @ApiModelProperty(value = "课程编号")
+    private String courseCode;
+
+    @ApiModelProperty(value = "教学班名称")
+    private String clazzName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getClazzName() {
+        return clazzName;
+    }
+
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
+    }
+}

+ 5 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TeachClazzResult.java

@@ -27,7 +27,7 @@ public class TeachClazzResult {
 
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "教学课程id")
-    private Long basicCourseId;
+    private Long teachCourseId;
 
     public Long getId() {
         return id;
@@ -61,11 +61,11 @@ public class TeachClazzResult {
         this.teachStudentCount = teachStudentCount;
     }
 
-    public Long getBasicCourseId() {
-        return basicCourseId;
+    public Long getTeachCourseId() {
+        return teachCourseId;
     }
 
-    public void setBasicCourseId(Long basicCourseId) {
-        this.basicCourseId = basicCourseId;
+    public void setTeachCourseId(Long teachCourseId) {
+        this.teachCourseId = teachCourseId;
     }
 }

+ 13 - 12
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TeachCourseResult.java

@@ -15,16 +15,17 @@ public class TeachCourseResult {
     @ApiModelProperty(value = "教学课程id")
     private Long id;
 
-    @JsonSerialize(using = ToStringSerializer.class)
-    @ApiModelProperty(value = "基础课程id")
-    private Long basicCourseId;
-
     @ApiModelProperty(value = "教学课程名称")
     private String courseName;
 
     @ApiModelProperty(value = "教学课程编号")
     private String courseCode;
 
+    @ApiModelProperty(value = "创建人")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long createId;
+
+    @ApiModelProperty(value = "创建时间")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long createTime;
 
@@ -36,14 +37,6 @@ public class TeachCourseResult {
         this.id = id;
     }
 
-    public Long getBasicCourseId() {
-        return basicCourseId;
-    }
-
-    public void setBasicCourseId(Long basicCourseId) {
-        this.basicCourseId = basicCourseId;
-    }
-
     public String getCourseName() {
         return courseName;
     }
@@ -60,6 +53,14 @@ public class TeachCourseResult {
         this.courseCode = courseCode;
     }
 
+    public Long getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(Long createId) {
+        this.createId = createId;
+    }
+
     public Long getCreateTime() {
         return createTime;
     }

+ 20 - 19
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TeachClazz.java

@@ -22,19 +22,20 @@ public class TeachClazz extends BaseEntity implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long schoolId;
 
-    @ApiModelProperty(value = "教学班编号")
-    private String teachClazzCode;
+    @ApiModelProperty(value = "教学课程id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long teachCourseId;
 
-    @ApiModelProperty(value = "教学班名称")
-    private String teachClazzName;
+    @ApiModelProperty(value = "教学班字典id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long basicTeachClazzId;
 
     @ApiModelProperty(value = "用户id")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long userId;
 
-    @ApiModelProperty(value = "基础课程主键")
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Long basicCourseId;
+    @ApiModelProperty(value = "教学班名称(冗余字段【教学班名称不会变】)")
+    private String clazzName;
 
     public Long getSchoolId() {
         return schoolId;
@@ -44,20 +45,20 @@ public class TeachClazz extends BaseEntity implements Serializable {
         this.schoolId = schoolId;
     }
 
-    public String getTeachClazzCode() {
-        return teachClazzCode;
+    public Long getTeachCourseId() {
+        return teachCourseId;
     }
 
-    public void setTeachClazzCode(String teachClazzCode) {
-        this.teachClazzCode = teachClazzCode;
+    public void setTeachCourseId(Long teachCourseId) {
+        this.teachCourseId = teachCourseId;
     }
 
-    public String getTeachClazzName() {
-        return teachClazzName;
+    public Long getBasicTeachClazzId() {
+        return basicTeachClazzId;
     }
 
-    public void setTeachClazzName(String teachClazzName) {
-        this.teachClazzName = teachClazzName;
+    public void setBasicTeachClazzId(Long basicTeachClazzId) {
+        this.basicTeachClazzId = basicTeachClazzId;
     }
 
     public Long getUserId() {
@@ -68,11 +69,11 @@ public class TeachClazz extends BaseEntity implements Serializable {
         this.userId = userId;
     }
 
-    public Long getBasicCourseId() {
-        return basicCourseId;
+    public String getClazzName() {
+        return clazzName;
     }
 
-    public void setBasicCourseId(Long basicCourseId) {
-        this.basicCourseId = basicCourseId;
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
     }
 }

+ 20 - 20
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TeachCourse.java

@@ -27,11 +27,11 @@ public class TeachCourse extends BaseEntity implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
 
-    // TODO: 2024/2/28  删除该字段
-    @Deprecated
-    @ApiModelProperty(value = "基础课程id")
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Long basicCourseId;
+//    // TODO: 2024/2/28  删除该字段
+//    @Deprecated
+//    @ApiModelProperty(value = "基础课程id")
+//    @JsonSerialize(using = ToStringSerializer.class)
+//    private Long basicCourseId;
 
     @ApiModelProperty(value = "课程编号")
     private String courseCode;
@@ -50,14 +50,14 @@ public class TeachCourse extends BaseEntity implements Serializable {
 
     }
 
-    public TeachCourse(SysUser sysUser, Long basicCourseId, Long teachId) {
-        setSchoolId(sysUser.getSchoolId());
-        setBasicCourseId(basicCourseId);
-        setUserId(teachId);
-        insertInfo(sysUser.getId());
-        updateInfo(sysUser.getId());
-        this.enable = true;
-    }
+//    public TeachCourse(SysUser sysUser, Long basicCourseId, Long teachId) {
+//        setSchoolId(sysUser.getSchoolId());
+//        setBasicCourseId(basicCourseId);
+//        setUserId(teachId);
+//        insertInfo(sysUser.getId());
+//        updateInfo(sysUser.getId());
+//        this.enable = true;
+//    }
 
     public Long getSchoolId() {
         return schoolId;
@@ -107,11 +107,11 @@ public class TeachCourse extends BaseEntity implements Serializable {
         this.weightSetting = weightSetting;
     }
 
-    public Long getBasicCourseId() {
-        return basicCourseId;
-    }
-
-    public void setBasicCourseId(Long basicCourseId) {
-        this.basicCourseId = basicCourseId;
-    }
+//    public Long getBasicCourseId() {
+//        return basicCourseId;
+//    }
+//
+//    public void setBasicCourseId(Long basicCourseId) {
+//        this.basicCourseId = basicCourseId;
+//    }
 }

+ 5 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TeachStudent.java

@@ -32,7 +32,7 @@ public class TeachStudent extends BaseEntity implements Serializable {
 
     @ApiModelProperty(value = "教学课程id(冗余)")
     @JsonSerialize(using = ToStringSerializer.class)
-    private Long basicCourseId;
+    private Long teachCourseId;
 
     @ApiModelProperty(value = "用户id(冗余)")
     @JsonSerialize(using = ToStringSerializer.class)
@@ -62,12 +62,12 @@ public class TeachStudent extends BaseEntity implements Serializable {
         this.teachClazzId = teachClazzId;
     }
 
-    public Long getBasicCourseId() {
-        return basicCourseId;
+    public Long getTeachCourseId() {
+        return teachCourseId;
     }
 
-    public void setBasicCourseId(Long basicCourseId) {
-        this.basicCourseId = basicCourseId;
+    public void setTeachCourseId(Long teachCourseId) {
+        this.teachCourseId = teachCourseId;
     }
 
     public Long getUserId() {

+ 9 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/CourseEvaluationTypeEnum.java

@@ -6,17 +6,24 @@ package com.qmth.distributed.print.business.enums;
  * @Date: 2024-02-28
  */
 public enum CourseEvaluationTypeEnum {
-    DEFAULT("默认", "按阅卷功能模块里的卷面成绩计算"), CUSTOM("自定义", "");
+    DEFAULT("默认", "期末成绩", "按阅卷功能模块里的卷面成绩计算"), CUSTOM("自定义", "自定义", "");
+
+    private final String type;
 
     private final String name;
 
     private final String value;
 
-    CourseEvaluationTypeEnum(String name, String value) {
+    CourseEvaluationTypeEnum(String type, String name, String value) {
+        this.type = type;
         this.name = name;
         this.value = value;
     }
 
+    public String getType() {
+        return type;
+    }
+
     public String getName() {
         return name;
     }

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicTeachClazzMapper.java

@@ -1,7 +1,11 @@
 package com.qmth.distributed.print.business.mapper;
 
+import com.qmth.distributed.print.business.bean.result.BasicTeachClazzResult;
 import com.qmth.distributed.print.business.entity.BasicTeachClazz;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface BasicTeachClazzMapper extends BaseMapper<BasicTeachClazz> {
 
+    /**
+     * 查询教学课程字典集合
+     *
+     * @param examId 考试id
+     * @return 教学课程字典集合
+     */
+    List<BasicTeachClazzResult> findTeachClazzList(@Param("examId") Long examId);
 }

+ 5 - 10
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TeachClazzMapper.java

@@ -15,18 +15,13 @@ import org.apache.ibatis.annotations.Param;
 public interface TeachClazzMapper extends BaseMapper<TeachClazz> {
 
     /**
-     * 分页查询教学班级
+     * 分页查询教学班级(自己分配到的)
      *
      * @param iPage          分页参数
-     * @param basicCourseId  基础课程主键
-     * @param teachClazzName 教学班级名称
-     * @param schoolId       学校id
-     * @param id
+     * @param teachCourseId  教学课程id
+     * @param teachClazzName 教学班
      * @return 结果
      */
-    IPage<TeachClazzResult> findTeachClazzPage(@Param("iPage") Page<TeachClazzResult> iPage,
-                                               @Param("basicCourseId") Long basicCourseId,
-                                               @Param("teachClazzName") String teachClazzName,
-                                               @Param("schoolId") Long schoolId,
-                                               @Param("userId") Long userId);
+    IPage<TeachClazzResult> findTeachClazzPage(@Param("iPage") Page<TeachClazzResult> iPage, @Param("teachCourseId") Long teachCourseId,
+            @Param("teachClazzName") String teachClazzName);
 }

+ 9 - 11
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TeachCourseMapper.java

@@ -23,31 +23,29 @@ public interface TeachCourseMapper extends BaseMapper<TeachCourse> {
      * 分页查询教学课程
      *
      * @param iPage      分页参数
+     * @param examId     考试id
      * @param courseName 课程名称
      * @param userId     用户id
-     * @param schoolId   学校id
      * @return 结果
      */
     IPage<TeachCourseResult> findTeachCoursePage(@Param("iPage") Page<TeachCourseResult> iPage,
-                                                 @Param("courseName") String courseName,
-                                                 @Param("userId") Long userId,
-                                                 @Param("schoolId") Long schoolId);
+            @Param("examId") Long examId, @Param("courseName") String courseName, @Param("userId") Long userId);
 
     /**
      * 教师团队分页查询
      *
-     * @param iPage         分页参数
-     * @param userInfo      用户信息(姓名||工号)
-     * @param basicCourseId 基础课程id
+     * @param iPage      分页参数
+     * @param examId     考试id
+     * @param courseCode 课程编号
+     * @param userInfo   用户信息(姓名||工号)
      * @return 分页结果
      */
-    IPage<TeacherTeamResult> findTeacherTeamPage(@Param("iPage") Page<TeacherTeamResult> iPage,
-                                                 @Param("userInfo") String userInfo,
-                                                 @Param("basicCourseId") Long basicCourseId,
-                                                 @Param("schoolId") Long schoolId);
+    IPage<TeacherTeamResult> findTeacherTeamPage(@Param("iPage") Page<TeacherTeamResult> iPage, @Param("examId") Long examId,
+            @Param("courseCode") String courseCode, @Param("userInfo") String userInfo);
 
     /**
      * 根据机构id查询教师集合
+     *
      * @param orgIdList orgIdList
      * @return 教师查询集合
      */

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicTeachClazzService.java

@@ -1,9 +1,12 @@
 package com.qmth.distributed.print.business.service;
 
+import com.qmth.distributed.print.business.bean.result.BasicTeachClazzResult;
 import com.qmth.distributed.print.business.entity.BasicTeachClazz;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.common.entity.SysUser;
 
+import java.util.List;
+
 /**
  * <p>
  * 基础教学班表 服务类
@@ -24,4 +27,12 @@ public interface BasicTeachClazzService extends IService<BasicTeachClazz> {
      * @return 教学班
      */
     BasicTeachClazz findOrCreateBasicTeachClazz(SysUser requestUser, Long examId, String courseCode, String teachClazzName);
+
+    /**
+     * 查询所有加血版
+     *
+     * @param examId 考试id
+     * @return 教学班结果
+     */
+    List<BasicTeachClazzResult> findAllTeachClazz(Long examId);
 }

+ 3 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ConditionService.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.service;
 
+import com.qmth.distributed.print.business.bean.result.BasicTeachClazzResult;
 import com.qmth.distributed.print.business.bean.result.PrintPlanBrief;
 import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.ExamCategoryEnum;
@@ -26,4 +27,6 @@ public interface ConditionService {
     List<BasicClazz> listClazz(Long semesterId, Long examId, String courseCode, String clazzName);
 
     List<SysOrg> listCollege();
+
+    List<BasicTeachClazzResult> listBasicTeachClazz(Long examId);
 }

+ 12 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/CourseEvaluationService.java

@@ -32,9 +32,9 @@ public interface CourseEvaluationService extends IService<CourseEvaluation> {
      * 保存课程评价方式
      *
      * @param courseEvaluationParam 课程评价方式参数
-     * @param requestUser           请求用户
+     * @param userId                用户id
      */
-    void saveCourseEvaluation(CourseEvaluationParam courseEvaluationParam, SysUser requestUser);
+    void saveCourseEvaluation(CourseEvaluationParam courseEvaluationParam, Long userId);
 
     /**
      * 删除课程评价方式
@@ -42,4 +42,13 @@ public interface CourseEvaluationService extends IService<CourseEvaluation> {
      * @param id 课程评价方式id
      */
     void deleteCourseEvaluation(Long id);
-}
+
+    /**
+     * 创建默认的评价方式
+     *
+     * @param examId     考试id
+     * @param courseCode 课程编号
+     * @param userId     教师id
+     */
+    void createDefaultCourseEvaluation(Long examId, String courseCode, Long userId);
+}

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

@@ -145,7 +145,7 @@ public interface ExamTaskService extends IService<ExamTask> {
      * @param examTaskId 命题任务id
      * @return 命题任务审核表参数
      */
-    ExamTaskApprovalFormDto findExamTaskApprovalForm(Long examTaskId);
+    ExamTaskApprovalFormDto findExamTaskApprovalForm(Long examTaskId, Long examId, String paperNumber);
 
 
     void findExamTaskApprovalPdf(HttpServletResponse response, Long examTaskId, String htmlContext) throws Exception;

+ 6 - 8
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TeachClazzService.java

@@ -20,22 +20,22 @@ public interface TeachClazzService extends IService<TeachClazz> {
     /**
      * 分页查询教学班列表
      *
-     * @param basicCourseId  基础课程id
-     * @param teachClazzName 班级名称
+     * @param examId         考试id
+     * @param courseCode     考试编号
+     * @param teachClazzName 教学班名称
      * @param pageNumber     分页页数
      * @param pageSize       分页容量
-     * @return 教学班分页结果
+     * @return 分页结果
      */
-    IPage<TeachClazzResult> teachClazzPage(Long basicCourseId, String teachClazzName, int pageNumber, int pageSize);
+    IPage<TeachClazzResult> teachClazzPage(Long examId, String courseCode, String teachClazzName, int pageNumber, int pageSize);
 
     /**
      * 编辑教学班
      *
      * @param teachClazzParams 教学班编辑参数
      * @param requestUser      请求的用户
-     * @return 教学班新增结果
      */
-    Boolean editTeachClazz(TeachClazzParams teachClazzParams, SysUser requestUser);
+    void selectTeachClazz(TeachClazzParams teachClazzParams, SysUser requestUser);
 
     /**
      * 根据教学班级id集合批量删除教学班级
@@ -52,6 +52,4 @@ public interface TeachClazzService extends IService<TeachClazz> {
      * @return 字典结果
      */
     List<DictionaryResult> findTeachCourseByUserId(Long userId);
-
-    List<TeachClazz> listByBasicCourseIdAndUserId(Long schoolId, Long basicCourseId, Long userId);
 }

+ 20 - 13
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TeachCourseService.java

@@ -2,6 +2,7 @@ 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.params.TeachCourseSelectParam;
 import com.qmth.distributed.print.business.bean.result.CourseWeightSettingStatusResult;
 import com.qmth.distributed.print.business.bean.params.TeachCourseParams;
 import com.qmth.distributed.print.business.bean.params.TeacherTeamParam;
@@ -29,13 +30,14 @@ public interface TeachCourseService extends IService<TeachCourse> {
     /**
      * 分页查询教学课程列表
      *
+     * @param examId     考试id
      * @param courseName 课程名称
      * @param pageNumber 分页参数
      * @param pageSize   分页容量
      * @param userId     用户id
      * @return 教学课程分页结果
      */
-    IPage<TeachCourseResult> teachCoursePage(String courseName, int pageNumber, int pageSize, Long userId);
+    IPage<TeachCourseResult> teachCoursePage(Long examId, String courseName, int pageNumber, int pageSize, Long userId);
 
     /**
      * 手动创建教学课程
@@ -44,15 +46,16 @@ public interface TeachCourseService extends IService<TeachCourse> {
      * @param requestUser       请求的用户
      * @return 创建结果
      */
+    @Deprecated
     Boolean manualCreate(TeachCourseParams teachCourseParams, SysUser requestUser);
 
     /**
      * 选择课程表并创建教学课程
      *
-     * @param basicCourseIdList 基础课程id集合
-     * @param requestUser       请求的用户
+     * @param teachCourseSelectParam 教学课程选择参数
+     * @param requestUser            请求的用户
      */
-    void selectCreate(List<Long> basicCourseIdList, SysUser requestUser);
+    void selectCreate(TeachCourseSelectParam teachCourseSelectParam, SysUser requestUser);
 
     /**
      * 导入教学课程
@@ -60,6 +63,7 @@ public interface TeachCourseService extends IService<TeachCourse> {
      * @param file        文件
      * @param requestUser 请求用户
      */
+    @Deprecated
     void importTeachCourse(MultipartFile file, SysUser requestUser) throws IOException, NoSuchFieldException;
 
     /**
@@ -88,11 +92,12 @@ public interface TeachCourseService extends IService<TeachCourse> {
     /**
      * 教师库添加教师团队
      *
-     * @param basicCourseId 基础课程id
-     * @param userIdList    选择的用户(教师)id集合
-     * @param requestUser   请求的用户
+     * @param examId      考试id
+     * @param courseCode  课程编号
+     * @param userIdList  用户id集合
+     * @param requestUser 请求人
      */
-    void selectCreateTeacher(Long basicCourseId, List<Long> userIdList, SysUser requestUser);
+    void selectCreateTeacher(Long examId, String courseCode, List<Long> userIdList, SysUser requestUser);
 
     /**
      * 导入教师团队
@@ -101,18 +106,20 @@ public interface TeachCourseService extends IService<TeachCourse> {
      * @param basicCourseId 基础课程id
      * @param requestUser   请求的用户
      */
+    @Deprecated
     void importTeacherTeam(MultipartFile file, Long basicCourseId, SysUser requestUser) throws IOException, NoSuchFieldException, IllegalAccessException;
 
     /**
      * 分页查询教师团队
      *
-     * @param userInfo      用户姓名或工号
-     * @param basicCourseId 基础课程id
-     * @param pageNumber    分页页数
-     * @param pageSize      分页容量
+     * @param examId     考试id
+     * @param courseCode 课程编号
+     * @param userInfo   教师信息
+     * @param pageNumber 分页页数
+     * @param pageSize   分页容量
      * @return 分页结果
      */
-    IPage<TeacherTeamResult> findTeacherTeamPage(String userInfo, Long basicCourseId, int pageNumber, int pageSize);
+    IPage<TeacherTeamResult> findTeacherTeamPage(Long examId, String courseCode, String userInfo, int pageNumber, int pageSize);
 
     /**
      * 根据机构id查询用户

+ 7 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TeachStudentService.java

@@ -2,6 +2,7 @@ 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.params.TeachStudentBatchParam;
 import com.qmth.distributed.print.business.bean.result.TeachStudentResult;
 import com.qmth.distributed.print.business.entity.TeachStudent;
 import com.qmth.teachcloud.common.entity.SysUser;
@@ -38,16 +39,16 @@ public interface TeachStudentService extends IService<TeachStudent> {
      * @param requestUser  请求用户
      * @return 创建结果
      */
+    @Deprecated
     Boolean createTeachStudent(String studentName, String studentCode, Long teachClazzId, SysUser requestUser);
 
     /**
      * 批量创建教学学生
-     * @param basicStudentIdSet 学生字典id集合
-     * @param teachClazzId 教学班级id
-     * @param schoolId 学校id
-     * @param requestUser 请求用户
+     *
+     * @param teachStudentBatchParam 教学学生参数
+     * @param requestUser            请求用户
      */
-    void createTeachStudentBatch(Set<Long> basicStudentIdSet,Long teachClazzId,Long schoolId,SysUser requestUser);
+    void createTeachStudentBatch(TeachStudentBatchParam teachStudentBatchParam, SysUser requestUser);
 
     /**
      * 教学学生导入
@@ -57,6 +58,7 @@ public interface TeachStudentService extends IService<TeachStudent> {
      * @param schoolId     学校id
      * @param requestUser  请求用户
      */
+    @Deprecated
     String importTeachStudent(MultipartFile file, Long teachClazzId, Long schoolId, SysUser requestUser) throws IOException, NoSuchFieldException;
 
     /**

+ 7 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicTeachClazzServiceImpl.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.bean.result.BasicTeachClazzResult;
 import com.qmth.distributed.print.business.entity.BasicTeachClazz;
 import com.qmth.distributed.print.business.mapper.BasicTeachClazzMapper;
 import com.qmth.distributed.print.business.service.BasicTeachClazzService;
@@ -10,6 +11,7 @@ import com.qmth.teachcloud.common.entity.SysUser;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -44,4 +46,9 @@ public class BasicTeachClazzServiceImpl extends ServiceImpl<BasicTeachClazzMappe
         }
         return basicTeachClazz;
     }
+
+    @Override
+    public List<BasicTeachClazzResult> findAllTeachClazz(Long examId) {
+        return this.baseMapper.findTeachClazzList(examId);
+    }
 }

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

@@ -1,11 +1,13 @@
 package com.qmth.distributed.print.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.distributed.print.business.bean.result.BasicTeachClazzResult;
 import com.qmth.distributed.print.business.bean.result.PrintPlanBrief;
 import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.mapper.ConditionMapper;
 import com.qmth.distributed.print.business.service.BasicExamService;
+import com.qmth.distributed.print.business.service.BasicTeachClazzService;
 import com.qmth.distributed.print.business.service.ConditionService;
 import com.qmth.distributed.print.business.service.TeachCourseService;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
@@ -48,6 +50,9 @@ public class ConditionServiceImpl implements ConditionService {
     @Resource
     ConditionMapper conditionMapper;
 
+    @Resource
+    BasicTeachClazzService basicTeachClazzService;
+
     @Override
     public List<BasicSemester> listSemester(Boolean enable) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
@@ -181,4 +186,9 @@ public class ConditionServiceImpl implements ConditionService {
         return sysOrgService.list(queryWrapper);
     }
 
+    @Override
+    public List<BasicTeachClazzResult> listBasicTeachClazz(Long examId) {
+        return basicTeachClazzService.findAllTeachClazz(examId);
+    }
+
 }

+ 23 - 9
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/CourseEvaluationServiceImpl.java

@@ -42,14 +42,14 @@ public class CourseEvaluationServiceImpl extends ServiceImpl<CourseEvaluationMap
 
     @Transactional
     @Override
-    public void saveCourseEvaluation(CourseEvaluationParam courseEvaluationParam, SysUser requestUser) {
-        Long requestUserId = requestUser.getId();
+    public void saveCourseEvaluation(CourseEvaluationParam courseEvaluationParam, Long userId) {
         Long examId = courseEvaluationParam.getExamId();
         String courseCode = courseEvaluationParam.getCourseCode();
         String evaluation = courseEvaluationParam.getEvaluation();
         String evaluationDesc = courseEvaluationParam.getEvaluationDesc();
+        CourseEvaluationTypeEnum type = courseEvaluationParam.getType();
 
-        TeachCourse teachCourse = teachCourseService.findByExamIdCourseCodeAndUserId(examId, courseCode, requestUserId);
+        TeachCourse teachCourse = teachCourseService.findByExamIdCourseCodeAndUserId(examId, courseCode, userId);
         Long teachCourseId = teachCourse.getId();
         if (this.count(
                 new QueryWrapper<CourseEvaluation>().lambda().eq(CourseEvaluation::getTeachCourseId, teachCourseId)
@@ -59,14 +59,14 @@ public class CourseEvaluationServiceImpl extends ServiceImpl<CourseEvaluationMap
 
         CourseEvaluation courseEvaluation = new CourseEvaluation();
         courseEvaluation.setTeachCourseId(teachCourseId);
-        courseEvaluation.setSchoolId(requestUser.getSchoolId());
+        courseEvaluation.setSchoolId(teachCourse.getSchoolId());
         courseEvaluation.setExamId(examId);
         courseEvaluation.setCourseCode(courseCode);
-        courseEvaluation.setUserId(requestUserId);
-        courseEvaluation.setType(CourseEvaluationTypeEnum.CUSTOM);
+        courseEvaluation.setUserId(userId);
+        courseEvaluation.setType(type);
         courseEvaluation.setEvaluation(evaluation);
         courseEvaluation.setEvaluationDesc(evaluationDesc);
-        courseEvaluation.insertInfo(requestUserId);
+        courseEvaluation.insertInfo(userId);
         this.save(courseEvaluation);
     }
 
@@ -75,12 +75,26 @@ public class CourseEvaluationServiceImpl extends ServiceImpl<CourseEvaluationMap
     public void deleteCourseEvaluation(Long id) {
         CourseEvaluation courseEvaluation = this.getById(id);
         if (Objects.nonNull(courseEvaluation)) {
-            if (CourseEvaluationTypeEnum.DEFAULT.equals(courseEvaluation.getType())){
-                throw ExceptionResultEnum.ERROR.exception(String.format("[%s]的评价方式不能删除",CourseEvaluationTypeEnum.DEFAULT.getName()));
+            if (CourseEvaluationTypeEnum.DEFAULT.equals(courseEvaluation.getType())) {
+                throw ExceptionResultEnum.ERROR.exception(String.format("[%s]的评价方式不能删除", CourseEvaluationTypeEnum.DEFAULT.getType()));
             }
             Long teachCourseId = courseEvaluation.getTeachCourseId();
             teachCourseService.clearCourseSetting(teachCourseId, CourseSettingTypeEnum.COURSE_EVALUATION);
             this.removeById(id);
         }
     }
+
+    @Transactional
+    @Override
+    public void createDefaultCourseEvaluation(Long examId, String courseCode, Long userId) {
+        // 创建默认评价方式
+        CourseEvaluationTypeEnum type = CourseEvaluationTypeEnum.DEFAULT;
+        CourseEvaluationParam courseEvaluationParam = new CourseEvaluationParam();
+        courseEvaluationParam.setExamId(examId);
+        courseEvaluationParam.setCourseCode(courseCode);
+        courseEvaluationParam.setEvaluation(type.getName());
+        courseEvaluationParam.setEvaluationDesc(type.getValue());
+        courseEvaluationParam.setType(type);
+        this.saveCourseEvaluation(courseEvaluationParam, userId);
+    }
 }

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

@@ -1200,7 +1200,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         Set<String> clazzNameSet = new HashSet<>();
         if (clazzIdSet.size() > 0) {
             Set<String> basicClazzSet = basicClazzService.list(new QueryWrapper<BasicClazz>().lambda().in(BasicClazz::getId, clazzIdSet)).stream().map(BasicClazz::getClazzName).collect(Collectors.toSet());
-            Set<String> teachClazzSet = teachClazzService.list(new QueryWrapper<TeachClazz>().lambda().in(TeachClazz::getId, clazzIdSet)).stream().map(TeachClazz::getTeachClazzName).collect(Collectors.toSet());
+            Set<String> teachClazzSet = teachClazzService.list(new QueryWrapper<TeachClazz>().lambda().in(TeachClazz::getId, clazzIdSet)).stream().map(TeachClazz::getClazzName).collect(Collectors.toSet());
             clazzNameSet.addAll(basicClazzSet);
             clazzNameSet.addAll(teachClazzSet);
         }

+ 33 - 33
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskPrintServiceImpl.java

@@ -93,39 +93,39 @@ public class ExamTaskPrintServiceImpl extends ServiceImpl<ExamTaskPrintMapper, E
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         List<TaskPrintClassDto> taskPrintClassDtos = new ArrayList<>();
-        BasicCourse basicCourse = basicCourseService.findByCourseCode(courseCode, schoolId);
-        // 1.判断教学表中是否有数据
-        List<TeachCourse> teachCourseDatasource = teachCourseService.list(new QueryWrapper<TeachCourse>().lambda()
-                .eq(TeachCourse::getSchoolId, schoolId)
-                .eq(TeachCourse::getUserId, requestUser.getId()));
-        if (teachCourseDatasource != null && teachCourseDatasource.size() > 0) {
-            // 如果该用户创建了任意教学课程,则走教学课程查询逻辑
-            List<TeachCourse> teachCourseList = teachCourseDatasource.stream().filter(e -> basicCourseService.getById(e.getBasicCourseId()).getCode().equals(courseCode)).collect(Collectors.toList());
-            if (teachCourseList.size() > 1) {
-                throw ExceptionResultEnum.ERROR.exception("基础信息管理中[" + basicCourse.getName() + "]教学课程信息存在多条数据异常");
-            }
-            if (teachCourseList.size() == 0) {
-                // 没创建该教学课程
-                throw ExceptionResultEnum.ERROR.exception("请优先在基础信息管理中创建[" + basicCourse.getName() + "]的教学课程信息");
-            }
-            TeachCourse teachCourse = teachCourseList.get(0);
-            List<TeachClazz> teachClazzList = teachClazzService.list(new QueryWrapper<TeachClazz>().lambda().in(TeachClazz::getBasicCourseId, teachCourse.getBasicCourseId()));
-            for (TeachClazz teachClazz : teachClazzList) {
-                TaskPrintClassDto dto = new TaskPrintClassDto();
-                dto.setClassId(String.valueOf(teachClazz.getId()));
-                dto.setTeachBasicEnum(TeachBasicEnum.TEACH_CLAZZ);
-                dto.setClassName(teachClazz.getTeachClazzName());
-                dto.setStudentCount(teachStudentService.count(new QueryWrapper<TeachStudent>().lambda().eq(TeachStudent::getTeachClazzId, teachClazz.getId())));
-                taskPrintClassDtos.add(dto);
-            }
-        } else {
-            List<BasicUserCourse> courseList = basicUserCourseService.listBySchoolIdAndCourseCode(schoolId, courseCode);
-            Set<String> stringList = courseList.stream().map(m -> String.valueOf(m.getClazzId())).collect(Collectors.toSet());
-
-            if (!CollectionUtils.isEmpty(stringList)) {
-                taskPrintClassDtos = basicStudentService.listByClass(schoolId, stringList);
-            }
-        }
+//        BasicCourse basicCourse = basicCourseService.findByCourseCode(courseCode, schoolId);
+//        // 1.判断教学表中是否有数据
+//        List<TeachCourse> teachCourseDatasource = teachCourseService.list(new QueryWrapper<TeachCourse>().lambda()
+//                .eq(TeachCourse::getSchoolId, schoolId)
+//                .eq(TeachCourse::getUserId, requestUser.getId()));
+//        if (teachCourseDatasource != null && teachCourseDatasource.size() > 0) {
+//            // 如果该用户创建了任意教学课程,则走教学课程查询逻辑
+//            List<TeachCourse> teachCourseList = teachCourseDatasource.stream().filter(e -> basicCourseService.getById(e.getBasicCourseId()).getCode().equals(courseCode)).collect(Collectors.toList());
+//            if (teachCourseList.size() > 1) {
+//                throw ExceptionResultEnum.ERROR.exception("基础信息管理中[" + basicCourse.getName() + "]教学课程信息存在多条数据异常");
+//            }
+//            if (teachCourseList.size() == 0) {
+//                // 没创建该教学课程
+//                throw ExceptionResultEnum.ERROR.exception("请优先在基础信息管理中创建[" + basicCourse.getName() + "]的教学课程信息");
+//            }
+//            TeachCourse teachCourse = teachCourseList.get(0);
+//            List<TeachClazz> teachClazzList = teachClazzService.list(new QueryWrapper<TeachClazz>().lambda().in(TeachClazz::getBasicCourseId, teachCourse.getBasicCourseId()));
+//            for (TeachClazz teachClazz : teachClazzList) {
+//                TaskPrintClassDto dto = new TaskPrintClassDto();
+//                dto.setClassId(String.valueOf(teachClazz.getId()));
+//                dto.setTeachBasicEnum(TeachBasicEnum.TEACH_CLAZZ);
+//                dto.setClassName(teachClazz.getTeachClazzName());
+//                dto.setStudentCount(teachStudentService.count(new QueryWrapper<TeachStudent>().lambda().eq(TeachStudent::getTeachClazzId, teachClazz.getId())));
+//                taskPrintClassDtos.add(dto);
+//            }
+//        } else {
+//            List<BasicUserCourse> courseList = basicUserCourseService.listBySchoolIdAndCourseCode(schoolId, courseCode);
+//            Set<String> stringList = courseList.stream().map(m -> String.valueOf(m.getClazzId())).collect(Collectors.toSet());
+//
+//            if (!CollectionUtils.isEmpty(stringList)) {
+//                taskPrintClassDtos = basicStudentService.listByClass(schoolId, stringList);
+//            }
+//        }
         return taskPrintClassDtos;
     }
 

+ 106 - 100
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -1524,14 +1524,20 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     @Override
-    public ExamTaskApprovalFormDto findExamTaskApprovalForm(Long examTaskId) {
+    public ExamTaskApprovalFormDto findExamTaskApprovalForm(Long examTaskId, Long examId, String paperNumber) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         // 1.basicInfo 部分
-        ExamTask examTask = this.getById(examTaskId);
+        ExamTask examTask = null;
+        if (examTaskId != null) {
+            examTask = this.getById(examTaskId);
+        } else if (examId != null && StringUtils.isNotBlank(paperNumber)) {
+            examTask = this.getByExamIdAndCourseCodeAndPaperNumber(examId, null, paperNumber);
+        } else {
+            throw ExceptionResultEnum.ERROR.exception("传入参数有误");
+        }
         if (Objects.isNull(examTask)) {
             throw ExceptionResultEnum.ERROR.exception("命题任务不存在");
         }
-        String paperNumber = examTask.getPaperNumber();
         String paperName = basicSemesterService.getById(basicExamService.getById(examTask.getExamId()).getSemesterId()).getName();
         Long teachingRoomId = examTask.getTeachingRoomId();
         SysOrg teachingRoom = sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getId, teachingRoomId));
@@ -1564,7 +1570,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         }
 
         // 2.ExamRoomInfo 部分
-        List<ExamPackageDetail> examPackageDetailDatasource = this.baseMapper.findExamPackageDetailByPaperNumber(schoolId, examTask.getExamId(), examTask.getCourseCode(), paperNumber, null);
+        List<ExamPackageDetail> examPackageDetailDatasource = this.baseMapper.findExamPackageDetailByPaperNumber(schoolId, examTask.getExamId(), examTask.getCourseCode(), examTask.getPaperNumber(), null);
         if (examPackageDetailDatasource.size() == 0) {
             throw ExceptionResultEnum.ERROR.exception("缺少该命题任务对应的考务数据");
         }
@@ -1580,7 +1586,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         basicInfo.setTeachingRoomId(teachingRoomId);
         basicInfo.setTeachingRoomName(teachingRoomName);
         basicInfo.setPaperName(paperName);
-        basicInfo.setPaperNumber(paperNumber);
+        basicInfo.setPaperNumber(examTask.getPaperNumber());
         basicInfo.setTeacherName(examTask.getTeacherName());
         basicInfo.setExamStartTime(examObjectDto.getExamStartTime());
         basicInfo.setExamEndTime(examObjectDto.getExamEndTime());
@@ -1680,101 +1686,101 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         Long schoolId = requestUser.getSchoolId();
         Long userId = requestUser.getId();
         List<ExamTaskStudentObjectResult> result = new ArrayList<>();
-        switch (examObjectType) {
-            case TEACH_CLAZZ_STUDENT:
-                if (!SystemConstant.strNotNull(courseCode)) {
-                    throw ExceptionResultEnum.ERROR.exception("缺少考试课程编号");
-                }
-                BasicCourse basicCourse = basicCourseService.getOne(new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getCode, courseCode));
-                if (Objects.isNull(basicCourse)) {
-                    throw ExceptionResultEnum.ERROR.exception("找不到课程编号对应的课程");
-                }
-                Long basicCourseId = basicCourse.getId();
-                TeachCourse teachCourse = teachCourseService.getOne(new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getSchoolId, schoolId).eq(TeachCourse::getBasicCourseId, basicCourseId).eq(TeachCourse::getUserId, userId));
-                if (Objects.nonNull(teachCourse)) {
-                    // 教学班对象
-                    List<TeachStudent> teachStudentDatasource = teachStudentService.list(new QueryWrapper<TeachStudent>().lambda().eq(TeachStudent::getSchoolId, schoolId).eq(TeachStudent::getUserId, userId).eq(TeachStudent::getBasicCourseId, teachCourse.getBasicCourseId()));
-
-                    // 教学班id集合
-                    List<Long> teachClazzIdList = teachStudentDatasource.stream().map(TeachStudent::getTeachClazzId).distinct().collect(Collectors.toList());
-                    for (Long teachClazzId : teachClazzIdList) {
-                        TeachClazz teachClazz = teachClazzService.getById(teachClazzId);
-                        if (Objects.isNull(teachClazz)) {
-                            throw ExceptionResultEnum.ERROR.exception("教学班数据异常");
-                        }
-                        List<TeachStudent> teachStudentList = teachStudentDatasource.stream().filter(e -> e.getTeachClazzId().equals(teachClazzId)).collect(Collectors.toList());
-
-                        // 获取学生信息数据
-                        List<StudentInfo> studentInfoList = teachStudentList.stream().flatMap(e -> {
-                            Long studentId = e.getStudentId();
-                            if (!SystemConstant.longNotNull(studentId)) {
-                                throw ExceptionResultEnum.ERROR.exception("教学学生数据异常");
-                            }
-                            BasicStudentResult basicStudentResult = basicStudentService.findById(studentId);
-                            if (Objects.isNull(basicStudentResult)) {
-                                throw ExceptionResultEnum.ERROR.exception("未找到对应的基础学生数据");
-                            }
-                            StudentInfo studentInfo = new StudentInfo();
-                            studentInfo.setStudentId(studentId);
-                            studentInfo.setStudentCode(basicStudentResult.getStudentCode());
-                            studentInfo.setStudentName(basicStudentResult.getStudentName());
-                            studentInfo.setCollegeName(basicStudentResult.getCollegeName());
-                            studentInfo.setMajorName(basicStudentResult.getMajorName());
-                            studentInfo.setTeachClazzId(teachClazzId);
-                            studentInfo.setTeachClazzName(teachClazz.getTeachClazzName());
-                            studentInfo.setBasicClazzId(basicStudentResult.getClazzId());
-                            studentInfo.setBasicClazzName(basicStudentResult.getClazz());
-                            return Stream.of(studentInfo);
-                        }).collect(Collectors.toList());
-
-                        ExamTaskStudentObjectResult examTaskStudentObjectResult = new ExamTaskStudentObjectResult();
-                        examTaskStudentObjectResult.setClazzId(teachClazzId);
-                        examTaskStudentObjectResult.setClazzName(teachClazz.getTeachClazzName());
-                        examTaskStudentObjectResult.setStudentInfoList(studentInfoList);
-                        examTaskStudentObjectResult.setStudentClazzType(examObjectType.getStudentClazzType());
-                        result.add(examTaskStudentObjectResult);
-                    }
-                }
-                break;
-            case BASIC_CLAZZ_STUDENT:
-                // 基础班级对象
-                List<BasicStudentResult> basicStudentResultList = basicStudentService.basicStudentList(schoolId, null, null, null, null);
-                if (!CollectionUtils.isEmpty(basicStudentResultList)) {
-                    LinkedMultiValueMap<Long, StudentInfo> studentInfoLinkedMultiValueMap = new LinkedMultiValueMap<>();
-                    Map<Long, ExamTaskStudentObjectResult> examTaskStudentObjectResultMap = new LinkedHashMap<>();
-                    for (BasicStudentResult e : basicStudentResultList) {
-                        // 没有班级的考生,不返回
-                        if (StringUtils.isBlank(e.getClazz())) {
-                            continue;
-                        }
-                        StudentInfo studentInfo = new StudentInfo();
-                        studentInfo.setStudentId(e.getId());
-                        studentInfo.setStudentCode(e.getStudentCode());
-                        studentInfo.setStudentName(e.getStudentName());
-                        studentInfo.setCollegeName(e.getCollegeName());
-                        studentInfo.setMajorName(e.getMajorName());
-                        studentInfo.setBasicClazzId(e.getClazzId());
-                        studentInfo.setBasicClazzName(e.getClazz());
-                        studentInfoLinkedMultiValueMap.add(e.getClazzId(), studentInfo);
-
-                        ExamTaskStudentObjectResult examTaskStudentObjectResult = null;
-                        if (!examTaskStudentObjectResultMap.containsKey(e.getClazzId())) {
-                            examTaskStudentObjectResult = new ExamTaskStudentObjectResult();
-                            examTaskStudentObjectResult.setClazzId(e.getClazzId());
-                            examTaskStudentObjectResult.setClazzName(e.getClazz());
-                            examTaskStudentObjectResult.setStudentClazzType(examObjectType.getStudentClazzType());
-                        } else {
-                            examTaskStudentObjectResult = examTaskStudentObjectResultMap.get(e.getClazzId());
-                        }
-                        examTaskStudentObjectResult.setStudentInfoList(studentInfoLinkedMultiValueMap.get(e.getClazzId()));
-                        examTaskStudentObjectResultMap.put(e.getClazzId(), examTaskStudentObjectResult);
-                    }
-                    result.addAll(examTaskStudentObjectResultMap.values());
-                }
-                break;
-            default:
-                break;
-        }
+//        switch (examObjectType) {
+//            case TEACH_CLAZZ_STUDENT:
+//                if (!SystemConstant.strNotNull(courseCode)) {
+//                    throw ExceptionResultEnum.ERROR.exception("缺少考试课程编号");
+//                }
+//                BasicCourse basicCourse = basicCourseService.getOne(new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getCode, courseCode));
+//                if (Objects.isNull(basicCourse)) {
+//                    throw ExceptionResultEnum.ERROR.exception("找不到课程编号对应的课程");
+//                }
+//                Long basicCourseId = basicCourse.getId();
+//                TeachCourse teachCourse = teachCourseService.getOne(new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getSchoolId, schoolId).eq(TeachCourse::getBasicCourseId, basicCourseId).eq(TeachCourse::getUserId, userId));
+//                if (Objects.nonNull(teachCourse)) {
+//                    // 教学班对象
+//                    List<TeachStudent> teachStudentDatasource = teachStudentService.list(new QueryWrapper<TeachStudent>().lambda().eq(TeachStudent::getSchoolId, schoolId).eq(TeachStudent::getUserId, userId).eq(TeachStudent::getBasicCourseId, teachCourse.getBasicCourseId()));
+//
+//                    // 教学班id集合
+//                    List<Long> teachClazzIdList = teachStudentDatasource.stream().map(TeachStudent::getTeachClazzId).distinct().collect(Collectors.toList());
+//                    for (Long teachClazzId : teachClazzIdList) {
+//                        TeachClazz teachClazz = teachClazzService.getById(teachClazzId);
+//                        if (Objects.isNull(teachClazz)) {
+//                            throw ExceptionResultEnum.ERROR.exception("教学班数据异常");
+//                        }
+//                        List<TeachStudent> teachStudentList = teachStudentDatasource.stream().filter(e -> e.getTeachClazzId().equals(teachClazzId)).collect(Collectors.toList());
+//
+//                        // 获取学生信息数据
+//                        List<StudentInfo> studentInfoList = teachStudentList.stream().flatMap(e -> {
+//                            Long studentId = e.getStudentId();
+//                            if (!SystemConstant.longNotNull(studentId)) {
+//                                throw ExceptionResultEnum.ERROR.exception("教学学生数据异常");
+//                            }
+//                            BasicStudentResult basicStudentResult = basicStudentService.findById(studentId);
+//                            if (Objects.isNull(basicStudentResult)) {
+//                                throw ExceptionResultEnum.ERROR.exception("未找到对应的基础学生数据");
+//                            }
+//                            StudentInfo studentInfo = new StudentInfo();
+//                            studentInfo.setStudentId(studentId);
+//                            studentInfo.setStudentCode(basicStudentResult.getStudentCode());
+//                            studentInfo.setStudentName(basicStudentResult.getStudentName());
+//                            studentInfo.setCollegeName(basicStudentResult.getCollegeName());
+//                            studentInfo.setMajorName(basicStudentResult.getMajorName());
+//                            studentInfo.setTeachClazzId(teachClazzId);
+//                            studentInfo.setTeachClazzName(teachClazz.getTeachClazzName());
+//                            studentInfo.setBasicClazzId(basicStudentResult.getClazzId());
+//                            studentInfo.setBasicClazzName(basicStudentResult.getClazz());
+//                            return Stream.of(studentInfo);
+//                        }).collect(Collectors.toList());
+//
+//                        ExamTaskStudentObjectResult examTaskStudentObjectResult = new ExamTaskStudentObjectResult();
+//                        examTaskStudentObjectResult.setClazzId(teachClazzId);
+//                        examTaskStudentObjectResult.setClazzName(teachClazz.getTeachClazzName());
+//                        examTaskStudentObjectResult.setStudentInfoList(studentInfoList);
+//                        examTaskStudentObjectResult.setStudentClazzType(examObjectType.getStudentClazzType());
+//                        result.add(examTaskStudentObjectResult);
+//                    }
+//                }
+//                break;
+//            case BASIC_CLAZZ_STUDENT:
+//                // 基础班级对象
+//                List<BasicStudentResult> basicStudentResultList = basicStudentService.basicStudentList(schoolId, null, null, null, null);
+//                if (!CollectionUtils.isEmpty(basicStudentResultList)) {
+//                    LinkedMultiValueMap<Long, StudentInfo> studentInfoLinkedMultiValueMap = new LinkedMultiValueMap<>();
+//                    Map<Long, ExamTaskStudentObjectResult> examTaskStudentObjectResultMap = new LinkedHashMap<>();
+//                    for (BasicStudentResult e : basicStudentResultList) {
+//                        // 没有班级的考生,不返回
+//                        if (StringUtils.isBlank(e.getClazz())) {
+//                            continue;
+//                        }
+//                        StudentInfo studentInfo = new StudentInfo();
+//                        studentInfo.setStudentId(e.getId());
+//                        studentInfo.setStudentCode(e.getStudentCode());
+//                        studentInfo.setStudentName(e.getStudentName());
+//                        studentInfo.setCollegeName(e.getCollegeName());
+//                        studentInfo.setMajorName(e.getMajorName());
+//                        studentInfo.setBasicClazzId(e.getClazzId());
+//                        studentInfo.setBasicClazzName(e.getClazz());
+//                        studentInfoLinkedMultiValueMap.add(e.getClazzId(), studentInfo);
+//
+//                        ExamTaskStudentObjectResult examTaskStudentObjectResult = null;
+//                        if (!examTaskStudentObjectResultMap.containsKey(e.getClazzId())) {
+//                            examTaskStudentObjectResult = new ExamTaskStudentObjectResult();
+//                            examTaskStudentObjectResult.setClazzId(e.getClazzId());
+//                            examTaskStudentObjectResult.setClazzName(e.getClazz());
+//                            examTaskStudentObjectResult.setStudentClazzType(examObjectType.getStudentClazzType());
+//                        } else {
+//                            examTaskStudentObjectResult = examTaskStudentObjectResultMap.get(e.getClazzId());
+//                        }
+//                        examTaskStudentObjectResult.setStudentInfoList(studentInfoLinkedMultiValueMap.get(e.getClazzId()));
+//                        examTaskStudentObjectResultMap.put(e.getClazzId(), examTaskStudentObjectResult);
+//                    }
+//                    result.addAll(examTaskStudentObjectResultMap.values());
+//                }
+//                break;
+//            default:
+//                break;
+//        }
         return result;
     }
 

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

@@ -1466,7 +1466,7 @@ public class PrintCommonServiceImpl implements PrintCommonService {
             // 教学班模式 教学班数据
             if (Objects.nonNull(teachClazz)) {
                 examStudent.setTeachClazzId(teachClazz.getId());
-                examStudent.setTeachClazzName(teachClazz.getTeachClazzName());
+                examStudent.setTeachClazzName(teachClazz.getClazzName());
             }
             examStudent.setStudentClazzType(studentClazzType);
             examStudentList.add(examStudent);

+ 64 - 68
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TeachClazzServiceImpl.java

@@ -1,27 +1,27 @@
 package com.qmth.distributed.print.business.service.impl;
 
 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.params.TeachClazzParams;
 import com.qmth.distributed.print.business.bean.result.DictionaryResult;
 import com.qmth.distributed.print.business.bean.result.TeachClazzResult;
+import com.qmth.distributed.print.business.entity.BasicTeachClazz;
 import com.qmth.distributed.print.business.entity.TeachClazz;
 import com.qmth.distributed.print.business.entity.TeachCourse;
 import com.qmth.distributed.print.business.entity.TeachStudent;
 import com.qmth.distributed.print.business.mapper.TeachClazzMapper;
+import com.qmth.distributed.print.business.service.BasicTeachClazzService;
 import com.qmth.distributed.print.business.service.TeachClazzService;
 import com.qmth.distributed.print.business.service.TeachCourseService;
 import com.qmth.distributed.print.business.service.TeachStudentService;
 import com.qmth.teachcloud.common.base.BaseEntity;
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -38,24 +38,46 @@ import java.util.stream.Collectors;
  */
 @Service
 public class TeachClazzServiceImpl extends ServiceImpl<TeachClazzMapper,TeachClazz> implements TeachClazzService {
+
     @Resource
     private TeachStudentService teachStudentService;
+
     @Resource
     private TeachCourseService teachCourseService;
+
     @Resource
-    private BasicCourseService basicCourseService;
+    private BasicTeachClazzService basicTeachClazzService;
 
     @Override
-    public IPage<TeachClazzResult> teachClazzPage(Long basicCourseId, String teachClazzName, int pageNumber, int pageSize) {
-        Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
+    public IPage<TeachClazzResult> teachClazzPage(Long examId, String courseCode, String teachClazzName, int pageNumber,
+            int pageSize) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        Long userId = sysUser.getId();
+        TeachCourse teachCourse = teachCourseService.findByExamIdCourseCodeAndUserId(examId, courseCode, userId);
+        Long teachCourseId = teachCourse.getId();
+
         teachClazzName = SystemConstant.translateSpecificSign(teachClazzName);
-        IPage<TeachClazzResult> resultIPage = this.baseMapper.findTeachClazzPage(new Page<>(pageNumber, pageSize), basicCourseId, teachClazzName, schoolId, sysUser.getId());
+        IPage<TeachClazzResult> resultIPage;
+
+        IPage<TeachClazzResult> selfPage = this.baseMapper.findTeachClazzPage(new Page<>(pageNumber, pageSize),
+                teachCourseId, teachClazzName);
+        if (CollectionUtils.isEmpty(selfPage.getRecords())) {
+            // 查询该教学课程下所有教学班
+            TeachCourse leaderTeachCourse = teachCourseService.findByExamIdCourseCodeAndUserId(examId, courseCode,
+                    teachCourse.getCreateId());
+            Long leaderTeachCourseId = leaderTeachCourse.getId();
+            resultIPage = this.baseMapper.findTeachClazzPage(new Page<>(pageNumber, pageSize), leaderTeachCourseId,
+                    teachClazzName);
+        } else {
+            resultIPage = selfPage;
+        }
+
         List<TeachClazzResult> teachClazzResultList = resultIPage.getRecords();
 
         for (TeachClazzResult teachClazzResult : teachClazzResultList) {
             Long id = teachClazzResult.getId();
-            int count = teachStudentService.count(new QueryWrapper<TeachStudent>().lambda().eq(TeachStudent::getTeachClazzId, id));
+            int count = teachStudentService.count(
+                    new QueryWrapper<TeachStudent>().lambda().eq(TeachStudent::getTeachClazzId, id));
             teachClazzResult.setTeachStudentCount(count);
         }
         return resultIPage;
@@ -63,85 +85,59 @@ public class TeachClazzServiceImpl extends ServiceImpl<TeachClazzMapper,TeachCla
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public Boolean editTeachClazz(TeachClazzParams teachClazzParams, SysUser requestUser) {
-        Long id = teachClazzParams.getId();
-        Long basicCourseId = teachClazzParams.getBasicCourseId();
-        String teachClazzName = teachClazzParams.getTeachClazzName();
-        boolean result;
-
-        if (SystemConstant.isOneNull(teachClazzName, basicCourseId)) {
-            throw ExceptionResultEnum.ERROR.exception("参数异常");
-        }
-        BasicCourse basicCourse = basicCourseService.getById(basicCourseId);
-        if (Objects.isNull(basicCourse)) {
-            throw ExceptionResultEnum.ERROR.exception("未找到课程");
-        }
-        String courseName = basicCourse.getName();
-
-        Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
-        TeachClazz check = this.getOne(new QueryWrapper<TeachClazz>()
-                .lambda()
-                .eq(TeachClazz::getSchoolId, schoolId)
-                .eq(TeachClazz::getBasicCourseId,basicCourse.getId())
-                .eq(TeachClazz::getTeachClazzName, teachClazzName));
-
-        if (Objects.nonNull(check) && !check.getId().equals(id)) {
-            throw ExceptionResultEnum.ERROR.exception("课程【" + courseName
-                    + "】中已存在班级名称为【" + check.getTeachClazzName() + "】的班级");
-        }
+    public void selectTeachClazz(TeachClazzParams teachClazzParams, SysUser requestUser) {
+        Long teachCourseId = teachClazzParams.getTeachCourseId();
+        List<Long> dbIdList = this.list(
+                new QueryWrapper<TeachClazz>().lambda().eq(TeachClazz::getTeachCourseId, teachCourseId)).stream().map(TeachClazz::getBasicTeachClazzId).collect(Collectors.toList());
+
+        List<TeachClazz> teachClazzList = new ArrayList<>();
+        List<Long> idList = teachClazzParams.getIdList().stream().filter(e -> !dbIdList.contains(e)).collect(Collectors.toList());
+        for (Long basicTeachClazzId : idList) {
+            BasicTeachClazz basicTeachClazz = basicTeachClazzService.getById(basicTeachClazzId);
+            if (Objects.isNull(basicTeachClazz)) {
+                throw ExceptionResultEnum.ERROR.exception("教学课程字典不存在");
+            }
 
-        if (SystemConstant.longNotNull(id)) {
-            // 重命名课程
-            result = this.update(new UpdateWrapper<TeachClazz>().lambda().eq(TeachClazz::getId, id).set(TeachClazz::getTeachClazzName, teachClazzName));
-        } else {
             TeachClazz teachClazz = new TeachClazz();
-            teachClazz.setSchoolId(schoolId);
-            teachClazz.setTeachClazzName(teachClazzName);
+            teachClazz.setSchoolId(basicTeachClazz.getSchoolId());
+            teachClazz.setTeachCourseId(teachCourseId);
+            teachClazz.setBasicTeachClazzId(basicTeachClazzId);
             teachClazz.setUserId(requestUser.getId());
-            teachClazz.setBasicCourseId(basicCourseId);
+            teachClazz.setClazzName(basicTeachClazz.getClazzName());
             teachClazz.insertInfo(requestUser.getId());
-            result = this.save(teachClazz);
+            teachClazzList.add(teachClazz);
         }
-        return result;
+        this.saveBatch(teachClazzList);
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean deleteTeachClazzBatch(List<Long> idList) {
         // 删除班级时、同步删除学生
-        List<TeachStudent> teachStudentList = teachStudentService.list(new QueryWrapper<TeachStudent>().lambda().in(TeachStudent::getTeachClazzId, idList));
+        List<TeachStudent> teachStudentList = teachStudentService.list(
+                new QueryWrapper<TeachStudent>().lambda().in(TeachStudent::getTeachClazzId, idList));
         // 删除教学学生
-        teachStudentService.deleteTeachStudentBatch(teachStudentList.stream().map(BaseEntity::getId).distinct().collect(Collectors.toList()));
+        teachStudentService.deleteTeachStudentBatch(
+                teachStudentList.stream().map(BaseEntity::getId).distinct().collect(Collectors.toList()));
         return this.removeByIds(idList);
     }
 
     @Override
     public List<DictionaryResult> findTeachCourseByUserId(Long userId) {
         Long schoolId = SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId()));
-        List<TeachCourse> teachCourseList = teachCourseService.list(new QueryWrapper<TeachCourse>().lambda()
-                .eq(TeachCourse::getUserId, userId)
-                .eq(TeachCourse::getSchoolId, schoolId)
-                .orderByDesc(TeachCourse::getCreateTime));
+        List<TeachCourse> teachCourseList = teachCourseService.list(
+                new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getUserId, userId).eq(TeachCourse::getSchoolId, schoolId).orderByDesc(TeachCourse::getCreateTime));
         List<DictionaryResult> dictionaryResultList = new ArrayList<>();
-        for (TeachCourse teachCourse : teachCourseList) {
-            BasicCourse basicCourse = basicCourseService.getById(teachCourse.getBasicCourseId());
-            if (basicCourse.getEnable()) {
-                DictionaryResult dictionaryResult = new DictionaryResult();
-                dictionaryResult.setId(teachCourse.getId());
-                dictionaryResult.setCode(basicCourse.getCode());
-                dictionaryResult.setName(basicCourse.getName());
-                dictionaryResultList.add(dictionaryResult);
-            }
-        }
+        //        for (TeachCourse teachCourse : teachCourseList) {
+        //            BasicCourse basicCourse = basicCourseService.getById(teachCourse.getBasicCourseId());
+        //            if (basicCourse.getEnable()) {
+        //                DictionaryResult dictionaryResult = new DictionaryResult();
+        //                dictionaryResult.setId(teachCourse.getId());
+        //                dictionaryResult.setCode(basicCourse.getCode());
+        //                dictionaryResult.setName(basicCourse.getName());
+        //                dictionaryResultList.add(dictionaryResult);
+        //            }
+        //        }
         return dictionaryResultList;
     }
-
-    @Override
-    public List<TeachClazz> listByBasicCourseIdAndUserId(Long schoolId, Long basicCourseId, Long userId) {
-        QueryWrapper<TeachClazz> teachClazzQueryWrapper = new QueryWrapper<>();
-        teachClazzQueryWrapper.lambda().eq(TeachClazz::getSchoolId, schoolId)
-                .eq(TeachClazz::getBasicCourseId, basicCourseId)
-                .eq(TeachClazz::getUserId, userId);
-        return this.list(teachClazzQueryWrapper);
-    }
 }

+ 195 - 150
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TeachCourseServiceImpl.java

@@ -6,9 +6,9 @@ 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.google.common.collect.Lists;
-import com.qmth.distributed.print.business.bean.dto.excel.TeachCourseDto;
 import com.qmth.distributed.print.business.bean.dto.excel.TeacherTeamDto;
 import com.qmth.distributed.print.business.bean.params.TeachCourseParams;
+import com.qmth.distributed.print.business.bean.params.TeachCourseSelectParam;
 import com.qmth.distributed.print.business.bean.params.TeacherTeamParam;
 import com.qmth.distributed.print.business.bean.result.CourseWeightSettingStatusResult;
 import com.qmth.distributed.print.business.bean.result.DictionaryResult;
@@ -18,7 +18,6 @@ import com.qmth.distributed.print.business.enums.CourseSettingTypeEnum;
 import com.qmth.distributed.print.business.mapper.TeachCourseMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.base.BaseEntity;
-import com.qmth.teachcloud.common.bean.params.BasicCourseParams;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.bean.result.TeacherSelectResult;
 import com.qmth.teachcloud.common.bean.result.TeacherTeamResult;
@@ -87,118 +86,118 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
     private CourseDimensionService courseDimensionService;
 
     @Override
-    public IPage<TeachCourseResult> teachCoursePage(String courseName, int pageNumber, int pageSize, Long userId) {
-        if (!SystemConstant.longNotNull(userId)) {
-            throw ExceptionResultEnum.ERROR.exception("请先登录");
-        }
-        Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
+    public IPage<TeachCourseResult> teachCoursePage(Long examId, String courseName, int pageNumber, int pageSize, Long userId) {
         courseName = SystemConstant.translateSpecificSign(courseName);
-        return this.baseMapper.findTeachCoursePage(new Page<>(pageNumber, pageSize), courseName, userId, schoolId);
+        return this.baseMapper.findTeachCoursePage(new Page<>(pageNumber, pageSize), examId, courseName, userId);
     }
 
+    @Deprecated
     @Transactional
     @Override
     public Boolean manualCreate(TeachCourseParams teachCourseParams, SysUser requestUser) {
-        String courseCode = teachCourseParams.getCourseCode();
-        String courseName = teachCourseParams.getCourseName();
-        Long schoolId = requestUser.getSchoolId();
-        Long userId = requestUser.getId();
-        Long basicCourseId;
-
-        // 校验
-        BasicCourse basicCourse = basicCourseService.getOne(
-                new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getCode, courseCode));
-        if (Objects.nonNull(basicCourse)) {
-            // 根据课程编号查询存在课程判断名称是否一致
-            if (!courseName.equals(basicCourse.getName())) {
-                throw ExceptionResultEnum.ERROR.exception("课程编号[" + courseCode + "]的课程名称错误");
-            } else {
-                basicCourseId = basicCourse.getId();
-                // 判断重复教学课程
-                if (this.count(new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getSchoolId, schoolId)
-                        .eq(TeachCourse::getUserId, userId).eq(TeachCourse::getBasicCourseId, basicCourseId)) > 0) {
-                    throw ExceptionResultEnum.ERROR.exception("课程[" + courseName + "]已经创建");
-                }
-            }
-        } else {
-            // 不存在课程,直接新增一个课程!
-            BasicCourseParams basicCourseParams = new BasicCourseParams();
-            basicCourseParams.setCourseCode(courseCode);
-            basicCourseParams.setCourseName(courseName);
-            basicCourseParams.setTeachingRoomId(requestUser.getOrgId());
-            basicCourseId = basicCourseService.saveBasicCourse(basicCourseParams, requestUser);
-        }
-        TeachCourse teachCourse = new TeachCourse();
-        teachCourse.setSchoolId(schoolId);
-        teachCourse.setBasicCourseId(basicCourseId);
-        teachCourse.setUserId(userId);
-        teachCourse.setEnable(true);
-        teachCourse.insertInfo(userId);
-        return this.save(teachCourse);
+        throw ExceptionResultEnum.ERROR.exception("废弃的方法");
+        //        String courseCode = teachCourseParams.getCourseCode();
+        //        String courseName = teachCourseParams.getCourseName();
+        //        Long schoolId = requestUser.getSchoolId();
+        //        Long userId = requestUser.getId();
+        //        Long basicCourseId;
+        //
+        //        // 校验
+        //        BasicCourse basicCourse = basicCourseService.getOne(
+        //                new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getCode, courseCode));
+        //        if (Objects.nonNull(basicCourse)) {
+        //            // 根据课程编号查询存在课程判断名称是否一致
+        //            if (!courseName.equals(basicCourse.getName())) {
+        //                throw ExceptionResultEnum.ERROR.exception("课程编号[" + courseCode + "]的课程名称错误");
+        //            } else {
+        //                basicCourseId = basicCourse.getId();
+        //                // 判断重复教学课程
+        //                if (this.count(new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getSchoolId, schoolId)
+        //                        .eq(TeachCourse::getUserId, userId).eq(TeachCourse::getBasicCourseId, basicCourseId)) > 0) {
+        //                    throw ExceptionResultEnum.ERROR.exception("课程[" + courseName + "]已经创建");
+        //                }
+        //            }
+        //        } else {
+        //            // 不存在课程,直接新增一个课程!
+        //            BasicCourseParams basicCourseParams = new BasicCourseParams();
+        //            basicCourseParams.setCourseCode(courseCode);
+        //            basicCourseParams.setCourseName(courseName);
+        //            basicCourseParams.setTeachingRoomId(requestUser.getOrgId());
+        //            basicCourseId = basicCourseService.saveBasicCourse(basicCourseParams, requestUser);
+        //        }
+        //        TeachCourse teachCourse = new TeachCourse();
+        //        teachCourse.setSchoolId(schoolId);
+        //        teachCourse.setBasicCourseId(basicCourseId);
+        //        teachCourse.setUserId(userId);
+        //        teachCourse.setEnable(true);
+        //        teachCourse.insertInfo(userId);
+        //        return this.save(teachCourse);
     }
 
     @Transactional
     @Override
-    public void selectCreate(List<Long> basicCourseIdList, SysUser requestUser) {
-        // TODO: 2024/3/4 选择课程改造 传一个list课程对象 创建时还有加默认的评价方式
+    public void selectCreate(TeachCourseSelectParam teachCourseSelectParam, SysUser requestUser) {
         Long schoolId = requestUser.getSchoolId();
         Long userId = requestUser.getId();
-        if (CollectionUtils.isNotEmpty(basicCourseIdList)) {
-            basicCourseIdList = basicCourseService.listByIds(basicCourseIdList).stream().filter(BasicCourse::getEnable)
-                    .map(BaseEntity::getId).distinct().collect(Collectors.toList());
-
-            if (CollectionUtils.isNotEmpty(basicCourseIdList)) {
-                List<Long> alreadyCreated = this.list(
-                                new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getUserId, userId).in(TeachCourse::getBasicCourseId, basicCourseIdList)).stream()
-                        .map(TeachCourse::getBasicCourseId).distinct().collect(Collectors.toList());
-
-                // 去掉已经创建的教学课程
-                basicCourseIdList.removeAll(alreadyCreated);
-                // 创建教学课程
-                List<TeachCourse> teachCourseList = basicCourseIdList.stream().flatMap(e -> {
-                    TeachCourse teachCourse = new TeachCourse();
-                    teachCourse.setSchoolId(schoolId);
-                    teachCourse.setBasicCourseId(e);
-                    teachCourse.setUserId(userId);
-                    teachCourse.setEnable(true);
-                    teachCourse.insertInfo(userId);
-                    return Stream.of(teachCourse);
-                }).collect(Collectors.toList());
-
-                // 新增课程
-                this.saveBatch(teachCourseList);
+        Long examId = teachCourseSelectParam.getExamId();
+        List<String> courseCodeList = teachCourseSelectParam.getCourseCodeList();
+
+        if (CollectionUtils.isNotEmpty(courseCodeList)) {
+            List<String> occupiedCourseCodeList = this.list(
+                            new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getExamId, examId).eq(TeachCourse::getUserId, userId)).stream().map(TeachCourse::getCourseCode)
+                    .collect(Collectors.toList());
+
+            courseCodeList = courseCodeList.stream().filter(occupiedCourseCodeList::contains).collect(Collectors.toList());
+
+            TeachCourse tmp = new TeachCourse();
+            tmp.setSchoolId(schoolId);
+            tmp.setExamId(examId);
+            tmp.setUserId(userId);
+            tmp.setEnable(true);
+            tmp.setWeightSetting(false);
+
+            for (String courseCode : courseCodeList) {
+                TeachCourse cell = new TeachCourse();
+                BeanUtils.copyProperties(tmp, cell);
+                cell.insertInfo(userId);
+                this.save(cell);
+
+                // 创建默认评价方式
+                courseEvaluationService.createDefaultCourseEvaluation(examId, courseCode, userId);
             }
         }
     }
 
+    @Deprecated
     @Transactional
     @Override
-    public void importTeachCourse(MultipartFile file, SysUser requestUser) throws IOException, NoSuchFieldException {
-        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(TeachCourseDto.class),
-                (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
-                    if (finalExcelErrorList.size() > 0) {
-                        throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
-                    }
-                    return finalExcelList;
-                }, 2);
-
-        if (Objects.nonNull(finalList) && finalList.size() > 0) {
-            for (int i = 0; i < finalList.size(); i++) {
-                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
-                List<Object> teachCourseImportDtoList = map.get(i);
-                for (int y = 0; y < Objects.requireNonNull(teachCourseImportDtoList).size(); y++) {
-                    if (teachCourseImportDtoList.get(y) instanceof TeachCourseDto) {
-                        TeachCourseDto teachCourseDto = (TeachCourseDto) teachCourseImportDtoList.get(y);
-                        String courseCode = teachCourseDto.getCourseCode();
-                        String courseName = teachCourseDto.getCourseName();
-                        TeachCourseParams teachCourseParams = new TeachCourseParams();
-                        teachCourseParams.setCourseCode(courseCode);
-                        teachCourseParams.setCourseName(courseName);
-                        this.manualCreate(teachCourseParams, requestUser);
-                    }
-                }
-            }
-        }
+    public void importTeachCourse(MultipartFile file, SysUser requestUser) {
+        throw ExceptionResultEnum.ERROR.exception("废弃的方法");
+        //        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(TeachCourseDto.class),
+        //                (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+        //                    if (finalExcelErrorList.size() > 0) {
+        //                        throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+        //                    }
+        //                    return finalExcelList;
+        //                }, 2);
+        //
+        //        if (Objects.nonNull(finalList) && finalList.size() > 0) {
+        //            for (int i = 0; i < finalList.size(); i++) {
+        //                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
+        //                List<Object> teachCourseImportDtoList = map.get(i);
+        //                for (int y = 0; y < Objects.requireNonNull(teachCourseImportDtoList).size(); y++) {
+        //                    if (teachCourseImportDtoList.get(y) instanceof TeachCourseDto) {
+        //                        TeachCourseDto teachCourseDto = (TeachCourseDto) teachCourseImportDtoList.get(y);
+        //                        String courseCode = teachCourseDto.getCourseCode();
+        //                        String courseName = teachCourseDto.getCourseName();
+        //                        TeachCourseParams teachCourseParams = new TeachCourseParams();
+        //                        teachCourseParams.setCourseCode(courseCode);
+        //                        teachCourseParams.setCourseName(courseName);
+        //                        this.manualCreate(teachCourseParams, requestUser);
+        //                    }
+        //                }
+        //            }
+        //        }
     }
 
     @Override
@@ -224,17 +223,46 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void deleteTeachCourseBatch(List<Long> idList) {
-        // 删除课程时,同步删除班级、学生、教师
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        Long userId = requestUser.getId();
         List<TeachCourse> teachCourseList = this.listByIds(idList);
-        for (TeachCourse teachCourse : teachCourseList) {
-            List<TeachClazz> teachClazzList = teachClazzService.listByBasicCourseIdAndUserId(teachCourse.getSchoolId(),
-                    teachCourse.getBasicCourseId(), teachCourse.getUserId());
-            if (CollectionUtils.isNotEmpty(teachClazzList)) {
-                List<Long> teachClazzIds = teachClazzList.stream().map(TeachClazz::getId).collect(Collectors.toList());
-                teachClazzService.deleteTeachClazzBatch(teachClazzIds);
+        List<String> cantDeleteCourseCodeList = teachCourseList.stream().filter(e -> !e.getCreateId().equals(userId)).map(TeachCourse::getCourseCode).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(cantDeleteCourseCodeList)) {
+            throw ExceptionResultEnum.ERROR.exception(
+                    String.format("[%s]课程非本人创建,无法删除", String.join(",", cantDeleteCourseCodeList)));
+        }
+        List<TeachCourse> mainTeachCourseList = teachCourseList.stream().filter(e -> e.getCreateId().equals(userId)).collect(Collectors.toList());
+        if (mainTeachCourseList.size() > 0) {
+            for (TeachCourse mainTeachCourse : mainTeachCourseList) {
+                List<TeachCourse> teamList = this.list(
+                        new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getExamId, mainTeachCourse.getExamId())
+                                .eq(TeachCourse::getCourseCode, mainTeachCourse.getCourseCode())
+                                .eq(TeachCourse::getCreateId, userId).ne(TeachCourse::getUserId, userId));
+                if (CollectionUtils.isNotEmpty(teamList)) {
+                    throw ExceptionResultEnum.ERROR.exception(
+                            String.format("请先删除课程(编号)[%s]下的教师团队,再删除课程", mainTeachCourse.getCourseCode()));
+                }
             }
         }
-        this.removeByIds(idList);
+
+        for (Long teachCourseId : idList) {
+            // 删除知识点
+            courseDimensionService.remove(
+                    new QueryWrapper<CourseDimension>().lambda().eq(CourseDimension::getTeachCourseId, teachCourseId));
+            // 删除课程目标
+            courseTargetService.remove(
+                    new QueryWrapper<CourseTarget>().lambda().eq(CourseTarget::getTeachCourseId, teachCourseId));
+            // 删除课程评价方式
+            courseEvaluationService.remove(new QueryWrapper<CourseEvaluation>().lambda()
+                    .eq(CourseEvaluation::getTeachCourseId, teachCourseId));
+            // 删除权重设置
+            courseWeightService.remove(
+                    new QueryWrapper<CourseWeight>().lambda().eq(CourseWeight::getTeachCourseId, teachCourseId));
+            // 删除教学课程
+            this.removeById(teachCourseId);
+
+            // TODO: 2024/3/6 可能还要删除教学班学生等 
+        }
     }
 
     @Transactional
@@ -242,7 +270,8 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
     public void manualCreateTeacher(TeacherTeamParam teacherTeamParam, SysUser requestUser) throws IllegalAccessException {
         String name = teacherTeamParam.getTeacherName();
         String code = teacherTeamParam.getTeacherCode();
-        Long basicCourseId = teacherTeamParam.getBasicCourseId();
+        Long examId = teacherTeamParam.getExamId();
+        String courseCode = teacherTeamParam.getCourseCode();
         Long requestUserId = requestUser.getId();
         Long schoolId = requestUser.getSchoolId();
         Long teacherId;
@@ -256,8 +285,8 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
             } else {
                 teacherId = dbUser.getId();
                 // 判断在该教师团队下已经存在该教师
-                if (this.count(new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getSchoolId, schoolId)
-                        .eq(TeachCourse::getBasicCourseId, basicCourseId).eq(TeachCourse::getUserId, teacherId)) > 0) {
+                if (this.count(new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getExamId, examId)
+                        .eq(TeachCourse::getCourseCode, courseCode).eq(TeachCourse::getUserId, teacherId)) > 0) {
                     throw ExceptionResultEnum.ERROR.exception("教师[" + name + "]已经在教师团队中");
                 }
             }
@@ -283,16 +312,21 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
         // 添加教师团队
         TeachCourse teachCourse = new TeachCourse();
         teachCourse.setSchoolId(schoolId);
-        teachCourse.setBasicCourseId(basicCourseId);
+        teachCourse.setExamId(examId);
+        teachCourse.setCourseCode(courseCode);
+        teachCourse.setWeightSetting(false);
         teachCourse.setUserId(teacherId);
         teachCourse.setEnable(true);
         teachCourse.insertInfo(requestUserId);
         this.save(teachCourse);
+
+        // 创建默认的评价方式
+        courseEvaluationService.createDefaultCourseEvaluation(examId, courseCode, teacherId);
     }
 
     @Transactional
     @Override
-    public void selectCreateTeacher(Long basicCourseId, List<Long> userIdList, SysUser requestUser) {
+    public void selectCreateTeacher(Long examId, String courseCode, List<Long> userIdList, SysUser requestUser) {
         Long schoolId = requestUser.getSchoolId();
         Long requestUserId = requestUser.getId();
         if (CollectionUtils.isNotEmpty(userIdList)) {
@@ -302,7 +336,8 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
 
             if (CollectionUtils.isNotEmpty(userIdList)) {
                 List<Long> alreadyCreated = this.list(
-                                new QueryWrapper<TeachCourse>().lambda().in(TeachCourse::getUserId, userIdList).eq(TeachCourse::getBasicCourseId, basicCourseId)).stream().map(TeachCourse::getUserId)
+                                new QueryWrapper<TeachCourse>().lambda().in(TeachCourse::getUserId, userIdList)
+                                        .eq(TeachCourse::getCourseCode, courseCode)).stream().map(TeachCourse::getUserId)
                         .distinct().collect(Collectors.toList());
 
                 // 去掉已经在该课程教师团队的老师
@@ -312,7 +347,9 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
                 List<TeachCourse> teachCourseList = userIdList.stream().flatMap(e -> {
                     TeachCourse teachCourse = new TeachCourse();
                     teachCourse.setSchoolId(schoolId);
-                    teachCourse.setBasicCourseId(basicCourseId);
+                    teachCourse.setExamId(examId);
+                    teachCourse.setCourseCode(courseCode);
+                    teachCourse.setWeightSetting(false);
                     teachCourse.setUserId(e);
                     teachCourse.setEnable(true);
                     teachCourse.insertInfo(requestUserId);
@@ -321,47 +358,55 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
 
                 // 新增课程
                 this.saveBatch(teachCourseList);
+
+                for (Long userId : userIdList) {
+                    // 创建默认评价方式
+                    courseEvaluationService.createDefaultCourseEvaluation(examId, courseCode, userId);
+                }
             }
         }
     }
 
+    @Deprecated
     @Transactional
     @Override
     public void importTeacherTeam(MultipartFile file, Long basicCourseId, SysUser requestUser) throws IOException, NoSuchFieldException, IllegalAccessException {
-        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(TeacherTeamDto.class),
-                (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
-                    if (finalExcelErrorList.size() > 0) {
-                        throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
-                    }
-                    return finalExcelList;
-                }, 2);
-
-        if (Objects.nonNull(finalList) && finalList.size() > 0) {
-            for (int i = 0; i < finalList.size(); i++) {
-                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
-                List<Object> teacherTeamImportList = map.get(i);
-                for (int y = 0; y < Objects.requireNonNull(teacherTeamImportList).size(); y++) {
-                    if (teacherTeamImportList.get(y) instanceof TeacherTeamDto) {
-                        TeacherTeamDto teacherTeamDto = (TeacherTeamDto) teacherTeamImportList.get(y);
-                        TeacherTeamParam teacherTeamParam = new TeacherTeamParam();
-                        teacherTeamParam.setTeacherCode(teacherTeamDto.getCode());
-                        teacherTeamParam.setTeacherName(teacherTeamDto.getName());
-                        teacherTeamParam.setBasicCourseId(basicCourseId);
-                        this.manualCreateTeacher(teacherTeamParam, requestUser);
-                    }
-                }
-            }
-        }
+        throw ExceptionResultEnum.ERROR.exception("废弃的方法");
+        //        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(TeacherTeamDto.class),
+        //                (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+        //                    if (finalExcelErrorList.size() > 0) {
+        //                        throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+        //                    }
+        //                    return finalExcelList;
+        //                }, 2);
+        //
+        //        if (Objects.nonNull(finalList) && finalList.size() > 0) {
+        //            for (int i = 0; i < finalList.size(); i++) {
+        //                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
+        //                List<Object> teacherTeamImportList = map.get(i);
+        //                for (int y = 0; y < Objects.requireNonNull(teacherTeamImportList).size(); y++) {
+        //                    if (teacherTeamImportList.get(y) instanceof TeacherTeamDto) {
+        //                        TeacherTeamDto teacherTeamDto = (TeacherTeamDto) teacherTeamImportList.get(y);
+        //                        TeacherTeamParam teacherTeamParam = new TeacherTeamParam();
+        //                        teacherTeamParam.setTeacherCode(teacherTeamDto.getCode());
+        //                        teacherTeamParam.setTeacherName(teacherTeamDto.getName());
+        //                        teacherTeamParam.setBasicCourseId(basicCourseId);
+        //                        this.manualCreateTeacher(teacherTeamParam, requestUser);
+        //                    }
+        //                }
+        //            }
+        //        }
     }
 
     @Override
-    public IPage<TeacherTeamResult> findTeacherTeamPage(String userInfo, Long basicCourseId, int pageNumber, int pageSize) {
+    public IPage<TeacherTeamResult> findTeacherTeamPage(Long examId, String courseCode, String userInfo, int pageNumber,
+            int pageSize) {
         Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
         if (SystemConstant.strNotNull(userInfo)) {
             userInfo = SystemConstant.translateSpecificSign(userInfo);
         }
-        IPage<TeacherTeamResult> page = this.baseMapper.findTeacherTeamPage(new Page<>(pageNumber, pageSize), userInfo,
-                basicCourseId, schoolId);
+        IPage<TeacherTeamResult> page = this.baseMapper.findTeacherTeamPage(new Page<>(pageNumber, pageSize), examId,
+                courseCode, userInfo);
         page.getRecords().forEach(e -> {
             Long userId = e.getUserId();
             List<Long> userIdList = new ArrayList<>();
@@ -396,18 +441,18 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
     @Override
     @Transactional
     public void updateByCourseIdAndTeacherList(Long basicCourseId, Set<Long> teachIdSet) {
-        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        List<TeachCourse> teachCourseList = null;
-        // 删除原有的全部
-        this.remove(new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getBasicCourseId, basicCourseId).gt(TeachCourse::getId, 0));
-        // 新增
-        if (!CollectionUtils.isEmpty(teachIdSet)) {
-            teachCourseList = new ArrayList<>();
-            for (Long teachId : teachIdSet) {
-                teachCourseList.add(new TeachCourse(sysUser, basicCourseId, teachId));
-            }
-            this.saveBatch(teachCourseList);
-        }
+        //        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        //        List<TeachCourse> teachCourseList = null;
+        //        // 删除原有的全部
+        //        this.remove(new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getBasicCourseId, basicCourseId).gt(TeachCourse::getId, 0));
+        //        // 新增
+        //        if (!CollectionUtils.isEmpty(teachIdSet)) {
+        //            teachCourseList = new ArrayList<>();
+        //            for (Long teachId : teachIdSet) {
+        //                teachCourseList.add(new TeachCourse(sysUser, basicCourseId, teachId));
+        //            }
+        //            this.saveBatch(teachCourseList);
+        //        }
     }
 
     @Override

+ 101 - 101
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TeachStudentServiceImpl.java

@@ -1,35 +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.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.google.common.collect.Lists;
-import com.qmth.distributed.print.business.bean.dto.excel.TeachStudentImportDto;
+import com.qmth.distributed.print.business.bean.params.TeachStudentBatchParam;
 import com.qmth.distributed.print.business.bean.result.TeachStudentResult;
+import com.qmth.distributed.print.business.entity.BasicExamStudent;
 import com.qmth.distributed.print.business.entity.TeachClazz;
 import com.qmth.distributed.print.business.entity.TeachStudent;
 import com.qmth.distributed.print.business.mapper.TeachStudentMapper;
+import com.qmth.distributed.print.business.service.BasicExamStudentService;
 import com.qmth.distributed.print.business.service.TeachClazzService;
 import com.qmth.distributed.print.business.service.TeachStudentService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.BasicStudent;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.service.BasicStudentService;
-import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.IOException;
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * @Description: 教学学生服务实现类
@@ -38,8 +35,10 @@ import java.util.stream.Collectors;
  */
 @Service
 public class TeachStudentServiceImpl extends ServiceImpl<TeachStudentMapper, TeachStudent> implements TeachStudentService {
+
     @Resource
-    private BasicStudentService basicStudentService;
+    private BasicExamStudentService basicExamStudentService;
+
     @Resource
     private TeachClazzService teachClazzService;
 
@@ -47,107 +46,112 @@ public class TeachStudentServiceImpl extends ServiceImpl<TeachStudentMapper, Tea
     public IPage<TeachStudentResult> teachStudentPage(Long teachClazzId, String studentInfo, int pageNumber, int pageSize) {
         studentInfo = SystemConstant.translateSpecificSign(studentInfo);
         Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
-        return this.baseMapper.findTeachStudentPage(new Page<>(pageNumber, pageSize), teachClazzId, studentInfo, schoolId);
+        return this.baseMapper.findTeachStudentPage(new Page<>(pageNumber, pageSize), teachClazzId, studentInfo,
+                schoolId);
     }
 
+    @Deprecated
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean createTeachStudent(String studentName, String studentCode, Long teachClazzId, SysUser requestUser) {
-        if (SystemConstant.isOneNull(studentName, studentCode, teachClazzId)) {
-            throw ExceptionResultEnum.ERROR.exception("参数不完整");
-        }
-        Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
-        BasicStudent basicStudent = basicStudentService.getOne(new QueryWrapper<BasicStudent>()
-                .lambda()
-                .eq(BasicStudent::getSchoolId, schoolId)
-                .eq(BasicStudent::getStudentCode, studentCode)
-                .eq(BasicStudent::getStudentName, studentName));
-        if (Objects.isNull(basicStudent)) {
-            throw ExceptionResultEnum.ERROR.exception("学生姓名[" + studentName + "],学号[" + studentCode + "]的学生在学生管理中不存在,请先创建该学生");
-        }
-        if (this.checkTeachStudentRepeat(basicStudent.getId(), teachClazzId, schoolId)) {
-            throw ExceptionResultEnum.ERROR.exception("学生姓名[" + studentName + "],学号为[" + studentCode + "]的学生在该班级已存在");
-        }
-        List<BasicStudent> basicStudentList = new ArrayList<>();
-        basicStudentList.add(basicStudent);
-        return this.createTeachStudentBatch(basicStudentList, teachClazzId, schoolId, requestUser);
+        throw ExceptionResultEnum.ERROR.exception("废弃的方法");
+        //        if (SystemConstant.isOneNull(studentName, studentCode, teachClazzId)) {
+        //            throw ExceptionResultEnum.ERROR.exception("参数不完整");
+        //        }
+        //        Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
+        //        BasicStudent basicStudent = basicStudentService.getOne(new QueryWrapper<BasicStudent>()
+        //                .lambda()
+        //                .eq(BasicStudent::getSchoolId, schoolId)
+        //                .eq(BasicStudent::getStudentCode, studentCode)
+        //                .eq(BasicStudent::getStudentName, studentName));
+        //        if (Objects.isNull(basicStudent)) {
+        //            throw ExceptionResultEnum.ERROR.exception("学生姓名[" + studentName + "],学号[" + studentCode + "]的学生在学生管理中不存在,请先创建该学生");
+        //        }
+        //        if (this.checkTeachStudentRepeat(basicStudent.getId(), teachClazzId, schoolId)) {
+        //            throw ExceptionResultEnum.ERROR.exception("学生姓名[" + studentName + "],学号为[" + studentCode + "]的学生在该班级已存在");
+        //        }
+        //        List<BasicStudent> basicStudentList = new ArrayList<>();
+        //        basicStudentList.add(basicStudent);
+        //        return this.createTeachStudentBatch(basicStudentList, teachClazzId, schoolId, requestUser);
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void createTeachStudentBatch(Set<Long> basicStudentIdSet, Long teachClazzId, Long schoolId, SysUser requestUser) {
-        List<BasicStudent> basicStudentList = basicStudentService.listByIds(basicStudentIdSet);
-        if (basicStudentList.size() > 0){
-            this.createTeachStudentBatch(basicStudentList, teachClazzId, schoolId, requestUser);
+    public void createTeachStudentBatch(TeachStudentBatchParam teachStudentBatchParam, SysUser requestUser) {
+        Long teachClazzId = teachStudentBatchParam.getTeachClazzId();
+        List<Long> basicExamStudentIdList = teachStudentBatchParam.getBasicExamStudentIdList();
+
+        List<BasicExamStudent> basicExamStudentList = basicExamStudentService.listByIds(basicExamStudentIdList);
+        if (basicExamStudentList.size() > 0) {
+            this.createTeachStudentBatch(basicExamStudentList, teachClazzId, requestUser);
         }
     }
 
+    @Deprecated
     @Transactional(rollbackFor = Exception.class)
     @Override
     public String importTeachStudent(MultipartFile file, Long teachClazzId, Long schoolId, SysUser requestUser) throws IOException, NoSuchFieldException {
-        if (SystemConstant.isOneNull(file, teachClazzId, schoolId)) {
-            throw ExceptionResultEnum.ERROR.exception("参数缺失");
-        }
-
-        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(TeachStudentImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
-            if (finalExcelErrorList.size() > 0) {
-                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
-            }
-            return finalExcelList;
-        },2);
-
-        List<BasicStudent> basicStudentDatasource = basicStudentService.list(new QueryWrapper<BasicStudent>().lambda().eq(BasicStudent::getSchoolId, schoolId));
-        Set<String> studentCodeSet = new HashSet<>();
-
-        if (Objects.nonNull(finalList) && finalList.size() > 0) {
-            for (int i = 0; i < finalList.size(); i++) {
-                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
-                List<Object> teachStudentImportDtoList = map.get(i);
-                for (int y = 0; y < Objects.requireNonNull(teachStudentImportDtoList).size(); y++) {
-                    if (teachStudentImportDtoList.get(y) instanceof TeachStudentImportDto) {
-                        TeachStudentImportDto teachStudentImportDto = (TeachStudentImportDto) teachStudentImportDtoList.get(y);
-                        String studentCode = teachStudentImportDto.getStudentCode();
-                        studentCodeSet.add(studentCode);
-                    }
-                }
-            }
-        }
-
-        // 要导入操作的基础学生数据集合
-        List<BasicStudent> basicStudentList = basicStudentDatasource.stream()
-                .filter(e -> studentCodeSet.contains(e.getStudentCode()))
-                .collect(Collectors.toList());
-
-        // 学号不存在
-        String basicStudentNotFoundStr = studentCodeSet.stream()
-                .filter(e -> !basicStudentList.stream().map(BasicStudent::getStudentCode).collect(Collectors.toList()).contains(e))
-                .collect(Collectors.joining(","));
-
-        this.createTeachStudentBatch(basicStudentList, teachClazzId, schoolId, requestUser);
-        String success = "[" + basicStudentList.size() + "]个学生导入成功";
-        if (SystemConstant.strNotNull(basicStudentNotFoundStr)){
-            success = success + ",且学号[" + basicStudentNotFoundStr + "]的学生在字典中不存在没有导入";
-        }
-        return success;
+        throw ExceptionResultEnum.ERROR.exception("废弃的方法");
+        //        if (SystemConstant.isOneNull(file, teachClazzId, schoolId)) {
+        //            throw ExceptionResultEnum.ERROR.exception("参数缺失");
+        //        }
+        //
+        //        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(TeachStudentImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+        //            if (finalExcelErrorList.size() > 0) {
+        //                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+        //            }
+        //            return finalExcelList;
+        //        },2);
+        //
+        //        List<BasicStudent> basicStudentDatasource = basicStudentService.list(new QueryWrapper<BasicStudent>().lambda().eq(BasicStudent::getSchoolId, schoolId));
+        //        Set<String> studentCodeSet = new HashSet<>();
+        //
+        //        if (Objects.nonNull(finalList) && finalList.size() > 0) {
+        //            for (int i = 0; i < finalList.size(); i++) {
+        //                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
+        //                List<Object> teachStudentImportDtoList = map.get(i);
+        //                for (int y = 0; y < Objects.requireNonNull(teachStudentImportDtoList).size(); y++) {
+        //                    if (teachStudentImportDtoList.get(y) instanceof TeachStudentImportDto) {
+        //                        TeachStudentImportDto teachStudentImportDto = (TeachStudentImportDto) teachStudentImportDtoList.get(y);
+        //                        String studentCode = teachStudentImportDto.getStudentCode();
+        //                        studentCodeSet.add(studentCode);
+        //                    }
+        //                }
+        //            }
+        //        }
+        //
+        //        // 要导入操作的基础学生数据集合
+        //        List<BasicStudent> basicStudentList = basicStudentDatasource.stream()
+        //                .filter(e -> studentCodeSet.contains(e.getStudentCode()))
+        //                .collect(Collectors.toList());
+        //
+        //        // 学号不存在
+        //        String basicStudentNotFoundStr = studentCodeSet.stream()
+        //                .filter(e -> !basicStudentList.stream().map(BasicStudent::getStudentCode).collect(Collectors.toList()).contains(e))
+        //                .collect(Collectors.joining(","));
+        //
+        //        this.createTeachStudentBatch(basicStudentList, teachClazzId, schoolId, requestUser);
+        //        String success = "[" + basicStudentList.size() + "]个学生导入成功";
+        //        if (SystemConstant.strNotNull(basicStudentNotFoundStr)){
+        //            success = success + ",且学号[" + basicStudentNotFoundStr + "]的学生在字典中不存在没有导入";
+        //        }
+        //        return success;
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean deleteTeachStudentBatch(List<Long> idList) {
-        // TODO: 2022/2/10 不确定删除逻辑目前直接做删除操作 (直接删除教学学生)
         return this.removeByIds(idList);
     }
 
     /**
      * 批量创建教学学生
      *
-     * @param basicStudentList 要创建教学学生的基础学生集合
-     * @param teachClazzId     教学班级id
-     * @param schoolId         学校id
-     * @param requestUser      请求用户
-     * @return 创建结果
+     * @param basicExamStudentList 要创建教学学生的考生字典集合
+     * @param teachClazzId         教学班级id
+     * @param requestUser          请求用户
      */
-    private Boolean createTeachStudentBatch(List<BasicStudent> basicStudentList, Long teachClazzId, Long schoolId, SysUser requestUser) {
+    private void createTeachStudentBatch(List<BasicExamStudent> basicExamStudentList, Long teachClazzId, SysUser requestUser) {
         TeachClazz teachClazz = teachClazzService.getById(teachClazzId);
         if (Objects.isNull(teachClazz)) {
             throw ExceptionResultEnum.ERROR.exception("教学班级不存在");
@@ -157,41 +161,37 @@ public class TeachStudentServiceImpl extends ServiceImpl<TeachStudentMapper, Tea
         }
 
         List<TeachStudent> teachStudentList = new ArrayList<>();
-        if (CollectionUtils.isNotEmpty(basicStudentList)) {
-            for (BasicStudent basicStudent : basicStudentList) {
-                Long basicStudentId = basicStudent.getId();
+        if (CollectionUtils.isNotEmpty(basicExamStudentList)) {
+            for (BasicExamStudent basicExamStudent : basicExamStudentList) {
+                Long basicExamStudentId = basicExamStudent.getId();
                 // 批量新增重复的课程跳过
-                if (this.checkTeachStudentRepeat(basicStudentId, teachClazzId, schoolId)) {
+                if (this.checkTeachStudentRepeat(basicExamStudentId, teachClazzId)) {
                     continue;
                 }
 
                 TeachStudent teachStudent = new TeachStudent();
-                teachStudent.setSchoolId(basicStudent.getSchoolId());
-                teachStudent.setStudentId(basicStudent.getId());
+                teachStudent.setSchoolId(requestUser.getSchoolId());
+                teachStudent.setStudentId(basicExamStudent.getId());
                 teachStudent.setTeachClazzId(teachClazzId);
-                teachStudent.setBasicCourseId(teachClazz.getBasicCourseId());
+                teachStudent.setTeachCourseId(teachClazz.getTeachCourseId());
                 teachStudent.setUserId(teachClazz.getUserId());
                 teachStudent.insertInfo(requestUser.getId());
                 teachStudentList.add(teachStudent);
             }
         }
-        return this.saveBatch(teachStudentList);
+        this.saveBatch(teachStudentList);
     }
 
     /**
      * 检验教学学生已存在
      *
-     * @param basicStudentId 基础学生id
-     * @param teachClazzId   教学班级id
-     * @param schoolId       学校id
+     * @param basicExamStudentId 考生字典id
+     * @param teachClazzId       教学班级id
      * @return true-已存在不能新增、false-不存在可以新增
      */
-    private Boolean checkTeachStudentRepeat(Long basicStudentId, Long teachClazzId, Long schoolId) {
-        TeachStudent teachStudent = this.getOne(new QueryWrapper<TeachStudent>()
-                .lambda()
-                .eq(TeachStudent::getStudentId, basicStudentId)
-                .eq(TeachStudent::getTeachClazzId, teachClazzId)
-                .eq(TeachStudent::getSchoolId, schoolId));
+    private Boolean checkTeachStudentRepeat(Long basicExamStudentId, Long teachClazzId) {
+        TeachStudent teachStudent = this.getOne(
+                new QueryWrapper<TeachStudent>().lambda().eq(TeachStudent::getStudentId, basicExamStudentId).eq(TeachStudent::getTeachClazzId, teachClazzId));
         return Objects.nonNull(teachStudent);
     }
 }

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

@@ -2332,11 +2332,11 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                                                    int sheet) {
         DictionaryResult clazz = null;
         if (!clazzMap.containsKey(key)) {//不存在查询
-            TeachClazz teachClazz = teachClazzService.getOne(new QueryWrapper<TeachClazz>().lambda().eq(TeachClazz::getSchoolId, schoolId).eq(TeachClazz::getTeachClazzName, key));
+            TeachClazz teachClazz = teachClazzService.getOne(new QueryWrapper<TeachClazz>().lambda().eq(TeachClazz::getSchoolId, schoolId).eq(TeachClazz::getClazzName, key));
             if (Objects.nonNull(teachClazz)) {
                 clazz = new DictionaryResult();
                 clazz.setId(teachClazz.getId());
-                clazz.setName(teachClazz.getTeachClazzName());
+                clazz.setName(teachClazz.getClazzName());
             } else {
                 QueryWrapper<BasicClazz> basicClazzQueryWrapper = new QueryWrapper<>();
                 basicClazzQueryWrapper.lambda().eq(BasicClazz::getSchoolId, schoolId)

+ 18 - 0
distributed-print-business/src/main/resources/db/log/脚本-caozx.sql

@@ -0,0 +1,18 @@
+ALTER TABLE `teach_clazz` 
+DROP INDEX `teach_clazz_unique` ;
+;
+ALTER TABLE `teach_clazz` 
+DROP COLUMN `basic_course_id`,
+DROP COLUMN `teach_clazz_name`,
+DROP COLUMN `teach_clazz_code`,
+ADD COLUMN `teach_course_id` BIGINT NOT NULL AFTER `school_id`,
+ADD COLUMN `basic_teach_clazz_id` BIGINT NOT NULL AFTER `teach_course_id`,
+ADD COLUMN `clazz_name` VARCHAR(50) NOT NULL COMMENT '教学课程名称' AFTER `user_id`;
+ALTER TABLE `teach_clazz` 
+ADD UNIQUE INDEX `teach_clazz_unique` (`teach_course_id` ASC, `basic_teach_clazz_id` ASC) VISIBLE;
+;
+
+
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1127', '共用接口-查询教学班字典', '/api/admin/basic/condition/list_basic_teach_clazz', 'URL', '149', '16', 'SYS', '1', '1', '1');
+ALTER TABLE `teach_student` 
+CHANGE COLUMN `basic_course_id` `teach_course_id` BIGINT NOT NULL COMMENT '教学课程id(冗余)' ;

+ 15 - 0
distributed-print-business/src/main/resources/mapper/BasicTeachClazzMapper.xml

@@ -2,4 +2,19 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.distributed.print.business.mapper.BasicTeachClazzMapper">
 
+    <select id="findTeachClazzList"
+            resultType="com.qmth.distributed.print.business.bean.result.BasicTeachClazzResult">
+        SELECT
+            id,
+            exam_id AS examId,
+            course_code AS courseCode,
+            clazz_name AS clazzName
+        FROM
+            basic_teach_clazz
+        <where>
+            <if test="examId != null">
+                AND exam_id = #{examId}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 4 - 8
distributed-print-business/src/main/resources/mapper/TeachClazzMapper.xml

@@ -6,22 +6,18 @@
             resultType="com.qmth.distributed.print.business.bean.result.TeachClazzResult">
         SELECT
             id,
-            basic_course_id AS basicCourseId,
-            teach_clazz_name AS teachClazzName,
+            teach_course_id AS teachCourseId,
+            clazz_name AS teachClazzName,
             create_time AS createTime
         FROM
             teach_clazz
         <where>
-            <if test="schoolId != null and schoolId != ''">
-                AND school_id = #{schoolId}
-            </if>
-            <if test="userId != null">
-                AND user_id = #{userId}
+            <if test="teachCourseId != null">
+                AND teach_course_id = #{teachCourseId}
             </if>
             <if test="teachClazzName != null and teachClazzName != ''">
                 AND teach_clazz_name LIKE CONCAT('%',#{teachClazzName},'%')
             </if>
-                AND basic_course_id = #{basicCourseId}
         </where>
         ORDER BY create_time DESC
     </select>

+ 11 - 8
distributed-print-business/src/main/resources/mapper/TeachCourseMapper.xml

@@ -8,20 +8,20 @@
             tc.id,
             bc.code AS courseCode,
             bc.name AS courseName,
-            bc.id AS basicCourseId,
+            tc.create_id AS createId,
             tc.create_time AS createTime
         FROM
             teach_course tc
                 INNER JOIN
-            basic_course bc ON tc.basic_course_id = bc.id AND bc.enable = TRUE
+            basic_course bc ON tc.school_id = bc.school_id AND tc.course_code = bc.code AND bc.enable = TRUE
         <where>
-            <if test="schoolId != null and schoolId != ''">
-                AND tc.school_id = #{schoolId}
+            <if test="examId != null">
+                AND tc.exam_id = #{examId}
             </if>
             <if test="courseName != null and courseName != ''">
                 AND bc.name LIKE CONCAT('%',#{courseName},'%')
             </if>
-            <if test="userId != null and userId != ''">
+            <if test="userId != null">
                 AND tc.user_id = #{userId}
             </if>
             AND tc.enable = true
@@ -44,15 +44,18 @@
             sys_org so ON su.org_id = so.id
         <where>
             su.enable = true
+            <if test="examId != null">
+                AND tc.exam_id = #{examId}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                AND tc.course_code = #{courseCode}
+            </if>
             <if test="schoolId != null">
                 AND tc.school_id = #{schoolId}
             </if>
             <if test="userInfo != null and userInfo != ''">
                 AND (su.real_name LIKE CONCAT('%',#{userInfo},'%') OR su.code LIKE CONCAT('%',#{userInfo},'%'))
             </if>
-            <if test="basicCourseId != null">
-                AND tc.basic_course_id = #{basicCourseId}
-            </if>
         </where>
     </select>
     <select id="findTeacherByOrgIds" resultType="com.qmth.teachcloud.common.bean.result.TeacherSelectResult">

+ 8 - 12
distributed-print-business/src/main/resources/mapper/TeachStudentMapper.xml

@@ -6,21 +6,17 @@
             resultType="com.qmth.distributed.print.business.bean.result.TeachStudentResult">
         SELECT
             ts.id AS id,
-            bs.student_name AS studentName,
-            bs.student_code AS studentCode,
-            so.name AS belongOrgName,
-            bm.name AS majorName,
-            bc.clazz_name AS clazzName
+            bes.student_name AS studentName,
+            bes.student_code AS studentCode,
+            bes.college AS belongOrgName,
+            bes.major AS majorName,
+            tc.clazz_name AS clazzName
         FROM
             teach_student ts
                 LEFT JOIN
-            basic_student bs ON ts.student_id = bs.id
+            basic_exam_student bes ON ts.student_id = bes.id
                 LEFT JOIN
-            sys_org so ON bs.belong_org_id = so.id
-                LEFT JOIN
-            basic_major bm ON bs.major_id = bm.id
-                LEFT JOIN
-            basic_clazz bc ON bs.clazz_id = bc.id
+            teach_clazz tc ON tc.id = ts.teach_clazz_id
         <where>
             <if test="schoolId != null and schoolId != ''">
                 AND ts.school_id = #{schoolId}
@@ -29,7 +25,7 @@
                 AND ts.teach_clazz_id = #{teachClazzId}
             </if>
             <if test="studentInfo != null and studentInfo != ''">
-                AND (bs.student_name LIKE CONCAT('%',#{studentInfo},'%') OR bs.student_code LIKE CONCAT('%',#{studentInfo},'%'))
+                AND (bes.student_name LIKE CONCAT('%',#{studentInfo},'%') OR bes.student_code LIKE CONCAT('%',#{studentInfo},'%'))
             </if>
         </where>
         ORDER BY id

+ 4 - 1
distributed-print/install/mysql/upgrade/3.3.1.sql

@@ -546,7 +546,7 @@ CREATE TABLE IF NOT EXISTS `mark_document` (
     PRIMARY KEY (`id`) USING BTREE
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='归档文档表';
 
-
+-- 2024/03/07
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `enable`, `default_auth`, `front_display`) VALUES ('577', '文档管理', 'CourseDocumentManage', 'MENU', '561', '2', '1', '0', '1');
 UPDATE `sys_privilege` SET `sequence` = '1' WHERE (`id` = '487');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('578', '列表', 'List', 'LIST', '577', '1', 'AUTH', '583', '1', '0', '1');
@@ -560,3 +560,6 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('586', '文档上传', '/api/admin/mark/archive/document/import', 'URL', '577', '4', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('587', '文档删除', '/api/admin/mark/archive/document/delete', 'URL', '577', '5', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('588', '文档下载', '/api/admin/mark/archive/document/download', 'URL', '577', '6', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('786', '课程目标达成度模板配置查询', '/api/admin/set/course/degree/select', 'URL', '508', '15', 'AUTH', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('787', '课程目标达成度模板配置保存', '/api/admin/set/course/degree/save', 'URL', '508', '16', 'AUTH', '1', '0', '1');
+UPDATE `sys_privilege` SET `related` = '466,467,494,544,585,586,587,588' WHERE (`id` = '582');

+ 35 - 36
distributed-print/src/main/java/com/qmth/distributed/print/api/BasicCourseController.java

@@ -61,9 +61,8 @@ public class BasicCourseController {
 
     @ApiOperation(value = "模糊查询")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
-    public Result query(@RequestParam(value = "param", required = false) String param,
-                        @RequestParam(value = "printPlanId", required = false) List<String> printPlanId,
-                        @RequestParam(value = "teachingRoomId", required = false) Long teachingRoomId) {
+    public Result query(@RequestParam(value = "param", required = false) String param, @RequestParam(value = "printPlanId", required = false) List<String> printPlanId,
+            @RequestParam(value = "teachingRoomId", required = false) Long teachingRoomId) {
         if (Objects.isNull(printPlanId)) {
             printPlanId = new ArrayList<>();
         }
@@ -72,7 +71,6 @@ public class BasicCourseController {
         return ResultUtil.ok(userDtos);
     }
 
-
     @ApiOperation(value = "删除")
     @RequestMapping(value = "/remove", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.DELETE)
@@ -81,22 +79,21 @@ public class BasicCourseController {
         return ResultUtil.ok(isSuccess);
     }
 
-
     @ApiOperation(value = "课程管理-查询")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public Result findBasicCourseList(@ApiParam(value = "所属机构id") @RequestParam(required = false) String belongOrgId,
-                                      @ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName,
-                                      @ApiParam(value = "创建时间(起始位置)") @RequestParam(required = false) String startCreateTime,
-                                      @ApiParam(value = "创建时间(终止位置)") @RequestParam(required = false) String endCreateTime,
-                                      @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                      @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        return ResultUtil.ok(basicCourseService.basicCoursePage(SystemConstant.convertIdToLong(belongOrgId), courseName, SystemConstant.convertIdToLong(startCreateTime), SystemConstant.convertIdToLong(endCreateTime), pageNumber, pageSize));
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Result.class) })
+    public Result findBasicCourseList(@ApiParam(value = "所属机构id") @RequestParam(required = false) String belongOrgId, @ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName,
+            @ApiParam(value = "创建时间(起始位置)") @RequestParam(required = false) String startCreateTime, @ApiParam(value = "创建时间(终止位置)") @RequestParam(required = false) String endCreateTime,
+            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+            @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(basicCourseService.basicCoursePage(SystemConstant.convertIdToLong(belongOrgId), courseName,
+                SystemConstant.convertIdToLong(startCreateTime), SystemConstant.convertIdToLong(endCreateTime),
+                pageNumber, pageSize));
     }
 
     @ApiOperation(value = "课程管理-新增/编辑")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "更新成功", response = EditResult.class) })
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.EDIT)
     @Transactional
     public Result saveBasicCourse(@Valid @RequestBody BasicCourseParams basicCourseParams, BindingResult bindingResult) {
@@ -105,15 +102,15 @@ public class BasicCourseController {
         }
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Long l = basicCourseService.saveBasicCourse(basicCourseParams, sysUser);
-//        if (!CollectionUtils.isEmpty(basicCourseParams.getTeachIdSet())) {
-//            teachCourseService.updateByCourseIdAndTeacherList(basicCourseParams.getId(), basicCourseParams.getTeachIdSet());
-//        }
+        //        if (!CollectionUtils.isEmpty(basicCourseParams.getTeachIdSet())) {
+        //            teachCourseService.updateByCourseIdAndTeacherList(basicCourseParams.getId(), basicCourseParams.getTeachIdSet());
+        //        }
         return ResultUtil.ok(l);
     }
 
     @ApiOperation(value = "课程管理-批量删除")
     @RequestMapping(value = "/delete_batch", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "删除成功", response = EditResult.class) })
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.DELETE)
     public Result enableBasicCourse(@ApiParam(value = "选择的要删除的课程id集合", required = true) @RequestParam List<Long> idList) {
         return ResultUtil.ok(basicCourseService.removeBasicCourseBatch(idList));
@@ -121,26 +118,29 @@ public class BasicCourseController {
 
     @ApiOperation(value = "课程管理-根据查询条件批量删除")
     @RequestMapping(value = "/delete_by_query", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
-    @OperationLogDetail(detail = "根据查询条件[所属机构id[{{belongOrgId}}],课程名称(模糊查询)[{{courseName}}],创建时间(起始位置)[{{startCreateTime}}]," +
-            "创建时间(终止位置)[{{endCreateTime}}],状态[{{enable}}],启用&禁用操作[{{enableOperate}}]]批量启用/禁用课程", level = LevelEnum.TERTIARY, operationType = OperationTypeEnum.EDIT, customizedOperationType = CustomizedOperationTypeEnum.DELETE)
+    @ApiResponses({ @ApiResponse(code = 200, message = "删除成功", response = EditResult.class) })
+    @OperationLogDetail(detail =
+            "根据查询条件[所属机构id[{{belongOrgId}}],课程名称(模糊查询)[{{courseName}}],创建时间(起始位置)[{{startCreateTime}}],"
+                    + "创建时间(终止位置)[{{endCreateTime}}],状态[{{enable}}],启用&禁用操作[{{enableOperate}}]]批量启用/禁用课程", level = LevelEnum.TERTIARY, operationType = OperationTypeEnum.EDIT, customizedOperationType = CustomizedOperationTypeEnum.DELETE)
     public Result enableBasicCourseByQuery(@ApiParam(value = "所属机构id") @RequestParam(required = false) String belongOrgId,
-                                           @ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName,
-                                           @ApiParam(value = "创建时间(起始位置)") @RequestParam(required = false) String startCreateTime,
-                                           @ApiParam(value = "创建时间(终止位置)") @RequestParam(required = false) String endCreateTime) {
+            @ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName, @ApiParam(value = "创建时间(起始位置)") @RequestParam(required = false) String startCreateTime,
+            @ApiParam(value = "创建时间(终止位置)") @RequestParam(required = false) String endCreateTime) {
         // 禁用条件
         if (!SystemConstant.strNotNull(belongOrgId) && !SystemConstant.strNotNull(courseName) && !SystemConstant.strNotNull(startCreateTime) && !SystemConstant.strNotNull(endCreateTime)) {
             throw ExceptionResultEnum.ERROR.exception("请选择要禁用的条件");
         }
-        return ResultUtil.ok(basicCourseService.removeBasicCourseBatchByQuery(SystemConstant.convertIdToLong(belongOrgId), courseName, SystemConstant.convertIdToLong(startCreateTime), SystemConstant.convertIdToLong(endCreateTime)));
+        return ResultUtil.ok(
+                basicCourseService.removeBasicCourseBatchByQuery(SystemConstant.convertIdToLong(belongOrgId), courseName, SystemConstant.convertIdToLong(startCreateTime),
+                        SystemConstant.convertIdToLong(endCreateTime)));
     }
 
     @ApiOperation(value = "课程基本信息管理-批量导入")
     @RequestMapping(value = "/data_import", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "返回信息", response = EditResult.class) })
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.IMPORT)
     @Transactional
-    public Result basicCourseImportAsync(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws Exception {
+    public Result basicCourseImportAsync(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file)
+            throws Exception {
         List<BasicCourseParams> basicCourseParamsList = basicCourseService.executeImportBasicCourseLogic(file);
         if (!CollectionUtils.isEmpty(basicCourseParamsList)) {
             for (BasicCourseParams basicCourseParams : basicCourseParamsList) {
@@ -154,22 +154,21 @@ public class BasicCourseController {
 
     @ApiOperation(value = "课程管理-导出")
     @RequestMapping(value = "/export", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回信息")})
+    @ApiResponses({ @ApiResponse(code = 200, message = "返回信息") })
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.EXPORT)
-    public void export(@ApiParam(value = "所属机构id") @RequestParam(required = false) String belongOrgId,
-                       @ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName,
-                       @ApiParam(value = "创建时间(起始位置)") @RequestParam(required = false) String startCreateTime,
-                       @ApiParam(value = "创建时间(终止位置)") @RequestParam(required = false) String endCreateTime,
-                       HttpServletResponse response) throws Exception {
+    public void export(@ApiParam(value = "所属机构id") @RequestParam(required = false) String belongOrgId, @ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName,
+            @ApiParam(value = "创建时间(起始位置)") @RequestParam(required = false) String startCreateTime, @ApiParam(value = "创建时间(终止位置)") @RequestParam(required = false) String endCreateTime,
+            HttpServletResponse response) throws Exception {
         basicCourseService.exportData(response, SystemConstant.convertIdToLong(belongOrgId), courseName, SystemConstant.convertIdToLong(startCreateTime), SystemConstant.convertIdToLong(endCreateTime));
     }
 
     @ApiOperation(value = "课程管理-查询")
     @RequestMapping(value = "/list_by_org", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public Result findBasicCourseListByOrg(@ApiParam(value = "所属机构id", required = true) @RequestParam String belongOrgId) {
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Result.class) })
+    public Result findBasicCourseListByOrg(@ApiParam(value = "考试id", required = true) @RequestParam String examId,
+            @ApiParam(value = "所属机构id", required = true) @RequestParam String belongOrgId) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(basicCourseService.listByOrgId(SystemConstant.convertIdToLong(belongOrgId), sysUser.getSchoolId()));
+        return ResultUtil.ok(basicCourseService.listByOrgId(SystemConstant.convertIdToLong(belongOrgId), SystemConstant.convertIdToLong(examId), sysUser));
     }
 }
 

+ 29 - 32
distributed-print/src/main/java/com/qmth/distributed/print/api/ConditionController.java

@@ -1,10 +1,8 @@
 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.result.PrintPlanBrief;
 import com.qmth.distributed.print.business.service.ConditionService;
-import com.qmth.teachcloud.common.bean.result.BasicCollegeResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.ExamCategoryEnum;
@@ -28,6 +26,7 @@ import java.util.Map;
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_BASIC + "/condition")
 public class ConditionController {
+
     @Resource
     private ConditionService conditionService;
 
@@ -36,86 +35,84 @@ public class ConditionController {
 
     @ApiOperation(value = "学期")
     @RequestMapping(value = "/list_semester", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = BasicSemester.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = BasicSemester.class) })
     public Result listSemester(@ApiParam(value = "启用/禁用") @RequestParam(required = false, defaultValue = "true") Boolean enable) {
         return ResultUtil.ok(conditionService.listSemester(enable));
     }
 
     @ApiOperation(value = "考试")
     @RequestMapping(value = "/list_exam", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = BasicExam.class)})
-    public Result listExam(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId,
-                           @ApiParam(value = "考试类型") @RequestParam(required = false) ExamCategoryEnum category,
-                           @ApiParam(value = "启用/禁用") @RequestParam(required = false, defaultValue = "true") Boolean enable) {
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = BasicExam.class) })
+    public Result listExam(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId, @ApiParam(value = "考试类型") @RequestParam(required = false) ExamCategoryEnum category,
+            @ApiParam(value = "启用/禁用") @RequestParam(required = false, defaultValue = "true") Boolean enable) {
         return ResultUtil.ok(conditionService.listExam(semesterId, category, enable));
     }
 
     @ApiOperation(value = "课程")
     @RequestMapping(value = "/list_course", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = BasicCourse.class)})
-    public Result listCourse(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId,
-                             @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
-                             @ApiParam(value = "启用/禁用") @RequestParam(required = false) Boolean enable,
-                             @RequestParam(value = "printPlanId", required = false) List<String> printPlanId) {
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = BasicCourse.class) })
+    public Result listCourse(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId, @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
+            @ApiParam(value = "启用/禁用") @RequestParam(required = false) Boolean enable, @RequestParam(value = "printPlanId", required = false) List<String> printPlanId) {
         return ResultUtil.ok(conditionService.listCourse(semesterId, examId, enable, printPlanId));
     }
 
     @ApiOperation(value = "试卷编号")
     @RequestMapping(value = "/list_paper_number", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = String.class)})
-    public Result listPaperNumber(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId,
-                                  @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
-                                  @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode,
-                                  @RequestParam(value = "printPlanId", required = false) List<String> printPlanId) {
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = String.class) })
+    public Result listPaperNumber(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId, @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
+            @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode, @RequestParam(value = "printPlanId", required = false) List<String> printPlanId) {
         return ResultUtil.ok(conditionService.listPaperNumber(semesterId, examId, courseCode, printPlanId));
     }
 
     @ApiOperation(value = "印刷计划")
     @RequestMapping(value = "/list_print_plan", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = PrintPlanBrief.class)})
-    public Result listPrintPlan(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId,
-                                @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
-                                @ApiParam(value = "source") @RequestParam(required = false) String source) {
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = PrintPlanBrief.class) })
+    public Result listPrintPlan(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId, @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
+            @ApiParam(value = "source") @RequestParam(required = false) String source) {
         return ResultUtil.ok(conditionService.listPrintPlan(semesterId, examId, source));
     }
 
     @ApiOperation(value = "班级")
     @RequestMapping(value = "/list_clazz", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = BasicClazz.class)})
-    public Result listClazz(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId,
-                            @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
-                            @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode,
-                            @ApiParam(value = "班级名称") @RequestParam(required = false) String clazzName) {
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = BasicClazz.class) })
+    public Result listClazz(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId, @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
+            @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode, @ApiParam(value = "班级名称") @RequestParam(required = false) String clazzName) {
         return ResultUtil.ok(conditionService.listClazz(semesterId, examId, courseCode, clazzName));
     }
 
     @ApiOperation(value = "学院")
     @RequestMapping(value = "/list_college", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = SysOrg.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = SysOrg.class) })
     public Result listCollege() {
         return ResultUtil.ok(conditionService.listCollege());
     }
 
     @ApiOperation(value = "扫描-获取学期、考试列表")
     @RequestMapping(value = "/scan/semester/list", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Map.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Map.class) })
     public Result scanSemesterList(@ApiParam(value = "启用/禁用") @RequestParam(required = false, defaultValue = "true") Boolean enable) {
         return ResultUtil.ok(scanConditionService.scanSemesterList(enable));
     }
 
     @ApiOperation(value = "扫描-获取课程、试卷编号列表")
     @RequestMapping(value = "/scan/course/list", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Map.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Map.class) })
     public Result scanCourseList(@ApiParam(value = "考试ID", required = true) @RequestParam(value = "examId") Long examId) {
         return ResultUtil.ok(scanConditionService.scanCourseList(examId));
     }
 
     @ApiOperation(value = "扫描-获取校区、考场")
     @RequestMapping(value = "/scan/campus/list", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Map.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Map.class) })
     public Result scanCampusList(@ApiParam(value = "考试ID", required = true) @RequestParam(value = "examId") Long examId,
-                                 @ApiParam(value = "课程代码") @RequestParam(value = "courseCode", required = false) String courseCode,
-                                 @ApiParam(value = "试卷编号") @RequestParam(value = "coursePaperId", required = false) String coursePaperId) {
+            @ApiParam(value = "课程代码") @RequestParam(value = "courseCode", required = false) String courseCode, @ApiParam(value = "试卷编号") @RequestParam(value = "coursePaperId", required = false) String coursePaperId) {
         return ResultUtil.ok(scanConditionService.scanCampusList(examId, courseCode, coursePaperId));
     }
+
+    @ApiOperation(value = "教学班字典")
+    @RequestMapping(value = "/list_basic_teach_clazz", method = RequestMethod.POST)
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Map.class) })
+    public Result listBasicTeachClazz(@ApiParam(value = "考试ID", required = true) @RequestParam(value = "examId") String examId) {
+        return ResultUtil.ok(conditionService.listBasicTeachClazz(SystemConstant.convertIdToLong(examId)));
+    }
 }

+ 7 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/CourseEvaluationController.java

@@ -4,6 +4,7 @@ package com.qmth.distributed.print.api;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.params.CourseEvaluationParam;
 import com.qmth.distributed.print.business.bean.result.CourseEvaluationResult;
+import com.qmth.distributed.print.business.enums.CourseEvaluationTypeEnum;
 import com.qmth.distributed.print.business.service.CourseEvaluationService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.util.Objects;
 
 /**
  * <p>
@@ -55,7 +57,11 @@ public class CourseEvaluationController {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        courseEvaluationService.saveCourseEvaluation(courseEvaluationParam, sysUser);
+        if (Objects.nonNull(courseEvaluationParam)){
+            // 设置为自定义评价方式
+            courseEvaluationParam.setType(CourseEvaluationTypeEnum.CUSTOM);
+        }
+        courseEvaluationService.saveCourseEvaluation(courseEvaluationParam, sysUser.getId());
         return ResultUtil.ok();
     }
 

+ 24 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskApplyController.java

@@ -1,8 +1,8 @@
 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.dto.ExamTaskDetailCardDto;
+import com.qmth.distributed.print.business.bean.params.ApproveFormParams;
 import com.qmth.distributed.print.business.bean.params.ExamTaskApplyParam;
 import com.qmth.distributed.print.business.entity.ExamTask;
 import com.qmth.distributed.print.business.entity.ExamTaskApplyTemp;
@@ -23,11 +23,14 @@ import io.swagger.annotations.*;
 import org.activiti.engine.TaskService;
 import org.activiti.engine.task.Task;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.BindingResult;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import java.io.IOException;
@@ -283,5 +286,25 @@ public class ExamTaskApplyController {
                                    @ApiParam(value = "唯一标识") @RequestParam(value = "uuid", required = false) String uuid) {
         return ResultUtil.ok(examTaskService.getTikuPaperData(examId, paperId, uuid));
     }
+
+    @ApiOperation(value = "入库申请-下载审批表-获取试卷审批表数据")
+    @RequestMapping(value = "/find_approve_form_json", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findApproveFormJson(@ApiParam(value = "命题任务id") @RequestParam(required = false) String examTaskId,
+                                      @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId,
+                                      @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber) {
+        return ResultUtil.ok(examTaskService.findExamTaskApprovalForm(SystemConstant.convertIdToLong(examTaskId), examId, paperNumber));
+    }
+
+    @ApiOperation(value = "入库申请-下载审批表-下载审批表PDF")
+    @RequestMapping(value = "/find_approve_form_pdf", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "下载成功", response = Result.class)})
+    public void findApproveFormPdf(@Valid @RequestBody ApproveFormParams approveFormParams, BindingResult bindingResult) throws Exception {
+        if (bindingResult.hasErrors()) {
+            throw ExceptionResultEnum.ERROR.exception(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        HttpServletResponse response = ServletUtil.getResponse();
+        examTaskService.findExamTaskApprovalPdf(response, approveFormParams.getExamTaskId(), approveFormParams.getHtmlContent());
+    }
 }
 

+ 0 - 18
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskAuditController.java

@@ -251,23 +251,5 @@ public class ExamTaskAuditController {
         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 = "/find_approve_form_json", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public Result findApproveFormJson(@ApiParam(value = "命题任务id", required = true) @RequestParam String examTaskId) {
-        return ResultUtil.ok((Object) examTaskService.findExamTaskApprovalForm(SystemConstant.convertIdToLong(examTaskId)));
-    }
-
-    @ApiOperation(value = "命题任务-审批-获取试卷审批表pdf")
-    @RequestMapping(value = "/find_approve_form_pdf", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public void findApproveFormPdf(@Valid @RequestBody ApproveFormParams approveFormParams, BindingResult bindingResult) throws Exception {
-        if (bindingResult.hasErrors()) {
-            throw ExceptionResultEnum.ERROR.exception(bindingResult.getAllErrors().get(0).getDefaultMessage());
-        }
-        HttpServletResponse response = ServletUtil.getResponse();
-        examTaskService.findExamTaskApprovalPdf(response, approveFormParams.getExamTaskId(), approveFormParams.getHtmlContent());
-    }
 }
 

+ 34 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/SysAdminSetController.java

@@ -73,6 +73,8 @@ public class SysAdminSetController {
 
     @Resource
     TSchoolRoleService tSchoolRoleService;
+    @Resource
+    private FileUploadService fileUploadService;
 
     @ApiOperation(value = "数据还原")
     @ApiResponses({@ApiResponse(code = 200, message = "数据还原信息", response = ResultUtil.class)})
@@ -413,4 +415,36 @@ public class SysAdminSetController {
         sysAdminSetResult.setRoleIdList(CollectionUtils.isEmpty(roleIdList) ? new ArrayList<>() : roleIdList);
         return ResultUtil.ok(sysAdminSetResult);
     }
+
+    @ApiOperation(value = "课程目标达成度模板配置查询")
+    @ApiResponses({@ApiResponse(code = 200, message = "课程目标达成度模板配置查询", response = CustomPrivilegeResult.class)})
+    @RequestMapping(value = "/course/degree/select", method = RequestMethod.POST)
+    public Result sysadminCourseDegreeSelect(@ApiParam(value = "学校id ", required = true) @RequestParam Long schoolId) {
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.SCHOOL_COURSE_DEGREE_TEMPLATE);
+        SysConfigResult sysConfigResult = new SysConfigResult();
+        if (sysConfig != null) {
+            sysConfigResult = new SysConfigResult(sysConfig);
+            sysConfigResult.setValue(fileUploadService.filePreview((Long) sysConfigResult.getValue()));
+        }
+        return ResultUtil.ok(sysConfigResult);
+    }
+
+    @ApiOperation(value = "课程目标达成度模板配置保存")
+    @ApiResponses({@ApiResponse(code = 200, message = "课程目标达成度模板配置保存", response = CustomPrivilegeResult.class)})
+    @RequestMapping(value = "/course/degree/save", method = RequestMethod.POST)
+    public Result sysadminCourseDegreeSave(@ApiParam(value = "学校ID", required = true) @RequestParam Long schoolId,
+                                           @ApiParam(value = "附件ID", required = true) @RequestParam Long attachmentId) {
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.SCHOOL_COURSE_DEGREE_TEMPLATE);
+        if (sysConfig == null) {
+            sysConfig = new SysConfig(schoolId, SystemConstant.SCHOOL_COURSE_DEGREE_TEMPLATE, "课程目标达成度模板配置", String.valueOf(attachmentId));
+        } else {
+            sysConfig.setConfigValue(String.valueOf(attachmentId));
+        }
+        if (sysConfigService.saveOrUpdate(sysConfig)) {
+            commonCacheService.updateSysConfigCache(schoolId, SystemConstant.CLOUD_MARK_EXAM_SUBJECT_HEADER_SAVE_API);
+        }
+        SysConfigResult sysConfigResult = new SysConfigResult(sysConfig);
+        sysConfigResult.setValue(fileUploadService.filePreview((Long) sysConfigResult.getValue()));
+        return ResultUtil.ok(sysConfigResult);
+    }
 }

+ 21 - 61
distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java

@@ -1,6 +1,5 @@
 package com.qmth.distributed.print.api;
 
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.constant.ApiConstant;
@@ -8,14 +7,12 @@ import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.params.LoginParam;
 import com.qmth.distributed.print.business.bean.result.DictionaryResult;
 import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.entity.BasicExamStudent;
+import com.qmth.distributed.print.business.entity.BasicTeachClazz;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
-import com.qmth.distributed.print.business.entity.TeachClazz;
 import com.qmth.distributed.print.business.enums.DictionaryEnum;
 import com.qmth.distributed.print.business.enums.LoginTypeEnum;
-import com.qmth.distributed.print.business.service.ConditionService;
-import com.qmth.distributed.print.business.service.PrintCommonService;
-import com.qmth.distributed.print.business.service.TBSyncTaskService;
-import com.qmth.distributed.print.business.service.TeachClazzService;
+import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.util.PdfUtil;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.bean.auth.AuthBean;
@@ -117,6 +114,12 @@ public class SysController {
     @Resource
     ConditionService conditionService;
 
+    @Resource
+    BasicTeachClazzService basicTeachClazzService;
+
+    @Resource
+    BasicExamStudentService basicExamStudentService;
+
     /**
      * 登录
      *
@@ -658,6 +661,7 @@ public class SysController {
                                      @ApiParam(value = "专业id") @RequestParam(required = false) String majorId,
                                      @ApiParam(value = "班级id") @RequestParam(required = false) String clazzId,
                                      @ApiParam(value = "学生id") @RequestParam(required = false) String studentId,
+                                     @ApiParam(value = "考试id") @RequestParam(required = false) String examId,
                                      @ApiParam(value = "查询字典对象", required = true) @RequestParam DictionaryEnum dictionaryEnum) {
         Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
         List<DictionaryResult> dictionaryResultList = new ArrayList<>();
@@ -754,74 +758,30 @@ public class SysController {
                 }).collect(Collectors.toList());
                 break;
             case CLAZZ:
-                QueryWrapper<BasicClazz> clazzQueryWrapper = new QueryWrapper<>();
-                clazzQueryWrapper.lambda().eq(BasicClazz::getSchoolId, schoolId).eq(BasicClazz::getEnable, true);
-                if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(majorId))) {
-                    clazzQueryWrapper.lambda().eq(BasicClazz::getMajorId, majorId);
-                }
-                // 基础班
-                List<BasicClazz> basicClazzList = basicClazzService.list(clazzQueryWrapper);
-                List<DictionaryResult> resultBasicClazzList = basicClazzList.stream().map(e -> {
+                QueryWrapper<BasicTeachClazz> clazzQueryWrapper = new QueryWrapper<>();
+                clazzQueryWrapper.lambda().eq(BasicTeachClazz::getSchoolId, schoolId).eq(BasicTeachClazz::getExamId, examId);
+                List<BasicTeachClazz> basicTeachClazzList = basicTeachClazzService.list(clazzQueryWrapper);
+                List<DictionaryResult> resultBasicClazzList = basicTeachClazzList.stream().map(e -> {
                     DictionaryResult dictionaryResult = new DictionaryResult();
                     dictionaryResult.setId(e.getId());
-                    dictionaryResult.setCode(e.getClazzCode());
                     dictionaryResult.setName(e.getClazzName());
                     return dictionaryResult;
                 }).collect(Collectors.toList());
-
                 dictionaryResultList.addAll(resultBasicClazzList);
                 break;
             case ALL_CLAZZ: //针对归档管理临时处理用
-                QueryWrapper<BasicClazz> basicClazzQueryWrapper = new QueryWrapper<>();
-                basicClazzQueryWrapper.lambda().eq(BasicClazz::getSchoolId, schoolId).eq(BasicClazz::getEnable, true);
-                if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(majorId))) {
-                    basicClazzQueryWrapper.lambda().eq(BasicClazz::getMajorId, majorId);
-                }
-                // 基础班
-                List<BasicClazz> bClazzList = basicClazzService.list(basicClazzQueryWrapper);
-                List<DictionaryResult> rbClazzList = bClazzList.stream().map(e -> {
-                    DictionaryResult dictionaryResult = new DictionaryResult();
-                    dictionaryResult.setId(e.getId());
-                    dictionaryResult.setCode(e.getClazzCode());
-                    dictionaryResult.setName(e.getClazzName());
-                    return dictionaryResult;
-                }).collect(Collectors.toList());
-
-                dictionaryResultList.addAll(rbClazzList);
-
-                // 教学班
-                QueryWrapper<TeachClazz> teachClazzQueryWrapper = new QueryWrapper<>();
-                teachClazzQueryWrapper.lambda().in(TeachClazz::getSchoolId, schoolId);
-                List<TeachClazz> teachClazzList = teachClazzService.list(teachClazzQueryWrapper);
-                List<DictionaryResult> resultTeachClazzList = teachClazzList.stream().map(e -> {
-                    DictionaryResult dictionaryResult = new DictionaryResult();
-                    dictionaryResult.setId(e.getId());
-                    dictionaryResult.setCode(e.getTeachClazzCode());
-                    dictionaryResult.setName(e.getTeachClazzName());
-                    return dictionaryResult;
-                }).collect(Collectors.toList());
-
-                if (resultTeachClazzList.size() > 0) {
-                    dictionaryResultList.addAll(resultTeachClazzList);
-                }
-                break;
+                throw ExceptionResultEnum.ERROR.exception("使用枚举[CLAZZ]");
             case STUDENT:
-                QueryWrapper<BasicStudent> studentQueryWrapper = new QueryWrapper<>();
-                studentQueryWrapper.lambda().eq(BasicStudent::getSchoolId, schoolId).eq(BasicStudent::getEnable, true);
-                if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(collegeId))) {
-                    studentQueryWrapper.lambda().eq(BasicStudent::getBelongOrgId, collegeId);
-                }
-                if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(majorId))) {
-                    studentQueryWrapper.lambda().eq(BasicStudent::getMajorId, majorId);
-                }
+                QueryWrapper<BasicExamStudent> studentQueryWrapper = new QueryWrapper<>();
+                studentQueryWrapper.lambda().eq(BasicExamStudent::getSchoolId, schoolId);
                 if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(clazzId))) {
-                    studentQueryWrapper.lambda().eq(BasicStudent::getClazzId, clazzId);
+                    studentQueryWrapper.lambda().eq(BasicExamStudent::getClazzId, clazzId);
                 }
                 if (SystemConstant.longNotNull(SystemConstant.convertIdToLong(studentId))) {
-                    studentQueryWrapper.lambda().eq(BasicStudent::getId, studentId);
+                    studentQueryWrapper.lambda().eq(BasicExamStudent::getId, studentId);
                 }
-                List<BasicStudent> basicStudentList = basicStudentService.list(studentQueryWrapper);
-                dictionaryResultList = basicStudentList.stream().map(e -> {
+                List<BasicExamStudent> basicExamStudentList = basicExamStudentService.list(studentQueryWrapper);
+                dictionaryResultList = basicExamStudentList.stream().map(e -> {
                     DictionaryResult dictionaryResult = new DictionaryResult();
                     dictionaryResult.setId(e.getId());
                     dictionaryResult.setCode(e.getStudentCode());

+ 8 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/TeachClazzController.java

@@ -39,23 +39,26 @@ public class TeachClazzController {
     @ApiOperation(value = "教学班级-查询")
     @RequestMapping(value = "/page", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public Result findTeachClazzPage(@ApiParam(value = "基础课程id") @RequestParam(required = false) String basicCourseId,
+    public Result findTeachClazzPage(@ApiParam(value = "考试id") @RequestParam(required = false) String examId,
+                                     @ApiParam(value = "课程编号") @RequestParam(required = false) String courseCode,
                                      @ApiParam(value = "班级名称(模糊查询)") @RequestParam(required = false) String teachClazzName,
                                      @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                                      @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        return ResultUtil.ok(teachClazzService.teachClazzPage(SystemConstant.convertIdToLong(basicCourseId), teachClazzName, pageNumber, pageSize));
+        return ResultUtil.ok(teachClazzService.teachClazzPage(SystemConstant.convertIdToLong(examId),courseCode, teachClazzName, pageNumber, pageSize));
     }
 
-    @ApiOperation(value = "教学班级-编辑教学班级")
+    @ApiOperation(value = "教学班级-选择教学班")
     @RequestMapping(value = "/edit", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "创建成功", response = EditResult.class)})
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.EDIT)
-    public Result createTeachClazz(@Valid @RequestBody TeachClazzParams teachClazzParams, BindingResult bindingResult) {
+    @Deprecated
+    public Result selectTeachClazz(@Valid @RequestBody TeachClazzParams teachClazzParams, BindingResult bindingResult) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        return ResultUtil.ok(teachClazzService.editTeachClazz(teachClazzParams, requestUser));
+        teachClazzService.selectTeachClazz(teachClazzParams, requestUser);
+        return ResultUtil.ok();
     }
 
     @ApiOperation(value = "教学班级-批量删除")

+ 25 - 12
distributed-print/src/main/java/com/qmth/distributed/print/api/TeachCourseController.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.api;
 
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.params.TeachCourseParams;
+import com.qmth.distributed.print.business.bean.params.TeachCourseSelectParam;
 import com.qmth.distributed.print.business.bean.params.TeacherTeamParam;
 import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.service.TeachCourseService;
@@ -27,6 +28,7 @@ import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import java.io.IOException;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 教学课程 前端控制器
@@ -46,18 +48,21 @@ public class TeachCourseController {
     @ApiOperation(value = "教学课程-查询")
     @RequestMapping(value = "/page", method = RequestMethod.POST)
     @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Result.class) })
-    //    @OperationLogDetail(detail = "根据查询条件课程名称[{{courseName}}]模糊查询教学课程,查询第[{{pageNumber}}]页,每页查[{{pageSize}}]个", operationType = OperationTypeEnum.SELECT, operationUnit = OperationUnitEnum.TEACH_COURSE,customizedOperationType = CustomizedOperationTypeEnum.SEARCH)
-    public Result findTeachCoursePage(@ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName,
+    public Result findTeachCoursePage(@ApiParam(value = "考试id") @RequestParam(required = false) String examId,
+            @ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName,
             @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
             @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(teachCourseService.teachCoursePage(courseName, pageNumber, pageSize, requestUser.getId()));
+        return ResultUtil.ok(
+                teachCourseService.teachCoursePage(SystemConstant.convertIdToLong(examId), courseName, pageNumber,
+                        pageSize, requestUser.getId()));
     }
 
     @ApiOperation(value = "教学课程-手动添加课程")
     @RequestMapping(value = "/manual_create", method = RequestMethod.POST)
     @ApiResponses({ @ApiResponse(code = 200, message = "创建成功", response = EditResult.class) })
     @OperationLogDetail(detail = "手动添加教学课程,参数[{{teachCourseParams}}]", customizedOperationType = CustomizedOperationTypeEnum.ADD)
+    @Deprecated
     public Result manualCreate(@Valid @RequestBody TeachCourseParams teachCourseParams, BindingResult bindingResult) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (bindingResult.hasErrors()) {
@@ -69,10 +74,13 @@ public class TeachCourseController {
     @ApiOperation(value = "教学课程-课程表选择教学课程")
     @RequestMapping(value = "/select_create", method = RequestMethod.POST)
     @ApiResponses({ @ApiResponse(code = 200, message = "创建成功", response = EditResult.class) })
-    @OperationLogDetail(detail = "从课程表选择并创建教学课程,参数[{{basicCourseIdList}}]", customizedOperationType = CustomizedOperationTypeEnum.ADD)
-    public Result selectCreate(@ApiParam(value = "基础课程id", required = true) @RequestParam List<Long> basicCourseIdList) {
+    @OperationLogDetail(detail = "从课程表选择并创建教学课程,参数[{{teachCourseSelectParam}}]", customizedOperationType = CustomizedOperationTypeEnum.ADD)
+    public Result selectCreate(@Valid @RequestBody TeachCourseSelectParam teachCourseSelectParam, BindingResult bindingResult) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        teachCourseService.selectCreate(basicCourseIdList, requestUser);
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        teachCourseService.selectCreate(teachCourseSelectParam, requestUser);
         return ResultUtil.ok();
     }
 
@@ -80,6 +88,7 @@ public class TeachCourseController {
     @RequestMapping(value = "/import", method = RequestMethod.POST)
     @ApiResponses({ @ApiResponse(code = 200, message = "创建成功", response = EditResult.class) })
     @OperationLogDetail(detail = "教学课程批量导入", customizedOperationType = CustomizedOperationTypeEnum.ADD)
+    @Deprecated
     public Result importTeachCourse(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws IOException, NoSuchFieldException {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         teachCourseService.importTeachCourse(file, requestUser);
@@ -119,10 +128,12 @@ public class TeachCourseController {
     @ApiOperation(value = "教师团队-用户表选择教师")
     @RequestMapping(value = "/select_create_teacher", method = RequestMethod.POST)
     @ApiResponses({ @ApiResponse(code = 200, message = "创建成功", response = EditResult.class) })
-    @OperationLogDetail(detail = "从教师库选择并加入教师团队,参数[{{basicCourseIdList}}]", customizedOperationType = CustomizedOperationTypeEnum.ADD)
-    public Result selectCreate(@ApiParam(value = "基础课程id", required = true) @RequestParam Long basicCourseId, @ApiParam(value = "教师id集合", required = true) @RequestParam List<Long> userIdList) {
+    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.ADD)
+    public Result selectCreate(@ApiParam(value = "考试id", required = true) @RequestParam String examId, @ApiParam(value = "课程编号", required = true) @RequestParam String courseCode,
+            @ApiParam(value = "教师id集合", required = true) @RequestParam List<String> userIdList) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        teachCourseService.selectCreateTeacher(basicCourseId, userIdList, requestUser);
+        teachCourseService.selectCreateTeacher(SystemConstant.convertIdToLong(examId), courseCode,
+                userIdList.stream().map(SystemConstant::convertIdToLong).collect(Collectors.toList()), requestUser);
         return ResultUtil.ok();
     }
 
@@ -130,6 +141,7 @@ public class TeachCourseController {
     @RequestMapping(value = "/import_teacher", method = RequestMethod.POST)
     @ApiResponses({ @ApiResponse(code = 200, message = "创建成功", response = EditResult.class) })
     @OperationLogDetail(detail = "教学课程批量导入", customizedOperationType = CustomizedOperationTypeEnum.ADD)
+    @Deprecated
     public Result importTeacherTeam(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file, @ApiParam(value = "基础课程", required = true) @RequestParam Long basicCourseId)
             throws IOException, NoSuchFieldException, IllegalAccessException {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
@@ -140,12 +152,13 @@ public class TeachCourseController {
     @ApiOperation(value = "教师团队-分页查询")
     @RequestMapping(value = "/teacher_team_page", method = RequestMethod.POST)
     @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Result.class) })
-    //    @OperationLogDetail(detail = "根据查询条件课程名称[{{courseName}}]模糊查询教学课程,查询第[{{pageNumber}}]页,每页查[{{pageSize}}]个", operationType = OperationTypeEnum.SELECT, operationUnit = OperationUnitEnum.TEACH_COURSE,customizedOperationType = CustomizedOperationTypeEnum.SEARCH)
-    public Result findTeachTeamPage(@ApiParam(value = "用户姓名工号(模糊查询)") @RequestParam(required = false) String userInfo, @ApiParam(value = "基础课程id", required = true) @RequestParam String basicCourseId,
+    public Result findTeachTeamPage(@ApiParam(value = "考试id", required = true) @RequestParam String examId,
+            @ApiParam(value = "课程编号", required = true) @RequestParam String courseCode,
+            @ApiParam(value = "用户姓名工号(模糊查询)") @RequestParam(required = false) String userInfo,
             @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
             @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
         return ResultUtil.ok(
-                teachCourseService.findTeacherTeamPage(userInfo, SystemConstant.convertIdToLong(basicCourseId),
+                teachCourseService.findTeacherTeamPage(SystemConstant.convertIdToLong(examId), courseCode, userInfo,
                         pageNumber, pageSize));
     }
 

+ 24 - 25
distributed-print/src/main/java/com/qmth/distributed/print/api/TeachStudentController.java

@@ -8,7 +8,6 @@ import com.qmth.distributed.print.business.service.TeachStudentService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
@@ -25,7 +24,6 @@ import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import java.io.IOException;
 import java.util.List;
-import java.util.Set;
 
 /**
  * @Description: 教学学生 前端控制器
@@ -38,67 +36,68 @@ import java.util.Set;
 @Validated
 //@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class TeachStudentController {
+
     @Resource
     private TeachStudentService teachStudentService;
 
     @ApiOperation(value = "教学学生-查询")
     @RequestMapping(value = "/page", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public Result findTeachStudentPage(@ApiParam(value = "教学班级id", required = true) @RequestParam String teachClazzId,
-                                       @ApiParam(value = "学生信息(学号、姓名)") @RequestParam(required = false) String studentInfo,
-                                       @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                       @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        return ResultUtil.ok(teachStudentService.teachStudentPage(SystemConstant.convertIdToLong(teachClazzId), studentInfo, pageNumber, pageSize));
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Result.class) })
+    public Result findTeachStudentPage(@ApiParam(value = "教学班级id", required = true) @RequestParam String teachClazzId, @ApiParam(value = "学生信息(学号、姓名)") @RequestParam(required = false) String studentInfo,
+            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+            @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(
+                teachStudentService.teachStudentPage(SystemConstant.convertIdToLong(teachClazzId), studentInfo,
+                        pageNumber, pageSize));
     }
 
     @ApiOperation(value = "教学学生-创建教学学生")
     @RequestMapping(value = "/create", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "创建成功", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "创建成功", response = EditResult.class) })
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.ADD)
+    @Deprecated
     public Result createTeachStudent(@Valid @RequestBody TeachStudentParams teachStudentParams, BindingResult bindingResult) throws IllegalAccessException {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         SystemConstant.verifyDBFields(teachStudentParams, teachStudentParams.getClass());
-        return ResultUtil.ok(teachStudentService.createTeachStudent(teachStudentParams.getStudentName(), teachStudentParams.getStudentCode(), teachStudentParams.getTeachClazzId(), requestUser));
+        return ResultUtil.ok(teachStudentService.createTeachStudent(teachStudentParams.getStudentName(),
+                teachStudentParams.getStudentCode(), teachStudentParams.getTeachClazzId(), requestUser));
     }
 
     @ApiOperation(value = "教学学生-从课程班级批量添加学生")
     @RequestMapping(value = "/create_batch", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "创建成功", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "创建成功", response = EditResult.class) })
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.ADD)
-    public Result createTeachStudentBatchByDictionary(@Valid @RequestBody TeachStudentBatchParam teachStudentBatchParam, BindingResult bindingResult) {
+    public Result createTeachStudentBatchByDictionary(@Valid @RequestBody TeachStudentBatchParam teachStudentBatchParam,
+            BindingResult bindingResult) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        Set<Long> basicStudentIdSet = teachStudentBatchParam.getBasicStudentIdSet();
-        if (basicStudentIdSet == null || basicStudentIdSet.size() == 0) {
-            throw ExceptionResultEnum.ERROR.exception("请选择要删除的对象");
-        }
-        Long teachClazzId = teachStudentBatchParam.getTeachClazzId();
-        Long schoolId = SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId()));
-        teachStudentService.createTeachStudentBatch(basicStudentIdSet, teachClazzId, schoolId, requestUser);
+        teachStudentService.createTeachStudentBatch(teachStudentBatchParam, requestUser);
         return ResultUtil.ok();
     }
 
-
     @ApiOperation(value = "教学学生-批量导入")
     @RequestMapping(value = "/import", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "返回信息", response = EditResult.class) })
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.IMPORT)
-    public Result teachStudentImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
-                                     @ApiParam(value = "教学班级id", required = true) @RequestParam String teachClazzId) throws IOException, NoSuchFieldException {
+    @Deprecated
+    public Result teachStudentImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file, @ApiParam(value = "教学班级id", required = true) @RequestParam String teachClazzId)
+            throws IOException, NoSuchFieldException {
 
         Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok((Object) teachStudentService.importTeachStudent(file, SystemConstant.convertIdToLong(teachClazzId), schoolId, requestUser));
+        return ResultUtil.ok(
+                (Object) teachStudentService.importTeachStudent(file, SystemConstant.convertIdToLong(teachClazzId),
+                        schoolId, requestUser));
     }
 
     @ApiOperation(value = "教学学生-批量删除")
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "删除成功", response = EditResult.class) })
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.DELETE)
     public Result deleteTeachStudent(@ApiParam(value = "选择的要删除的学生id集合", required = true) @RequestParam List<Long> idList) {
         return ResultUtil.ok(teachStudentService.deleteTeachStudentBatch(idList));

+ 2 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkClassController.java

@@ -41,8 +41,8 @@ public class MarkClassController extends BaseController {
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     public Result list(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                        @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
-        List<MarkUserClassDto> markUserClassDtoList = markUserClassService.listMarkUserClassByExamIdAndPaperNumber(examId, paperNumber);
-        return ResultUtil.ok(markUserClassDtoList);
+        MarkUserClassDto markUserClassDto = markUserClassService.listMarkUserClassByExamIdAndPaperNumber(examId, paperNumber);
+        return ResultUtil.ok(markUserClassDto);
     }
 
     /**

+ 40 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkDocumentController.java

@@ -1,6 +1,7 @@
 package com.qmth.distributed.print.api.mark;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -12,12 +13,19 @@ import org.springframework.web.multipart.MultipartFile;
 
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.mark.bean.archivescore.ArchiveStudentQuery;
 import com.qmth.teachcloud.mark.bean.document.ArchivePaperQuery;
 import com.qmth.teachcloud.mark.bean.document.MarkDocumantQuery;
+import com.qmth.teachcloud.mark.entity.MarkDocument;
+import com.qmth.teachcloud.mark.entity.MarkPaper;
+import com.qmth.teachcloud.mark.enums.DocumentType;
 import com.qmth.teachcloud.mark.service.MarkDocumentService;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
+import com.qmth.teachcloud.mark.service.MarkStudentService;
+import com.qmth.teachcloud.mark.service.ScanPackageService;
 
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -37,6 +45,10 @@ public class MarkDocumentController {
     private MarkPaperService markPaperService;
     @Resource
     private MarkDocumentService markDocumentService;
+    @Resource
+    private MarkStudentService markStudentService;
+    @Resource
+    private ScanPackageService scanPackageService;
 
     @ApiOperation(value = "文档管理列表")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
@@ -55,7 +67,7 @@ public class MarkDocumentController {
     public Result importFile(@ApiParam(value = "文档ID", required = true) Long id,
                            @ApiParam(value = "文件md5", required = true) String md5,
                            @ApiParam(value = "文件", required = true) @RequestParam MultipartFile file) {
-        return ResultUtil.ok(markDocumentService.importById(id, file, md5),"");
+        return ResultUtil.ok(markDocumentService.importById(id, file, md5));
     }
 
     @ApiOperation(value = "文档新建")
@@ -65,18 +77,41 @@ public class MarkDocumentController {
                        @ApiParam(value = "文档ID", required = true) String documentName,
                        @ApiParam(value = "文件md5", required = true) String md5,
                        @ApiParam(value = "文件", required = true) @RequestParam MultipartFile file) {
-        return ResultUtil.ok(markDocumentService.save(examId, paperNumber,documentName, file,md5),"");
+        return ResultUtil.ok(markDocumentService.save(examId, paperNumber,documentName, file,md5));
     }
 
     @ApiOperation(value = "文档删除")
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
-    public void delete(@ApiParam(value = "文档ID", required = true) Long id) {
+    public Result delete(@ApiParam(value = "文档ID", required = true) Long id) {
         markDocumentService.deleteById(id);
-        ResultUtil.ok(true);
+        return ResultUtil.ok(true);
     }
 
     @ApiOperation(value = "文档下载")
     @RequestMapping(value = "/download", method = RequestMethod.POST)
-    public void download(@ApiParam(value = "文档ID", required = true) Long id) {
+    public void download(@ApiParam(value = "文档ID", required = true) Long id, HttpServletResponse response) {
+        MarkDocument document = markDocumentService.getById(id);
+        if(document==null){
+            throw ExceptionResultEnum.ERROR.exception("文档不存在");
+        }
+        if(document.getType().equals(DocumentType.SCORE)){
+            ArchiveStudentQuery query = new ArchiveStudentQuery();
+            query.setExamId(document.getExamId());
+            query.setPaperNumber(document.getPaperNumber());
+            markStudentService.scoreExport(query, response);
+        }
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(document.getExamId(),document.getPaperNumber());
+        if(markPaper==null){
+            throw ExceptionResultEnum.ERROR.exception("试卷不存在");
+        }
+        if(document.getType().equals(DocumentType.SHEET)){
+            markStudentService.sheetExport(document.getExamId(),markPaper.getCoursePaperId(),response);
+        }
+        if(document.getType().equals(DocumentType.TRACK)){
+            markStudentService.trackExport(document.getExamId(),markPaper.getCoursePaperId(),response);
+        }
+        if(document.getType().equals(DocumentType.SIGN)){
+            scanPackageService.export(markPaper.getExamId(),markPaper.getCoursePaperId(),response);
+        }
     }
 }

+ 8 - 8
distributed-print/src/main/resources/application.properties

@@ -12,9 +12,9 @@ spring.application.name=teachcloud
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=teachcloud-v3.3.1
+db.name=teachcloud_db_dev
 db.username=root
-db.password=123456789
+db.password=12345678
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
@@ -47,19 +47,19 @@ spring.activiti.check-process-definitions=false
 #full\uFF1A\u4FDD\u5B58\u5386\u53F2\u6570\u636E\u7684\u6700\u9AD8\u7EA7\u522B\uFF0C\u9664\u4E86\u4F1A\u4FDD\u5B58audit\u7EA7\u522B\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5176\u4ED6\u5168\u90E8\u6D41\u7A0B\u76F8\u5173\u7684\u7EC6\u8282\u6570\u636E\uFF0C\u5305\u62EC\u4E00\u4E9B\u6D41\u7A0B\u53C2\u6570\u7B49\u3002
 spring.activiti.history-level=audit
 
-#com.qmth.fss.public.config=oss://key:secret@teachcloud-dps-dev1-public.oss-api.qmth.com.cn
-#com.qmth.fss.public.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev1-public
-#com.qmth.fss.private.config=oss://key:secret@teachcloud-dps-dev1-private.oss-api.qmth.com.cn
-#com.qmth.fss.private.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev1-private
+#com.qmth.fss.public.config=oss://key:secret@teachcloud-dps-dev-public.oss-api.qmth.com.cn
+#com.qmth.fss.public.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev-public
+#com.qmth.fss.private.config=oss://key:secret@teachcloud-dps-dev-private.oss-api.qmth.com.cn
+#com.qmth.fss.private.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev-private
 
 #com.qmth.fss.public.config=/Users/xiaofei/qmth/temporary/zxzk/file-temp
 #com.qmth.fss.public.server=http://localhost:7001
 #com.qmth.fss.private.config=/Users/xiaofei/qmth/temporary/zxzk/pdf-temp
 #com.qmth.fss.private.server=http://localhost:7001
 
-com.qmth.fss.public.config=/Users/king/Downloads/file-temp
+com.qmth.fss.public.config=/Users/yin/Downloads/file-temp
 com.qmth.fss.public.server=/file-temp/
-com.qmth.fss.private.config=/Users/king/Downloads/pdf-temp
+com.qmth.fss.private.config=/Users/yin/Downloads/pdf-temp
 com.qmth.fss.private.server=/pdf-temp/
 
 #\u7CFB\u7EDF\u914D\u7F6E

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

@@ -127,12 +127,6 @@ public class ServiceTest {
         System.out.println(JSON.toJSONString(examPrintPlan));
     }
 
-    @Test
-    public void approveForm() {
-        Long examTask = 167675409079468032L;
-        System.out.println(JSON.toJSONString(examTaskService.findExamTaskApprovalForm(examTask)));
-    }
-
     @Test
     public void findExamObject() {
         String paperNumber = "cn004-0906-001";

+ 5 - 25
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/mark/setting/MarkClassUserParams.java

@@ -1,7 +1,5 @@
 package com.qmth.teachcloud.common.bean.params.mark.setting;
 
-import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
-
 import java.io.Serializable;
 import java.util.List;
 
@@ -12,9 +10,7 @@ public class MarkClassUserParams implements Serializable {
 
     private Long examId;
     private String paperNumber;
-    private String className;
-    private Integer groupNumber;
-    private List<MarkUser> classMarkerList;
+    private List<MarkGroupClassUserParams> groupMarkerClass;
 
     public Long getExamId() {
         return examId;
@@ -32,27 +28,11 @@ public class MarkClassUserParams implements Serializable {
         this.paperNumber = paperNumber;
     }
 
-    public String getClassName() {
-        return className;
-    }
-
-    public void setClassName(String className) {
-        this.className = className;
-    }
-
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
-
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
-
-    public List<MarkUser> getClassMarkerList() {
-        return classMarkerList;
+    public List<MarkGroupClassUserParams> getGroupMarkerClass() {
+        return groupMarkerClass;
     }
 
-    public void setClassMarkerList(List<MarkUser> classMarkerList) {
-        this.classMarkerList = classMarkerList;
+    public void setGroupMarkerClass(List<MarkGroupClassUserParams> groupMarkerClass) {
+        this.groupMarkerClass = groupMarkerClass;
     }
 }

+ 40 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/mark/setting/MarkGroupClassUserParams.java

@@ -0,0 +1,40 @@
+package com.qmth.teachcloud.common.bean.params.mark.setting;
+
+import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 分班阅保存分组请求参数
+ */
+public class MarkGroupClassUserParams implements Serializable {
+
+    private Integer groupNumber;
+    private MarkUser marker;
+    private List<String> markerClassList;
+
+    public Integer getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(Integer groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+    public MarkUser getMarker() {
+        return marker;
+    }
+
+    public void setMarker(MarkUser marker) {
+        this.marker = marker;
+    }
+
+    public List<String> getMarkerClassList() {
+        return markerClassList;
+    }
+
+    public void setMarkerClassList(List<String> markerClassList) {
+        this.markerClassList = markerClassList;
+    }
+}

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

@@ -154,6 +154,7 @@ public class SystemConstant {
     public static final String SYS_CODE_ENABLE = "sys.code.enable";
     //    public static final String SYS_MESSAGE_ENABLE = "sys.message.enable";
 //    public static final String SYS_MESSAGE_RESEND_COUNT = "sys.message.resendCount";
+    public static final String SCHOOL_COURSE_DEGREE_TEMPLATE = "school.course.degree.template";
     public static final String SYS_CONFIG_KEY_CHARSETS = "sys.txt.charset";
     public static final String PACKAGE_BARCODE_POSITION = "package.barcode.position";
     public static final String SYS_PDF_SIZE_LIST = "sys.pdf.size.list";

+ 15 - 9
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/BasicCourseMapper.java

@@ -39,21 +39,27 @@ public interface BasicCourseMapper extends BaseMapper<BasicCourse> {
      * @param startCreateTime 课程创建时间(起始值)
      * @param endCreateTime   课程创建时间(终止值)
      * @param schoolId        学校id
-     * @param dpr          权限机构组
+     * @param dpr             权限机构组
      * @return 结果
      */
-    IPage<BasicCourseResult> findBasicCoursePage(@Param("iPage") Page<BasicCourseResult> iPage,
-                                                 @Param("belongOrgId") Long belongOrgId,
-                                                 @Param("courseName") String courseName,
-                                                 @Param("startCreateTime") Long startCreateTime,
-                                                 @Param("endCreateTime") Long endCreateTime,
-                                                 @Param("schoolId") Long schoolId,
-                                                 @Param("dpr") DataPermissionRule dpr);
+    IPage<BasicCourseResult> findBasicCoursePage(@Param("iPage") Page<BasicCourseResult> iPage, @Param("belongOrgId") Long belongOrgId,
+            @Param("courseName") String courseName, @Param("startCreateTime") Long startCreateTime, @Param("endCreateTime") Long endCreateTime,
+            @Param("schoolId") Long schoolId, @Param("dpr") DataPermissionRule dpr);
 
     @SuppressWarnings("MybatisXMapperMethodInspection")
     Set<Map<String, Object>> findExamTaskByCourseCode(@Param("schoolId") Long schoolId, @Param("courseCodeSet") Set<String> courseCodeSet);
 
-    List<BasicCourseExportDto> listExportData(@Param("belongOrgId") Long belongOrgId, @Param("courseName") String courseName, @Param("startCreateTime") Long startCreateTime, @Param("endCreateTime") Long endCreateTime, @Param("schoolId") Long schoolId, @Param("dpr") DataPermissionRule dpr);
+    List<BasicCourseExportDto> listExportData(@Param("belongOrgId") Long belongOrgId, @Param("courseName") String courseName, @Param("startCreateTime") Long startCreateTime,
+            @Param("endCreateTime") Long endCreateTime, @Param("schoolId") Long schoolId, @Param("dpr") DataPermissionRule dpr);
 
     void updateCourseNameFormExamTask(@Param("schoolId") Long schoolId, @Param("courseCode") String courseCode, @Param("courseName") String courseName);
+
+    /**
+     * 查询教师已选用的课程,课程编号集合
+     *
+     * @param examId 考试id
+     * @param userId 用户id
+     * @return 已占用课程编号集合
+     */
+    List<String> findOccupiedCourseCode(@Param("examId") Long examId, @Param("userId") Long userId);
 }

+ 7 - 5
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicCourseService.java

@@ -91,7 +91,8 @@ public interface BasicCourseService extends IService<BasicCourse> {
      *
      * @param finalList 基础课程数据集合
      */
-    List<BasicCourseParams> executeBasicCourseImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<Integer,List<String>> errorMap);
+    List<BasicCourseParams> executeBasicCourseImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList,
+            Map<Integer, List<String>> errorMap);
 
     /**
      * @param schoolId
@@ -105,9 +106,10 @@ public interface BasicCourseService extends IService<BasicCourse> {
     /**
      * 根据机构id选择老师
      *
-     * @param orgId    机构id
-     * @param schoolId 学校id
-     * @return 基础课程结果
+     * @param orgId       机构id
+     * @param examId      考试id
+     * @param requestUser 请求用户
+     * @return 可选基础课程结果
      */
-    List<TeachCourseSelectResult> listByOrgId(Long orgId, Long schoolId);
+    List<TeachCourseSelectResult> listByOrgId(Long orgId, Long examId, SysUser requestUser);
 }

+ 8 - 8
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java

@@ -71,13 +71,13 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
     private BasicRoleDataPermissionService basicRoleDataPermissionService;
 
     @Resource
-    BasicTeachCourseService basicTeachCourseService;
+    private BasicTeachCourseService basicTeachCourseService;
 
     @Resource
     private SysUserService sysUserService;
 
     @Resource
-    SysUserRoleService sysUserRoleService;
+    private SysUserRoleService sysUserRoleService;
 
     @Override
     public List<BasicCourse> listCoursesByUserId(Long userId) {
@@ -502,7 +502,7 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
     }
 
     @Override
-    public List<TeachCourseSelectResult> listByOrgId(Long orgId, Long schoolId) {
+    public List<TeachCourseSelectResult> listByOrgId(Long orgId, Long examId, SysUser requestUser) {
         List<Long> temp = new ArrayList<>();
         temp.add(orgId);
 
@@ -519,11 +519,11 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
                     }
                 }
             }
-            result = this.list(new QueryWrapper<BasicCourse>()
-                            .lambda()
-                            .in(BasicCourse::getTeachingRoomId, orgIdSet)
-                            .orderByAsc(BasicCourse::getOrgId))
-                    .stream().flatMap(e -> {
+            // 查询本次考试已选择的课程编号
+            List<String> occupiedCourseCodeList = this.baseMapper.findOccupiedCourseCode(examId, requestUser.getId());
+
+            result = this.list(new QueryWrapper<BasicCourse>().lambda().in(BasicCourse::getTeachingRoomId, orgIdSet)
+                            .orderByAsc(BasicCourse::getOrgId)).stream().filter(e -> !occupiedCourseCodeList.contains(e.getCode())).flatMap(e -> {
                         TeachCourseSelectResult teachCourseSelectResult = new TeachCourseSelectResult();
                         teachCourseSelectResult.setBasicCourseId(e.getId());
                         teachCourseSelectResult.setCourseName(e.getName());

+ 3 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/FileUploadServiceImpl.java

@@ -325,10 +325,11 @@ public class FileUploadServiceImpl implements FileUploadService {
     }
     public void uploadFile(boolean oss, UploadFileEnum uploadFileEnum, String uploadFileName, InputStream in) throws Exception {
         FileStoreUtil fileStoreUtil = SpringContextHolder.getBean(FileStoreUtil.class);
+        InputStream inputStream = in;
         if (isOssUpload(oss, uploadFileEnum)) {
-            fileStoreUtil.ossUpload(uploadFileName, in, DigestUtils.md5Hex(in), fileStoreUtil.getUploadEnumByPath(uploadFileName).getFssType());
+            fileStoreUtil.ossUpload(uploadFileName, in, DigestUtils.md5Hex(inputStream), fileStoreUtil.getUploadEnumByPath(uploadFileName).getFssType());
         } else {
-            fileStoreUtil.localUpload(uploadFileName, in, DigestUtils.md5Hex(in), LocalCatalogEnum.LOCAL_PDF);
+            fileStoreUtil.localUpload(uploadFileName, in, DigestUtils.md5Hex(inputStream), LocalCatalogEnum.LOCAL_PDF);
         }
     }
 

+ 14 - 0
teachcloud-common/src/main/resources/mapper/BasicCourseMapper.xml

@@ -176,4 +176,18 @@
         </where>
         ORDER BY createTime DESC
     </select>
+    <select id="findOccupiedCourseCode" resultType="java.lang.String">
+        SELECT
+            course_code
+        FROM
+            teach_course
+        <where>
+            <if test="examId != null">
+                AND exam_id = #{examId}
+            </if>
+            <if test="userId != null">
+                AND user_id = #{userId}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 45 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkUserClassDetailDto.java

@@ -0,0 +1,45 @@
+package com.qmth.teachcloud.mark.dto.mark.setting;
+
+import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
+
+import java.util.List;
+
+public class MarkUserClassDetailDto {
+
+    private Integer groupNumber;
+    private String groupQuestions;
+    private MarkUser marker;
+    private List<String> markerClassList;
+
+    public Integer getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(Integer groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+    public String getGroupQuestions() {
+        return groupQuestions;
+    }
+
+    public void setGroupQuestions(String groupQuestions) {
+        this.groupQuestions = groupQuestions;
+    }
+
+    public MarkUser getMarker() {
+        return marker;
+    }
+
+    public void setMarker(MarkUser marker) {
+        this.marker = marker;
+    }
+
+    public List<String> getMarkerClassList() {
+        return markerClassList;
+    }
+
+    public void setMarkerClassList(List<String> markerClassList) {
+        this.markerClassList = markerClassList;
+    }
+}

+ 10 - 37
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/setting/MarkUserClassDto.java

@@ -6,49 +6,22 @@ import java.util.List;
 
 public class MarkUserClassDto {
 
-    private String className;
-    private Integer groupNumber;
-    private String groupQuestions;
-    private List<MarkUser> markerList;
-    private List<MarkUser> classMarkerList;
-
-    public String getClassName() {
-        return className;
-    }
-
-    public void setClassName(String className) {
-        this.className = className;
-    }
-
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
-
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
-
-    public String getGroupQuestions() {
-        return groupQuestions;
-    }
-
-    public void setGroupQuestions(String groupQuestions) {
-        this.groupQuestions = groupQuestions;
-    }
+    private List<MarkUserClassDetailDto> markerClass;
+    private List<String> classNames;
 
-    public List<MarkUser> getMarkerList() {
-        return markerList;
+    public List<MarkUserClassDetailDto> getMarkerClass() {
+        return markerClass;
     }
 
-    public void setMarkerList(List<MarkUser> markerList) {
-        this.markerList = markerList;
+    public void setMarkerClass(List<MarkUserClassDetailDto> markerClass) {
+        this.markerClass = markerClass;
     }
 
-    public List<MarkUser> getClassMarkerList() {
-        return classMarkerList;
+    public List<String> getClassNames() {
+        return classNames;
     }
 
-    public void setClassMarkerList(List<MarkUser> classMarkerList) {
-        this.classMarkerList = classMarkerList;
+    public void setClassNames(List<String> classNames) {
+        this.classNames = classNames;
     }
 }

+ 12 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkDocument.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.mark.enums.DocumentType;
 
 import io.swagger.annotations.ApiModel;
@@ -47,9 +48,20 @@ public class MarkDocument implements Serializable {
     private Integer fileCount;
     @ApiModelProperty(value = "文件地址")
     private String filePath;
+
     public MarkDocument() {
     }
 
+    public MarkDocument(Long examId, String courseCode, String courseName, String paperNumber, DocumentType type, String name) {
+        this.id = SystemConstant.getDbUuid();
+        this.examId = examId;
+        this.courseCode = courseCode;
+        this.courseName = courseName;
+        this.paperNumber = paperNumber;
+        this.type = type;
+        this.name = name;
+    }
+
     public Long getId() {
         return id;
     }

+ 11 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/DocumentType.java

@@ -16,8 +16,7 @@ public enum DocumentType {
     TRACK("学生答卷轨迹图", 10),
     SIGN("期末考试签到表", 11),
     CHECK_IN("期考考试考场记录单", 12),
-    CUSTOM("自定义", 13),
-    ;
+    CUSTOM("自定义", 13);
 
     private String name;
 
@@ -47,10 +46,19 @@ public enum DocumentType {
         return null;
     }
 
-    public static List<DocumentType> getOptionList() {
+    /**
+     * 类型列表
+     *
+     * @param containsCustom 是否包含自定义类型
+     * @return
+     */
+    public static List<DocumentType> getOptionList(boolean containsCustom) {
         if (options == null) {
             options = new LinkedList<>();
             for (DocumentType status : DocumentType.values()) {
+                if (!containsCustom && status.equals(DocumentType.CUSTOM)) {
+                    continue;
+                }
                 options.add(status);
             }
         }

+ 1 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserClassMapper.java

@@ -21,6 +21,7 @@ import java.util.List;
 public interface MarkUserClassMapper extends BaseMapper<MarkUserClass> {
 
     List<MarkUser> listClassMarkerByExamIdAndPaperNumberAndGroupNumberAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("className") String className);
+    List<MarkUserClass> listMarkerClassByExamIdAndPaperNumberAndGroupNumberAndUserId(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("userId") Long userId);
 
     IPage<MarkGroupClassProgressDto> pageClassByExamIdAndPaperNumber(@Param("page") Page<MarkGroupClassProgressDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber);
 }

+ 3 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkDocumentService.java

@@ -2,6 +2,7 @@ package com.qmth.teachcloud.mark.service;
 
 import java.util.List;
 
+import com.qmth.teachcloud.mark.entity.MarkPaper;
 import org.springframework.web.multipart.MultipartFile;
 
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -23,4 +24,6 @@ public interface MarkDocumentService extends IService<MarkDocument> {
     void deleteById(Long id);
 
     String save(Long examId, String paperNumber, String documentName, MultipartFile file, String md5);
+
+    void initMarkDocument(MarkPaper markPaper);
 }

+ 5 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkFileService.java

@@ -24,4 +24,9 @@ public interface MarkFileService {
 	String getScanLogUri(String schoolCode, String deviceCode, String fileName);
 
 	String uploadScanLog(InputStream in, String md5, String schoolCode, String deviceCode, String fileName);
+	String getDocumentUri(Long examId, String paperNumber, String documentType,
+						  String fileName,String format);
+
+	String uploadDocument(InputStream in, String md5, Long examId, String paperNumber, String documentType,
+						  String fileName,String format) ;
 }

+ 4 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java

@@ -151,4 +151,8 @@ public interface MarkStudentService extends IService<MarkStudent> {
     void updateStudentAnswer(@NotNull Long studentId);
 
     List<MarkStudentScoreVo> listMarkStudentScoreList(Long examId, String paperNumber);
+
+    void trackExport(Long examId, String paperNumber, HttpServletResponse response);
+
+    void sheetExport(Long examId, String paperNumber, HttpServletResponse response);
 }

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserClassService.java

@@ -23,7 +23,7 @@ public interface MarkUserClassService extends IService<MarkUserClass> {
 
     void deleteByExamIdAndPaperNumber(Long examId, String paperNumber);
 
-    List<MarkUserClassDto> listMarkUserClassByExamIdAndPaperNumber(Long examId, String paperNumber);
+    MarkUserClassDto listMarkUserClassByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     List<MarkUser> listClassMarkerByExamIdAndPaperNumberAndGroupNumberAndClassName(Long examId, String paperNumber, Integer groupNumber, String className);
 

+ 5 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanPackageService.java

@@ -2,12 +2,14 @@ package com.qmth.teachcloud.mark.service;
 
 import java.util.List;
 
-import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
-import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
+import javax.servlet.http.HttpServletResponse;
+
 import org.springframework.web.multipart.MultipartFile;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
+import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.mark.bean.scananswer.SheetUploadVo;
 import com.qmth.teachcloud.mark.bean.scanpackage.ScanPackageFindVo;
 import com.qmth.teachcloud.mark.bean.scanpackage.ScanPackageQuery;
@@ -36,4 +38,5 @@ public interface ScanPackageService extends IService<ScanPackage> {
 
 	List<String> imageGet(Long examId, String coursePaperId, String packageCode);
 
+    void export(Long examId, String coursePaperId, HttpServletResponse response);
 }

+ 57 - 45
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkDocumentServiceImpl.java

@@ -7,6 +7,7 @@ import java.util.Objects;
 import javax.annotation.Resource;
 
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.FilenameUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
@@ -15,19 +16,16 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.core.exception.ParameterException;
-import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
-import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
-import com.qmth.teachcloud.common.util.FileStoreUtil;
 import com.qmth.teachcloud.mark.entity.MarkDocument;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.enums.DocumentType;
 import com.qmth.teachcloud.mark.mapper.MarkDocumentMapper;
 import com.qmth.teachcloud.mark.service.MarkDocumentService;
+import com.qmth.teachcloud.mark.service.MarkFileService;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 
 /**
@@ -41,20 +39,23 @@ import com.qmth.teachcloud.mark.service.MarkPaperService;
 @Service
 public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, MarkDocument> implements MarkDocumentService {
     @Resource
-    private FileUploadService fileUploadService;
-    @Resource
-    private FileStoreUtil fileStoreUtil;
+    private MarkFileService markFileService;
     @Resource
     private TeachcloudCommonService teachcloudCommonService;
 
     @Resource
     private MarkPaperService markPaperService;
+
     @Override
     public List<MarkDocument> listByExamIdAndPaperNumber(Long examId, String paperNumber) {
         QueryWrapper<MarkDocument> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkDocument::getExamId, examId)
                 .eq(MarkDocument::getPaperNumber, paperNumber);
-        return this.list(queryWrapper);
+        List<MarkDocument> list = this.list(queryWrapper);
+        for (MarkDocument d : list) {
+            d.setFilePath(teachcloudCommonService.filePreview(d.getFilePath()));
+        }
+        return list;
     }
 
     @Override
@@ -65,40 +66,43 @@ public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, Mar
         }
         if(document.getType().equals(DocumentType.CUSTOM)
                 ||document.getType().equals(DocumentType.SYLLABUS)
-                ||document.getType().equals(DocumentType.PROCESS_SCORE)){
-            throw ExceptionResultEnum.ERROR.exception("文档类型不正确");
-        }
-        try {
-            String fileMd5  = DigestUtils.md5Hex(file.getBytes());
-            if (!Objects.equals(fileMd5, md5)) {
-                throw ExceptionResultEnum.MD5_EQUALS_FALSE.exception();
-            }
-            String format = FilenameUtils.getExtension(file.getOriginalFilename());
-            String name = document.getType().getName();
-            if(document.getType().equals(DocumentType.CUSTOM)){
-                name = document.getName();
+                ||document.getType().equals(DocumentType.PROCESS_SCORE)
+                ||document.getType().equals(DocumentType.PAPER_REPORT)
+                ||document.getType().equals(DocumentType.CHECK_IN)){
+            try {
+                String fileMd5  = DigestUtils.md5Hex(file.getBytes());
+                if (!Objects.equals(fileMd5, md5)) {
+                    throw ExceptionResultEnum.MD5_EQUALS_FALSE.exception();
+                }
+                String format = FilenameUtils.getExtension(file.getOriginalFilename());
+                String name = document.getType().getName();
+                if(document.getType().equals(DocumentType.CUSTOM)){
+                    name = document.getName();
+                }
+                String path = markFileService.uploadDocument(file.getInputStream(),
+                        md5,document.getExamId(),document.getPaperNumber(),String.valueOf(document.getType().getValue()),document.getName(),format);
+                UpdateWrapper<MarkDocument> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.lambda().set(MarkDocument::getFilePath, path)
+                        .set(MarkDocument::getFileCount, 1)
+                        .eq(MarkDocument::getId, id);
+                this.update(updateWrapper);
+                return teachcloudCommonService.filePreview(path);
+            } catch (IOException e) {
+                log.error(SystemConstant.LOG_ERROR, e);
+                throw new ParameterException("上传失败", e);
             }
-            String filePath = getDocumentUri(document.getExamId(),document.getPaperNumber(),String.valueOf(document.getType().getValue()),name,format);
-            FilePathVo vo = fileUploadService.uploadFile(file.getInputStream(),filePath ,UploadFileEnum.DOCUMENT);
-            UpdateWrapper<MarkDocument> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.lambda().set(MarkDocument::getFilePath, vo.getPath())
-                    .set(MarkDocument::getFileCount, 1)
-                    .eq(MarkDocument::getId, id);
-            this.update(updateWrapper);
-            return teachcloudCommonService.filePreview(vo.getPath());
-        } catch (IOException e) {
-            log.error(SystemConstant.LOG_ERROR, e);
-            throw new ParameterException("原图上传失败", e);
+        }else{
+            throw ExceptionResultEnum.ERROR.exception("文档类型不正确");
         }
     }
 
     @Override
     public void deleteById(Long id) {
         MarkDocument document = this.getById(id);
-        if(document==null){
+        if (document == null) {
             throw ExceptionResultEnum.ERROR.exception("文档不存在");
         }
-        if(document.getType().equals(DocumentType.CUSTOM)){
+        if (!document.getType().equals(DocumentType.CUSTOM)) {
             throw ExceptionResultEnum.ERROR.exception("文档类型不正确");
         }
         this.removeById(id);
@@ -106,8 +110,8 @@ public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, Mar
 
     @Override
     public String save(Long examId, String paperNumber, String documentName, MultipartFile file, String md5) {
-        MarkPaper markPaper=markPaperService.getByExamIdAndPaperNumber(examId,paperNumber);
-        if(markPaper==null ||markPaper.getStatus().equals(MarkPaperStatus.FINISH)){
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        if (markPaper == null || !markPaper.getStatus().equals(MarkPaperStatus.FINISH)) {
             throw ExceptionResultEnum.ERROR.exception("评卷未结束或试卷不存在");
         }
         QueryWrapper<MarkDocument> queryWrapper = new QueryWrapper<>();
@@ -115,8 +119,8 @@ public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, Mar
                 .eq(MarkDocument::getPaperNumber, paperNumber)
                 .eq(MarkDocument::getName, documentName);
         MarkDocument document = this.getOne(queryWrapper);
-        if(document!=null){
-            throw ExceptionResultEnum.ERROR.exception(document+"已存在");
+        if (document != null) {
+            throw ExceptionResultEnum.ERROR.exception(documentName + "已存在");
         }
         document = new MarkDocument();
         document.setExamId(examId);
@@ -127,27 +131,35 @@ public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, Mar
         document.setName(documentName);
         document.setFileCount(1);
         try {
-            String fileMd5  = DigestUtils.md5Hex(file.getBytes());
+            String fileMd5 = DigestUtils.md5Hex(file.getBytes());
             if (!Objects.equals(fileMd5, md5)) {
                 throw ExceptionResultEnum.MD5_EQUALS_FALSE.exception();
             }
             String format = FilenameUtils.getExtension(file.getOriginalFilename());
             String name = document.getType().getName();
-            if(document.getType().equals(DocumentType.CUSTOM)){
+            if (document.getType().equals(DocumentType.CUSTOM)) {
                 name = document.getName();
             }
-            String filePath = getDocumentUri(document.getExamId(),document.getPaperNumber(),String.valueOf(document.getType().getValue()),name,format);
-            FilePathVo vo = fileUploadService.uploadFile(file.getInputStream(),filePath ,UploadFileEnum.DOCUMENT);
-            document.setFilePath(vo.getPath());
+            String path = markFileService.uploadDocument(file.getInputStream(),
+                    md5, examId, paperNumber, String.valueOf(document.getType().getValue()), documentName, format);
+            document.setFilePath(path);
             this.save(document);
-            return teachcloudCommonService.filePreview(vo.getPath());
+            return teachcloudCommonService.filePreview(path);
         } catch (IOException e) {
             log.error(SystemConstant.LOG_ERROR, e);
             throw new ParameterException("文件上传失败", e);
         }
     }
 
-    public String getDocumentUri(Long examId, String paperNumber, String documentType, String no,String format) {
-        return UploadFileEnum.DOCUMENT.getPath(UploadFileEnum.DOCUMENT.getTitle(), examId, paperNumber, documentType, no, format.toLowerCase());
+    @Override
+    public void initMarkDocument(MarkPaper markPaper) {
+        List<MarkDocument> markDocumentList = this.listByExamIdAndPaperNumber(markPaper.getExamId(), markPaper.getPaperNumber());
+        if (CollectionUtils.isEmpty(markDocumentList)) {
+            for (DocumentType documentType : DocumentType.getOptionList(false)) {
+                MarkDocument markDocument = new MarkDocument(markPaper.getExamId(), markPaper.getCourseCode(), markPaper.getCourseName(), markPaper.getPaperNumber(), documentType, documentType.getName());
+            }
+        } else {
+
+        }
     }
 }

+ 25 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkFileServiceImpl.java

@@ -138,4 +138,29 @@ public class MarkFileServiceImpl implements MarkFileService {
             }
         }
     }
+
+    @Override
+    public String getDocumentUri(Long examId, String paperNumber, String documentType, String fileName,String format) {
+        return UploadFileEnum.DOCUMENT.getPath(UploadFileEnum.DOCUMENT.getTitle(),examId, paperNumber, documentType, fileName, format.toLowerCase());
+    }
+
+    @Override
+    public String uploadDocument(InputStream in, String md5, Long examId, String paperNumber, String documentType,
+                                String fileName,String format) {
+        String path = getDocumentUri(examId, paperNumber, documentType, fileName,format);
+        try {
+            return fileStoreUtils.uploadFile(in, md5, UploadFileEnum.DOCUMENT, path);
+        } catch (RuntimeException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new StatusException("文件上传出错:" + path, e);
+        } finally {
+            if (in != null) {
+                try {
+                    in.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+    }
 }

+ 15 - 11
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java

@@ -1,16 +1,5 @@
 package com.qmth.teachcloud.mark.service.impl;
 
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import javax.annotation.Resource;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -40,6 +29,15 @@ import com.qmth.teachcloud.mark.entity.ScanPackage;
 import com.qmth.teachcloud.mark.mapper.MarkPaperMapper;
 import com.qmth.teachcloud.mark.service.*;
 import com.qmth.teachcloud.mark.utils.Calculator;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -64,6 +62,8 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
     private MarkStudentService markStudentService;
     @Resource
     private MarkUserGroupService markUserGroupService;
+    @Resource
+    private MarkDocumentService markDocumentService;
 
 
     @Override
@@ -168,6 +168,9 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                 for (MarkStudent markStudent : markStudentList) {
                     markStudentService.calculateObjectiveScore(markStudent);
                 }
+
+                // 结束评卷时,文档进行归档
+                markDocumentService.initMarkDocument(markPaper);
             }
 
             UpdateWrapper<MarkPaper> updateWrapper = new UpdateWrapper<>();
@@ -335,6 +338,7 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                 .eq(MarkPaper::getPaperNumber, paperNumber);
         this.update(updateWrapper);
     }
+
     @Override
     public IPage<ArchivePaperVo> documentList(ArchivePaperQuery query) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();

+ 67 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
@@ -12,6 +13,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.constraints.NotNull;
 
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -31,6 +33,7 @@ import com.qmth.boot.core.concurrent.service.ConcurrentService;
 import com.qmth.boot.core.exception.ParameterException;
 import com.qmth.boot.tools.excel.ExcelWriter;
 import com.qmth.boot.tools.excel.enums.ExcelType;
+import com.qmth.boot.tools.io.ZipWriter;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -43,6 +46,7 @@ import com.qmth.teachcloud.common.enums.ScanStatus;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
+import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.*;
 import com.qmth.teachcloud.mark.bean.UpdateTimeVo;
@@ -135,6 +139,9 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     @Resource
     private MarkSyncService markSyncService;
 
+    @Resource
+    private FileUploadService fileUploadService;
+
     @Override
     public List<String> listClassByExamIdAndCourseCode(Long examId, String paperNumber) {
         QueryWrapper<MarkStudent> queryWrapper = new QueryWrapper<>();
@@ -1380,4 +1387,64 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         }
         return markStudentScoreVoList;
     }
+
+    @Override
+    public void trackExport(Long examId, String coursePaperId, HttpServletResponse response) {
+        {
+            List<MarkStudent> list = this.listByExamIdAndCoursePaperId(examId,coursePaperId);
+            if (CollectionUtils.isNotEmpty(list)) {
+                try {
+                    response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("轨迹图.zip","UTF-8"));
+                    ZipWriter writer = ZipWriter.create(response.getOutputStream());
+                    ByteArrayOutputStream os = new ByteArrayOutputStream();
+                    for (MarkStudent s:list) {
+                        if(!s.getUpload()){
+                            continue;
+                        }
+                        List<FilePathVo> vos = JSON.parseArray(s.getSheetPath(), FilePathVo.class);
+                        for (int i = 0; i < vos.size(); i++) {
+                            FilePathVo vo = vos.get(i);
+                            File file =  fileUploadService.downloadFile( JSON.toJSONString(vo),vo.getPath());
+                            String format = FilenameUtils.getExtension(file.getName());
+                            writer.write(file, s.getStudentCode()+"-"+(i+1)+"."+format);
+                            file.delete();
+                        }
+                    }
+                    writer.close();
+                }catch (Exception e){
+                    e.printStackTrace();
+                    throw new ParameterException("文件下载失败", e);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void sheetExport(Long examId, String coursePaperId, HttpServletResponse response) {
+        List<MarkStudent> list = this.listByExamIdAndCoursePaperId(examId,coursePaperId);
+        if (CollectionUtils.isNotEmpty(list)) {
+            try {
+                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("原图.zip","UTF-8"));
+                ZipWriter writer = ZipWriter.create(response.getOutputStream());
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                for (MarkStudent s:list) {
+                    if(!s.getUpload()){
+                        continue;
+                    }
+                    List<FilePathVo> vos = JSON.parseArray(s.getSheetPath(), FilePathVo.class);
+                    for (int i = 0; i < vos.size(); i++) {
+                        FilePathVo vo = vos.get(i);
+                        File file =  fileUploadService.downloadFile(JSON.toJSONString(vo),vo.getPath());
+                        String format = FilenameUtils.getExtension(file.getName());
+                        writer.write(file, s.getStudentCode()+"-"+(i+1)+"."+format);
+                        file.delete();
+                    }
+                }
+                writer.close();
+            }catch (Exception e){
+                e.printStackTrace();
+                throw new ParameterException("文件下载失败", e);
+            }
+        }
+    }
 }

+ 68 - 36
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserClassServiceImpl.java

@@ -6,27 +6,26 @@ 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.teachcloud.common.bean.dto.mark.MarkUser;
+import com.qmth.teachcloud.common.bean.params.mark.setting.MarkClassUserParams;
+import com.qmth.teachcloud.common.bean.params.mark.setting.MarkGroupClassUserParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkGroupClassProgressDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupDto;
-import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
+import com.qmth.teachcloud.mark.dto.mark.setting.MarkUserClassDetailDto;
 import com.qmth.teachcloud.mark.dto.mark.setting.MarkUserClassDto;
-import com.qmth.teachcloud.common.bean.params.mark.setting.MarkClassUserParams;
-import com.qmth.teachcloud.mark.service.MarkQuestionService;
-import com.qmth.teachcloud.mark.service.MarkStudentService;
 import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkUserClass;
 import com.qmth.teachcloud.mark.mapper.MarkUserClassMapper;
-import com.qmth.teachcloud.mark.service.MarkGroupService;
-import com.qmth.teachcloud.mark.service.MarkUserClassService;
-import com.qmth.teachcloud.mark.service.MarkUserGroupService;
+import com.qmth.teachcloud.mark.service.*;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 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.*;
 import java.util.stream.Collectors;
 
 /**
@@ -60,7 +59,7 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
     }
 
     @Override
-    public List<MarkUserClassDto> listMarkUserClassByExamIdAndPaperNumber(Long examId, String paperNumber) {
+    public MarkUserClassDto listMarkUserClassByExamIdAndPaperNumber(Long examId, String paperNumber) {
         // 课程下所有班级数据
         List<String> paperNumberClassList = markStudentService.listClassByExamIdAndCourseCode(examId, paperNumber);
         // 课程下所有分组
@@ -73,21 +72,23 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
             return markGroupDto;
         }).collect(Collectors.toList());
 
+        MarkUserClassDto markUserClassDto = new MarkUserClassDto();
+        markUserClassDto.setClassNames(paperNumberClassList);
 
-        List<MarkUserClassDto> markUserClassDtoList = new ArrayList<>();
-        for (String className : paperNumberClassList) {
-            for (MarkGroupDto markGroupDto : markGroupDtoList) {
-                MarkUserClassDto markUserClassDto = new MarkUserClassDto();
-                markUserClassDto.setClassName(className);
-                markUserClassDto.setGroupNumber(markGroupDto.getGroupNumber());
-                markUserClassDto.setGroupQuestions(markGroupDto.getGroupQuestions());
-                markUserClassDto.setMarkerList(markGroupDto.getMarkers());
-                // 班级+分组绑定的评卷员集合
-                markUserClassDto.setClassMarkerList(this.listClassMarkerByExamIdAndPaperNumberAndGroupNumberAndClassName(examId, paperNumber, markGroupDto.getGroupNumber(), className));
-                markUserClassDtoList.add(markUserClassDto);
+        List<MarkUserClassDetailDto> markUserClassDetailDtos = new ArrayList<>();
+        for (MarkGroupDto markGroupDto : markGroupDtoList) {
+            for (MarkUser marker : markGroupDto.getMarkers()) {
+                MarkUserClassDetailDto markUserClassDetailDto = new MarkUserClassDetailDto();
+                markUserClassDetailDto.setGroupNumber(markGroupDto.getGroupNumber());
+                markUserClassDetailDto.setGroupQuestions(markGroupDto.getGroupQuestions());
+                markUserClassDetailDto.setMarker(marker);
+                List<MarkUserClass> markUserClasses = this.baseMapper.listMarkerClassByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, markGroupDto.getGroupNumber(), marker.getUserId());
+                markUserClassDetailDto.setMarkerClassList(markUserClasses.stream().map(MarkUserClass::getClassName).collect(Collectors.toList()));
+                markUserClassDetailDtos.add(markUserClassDetailDto);
             }
         }
-        return markUserClassDtoList;
+        markUserClassDto.setMarkerClass(markUserClassDetailDtos);
+        return markUserClassDto;
     }
 
     @Override
@@ -100,20 +101,49 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
     public boolean saveMarkClassUser(MarkClassUserParams markClassUserParams) {
         Long examId = markClassUserParams.getExamId();
         String paperNumber = markClassUserParams.getPaperNumber();
-        String className = markClassUserParams.getClassName();
-        Integer groupNumber = markClassUserParams.getGroupNumber();
+
+        // 校验分组、班级是否绑定完成
+        List<String> listUserClass = markStudentService.listClassByExamIdAndCourseCode(examId, paperNumber);
+        if (CollectionUtils.isNotEmpty(listUserClass)) {
+            Map<Integer, Set<String>> groupBindClassMap = new HashMap<>();
+            for (MarkGroupClassUserParams groupUserClassInfo : markClassUserParams.getGroupMarkerClass()) {
+                Integer groupNumber = groupUserClassInfo.getGroupNumber();
+                if (!groupBindClassMap.containsKey(groupNumber)) {
+                    groupBindClassMap.put(groupNumber, new HashSet<>());
+                }
+                groupBindClassMap.get(groupNumber).addAll(groupUserClassInfo.getMarkerClassList());
+            }
+
+            if (!groupBindClassMap.isEmpty()) {
+                StringJoiner stringJoiner = new StringJoiner(";");
+                for (Map.Entry<Integer, Set<String>> entry : groupBindClassMap.entrySet()) {
+                    List<String> groupAllClass = listUserClass;
+                    groupAllClass.removeAll(entry.getValue());
+                    if (CollectionUtils.isNotEmpty(groupAllClass)) {
+                        stringJoiner.add(String.format("班级[%s]在分组[%s]中未被任何评卷员绑定", String.join(",", entry.getValue()), entry.getKey()));
+                    }
+                }
+                if (stringJoiner.toString().length() > 0) {
+                    throw ExceptionResultEnum.ERROR.exception(stringJoiner.toString());
+                }
+            }
+        }
+
         List<MarkUserClass> markUserClasses = new ArrayList<>();
-        for (MarkUser markUser : markClassUserParams.getClassMarkerList()) {
-            MarkUserClass markUserClass = new MarkUserClass();
-            markUserClass.setId(SystemConstant.getDbUuid());
-            markUserClass.setExamId(examId);
-            markUserClass.setPaperNumber(paperNumber);
-            markUserClass.setGroupNumber(groupNumber);
-            markUserClass.setClassName(className);
-            markUserClass.setUserId(markUser.getUserId());
-            markUserClasses.add(markUserClass);
+        for (MarkGroupClassUserParams groupUserClassInfo : markClassUserParams.getGroupMarkerClass()) {
+            for (String className : groupUserClassInfo.getMarkerClassList()) {
+                MarkUserClass markUserClass = new MarkUserClass();
+                markUserClass.setId(SystemConstant.getDbUuid());
+                markUserClass.setExamId(examId);
+                markUserClass.setPaperNumber(paperNumber);
+                markUserClass.setGroupNumber(groupUserClassInfo.getGroupNumber());
+                markUserClass.setClassName(className);
+                markUserClass.setUserId(groupUserClassInfo.getMarker().getUserId());
+                markUserClasses.add(markUserClass);
+            }
         }
-        this.deleteByExamIdAndPaperNumberAndGroupNumberAndClassName(examId, paperNumber, groupNumber, className);
+        // 科目下所有数据同时提交
+        this.deleteByExamIdAndPaperNumberAndGroupNumberAndClassName(examId, paperNumber, null, null);
         this.saveBatch(markUserClasses);
         return true;
     }
@@ -123,8 +153,10 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
         UpdateWrapper<MarkUserClass> updateWrapper = new UpdateWrapper<>();
         LambdaUpdateWrapper<MarkUserClass> lambdaUpdateWrapper = updateWrapper.lambda();
         lambdaUpdateWrapper.eq(MarkUserClass::getExamId, examId)
-                .eq(MarkUserClass::getPaperNumber, paperNumber)
-                .eq(MarkUserClass::getGroupNumber, groupNumber);
+                .eq(MarkUserClass::getPaperNumber, paperNumber);
+        if (groupNumber != null) {
+            lambdaUpdateWrapper.eq(MarkUserClass::getGroupNumber, groupNumber);
+        }
         if (StringUtils.isNotBlank(className)) {
             lambdaUpdateWrapper.eq(MarkUserClass::getClassName, className);
         }

+ 52 - 13
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPackageServiceImpl.java

@@ -1,16 +1,39 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.core.exception.ParameterException;
+import com.qmth.boot.tools.io.ZipWriter;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
+import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
+import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.bean.scananswer.SheetUploadVo;
@@ -21,19 +44,6 @@ import com.qmth.teachcloud.mark.entity.MarkPaperPackage;
 import com.qmth.teachcloud.mark.entity.ScanPackage;
 import com.qmth.teachcloud.mark.mapper.ScanPackageMapper;
 import com.qmth.teachcloud.mark.service.*;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -57,6 +67,8 @@ public class ScanPackageServiceImpl extends ServiceImpl<ScanPackageMapper, ScanP
     private TeachcloudCommonService teachcloudCommonService;
     @Resource
     private BasicRoleDataPermissionService basicRoleDataPermissionService;
+    @Resource
+    private FileUploadService fileUploadService;
 
     @Override
     public int getCount(Long examId, String courseCode, String coursePaperId, MarkPaperStatus status, DataPermissionRule dpr) {
@@ -200,4 +212,31 @@ public class ScanPackageServiceImpl extends ServiceImpl<ScanPackageMapper, ScanP
         }
         return ret;
     }
+
+    @Override
+    public void export(Long examId, String coursePaperId, HttpServletResponse response) {
+        QueryWrapper<ScanPackage> wrapper = new QueryWrapper<>();
+        LambdaQueryWrapper<ScanPackage> lw = wrapper.lambda();
+        lw.eq(ScanPackage::getExamId, examId);
+        lw.eq(ScanPackage::getCoursePaperId, coursePaperId);
+        lw.orderByAsc(ScanPackage::getPackageNo);
+        List<ScanPackage> list = this.list(wrapper);
+        if (CollectionUtils.isNotEmpty(list)) {
+            try {
+                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("签到表.zip","UTF-8"));
+                ZipWriter writer = ZipWriter.create(response.getOutputStream());
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                for (ScanPackage s: list) {
+                    FilePathVo filePathVo = JSON.parseObject(s.getPath(), FilePathVo.class);
+                    File file =  fileUploadService.downloadFile(s.getPath(),filePathVo.getPath());
+                    writer.write(file, file.getName());
+                    file.delete();
+                }
+                writer.close();
+            }catch (Exception e){
+                e.printStackTrace();
+                throw new ParameterException("文件下载失败", e);
+            }
+        }
+    }
 }

+ 12 - 0
teachcloud-mark/src/main/resources/mapper/MarkUserClassMapper.xml

@@ -42,5 +42,17 @@
           AND paper_number = #{paperNumber}
         ORDER BY group_number, class_name
     </select>
+    <select id="listMarkerClassByExamIdAndPaperNumberAndGroupNumberAndUserId"
+            resultType="com.qmth.teachcloud.mark.entity.MarkUserClass">
+        SELECT
+            muc.*
+        FROM
+            mark_user_class muc
+        WHERE
+            muc.exam_id = #{examId}
+          AND muc.paper_number = #{paperNumber}
+          AND muc.group_number = #{groupNumber}
+          AND muc.user_id = #{userId}
+    </select>
 
 </mapper>