From 0261d44802b40a8b8ce23855df1744c0164daf6c Mon Sep 17 00:00:00 2001 From: du <1725534722@qq.com> Date: Fri, 11 Apr 2025 14:57:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=8D=95=E7=89=87=E6=9D=90?= =?UTF-8?q?=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/pom.xml | 2 +- .../BasicInformationController.java | 112 ++++++++- .../gysl/controller/ZwStatsController.java | 92 +++---- .../gysl/service/BasicInformationService.java | 17 +- .../impl/BasicInformationServiceImpl.java | 226 ++++++------------ .../gysl/service/impl/XmpjqdServiceImpl.java | 8 +- ruoyi-admin/src/main/resources/xmdtcl.docx | Bin 0 -> 18792 bytes 7 files changed, 229 insertions(+), 228 deletions(-) create mode 100644 ruoyi-admin/src/main/resources/xmdtcl.docx diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 3cb5b52..5afd3f6 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -24,7 +24,7 @@ cn.hutool hutool-all - 5.8.23 + 5.8.37 org.jsoup diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java index 63b37d5..86ec07c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java @@ -1,9 +1,12 @@ package com.ruoyi.gysl.controller; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.ZipUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; @@ -15,8 +18,10 @@ import com.ruoyi.gysl.entity.request.BasicInformationPageReq; import com.ruoyi.gysl.entity.response.BasicInformationResponse; import com.ruoyi.gysl.entity.response.ProjectExcelInfo; import com.ruoyi.gysl.service.*; +import com.ruoyi.system.mapper.SysDictDataMapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; @@ -24,9 +29,15 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.*; /** * 基本信息(BasicInformation)表控制层 @@ -38,7 +49,8 @@ import java.util.List; @RestController @RequestMapping("/gysl/basicInformation") public class BasicInformationController extends BaseController { - + @Value("${ruoyi.profile}") + private String fileAddress; // 1.审核通过之后再审核不要通知 // 2.项目评价配置和详情那边同步显示 // 3.换掉项目动态导出模板 @@ -51,7 +63,8 @@ public class BasicInformationController extends BaseController { // 5.月度报告修改 // 8.企业和政务登录 - + @Resource + private SysDictDataMapper sysDictDataMapper; /** * 基本信息 */ @@ -140,7 +153,7 @@ public class BasicInformationController extends BaseController { if (byId.getStatus() != 1) { throw new ServiceException("暂不能提交!"); } - return success(basicInformationService.audit(req, 2,byId.getStatus())); + return success(basicInformationService.audit(req, 2, byId.getStatus())); } /** @@ -154,7 +167,7 @@ public class BasicInformationController extends BaseController { if (byId.getStatus() == 1) { throw new ServiceException("请等待企业填报!"); } - return success(basicInformationService.audit(req, 3,byId.getStatus())); + return success(basicInformationService.audit(req, 3, byId.getStatus())); } /** @@ -261,7 +274,7 @@ public class BasicInformationController extends BaseController { // @PreAuthorize("@ss.hasAnyRoles('admin,common')") @ApiOperation("导出项目数据") @PostMapping("/exportInfo") - public void exportInfo(HttpServletResponse response){ + public void exportInfo(HttpServletResponse response) { List pE = basicInformationService.selectList(); ExcelUtil util = new ExcelUtil<>(ProjectExcelInfo.class); util.exportExcel(response, pE, "项目数据"); @@ -329,5 +342,88 @@ public class BasicInformationController extends BaseController { // }); // return AjaxResult.success(); // } + + @ApiOperation(value = "导出单片材料") + @PostMapping("/wordExport") + public void wordExport(HttpServletResponse response, @RequestBody List ids) throws Exception { + List sysDictData = sysDictDataMapper.selectDictDataList(new SysDictData()); + String fatherFile = fileAddress + "/项目压缩文件"; + FileUtil.mkdir(fatherFile); + for (long id : ids) { + BasicInformationResponse a1 = basicInformationService.selectOne(id); + Map map = new HashMap<>(); + map.put("issuingTime", a1.getBasicInformation().getIssuingTime() != null ? a1.getBasicInformation().getIssuingTime() : "/"); + map.put("jsjd", a1.getBasicInformation().getJsjd() != null ? a1.getBasicInformation().getJsjd() : "/"); + map.put("xzfl", a1.getBasicInformation().getXzfl() != null ? + basicInformationService.getDictLabel("xzfl", String.valueOf(a1.getBasicInformation().getXzfl()),sysDictData) : "/"); + map.put("nature", a1.getBasicInformation().getNature() != null ? + basicInformationService.getDictLabel("xmfrdwxz", String.valueOf(a1.getBasicInformation().getNature()),sysDictData) : "/"); + map.put("name", a1.getBasicInformation().getName() != null ? a1.getBasicInformation().getName() : "/"); + map.put("ssgnq", a1.getBasicInformation().getSsgnq() != null ? + basicInformationService.getDictLabel("ssgnq", String.valueOf(a1.getBasicInformation().getSsgnq()),sysDictData) : "/"); + map.put("jsdd", a1.getBasicInformation().getJsdd() != null ? a1.getBasicInformation().getJsdd() : "/"); + map.put("xmfrdwxz", a1.getBasicInformation().getXmfrdwxz() != null ? a1.getBasicInformation().getXmfrdwxz() : "/"); + map.put("tyshxydm", a1.getBasicInformation().getTyshxydm() != null ? a1.getBasicInformation().getTyshxydm() : "/"); + map.put("sgdw", a1.getBasicInformation().getSgdw() != null ? a1.getBasicInformation().getSgdw() : "/"); + map.put("sjdw", a1.getBasicInformation().getSjdw() != null ? a1.getBasicInformation().getSjdw() : "/"); + map.put("begainTime", a1.getBasicInformation().getBegainTime() != null ? a1.getBasicInformation().getBegainTime() : "/"); + map.put("endTime", a1.getBasicInformation().getEndTime() != null ? a1.getBasicInformation().getEndTime() : "/"); + map.put("prioritize", a1.getBasicInformation().getPrioritize() != null ? a1.getBasicInformation().getPrioritize() : "/"); + map.put("label", a1.getBasicInformation().getLabel() != null ? a1.getBasicInformation().getLabel() : "/"); + map.put("projectLeader", a1.getBasicInformation().getProjectLeader() != null ? a1.getBasicInformation().getProjectLeader() : "/"); + map.put("phone", a1.getBasicInformation().getPhone() != null ? a1.getBasicInformation().getPhone() : "/"); + map.put("zydmj", a1.getPlanInformation().getZydmj() != null ? a1.getPlanInformation().getZydmj() : "/"); + map.put("rjl", a1.getPlanInformation().getRjl() != null ? a1.getPlanInformation().getRjl() : "/"); + map.put("zjzmj", a1.getPlanInformation().getZjzmj() != null ? a1.getPlanInformation().getZjzmj() : "/"); + map.put("jzds", a1.getPlanInformation().getJzds() != null ? a1.getPlanInformation().getJzds() : "/"); + map.put("bzcjzmj", a1.getPlanInformation().getBzcjzmj() != null ? a1.getPlanInformation().getBzcjzmj() : "/"); + map.put("jzmd", a1.getPlanInformation().getJzmd() != null ? a1.getPlanInformation().getJzmd() : "/"); + map.put("zgjzcs", a1.getPlanInformation().getZgjzcs() != null ? a1.getPlanInformation().getZgjzcs() : "/"); + map.put("zgjzgd", a1.getPlanInformation().getZgjzgd() != null ? a1.getPlanInformation().getZgjzgd() : "/"); + map.put("fhdj", a1.getPlanInformation().getFhdj() != null ? a1.getPlanInformation().getFhdj() : "/"); + map.put("jdctcw", a1.getPlanInformation().getJdctcw() != null ? a1.getPlanInformation().getJdctcw() : "/"); + map.put("fjdctcw", a1.getPlanInformation().getFjdctcw() != null ? a1.getPlanInformation().getFjdctcw() : "/"); + map.put("jhtze", a1.getBasicInformation().getJhtze() != null ? a1.getBasicInformation().getJhtze() : "/"); + map.put("ztze", a1.getBasicInformation().getZtze() != null ? a1.getBasicInformation().getZtze() : "/"); + + map.put("rzqys", a1.getQyrzInformation().getRzqys() != null ? a1.getQyrzInformation().getRzqys() : "/"); + map.put("rzqyhylx", a1.getQyrzInformation().getRzqyhylx() != null ? a1.getQyrzInformation().getRzqyhylx() : "/"); + map.put("rysl", a1.getQyrzInformation().getRysl() != null ? a1.getQyrzInformation().getRysl() : "/"); + map.put("rzl", a1.getQyrzInformation().getRzl() != null ? a1.getQyrzInformation().getRzl() : "/"); + map.put("yczmj", a1.getQyrzInformation().getYczmj() != null ? a1.getQyrzInformation().getYczmj() : "/"); + map.put("kzczmj", a1.getQyrzInformation().getKzczmj() != null ? a1.getQyrzInformation().getKzczmj() : "/"); + map.put("gycfpjzj", a1.getQyrzInformation().getGycfpjzj() != null ? a1.getQyrzInformation().getGycfpjzj() : "/"); + try { + String itemsFileName = fatherFile + "/" + a1.getBasicInformation().getName()+".docx"; + Path targetPath = Paths.get(itemsFileName); + Files.createDirectories(targetPath.getParent()); + // 2. 打开输出流(自动覆盖已有文件) + try (OutputStream out = new BufferedOutputStream( + Files.newOutputStream(targetPath, + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING))) { + basicInformationService.generateDocument(map,"xmdtcl.docx",out); + } + } catch (Exception e) { + throw new RuntimeException("文件下载失败"); + } + } + // 压缩后的文件路径 + String zipFilePath = fatherFile + ".zip"; + ZipUtil.zip(fatherFile, zipFilePath); + File file = new File(zipFilePath);// 创建File对象 + response.setContentType("application/zip");// 设置内容类型为ZIP文件 + response.setHeader("Content-Disposition", "attachment; filename=\"file.zip\"");//设置文件名 + try (FileInputStream fileInputStream = new FileInputStream(file); + OutputStream outputStream = response.getOutputStream()) { + byte[] buffer = new byte[4096]; + int by; + while ((by = fileInputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, by); + } + } + FileUtil.del(zipFilePath); + FileUtil.del(fatherFile); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/ZwStatsController.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/ZwStatsController.java index f88684c..629941a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/ZwStatsController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/ZwStatsController.java @@ -1,8 +1,6 @@ package com.ruoyi.gysl.controller; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.resource.ClassPathResource; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -14,11 +12,6 @@ import com.ruoyi.gysl.service.BasicInformationService; import com.ruoyi.gysl.service.ZwStatsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.apache.poi.xwpf.usermodel.XWPFParagraph; -import org.apache.poi.xwpf.usermodel.XWPFRun; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -27,8 +20,9 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import java.io.*; -import java.net.URLEncoder; +import javax.validation.constraints.NotBlank; +import java.io.IOException; +import java.io.OutputStream; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -48,8 +42,6 @@ public class ZwStatsController extends BaseController { @Resource private ZwStatsService zwStatsService; - @Value("${ruoyi.profile}") - private String fileAddress; @Resource private BasicInformationService basicInformationService; @@ -143,7 +135,8 @@ public class ZwStatsController extends BaseController { */ @ApiOperation(value = "导出项目总体报告") @PostMapping(value = "/exportBg") - public void exportBg(HttpServletResponse response,@Valid String years) throws Exception { + public void exportBg(HttpServletResponse response, @Valid @NotBlank String years) + throws Exception { // 设置响应内容类型和头部 response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); @@ -154,82 +147,57 @@ public class ZwStatsController extends BaseController { List ribbon = zwStatsService.ribbon(years); //获取投资主体 List investors = zwStatsService.investors(years); - Map dt = new HashMap<>(); - dt.put("{{years}}",years); - dt.put("{{allProject}}",allProjectResponse.getAllProject()); - dt.put("{{allGrossArea}}",allProjectResponse.getAllGrossArea()); - dt.put("{{allBuilding1}}",allProjectResponse.getAllBuilding1()); - dt.put("{{allBuilding2}}",allProjectResponse.getAllBuilding2()); - dt.put("{{allBuilding3}}",allProjectResponse.getAllBuilding3()); - dt.put("{{currentYearProject}}",allProjectResponse.getCurrentYearProject()); - dt.put("{{currentYearGrossArea}}",allProjectResponse.getCurrentYearGrossArea()); - dt.put("{{currentBuilding1}}",allProjectResponse.getCurrentBuilding1()); - dt.put("{{currentBuilding2}}",allProjectResponse.getCurrentBuilding2()); - dt.put("{{currentBuilding3}}",allProjectResponse.getCurrentBuilding3()); - ribbon.forEach(x->{ + Map dt = new HashMap<>(); + dt.put("{{years}}", years); + dt.put("{{allProject}}", allProjectResponse.getAllProject()); + dt.put("{{allGrossArea}}", allProjectResponse.getAllGrossArea()); + dt.put("{{allBuilding1}}", allProjectResponse.getAllBuilding1()); + dt.put("{{allBuilding2}}", allProjectResponse.getAllBuilding2()); + dt.put("{{allBuilding3}}", allProjectResponse.getAllBuilding3()); + dt.put("{{currentYearProject}}", allProjectResponse.getCurrentYearProject()); + dt.put("{{currentYearGrossArea}}", allProjectResponse.getCurrentYearGrossArea()); + dt.put("{{currentBuilding1}}", allProjectResponse.getCurrentBuilding1()); + dt.put("{{currentBuilding2}}", allProjectResponse.getCurrentBuilding2()); + dt.put("{{currentBuilding3}}", allProjectResponse.getCurrentBuilding3()); + ribbon.forEach(x -> { switch (x.getSsgnq()) { case "高端制造与国际贸易区": - dt.put("{{gn1}}",x.getCount()); + dt.put("{{gn1}}", x.getCount()); break; case "阳澄湖半岛旅游度假区": - dt.put("{{gn2}}",x.getCount()); + dt.put("{{gn2}}", x.getCount()); break; case "金鸡湖商务区": - dt.put("{{gn3}}",x.getCount()); + dt.put("{{gn3}}", x.getCount()); break; case "苏相合作区": - dt.put("{{gn4}}",x.getCount()); + dt.put("{{gn4}}", x.getCount()); break; case "独墅湖科教创新区": - dt.put("{{gn5}}",x.getCount()); + dt.put("{{gn5}}", x.getCount()); break; default: break; } }); - investors.forEach(x->{ + investors.forEach(x -> { switch (x.getSsgnq()) { case "国企": - dt.put("{{tz1}}",x.getCount()); + dt.put("{{tz1}}", x.getCount()); break; case "民营企业": - dt.put("{{tz2}}",x.getCount()); + dt.put("{{tz2}}", x.getCount()); break; case "外资企业": - dt.put("{{tz3}}",x.getCount()); + dt.put("{{tz3}}", x.getCount()); break; default: break; } }); - ClassPathResource classPathResource = new ClassPathResource("ztbgmb.docx"); - try ( - InputStream inputStream = classPathResource.getStream(); - // 使用 Apache POI 处理 Word 文件(需提前引入依赖) - XWPFDocument doc = new XWPFDocument(inputStream); - ) { - // 增强的占位符替换逻辑(改进部分) - for (XWPFParagraph paragraph : doc.getParagraphs()) { - List runs = paragraph.getRuns(); - if (runs == null) continue; - for (XWPFRun run : runs) { - String text = run.getText(0); - if (text == null) continue; - // 动态替换所有模板变量 - for (Map.Entry entry : dt.entrySet()) { - if (text.contains(entry.getKey())) { - text = text.replace(entry.getKey(), entry.getValue() != null ? entry.getValue().toString() : ""); - run.setText(text, 0); - } - } - } - } - // 将文档写入到响应输出流 - try (OutputStream out = response.getOutputStream()) { - doc.write(out); - } - } catch (IOException e) { - e.printStackTrace(); + // 4. 生成并写入文档 + try (OutputStream out = response.getOutputStream()) { + basicInformationService.generateDocument(dt, "ztbgmb.docx", out); } } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java index f33b0ca..99b8ec2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java @@ -2,15 +2,15 @@ package com.ruoyi.gysl.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.domain.entity.SysDictType; import com.ruoyi.gysl.entity.BasicInformation; import com.ruoyi.gysl.entity.request.AuditRequest; import com.ruoyi.gysl.entity.request.BasicInformationPageReq; import com.ruoyi.gysl.entity.response.BasicInformationResponse; -import com.ruoyi.gysl.entity.response.ProjectBuildingExcel; import com.ruoyi.gysl.entity.response.ProjectExcelInfo; -import org.apache.poi.xssf.usermodel.XSSFCellStyle; -import org.apache.poi.xssf.usermodel.XSSFSheet; +import java.io.OutputStream; import java.io.Serializable; import java.util.List; import java.util.Map; @@ -93,5 +93,16 @@ public interface BasicInformationService extends IService { * @return 单条数据 */ BasicInformationResponse stagingInfo(Long id); + + + /** + * 根据材料返回输chu流 + */ + void generateDocument(Map map, String docx, OutputStream sr) throws Exception; + + /** + * 根据dict_type和dict_value返回 + */ + String getDictLabel(String dictType, String dictValue, List sysDictData); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java index c6b67c3..33d8815 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java @@ -1,8 +1,9 @@ package com.ruoyi.gysl.service.impl; +import cn.hutool.core.io.resource.ClassPathResource; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.docking.entity.SmartDeclaration; @@ -14,21 +15,22 @@ import com.ruoyi.gysl.entity.request.BasicInformationPageReq; import com.ruoyi.gysl.entity.request.RemarkPageReq; import com.ruoyi.gysl.entity.request.ZwIdPageReq; import com.ruoyi.gysl.entity.response.BasicInformationResponse; -import com.ruoyi.gysl.entity.response.ProjectBuildingExcel; import com.ruoyi.gysl.entity.response.ProjectExcelInfo; import com.ruoyi.gysl.mapper.BasicInformationMapper; import com.ruoyi.gysl.service.*; -import org.apache.poi.xssf.usermodel.XSSFCell; -import org.apache.poi.xssf.usermodel.XSSFCellStyle; -import org.apache.poi.xssf.usermodel.XSSFRow; -import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.io.Serializable; -import java.lang.reflect.Field; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -122,7 +124,6 @@ public class BasicInformationServiceImpl extends ServiceImpl info, List sc, List ec, int num) { -// Class classBuilding = ProjectBuildingExcel.class; -// for (ProjectExcelInfo projectExcelInfo : info) { -// XSSFRow tempRow = sheet.createRow(rowNum++); -// tempRow.setHeight((short) 1400); -// int i1; -// for (i1 = 0; i1 < sc.size(); i1++) { -// XSSFCell tempCell = tempRow.createCell(i1); -// tempCell.setCellStyle(contentStyle); -// if (!ec.get(i1).endsWith("厂房")) { -// if (Objects.equals(sc.get(i1), "")) { -// tempCell.setCellValue(projectExcelInfo.getId()); -// } else { -// tempCell.setCellValue(getExcelData(projectExcelInfo, sc.get(i1))); -// } -// } -// } -//// XSSFCell tempCell = tempRow.createCell(8); -//// tempCell.setCellStyle(contentStyle); -//// tempCell.setCellValue("12312321"); -// -// for (int i2 = 0; i2 < projectExcelInfo.getXmjzxx().size(); i2++) { -// switch (projectExcelInfo.getXmjzxx().get(i2).getFloor()) { -// case 1: -// i1 = ec.indexOf("一层厂房"); -// break; -// case 2: -// i1 = ec.indexOf("双层厂房"); -// break; -// case 3: -// i1 = ec.indexOf("三层厂房"); -// break; -// case 4: -// i1 = ec.indexOf("四层厂房"); -// break; -// case 5: -// i1 = ec.indexOf("五层厂房"); -// break; -// default: -// i1 = ec.indexOf("六层及以上厂房"); -// } -// for (Field field : classBuilding.getDeclaredFields()) { -// XSSFCell tempCell = tempRow.createCell(i1); -// tempCell.setCellStyle(contentStyle); -// Excel excelColumn = field.getAnnotation(Excel.class); -// if (excelColumn != null) { -// tempCell.setCellValue(getBuildingData(projectExcelInfo.getXmjzxx().get(i2), sc.get(i1))); -// i1++; -// } -// } -// } -// } -// } -// -// /** -// * 填充数据-项目基础信息获取 -// */ -// @Override -// public String getExcelData(ProjectExcelInfo item, String str) { -// String a = null; -// switch (str) { -// case "": -// a = item.getId() == null ? "-" : item.getId(); -// break; -// case "项目名称": -// a = item.getName() == null ? "-" : item.getName(); -// break; -// case "项目法人单位": -// a = item.getXmfrdwxz() == null ? "-" : item.getXmfrdwxz(); -// break; -// case "项目法人单位性质": -// a = String.valueOf(item.getNature() == null ? "-" : item.getNature()); -// break; -// case "总用地面积": -// a = String.valueOf(item.getZydmj() == null ? "-" : item.getZydmj()); -// break; -// case "容积率": -// a = String.valueOf(item.getRjl() == null ? "-" : item.getRjl()); -// break; -// case "总建筑面积": -// a = String.valueOf(item.getZjzmj() == null ? "-" : item.getZjzmj()); -// break; -// case "标准层建筑面积": -// a = String.valueOf(item.getBzcjzmj() == null ? "-" : item.getBzcjzmj()); -// break; -// } -// return a; -// } -// -// /** -// * 填充数据-项目建筑信息获取 -// */ -// @Override -// public String getBuildingData(ProjectBuildingExcel item, String str) { -// String a = null; -// switch (str) { -// case "层数": -// a = item.getFloor() == null ? "-" : String.valueOf(item.getFloor()); -// break; -// case "总建筑高度": -// a = item.getTotalBuildingHeight() == null ? "-" : String.valueOf(item.getTotalBuildingHeight()); -// break; -// case "首层高度": -// a = String.valueOf(item.getScgd() == null ? "-" : item.getScgd()); -// break; -// case "2至4层高": -// a = String.valueOf(item.getTwoAndFourCg() == null ? "-" : item.getTwoAndFourCg()); -// break; -// case "4层以上层高": -// a = String.valueOf(item.getFourYscg() == null ? "-" : item.getFourYscg()); -// break; -// } -// return a; -// } - /** * 有经纬度的项目列表 */ @@ -282,25 +164,14 @@ public class BasicInformationServiceImpl extends ServiceImpl collect1 = req.getWysmxInformations().stream().filter(x -> - "危化品等级".equals(x.getZdname()) - ) - .collect(Collectors.toList()); - List collect2 = req.getWysmxInformations().stream().filter(x -> - "生产火灾危险等级".equals(x.getZdname()) - ) - .collect(Collectors.toList()); - List collect3 = req.getWysmxInformations().stream().filter(x -> - "环境保护".equals(x.getZdname())) - .collect(Collectors.toList()); + List collect1 = req.getWysmxInformations().stream().filter(x -> "危化品等级".equals(x.getZdname())).collect(Collectors.toList()); + List collect2 = req.getWysmxInformations().stream().filter(x -> "生产火灾危险等级".equals(x.getZdname())).collect(Collectors.toList()); + List collect3 = req.getWysmxInformations().stream().filter(x -> "环境保护".equals(x.getZdname())).collect(Collectors.toList()); if (!collect1.isEmpty() && !collect2.isEmpty() && !collect3.isEmpty()) { - req.getBasicInformation().setIsFmqd(wysmxInformationService.canGoUpstairs( - collect1.get(0).getZdinfor(), - collect2.get(0).getZdinfor(), - collect3.get(0).getZdinfor()) ? 1 : 0); + req.getBasicInformation().setIsFmqd(wysmxInformationService.canGoUpstairs(collect1.get(0).getZdinfor(), collect2.get(0).getZdinfor(), collect3.get(0).getZdinfor()) ? 1 : 0); } //修改项目规划信息 @@ -315,12 +186,12 @@ public class BasicInformationServiceImpl extends ServiceImpl map, String docx, OutputStream sr) throws IOException { + ClassPathResource resource = new ClassPathResource(docx); + try (InputStream is = resource.getStream(); + XWPFDocument doc = new XWPFDocument(is); + ) { + // 处理段落 + for (XWPFParagraph paragraph : doc.getParagraphs()) { + List runs = paragraph.getRuns(); + if (runs == null) continue; + for (XWPFRun run : runs) { + String text = run.getText(0); + if (text == null) continue; + // 动态替换所有模板变量 + for (Map.Entry entry : map.entrySet()) { + if (text.contains(entry.getKey())) { + text = text.replace(entry.getKey(), entry.getValue() != null ? entry.getValue().toString() : ""); + run.setText(text, 0); + } + } + } + } + doc.write(sr); + } catch (Exception e) { + throw new IOException("文档生成失败", e); + } + } + + + /** + * 根据dict_type和dict_value返回 + */ + @Override + public String getDictLabel(String dictType, String dictValue,List sysDictData) { + List collect = sysDictData.stream().filter(x -> + x.getDictType().equals(dictType) && x.getDictValue().equals(dictValue)) + .collect(Collectors.toList()); + if (collect.isEmpty()){ + return "/"; + }else { + return collect.get(0).getDictLabel(); + } + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/XmpjqdServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/XmpjqdServiceImpl.java index 0283212..45ae25f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/XmpjqdServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/XmpjqdServiceImpl.java @@ -67,9 +67,11 @@ public class XmpjqdServiceImpl extends ServiceImpl impleme List xmpjqdOneResponses = xmpjqdMapper.selectOnePj(id); //获取项目评价配置 pjpzService.list().forEach(x -> { - XmpjqdOneResponse xr = new XmpjqdOneResponse(); - xr.setYsmc(x.getPjys()); - xmpjqdOneResponses.add(xr); + if(!Objects.equals(x.getPjys(), "总投资额")){ + XmpjqdOneResponse xr = new XmpjqdOneResponse(); + xr.setYsmc(x.getPjys()); + xmpjqdOneResponses.add(xr); + } }); return xmpjqdOneResponses; } diff --git a/ruoyi-admin/src/main/resources/xmdtcl.docx b/ruoyi-admin/src/main/resources/xmdtcl.docx new file mode 100644 index 0000000000000000000000000000000000000000..cf9461864bb1181c07eec71511646ff8874ace24 GIT binary patch literal 18792 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%0D0>VgM5lp!OM3Y_ zY`fL{i0=mM|IRf3E7_48u1UZ>OMx@|N z|4*WQ+qvrYaO-wVPSd$#NOmcyVx!M45x|d=kCwB(D zyXdfrToFOsu7dgFOF!dh$^s?ZS`q4^pba6Nz!bps2oL9R290H*_`sYG6S{fTiKPZJ z(dqoh7R|pI{U)56&{Qb?E_*~h;3FG6&IQ(!xW}M(zcqM=_)}5@8N*-MvXlVTCUl^@)L=#`&mr1j}Ui81%ySB*J7xGKz)>rYc2RP~e#oL;acoYV{ z$gCUbhsZuUnJqSwupG}7R-Q))U!lapPxpM&s11xDS#BG1)ZN(cHBQb9!Z@ zd@@qLBfHsvbuUWoZ}jnLrw4v7sY^{1#bsf0Ga@sqP;2JyZk(ybZ$`qFxK7Q2cZiu1 zZ9pVOhrAkERJx2H$Ly1Bm^U($ep?6-ZaUl%224Y%0Z|eP-@~PiZ#wfwa8cqL_8o5Z z@RL|}y3~{i{cb#y+)hCLxQn(n4t>*YC!3I5NgWBgxi-zX5?=sQ6=X&S{z@T2psxs> z_Qsk*_fLa3`bvMEUPC?|SCXR4tb|jIYbtIc08_C~^mCSDEK&0`6Vdeo7CT{>NT%;S z*y-rDx*rOYyH7E5P4+Q;YJml}dn~);U$Rwc2*f%L#m;J)7N_*GKEsKQmmie%KGDDH zUg`suwDN%n6oGm->juqZ=TEbv`9J&2+4$uaRQBF7=Oj z!AD!k{x2KZ@5TH+@07f``^nk!segb4G$WG;1L9N;^k@Ud90MbR0+3{L!WxMX1F)A& zpfVl;KxLGa9jr7*w-mk12kC)WY6sT?&U^SQgE#@C6=a!$8FHbBPajA%1b|p6_Q?8R zWd&*&p%=lp!h<+r#00EuZ z0s*j~K{~+&H6+l_Z~k$pcf;oc zky)%!{ z?Qa3qjncJ8*N?sv5261OFcQE~hP*EiT|4?Q8wl+tuoy=ix&hIQy<|g;ds!8z-LQpB jsJR4vDHFn0H&l&?g-rq8tl+{^oI#vnI?!pmok5xaO%=<3 literal 0 HcmV?d00001