瀏覽代碼

3.4.0 update

xiaofei 1 年之前
父節點
當前提交
a9609a93e2
共有 42 個文件被更改,包括 565 次插入476 次删除
  1. 10 10
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/TeachCourseSelectParam.java
  2. 14 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/CourseDimension.java
  3. 14 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/CourseEvaluation.java
  4. 14 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/CourseTarget.java
  5. 14 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/CourseWeight.java
  6. 13 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamCard.java
  7. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetailCourse.java
  8. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamStudent.java
  9. 13 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamTask.java
  10. 16 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TPCourse.java
  11. 14 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TeachCourse.java
  12. 1 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TeachCourseService.java
  13. 1 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/CourseEvaluationServiceImpl.java
  14. 6 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  15. 29 29
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TeachCourseServiceImpl.java
  16. 1 1
      distributed-print-business/src/main/resources/mapper/TeachCourseMapper.xml
  17. 35 0
      distributed-print/install/mysql/upgrade/3.4.0.sql
  18. 3 8
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicCourseController.java
  19. 1 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/TeachCourseController.java
  20. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkSettingController.java
  21. 5 9
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicCourseImportDto.java
  22. 10 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicCourse.java
  23. 12 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicExamStudent.java
  24. 0 3
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/BasicCourseMapper.java
  25. 5 16
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicCourseService.java
  26. 4 21
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysOrgService.java
  27. 86 259
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java
  28. 20 73
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysOrgServiceImpl.java
  29. 18 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/excel/convertor/reader/StringValueConvertor.java
  30. 0 4
      teachcloud-common/src/main/resources/mapper/BasicCourseMapper.xml
  31. 16 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/vo/parseCard/Exchange.java
  32. 10 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/vo/parseCard/Pages.java
  33. 13 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkDocument.java
  34. 13 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroup.java
  35. 14 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkPaper.java
  36. 24 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java
  37. 12 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkTask.java
  38. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkPaperService.java
  39. 32 26
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java
  40. 30 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/CardParseUtils.java
  41. 2 0
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/PrintFinishService.java
  42. 13 0
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/impl/PrintFinishServiceImpl.java

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

@@ -16,15 +16,15 @@ import java.util.List;
  */
 public class TeachCourseSelectParam {
 
-    @ApiModelProperty("考试id")
+    @ApiModelProperty("考试ID")
     @JsonSerialize(using = ToStringSerializer.class)
-    @NotNull(message = "缺少考试")
-    @Range(min = 1L, message = "缺少考试")
+    @NotNull(message = "请选择考试")
+    @Range(min = 1L, message = "请选择考试")
     private Long examId;
 
-    @ApiModelProperty("课程编号集合")
-    @NotEmpty(message = "缺少课程编号集合")
-    private List<String> courseCodeList;
+    @ApiModelProperty("课程ID集合")
+    @NotEmpty(message = "请选择课程")
+    private List<Long> courseIds;
 
     public Long getExamId() {
         return examId;
@@ -34,11 +34,11 @@ public class TeachCourseSelectParam {
         this.examId = examId;
     }
 
-    public List<String> getCourseCodeList() {
-        return courseCodeList;
+    public List<Long> getCourseIds() {
+        return courseIds;
     }
 
-    public void setCourseCodeList(List<String> courseCodeList) {
-        this.courseCodeList = courseCodeList;
+    public void setCourseIds(List<Long> courseIds) {
+        this.courseIds = courseIds;
     }
 }

+ 14 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/CourseDimension.java

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.business.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.distributed.print.business.enums.CourseDimensionSourceEnum;
@@ -36,6 +38,10 @@ public class CourseDimension extends BaseEntity {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
 
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "course_id", updateStrategy = FieldStrategy.IGNORED)
+    private Long courseId;
     @ApiModelProperty(value = "课程编号")
     private String courseCode;
 
@@ -91,6 +97,14 @@ public class CourseDimension extends BaseEntity {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 14 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/CourseEvaluation.java

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.business.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.distributed.print.business.enums.CourseEvaluationTypeEnum;
@@ -31,7 +33,10 @@ public class CourseEvaluation extends BaseEntity {
     @ApiModelProperty(value = "考试id")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
-
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "course_id", updateStrategy = FieldStrategy.IGNORED)
+    private Long courseId;
     @ApiModelProperty(value = "课程编号")
     private String courseCode;
 
@@ -72,6 +77,14 @@ public class CourseEvaluation extends BaseEntity {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 14 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/CourseTarget.java

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.business.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.base.BaseEntity;
@@ -32,7 +34,10 @@ public class CourseTarget extends BaseEntity {
     @ApiModelProperty(value = "考试id")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
-
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "course_id", updateStrategy = FieldStrategy.IGNORED)
+    private Long courseId;
     @ApiModelProperty(value = "课程编号")
     private String courseCode;
 
@@ -76,6 +81,14 @@ public class CourseTarget extends BaseEntity {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 14 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/CourseWeight.java

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.business.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.base.BaseEntity;
@@ -30,7 +32,10 @@ public class CourseWeight extends BaseEntity {
 
     @ApiModelProperty(value = "考试id")
     private Long examId;
-
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "course_id", updateStrategy = FieldStrategy.IGNORED)
+    private Long courseId;
     @ApiModelProperty(value = "课程编号")
     private String courseCode;
 
@@ -77,6 +82,14 @@ public class CourseWeight extends BaseEntity {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 13 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamCard.java

@@ -39,6 +39,11 @@ public class ExamCard extends BaseEntity implements Serializable {
     @TableField(value = "org_id", updateStrategy = FieldStrategy.IGNORED)
     private Long orgId;
 
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "course_id", updateStrategy = FieldStrategy.IGNORED)
+    private Long courseId;
+
     /**
      * 课程编码
      */
@@ -133,6 +138,14 @@ public class ExamCard extends BaseEntity implements Serializable {
         this.orgId = orgId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

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

@@ -31,6 +31,10 @@ public class ExamDetailCourse extends BaseEntity implements Serializable {
     @TableField("exam_detail_id")
     private Long examDetailId;
 
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("course_id")
+    private Long courseId;
+
     @TableField("course_code")
     private String courseCode;
 
@@ -86,6 +90,14 @@ public class ExamDetailCourse extends BaseEntity implements Serializable {
         this.attachmentId = attachmentId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getPaperType() {
         return paperType;
     }

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

@@ -36,6 +36,10 @@ public class ExamStudent extends BaseEntity implements Serializable {
     @TableField("exam_detail_course_id")
     private Long examDetailCourseId;
 
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("student_id")
+    private Long studentId;
+
     @TableField("student_name")
     private String studentName;
 
@@ -134,6 +138,14 @@ public class ExamStudent extends BaseEntity implements Serializable {
         this.examDetailCourseId = examDetailCourseId;
     }
 
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
     public String getStudentName() {
         return studentName;
     }

+ 13 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamTask.java

@@ -42,6 +42,11 @@ public class ExamTask extends BaseEntity implements Serializable {
     @TableField(value = "org_id", updateStrategy = FieldStrategy.IGNORED)
     private Long orgId;
 
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "course_id", updateStrategy = FieldStrategy.IGNORED)
+    private Long courseId;
+
     /**
      * 课程代码
      */
@@ -185,6 +190,14 @@ public class ExamTask extends BaseEntity implements Serializable {
         this.orgId = orgId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TPCourse.java

@@ -1,6 +1,10 @@
 package com.qmth.distributed.print.business.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 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.base.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -24,6 +28,10 @@ public class TPCourse extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "专业ID")
     private Long professionalId;
 
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long courseId;
+
     @ApiModelProperty(value = "课程代码")
     private String courseCode;
 
@@ -41,6 +49,14 @@ public class TPCourse extends BaseEntity implements Serializable {
         this.professionalId = professionalId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

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

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.business.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.base.BaseEntity;
@@ -27,6 +29,10 @@ public class TeachCourse extends BaseEntity implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
 
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long courseId;
+
     @ApiModelProperty(value = "课程编号")
     private String courseCode;
 
@@ -72,6 +78,14 @@ public class TeachCourse extends BaseEntity implements Serializable {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

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

@@ -54,9 +54,8 @@ public interface TeachCourseService extends IService<TeachCourse> {
      * 选择课程表并创建教学课程
      *
      * @param teachCourseSelectParam 教学课程选择参数
-     * @param requestUser            请求的用户
      */
-    void selectCreate(TeachCourseSelectParam teachCourseSelectParam, SysUser requestUser);
+    void selectCreate(TeachCourseSelectParam teachCourseSelectParam);
 
     /**
      * 导入教学课程

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

@@ -68,7 +68,6 @@ public class CourseEvaluationServiceImpl extends ServiceImpl<CourseEvaluationMap
             throw ExceptionResultEnum.ERROR.exception("教学课程不存在");
         }
         Long examId = teachCourse.getExamId();
-        String courseCode = teachCourse.getCourseCode();
 
         if (SystemConstant.longNotNull(id)) {
             // 编辑(只允许更改评价方式描述)
@@ -96,7 +95,7 @@ public class CourseEvaluationServiceImpl extends ServiceImpl<CourseEvaluationMap
             courseEvaluation.setTeachCourseId(teachCourseId);
             courseEvaluation.setSchoolId(teachCourse.getSchoolId());
             courseEvaluation.setExamId(examId);
-            courseEvaluation.setCourseCode(courseCode);
+            courseEvaluation.setCourseId(teachCourse.getCourseId());
             courseEvaluation.setUserId(teachCourse.getUserId());
             courseEvaluation.setType(type);
             courseEvaluation.setEvaluation(evaluation);

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

@@ -311,7 +311,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         try {
             Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
             Long examId = examTask.getExamId();
-            String courseCode = examTask.getCourseCode();
+//            String courseCode = examTask.getCourseCode();
             BasicPrintConfig basicPrintConfig = basicPrintConfigService.getByExamId(examId);
             examTask.setSchoolId(schoolId);
             examTask.setCardRuleId(basicPrintConfig.getCardRuleId());
@@ -338,9 +338,11 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
             examTask.setReview(basicPrintConfig.getReview());
             // 取课程所在机构
-            Long teachingRoomId = basicCourseService.getOrgIdBySchoolIdAndCourseCode(schoolId, courseCode);
-            examTask.setOrgId(teachingRoomId);
-            examTask.setTeachingRoomId(teachingRoomId);
+            BasicCourse basicCourse = basicCourseService.getById(examTask.getCourseId());
+            if(basicCourse == null){
+                throw ExceptionResultEnum.ERROR.exception("课程不存在");
+            }
+            examTask.setTeachingRoomId(basicCourse.getTeachingRoomId());
             if (examTask.getUserId() == null) {
                 examTask.setStatus(ExamStatusEnum.DRAFT);
             } else if (Objects.nonNull(examTask.getReview()) && examTask.getReview()) {

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

@@ -147,38 +147,38 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
 
     @Transactional
     @Override
-    public void selectCreate(TeachCourseSelectParam teachCourseSelectParam, SysUser requestUser) {
-        Long schoolId = requestUser.getSchoolId();
-        Long userId = requestUser.getId();
+    public void selectCreate(TeachCourseSelectParam teachCourseSelectParam) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Long examId = teachCourseSelectParam.getExamId();
-        List<String> courseCodeList = teachCourseSelectParam.getCourseCodeList();
+        List<Long> courseIds = teachCourseSelectParam.getCourseIds();
 
-        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());
+        List<Long> userCourseIds = this.list(
+                        new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getExamId, examId).eq(TeachCourse::getUserId, sysUser.getId())).stream().map(TeachCourse::getCourseId)
+                .collect(Collectors.toList());
 
-            courseCodeList = courseCodeList.stream().filter(e -> !occupiedCourseCodeList.contains(e)).collect(Collectors.toList());
 
-            TeachCourse tmp = new TeachCourse();
-            tmp.setSchoolId(schoolId);
-            tmp.setExamId(examId);
-            tmp.setUserId(userId);
-            tmp.setEnable(true);
-            tmp.setWeightSetting(false);
+        List<TeachCourse> teachCourseList = new ArrayList<>();
+        for (Long courseId : courseIds) {
+            if (CollectionUtils.isNotEmpty(courseIds) && userCourseIds.contains(courseId)) {
+                continue;
+            }
+            TeachCourse teachCourse = new TeachCourse();
+            teachCourse.setSchoolId(sysUser.getSchoolId());
+            teachCourse.setExamId(examId);
+            teachCourse.setUserId(sysUser.getId());
+            teachCourse.setEnable(true);
+            teachCourse.setWeightSetting(false);
+            teachCourse.setCourseId(courseId);
+            teachCourse.insertInfo(sysUser.getId());
+            teachCourseList.add(teachCourse);
+        }
 
-            for (String courseCode : courseCodeList) {
-                if (Objects.isNull(basicCourseService.findByCourseCode(courseCode, schoolId))) {
-                    throw ExceptionResultEnum.ERROR.exception("课程不存在");
-                }
-                TeachCourse cell = new TeachCourse();
-                BeanUtils.copyProperties(tmp, cell);
-                cell.setCourseCode(courseCode);
-                cell.insertInfo(userId);
-                this.save(cell);
+        if(CollectionUtils.isNotEmpty(teachCourseList)){
+            this.saveBatch(teachCourseList);
 
+            for (TeachCourse teachCourse : teachCourseList) {
                 // 创建默认评价方式
-                courseEvaluationService.createDefaultCourseEvaluation(cell.getId());
+                courseEvaluationService.createDefaultCourseEvaluation(teachCourse.getId());
             }
         }
     }
@@ -335,7 +335,7 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
             userSaveParams.setPassword(SystemConstant.DEFAULT_PASSWORD);
             userSaveParams.setOrgId(requestUser.getOrgId());
             userSaveParams.setEnable(true);
-            userSaveParams.setRoleIds(new Long[] { schoolTeacher.getId() });
+            userSaveParams.setRoleIds(new Long[]{schoolTeacher.getId()});
             teacherId = sysUserService.saveUser(userSaveParams);
         }
         // 添加教师团队
@@ -437,7 +437,7 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
 
     @Override
     public IPage<TeacherTeamResult> findTeacherTeamPage(Long teachCourseId, String userInfo, int pageNumber,
-            int pageSize) {
+                                                        int pageSize) {
         TeachCourse teachCourse = this.getById(teachCourseId);
         if (Objects.isNull(teachCourse)) {
             throw ExceptionResultEnum.ERROR.exception("教学课程不存在");
@@ -563,9 +563,9 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
             throw ExceptionResultEnum.ERROR.exception("非课程创建人没有分配班级的权限");
         }
         Long leaderTeachCourseId = teachCourse.getId();
-        if (!teachCourse.getUserId().equals(teachCourse.getCreateId())){
+        if (!teachCourse.getUserId().equals(teachCourse.getCreateId())) {
             // 管理员权限的科组长进入旗下教师团队的教学课程进行分配了 - 特殊处理
-            leaderTeachCourseId = this.findByExamIdCourseCodeAndUserId(teachCourse.getExamId(),teachCourse.getCourseCode(),teachCourse.getCreateId()).getId();
+            leaderTeachCourseId = this.findByExamIdCourseCodeAndUserId(teachCourse.getExamId(), teachCourse.getCourseCode(), teachCourse.getCreateId()).getId();
         }
 
         // 所有教学班

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

@@ -16,7 +16,7 @@
         FROM
             teach_course tc
                 INNER JOIN
-            basic_course bc ON tc.school_id = bc.school_id AND tc.course_code = bc.code AND bc.enable = TRUE
+            basic_course bc ON tc.course_id = bc.id
                 LEFT JOIN
             sys_user su ON tc.user_id = su.id
         <where>

+ 35 - 0
distributed-print/install/mysql/upgrade/3.4.0.sql

@@ -0,0 +1,35 @@
+USE teachcloud_db;
+
+ALTER TABLE `exam_student` ADD COLUMN `student_id` BIGINT(20) NULL COMMENT '考生ID(basic_exam_student表ID)' AFTER `exam_detail_course_id`;
+ALTER TABLE `mark_student`
+    ADD COLUMN `student_id` BIGINT(20) NULL COMMENT '考生ID(basic_exam_student表ID)' AFTER `exam_id`,
+ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `student_id`;
+ALTER TABLE `basic_exam_student` ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `exam_id`;
+ALTER TABLE `exam_card` ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `org_id`;
+ALTER TABLE `exam_detail_course` ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `exam_detail_id`;
+ALTER TABLE `exam_task` ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `org_id`;
+ALTER TABLE `mark_document` ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `exam_id`;
+ALTER TABLE `mark_group` ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `exam_id`;
+ALTER TABLE `mark_paper` ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `exam_id`;
+ALTER TABLE `mark_task` ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `exam_id`;
+ALTER TABLE `teach_course` ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `exam_id`;
+ALTER TABLE `t_p_course` ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `professional_id`;
+ALTER TABLE `basic_course` CHANGE COLUMN `org_id` `org_id` BIGINT NULL COMMENT '机构id' ;
+ALTER TABLE `basic_course` DROP INDEX `course_schoolId_code_idx` , ADD UNIQUE INDEX `uq_1` USING BTREE (`school_id`, `teaching_room_id`, `code`);
+ALTER TABLE `teach_course` CHANGE COLUMN `course_code` `course_code` VARCHAR(20) NULL COMMENT '课程代码' ;
+
+ALTER TABLE `course_dimension`
+    ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `exam_id`,
+CHANGE COLUMN `course_code` `course_code` VARCHAR(20) CHARACTER SET 'utf8mb4' NULL COMMENT '课程编号' ;
+
+ALTER TABLE `course_evaluation`
+    ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `exam_id`,
+CHANGE COLUMN `course_code` `course_code` VARCHAR(20) CHARACTER SET 'utf8mb4' NULL COMMENT '课程编号' ;
+
+ALTER TABLE `course_target`
+    ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `exam_id`,
+CHANGE COLUMN `course_code` `course_code` VARCHAR(20) CHARACTER SET 'utf8mb4' NULL COMMENT '课程编号' ;
+
+ALTER TABLE `course_weight`
+    ADD COLUMN `course_id` BIGINT(20) NULL COMMENT '课程ID(basic_course表ID)' AFTER `exam_id`,
+CHANGE COLUMN `course_code` `course_code` VARCHAR(20) CHARACTER SET 'utf8mb4' NULL COMMENT '课程编号' ;

+ 3 - 8
distributed-print/src/main/java/com/qmth/distributed/print/api/BasicCourseController.java

@@ -92,11 +92,7 @@ public class BasicCourseController {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        Long l = basicCourseService.saveBasicCourse(basicCourseParams, sysUser);
-        //        if (!CollectionUtils.isEmpty(basicCourseParams.getTeachIdSet())) {
-        //            teachCourseService.updateByCourseIdAndTeacherList(basicCourseParams.getId(), basicCourseParams.getTeachIdSet());
-        //        }
+        Long l = basicCourseService.saveBasicCourse(basicCourseParams);
         return ResultUtil.ok(l);
     }
 
@@ -131,9 +127,8 @@ public class BasicCourseController {
     @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
     @OperationLogDetail(operationType = OperationTypeEnum.IMPORT)
     @Transactional
-    public Result basicCourseImportAsync(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file)
-            throws Exception {
-        basicCourseService.executeImportBasicCourseLogic(file);
+    public Result basicCourseImportAsync(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) {
+        basicCourseService.importBasicCourse(file);
         return ResultUtil.ok();
     }
 

+ 1 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/TeachCourseController.java

@@ -38,7 +38,6 @@ import java.util.stream.Collectors;
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_TEACH + "/course")
 @Validated
-//@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class TeachCourseController {
 
     @Resource
@@ -81,11 +80,10 @@ public class TeachCourseController {
     @ApiResponses({@ApiResponse(code = 200, message = "创建成功", response = EditResult.class)})
     @OperationLogDetail(operationType = OperationTypeEnum.ADD, detail = "添加课程操作,考试ID:{{teachCourseSelectParam.examId}}、课程代码:{{teachCourseSelectParam.courseCodeList}}")
     public Result selectCreate(@Valid @RequestBody TeachCourseSelectParam teachCourseSelectParam, BindingResult bindingResult) {
-        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        teachCourseService.selectCreate(teachCourseSelectParam, requestUser);
+        teachCourseService.selectCreate(teachCourseSelectParam);
         return ResultUtil.ok();
     }
 

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

@@ -108,8 +108,8 @@ public class MarkSettingController {
     @ApiOperation(value = "评卷设置数据保存")
     @RequestMapping(value = "/paper/save", method = RequestMethod.POST)
     @OperationLogDetail(operationType = OperationTypeEnum.SAVE)
-    public Result paperSave(@RequestBody MarkPaper markPaper) {
-        markPaperService.savePaperSetting(markPaper);
+    public Result paperSave(@RequestBody List<MarkPaper> markPaperList) {
+        markPaperService.savePaperSetting(markPaperList);
         return ResultUtil.ok(true);
     }
 

+ 5 - 9
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicCourseImportDto.java

@@ -1,8 +1,10 @@
 package com.qmth.teachcloud.common.bean.dto.excel;
 
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
 import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
 import com.qmth.teachcloud.common.annotation.ExcelNote;
 import com.qmth.teachcloud.common.annotation.ExcelProperty;
+import com.qmth.teachcloud.common.util.excel.convertor.reader.StringValueConvertor;
 import io.swagger.annotations.ApiModelProperty;
 
 import javax.validation.constraints.NotNull;
@@ -16,19 +18,13 @@ import java.io.Serializable;
 @ExcelImportTempleteVaild(value = true)
 public class BasicCourseImportDto implements Serializable {
 
-    @ExcelNote(value = "课程名称")
-    @ExcelProperty(name = "课程名称", width = 30, index = 1)
-    @NotNull
+    @ExcelColumn(name = "课程名称", index = 1, nullable = true, convertor = StringValueConvertor.class)
     private String courseName;
 
-    @ExcelNote(value = "课程代码")
-    @ExcelProperty(name = "课程代码", width = 30, index = 2)
-    @NotNull
+    @ExcelColumn(name = "课程代码", index = 2, nullable = true, convertor = StringValueConvertor.class)
     private String courseCode;
 
-    @ExcelNote(value = "开课学院")
-    @ExcelProperty(name = "开课学院", width = 30, index = 3)
-    @NotNull
+    @ExcelColumn(name = "开课学院", index = 3, nullable = true, convertor = StringValueConvertor.class)
     private String teachingRoomName;
 
     @ApiModelProperty("行索引")

+ 10 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicCourse.java

@@ -57,6 +57,16 @@ public class BasicCourse extends BaseEntity implements Serializable {
     @ApiModelProperty("历史课程名称")
     private String historicName;
 
+    public BasicCourse() {
+    }
+    public BasicCourse(Long schoolId, Long teachingRoomId, String code, String name) {
+        this.schoolId = schoolId;
+        this.teachingRoomId = teachingRoomId;
+        this.code = code;
+        this.name = name;
+        this.enable = true;
+    }
+
     public String getHistoricName() {
         return historicName;
     }

+ 12 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicExamStudent.java

@@ -31,6 +31,10 @@ public class BasicExamStudent extends BaseEntity {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
 
+    @ApiModelProperty(value = "课程id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long courseId;
+
     @ApiModelProperty(value = "课程编号")
     private String courseCode;
 
@@ -92,6 +96,14 @@ public class BasicExamStudent extends BaseEntity {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 0 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/BasicCourseMapper.java

@@ -52,9 +52,6 @@ public interface BasicCourseMapper extends BaseMapper<BasicCourse> {
 
     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);
-
     /**
      * 查询教师已选用的课程,课程编号集合
      *

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

@@ -59,7 +59,7 @@ public interface BasicCourseService extends IService<BasicCourse> {
      * @param basicCourseParams 基础课程信息参数
      * @return 新增或编辑的课程id
      */
-    Long saveBasicCourse(BasicCourseParams basicCourseParams, SysUser sysUser);
+    Long saveBasicCourse(BasicCourseParams basicCourseParams);
 
     /**
      * 批量删除课程基本信息(逻辑)
@@ -79,21 +79,6 @@ public interface BasicCourseService extends IService<BasicCourse> {
      */
     Boolean removeBasicCourseBatchByQuery(Long belongOrgId, String courseName, Long startCreateTime, Long endCreateTime);
 
-    /**
-     * 处理导入课程数据
-     *
-     * @param file 文件
-     */
-    List<BasicCourseParams> executeImportBasicCourseLogic(MultipartFile file) throws IOException, NoSuchFieldException;
-
-    /**
-     * 执行批量导入课程逻辑
-     *
-     * @param finalList 基础课程数据集合
-     */
-    List<BasicCourseParams> executeBasicCourseImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList,
-            Map<Integer, List<String>> errorMap);
-
     /**
      * @param schoolId
      * @param courseCode
@@ -115,4 +100,8 @@ public interface BasicCourseService extends IService<BasicCourse> {
     List<TeachCourseSelectResult> listByOrgId(Long orgId, Long examId, String courseName, SysUser requestUser);
 
     BasicCourse getByCode(String courseCode);
+
+    void importBasicCourse(MultipartFile file);
+
+    BasicCourse getByTeachRoomIdAndCode(Long teachRoomId, String courseCode);
 }

+ 4 - 21
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysOrgService.java

@@ -175,31 +175,14 @@ public interface SysOrgService extends IService<SysOrg> {
      * 查找顶级机构
      *
      * @param schoolId
-     * @return
      */
     SysOrg findRootOrg(Long schoolId);
 
     /**
-     * 根据课程代码,查询所属学院
-     *
-     * @param courseCode
-     * @return
-     */
-    SysOrg findCollegeByCourseCode(Long schoolId, String courseCode);
-
-    /**
-     * 根据机构Id,查询所属学院
+     * 查询二级机构(学院)
      *
-     * @param orgId 机构ID
-     * @return
-     */
-    SysOrg findCollegeByOrgId(Long schoolId, Long orgId);
-
-    /**
-     * 根据机构代码查询
-     *
-     * @param orgCode
-     * @return
+     * @param schoolId 学校ID
+     * @param name     学院名称
      */
-    SysOrg findByCode(Long schoolId, String orgCode);
+    List<SysOrg> getSecondOrg(Long schoolId, String name);
 }

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

@@ -1,6 +1,5 @@
 package com.qmth.teachcloud.common.service.impl;
 
-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;
@@ -8,6 +7,8 @@ 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.boot.api.exception.ApiException;
+import com.qmth.boot.tools.excel.ExcelReader;
+import com.qmth.boot.tools.excel.enums.ExcelType;
 import com.qmth.teachcloud.common.base.BaseEntity;
 import com.qmth.teachcloud.common.bean.dto.BasicCourseExportDto;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
@@ -27,12 +28,13 @@ import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.JdbcErrorUtil;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.dao.DataIntegrityViolationException;
 import org.springframework.jdbc.BadSqlGrammarException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -151,30 +153,34 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public Long saveBasicCourse(BasicCourseParams basicCourseParams, SysUser sysUser) {
-        List<BasicCourseParams> basicCourseParamsList = new ArrayList<>();
-        basicCourseParamsList.add(basicCourseParams);
-        BasicCourse editBasicCourse = this.editEntityHelp(basicCourseParamsList, sysUser).get(0);
-        try {
-            this.saveOrUpdate(editBasicCourse);
-            // 同步更新命题任务中的课程名称
-            this.baseMapper.updateCourseNameFormExamTask(sysUser.getSchoolId(), editBasicCourse.getCode(),
-                    editBasicCourse.getName());
-            // 以下表中course_name要也同步更新
-//            client_status,exam_card,exam_detail_course,exam_paper_structure,exam_task,exam_task_print
-//            mark_document,mark_group,mark_paper,mark_paper_package,mark_student,mark_task,
-//            t_b_sync_task,t_b_task,t_c_final_score,t_c_paper_struct,t_c_statistics,t_c_usual_score,t_r_basic_info
-        } catch (Exception e) {
-            if (e instanceof DataIntegrityViolationException || e instanceof BadSqlGrammarException) {
-                String content = JdbcErrorUtil.parseErrorMsg(e.getMessage());
-                throw ExceptionResultEnum.SQL_ERROR.exception(content);
-            } else if (e instanceof ApiException) {
-                ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
+    public Long saveBasicCourse(BasicCourseParams basicCourseParams) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        SysOrg sysOrg = sysOrgService.getById(basicCourseParams.getTeachingRoomId());
+        if (sysOrg == null) {
+            throw ExceptionResultEnum.ERROR.exception("开课学院[" + sysOrg.getName() + "]在组织架构中不存在");
+        }
+        BasicCourse basicCourse = this.getByTeachRoomIdAndCode(basicCourseParams.getTeachingRoomId(), basicCourseParams.getCourseCode());
+        if (basicCourseParams.getId() == null) {
+            // 校验课程代码和开课学院
+            if (basicCourse != null) {
+                throw ExceptionResultEnum.ERROR.exception("开课学院[" + sysOrg.getName() + "]下已存在课程代码[" + basicCourseParams.getCourseCode() + "]的课程");
             } else {
-                ResultUtil.error(e.getMessage());
+                basicCourse = new BasicCourse(sysUser.getSchoolId(), basicCourseParams.getTeachingRoomId(), basicCourseParams.getCourseCode(), basicCourseParams.getCourseCode());
+                basicCourse.insertInfo(sysUser.getId());
+                this.save(basicCourse);
+                return basicCourse.getId();
             }
+        } else {
+            if(basicCourse != null && !basicCourse.getId().equals(basicCourseParams.getId())){
+                throw ExceptionResultEnum.ERROR.exception("开课学院[" + sysOrg.getName() + "]下已存在课程代码[" + basicCourseParams.getCourseCode() + "]的课程");
+            }
+            BasicCourse editBasicCourse = this.getById(basicCourseParams.getId());
+            editBasicCourse.setName(basicCourseParams.getCourseName());
+            editBasicCourse.setTeachingRoomId(basicCourseParams.getTeachingRoomId());
+            editBasicCourse.updateInfo(sysUser.getId());
+            this.updateById(editBasicCourse);
+            return editBasicCourse.getId();
         }
-        return editBasicCourse.getId();
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -253,168 +259,6 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
         return idList.size() > 0 ? this.removeBasicCourseBatch(idList) : true;
     }
 
-    @Override
-    public List<BasicCourseParams> executeImportBasicCourseLogic(MultipartFile file) throws IOException, NoSuchFieldException {
-        Map<Integer, List<String>> errorMap = new HashMap<>();
-        InputStream inputStream = file.getInputStream();
-        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(inputStream, Lists.newArrayList(BasicCourseImportDto.class, DescribeImportDto.class),
-                (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
-                    Map<String, BasicCourseImportDto> courseDtoMap = new HashMap<>();
-                    for (int i = 0; i < finalExcelList.size(); i++) {
-                        LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
-                        List<Object> basicCourseImportDtoList = excelMap.get(i);
-                        List<BasicCourseImportDto> duplicateData = new ArrayList<>();
-                        for (int y = 0; y < Objects.requireNonNull(basicCourseImportDtoList).size(); y++) {
-                            BasicCourseImportDto basicCourseImportDto = (BasicCourseImportDto) basicCourseImportDtoList.get(
-                                    y);
-                            basicCourseImportDto.setRowIndex(y + 1);
-                            String courseName = basicCourseImportDto.getCourseName();
-                            String courseCode = basicCourseImportDto.getCourseCode();
-                            String teachingRoomName = basicCourseImportDto.getTeachingRoomName();
-
-                            String emptyCheckError = ExcelUtil.checkExcelField(basicCourseImportDto);
-                            if (SystemConstant.strNotNull(emptyCheckError)) {
-                                if (errorMap.containsKey(y + 1)) {
-                                    errorMap.get(y + 1).add(emptyCheckError);
-                                } else {
-                                    List<String> errorInfo = new ArrayList<>();
-                                    errorInfo.add(emptyCheckError);
-                                    errorMap.put(y + 1, errorInfo);
-                                }
-                            } else {
-                                if (courseDtoMap.containsKey(courseCode)) {
-                                    BasicCourseImportDto primaryCell = courseDtoMap.get(courseCode);
-                                    String primaryName = primaryCell.getCourseName();
-                                    String primaryTeachingRoomName = primaryCell.getTeachingRoomName();
-                                    if (!Objects.equals(primaryName, courseName)) {
-                                        String cellException = "课程编码[" + courseCode + "],存在不同的课程名称";
-                                        this.updateErrorInfoMap(errorMap, y + 1, cellException);
-                                    }
-                                    if (!Objects.equals(primaryTeachingRoomName, teachingRoomName)) {
-                                        String cellException = "课程编码[" + courseCode + "],存在不同的开课学院";
-                                        this.updateErrorInfoMap(errorMap, y + 1, cellException);
-                                    }
-                                    duplicateData.add(basicCourseImportDto);
-                                } else {
-                                    courseDtoMap.put(courseCode, basicCourseImportDto);
-                                }
-                            }
-                            if (Objects.nonNull(courseCode) && (!courseCode.matches(SystemConstant.REGULAR_EXPRESSION_OF_CODE)
-                                    || courseCode.length() < 3 || courseCode.length() > 30)) {
-                                this.updateErrorInfoMap(errorMap, y + 1, "课程编码[" + courseCode + "]不符合输入规范");
-                            }
-                        }
-                        // 删除重复的(需要累加的)excel数据
-                        basicCourseImportDtoList.removeAll(duplicateData);
-                    }
-                    return finalExcelList;
-                }, 2);
-        return this.executeBasicCourseImportLogic(finalList, errorMap);
-    }
-
-    private void updateErrorInfoMap(Map<Integer, List<String>> errorMap, Integer key, String exception) {
-        if (errorMap.containsKey(key)) {
-            errorMap.get(key).add(exception);
-        } else {
-            List<String> errorInfo = new ArrayList<>();
-            errorInfo.add(exception);
-            errorMap.put(key, errorInfo);
-        }
-    }
-
-    /**
-     * 解析异常信息
-     *
-     * @param exceptionMap 异常信息
-     */
-    private void analyzeException(Map<Integer, List<String>> exceptionMap) {
-        System.out.println(JSON.toJSONString(exceptionMap));
-        StringBuilder exception = new StringBuilder();
-        for (Integer rowIndex : exceptionMap.keySet()) {
-            String rowInfo;
-            if (rowIndex > 0) {
-                rowInfo = "excel中第[" + rowIndex + "]行 : ";
-            } else {
-                rowInfo = "excel中存在异常:";
-            }
-            List<String> exceptionList = exceptionMap.get(rowIndex);
-            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(exceptionList)) {
-                for (String e : exceptionList) {
-                    String cell = rowInfo + e + "\n";
-                    exception.append(cell);
-                }
-            }
-        }
-        System.out.println(exception);
-        if (exception.length() > 0) {
-            throw ExceptionResultEnum.ERROR.exception(exception.toString());
-        }
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public List<BasicCourseParams> executeBasicCourseImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList,
-                                                                 Map<Integer, List<String>> errorMap) {
-        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        Long schoolId = sysUser.getSchoolId();
-        List<BasicCourseParams> addBasicCourseParamsList = new ArrayList<>();
-        for (int i = 0; i < finalList.size(); i++) {
-            LinkedMultiValueMap<Integer, Object> excelMap = finalList.get(i);
-            List<Object> basicCourseImportDtoList = excelMap.get(i);
-            for (int y = 0; y < Objects.requireNonNull(basicCourseImportDtoList).size(); y++) {
-                BasicCourseImportDto basicCourseImportDto = (BasicCourseImportDto) basicCourseImportDtoList.get(y);
-                String courseName = basicCourseImportDto.getCourseName();
-                String courseCode = basicCourseImportDto.getCourseCode();
-                String teachingRoomName = basicCourseImportDto.getTeachingRoomName();
-
-                // 原始excel中的行索引
-                Integer rowIndex = basicCourseImportDto.getRowIndex();
-
-                SysOrg sysOrg = sysOrgService.getOne(
-                        new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getSchoolId, schoolId).eq(SysOrg::getEnable, true).eq(SysOrg::getName, teachingRoomName));
-                if (Objects.isNull(sysOrg)) {
-                    this.updateErrorInfoMap(errorMap, rowIndex, "输入的开课学院[" + teachingRoomName + "]不存在");
-                    continue;
-                }
-                Long teachingRoomId = sysOrg.getId();
-
-                BasicCourseParams basicCourseParams = new BasicCourseParams();
-                basicCourseParams.setCourseCode(courseCode);
-                basicCourseParams.setCourseName(courseName);
-                basicCourseParams.setTeachingRoomId(teachingRoomId);
-                BasicCourse old = this.getOne(
-                        new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getEnable, true).eq(BasicCourse::getCode, courseCode));
-                if (Objects.nonNull(old)) {
-                    basicCourseParams.setId(old.getId());
-                }
-                addBasicCourseParamsList.add(basicCourseParams);
-            }
-            // 解析异常
-            this.analyzeException(errorMap);
-
-            List<BasicCourse> editBasicCourse = this.editEntityHelp(addBasicCourseParamsList, sysUser);
-            try {
-                this.saveOrUpdateBatch(editBasicCourse);
-
-                // 同步更新命题任务中的课程名称
-                for (BasicCourse basicCourse : editBasicCourse) {
-                    this.baseMapper.updateCourseNameFormExamTask(sysUser.getSchoolId(), basicCourse.getCode(),
-                            basicCourse.getName());
-                }
-            } catch (Exception e) {
-                if (e instanceof DataIntegrityViolationException || e instanceof BadSqlGrammarException) {
-                    String content = JdbcErrorUtil.parseErrorMsg(e.getMessage());
-                    throw ExceptionResultEnum.SQL_ERROR.exception(content);
-                } else if (e instanceof ApiException) {
-                    ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
-                } else {
-                    ResultUtil.error(e.getMessage());
-                }
-            }
-        }
-        return addBasicCourseParamsList;
-    }
-
     @Override
     public Long getOrgIdBySchoolIdAndCourseCode(Long schoolId, String courseCode) {
         if (Objects.isNull(schoolId)) {
@@ -469,7 +313,7 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
             List<String> occupiedCourseCodeList = this.baseMapper.findOccupiedCourseCode(examId, requestUser.getId());
             LambdaQueryWrapper<BasicCourse> lambda = new QueryWrapper<BasicCourse>().lambda();
             lambda.in(BasicCourse::getTeachingRoomId, orgIdSet).orderByAsc(BasicCourse::getOrgId);
-            if(StringUtils.isNotBlank(courseName)){
+            if (StringUtils.isNotBlank(courseName)) {
                 lambda.like(BasicCourse::getName, courseName);
             }
             result = this.list(lambda).stream().filter(e -> !occupiedCourseCodeList.contains(e.getCode())).flatMap(e -> {
@@ -493,86 +337,69 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
         return this.getOne(queryWrapper);
     }
 
-    private List<BasicCourse> editEntityHelp(List<BasicCourseParams> basicCourseParamsList, SysUser sysUser) {
-        Long schoolId = sysUser.getSchoolId();
-        List<BasicCourse> basicCourseList = new ArrayList<>();
-        for (BasicCourseParams basicCourseParams : basicCourseParamsList) {
-            Long id = basicCourseParams.getId();
-            String courseName = basicCourseParams.getCourseName();
-            // 校验课程编号
-            String courseCode = basicCourseParams.getCourseCode();
-            BasicCourse checkCode = this.getOne(
-                    new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getCode, courseCode).eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getEnable, true));
-            if (Objects.nonNull(checkCode)) {
-                if (!checkCode.getId().equals(id)) {
-                    throw ExceptionResultEnum.ERROR.exception("课程编码[" + courseCode + "]重复");
-                }
-            }
-            // 校验教研室id
-            Long teachingRoomId = basicCourseParams.getTeachingRoomId();
-            //            if (Objects.isNull(sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda()
-            //                    .eq(SysOrg::getId, teachingRoomId)
-            //                    .eq(SysOrg::getEnable, true)
-            //                    .eq(SysOrg::getType, OrgTypeEnum.TEACHING_ROOM)))) {
-            //                throw ExceptionResultEnum.ERROR.exception("所选教研室不存在");
-            //            }
-            // 校验班级
-
-            //基础数据组装
-            Long orgId;
-            BasicCourse basicCourse = new BasicCourse();
-            basicCourse.setName(courseName);
-            basicCourse.setCode(courseCode);
-            basicCourse.setTeachingRoomId(teachingRoomId);
-            basicCourse.setSchoolId(schoolId);
 
-            if (!SystemConstant.longNotNull(id)) {
-                // 没有id -》新增
-                id = SystemConstant.getDbUuid();
-                basicCourse.setId(id);
-                basicCourse.setCreateId(sysUser.getId());
-                basicCourse.setEnable(true);
-                // 生成简码
-                String shortCode = createShortCode(schoolId);
-                basicCourse.setShortCode(shortCode);
-                orgId = sysUser.getOrgId();
+    @Transactional
+    @Override
+    public void importBasicCourse(MultipartFile file) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        try {
+            InputStream inputStream = file.getInputStream();
+            String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+            ExcelReader excelReader;
+            if (SystemConstant.XLS.equals(extension)) {
+                excelReader = ExcelReader.create(ExcelType.XLS, inputStream, 1);
+            } else if (SystemConstant.XLSX.equals(extension)) {
+                excelReader = ExcelReader.create(ExcelType.XLSX, inputStream, 1);
             } else {
-                // 有id -》 更新
-                BasicCourse old = this.getById(id);
-                if (Objects.isNull(old) || old.getEnable().equals(false)) {
-                    throw ExceptionResultEnum.ERROR.exception("课程主键不存在或被禁用");
-                }
-                orgId = old.getOrgId();
-                basicCourse.setId(id);
-                basicCourse.setUpdateId(sysUser.getId());
+                throw ExceptionResultEnum.ERROR.exception("只能导入后缀为.xls或.xlsx文件");
             }
-            basicCourseParams.setId(basicCourse.getId());
-            basicCourse.setOrgId(orgId);
 
-            basicCourseList.add(basicCourse);
+            List<BasicCourseImportDto> courseImportDtoList = excelReader.getObjectList(BasicCourseImportDto.class);
+            if (CollectionUtils.isEmpty(courseImportDtoList)) {
+                throw ExceptionResultEnum.ERROR.exception("未读取到有效数据");
+            }
+
+            for (BasicCourseImportDto basicCourseImportDto : courseImportDtoList) {
+                String courseName = basicCourseImportDto.getCourseName();
+                String courseCode = basicCourseImportDto.getCourseCode();
+                String teachingRoomName = basicCourseImportDto.getTeachingRoomName();
+                if (StringUtils.isBlank(courseName) || StringUtils.isBlank(courseCode) || StringUtils.isBlank(teachingRoomName)) {
+                    throw ExceptionResultEnum.ERROR.exception("课程名称、课程代码、开课学院不能为空");
+                }
+                // 去空格
+                courseName = StringUtils.deleteWhitespace(courseName);
+                courseCode = StringUtils.deleteWhitespace(courseCode);
+                teachingRoomName = StringUtils.deleteWhitespace(teachingRoomName);
+                // 校验开课学院
+                List<SysOrg> sysOrgList = sysOrgService.getSecondOrg(sysUser.getSchoolId(), teachingRoomName);
+                if (CollectionUtils.isEmpty(sysOrgList)) {
+                    throw ExceptionResultEnum.ERROR.exception("开课学院[" + teachingRoomName + "]在学院层级不存在");
+                }
+                SysOrg sysOrg = sysOrgList.get(0);
+                // 校验课程代码和开课学院
+                BasicCourse basicCourse = this.getByTeachRoomIdAndCode(sysOrg.getId(), courseCode);
+                if (basicCourse != null) {
+                    basicCourse.setName(courseName);
+                    basicCourse.setUpdateId(sysUser.getId());
+                    basicCourse.setUpdateTime(System.currentTimeMillis());
+                    basicCourse.setEnable(true);
+                } else {
+                    basicCourse = new BasicCourse(sysUser.getSchoolId(), sysOrg.getId(), courseCode, courseName);
+                    basicCourse.insertInfo(sysUser.getId());
+                }
+                this.saveOrUpdate(basicCourse);
+            }
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception("导入失败:" + e.getMessage());
         }
-        return basicCourseList;
     }
 
-    /**
-     * 生成考试简码
-     *
-     * @param schoolId 学校ID
-     */
-    private String createShortCode(Long schoolId) {
+    @Override
+    public BasicCourse getByTeachRoomIdAndCode(Long teachRoomId, String courseCode) {
         QueryWrapper<BasicCourse> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(BasicCourse::getSchoolId, schoolId);
-        List<BasicCourse> basicCourses = this.baseMapper.selectList(queryWrapper);
-        if (basicCourses.isEmpty()) {
-            return "001";
-        } else {
-            Optional<BasicCourse> max = basicCourses.stream().filter(m -> StringUtils.isNotBlank(m.getShortCode())).max(Comparator.comparing(BasicCourse::getShortCode));
-            if (!max.isPresent()) {
-                return "001";
-            }
-            String maxShortCode = max.get().getShortCode();
-            int shortCode = StringUtils.isBlank(maxShortCode) ? 0 : Integer.parseInt(maxShortCode);
-            return String.format("%03d", shortCode + 1);
-        }
+        queryWrapper.lambda().eq(BasicCourse::getTeachingRoomId, teachRoomId)
+                .eq(BasicCourse::getCode, courseCode);
+        return this.getOne(queryWrapper);
     }
+
 }

+ 20 - 73
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysOrgServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.common.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
@@ -137,34 +138,6 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
         boolean success = false;
         try {
             Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-            // 机构代码不为空,校验唯一性
-//            if (StringUtils.isNotBlank(org.getCode())) {
-//                QueryWrapper<SysOrg> queryWrapper = new QueryWrapper<>();
-//                queryWrapper.lambda().eq(SysOrg::getSchoolId, schoolId)
-//                        .eq(SysOrg::getCode, org.getCode());
-//                SysOrg codeSysOrg = this.getOne(queryWrapper);
-//
-//                if (codeSysOrg != null && (org.getId() == null || !org.getId().equals(codeSysOrg.getId()))) {
-//                    throw ExceptionResultEnum.ERROR.exception("机构代码已存在");
-//                }
-//
-//                // 机构代码以code开头,则清除缓存
-//                if (org.getCode().startsWith(SystemConstant.ORG_PREFIX)) {
-//                    commonCacheService.removeMaxOrgCode(schoolId);
-//                }
-//            }
-            // 机构代码为空,若为一级学院,则自动生成code
-//            else {
-//                SysOrg sysOrgRoot = this.getOne(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getSchoolId, schoolId).eq(SysOrg::getType, OrgTypeEnum.SCHOOL));
-            // 学校下第一级机构,自动生成code
-//                if (sysOrgRoot != null && org.getParentId().equals(sysOrgRoot.getId())) {
-//                    Integer maxOrgCode = commonCacheService.getMaxOrgCode(schoolId);
-//                    Integer currentCode = maxOrgCode + 1;
-//                    commonCacheService.setMaxOrgCode(schoolId, currentCode);
-//                    org.setCode(SystemConstant.ORG_PREFIX + currentCode);
-//                }
-//            }
-
             if (org.getId() == null) {// 新增
                 org.setSchoolId(schoolId);
                 org.insertInfo(sysUser.getId());
@@ -403,16 +376,14 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public Map<String, Long> createOrGetOrgByOrgInfo(List<String> orgInfoList, SysUser requestUser) {
+    public Map<String, Long> createOrGetOrgByOrgInfo(List<String> orgInfoList, SysUser sysUser) {
+        // 父机构id
+        Long schoolId = sysUser.getSchoolId();
+        SysOrg sysOrg = this.findRootOrg(schoolId);
+        Long parentId = sysOrg.getId();
         Map<String, Long> map = new HashMap<>();
         for (String orgInfo : orgInfoList) {
-            // 父机构id
-            Long schoolId = requestUser.getSchoolId();
-            List<SysOrg> topLevelOrg = this.list(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getSchoolId, schoolId).eq(SysOrg::getType, OrgTypeEnum.SCHOOL));
-            if (topLevelOrg.size() != 1) {
-                throw ExceptionResultEnum.ERROR.exception("顶级机构信息获取异常");
-            }
-            Long parentId = topLevelOrg.get(0).getId();
+
 
             String[] arr = orgInfo.split(SystemConstant.ORG_SPLIT);
             for (int i = 0; i < arr.length; i++) {
@@ -437,7 +408,7 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
 
                     // 如果在数据库中也没有找到这个机构元素,则新建当前机构元素并保存在数据库
                     if (Objects.isNull(targetOrg)) {
-                        targetOrg = this.saveOrgElement(parentId, orgName, requestUser);
+                        targetOrg = this.saveOrgElement(parentId, orgName, sysUser);
                     }
 
                     // 不管是已有的还是新建的机构,都保存在map中方便后面查询 格式:(k -> 化学学院/核化学/聚变化学 v -> 11111111111)
@@ -450,7 +421,7 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
                 }
             }
         }
-        commonCacheService.updateOrgCollegeLevelCache(requestUser.getSchoolId());
+        commonCacheService.updateOrgCollegeLevelCache(sysUser.getSchoolId());
         return map;
     }
 
@@ -567,47 +538,23 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
         QueryWrapper<SysOrg> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(SysOrg::getSchoolId, schoolId)
                 .eq(SysOrg::getType, OrgTypeEnum.SCHOOL);
-        return this.getOne(queryWrapper);
-    }
-
-    @Override
-    public SysOrg findCollegeByCourseCode(Long schoolId, String courseCode) {
-        // 顶级机构
-        SysOrg rootOrg = this.findRootOrg(schoolId);
-
-        BasicCourse basicCourse = basicCourseService.findByCourseCode(courseCode, schoolId);
-
-        List<SysOrg> sysOrgList = this.findByConnectByParentId(Long.valueOf(basicCourse.getTeachingRoomId()), false, false);
-        if (sysOrgList.isEmpty()) {
-            throw ExceptionResultEnum.ERROR.exception(String.format("未找到课程[%s(%s)]所属机构及上级机构", basicCourse.getName(), basicCourse.getCode()));
-        }
-        Optional<SysOrg> orgOptional = sysOrgList.stream().filter(m -> m.getParentId() != null && m.getParentId().equals(rootOrg.getId())).findFirst();
-        if (!orgOptional.isPresent()) {
-            throw ExceptionResultEnum.ERROR.exception(String.format("未找到课程[%s(%s)]所属学院", basicCourse.getName(), basicCourse.getCode()));
+        SysOrg sysOrg = this.getOne(queryWrapper);
+        if (sysOrg == null) {
+            throw ExceptionResultEnum.ERROR.exception("组织架构中未找到校级机构,请联系管理员");
         }
-        SysOrg collegeOrg = orgOptional.get();
-        return collegeOrg;
+        return sysOrg;
     }
 
     @Override
-    public SysOrg findCollegeByOrgId(Long schoolId, Long orgId) {
-        // 顶级机构
+    public List<SysOrg> getSecondOrg(Long schoolId, String name) {
         SysOrg rootOrg = this.findRootOrg(schoolId);
-
-        List<SysOrg> sysOrgList = this.findByConnectByParentId(Long.valueOf(orgId), false, false);
-        if (sysOrgList.isEmpty()) {
-            return null;
-        }
-        Optional<SysOrg> orgOptional = sysOrgList.stream().filter(m -> rootOrg.getId().equals(m.getParentId())).findFirst();
-        return orgOptional.isPresent() ? orgOptional.get() : null;
-    }
-
-    @Override
-    public SysOrg findByCode(Long schoolId, String orgCode) {
         QueryWrapper<SysOrg> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(SysOrg::getSchoolId, schoolId)
-                .eq(SysOrg::getCode, orgCode);
-        return this.getOne(queryWrapper);
+        LambdaQueryWrapper<SysOrg> lambda = queryWrapper.lambda();
+        lambda.eq(SysOrg::getParentId, rootOrg.getId());
+        if (StringUtils.isNotBlank(name)) {
+            lambda.eq(SysOrg::getName, name);
+        }
+        return this.list(queryWrapper);
     }
 
     /**

+ 18 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/excel/convertor/reader/StringValueConvertor.java

@@ -0,0 +1,18 @@
+package com.qmth.teachcloud.common.util.excel.convertor.reader;
+
+import com.qmth.boot.tools.excel.convertor.ValueConvertor;
+import com.qmth.boot.tools.excel.model.FieldParam;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.Cell;
+
+public class StringValueConvertor implements ValueConvertor<String> {
+    @Override
+    public String parse(String value, FieldParam fieldParam) throws Exception {
+        return StringUtils.deleteWhitespace(value);
+    }
+
+    @Override
+    public void format(String object, FieldParam fieldParam, Cell cell) throws Exception {
+        cell.setCellValue(StringUtils.deleteWhitespace(object));
+    }
+}

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

@@ -26,10 +26,6 @@
                update_time
         from basic_course
     </sql>
-    <update id="updateCourseNameFormExamTask">
-        update exam_task set course_name = #{courseName} where school_id = #{schoolId} and course_code = #{courseCode} and course_name != #{courseName}
-    </update>
-
     <select id="listCoursesByUserId" resultMap="BaseResultMap">
         SELECT a.id,
                a.code,

+ 16 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/vo/parseCard/Exchange.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.mark.bean.vo.parseCard;
+
+import java.util.List;
+
+public class Exchange {
+
+    private List<List<Double>> infoArea;
+
+    public List<List<Double>> getInfoArea() {
+        return infoArea;
+    }
+
+    public void setInfoArea(List<List<Double>> infoArea) {
+        this.infoArea = infoArea;
+    }
+}

+ 10 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/vo/parseCard/Pages.java

@@ -6,6 +6,8 @@ public class Pages {
 
     private List<Columns> columns;
 
+    private Exchange exchange;
+
     public List<Columns> getColumns() {
         return columns;
     }
@@ -13,4 +15,12 @@ public class Pages {
     public void setColumns(List<Columns> columns) {
         this.columns = columns;
     }
+
+    public Exchange getExchange() {
+        return exchange;
+    }
+
+    public void setExchange(Exchange exchange) {
+        this.exchange = exchange;
+    }
 }

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

@@ -2,6 +2,8 @@ package com.qmth.teachcloud.mark.entity;
 
 import java.io.Serializable;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -31,6 +33,9 @@ public class MarkDocument implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "考试ID")
     private Long examId;
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long courseId;
 
     @ApiModelProperty(value = "课程代码")
     private String courseCode;
@@ -79,6 +84,14 @@ public class MarkDocument implements Serializable {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 13 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroup.java

@@ -40,6 +40,11 @@ public class MarkGroup implements Serializable {
     @MppMultiId(value = "exam_id")
     private Long examId;
 
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "course_id", updateStrategy = FieldStrategy.IGNORED)
+    private Long courseId;
+
     @ApiModelProperty(value = "课程代码")
     private String courseCode;
 
@@ -126,6 +131,14 @@ public class MarkGroup implements Serializable {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 14 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkPaper.java

@@ -1,5 +1,7 @@
 package com.qmth.teachcloud.mark.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -35,6 +37,10 @@ public class MarkPaper implements Serializable {
     @ApiModelProperty(value = "考试ID")
     private Long examId;
 
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long courseId;
+
     @ApiModelProperty(value = "课程代码")
     private String courseCode;
 
@@ -177,6 +183,14 @@ public class MarkPaper implements Serializable {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 24 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java

@@ -56,6 +56,14 @@ public class MarkStudent implements Serializable {
     @ApiModelProperty(value = "考试ID")
     private Long examId;
 
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "考生ID")
+    private Long studentId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "课程ID")
+    private Long courseId;
+
     @ApiModelProperty(value = "科目代码")
     private String courseCode;
 
@@ -260,6 +268,22 @@ public class MarkStudent implements Serializable {
         this.examId = examId;
     }
 
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

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

@@ -36,6 +36,10 @@ public class MarkTask implements Serializable {
     @ApiModelProperty(value = "考试ID")
     private Long examId;
 
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long courseId;
+
     @ApiModelProperty(value = "课程代码")
     private String courseCode;
     @ApiModelProperty(value = "课程名称")
@@ -112,6 +116,14 @@ public class MarkTask implements Serializable {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

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

@@ -32,7 +32,7 @@ public interface MarkPaperService extends IService<MarkPaper> {
 
     MarkPaper getByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType);
 
-    void savePaperSetting(MarkPaper markPaper);
+    void savePaperSetting(List<MarkPaper> markPaperList);
 
     Boolean finishPaper(Long examId, List<String> paperNumbers, MarkPaperStatus status);
 

+ 32 - 26
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.mark.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -103,33 +104,38 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
 
     @Transactional
     @Override
-    public void savePaperSetting(MarkPaper markPaper) {
-        MarkPaper markPaperOld = this.getByExamIdAndPaperNumber(markPaper.getExamId(), markPaper.getPaperNumber());
-        if (markPaperOld == null) {
-            throw ExceptionResultEnum.ERROR.exception("评卷设置数据不存在");
-        }
-        // 评卷是否结束
-        if (MarkPaperStatus.FINISH.equals(markPaperOld.getStatus())) {
-            throw ExceptionResultEnum.ERROR.exception("科目已结束评卷,无法修改参数");
+    public void savePaperSetting(List<MarkPaper> markPaperList) {
+        for (MarkPaper markPaper : markPaperList) {
+            MarkPaper markPaperOld = this.getByExamIdAndPaperNumber(markPaper.getExamId(), markPaper.getPaperNumber());
+            if (markPaperOld == null) {
+                throw ExceptionResultEnum.ERROR.exception("评卷设置数据不存在");
+            }
+            // 评卷是否结束
+            if (MarkPaperStatus.FINISH.equals(markPaperOld.getStatus())) {
+                throw ExceptionResultEnum.ERROR.exception("科目已结束评卷,无法修改参数");
+            }
+            UpdateWrapper<MarkPaper> updateWrapper = new UpdateWrapper<>();
+            LambdaUpdateWrapper<MarkPaper> lambda = updateWrapper.lambda();
+            lambda.set(MarkPaper::getMarkMode, markPaper.getMarkMode())
+                    .set(MarkPaper::getForceMode, !MarkMode.UNLIMITED.equals(markPaper.getMarkMode()))
+                    .set(MarkPaper::getMarkStartTime, markPaper.getMarkStartTime())
+                    .set(MarkPaper::getMarkEndTime, markPaper.getMarkEndTime())
+                    .set(MarkPaper::getSheetView, markPaper.getSheetView())
+                    .set(MarkPaper::getShowObjectScore, markPaper.getShowObjectScore())
+                    .set(MarkPaper::getAutoScroll, markPaper.getAutoScroll())
+                    .set(MarkPaper::getOpenDoubleMarking, markPaper.getOpenDoubleMarking())
+                    .set(MarkPaper::getPassScore, markPaper.getPassScore())
+                    .set(MarkPaper::getExcellentScore, markPaper.getExcellentScore())
+                    .eq(MarkPaper::getExamId, markPaper.getExamId())
+                    .eq(MarkPaper::getPaperNumber, markPaper.getPaperNumber());
+            if (StringUtils.isNotBlank(markPaper.getSheetConfig())) {
+                lambda.set(MarkPaper::getSheetConfig, markPaper.getSheetConfig());
+            }
+
+            // 更新评卷员模式
+            markUserGroupService.updateMode(markPaper.getExamId(), markPaper.getPaperNumber(), null, null, MarkMode.UNLIMITED.equals(markPaper.getMarkMode()) ? MarkMode.TRACK : markPaper.getMarkMode());
+            this.update(updateWrapper);
         }
-        UpdateWrapper<MarkPaper> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkPaper::getMarkMode, markPaper.getMarkMode())
-                .set(MarkPaper::getForceMode, !MarkMode.UNLIMITED.equals(markPaper.getMarkMode()))
-                .set(MarkPaper::getMarkStartTime, markPaper.getMarkStartTime())
-                .set(MarkPaper::getMarkEndTime, markPaper.getMarkEndTime())
-                .set(MarkPaper::getSheetView, markPaper.getSheetView())
-                .set(MarkPaper::getShowObjectScore, markPaper.getShowObjectScore())
-                .set(MarkPaper::getAutoScroll, markPaper.getAutoScroll())
-                .set(MarkPaper::getOpenDoubleMarking, markPaper.getOpenDoubleMarking())
-                .set(MarkPaper::getPassScore, markPaper.getPassScore())
-                .set(MarkPaper::getExcellentScore, markPaper.getExcellentScore())
-                .set(MarkPaper::getSheetConfig, markPaper.getSheetConfig())
-                .eq(MarkPaper::getExamId, markPaper.getExamId())
-                .eq(MarkPaper::getPaperNumber, markPaper.getPaperNumber());
-
-        // 更新评卷员模式
-        markUserGroupService.updateMode(markPaper.getExamId(), markPaper.getPaperNumber(), null, null, MarkMode.UNLIMITED.equals(markPaper.getMarkMode()) ? MarkMode.TRACK : markPaper.getMarkMode());
-        this.update(updateWrapper);
     }
 
     @Override

文件差異過大導致無法顯示
+ 30 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/CardParseUtils.java


+ 2 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/PrintFinishService.java

@@ -23,4 +23,6 @@ public interface PrintFinishService {
     void insertPaperAnswerFile(Long examId, String paperNumber, String paperType, Long paperId);
 
     void insertMarkPaperPackageCode(ExamDetailCourseInitMarkDto dto, String paperType);
+
+    void updateMarkSheetConfig(ExamDetailCourseInitMarkDto dto, String content);
 }

+ 13 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/impl/PrintFinishServiceImpl.java

@@ -1,5 +1,7 @@
 package com.qmth.teachcloud.task.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.qmth.distributed.print.business.bean.dto.initMarkData.ExamDetailCourseInitMarkDto;
 import com.qmth.distributed.print.business.bean.dto.initMarkData.InitExamDetailDto;
@@ -164,6 +166,7 @@ public class PrintFinishServiceImpl implements PrintFinishService {
                     if (examCard.getPaperId() != null) {
                         this.insertPaperAnswerFile(dto.getExamId(), dto.getPaperNumber(), paperType, examCard.getPaperId());
                     }
+                    this.updateMarkSheetConfig(dto, examCard.getContent());
                 }
             }
         }
@@ -316,4 +319,14 @@ public class PrintFinishServiceImpl implements PrintFinishService {
             markPaperPackageService.saveOrUpdateBatchByMultiId(markPaperPackages);
         }
     }
+
+    @Override
+    public void updateMarkSheetConfig(ExamDetailCourseInitMarkDto dto, String content) {
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumberAndPaperType(dto.getExamId(), dto.getPaperNumber(), dto.getPaperType());
+        if (markPaper != null && (StringUtils.isEmpty(markPaper.getSheetConfig()) || CollectionUtils.isEmpty(JSON.parseArray(markPaper.getSheetConfig(), JSONObject.class)))) {
+            UpdateWrapper<MarkPaper> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().set(MarkPaper::getSheetConfig, CardParseUtils.parseAreaInfo(content)).eq(MarkPaper::getId, markPaper.getId());
+            markPaperService.update(updateWrapper);
+        }
+    }
 }

部分文件因文件數量過多而無法顯示