Browse Source

add: 知学知考 分析试卷维度管理

caozixuan 3 years ago
parent
commit
551b126e0a
12 changed files with 570 additions and 101 deletions
  1. 78 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/GradePaperDimensionAbilityDto.java
  2. 93 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/GradePaperDimensionKnowledgeDto.java
  3. 0 14
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/GradePaperDimensionParam.java
  4. 99 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/analyze/GradePaperDimensionResult.java
  5. 4 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/GradePaperDimension.java
  6. 14 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/GradePaperDimensionMapper.java
  7. 28 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradeBatchPaperService.java
  8. 30 20
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradePaperDimensionService.java
  9. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeBatchPaperServiceImpl.java
  10. 183 58
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperDimensionServiceImpl.java
  11. 29 0
      distributed-print-business/src/main/resources/mapper/GradePaperDimensionMapper.xml
  12. 1 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

+ 78 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/GradePaperDimensionAbilityDto.java

@@ -0,0 +1,78 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 分析试卷能力维度数据导入类
+ * @Author: CaoZixuan
+ * @Date: 2022-05-27
+ */
+public class GradePaperDimensionAbilityDto {
+    @ExcelNote(value = "课程代码")
+    @ExcelProperty(name = "课程代码", width = 30, index = 1)
+    @NotNull
+    private String courseCode;
+
+    @ExcelNote(value = "课程名称")
+    @ExcelProperty(name = "课程名称", width = 30, index = 2)
+    @NotNull
+    private String courseName;
+
+    @ExcelNote(value = "一级能力维度")
+    @ExcelProperty(name = "一级能力维度", width = 30, index = 3)
+    @NotNull
+    private String namePrimary;
+
+    @ExcelNote(value = "一级维度编号")
+    @ExcelProperty(name = "一级维度编号", width = 30, index = 4)
+    @NotNull
+    private String codePrimary;
+
+    @ExcelNote(value = "一级维度术语解释")
+    @ExcelProperty(name = "一级维度术语解释", width = 30, index = 5)
+    @NotNull
+    private String interpret;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getNamePrimary() {
+        return namePrimary;
+    }
+
+    public void setNamePrimary(String namePrimary) {
+        this.namePrimary = namePrimary;
+    }
+
+    public String getCodePrimary() {
+        return codePrimary;
+    }
+
+    public void setCodePrimary(String codePrimary) {
+        this.codePrimary = codePrimary;
+    }
+
+    public String getInterpret() {
+        return interpret;
+    }
+
+    public void setInterpret(String interpret) {
+        this.interpret = interpret;
+    }
+}

+ 93 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/GradePaperDimensionKnowledgeDto.java

@@ -0,0 +1,93 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 分析试卷知识维度数据导入类
+ * @Author: CaoZixuan
+ * @Date: 2022-05-27
+ */
+@ExcelImportTempleteVaild(value = true)
+public class GradePaperDimensionKnowledgeDto {
+    @ExcelNote(value = "课程代码")
+    @ExcelProperty(name = "课程代码", width = 30, index = 1)
+    @NotNull
+    private String courseCode;
+
+    @ExcelNote(value = "课程名称")
+    @ExcelProperty(name = "课程名称", width = 30, index = 2)
+    @NotNull
+    private String courseName;
+
+    @ExcelNote(value = "一级知识维度")
+    @ExcelProperty(name = "一级知识维度", width = 30, index = 3)
+    @NotNull
+    private String namePrimary;
+
+    @ExcelNote(value = "一级维度编号")
+    @ExcelProperty(name = "一级维度编号", width = 30, index = 4)
+    @NotNull
+    private String codePrimary;
+
+    @ExcelNote(value = "二级知识维度")
+    @ExcelProperty(name = "二级知识维度", width = 30, index = 5)
+    @NotNull
+    private String nameSecond;
+
+    @ExcelNote(value = "二级维度编号")
+    @ExcelProperty(name = "二级维度编号", width = 30, index = 6)
+    @NotNull
+    private String codeSecond;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getNamePrimary() {
+        return namePrimary;
+    }
+
+    public void setNamePrimary(String namePrimary) {
+        this.namePrimary = namePrimary;
+    }
+
+    public String getCodePrimary() {
+        return codePrimary;
+    }
+
+    public void setCodePrimary(String codePrimary) {
+        this.codePrimary = codePrimary;
+    }
+
+    public String getNameSecond() {
+        return nameSecond;
+    }
+
+    public void setNameSecond(String nameSecond) {
+        this.nameSecond = nameSecond;
+    }
+
+    public String getCodeSecond() {
+        return codeSecond;
+    }
+
+    public void setCodeSecond(String codeSecond) {
+        this.codeSecond = codeSecond;
+    }
+}

+ 0 - 14
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/GradePaperDimensionParam.java

@@ -1,7 +1,5 @@
 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.DimensionEnum;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -11,10 +9,6 @@ import io.swagger.annotations.ApiModelProperty;
  * @Date: 2022-05-20
  */
 public class GradePaperDimensionParam {
-    @ApiModelProperty(value = "id")
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Long id;
-
     @ApiModelProperty(value = "试卷编号")
     private String paperNumber;
 
@@ -42,14 +36,6 @@ public class GradePaperDimensionParam {
     @ApiModelProperty(value = "一级维度术语解释")
     private String interpretation;
 
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
     public String getPaperNumber() {
         return paperNumber;
     }

+ 99 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/analyze/GradePaperDimensionResult.java

@@ -0,0 +1,99 @@
+package com.qmth.distributed.print.business.bean.result.analyze;
+
+import com.qmth.distributed.print.business.enums.DimensionEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 分析试卷维度结果类
+ * @Author: CaoZixuan
+ * @Date: 2022-05-27
+ */
+public class GradePaperDimensionResult {
+    @ApiModelProperty(value = "课程编号")
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "维度类型")
+    private DimensionEnum dimensionType;
+
+    @ApiModelProperty(value = "一级维度编号")
+    private String codePrimary;
+
+    @ApiModelProperty(value = "一级维度名称")
+    private String namePrimary;
+
+    @ApiModelProperty(value = "二级维度编号")
+    private String codeSecond;
+
+    @ApiModelProperty(value = "二级维度名称")
+    private String nameSecond;
+
+    @ApiModelProperty(value = "一级维度术语解释")
+    private String interpretation;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public DimensionEnum getDimensionType() {
+        return dimensionType;
+    }
+
+    public void setDimensionType(DimensionEnum dimensionType) {
+        this.dimensionType = dimensionType;
+    }
+
+    public String getCodePrimary() {
+        return codePrimary;
+    }
+
+    public void setCodePrimary(String codePrimary) {
+        this.codePrimary = codePrimary;
+    }
+
+    public String getNamePrimary() {
+        return namePrimary;
+    }
+
+    public void setNamePrimary(String namePrimary) {
+        this.namePrimary = namePrimary;
+    }
+
+    public String getCodeSecond() {
+        return codeSecond;
+    }
+
+    public void setCodeSecond(String codeSecond) {
+        this.codeSecond = codeSecond;
+    }
+
+    public String getNameSecond() {
+        return nameSecond;
+    }
+
+    public void setNameSecond(String nameSecond) {
+        this.nameSecond = nameSecond;
+    }
+
+    public String getInterpretation() {
+        return interpretation;
+    }
+
+    public void setInterpretation(String interpretation) {
+        this.interpretation = interpretation;
+    }
+}

+ 4 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/GradePaperDimension.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.entity;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.DimensionEnum;
 import com.qmth.teachcloud.common.base.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -35,7 +36,7 @@ public class GradePaperDimension extends BaseEntity implements Serializable {
     private String paperName;
 
     @ApiModelProperty(value = "维度类型 - 知识,能力,素养")
-    private String dimensionType;
+    private DimensionEnum dimensionType;
 
     @ApiModelProperty(value = "一级维度编号")
     private String codePrimary;
@@ -84,11 +85,11 @@ public class GradePaperDimension extends BaseEntity implements Serializable {
         this.paperName = paperName;
     }
 
-    public String getDimensionType() {
+    public DimensionEnum getDimensionType() {
         return dimensionType;
     }
 
-    public void setDimensionType(String dimensionType) {
+    public void setDimensionType(DimensionEnum dimensionType) {
         this.dimensionType = dimensionType;
     }
 

+ 14 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/GradePaperDimensionMapper.java

@@ -2,9 +2,12 @@ package com.qmth.distributed.print.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.qmth.distributed.print.business.bean.dto.open.PaperDimension;
+import com.qmth.distributed.print.business.bean.result.analyze.GradePaperDimensionResult;
 import com.qmth.distributed.print.business.entity.GradePaperDimension;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * <p>
  * 分析-考察点维度表 Mapper 接口
@@ -15,5 +18,16 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface GradePaperDimensionMapper extends BaseMapper<GradePaperDimension> {
 
+    /**
+     * 查询分析参数维度列表
+     * @param paperNumber 试卷编号
+     * @param paperType 试卷类型
+     * @param schoolId 学校id
+     * @return 分析试卷维度列表
+     */
+    List<GradePaperDimensionResult> findGradePaperDimensionList(@Param("paperNumber") String paperNumber,@Param("paperType") String paperType,@Param("schoolId") Long schoolId);
+
     PaperDimension findBySchoolIdAndPaperNumberAndPaperType(@Param("schoolId") Long schoolId, @Param("paperNumber") String paperNumber, @Param("paperType") String paperType);
+
+
 }

+ 28 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradeBatchPaperService.java

@@ -34,19 +34,41 @@ public interface GradeBatchPaperService extends IService<GradeBatchPaper> {
 
     /**
      * 查询可以作为分析样本的试卷
-     * @param semesterId 学期id
-     * @param examId 考试id
-     * @param collegeId 学院id
+     *
+     * @param semesterId    学期id
+     * @param examId        考试id
+     * @param collegeId     学院id
      * @param basicCourseId 基础课程id
-     * @param teacherName 命题教师
-     * @param requestUser 请求用户
+     * @param teacherName   命题教师
+     * @param requestUser   请求用户
      * @return 试卷结果
      */
-    List<GradeBatchPaperResult> findAbleAnalyzePaperList(Long semesterId, Long examId, Long collegeId,Long basicCourseId, String teacherName, SysUser requestUser);
+    List<GradeBatchPaperResult> findAbleAnalyzePaperList(Long semesterId, Long examId, Long collegeId, Long basicCourseId, String teacherName, SysUser requestUser);
 
+    /**
+     * 保存分析批次试卷
+     *
+     * @param gradeBatchPaperParam 分析批次试卷参数
+     * @param requestUser          请求用户
+     */
     void saveGradeBatchPaper(GradeBatchPaperParam gradeBatchPaperParam, SysUser requestUser);
 
+    /**
+     * 删除分析批次试卷
+     *
+     * @param idList 要删除的分析批次试卷id集合
+     * @return 结果
+     */
     boolean deleteGradeBatchPaper(List<Long> idList);
 
+    /**
+     * 根据试卷编号和试卷类型判断分析课程是否有操作权限(批次分析试卷没有在计算中的才能操作)
+     *
+     * @param schoolId    学校id
+     * @param paperNumber 试卷编号
+     * @param paperType   试卷类型
+     */
+    void checkOperateAuth(Long schoolId, String paperNumber, String paperType);
+
     GradeBatchPaper findByThirdExamIdAndGradeCourseCode(String thirdExamId, String gradeCourseCode);
 }

+ 30 - 20
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradePaperDimensionService.java

@@ -3,10 +3,13 @@ package com.qmth.distributed.print.business.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.dto.open.PaperDimension;
 import com.qmth.distributed.print.business.bean.params.GradePaperDimensionParam;
+import com.qmth.distributed.print.business.bean.result.analyze.GradePaperDimensionResult;
 import com.qmth.distributed.print.business.entity.GradePaperDimension;
+import com.qmth.distributed.print.business.enums.DimensionEnum;
 import com.qmth.teachcloud.common.entity.SysUser;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -19,44 +22,51 @@ import java.util.List;
  */
 public interface GradePaperDimensionService extends IService<GradePaperDimension> {
 
-    // TODO: 2022/5/20 查询接口 
     /**
-     * 分析 - 试卷维度数据 编辑
-     * @param gradePaperDimensionParam 试卷维度参数
+     * 查询分析试卷维度
+     * @param paperNumber 试卷编号
+     * @param paperType 试卷类型
      * @param requestUser 请求用户
-     * @return 试卷维度数据id
+     * @return 结果集
      */
-    Long editGradePaperDimension(GradePaperDimensionParam gradePaperDimensionParam,SysUser requestUser);
+    List<GradePaperDimensionResult> findGradePaperDimensionList(String paperNumber,String paperType,SysUser requestUser);
 
     /**
-     * 分析 - 试卷维度数据批量 编辑
-     * @param gradePaperDimensionParamList 试卷维度参数集合
-     * @param requestUser 请求用户
+     * 批量保存分析试卷维度数据
+     *
+     * @param gradePaperDimensionParamList 维度数据参数集合
+     * @param requestUser                  请求的用户
      */
-    void editGradePaperDimensionBatch(List<GradePaperDimensionParam> gradePaperDimensionParamList, SysUser requestUser);
+    void saveGradePaperDimensionBatch(List<GradePaperDimensionParam> gradePaperDimensionParamList, SysUser requestUser);
 
     /**
-     * 批量删除试卷维度数据
-     * @param gradePaperDimensionIdList 试卷维度数据id集合
+     * 分析 - 试卷知识维度数据导入
+     *
+     * @param file        excel 文件
+     * @param paperNumber 试卷编号
+     * @param paperType   试卷类型
+     * @param requestUser 请求用户
      */
-    void deleteGradePaperDimension(List<Long> gradePaperDimensionIdList);
+    void importGradePaperKnowledgeDimension(MultipartFile file, String paperNumber, String paperType, SysUser requestUser) throws IOException, NoSuchFieldException;
 
     /**
-     * 分析 - 试卷维度数据导入
-     * @param file excel 文件
+     * 分析 - 试卷能力维度数据导入
+     *
+     * @param file        excel 文件
      * @param paperNumber 试卷编号
-     * @param paperType 试卷类型
+     * @param paperType   试卷类型
      * @param requestUser 请求用户
      */
-    void importGradePaperDimension(MultipartFile file, String paperNumber, String paperType, SysUser requestUser);
+    void importGradePaperAbilityDimension(MultipartFile file, String paperNumber, String paperType, SysUser requestUser) throws IOException, NoSuchFieldException;
 
     /**
      * 分析 - 试卷维度模板导出
-     * @param paperNumber 试卷编号
-     * @param paperType 试卷类型
-     * @param requestUser 请求用户
+     *
+     * @param courseCode    试卷编号
+     * @param courseName    试卷名称
+     * @param dimensionType 维度类型
      */
-    void exportGradePaperDimensionTemplate(String paperNumber, String paperType, SysUser requestUser);
+    void exportGradePaperDimensionTemplate(String courseCode, String courseName, DimensionEnum dimensionType) throws Exception;
 
     PaperDimension findBySchoolIdAndPaperNumberAndPaperType(Long schoolId, String paperNumber, String paperType);
 }

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

@@ -157,6 +157,17 @@ public class GradeBatchPaperServiceImpl extends ServiceImpl<GradeBatchPaperMappe
         return this.baseMapper.findByThirdExamIdAndGradeCourseCode(thirdExamId, gradeCourseCode);
     }
 
+    @Override
+    public void checkOperateAuth(Long schoolId, String paperNumber, String paperType) {
+        List<GradeBatchPaper> gradeBatchPaperList = this.list(new QueryWrapper<GradeBatchPaper>().lambda()
+                .eq(GradeBatchPaper::getSchoolId, schoolId)
+                .eq(GradeBatchPaper::getPaperNumber, paperNumber)
+                .eq(GradeBatchPaper::getPaperType, paperType));
+        if (gradeBatchPaperList.stream().anyMatch(e -> GradeAnalyzePaperStatusEnum.CALCULATING.equals(e.getStatus()))){
+            throw ExceptionResultEnum.ERROR.exception("选择的试卷有正在计算的分析课程");
+        }
+    }
+
     /**
      * 根据机构id查询开课学院
      *

+ 183 - 58
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperDimensionServiceImpl.java

@@ -1,21 +1,32 @@
 package com.qmth.distributed.print.business.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.qmth.distributed.print.business.bean.dto.excel.GradePaperDimensionAbilityDto;
+import com.qmth.distributed.print.business.bean.dto.excel.GradePaperDimensionKnowledgeDto;
 import com.qmth.distributed.print.business.bean.dto.open.PaperDimension;
 import com.qmth.distributed.print.business.bean.params.GradePaperDimensionParam;
+import com.qmth.distributed.print.business.bean.result.analyze.GradePaperDimensionResult;
 import com.qmth.distributed.print.business.entity.GradePaperDimension;
+import com.qmth.distributed.print.business.enums.DimensionEnum;
 import com.qmth.distributed.print.business.mapper.GradePaperDimensionMapper;
+import com.qmth.distributed.print.business.service.GradeBatchPaperService;
 import com.qmth.distributed.print.business.service.GradePaperDimensionService;
 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.util.ExcelUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.List;
-import java.util.Objects;
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -27,51 +38,131 @@ import java.util.Objects;
  */
 @Service
 public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimensionMapper, GradePaperDimension> implements GradePaperDimensionService {
+    @Resource
+    private GradeBatchPaperService gradeBatchPaperService;
 
-    @Transactional(rollbackFor = Exception.class)
     @Override
-    public Long editGradePaperDimension(GradePaperDimensionParam gradePaperDimensionParam, SysUser requestUser) {
-        Long id = gradePaperDimensionParam.getId();
-        Long schoolId = requestUser.getSchoolId();
-        // 基础信息
-        String paperNumber = gradePaperDimensionParam.getPaperNumber();
-        String paperType = gradePaperDimensionParam.getPaperType();
-        String paperName = gradePaperDimensionParam.getPaperName();
-
-        // TODO: 2022/5/23 根据试卷编号和试卷类型校验该试卷是分析试卷
-
-        // 维度信息
-        String codePrimary = gradePaperDimensionParam.getCodePrimary();
-        String namePrimary = gradePaperDimensionParam.getNamePrimary();
-        this.checkCodePrimaryParams(id, paperNumber, paperType, codePrimary, namePrimary, schoolId);
-
-        // 二级维度
-
-
-        return null;
+    public List<GradePaperDimensionResult> findGradePaperDimensionList(String paperNumber, String paperType, SysUser requestUser) {
+        return this.baseMapper.findGradePaperDimensionList(paperNumber,paperType, requestUser.getSchoolId());
     }
 
-    @Transactional(rollbackFor = Exception.class)
     @Override
-    public void editGradePaperDimensionBatch(List<GradePaperDimensionParam> gradePaperDimensionParamList, SysUser requestUser) {
-
+    public void saveGradePaperDimensionBatch(List<GradePaperDimensionParam> gradePaperDimensionParamList, SysUser requestUser) {
+        List<String> paperNumberList = gradePaperDimensionParamList.stream().map(GradePaperDimensionParam::getPaperNumber).distinct().collect(Collectors.toList());
+        if (paperNumberList.size() != 1) {
+            throw ExceptionResultEnum.ERROR.exception("一次只能提交同一个试卷编号下的试卷维度数据");
+        }
+        List<String> paperTypeList = gradePaperDimensionParamList.stream().map(GradePaperDimensionParam::getPaperType).distinct().collect(Collectors.toList());
+        if (paperTypeList.size() != 1) {
+            throw ExceptionResultEnum.ERROR.exception("一次只能提交同一个试卷类型下的试卷维度数据");
+        }
+        String paperNumber = paperNumberList.get(0);
+        String paperType = paperTypeList.get(0);
+        gradeBatchPaperService.checkOperateAuth(requestUser.getSchoolId(), paperNumber, paperType);
+        List<GradePaperDimension> gradePaperDimensionList = this.checkAndBuildGradePaperDimensionList(gradePaperDimensionParamList, requestUser);
+        this.saveBatch(gradePaperDimensionList);
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void deleteGradePaperDimension(List<Long> gradePaperDimensionIdList) {
+    public void importGradePaperKnowledgeDimension(MultipartFile file, String paperNumber, String paperType, SysUser requestUser) throws IOException, NoSuchFieldException {
+        if (Objects.isNull(file)) {
+            throw ExceptionResultEnum.ERROR.exception("找不到附件");
+        }
 
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(GradePaperDimensionKnowledgeDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            if (finalExcelErrorList.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+            }
+            return finalExcelList;
+        });
+        List<GradePaperDimensionParam> gradePaperDimensionParamList = new ArrayList<>();
+
+        if (Objects.nonNull(finalList) && finalList.size() > 0) {
+            for (int i = 0; i < finalList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
+                List<Object> importList = map.get(i);
+
+                for (int y = 0; y < Objects.requireNonNull(importList).size(); y++) {
+                    if (importList.get(y) instanceof GradePaperDimensionKnowledgeDto) {
+                        GradePaperDimensionKnowledgeDto gradePaperDimensionKnowledgeDto = (GradePaperDimensionKnowledgeDto) importList.get(y);
+
+                        GradePaperDimensionParam gradePaperDimensionParam = new GradePaperDimensionParam();
+                        gradePaperDimensionParam.setPaperNumber(paperNumber);
+                        gradePaperDimensionParam.setPaperType(paperType);
+                        gradePaperDimensionParam.setDimensionType(DimensionEnum.KNOWLEDGE);
+                        gradePaperDimensionParam.setCodePrimary(gradePaperDimensionKnowledgeDto.getCodePrimary());
+                        gradePaperDimensionParam.setNamePrimary(gradePaperDimensionKnowledgeDto.getNamePrimary());
+                        gradePaperDimensionParam.setCodeSecond(gradePaperDimensionKnowledgeDto.getCodeSecond());
+                        gradePaperDimensionParam.setNameSecond(gradePaperDimensionKnowledgeDto.getNameSecond());
+                        gradePaperDimensionParamList.add(gradePaperDimensionParam);
+                    }
+                }
+            }
+        }
+        this.saveGradePaperDimensionBatch(gradePaperDimensionParamList, requestUser);
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void importGradePaperDimension(MultipartFile file, String paperNumber, String paperType, SysUser requestUser) {
+    public void importGradePaperAbilityDimension(MultipartFile file, String paperNumber, String paperType, SysUser requestUser) throws IOException, NoSuchFieldException {
+        if (Objects.isNull(file)) {
+            throw ExceptionResultEnum.ERROR.exception("找不到附件");
+        }
 
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(GradePaperDimensionAbilityDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            if (finalExcelErrorList.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+            }
+            return finalExcelList;
+        });
+        List<GradePaperDimensionParam> gradePaperDimensionParamList = new ArrayList<>();
+
+        if (Objects.nonNull(finalList) && finalList.size() > 0) {
+            for (int i = 0; i < finalList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
+                List<Object> importList = map.get(i);
+
+                for (int y = 0; y < Objects.requireNonNull(importList).size(); y++) {
+                    if (importList.get(y) instanceof GradePaperDimensionKnowledgeDto) {
+                        GradePaperDimensionAbilityDto gradePaperDimensionAbilityDto = (GradePaperDimensionAbilityDto) importList.get(y);
+
+                        GradePaperDimensionParam gradePaperDimensionParam = new GradePaperDimensionParam();
+                        gradePaperDimensionParam.setPaperNumber(paperNumber);
+                        gradePaperDimensionParam.setPaperType(paperType);
+                        gradePaperDimensionParam.setDimensionType(DimensionEnum.KNOWLEDGE);
+                        gradePaperDimensionParam.setCodePrimary(gradePaperDimensionAbilityDto.getCodePrimary());
+                        gradePaperDimensionParam.setNamePrimary(gradePaperDimensionAbilityDto.getNamePrimary());
+                        gradePaperDimensionParam.setInterpretation(gradePaperDimensionAbilityDto.getInterpret());
+                        gradePaperDimensionParamList.add(gradePaperDimensionParam);
+                    }
+                }
+            }
+        }
+        this.saveGradePaperDimensionBatch(gradePaperDimensionParamList, requestUser);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
-    public void exportGradePaperDimensionTemplate(String paperNumber, String paperType, SysUser requestUser) {
-
+    public void exportGradePaperDimensionTemplate(String courseCode, String courseName, DimensionEnum dimensionType) throws Exception {
+        switch (dimensionType) {
+            case KNOWLEDGE:
+                List<GradePaperDimensionKnowledgeDto> kDatasource = new ArrayList<>();
+                GradePaperDimensionKnowledgeDto kCell = new GradePaperDimensionKnowledgeDto();
+                kCell.setCourseCode(courseCode);
+                kCell.setCourseName(courseName);
+                kDatasource.add(kCell);
+                ExcelUtil.excelExport(courseName + "-知识维度导入模板", GradePaperDimensionKnowledgeDto.class, kDatasource, ServletUtil.getResponse());
+                break;
+            case ABILITY:
+                List<GradePaperDimensionAbilityDto> aDatasource = new ArrayList<>();
+                GradePaperDimensionAbilityDto aCell = new GradePaperDimensionAbilityDto();
+                aCell.setCourseCode(courseCode);
+                aCell.setCourseName(courseName);
+                aDatasource.add(aCell);
+                ExcelUtil.excelExport(courseName + "-能力维度导入模板", GradePaperDimensionAbilityDto.class, aDatasource, ServletUtil.getResponse());
+                break;
+        }
     }
 
     @Override
@@ -80,40 +171,74 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
     }
 
     /**
-     * 检验一级维度参数
+     * 检查并构建维度新增参数集合
+     * <p>
+     * 1.一级维度编号必须为大写A-Z
+     * 2.一级维度编号和名称在数据集中必须对应一致
+     * 3.二级维度编号必须首字符和一级维度编号一致,后续字符为正整数
+     * 4.二级维度编号在数据集中唯一
+     * </p>
      *
-     * @param id          主键
-     * @param paperNumber 试卷编号
-     * @param paperType   试卷类型
-     * @param codePrimary 一级维度编号
-     * @param namePrimary 一级维度名称
-     * @param schoolId    学校id
+     * @param gradePaperDimensionParamList 分析试卷维度集合
+     * @param requestUser                  用户
+     * @return 结果
      */
-    private void checkCodePrimaryParams(Long id, String paperNumber, String paperType, String codePrimary, String namePrimary, Long schoolId) {
-        if (SystemConstant.isOneNull(paperNumber, paperType, codePrimary, namePrimary)) {
-            throw ExceptionResultEnum.PARAMS_ERROR.exception();
-        }
+    private List<GradePaperDimension> checkAndBuildGradePaperDimensionList(List<GradePaperDimensionParam> gradePaperDimensionParamList, SysUser requestUser) {
+        Map<String, String> checkPrimaryCodeNameMap = new HashMap<>();
+        List<GradePaperDimension> gradePaperDimensionList = new ArrayList<>();
+
+        for (GradePaperDimensionParam gradePaperDimensionParam : gradePaperDimensionParamList) {
+            String paperNumber = gradePaperDimensionParam.getPaperNumber();
+            String paperType = gradePaperDimensionParam.getPaperType();
+            String paperName = gradePaperDimensionParam.getPaperName();
+            DimensionEnum dimensionType = gradePaperDimensionParam.getDimensionType();
+            String codePrimary = gradePaperDimensionParam.getCodePrimary();
+            String namePrimary = gradePaperDimensionParam.getNamePrimary();
+            String codeSecond = gradePaperDimensionParam.getCodeSecond();
+            String nameSecond = gradePaperDimensionParam.getNameSecond();
+            String interpretation = gradePaperDimensionParam.getInterpretation();
+
+            if (SystemConstant.isOneNull(paperNumber, paperType, dimensionType, codePrimary, namePrimary)) {
+                throw ExceptionResultEnum.PARAMS_ERROR.exception();
+            }
 
-        if (!codePrimary.matches(SystemConstant.REGULAR_EXPRESSION_OF_CODE_PRIMARY_DIMENSION)) {
-            throw ExceptionResultEnum.ERROR.exception("一级维度编号必须为大写A-Z");
-        }
-        List<GradePaperDimension> gradePaperDimensionList = this.list(new QueryWrapper<GradePaperDimension>().lambda()
-                .eq(GradePaperDimension::getPaperNumber, paperNumber)
-                .eq(GradePaperDimension::getPaperType, paperType)
-                .eq(GradePaperDimension::getCodePrimary, codePrimary)
-                .eq(GradePaperDimension::getSchoolId, schoolId));
-
-        if (gradePaperDimensionList.size() > 1) {
-            if (!namePrimary.equals(gradePaperDimensionList.get(0).getNamePrimary())) {
-                throw ExceptionResultEnum.ERROR.exception("一级维度编码和名称不一致");
+            // 一级维度编号必须为大写A-Z
+            if (!codePrimary.matches(SystemConstant.REGULAR_EXPRESSION_OF_CODE_PRIMARY_DIMENSION)) {
+                throw ExceptionResultEnum.ERROR.exception("一级维度编号必须为大写A-Z");
             }
-        } else {
-            GradePaperDimension gradePaperDimension = gradePaperDimensionList.get(0);
-            if (!namePrimary.equals(gradePaperDimension.getNamePrimary())) {
-                if (!Objects.equals(gradePaperDimension.getId(), id)) {
-                    throw ExceptionResultEnum.ERROR.exception("一级维度编码和名称不一致");
+            // 一级维度编号和名称在数据集中必须对应一致
+            if (checkPrimaryCodeNameMap.containsKey(codePrimary) && !checkPrimaryCodeNameMap.get(codePrimary).equals(namePrimary)) {
+                throw ExceptionResultEnum.ERROR.exception("一级维度编号和名称不对应");
+            }
+            checkPrimaryCodeNameMap.put(codePrimary, namePrimary);
+            //
+            if (SystemConstant.strNotNull(codeSecond)) {
+                if (!codeSecond.matches(SystemConstant.REGULAR_EXPRESSION_OF_CODE_SECOND_DIMENSION)) {
+                    throw ExceptionResultEnum.ERROR.exception("二级维度编号格式不正确");
+                }
+                if (!codePrimary.equals(codeSecond.substring(0, 1))) {
+                    throw ExceptionResultEnum.ERROR.exception("二级维度编号和一级维度编号不对应");
                 }
+
+            }
+            GradePaperDimension gradePaperDimension = new GradePaperDimension();
+            gradePaperDimension.setSchoolId(requestUser.getSchoolId());
+            gradePaperDimension.setPaperNumber(paperNumber);
+            gradePaperDimension.setPaperType(paperType);
+            gradePaperDimension.setPaperName(paperName);
+            gradePaperDimension.setDimensionType(dimensionType);
+            gradePaperDimension.setCodePrimary(codePrimary);
+            gradePaperDimension.setNamePrimary(namePrimary);
+            if (SystemConstant.strNotNull(codeSecond)) {
+                gradePaperDimension.setCodeSecond(codeSecond);
+                gradePaperDimension.setNameSecond(nameSecond);
+            }
+            if (SystemConstant.strNotNull(interpretation)) {
+                gradePaperDimension.setInterpretation(interpretation);
             }
+            gradePaperDimension.insertInfo(requestUser.getId());
+            gradePaperDimensionList.add(gradePaperDimension);
         }
+        return gradePaperDimensionList;
     }
 }

+ 29 - 0
distributed-print-business/src/main/resources/mapper/GradePaperDimensionMapper.xml

@@ -2,6 +2,34 @@
 <!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.GradePaperDimensionMapper">
 
+    <select id="findGradePaperDimensionList"
+            resultType="com.qmth.distributed.print.business.bean.result.analyze.GradePaperDimensionResult">
+        SELECT
+            et.course_code AS courseCode,
+            et.course_name AS courseName,
+            gpd.dimension_type AS dimensionType,
+            gpd.code_primary AS codePrimary,
+            gpd.name_primary AS namePrimary,
+            gpd.code_second AS codeSecond,
+            gpd.name_second AS nameSecond,
+            gpd.interpretation AS interpretation
+        FROM
+            grade_paper_dimension gpd
+                LEFT JOIN
+            exam_task et ON gpd.school_id = et.school_id
+                AND gpd.paper_number = et.paper_number
+        <where>
+            <if test="schoolId != null and schoolId != ''">
+                AND gpd.school_id = #{schoolId}
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                AND gpd.paper_number = #{paperNumber}
+            </if>
+            <if test="paperType != null and paperType != ''">
+                AND gpd.paper_type = #{paperType}
+            </if>
+        </where>
+    </select>
     <select id="findBySchoolIdAndPaperNumberAndPaperType"
             resultType="com.qmth.distributed.print.business.bean.dto.open.PaperDimension">
         SELECT id,
@@ -18,4 +46,5 @@
           and paper_number = #{paperNumber}
           and paper_type = #{paperType}
     </select>
+
 </mapper>

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

@@ -102,6 +102,7 @@ public class SystemConstant {
     public static final String REGULAR_EXPRESSION_OF_CODE = "[a-zA-Z0-9](\\w+)?-?(\\w+)?—?(\\w+)?(\\((\\w+)?-?(\\w+)?—?(\\w+)?\\))?(\\((\\w+)?-?(\\w+)?—?(\\w+)?\\))?(\\w+)?";
     public static final String REGULAR_EXPRESSION_OF_PHONE = "((\\d{3,4})|(\\(\\d{3,4}\\)-))?\\d{7,8}";
     public static final String REGULAR_EXPRESSION_OF_CODE_PRIMARY_DIMENSION = "[A-Z]";
+    public static final String REGULAR_EXPRESSION_OF_CODE_SECOND_DIMENSION = "[A-Z][1-9][0-9]*";
     public static final String SYS_USER = "sysUser";
     public static final String DATA_COUNT = "dataCount";
     public static final List<Long> MENU_MANAGE = Arrays.asList(507L, 508L, 530L, 531L);