From 692d810c430149d46cf88302ba73870bc8e8fe55 Mon Sep 17 00:00:00 2001 From: yjz <3131811435@qq.com> Date: Tue, 2 Jan 2024 11:46:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BC=81=E6=A0=87=E5=AE=A3=E8=B4=AF):7957?= =?UTF-8?q?3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProcessEsInspectPlanController.java | 45 ++++++- .../service/IProcessEsInspectPlanService.java | 20 ++- .../impl/ProcessEsInspectPlanServiceImpl.java | 125 +++++++++++++++--- .../vo/ProcessEsInspectPlanExcel.java | 96 ++++++++++++++ .../EnterpriseStandardDeclareServiceImpl.java | 17 ++- ...划导入模板(稽查征求意见对象填写意见).xls} | Bin 20480 -> 19968 bytes ...标稽查计划导入模板(稽查联络人发起计划).xls | Bin 0 -> 20480 bytes 7 files changed, 271 insertions(+), 32 deletions(-) create mode 100644 laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/vo/ProcessEsInspectPlanExcel.java rename laws-modules/src/main/resources/excelTemplate/{企标稽查计划导入模板.xls => 企标稽查计划导入模板(稽查征求意见对象填写意见).xls} (76%) create mode 100644 laws-modules/src/main/resources/excelTemplate/企标稽查计划导入模板(稽查联络人发起计划).xls diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/controller/ProcessEsInspectPlanController.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/controller/ProcessEsInspectPlanController.java index dde0daa0..c9f9cd4f 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/controller/ProcessEsInspectPlanController.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/controller/ProcessEsInspectPlanController.java @@ -162,29 +162,60 @@ public class ProcessEsInspectPlanController extends JeroController importExcel(HttpServletRequest request, HttpServletResponse response) throws Exception { - return processEsInspectPlanService.importExcel(request, response); + @AutoLog(value = "企标稽查计划业务表-通过excel导入数据(稽查联络人发起计划)") + @ApiOperation(value="企标稽查计划业务表-通过excel导入数据(稽查联络人发起计划)", notes="企标稽查计划业务表-通过excel导入数据(稽查联络人发起计划)") + @PostMapping(value = "/importExcelByStart") + public Result importExcelByStart(HttpServletRequest request, HttpServletResponse response) throws Exception { + return processEsInspectPlanService.importExcelByStart(request, response); } + + /** + * 通过excel导入数据(稽查征求意见对象填写意见) + * + * @param request + * @param response + * @return + */ + @AutoLog(value = "企标稽查计划业务表-通过excel导入数据(稽查征求意见对象填写意见)") + @ApiOperation(value="企标稽查计划业务表-通过excel导入数据(稽查征求意见对象填写意见)", notes="企标稽查计划业务表-通过excel导入数据(稽查征求意见对象填写意见)") + @PostMapping(value = "/importExcelByOpinionFill") + public Result importExcelByOpinionFill(HttpServletRequest request, HttpServletResponse response) throws Exception { + return processEsInspectPlanService.importExcelByOpinionFill(request, response); + } } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/service/IProcessEsInspectPlanService.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/service/IProcessEsInspectPlanService.java index ebb0ff08..486a856f 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/service/IProcessEsInspectPlanService.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/service/IProcessEsInspectPlanService.java @@ -89,16 +89,30 @@ public interface IProcessEsInspectPlanService extends IService findActRuVariableByInstanceId(String instanceId, String key); /** - * 通过excel导入数据 + * 企标稽查计划业务表-通过excel导入数据(稽查联络人发起计划) * @param request * @param response * @return */ - Result importExcel(HttpServletRequest request, HttpServletResponse response) throws Exception; + Result importExcelByStart(HttpServletRequest request, HttpServletResponse response) throws Exception; /** * 下载导入模板 * @return */ - void templateDownload(HttpServletResponse response) throws IOException; + void templateDownloadByStart(HttpServletResponse response) throws IOException; + + /** + * 通过excel导入数据(稽查征求意见对象填写意见) + * @param request + * @param response + * @return + */ + Result importExcelByOpinionFill(HttpServletRequest request, HttpServletResponse response) throws Exception; + + /** + * 企标稽查计划业务表-下载导入模板(稽查征求意见对象填写意见) + * @param response + */ + void templateDownloadByStartByOpinionFill(HttpServletResponse response) throws IOException; } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/service/impl/ProcessEsInspectPlanServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/service/impl/ProcessEsInspectPlanServiceImpl.java index a8c08cfa..69bcba11 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/service/impl/ProcessEsInspectPlanServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/service/impl/ProcessEsInspectPlanServiceImpl.java @@ -17,6 +17,7 @@ import com.jero.modules.activiti.process.esinspectplan.entity.ProcessEsInspectPl import com.jero.modules.activiti.process.esinspectplan.mapper.ProcessEsInspectPlanMapper; import com.jero.modules.activiti.process.esinspectplan.service.IProcessEsInspectPlanOpinionService; import com.jero.modules.activiti.process.esinspectplan.service.IProcessEsInspectPlanService; +import com.jero.modules.activiti.process.esinspectplan.vo.ProcessEsInspectPlanExcel; import com.jero.modules.laws.standard.entity.LawsEnterpriseStandard; import com.jero.modules.laws.standard.service.ILawsEnterpriseStandardService; import com.jero.modules.system.entity.SysDepart; @@ -37,7 +38,9 @@ import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.nio.file.Files; import java.text.SimpleDateFormat; import java.util.*; @@ -70,7 +73,7 @@ public class ProcessEsInspectPlanServiceImpl extends ServiceImpl importExcel(HttpServletRequest request, HttpServletResponse response) throws Exception { + public Result importExcelByStart(HttpServletRequest request, HttpServletResponse response) throws Exception { String projectId = request.getParameter("projectId"); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); @@ -231,7 +234,7 @@ public class ProcessEsInspectPlanServiceImpl extends ServiceImpl secondVerify = secondVerify(list.get(i)); List thirdVerify = thirdVerify(list.get(i)); List fifthVerify = fifthVerify(list.get(i)); - List sixthVerify = sixthVerify(list.get(i)); + List sixthVerify = sixthVerify(list.get(i), true); firstVerify.addAll(secondVerify); firstVerify.addAll(thirdVerify); firstVerify.addAll(fifthVerify); @@ -254,8 +257,8 @@ public class ProcessEsInspectPlanServiceImpl extends ServiceImpl sixthVerify(ProcessEsInspectPlan processEsInspectPlan) { + @Override + public Result importExcelByOpinionFill(HttpServletRequest request, HttpServletResponse response) throws Exception { + String projectId = request.getParameter("projectId"); + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + // 获取上传文件对象 + MultipartFile file = entity.getValue(); + ImportParams params = new ImportParams(); + params.setNeedSave(true); + params.setHeadRows(1); + // excel表格头部校验 + excelHeadVerify2(file, ProcessEsInspectPlanExcel.class, 0, 0); + List lists = ExcelImportUtil.importExcel(file.getInputStream(), ProcessEsInspectPlanExcel.class, params); + if (CollectionUtils.isEmpty(lists) || lists.size() <= 2) { + return Result.error("没有数据可导入!"); + } + lists.remove(0); + lists.remove(0); + List list = BeanCopyUtils.copyBeanList(lists, ProcessEsInspectPlan.class); + StringBuilder errorMSG = new StringBuilder(); + // 字段校验 + for (int i = 0; i < list.size(); i++) { + list.get(i).setProjectId(projectId); + String head = "第" + (i + 4) + "行:"; + List firstVerify = firstVerify(list.get(i)); + List secondVerify = secondVerify(list.get(i)); + List thirdVerify = thirdVerify(list.get(i)); + List fifthVerify = fifthVerify(list.get(i)); + List sixthVerify = sixthVerify(list.get(i), false); + firstVerify.addAll(secondVerify); + firstVerify.addAll(thirdVerify); + firstVerify.addAll(fifthVerify); + firstVerify.addAll(sixthVerify); + + if (!firstVerify.isEmpty()){ + errorMSG.append(head).append(String.join("", firstVerify)); + } + } + //update-begin-author:taoyan date:20190528 for:批量插入数据 + //update-end-author:taoyan date:20190528 for:批量插入数据 + if (errorMSG.length() > 0){ + throw new JeroBootException("文件导入失败:
" + errorMSG); + }else { + saveBatch(list); + return Result.OK("文件导入成功!数据行数:" + list.size()); + } + } + return Result.error("文件导入失败!"); + } + + @Override + public void templateDownloadByStartByOpinionFill(HttpServletResponse response) throws IOException { + File file = ResourceUtils.getFile("classpath:excelTemplate/企标稽查计划导入模板(稽查征求意见对象填写意见).xls"); + // 设置HTTP响应头,包括文件大小和内容类型 + response.setContentType("application/vnd.ms-excel"); // 根据实际文件类型设置内容类型 + response.setHeader("Content-Disposition", "attachment; filename=企标稽查计划导入模板.xls"); + response.setContentLength((int) Files.size(file.toPath())); + + // 将文件内容写入HTTP响应输出流中 + try (InputStream in = Files.newInputStream(file.toPath()); + ServletOutputStream out = response.getOutputStream()) { + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = in.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } + } + + private List sixthVerify(ProcessEsInspectPlan processEsInspectPlan, boolean flag) { List errorList = new ArrayList<>(); if (StringUtils.isNotBlank(processEsInspectPlan.getStandardizationDockingUser())){ SysUser sysUser = sysUserService.findUserByCalcNameWorkNo(processEsInspectPlan.getStandardizationDockingUser()); @@ -284,15 +357,17 @@ public class ProcessEsInspectPlanServiceImpl extends ServiceImpl carTypeClass, int titleRows, int i) { try { if (!(boolean) ImportExcelUtil.checkTemplateTitle(file, carTypeClass, titleRows, i)){ - throw new JeroBootException("模板错误,按照系统模板导入!"); + throw new JeroBootException(ERROR_MESSAGE); } }catch (Exception e) { e.printStackTrace(); - throw new JeroBootException("模板错误,按照系统模板导入!"); + throw new JeroBootException(ERROR_MESSAGE); + } + } + + /** + * excel表头校验 + * @param file + * @param carTypeClass + * @param titleRows + * @param i + */ + private void excelHeadVerify2(MultipartFile file, Class carTypeClass, int titleRows, int i) { + try { + if (!(boolean) ImportExcelUtil.checkTemplateTitle(file, carTypeClass, titleRows, i)){ + throw new JeroBootException(ERROR_MESSAGE); + } + }catch (Exception e) { + e.printStackTrace(); + throw new JeroBootException(ERROR_MESSAGE); } } } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/vo/ProcessEsInspectPlanExcel.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/vo/ProcessEsInspectPlanExcel.java new file mode 100644 index 00000000..e40ce053 --- /dev/null +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esinspectplan/vo/ProcessEsInspectPlanExcel.java @@ -0,0 +1,96 @@ +package com.jero.modules.activiti.process.esinspectplan.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.jero.common.aspect.annotation.Dict; +import com.jero.modules.activiti.process.esinspectplan.entity.ProcessEsInspectPlanOpinion; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** +* @ClassName: ProcessEsInspectPlanExcel +* @Description: +* @Author: yjz +* @Date: 2023-12-29 17:27 +* @Version: 1.0 +**/ +@Data +public class ProcessEsInspectPlanExcel implements Serializable { + /**项目id*/ + @ApiModelProperty(value = "项目id") + private String projectId; + /**稽查依据标准号*/ + @Excel(name = "*稽查依据标准号", width = 15) + @ApiModelProperty(value = "稽查依据标准号") + private String inspectNo; + /**稽查依据标准名称*/ + @Excel(name = "*稽查依据标准名称", width = 16) + @ApiModelProperty(value = "稽查依据标准名称") + private String inspectName; + /**计划稽查对象*/ + @Excel(name = "*计划稽查对象", width = 15) + @ApiModelProperty(value = "计划稽查对象") + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id") + private String inspectObject; + /**主责标准化工作组*/ + @Excel(name = "*主责标准化工作组", width = 16) + @ApiModelProperty(value = "主责标准化工作组") + private String standardizationWorkGroup; + /**所属部门*/ + @Excel(name = "*所属部门", width = 15) + @ApiModelProperty(value = "所属部门") + @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id") + private String belongDept; + /**计划稽查日期*/ +// @Excel(name = "计划稽查日期", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @ApiModelProperty(value = "计划稽查日期") + private Date planInspectDate; + /**计划稽查日期 导入用*/ + @Excel(name = "*计划稽查日期", width = 15, format = "yyyy-MM-dd") + @ApiModelProperty(value = "计划稽查日期 导入用") + @TableField(exist = false) + private String planInspectDates; + /**稽查负责人*/ + @Excel(name = "*稽查负责人", width = 15) + @ApiModelProperty(value = "稽查负责人") + private String inspectUser; + /**稽查负责人 翻译*/ + @ApiModelProperty(value = "稽查负责人 翻译") + @TableField(exist = false) + private String inspectUserDictText; + /**标准化组对接人*/ + @Excel(name = "*标准化组对接人", width = 15) + @ApiModelProperty(value = "标准化组对接人") + private String standardizationDockingUser; + /**标准化组对接人 翻译*/ + @ApiModelProperty(value = "标准化组对接人 翻译") + @TableField(exist = false) + private String standardizationDockingUserDictText; + /**征求意见对象*/ + @ApiModelProperty(value = "征求意见对象") + private String objectOfConsultation; + /**征求意见对象 翻译*/ + @ApiModelProperty(value = "征求意见对象 翻译") + @TableField(exist = false) + private String objectOfConsultationDictText; + /**备注*/ + @ApiModelProperty(value = "备注") + private String remarks; + + /**意见*/ + @ApiModelProperty(value = "意见") + @TableField(exist = false) + private List processEsInspectPlanOpinionList; + /**节点id*/ + @ApiModelProperty(value = "节点id") + @TableField(exist = false) + private String nodeId; +} diff --git a/laws-modules/src/main/java/com/jero/modules/laws/enterprise/service/impl/EnterpriseStandardDeclareServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/laws/enterprise/service/impl/EnterpriseStandardDeclareServiceImpl.java index a7479347..39296fee 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/enterprise/service/impl/EnterpriseStandardDeclareServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/enterprise/service/impl/EnterpriseStandardDeclareServiceImpl.java @@ -25,10 +25,7 @@ import com.jero.modules.oss.entity.OSSFile; import com.jero.modules.oss.service.IOSSFileService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.*; import org.jeecgframework.poi.excel.ExcelExportUtil; import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.enmus.ExcelType; @@ -227,14 +224,22 @@ public class EnterpriseStandardDeclareServiceImpl extends ServiceImpl newEnterpriseStandardDeclareExcels, Workbook workbook) { Sheet sheet = workbook.getSheetAt(0); + // 设置字体颜色、下划线 + CellStyle cellStyle = workbook.createCellStyle(); + Font font = workbook.createFont(); + font.setColor(IndexedColors.BLUE.getIndex()); + font.setUnderline(Font.U_SINGLE); + cellStyle.setFont(font); + cellStyle.setWrapText(true); int i = 1; for (EnterpriseStandardDeclareExcel enterpriseStandardDeclareExcel : newEnterpriseStandardDeclareExcels) { if (!Objects.isNull(enterpriseStandardDeclareExcel.getDeclareFileList()) && !enterpriseStandardDeclareExcel.getDeclareFileList().isEmpty()){ for (DeclareFileList declareFileList : enterpriseStandardDeclareExcel.getDeclareFileList()) { Row row = sheet.getRow(i); Cell cell = row.getCell(6); - cell.setCellFormula("HYPERLINK(\"" + ".\\" + declareFileList.getFileName() + "\")"); - cell.setCellValue(declareFileList.getFileName()); + // 设置超链接 HYPERLINK("https://www.baidu.com", "百度") + cell.setCellFormula("HYPERLINK(\"" + declareFileList.getFileName() + "\", \"" + declareFileList.getFileName() + "\")"); + cell.setCellStyle(cellStyle); i += 1; } }else { diff --git a/laws-modules/src/main/resources/excelTemplate/企标稽查计划导入模板.xls b/laws-modules/src/main/resources/excelTemplate/企标稽查计划导入模板(稽查征求意见对象填写意见).xls similarity index 76% rename from laws-modules/src/main/resources/excelTemplate/企标稽查计划导入模板.xls rename to laws-modules/src/main/resources/excelTemplate/企标稽查计划导入模板(稽查征求意见对象填写意见).xls index 6be29933d03ff729b5362ebf0f17669855c03a34..43e5641f6b737eace6fc611f1a50db824328c280 100644 GIT binary patch delta 826 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 Mo4=sP{}$_i0lh6%H~;_u literal 0 HcmV?d00001