From bacc0494edd2d5f9f184872309bd18365c0d65d8 Mon Sep 17 00:00:00 2001 From: xiejunyu Date: Fri, 13 May 2022 16:59:40 +0800 Subject: [PATCH] =?UTF-8?q?bug51965=20=E5=8F=91=E5=B8=83=E6=9C=AA=E8=A2=AB?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectRelatedPersonnelController.java | 14 +- .../IProjectRelatedPersonnelService.java | 8 +- .../ProjectRelatedPersonnelServiceImpl.java | 544 +++++++++++------- 3 files changed, 337 insertions(+), 229 deletions(-) diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectRelatedPersonnelController.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectRelatedPersonnelController.java index 2d4e90fec..b01a8aebc 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectRelatedPersonnelController.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/controller/ProjectRelatedPersonnelController.java @@ -9,13 +9,16 @@ import com.jero.modules.system.entity.SysUser; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -158,17 +161,16 @@ public class ProjectRelatedPersonnelController extends JeroController importExcel(HttpServletRequest request, HttpServletResponse response, - @RequestParam(name="projectId",required=true) String projectId, - @RequestParam(name="cut",required=true) String cut) { - return projectRelatedPersonnelService.importExcel(request, response, ProjectRelatedPersonnel.class,projectId,cut); + public Result importExcel(MultipartFile file, + @RequestParam(name="projectId",required=true) String projectId, + @RequestParam(name="cut",required=true) String cut) throws IOException, InvalidFormatException { + String message = projectRelatedPersonnelService.importExcel(file, ProjectRelatedPersonnel.class, projectId, cut); + return Result.OK(message); } /** diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectRelatedPersonnelService.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectRelatedPersonnelService.java index 450fbb3f0..b1961c559 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectRelatedPersonnelService.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/IProjectRelatedPersonnelService.java @@ -1,12 +1,14 @@ package com.jero.modules.project.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.jero.common.api.vo.Result; import com.jero.modules.project.entity.ProjectRelatedPersonnel; import com.jero.modules.system.entity.SysUser; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -78,10 +80,10 @@ public interface IProjectRelatedPersonnelService extends IService importExcel(HttpServletRequest request, HttpServletResponse response, Class clazz, String projectId,String cut); + String importExcel(MultipartFile file, Class clazz, String projectId, String cut) throws IOException, InvalidFormatException; - List oppositeDisposeData(List records,String projectId,String cut); + String oppositeDisposeData(List records, String projectId, String cut); ProjectRelatedPersonnel queryByProjectIdAndDutyTerritory(String projectId, String dutyTerritory); diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectRelatedPersonnelServiceImpl.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectRelatedPersonnelServiceImpl.java index 655369505..4466cbb53 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectRelatedPersonnelServiceImpl.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/service/impl/ProjectRelatedPersonnelServiceImpl.java @@ -1,14 +1,12 @@ package com.jero.modules.project.service.impl; -import cn.afterturn.easypoi.excel.ExcelImportUtil; -import cn.afterturn.easypoi.excel.entity.ImportParams; 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.jero.common.api.vo.Result; import com.jero.common.constant.enums.CutEnum; import com.jero.common.exception.JeroBootException; import com.jero.common.system.vo.LoginUser; +import com.jero.modules.dummy.service.impl.DummyInventoryInfoEOServiceImpl; import com.jero.modules.enums.DictCodeEnum; import com.jero.modules.project.entity.ProjectRelatedPersonnel; import com.jero.modules.project.mapper.ProjectRelatedPersonnelMapper; @@ -27,17 +25,14 @@ import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.HorizontalAlignment; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -75,6 +70,9 @@ public class ProjectRelatedPersonnelServiceImpl extends ServiceImpl importExcel(HttpServletRequest request, HttpServletResponse response, - Class clazz,String projectId,String cut) { - Result result=new Result<>(); - MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; - Map fileMap = multipartRequest.getFileMap(); - for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 - ImportParams params = new ImportParams(); - params.setTitleRows(1); - params.setHeadRows(1); - params.setNeedSave(true); - try { - //接收导入数据 - List records = ExcelImportUtil.importExcel(file.getInputStream(), clazz, params); - if(CollectionUtils.isNotEmpty(records)) { - oppositeDisposeData(records,projectId,cut); + public String importExcel(MultipartFile file, + Class clazz, String projectId, String cut) throws IOException, InvalidFormatException { - //中英切换提示语 - if(CutEnum.CN.getValue().equals(cut)) { - result.success("文件导入成功!数据行数:" + records.size()); + String explainInfo= null; + String titleOne = ""; + + if(CutEnum.CN.getValue().equals(cut)){ + titleOne = "*责任领域,*法规工程师,*工程接口人,*认证工程师,备注"; + explainInfo = "填写说明\n" + + "1.导入数据从第三行开始\n" + + "2.所有带*号的字段必须填写\n"+ + "3.认证类型,认证级别,实施类别,交付物类型,发起人,责任人,字段是单选属性,必须和系统中的对应字段选项相匹配\n" + + "4.责任领域,字段是多选属性,必须和系统中的对应字段选项相匹配,填写多个时采用英文或中文逗号分割\n" + + "5.编号,子标题,WVTA ID,备注,填写文本内容\n" + + "6.交付物模板字段为文件属性,填写时需要在本文件同级目录下以标准号为名称建立文件夹,并在文件夹下放置文件,假设在AAA标准号下放置了B.docx,则应填写AAA/B.docx"; + }else{ + titleOne = "*Responsible Field,*Regulation Engineer,*Engineering Interface,*Homologation Engineer,Comments"; + explainInfo = "filling explanation\n" + + "1.import data starts at the third line\n" + + "2.all fields marked with * must be filled in\n"+ + "3.certification type,certification level,implementation category,type of deliverables,initiator,person liable,Fields are radio attributes that must match the corresponding field option in the system\n" + + "4.area of responsibility, field is a multi-select attribute and must match the corresponding field in the system. If multiple fields are filled in, separate them by commas (,)\n" + + "5.serial number,subtitle,WVTA ID,remarks,Fill in the text\n" + + "6.deliverable template,When filling in the field, you need to create a folder in the directory of the same level as the file with the name of the standard number and place the file in the folder. If b. diocx is stored under the AAA standard number, enter AAA/B. diocx"; + } + List titleOneList = Arrays.asList(titleOne.split(",")); + + + // 获取文件名 + String fileName = file.getOriginalFilename(); + // 获取文件后缀 + String prefix = fileName.substring(fileName.lastIndexOf(".")); + File excelFile = File.createTempFile(fileName, prefix); + file.transferTo(excelFile); + + Workbook workbook = WorkbookFactory.create(excelFile); + List list = new ArrayList<>(); + if (workbook != null) { + Sheet sheet = workbook.getSheetAt(0); + if (sheet != null) { + int rowNos = sheet.getPhysicalNumberOfRows();// 得到excel的总记录条数 + + for (int i = 0; i < rowNos ; i++) { + Row row = sheet.getRow(i); + Row headerRow = sheet.getRow(i); + boolean isBlank = dummyInventoryInfoEOService.isRowEmpty(row); + + if (row != null && !isBlank) { + int columNos = headerRow.getLastCellNum();// 表头总共的列数 + if (columNos == 5) {//列数对 + for (int j = 0; j < columNos; j++) { + Cell cell = row.getCell(j,Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); + if (i == 0){ + if (i == 0 && !cell.getStringCellValue().equals(titleOneList.get(j))) {//检查表头 + if (CutEnum.CN.getValue().equals(cut)) { + throw new JeroBootException("读取失败.请检查第 " + (i+1) + " 行表头,请严格按照模板文件导入数据"); + } else { + throw new JeroBootException("The data fails to be read.Please check header in line " + (i+1) + " .Import data strictly according to the template file."); + } + } + } + } + }else if((i!=1 && columNos != 5) || (i==2 && columNos !=1)){ + if (CutEnum.CN.getValue().equals(cut)) { + throw new JeroBootException("导入的列数不对,请检查"); + } else { + throw new JeroBootException("The number of imported columns is wrong. Please check!"); + } + } }else{ - result.success("File import succeeded! Number of data rows:" + records.size()); + if (CutEnum.CN.getValue().equals(cut)) { + throw new JeroBootException("导入的数据不能为空,请检查"); + } else { + throw new JeroBootException("The imported data of cannot be empty. Please check!"); + } } - }else{ - //中英切换提示语 - if(CutEnum.CN.getValue().equals(cut)) { - result.error500("数据为空,请检查"); - }else { - result.error500("The data is empty, please check!"); + if (i == 1) {//校验填写说明 + row = sheet.getRow(i); + int columNos = row.getLastCellNum(); + if(columNos != 1 /*|| (!row.getCell(0).getStringCellValue().equals(explainInfo))*/){ + if (CutEnum.CN.getValue().equals(cut)) { + throw new JeroBootException("填写说明列数不对,请严格按照模板文件导入数据"); + }else{ + throw new JeroBootException("The number of columns of filling explanation is wrong. Please import data strictly according to the template file."); + } + } + + } + if (i > 1) {//读取数据 + //获取每一行数据 + row = sheet.getRow(i); + ProjectRelatedPersonnel projectRelatedPersonnel = new ProjectRelatedPersonnel(); + + //责任领域不能为空 + String dutyTerritory = row.getCell(0).toString(); + if(StringUtils.isNotBlank(dutyTerritory)) { + projectRelatedPersonnel.setDutyTerritory(row.getCell(0).toString()); + }else{//责任领域不能为空,报错 + if(CutEnum.CN.getValue().equals(cut)){ + throw new JeroBootException("请填写责任领域,带*的为必填.请检查第 "+ (i+1) + "行"); + }else{ + throw new JeroBootException("Please fill in the Responsible Field and those marked with * are required. .Please check line" + (i+1)); + } + } + + String lawEngineerName = row.getCell(1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).toString(); + String engineeringInterfacePersonName = row.getCell(2, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).toString(); + String certificationEngineerName = row.getCell(3,Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).toString(); + + //除了责任领域全有值->可以 + if(StringUtils.isNotBlank(lawEngineerName) && StringUtils.isNotBlank(engineeringInterfacePersonName) && StringUtils.isNotBlank(certificationEngineerName)) { + projectRelatedPersonnel.setLawEngineerName(lawEngineerName); + projectRelatedPersonnel.setEngineeringInterfacePersonName(engineeringInterfacePersonName); + projectRelatedPersonnel.setCertificationEngineerName(certificationEngineerName); + }else if(StringUtils.isBlank(lawEngineerName) && StringUtils.isBlank(engineeringInterfacePersonName) && StringUtils.isBlank(certificationEngineerName)) { + //除了责任领域,带*的全为空->可以 + projectRelatedPersonnel.setLawEngineerName(""); + projectRelatedPersonnel.setEngineeringInterfacePersonName(""); + projectRelatedPersonnel.setCertificationEngineerName(""); + }else {//除了责任领域,备注,有一个为空都报错 + if(CutEnum.CN.getValue().equals(cut)){ + throw new JeroBootException("请填写必填字段内容,带*的为必填.请检查第 "+ (i+1) + "行"); + }else{ + throw new JeroBootException("Please fill in the required fields marked with * .Please check line" + (i+1)); + } + } + + String remark = row.getCell(4, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).toString(); + if(StringUtils.isNotEmpty(row.getCell(4).toString())) { + projectRelatedPersonnel.setRemark(remark); + } + + list.add(projectRelatedPersonnel); } } - } catch (Exception e) { - log.error(e.getMessage(), e); - result.error500(e.getMessage()); - } finally { - try { - file.getInputStream().close(); - } catch (IOException e) { - e.printStackTrace(); - } + } } - return result; + workbook.close(); + //把数据翻译成id,并保存 + String message = oppositeDisposeData(list, projectId, cut); + return message; } /** - * 把导入的数据翻译成对应的id,并校验 + * 把导入的数据翻译成对应的id,校验,不存 * 若除责任领域外的导入数据不能为空 * @return */ @Override - public List oppositeDisposeData(List records,String projectId,String cut) { - int row=1; - + public String oppositeDisposeData(List records, String projectId, String cut) { + int row=3; + StringBuilder message = new StringBuilder(); for (ProjectRelatedPersonnel projectRelatedPersonnel:records) { //查标签内容里的责任领域数据 - List sysDictItemValueList = sysDictItemMapper.selectItemValueByDictCode(DictCodeEnum.DUTY_TERRITORY.getValue()); - if(!sysDictItemValueList.contains(projectRelatedPersonnel.getDutyTerritory())){ - if (CutEnum.CN.getValue().equals(cut)) { - throw new JeroBootException("该责任领域不存在.请检查第" + row + "行"); - }else{ - throw new JeroBootException("The area of responsibility does not exist. Please check line " + row); - } + List sysDictItemList = sysDictItemMapper.selectItemsByDictCode(DictCodeEnum.DUTY_TERRITORY.getValue()); + List dutyTerritoryValueList = new ArrayList<>(); + //按照责任领域名,查value + if (CutEnum.CN.getValue().equals(cut)) { + dutyTerritoryValueList = sysDictItemList.stream().filter(f -> f.getItemText().equals(projectRelatedPersonnel.getDutyTerritory())).map(e -> e.getItemValue()).collect(Collectors.toList()); + } else { + dutyTerritoryValueList = sysDictItemList.stream().filter(f -> f.getEnName().equals(projectRelatedPersonnel.getDutyTerritory())).map(e -> e.getItemValue()).collect(Collectors.toList()); } + //责任领域 if(!projectRelatedPersonnel.getDutyTerritory().isEmpty()) { //导入的一条数据,只能有一个责任领域 if (projectRelatedPersonnel.getDutyTerritory().contains(",")) { //中英切换提示语 if (CutEnum.CN.getValue().equals(cut)) { - throw new JeroBootException("导入的责任领域只能填一个.请检查第" + row + "行"); + message.append("导入的责任领域只能填一个.请检查第" + row + "行. "); } else { - throw new JeroBootException("Only one duty territory can be filled in for import. Please check line " + row); + message.append("Only one duty territory can be filled in for import. Please check line " + row); } } else { - String dictItemValue = sysDictService.queryDictItemByValue(DictCodeEnum.DUTY_TERRITORY.getValue(), projectRelatedPersonnel.getDutyTerritory(), cut); - - if (StringUtils.isBlank(dictItemValue)) { + if (CollectionUtils.isEmpty(dutyTerritoryValueList)) {//导入的责任领域不对 //中英切换提示语 if (CutEnum.CN.getValue().equals(cut)) { - throw new JeroBootException("导入的责任领域不存在.请检查第" + row + "行"); + message.append("导入的责任领域不存在.请检查第" + row + "行"); } else { - throw new JeroBootException("The imported duty territory does not exist. Please check line " + row); + message.append("The imported duty territory does not exist. Please check line " + row); } }else { - + projectRelatedPersonnel.setDutyTerritory(dutyTerritoryValueList.get(0)); QueryWrapper queryWrapper = new QueryWrapper<>(); - List idList = list(queryWrapper.select("id").eq("duty_territory", projectRelatedPersonnel.getDutyTerritory()).eq("project_id",projectId)); + List idList = list(queryWrapper.select("id").eq("duty_territory", dutyTerritoryValueList.get(0)).eq("project_id",projectId)); projectRelatedPersonnel.setId(idList.get(0).getId()); } } }else{ //中英切换提示语 if(CutEnum.CN.getValue().equals(cut)) { - throw new JeroBootException("导入的责任领域不能为空.请检查第" + row + "行"); + message.append("导入的责任领域不能为空.请检查第" + row + "行"); }else{ - throw new JeroBootException("The imported duty territory cannot be empty.Please check line " + row ); + message.append("The imported duty territory cannot be empty.Please check line " + row ); } } @@ -755,9 +859,9 @@ public class ProjectRelatedPersonnelServiceImpl extends ServiceImpl records = projectRelatedPersonnelMapper.queryById(projectRelatedPersonnel.getId()); - for (ProjectRelatedPersonnel data : records) { - //法规工程师 - String lawString = projectRelatedPersonnel.getLawEngineer(); - //去重 - if(StringUtils.isNotBlank(lawString)) { - List lawList = Arrays.asList(lawString.split(",")); - String lawDistinct = lawList.stream().distinct().collect(Collectors.joining(",")); - projectRelatedPersonnel.setLawEngineer(lawDistinct); - } - - //工程接口人 - String interfaceString = projectRelatedPersonnel.getEngineeringInterfacePerson(); - //去重 - if(StringUtils.isNotBlank(interfaceString)) { - List interfaceList = Arrays.asList(interfaceString.split(",")); - String interfaceDistinct = interfaceList.stream().distinct().collect(Collectors.joining(",")); - projectRelatedPersonnel.setEngineeringInterfacePerson(interfaceDistinct); - } - -// 工程接口人 - String certificationString = projectRelatedPersonnel.getCertificationEngineer(); - //去重 - if(StringUtils.isNotBlank(certificationString)) { - List certificationList = Arrays.asList(certificationString.split(",")); - String certificationDistinct = certificationList.stream().distinct().collect(Collectors.joining(",")); - projectRelatedPersonnel.setCertificationEngineer(certificationDistinct); - } - - if (StringUtils.isBlank(data.getRemark())) {//数据库里备注是空的 - projectRelatedPersonnel.setRemark(projectRelatedPersonnel.getRemark()); - } else { - projectRelatedPersonnel.setRemark(""); - } - - Date now = new Date(); - projectRelatedPersonnel.setUpdateTime(now); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - projectRelatedPersonnel.setUpdateBy(sysUser.getUsername()); - updateById(projectRelatedPersonnel); - } - } +// //导入-更新数据 +// private void updateDataById(List records) { +//// List records = projectRelatedPersonnelMapper.queryById(projectRelatedPersonnel.getId()); +// for (ProjectRelatedPersonnel projectRelatedPersonnel : records) { +//// //法规工程师 +//// String lawString = projectRelatedPersonnel.getLawEngineer(); +//// //去重 +//// if(StringUtils.isNotBlank(lawString)) { +//// List lawList = Arrays.asList(lawString.split(",")); +//// String lawDistinct = lawList.stream().distinct().collect(Collectors.joining(",")); +//// projectRelatedPersonnel.setLawEngineer(lawDistinct); +//// } +//// +//// //工程接口人 +//// String interfaceString = projectRelatedPersonnel.getEngineeringInterfacePerson(); +//// //去重 +//// if(StringUtils.isNotBlank(interfaceString)) { +//// List interfaceList = Arrays.asList(interfaceString.split(",")); +//// String interfaceDistinct = interfaceList.stream().distinct().collect(Collectors.joining(",")); +//// projectRelatedPersonnel.setEngineeringInterfacePerson(interfaceDistinct); +//// } +//// +////// 工程接口人 +//// String certificationString = projectRelatedPersonnel.getCertificationEngineer(); +//// //去重 +//// if(StringUtils.isNotBlank(certificationString)) { +//// List certificationList = Arrays.asList(certificationString.split(",")); +//// String certificationDistinct = certificationList.stream().distinct().collect(Collectors.joining(",")); +//// projectRelatedPersonnel.setCertificationEngineer(certificationDistinct); +//// } +//// +//// if (StringUtils.isBlank(data.getRemark())) {//数据库里备注是空的 +//// projectRelatedPersonnel.setRemark(projectRelatedPersonnel.getRemark()); +//// } else { +//// projectRelatedPersonnel.setRemark(""); +//// } +// +// Date now = new Date(); +// projectRelatedPersonnel.setUpdateTime(now); +// LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); +// projectRelatedPersonnel.setUpdateBy(sysUser.getUsername()); +// updateById(projectRelatedPersonnel); +// } +// } @Override public List queryCertificationEngineer(String projectId) {