Эх сурвалжийг харах

[bug]考务数据导入优化

caozixuan 4 жил өмнө
parent
commit
9d9145fe90

+ 15 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/annotation/ExcelDBFieldDesc.java

@@ -0,0 +1,15 @@
+package com.qmth.distributed.print.business.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * @Description: excel导入考务数据数据库必填属性描述
+ * @Author: CaoZixuan
+ * @Date: 2021-04-26
+ */
+@Retention(RetentionPolicy.RUNTIME) //定义注解运行策略
+public @interface ExcelDBFieldDesc {
+    String name(); //属性名称
+    int length() default 0; //属性接收长度限制默认0,为0的不校验长度
+}

+ 13 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExaminationImportDto.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.bean.dto;
 
+import com.qmth.distributed.print.business.annotation.ExcelDBFieldDesc;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
@@ -12,30 +13,39 @@ import java.util.List;
 public class ExaminationImportDto {
 
     @ApiModelProperty(value = "学号")
+    @ExcelDBFieldDesc(name = "学号",length = 10)
     private String studentCode;
 
-    @ApiModelProperty(value = "学生姓名")
+    @ApiModelProperty(value = "姓名")
+    @ExcelDBFieldDesc(name = "姓名",length = 15)
     private String studentName;
 
     @ApiModelProperty(value = "课程代码")
+    @ExcelDBFieldDesc(name = "课程代码",length = 10)
     private String courseCode;
 
     @ApiModelProperty(value = "课程名称")
+    @ExcelDBFieldDesc(name = "课程名称",length = 20)
     private String courseName;
 
-    @ApiModelProperty(value = "考场")
+    @ApiModelProperty(value = "考点")
+    @ExcelDBFieldDesc(name = "考点",length = 10)
     private String examPlace;
 
-    @ApiModelProperty(value = "考点")
+    @ApiModelProperty(value = "考场")
+    @ExcelDBFieldDesc(name = "考场",length = 10)
     private String examRoom;
 
     @ApiModelProperty(value = "考试日期")
+    @ExcelDBFieldDesc(name = "考试日期")
     private String examDate;
 
     @ApiModelProperty(value = "考试时间")
+    @ExcelDBFieldDesc(name = "考试时间")
     private String examTime;
 
     @ApiModelProperty(value = "试卷编号")
+    @ExcelDBFieldDesc(name = "试卷编号",length = 15)
     private String paperNumber;
 
     @ApiModelProperty(value = "备选字段集合")

+ 0 - 57
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/ExaminationDBFieldsEnum.java

@@ -1,57 +0,0 @@
-package com.qmth.distributed.print.business.enums;
-
-import com.qmth.distributed.print.business.enums.result.EnumResult;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @Description: 考务数据导入-数据库所必须字段枚举
- * @Author: CaoZixuan
- * @Date: 2021-04-20
- */
-public enum ExaminationDBFieldsEnum {
-    STUDENT_CODE("学号", "studentCode", 10),
-    STUDENT_NAME("姓名", "studentName", 15),
-    COURSE_CODE("课程代码", "courseCode", 10),
-    COURSE_NAME("课程名称", "courseName", 20),
-    EXAM_PLACE("考点", "examPlace", 10),
-    EXAM_ROOM("考场", "examRoom", 10),
-    EXAM_DATE("考试日期", "examDate", 0),
-    EXAM_TIME("考试时间", "examTime", 0),
-    PAPER_NUMBER("试卷编号", "paperNumber", 15);
-    private final String desc;
-    private final String code;
-    private final int length;
-
-    ExaminationDBFieldsEnum(String desc, String code, int length) {
-        this.desc = desc;
-        this.code = code;
-        this.length = length;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public int getLength() {
-        return length;
-    }
-
-    public static List<EnumResult> listTypes() {
-        List<EnumResult> list = new ArrayList<>();
-        for (ExaminationDBFieldsEnum value : ExaminationDBFieldsEnum.values()) {
-            EnumResult result = new EnumResult();
-            result.setName(value.name());
-            result.setOrdinal(value.ordinal());
-            result.setCode(value.getCode());
-            result.setDesc(value.getDesc());
-            list.add(result);
-        }
-        return list;
-    }
-}

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/RequiredFieldsEnum.java

@@ -6,7 +6,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * 考务必选字段
+ * 考务必选字段(此枚举类中的字段必须在ExaminationImportDto类中有对应的属性code作为属性名,同时该属性必须加@ExcelDBFieldDesc注解,且name必须和desc对应)
  * @Date: 2021/3/29.
  */
 public enum RequiredFieldsEnum {

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

@@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.distributed.print.business.base.BaseEntity;
 import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 import com.qmth.distributed.print.business.bean.result.ExaminationDetailResult;
@@ -15,7 +14,6 @@ import com.qmth.distributed.print.business.bean.result.ExaminationResult;
 import com.qmth.distributed.print.business.bean.result.SummarizedDataResult;
 import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
-import com.qmth.distributed.print.business.enums.ExaminationDBFieldsEnum;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.enums.TaskTypeEnum;
 import com.qmth.distributed.print.business.mapper.ExamDetailMapper;
@@ -25,7 +23,6 @@ import com.qmth.distributed.print.business.util.ConvertUtil;
 import com.qmth.distributed.print.business.util.ServletUtil;
 import com.qmth.distributed.print.common.contant.SystemConstant;
 import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.HorizontalAlignment;
 import org.apache.poi.xssf.usermodel.*;
 import org.slf4j.Logger;

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

@@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.aliyun.oss.common.utils.BinaryUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.annotation.ExcelDBFieldDesc;
 import com.qmth.distributed.print.business.bean.dto.ExaminationExportDto;
 import com.qmth.distributed.print.business.bean.dto.ExaminationImportDto;
 import com.qmth.distributed.print.business.bean.dto.FieldsDto;
@@ -411,6 +412,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             String cellValue = String.valueOf(ExcelUtil.convert(head.getCell(i)));
             for (FieldsDto fieldsDto : fieldsDtoList) {
                 if (cellValue.equals(fieldsDto.getName())) {
+                    // 如果通用规则必填字段和excel表头匹配上了,则为该必选字段设置其在excel中的索引
                     fieldsDto.setIndex(i);
                 }
             }
@@ -431,6 +433,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             List<FieldsDto> secondaryFieldList = new ArrayList<>(); // 备选字段
 
             ExaminationImportDto examinationImportDto = new ExaminationImportDto();
+            Field[] examinationImportDtoFields = examinationImportDto.getClass().getDeclaredFields();
             for (FieldsDto fieldsDto : fieldsDtoList) {
                 boolean match = false;
                 String name = fieldsDto.getName();
@@ -447,18 +450,22 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                     throw ExceptionResultEnum.ERROR.exception("excel中第[" + (r + 1) + "]行,第[" + (index + 1) + "]列,字段[" + name + "]必填");
                 }
 
-                for (ExaminationDBFieldsEnum value : ExaminationDBFieldsEnum.values()) {
-                    String dbName = value.getDesc();
-                    String dbCode = value.getCode();
-                    int dbLength = value.getLength();
-                    if (dbName.equals(name)) {
+                for (Field examinationImportDtoField : examinationImportDtoFields) {
+                    ExcelDBFieldDesc excelDBFieldDesc = examinationImportDtoField.getAnnotation(ExcelDBFieldDesc.class);
+                    if (excelDBFieldDesc == null){
+                        // 如果没有注解,说明该数据库必须字段不是从excel中获得的,直接跳过
+                        continue;
+                    }
+
+                    // 如果数据库字段中文名和必填字段中文名称对应,则通过反射为数据库必选字段赋值
+                    String dbName = excelDBFieldDesc.name();
+                    int dbLength = excelDBFieldDesc.length();
+                    if (dbName.equals(name)){
                         if (dbLength > 0) {
                             ConvertUtil.verifyLength(cellValue, dbLength, dbName);
                         }
-                        // 使用反射 -> 根据db枚举类的code字段为对应的dbDto类中的对应属性赋值(因此要求枚举必须被dto类包含)
-                        Field field = examinationImportDto.getClass().getDeclaredField(dbCode);
-                        field.setAccessible(true);
-                        field.set(examinationImportDto, cellValue);
+                        examinationImportDtoField.setAccessible(true);
+                        examinationImportDtoField.set(examinationImportDto,cellValue);
                         match = true;
                         break;
                     }
@@ -492,6 +499,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             examinationImportDto.setPrintPlanName(printPlanName);
             examinationImportDtoList.add(examinationImportDto);
         }
+
         System.out.println(JSON.toJSONString(examinationImportDtoList));
 
         // 校验课程代码和试卷编号在印刷计划下是1对1的关系

+ 0 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/EnumsController.java

@@ -101,9 +101,6 @@ public class EnumsController {
         } else if (type.equals(EnumType.EXAM_DETAIL_STATUS_ENUM.name())){
             // 考场状态
             list = ExamDetailStatusEnum.listTypes();
-        } else if (type.equals(EnumType.EXAMINATION_DB_FIELDS_ENUM.name())){
-            // 考务数据导入-数据库所必须字段枚举
-            list = ExaminationDBFieldsEnum.listTypes();
         }
         return ResultUtil.ok(list);
     }