From 076403f5c24a97ec733429b347300a9bfde9a5b5 Mon Sep 17 00:00:00 2001 From: du <1725534722@qq.com> Date: Thu, 10 Apr 2025 10:58:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BB=9F=E8=AE=A1=E5=88=86?= =?UTF-8?q?=E6=9E=90pdf=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/pom.xml | 5 + .../BasicInformationController.java | 236 +++++------------- .../gysl/controller/ZwStatsController.java | 82 ++++++ .../gysl/entity/stats/AllProjectResponse.java | 2 +- .../com/ruoyi/gysl/mapper/ZwStatsMapper.java | 10 + .../gysl/service/impl/ZwStatsServiceImpl.java | 52 +--- .../main/resources/mapper/ZwStatsMapper.xml | 18 +- ruoyi-admin/src/main/resources/ztbgmb.docx | Bin 0 -> 17902 bytes 8 files changed, 184 insertions(+), 221 deletions(-) create mode 100644 ruoyi-admin/src/main/resources/ztbgmb.docx diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 37d59c6..3cb5b52 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -16,6 +16,11 @@ + + org.apache.poi + poi-ooxml + 5.2.3 + cn.hutool hutool-all 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 175f065..63b37d5 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 @@ -2,12 +2,10 @@ package com.ruoyi.gysl.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.poi.ChangeExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.docking.entity.SmartDeclaration; import com.ruoyi.docking.service.SmartDeclarationService; @@ -15,24 +13,20 @@ import com.ruoyi.gysl.entity.*; 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 com.ruoyi.gysl.service.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.apache.poi.xssf.usermodel.*; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.lang.reflect.Field; -import java.net.URLEncoder; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; /** * 基本信息(BasicInformation)表控制层 @@ -45,6 +39,19 @@ import java.util.*; @RequestMapping("/gysl/basicInformation") public class BasicInformationController extends BaseController { + // 1.审核通过之后再审核不要通知 + // 2.项目评价配置和详情那边同步显示 + // 3.换掉项目动态导出模板 + // 6.项目不填项目起止日期导入失败 + // 7.企业端统计项目总数有问题 + // 9.项目基础信息时间查询改了格式 + // 10.添加项目统计页面根据年份查找统计数据 + + // 4.项目汇编管理修改pdf + // 5.月度报告修改 + // 8.企业和政务登录 + + /** * 基本信息 */ @@ -133,7 +140,7 @@ public class BasicInformationController extends BaseController { if (byId.getStatus() != 1) { throw new ServiceException("暂不能提交!"); } - return success(basicInformationService.audit(req, 2)); + return success(basicInformationService.audit(req, 2,byId.getStatus())); } /** @@ -147,7 +154,7 @@ public class BasicInformationController extends BaseController { if (byId.getStatus() == 1) { throw new ServiceException("请等待企业填报!"); } - return success(basicInformationService.audit(req, 3)); + return success(basicInformationService.audit(req, 3,byId.getStatus())); } /** @@ -249,169 +256,15 @@ public class BasicInformationController extends BaseController { } /** - * 动态导出基本信息(基本信息,建筑,规划) + * 导出项目数据 */ - @PreAuthorize("@ss.hasAnyRoles('admin,common')") - @ApiOperation("动态导出基本信息(基本信息,建筑,规划)") +// @PreAuthorize("@ss.hasAnyRoles('admin,common')") + @ApiOperation("导出项目数据") @PostMapping("/exportInfo") - public void exportInfo(HttpServletResponse response, @RequestParam List idList) throws NoSuchFieldException, IOException, IllegalAccessException { - //获取对应的基本信息的列表 - List info = basicInformationService.selectList(idList); - - System.out.println(info); - //excel 第一层单元格 - List yc = new ArrayList<>(); - //excel 第二层单元格 - List ec = new ArrayList<>(); - //excel 第三层单元格 - List sc = new ArrayList<>(); - //项目建筑信息数据所有字段数量 - int sczdData = 0; - //一共有几组厂房,不包括重复 - int cfsl = 0; - //动态存储每个分组对应的字段数量 - Map zdsl = new LinkedHashMap<>(); - Class clazz = ProjectExcelInfo.class; - Class classBuilding = ProjectBuildingExcel.class; - // 遍历除了建筑获取其他字段注解 - for (int i = 0; i < info.size(); i++) { - if (i == 0) { - if(info.get(i).getXmjzxx().isEmpty()){ - throw new ServiceException("请选择有楼栋的项目!"); - } - for (Field field : clazz.getDeclaredFields()) { - Excel excelColumn = field.getAnnotation(Excel.class); - if (excelColumn != null) { - if (yc.contains(excelColumn.group())) { - yc.add(""); - } else { - yc.add(excelColumn.group()); - } - if ("id".equals(excelColumn.name())) { - sc.add(""); - } else { - sc.add(excelColumn.name()); - } - if (!Objects.equals(excelColumn.group(), "序号")) { - zdsl.merge(excelColumn.group(), 1, Integer::sum); - } - ec.add(""); - } - } - } - for (ProjectBuildingExcel xmjzxx : info.get(i).getXmjzxx()) { - switch (xmjzxx.getFloor()) { - case 1: - if (!ec.contains("一层厂房")) { - ec.add("一层厂房"); - cfsl += 1; - } - break; - case 2: - if (!ec.contains("双层厂房")) { - ec.add("双层厂房"); - cfsl += 1; - } - break; - case 3: - if (!ec.contains("三层厂房")) { - ec.add("三层厂房"); - cfsl += 1; - } - break; - case 4: - if (!ec.contains("四层厂房")) { - ec.add("四层厂房"); - cfsl += 1; - } - break; - case 5: - if (!ec.contains("五层厂房")) { - ec.add("五层厂房"); - cfsl += 1; - } - break; - default: - if (!ec.contains("六层及以上厂房")) { - ec.add("六层及以上厂房"); - cfsl += 1; - } - } - for (Field field : classBuilding.getDeclaredFields()) { - Excel excelColumn = field.getAnnotation(Excel.class); - if (excelColumn != null) { - if (!yc.contains("项目建筑信息")) { - yc.add("项目建筑信息"); - } else { - yc.add(""); - } - ec.add(""); - sc.add(excelColumn.name()); - sczdData += 1; - } - } - ec.remove(ec.size() - 1); - } - } - //=======================sheet处理 - // 第一步,创建一个Workbook,对应一个Excel文件 - XSSFWorkbook wb = new XSSFWorkbook(); - // 第二步,在Workbook中添加一个sheet,对应Excel文件中的sheet - XSSFSheet sheet = wb.createSheet("sheet"); - // 第三步,设置样式以及字体样式 - XSSFCellStyle titleStyle = ChangeExcelUtil.createTitleCellStyle(wb); - XSSFCellStyle headerStyle = ChangeExcelUtil.createHeadCellStyle(wb); - XSSFCellStyle contentStyle = ChangeExcelUtil.createContentCellStyle(wb); - // 行号 - int rowNum = 0; - // 创建第一页的第一行,索引从0开始 - XSSFRow row0 = sheet.createRow(rowNum++); - row0.setHeight((short) 600);// 设置行高 - sheet.setColumnWidth(1, 6000); - sheet.setColumnWidth(2, 6000); - //第二行 - XSSFRow row1 = sheet.createRow(rowNum++); - row1.setHeight((short) 500); - //第三行 - XSSFRow row2 = sheet.createRow(rowNum++); - row2.setHeight((short) 1000); - //合并单元格:excel,除了项目建筑信息的其余字段数量,项目建筑信息数据所有字段数量,一共有几组厂房,不包括重复 - ChangeExcelUtil.extracted(sheet, zdsl, sczdData, cfsl); - - // 创建第一行单元格 - for (int i = 0; i < yc.size(); i++) { - XSSFCell c00 = row0.createCell(i); - c00.setCellValue(yc.get(i)); - c00.setCellStyle(headerStyle); - } - // 创建第二行单元格 - for (int i = 0; i < ec.size(); i++) { - XSSFCell tempCell = row1.createCell(i); - tempCell.setCellValue(ec.get(i)); - tempCell.setCellStyle(headerStyle); - } - // 创建第三行单元格 - for (int i = 0; i < sc.size(); i++) { - XSSFCell tempCell = row2.createCell(i); - tempCell.setCellValue(sc.get(i)); - tempCell.setCellStyle(headerStyle); - } - //填充数据 - basicInformationService.approvalMethodfillInData(sheet, contentStyle, rowNum, info, sc, ec, sczdData / cfsl); - - // 1. 设置响应头(必须) - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - response.setCharacterEncoding("UTF-8"); - // 设置文件名(解决中文乱码) - String fileName = URLEncoder.encode("项目信息.xlsx", "UTF-8"); - response.setHeader("Content-Disposition", "attachment; filename=" + fileName); - try (ServletOutputStream out = response.getOutputStream()) { - // 3. 将 Workbook 写入响应流 - wb.write(out); - out.flush(); - } finally { - wb.close(); - } + public void exportInfo(HttpServletResponse response){ + List pE = basicInformationService.selectList(); + ExcelUtil util = new ExcelUtil<>(ProjectExcelInfo.class); + util.exportExcel(response, pE, "项目数据"); } @@ -437,5 +290,44 @@ public class BasicInformationController extends BaseController { ExcelUtil util = new ExcelUtil<>(BasicInformation.class); util.exportExcel(response, filteredList, "基本信息"); } + +// @ApiOperation(value = "123") +//// @PreAuthorize("@ss.hasAnyRoles('admin,common')") +// @PostMapping(value = "/import1", consumes = "multipart/form-data") +// @Transactional(rollbackFor = Exception.class) +// public AjaxResult import1(@RequestPart("file") MultipartFile file) throws Exception { +// ExcelUtil util = new ExcelUtil<>(ProjectExcelInfo.class); +// List proList = util.importExcel(file.getInputStream()); +// proList.forEach(x->{ +// // 1. 分割字符串 +// String[] dates = x.getA1().split("-"); +// if (dates.length != 2) { +// throw new IllegalArgumentException("无效的日期范围格式"); +// } +// BasicInformation basicInformation = new BasicInformation(); +// basicInformation.setName(x.getName()); +// basicInformation.setXmfrdwxz(x.getXmfrdwxz()); +// basicInformation.setNature(x.getNature()); +// basicInformation.setBegainTime(dates[0].replace(".","-").trim()); +// basicInformation.setEndTime(dates[1].replace(".","-").trim()); +// basicInformation.setXzfl(x.getXzfl()); +// basicInformation.setJhtze(x.getJhtze()); +// basicInformation.setProjectLeader(x.getProjectLeader()); +// basicInformation.setPhone(x.getPhone()); +// basicInformation.setJsjd(x.getJsjd()); +// basicInformation.setJsms(x.getJsms()); +// basicInformation.setPrioritize(x.getPrioritize()); +// basicInformation.setStatus(3); +// PlanInformation planInformation = new PlanInformation(); +// planInformation.setZydmj(x.getZydmj()); +// planInformation.setRjl(x.getRjl()); +// planInformation.setZjzmj(x.getZjzmj()); +// planInformation.setBzcjzmj(x.getBzcjzmj()); +// basicInformationService.save(basicInformation); +// planInformation.setXmId(basicInformation.getId()); +// planInformationService.save(planInformation); +// }); +// return AjaxResult.success(); +// } } 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 726ae58..6ea103f 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,21 +1,37 @@ 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; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.gysl.entity.BasicInformation; +import com.ruoyi.gysl.entity.stats.AllProjectResponse; +import com.ruoyi.gysl.entity.stats.RibbonResponse; 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; 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 java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 政务统计控制层 @@ -32,6 +48,9 @@ public class ZwStatsController extends BaseController { @Resource private ZwStatsService zwStatsService; + @Value("${ruoyi.profile}") + private String fileAddress; + @Resource private BasicInformationService basicInformationService; @@ -117,5 +136,68 @@ public class ZwStatsController extends BaseController { public AjaxResult slfx() { return success(zwStatsService.slfx()); } + + + /** + * 导出项目总体报告 + */ + @ApiOperation(value = "导出项目总体报告") + @PostMapping(value = "/exportBg") + public void exportBg(HttpServletResponse response,@Valid String years) throws Exception { + + // 设置响应内容类型和头部 + response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + response.setHeader("Content-Disposition", "attachment; filename=\"example.docx\""); + //获取总体项目情况 + AllProjectResponse allProjectResponse = zwStatsService.allProject(years); + //获取功能区 + 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()); + +// String fatherFile = fileAddress + "/out.docx"; +// FileUtil.newFile(fatherFile); + 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(); + } + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/stats/AllProjectResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/stats/AllProjectResponse.java index dc725ff..a68f514 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/stats/AllProjectResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/stats/AllProjectResponse.java @@ -37,7 +37,7 @@ public class AllProjectResponse { private BigDecimal currentYearGrossArea; @ApiModelProperty("当年_已建数量") - private Integer currentYearBuilding1; + private Integer currentBuilding1; @ApiModelProperty("当年_在建数量") private Integer currentBuilding2; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/ZwStatsMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/ZwStatsMapper.java index 64d3e39..bb9cfb3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/ZwStatsMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/ZwStatsMapper.java @@ -48,5 +48,15 @@ public interface ZwStatsMapper { * 产业导向目录分析 */ List mlfx(); + + /** + * 产业导向细分产业分析总数 + */ + int allXfcyfx(); + + /** + * 产业导向目录分析总数 + */ + int allMlfx(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/ZwStatsServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/ZwStatsServiceImpl.java index cd87f2a..e415546 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/ZwStatsServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/ZwStatsServiceImpl.java @@ -74,16 +74,7 @@ public class ZwStatsServiceImpl implements ZwStatsService { */ @Override public List xfcyfx() { - if (!redisCache.hasKey("xfcyfx")) { - List mlfx = zwStatsMapper.xfcyfx(); - redisCache.setCacheList("xfcyfx", mlfx); - return mlfx; - } else { - List mlfx = redisCache.getCacheList("xfcyfx"); - return mlfx.stream() - .map(obj -> (RibbonResponse) obj) - .collect(Collectors.toList()); - } + return zwStatsMapper.xfcyfx(); } /** @@ -91,16 +82,7 @@ public class ZwStatsServiceImpl implements ZwStatsService { */ @Override public List mlfx() { - if (!redisCache.hasKey("ml")) { - List mlfx = zwStatsMapper.mlfx(); - redisCache.setCacheList("ml", mlfx); - return mlfx; - } else { - List mlfx = redisCache.getCacheList("ml"); - return mlfx.stream() - .map(obj -> (RibbonResponse) obj) - .collect(Collectors.toList()); - } + return zwStatsMapper.mlfx(); } /** @@ -109,37 +91,13 @@ public class ZwStatsServiceImpl implements ZwStatsService { @Override public List slfx() { List a1 = new ArrayList<>(); - List mlfx1; - if (redisCache.hasKey("xfcyfx")) { - mlfx1 = redisCache.getCacheList("xfcyfx").stream() - .map(obj -> (RibbonResponse) obj) - .collect(Collectors.toList()); - } else { - mlfx1 = zwStatsMapper.xfcyfx(); - } - int count1 = 0; - for (RibbonResponse x : mlfx1) { - count1 += x.getCount(); - } RibbonResponse r1 = new RibbonResponse(); - r1.setCount(count1); + r1.setCount(zwStatsMapper.allXfcyfx()); r1.setSsgnq("细分产业分析"); - a1.add(r1); - List mlfx2; - if (redisCache.hasKey("ml")) { - mlfx2 = redisCache.getCacheList("ml").stream() - .map(obj -> (RibbonResponse) obj) - .collect(Collectors.toList()); - } else { - mlfx2 = zwStatsMapper.xfcyfx(); - } - int count2 = 0; - for (RibbonResponse x : mlfx2) { - count2 += x.getCount(); - } RibbonResponse r2 = new RibbonResponse(); - r2.setCount(count2); + r2.setCount(zwStatsMapper.allMlfx()); r2.setSsgnq("目录分析"); + a1.add(r1); a1.add(r2); return a1; } diff --git a/ruoyi-admin/src/main/resources/mapper/ZwStatsMapper.xml b/ruoyi-admin/src/main/resources/mapper/ZwStatsMapper.xml index 9eedd37..7c7c5e9 100644 --- a/ruoyi-admin/src/main/resources/mapper/ZwStatsMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/ZwStatsMapper.xml @@ -40,7 +40,7 @@ CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) and a.xzfl = 1 THEN 1 ELSE 0 END - ), 0) AS currentYearBuilding1, + ), 0) AS currentBuilding1, IFNULL(SUM( @@ -146,5 +146,21 @@ ORDER BY b.dict_value;-- 按字典排序(可选)` + + diff --git a/ruoyi-admin/src/main/resources/ztbgmb.docx b/ruoyi-admin/src/main/resources/ztbgmb.docx new file mode 100644 index 0000000000000000000000000000000000000000..c5beacf5e53a58b5bbc5912a0fbdceb961a6a292 GIT binary patch literal 17902 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