|
@@ -1,45 +1,55 @@
|
|
|
package com.qmth.teachcloud.common.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
import com.qmth.boot.api.exception.ApiException;
|
|
|
import com.qmth.teachcloud.common.base.BaseEntity;
|
|
|
import com.qmth.teachcloud.common.bean.dto.BasicStudentExportDto;
|
|
|
import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
|
|
|
import com.qmth.teachcloud.common.bean.dto.TaskPrintClassDto;
|
|
|
import com.qmth.teachcloud.common.bean.dto.excel.BasicStudentImportDto;
|
|
|
+import com.qmth.teachcloud.common.bean.dto.excel.DescribeImportDto;
|
|
|
import com.qmth.teachcloud.common.bean.dto.excel.export.BasicStudentErrorExportDto;
|
|
|
import com.qmth.teachcloud.common.bean.params.BasicClazzParams;
|
|
|
import com.qmth.teachcloud.common.bean.params.BasicMajorParams;
|
|
|
import com.qmth.teachcloud.common.bean.params.BasicStudentExtrasParam;
|
|
|
import com.qmth.teachcloud.common.bean.params.BasicStudentParams;
|
|
|
import com.qmth.teachcloud.common.bean.result.BasicStudentResult;
|
|
|
+import com.qmth.teachcloud.common.bean.vo.FilePathVo;
|
|
|
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
|
|
|
import com.qmth.teachcloud.common.contant.SystemConstant;
|
|
|
import com.qmth.teachcloud.common.entity.*;
|
|
|
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
|
|
|
-import com.qmth.teachcloud.common.enums.TeachBasicEnum;
|
|
|
+import com.qmth.teachcloud.common.enums.*;
|
|
|
import com.qmth.teachcloud.common.mapper.BasicStudentMapper;
|
|
|
import com.qmth.teachcloud.common.service.*;
|
|
|
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.lang3.StringUtils;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
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;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.text.MessageFormat;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
import java.util.stream.Collectors;
|
|
|
import java.util.stream.Stream;
|
|
|
|
|
@@ -59,11 +69,14 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
|
|
|
private BasicClazzService basicClazzService;
|
|
|
@Resource
|
|
|
private BasicMajorService basicMajorService;
|
|
|
-
|
|
|
@Resource
|
|
|
private SysOrgService sysOrgService;
|
|
|
@Resource
|
|
|
private BasicRoleDataPermissionService basicRoleDataPermissionService;
|
|
|
+ @Resource
|
|
|
+ private FileUploadService fileUploadService;
|
|
|
+ @Resource
|
|
|
+ private TBTaskService tbTaskService;
|
|
|
|
|
|
|
|
|
@Override
|
|
@@ -367,6 +380,207 @@ public class BasicStudentServiceImpl extends ServiceImpl<BasicStudentMapper, Bas
|
|
|
ExcelUtil.excelExport("学生数据", BasicStudentExportDto.class, studentExportDtos, response);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public boolean importBasicStudent(Map<String, Object> map, MultipartFile file) {
|
|
|
+ SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
+
|
|
|
+ TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
|
|
|
+ List<BasicStudent> basicStudentList = new ArrayList<>();
|
|
|
+ List<BasicStudentErrorExportDto> errorDataList = new ArrayList<>();
|
|
|
+ AtomicInteger totalInteger = new AtomicInteger(0);
|
|
|
+ try {
|
|
|
+ tbTask.setStatus(TaskStatusEnum.RUNNING);
|
|
|
+ tbTaskService.updateById(tbTask);
|
|
|
+ checkImportBasicStudent(file, basicStudentList, errorDataList, totalInteger, sysUser);
|
|
|
+
|
|
|
+ if(CollectionUtils.isNotEmpty(basicStudentList)){
|
|
|
+ this.saveBatch(basicStudentList);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ } finally {
|
|
|
+ if (CollectionUtils.isNotEmpty(errorDataList)) {
|
|
|
+ tbTask.setResult(TaskResultEnum.ERROR);
|
|
|
+ try {
|
|
|
+ File excelFileTemp = SystemConstant.getFileTempVar(SystemConstant.EXCEL_PREFIX);
|
|
|
+ ExcelUtil.excelExportLocal(excelFileTemp, BasicStudentErrorExportDto.class, errorDataList);
|
|
|
+ String fileName = SystemConstant.getNanoId() + SystemConstant.EXCEL_PREFIX;
|
|
|
+ FilePathVo filePathVo = fileUploadService.uploadFile(excelFileTemp, UploadFileEnum.FILE, fileName);
|
|
|
+ tbTask.setErrorFilePath(JSON.toJSONString(filePathVo));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("创建学生导入错误数据文件失败");
|
|
|
+ } finally {
|
|
|
+ tbTask.setSummary(JSON.toJSONString(errorDataList));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ tbTask.setResult(TaskResultEnum.SUCCESS);
|
|
|
+ }
|
|
|
+ tbTask.setStatus(TaskStatusEnum.FINISH);
|
|
|
+ tbTaskService.updateById(tbTask);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void checkImportBasicStudent(MultipartFile file, List<BasicStudent> basicStudentList, List<BasicStudentErrorExportDto> errorDataList, AtomicInteger totalInteger, SysUser sysUser) throws IOException, NoSuchFieldException {
|
|
|
+ // 查询所有学院map
|
|
|
+ List<SysOrg> sysOrgList = sysOrgService.findCollegeLevelOrgList(sysUser.getSchoolId());
|
|
|
+ Map<String, Long> collegeMap = CollectionUtils.isEmpty(sysOrgList) ? new HashMap<>() : sysOrgList.stream().collect(Collectors.toMap(SysOrg::getName, SysOrg::getId));
|
|
|
+ // 查询所有专业map
|
|
|
+ List<BasicMajor> basicMajorList = basicMajorService.list(new QueryWrapper<BasicMajor>().lambda().eq(BasicMajor::getSchoolId, sysUser.getSchoolId()));
|
|
|
+ Map<String, Long> majorMap = CollectionUtils.isEmpty(basicMajorList) ? new HashMap<>() : basicMajorList.stream().collect(Collectors.toMap(k -> k.getBelongOrgId() + SystemConstant.HYPHEN + k.getName(), BaseEntity::getId));
|
|
|
+ // 查询所有班级map
|
|
|
+ List<BasicClazz> basicClazzList = basicClazzService.list(new QueryWrapper<BasicClazz>().lambda().eq(BasicClazz::getSchoolId, sysUser.getSchoolId()));
|
|
|
+ Map<String, Long> clazzMap = CollectionUtils.isEmpty(basicClazzList) ? new HashMap<>() : basicClazzList.stream().collect(Collectors.toMap(k -> k.getMajorId() + SystemConstant.HYPHEN + k.getClazzName(), BaseEntity::getId));
|
|
|
+
|
|
|
+ // 顶级机构(学校级)
|
|
|
+ Long rootSchoolOrgId = sysOrgService.findRootOrg(sysUser.getSchoolId()).getId();
|
|
|
+
|
|
|
+ ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(BasicStudentImportDto.class, DescribeImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
|
|
|
+ Map<String, Integer> checkCodeMap = new HashMap<>();
|
|
|
+ for (int i = 0; i < finalExcelList.size(); i++) {
|
|
|
+ LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
|
|
|
+ List<Object> basicStudentImportDtoList = excelMap.get(i);
|
|
|
+ // 无数据,跳过
|
|
|
+ if (CollectionUtils.isEmpty(basicStudentImportDtoList)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ for (int y = 0; y < basicStudentImportDtoList.size(); y++) {
|
|
|
+ // 计算总数量
|
|
|
+ totalInteger.getAndIncrement();
|
|
|
+
|
|
|
+ // 行索引
|
|
|
+ Integer rowIndex = y + 1;
|
|
|
+ BasicStudentImportDto basicStudentImportDto = (BasicStudentImportDto) basicStudentImportDtoList.get(y);
|
|
|
+ String studentName = StringUtils.trimToNull(basicStudentImportDto.getStudentName());
|
|
|
+ String studentCode = StringUtils.trimToNull(basicStudentImportDto.getStudentCode());
|
|
|
+ String collegeName = StringUtils.trimToNull(basicStudentImportDto.getCollegeName());
|
|
|
+ String majorName = StringUtils.trimToNull(basicStudentImportDto.getMajorName());
|
|
|
+ String clazzName = StringUtils.trimToNull(basicStudentImportDto.getClazzName());
|
|
|
+
|
|
|
+ // 本行全部列为空,跳过
|
|
|
+ if (StringUtils.isAllBlank(studentName, studentCode, collegeName, majorName, clazzName)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ basicStudentImportDto.setRowIndex(rowIndex);
|
|
|
+ BasicStudentErrorExportDto basicStudentErrorExportDto = new BasicStudentErrorExportDto();
|
|
|
+ BeanUtils.copyProperties(basicStudentImportDto, basicStudentErrorExportDto);
|
|
|
+
|
|
|
+ // excel内校验
|
|
|
+ List<String> errorMsgList = new ArrayList<>();
|
|
|
+ // 必填字段校验
|
|
|
+ String errorStringEmpty = ExcelUtil.checkExcelField(basicStudentImportDto);
|
|
|
+ if (errorStringEmpty.length() > 0) {
|
|
|
+ errorMsgList.add(errorStringEmpty);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!studentCode.matches(SystemConstant.REGULAR_EXPRESSION_OF_CODE1)) {
|
|
|
+ errorMsgList.add("学号[" + studentCode + "]只能是字母或数字");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检验学号
|
|
|
+ if (checkCodeMap.containsKey(studentCode)) {
|
|
|
+ Integer studentCodeCount = checkCodeMap.get(studentCode);
|
|
|
+ errorMsgList.add(String.format("学号[%s]有[%d]行数据", studentCode, studentCodeCount));
|
|
|
+ checkCodeMap.put(studentCode, studentCodeCount + 1);
|
|
|
+ } else {
|
|
|
+ checkCodeMap.put(studentCode, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(CollectionUtils.isNotEmpty(errorMsgList)){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 院专班数据校验
|
|
|
+ // 1.学院
|
|
|
+ if (!collegeMap.containsKey(collegeName)) {
|
|
|
+ try {
|
|
|
+ SysOrg sysOrg = new SysOrg(sysUser.getSchoolId(), collegeName, rootSchoolOrgId);
|
|
|
+ sysOrgService.saveOrg(sysOrg, sysUser);
|
|
|
+ collegeMap.put(collegeName, sysOrg.getId());
|
|
|
+ } catch (Exception e) {
|
|
|
+ errorMsgList.add("创建学院[" + collegeName + "]失败");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Long collegeId = collegeMap.get(collegeName);
|
|
|
+ if (collegeId == null) {
|
|
|
+ errorMsgList.add("学号[" + studentCode + "]的考生,学院查询失败");
|
|
|
+ errorDataList.add(basicStudentErrorExportDto);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2.专业
|
|
|
+ String majorKey = collegeId + SystemConstant.HYPHEN + majorName;
|
|
|
+ if (!majorMap.containsKey(majorKey)) {
|
|
|
+ // 新增一个major
|
|
|
+ try {
|
|
|
+ BasicMajorParams basicMajorParams = new BasicMajorParams();
|
|
|
+ basicMajorParams.setMajorName(majorName);
|
|
|
+ basicMajorParams.setCollegeId(collegeId);
|
|
|
+ Long majorId = basicMajorService.saveBasicMajor(basicMajorParams, sysUser);
|
|
|
+ majorMap.put(majorKey, majorId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ errorMsgList.add("创建专业[" + majorName + "]失败");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ Long majorId = majorMap.get(majorKey);
|
|
|
+ if (majorId == null) {
|
|
|
+ errorMsgList.add("学号[" + studentCode + "]的考生,专业查询失败");
|
|
|
+ errorDataList.add(basicStudentErrorExportDto);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3.班级
|
|
|
+ String clazzKey = majorId + SystemConstant.HYPHEN + clazzName;
|
|
|
+ if (!clazzMap.containsKey(clazzKey)) {
|
|
|
+ // 新增一个clazz
|
|
|
+ try {
|
|
|
+ BasicClazzParams basicClazzParams = new BasicClazzParams();
|
|
|
+ basicClazzParams.setMajorId(majorId);
|
|
|
+ basicClazzParams.setClazzName(clazzName);
|
|
|
+ Long clazzId = basicClazzService.saveBasicClazz(basicClazzParams, sysUser);
|
|
|
+ clazzMap.put(clazzKey, clazzId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ errorMsgList.add("创建班级[" + clazzName + "]失败");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ Long clazzId = clazzMap.get(clazzKey);
|
|
|
+ if (clazzId == null) {
|
|
|
+ errorMsgList.add("学号[" + studentCode + "]的考生,班级查询失败");
|
|
|
+ errorDataList.add(basicStudentErrorExportDto);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 学生信息组装
|
|
|
+ BasicStudentParams basicStudentParams = new BasicStudentParams();
|
|
|
+ basicStudentParams.setStudentName(studentName);
|
|
|
+ basicStudentParams.setStudentCode(studentCode);
|
|
|
+ basicStudentParams.setCollegeId(collegeId);
|
|
|
+ basicStudentParams.setMajorId(majorId);
|
|
|
+ basicStudentParams.setClazzId(clazzId);
|
|
|
+ try {
|
|
|
+ BasicStudent basicStudent = this.editEntityHelp(basicStudentParams, sysUser);
|
|
|
+ basicStudentList.add(basicStudent);
|
|
|
+ } catch (Exception e) {
|
|
|
+ errorMsgList.add("学生保存失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 错误
|
|
|
+ if (CollectionUtils.isNotEmpty(errorMsgList)) {
|
|
|
+ basicStudentErrorExportDto.setErrorMsg(JSON.toJSONString(errorMsgList));
|
|
|
+ errorDataList.add(basicStudentErrorExportDto);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return finalExcelList;
|
|
|
+ }, 2);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 学生保存助手方法(应对学生保存和导入批量保存)
|
|
|
*
|