Selaa lähdekoodia

fix:知识点导入方法更换

caozixuan 1 vuosi sitten
vanhempi
commit
ab8edf47ad

+ 3 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/CourseDimensionImportDto.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.bean.dto;
 
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
 import com.qmth.teachcloud.common.annotation.ExcelNote;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -13,12 +14,12 @@ import javax.validation.constraints.NotNull;
 public class CourseDimensionImportDto {
 
     @ApiModelProperty("一级知识点内容")
-    @ExcelNote(value = "一级知识点内容")
+    @ExcelColumn(name = "一级知识点内容", index = 0, nullable = true)
     @NotNull
     private String firstDimensionName;
 
     @ApiModelProperty("二级知识点内容")
-    @ExcelNote(value = "二级知识点内容")
+    @ExcelColumn(name = "二级知识点内容", index = 1)
     @NotNull
     private String secondDimensionName;
 

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

@@ -24,8 +24,7 @@ public interface CourseDimensionService extends IService<CourseDimension> {
      * @param file          知识点excel
      * @param teachCourseId 教学课程id
      */
-    void importCourseDimension(SysUser requestUser, MultipartFile file, Long teachCourseId)
-            throws IOException, NoSuchFieldException;
+    void importCourseDimension(SysUser requestUser, MultipartFile file, Long teachCourseId) throws Exception;
 
     /**
      * 同步题库课程知识点属性

+ 11 - 43
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/CourseDimensionServiceImpl.java

@@ -3,7 +3,6 @@ package com.qmth.distributed.print.business.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.google.common.collect.Lists;
 import com.qmth.distributed.print.business.bean.dto.CourseDimensionImportDto;
 import com.qmth.distributed.print.business.bean.dto.CourseDimensionMd5Dto;
 import com.qmth.distributed.print.business.entity.CourseDimension;
@@ -15,25 +14,23 @@ import com.qmth.distributed.print.business.mapper.CourseDimensionMapper;
 import com.qmth.distributed.print.business.service.BasicExamService;
 import com.qmth.distributed.print.business.service.CourseDimensionService;
 import com.qmth.distributed.print.business.service.TeachCourseService;
+import com.qmth.teachcloud.common.bean.result.ExcelResult;
 import com.qmth.teachcloud.common.bean.tiku.TikuCourseProperty;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicExam;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.kit.TikuUtils;
-import com.qmth.teachcloud.common.util.ExcelUtil;
+import com.qmth.teachcloud.common.util.ConvertUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -61,8 +58,7 @@ public class CourseDimensionServiceImpl extends ServiceImpl<CourseDimensionMappe
 
     @Transactional
     @Override
-    public void importCourseDimension(SysUser requestUser, MultipartFile file, Long teachCourseId)
-            throws IOException, NoSuchFieldException {
+    public void importCourseDimension(SysUser requestUser, MultipartFile file, Long teachCourseId) throws Exception {
         Long requestUserId = requestUser.getId();
         Long schoolId = requestUser.getSchoolId();
 
@@ -79,45 +75,17 @@ public class CourseDimensionServiceImpl extends ServiceImpl<CourseDimensionMappe
         }
         Long semesterId = SystemConstant.convertIdToLong(basicExam.getSemesterId());
 
-        List<String> errorMsgList = new ArrayList<>();
-        List<CourseDimensionImportDto> list = new ArrayList<>();
-        ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(CourseDimensionImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
-            for (int i = 0; i < finalExcelList.size(); i++) {
-                LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
-                List<Object> courseDimensionDtoList = excelMap.get(i);
-                // 无数据,跳过
-                if (CollectionUtils.isEmpty(courseDimensionDtoList)) {
-                    continue;
-                }
-                for (int y = 0; y < courseDimensionDtoList.size(); y++) {
-
-                    // 行索引
-                    Integer rowIndex = y + 1;
-                    CourseDimensionImportDto courseDimensionImportDto = (CourseDimensionImportDto) courseDimensionDtoList.get(
-                            y);
-                    String firstDimensionName = StringUtils.trimToNull(courseDimensionImportDto.getFirstDimensionName());
-                    String secondDimensionName = StringUtils.trimToNull(courseDimensionImportDto.getSecondDimensionName());
-
-                    // 本行全部列为空,跳过
-                    if (StringUtils.isAllBlank(firstDimensionName, secondDimensionName)) {
-                        continue;
-                    }
-                    if (!SystemConstant.strNotNull(firstDimensionName)){
-                        errorMsgList.add(String.format("第[%s]行缺少一级知识点内容",rowIndex));
-                    }
-                    list.add(courseDimensionImportDto);
-                }
-            }
-            return finalExcelList;
-        }, 2);
-
-        if (CollectionUtils.isNotEmpty(errorMsgList)) {
-            throw ExceptionResultEnum.ERROR.exception(String.join(";", errorMsgList));
+        ExcelResult<CourseDimensionImportDto> excelResult = ConvertUtil.analyzeExcel(file.getInputStream(),
+                CourseDimensionImportDto.class, false, 1);
+        List<CourseDimensionImportDto> courseDimensionImportDtoList = excelResult.getDatasource();
+        boolean success = excelResult.isSuccess();
+        if (!success) {
+            throw ExceptionResultEnum.ERROR.exception(excelResult.getErrorMsg());
         }
 
         // 处理要新增的考察点
-        Map<String, List<String>> dimensionMap = new HashMap<>();
-        for (CourseDimensionImportDto courseDimensionImportDto : list) {
+        Map<String, List<String>> dimensionMap = new LinkedHashMap<>();
+        for (CourseDimensionImportDto courseDimensionImportDto : courseDimensionImportDtoList) {
             String firstDimensionName = courseDimensionImportDto.getFirstDimensionName();
             if (!SystemConstant.strNotNull(firstDimensionName)) {
                 throw ExceptionResultEnum.ERROR.exception("excel中存在没有填写的一级知识点");

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

@@ -47,7 +47,6 @@
     <select id="findTeacherTeamPage" resultType="com.qmth.teachcloud.common.bean.result.TeacherTeamResult">
         SELECT
             tc.id,
-            tc.basic_course_id as basicCourseId,
             tc.user_id as userId,
             su.real_name as userName,
             su.code as userCode,

+ 1 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/CourseTargetController.java

@@ -82,8 +82,7 @@ public class CourseTargetController {
     @ApiResponses({ @ApiResponse(code = 200, message = "返回信息", response = Result.class) })
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.IMPORT)
     public Result courseDimensionImportSync(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
-            @ApiParam(value = "教学课程id") @RequestParam(required = false) String teachCourseId)
-            throws IOException, NoSuchFieldException {
+            @ApiParam(value = "教学课程id") @RequestParam(required = false) String teachCourseId) throws Exception {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         courseDimensionService.importCourseDimension(requestUser, file, SystemConstant.convertIdToLong(teachCourseId));
         return ResultUtil.ok();

+ 11 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/ExcelResult.java

@@ -17,6 +17,9 @@ public class ExcelResult<T> {
     @ApiModelProperty("是否成功")
     private boolean success;
 
+    @ApiModelProperty("报错信息")
+    private String errorMsg;
+
     public List<T> getDatasource() {
         return datasource;
     }
@@ -32,4 +35,12 @@ public class ExcelResult<T> {
     public void setSuccess(boolean success) {
         this.success = success;
     }
+
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
 }

+ 1 - 12
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/TeacherTeamResult.java

@@ -10,14 +10,11 @@ import io.swagger.annotations.ApiModelProperty;
  * @Date: 2023-03-17
  */
 public class TeacherTeamResult {
+
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "教师团队id")
     private Long id;
 
-    @JsonSerialize(using = ToStringSerializer.class)
-    @ApiModelProperty(value = "基础课程id")
-    private Long basicCourseId;
-
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "教师id")
     private Long userId;
@@ -42,14 +39,6 @@ public class TeacherTeamResult {
         this.id = id;
     }
 
-    public Long getBasicCourseId() {
-        return basicCourseId;
-    }
-
-    public void setBasicCourseId(Long basicCourseId) {
-        this.basicCourseId = basicCourseId;
-    }
-
     public Long getUserId() {
         return userId;
     }

+ 20 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/ConvertUtil.java

@@ -25,6 +25,7 @@ import java.lang.reflect.Field;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 /**
@@ -149,6 +150,8 @@ public class ConvertUtil {
         ExcelReader excelReader = ExcelReader.create(ExcelType.XLSX, inputStream, columnNameRow);
         List<String[]> excelDatasource = excelReader.getDataArrayList();
         List<T> dtoList = new ArrayList<>();
+        List<String> errorMsgList = new ArrayList<>();
+        AtomicInteger rowIndex = new AtomicInteger(columnNameRow + 1);
         if (CollectionUtils.isNotEmpty(excelDatasource)) {
             List<String> columnNameList = Arrays.asList(excelReader.getColumnNames());
             Field[] fields = clazz.getDeclaredFields();
@@ -166,14 +169,24 @@ public class ConvertUtil {
             List<Field> fieldList = Arrays.stream(fields).filter(field -> {
                 ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
                 return Objects.nonNull(annotation);
-            }).collect(Collectors.toList());
+            }).sorted(Comparator.comparingInt(o -> o.getAnnotation(ExcelColumn.class).index())).collect(Collectors.toList());
             List<String> fieldNameList = fieldList.stream().map(e -> e.getAnnotation(ExcelColumn.class).name()).collect(Collectors.toList());
 
+            // 表头判断
             if (columnNameList.size() != fieldNameList.size()) {
                 throw ExceptionResultEnum.ERROR.exception(String.format("表头错误,应为[%s]", String.join(";", fieldNameList)));
             }
+            for (int i = 0; i < columnNameList.size(); i++) {
+                if (!Objects.equals(columnNameList.get(i), fieldNameList.get(i))) {
+                    throw ExceptionResultEnum.ERROR.exception(
+                            String.format("表头错误,应为[%s]", String.join(";", fieldNameList)));
+                }
+            }
+
+            // 解析
             for (String[] cell : excelDatasource) {
                 T dto = clazz.newInstance();
+                int index = rowIndex.incrementAndGet();
                 boolean emptyCell = true;
                 List<String> excelErrorList = new ArrayList<>();
                 for (int i = 0; i < cell.length; i++) {
@@ -195,10 +208,12 @@ public class ConvertUtil {
                 if (CollectionUtils.isNotEmpty(excelErrorList)) {
                     // 有异常数据
                     analyzeResult = false;
+                    String errorMsg = String.join(",", excelErrorList);
                     if (fillError && Objects.nonNull(errorField)) {
                         errorField.setAccessible(true);
-                        errorField.set(dto, String.join(",", excelErrorList));
+                        errorField.set(dto, errorMsg);
                     }
+                    errorMsgList.add(String.format("第[%s]行异常:[%s]", index, errorMsg));
                 }
                 dtoList.add(dto);
             }
@@ -206,6 +221,9 @@ public class ConvertUtil {
         ExcelResult<T> excelResult = new ExcelResult<>();
         excelResult.setSuccess(analyzeResult);
         excelResult.setDatasource(dtoList);
+        if (CollectionUtils.isNotEmpty(errorMsgList)) {
+            excelResult.setErrorMsg(String.join(";\n", errorMsgList));
+        }
         return excelResult;
     }