package com.onemap.sanya.controller; import com.alibaba.nacos.shaded.com.google.common.reflect.TypeToken; import com.alibaba.nacos.shaded.com.google.gson.Gson; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.data.PictureRenderData; import com.deepoove.poi.data.PictureType; import com.deepoove.poi.data.Pictures; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.onemap.common.core.utils.StringUtils; import com.onemap.common.core.utils.bean.BeanUtils; import com.onemap.common.core.web.controller.BaseController; import com.onemap.sanya.domain.*; import com.onemap.sanya.domain.CQBC.CompensateEstimateReport; import com.onemap.sanya.domain.GGP.*; import com.onemap.sanya.domain.business.ZtBillboardJt; import com.onemap.sanya.domain.business.ZtBillboardinfolist; import com.onemap.sanya.domain.business.ZtBillboardmodellist; import com.onemap.sanya.domain.business.ZtBillboardmodellisthistory; import com.onemap.sanya.domain.mergeCell.JZDJTableRenderPolicy; import com.onemap.sanya.service.IZtBillboardJtService; import com.onemap.sanya.service.IZtBillboardmodellistService; import com.onemap.sanya.service.IZtBillboardmodellisthistoryService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.lang.reflect.Type; import java.net.URLEncoder; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @author Zzz */ @RestController @RequestMapping("/exportWord") public class SanYaController extends BaseController { private static final Logger log = LoggerFactory.getLogger(SanYaController.class); @Autowired private IZtBillboardmodellistService ztBillboardmodellistService; @Autowired private IZtBillboardJtService ztBillboardJtService; @Autowired private IZtBillboardmodellisthistoryService ztBillboardmodellisthistoryService; /** * 导出征收补偿预估报告word * @param request * @param response */ @PostMapping("/exportWord3") private void exportWord3(@RequestBody CompensateEstimateReport compensateEstimateReport, HttpServletRequest request, HttpServletResponse response) { try { // CompensateEstimateReport compensateEstimateReport = setWordData3(); if (compensateEstimateReport == null) { log.info("征收补偿预估报告数据为空,导出失败!"); return; } //总费用预估 Double feeETC=compensateEstimateReport.getZdResult().getTotalPay()+compensateEstimateReport.getQmResult().getTotalPay()+compensateEstimateReport.getCqResult().getTotalPay(); compensateEstimateReport.setFeeETC(feeETC); //房屋拆迁补偿费预估 compensateEstimateReport.setFeeECLA(compensateEstimateReport.getZdResult().getTotalPay()); //征地费用预估 compensateEstimateReport.setFeeECHD(compensateEstimateReport.getCqResult().getTotalPay()); //青苗补偿费预估 compensateEstimateReport.setFeeECYC(compensateEstimateReport.getQmResult().getTotalPay()); ClassPathResource classPathResource = new ClassPathResource("template/word/"+"03-征收补偿预估报告-02.docx"); InputStream inputStream = classPathResource.getInputStream(); Configure configure = Configure.builder() .bind("cqZBData.BCBZ", new LoopRowTableRenderPolicy()) .bind("cqResult.list", new LoopRowTableRenderPolicy()) .build(); // 通过 XWPFTemplate 编译文件并渲染数据到模板中 XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(compensateEstimateReport); //生成临时文件存放地址 //String temDir = basePath; //生成文件名 // String wordName = "03-征收补偿预估报告-02" + "-" + System.currentTimeMillis(); String wordName =compensateEstimateReport.getName(); writeWord(response, null, wordName, template); } catch (Exception e) { e.printStackTrace(); log.error("征收补偿预估报告导出异常,{}" + e); } } /** * 导出基准地价报告word * @param request * @param response */ @PostMapping("/exportWord4") private void exportWord4(@RequestBody BenchmarkLandPriceReport benchmarkLandPriceReport, HttpServletRequest request, HttpServletResponse response) { try { if (benchmarkLandPriceReport == null) { log.info("基准地价报告数据为空,导出失败!"); return ; } List picList = new ArrayList<>(); if(benchmarkLandPriceReport.getPicBase64List()!=null&&!benchmarkLandPriceReport.getPicBase64List().isEmpty()){ ObjectMapper objectMapper=new ObjectMapper(); List picBase64List=objectMapper.readValue(benchmarkLandPriceReport.getPicBase64List(), new TypeReference>(){}); //将base64图片转为PictureRenderData for (String base64ImageData:picBase64List) { PictureRenderData pictureRenderData =Pictures.ofBase64(base64ImageData, PictureType.JPEG).size(400, 300).create(); picList.add(new PicData(pictureRenderData)); } benchmarkLandPriceReport.setPicList(picList); } //组合地块价格详情 ClassPathResource classPathResource = new ClassPathResource("template/word/"+"04-基准地价报告-02.docx"); InputStream inputStream = classPathResource.getInputStream(); List landPriceEstimationList = new ArrayList<>(); Gson gson = new Gson(); Type listType = new TypeToken>() {}.getType(); List myObjects = gson.fromJson(benchmarkLandPriceReport.getGhdkDetailedDjList(), listType); for (ghdkDetailedDjList ghdkDetailedDj: myObjects){ for (LandPriceEstimation landPriceEstimation :ghdkDetailedDj.getZytdList()){ landPriceEstimation.setDkbm(ghdkDetailedDj.getDkbm()); landPriceEstimation.setGhyt(ghdkDetailedDj.getGhyt()); landPriceEstimationList.add(landPriceEstimation); } } benchmarkLandPriceReport.setDetailedDJList(landPriceEstimationList); //组合地块类型分组计算分组总价 Map groupSums = new HashMap<>(); // 遍历数组并按groupName分组,同时初始化value1和value2的和为0 for (LandPriceEstimation item : landPriceEstimationList) { groupSums.putIfAbsent(item.getGhyt(), new Double[]{0.0, 0.0}); Double[] sums = groupSums.get(item.getGhyt()); sums[0] += item.getArea(); // 更新value1的和 sums[1] += item.getZdj(); // 更新value2的和 } // 将Map转换为ArrayList List benchmarkLandPriceTotals = new ArrayList<>(); for (Map.Entry entry : groupSums.entrySet()) { DecimalFormat format = new DecimalFormat("#.00"); String str0 = format.format(entry.getValue()[0]); double Value0 = Double.parseDouble(str0); String str1 = format.format(entry.getValue()[1]); double Value1 = Double.parseDouble(str1); benchmarkLandPriceTotals.add(new BenchmarkLandPriceTotal(entry.getKey(), Value0, Value1)); } benchmarkLandPriceReport.setBenchmarkLandPriceTotalList(benchmarkLandPriceTotals); Double ParticipationAreaSum=benchmarkLandPriceTotals.stream().mapToDouble(BenchmarkLandPriceTotal::getJStotalArea).sum(); DecimalFormat decimalFormat = new DecimalFormat("#.##"); String ParticipationArea = decimalFormat.format(ParticipationAreaSum); benchmarkLandPriceReport.setParticipationArea(ParticipationArea); //导入表格渲染配置 Configure configure = Configure.builder() .bind("benchmarkLandPriceTotalList", new LoopRowTableRenderPolicy()) .bind("DetailedDJList", new JZDJTableRenderPolicy()).build(); // 通过 XWPFTemplate 编译文件并渲染数据到模板中 XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(benchmarkLandPriceReport); //生成文件名 // String wordName = "04-基准地价报告-02" + "-" + System.currentTimeMillis(); String wordName = benchmarkLandPriceReport.getProjectName(); writeWord(response, null, wordName, template); } catch (Exception e) { e.printStackTrace(); log.error("基准地价报告导出异常,{}" + e); } } /** * 导出广告牌报告word * @param request * @param response */ @PostMapping("/exportGGPWord") private void exportGGPWord(@RequestBody ZtBillboardinfolist ztBillboardinfolist, HttpServletRequest request, HttpServletResponse response) { try { if (ztBillboardinfolist == null) { log.info("广告牌报告数据为空,导出失败!"); return ; } ZtBillboardinfolistDto ztBillboardinfolistDto=new ZtBillboardinfolistDto(); BeanUtils.copyProperties(ztBillboardinfolist,ztBillboardinfolistDto ); if (ztBillboardinfolist.getCheckDate() != null && ztBillboardinfolist.getCheckDate() instanceof Date) { // 将Date对象格式化为所需的字符串格式 // 例如: "yyyy-MM-dd HH:mm:ss" String d= new SimpleDateFormat("yyyy-MM-dd").format((Date) ztBillboardinfolist.getCheckDate()); ztBillboardinfolistDto.setCheckDate(d); } //获取项目下的广告牌 ZtBillboardmodellist ztBillboardmodel=new ZtBillboardmodellist(); ztBillboardmodel.setBillboardInfoId(ztBillboardinfolistDto.getId()); List ztBillboardmodellists = ztBillboardmodellistService.selectZtBillboardmodellistList(ztBillboardmodel); //项目广告牌总数 ztBillboardinfolistDto.setGgpSum(ztBillboardmodellists.stream().count()); ztBillboardinfolistDto.setCensored(ztBillboardmodellists.stream().filter(obj -> obj.getresults() != null && ! obj.getresults().isEmpty()).count()); ztBillboardinfolistDto.setUncensored(ztBillboardmodellists.stream().filter(obj -> obj.getresults() == null || obj.getresults().toString().isEmpty()).count()); ztBillboardinfolistDto.setPassedSum(ztBillboardmodellists.stream().filter(c->"已通过".equals(c.getReviewStatus())).count()); ztBillboardinfolistDto.setUnPassedSum(ztBillboardmodellists.stream().filter(c->"未通过".equals(c.getReviewStatus())).count()); //组织审查条件数据 List ztBillboardmodellistDtos = new ArrayList<>(); BeanUtils.copyProperties(ztBillboardmodellists,ztBillboardmodellistDtos); for (int i = 0; i < ztBillboardmodellists.size(); i++) { ZtBillboardmodellistDto ztBillboardmodellistDto=new ZtBillboardmodellistDto(); BeanUtils.copyProperties(ztBillboardmodellists.get(i), ztBillboardmodellistDto); if (ztBillboardmodellists.get(i).getreview_date() != null && ztBillboardmodellists.get(i).getreview_date() instanceof Date) { // 将Date对象格式化为所需的字符串格式 // 例如: "yyyy-MM-dd HH:mm:ss" String d= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) ztBillboardmodellists.get(i).getreview_date()); ztBillboardmodellistDto.setReview_date(d); } if(ztBillboardmodellists.get(i).getReviewStatus()==null || "".equals(ztBillboardmodellists.get(i).getReviewStatus())){ ztBillboardmodellistDto.setIsReview("未审查"); }else{ ztBillboardmodellistDto.setIsReview("已审查"); } Type AttachedDtoTypes = new TypeToken>() {}.getType(); List attachedDtos = new ArrayList<>(); if(ztBillboardmodellists.get(i).getAttachedData()!=null&&!"".equals(ztBillboardmodellists.get(i).getAttachedData())&&!"{}".equals(ztBillboardmodellists.get(i).getAttachedData())){ Gson gson = new Gson(); attachedDtos=gson.fromJson(ztBillboardmodellists.get(i).getAttachedData(), AttachedDtoTypes); } ztBillboardmodellistDto.setAttachedDatas(attachedDtos); ztBillboardmodellistDtos.add(ztBillboardmodellistDto); // 注意:BeanUtils.copyProperties的源对象和目标对象参数顺序是反的,即先目标后源 } for (ZtBillboardmodellistDto ztBillboardmodellistDto : ztBillboardmodellistDtos) { Gson gson = new Gson(); Type listType = new TypeToken>() {}.getType(); List ggpresultDtoList = gson.fromJson(ztBillboardmodellistDto.getResults(), listType); if(ggpresultDtoList!=null && ggpresultDtoList.size()>0){ int ind=0; for (ggpresultDto ggpresultDto : ggpresultDtoList) { if("true".equals(ggpresultDto.getRuleResult())){ ggpresultDto.setRuleResult("符合"); }else{ ggpresultDto.setRuleResult("不符合"); } ind+=1; ggpresultDto.setIndex(String.valueOf(ind)); } ztBillboardmodellistDto.setGgpresultList(ggpresultDtoList); } ZtBillboardJt ztBillboardJt = new ZtBillboardJt(); ztBillboardJt.setModelid(ztBillboardmodellistDto.getId()); List ztBillboardJtList=ztBillboardJtService.selectZtBillboardJtList(ztBillboardJt); List DataList=new ArrayList<>(); //将base64图片转为PictureRenderData for (ZtBillboardJt ztBillboardJt1 : ztBillboardJtList) { PictureRenderData pictureRenderData =Pictures.ofBase64(ztBillboardJt1.getJtBase(), PictureType.JPEG).size(400, 300).create(); DataList.add(new PicData(pictureRenderData)); } if(ztBillboardmodellistDto.getIsAddModel()){ //最新修改的参数 templateParameter(ztBillboardmodellistDto); //历史修改参数 ZtBillboardmodellisthistory ztBillboardmodellisthistory=new ZtBillboardmodellisthistory(); ztBillboardmodellisthistory.setId(ztBillboardmodellistDto.getId()); List ztBillboardmodellisthistoryList=ztBillboardmodellisthistoryService.selectZtBillboardmodellisthistoryList(ztBillboardmodellisthistory); if(ztBillboardmodellisthistoryList.stream().count()>0){ List ztBillboardmodellistDtoList=new ArrayList<>(); for (ZtBillboardmodellisthistory ztBillboardmodellisthistory1:ztBillboardmodellisthistoryList){ ZtBillboardmodellistDto ztBillboardmodellisthistoryDto=new ZtBillboardmodellistDto(); BeanUtils.copyProperties(ztBillboardmodellisthistory1, ztBillboardmodellisthistoryDto); if (ztBillboardmodellisthistory1.getCreateTime() != null && ztBillboardmodellisthistory1.getCreateTime() instanceof Date) { // 将Date对象格式化为所需的字符串格式 // 例如: "yyyy-MM-dd HH:mm:ss" String d= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) ztBillboardmodellisthistory1.getCreateTime()); ztBillboardmodellisthistoryDto.setCreateTimeString(d); } templateParameter(ztBillboardmodellisthistoryDto); ztBillboardmodellistDtoList.add(ztBillboardmodellisthistoryDto); } if(ztBillboardmodellistDtoList.size()>0){ ztBillboardmodellistDto.setZtBillboardmodellisthistoryDtoList(ztBillboardmodellistDtoList); } } } ztBillboardmodellistDto.setJTList(DataList); } ztBillboardinfolistDto.setZtBillboardmodellistDtoList(ztBillboardmodellistDtos); ClassPathResource classPathResource = new ClassPathResource("template/word/"+"广告牌审查意见.docx"); InputStream inputStream = classPathResource.getInputStream(); Configure configure = Configure.builder().useSpringEL() .bind("ggpresultList", new LoopRowTableRenderPolicy()).build(); // 通过 XWPFTemplate 编译文件并渲染数据到模板中 XWPFTemplate template = XWPFTemplate.compile(inputStream,configure).render(ztBillboardinfolistDto); //生成文件名 String wordName = ztBillboardinfolistDto.getProjectname(); writeWord(response, null, wordName, template); } catch (Exception e) { e.printStackTrace(); log.error("广告牌报告导出异常,{}" + e); } } /** * 处理广告模板 */ private void templateParameter(ZtBillboardmodellistDto ztBillboardmodellistDto ){ Gson gson = new Gson(); Type templateParameterType = new TypeToken() {}.getType(); templateParameterDto TemplateTop = null; if(ztBillboardmodellistDto.getTemplateTop()!=null&&!"{}".equals(ztBillboardmodellistDto.getTemplateTop())){ TemplateTop=gson.fromJson(ztBillboardmodellistDto.getTemplateTop(), templateParameterType); } templateParameterDto TemplateCentre =null; if(ztBillboardmodellistDto.getTemplateCentre()!=null&&!"{}".equals(ztBillboardmodellistDto.getTemplateCentre())){ TemplateCentre=gson.fromJson(ztBillboardmodellistDto.getTemplateCentre(), templateParameterType); } templateParameterDto TemplateBottom =null; if(ztBillboardmodellistDto.getTemplateBottom()!=null&&!"{}".equals(ztBillboardmodellistDto.getTemplateBottom())){ TemplateBottom=gson.fromJson(ztBillboardmodellistDto.getTemplateBottom(), templateParameterType); } if(TemplateTop != null&& TemplateTop.getTemplateType()!=null){ switch (TemplateTop.getTemplateType()){ case "billboard": case "box": TemplateTop.setXLname("长(米)"); TemplateTop.setYLname("高(米)"); TemplateTop.setZLname("厚度(米)"); break; case "model": TemplateTop.setScaleLname("缩放比例"); TemplateTop.setXLname("长(米)"); TemplateTop.setYLname("高(米)"); TemplateTop.setZLname("厚度(米)"); break; } } if(TemplateTop.getTemplateType()==null){ TemplateTop.setXLname("长(米)"); TemplateTop.setYLname("高(米)"); TemplateTop.setZLname("厚度(米)"); } ztBillboardmodellistDto.setTemplateTopObj(TemplateTop); if(TemplateCentre!= null && TemplateCentre.getTemplateType()!=null){ switch (TemplateCentre.getTemplateType()){ case "cylinder": TemplateCentre.setYLname("高(米)"); TemplateCentre.setRLname("半径(米)"); break; } } ztBillboardmodellistDto.setTemplateCentreObj(TemplateCentre); if(TemplateBottom!= null && TemplateBottom.getTemplateType()!=null){ switch (TemplateBottom.getTemplateType()){ case "box": TemplateBottom.setXLname("长(米)"); TemplateBottom.setYLname("高(米)"); TemplateBottom.setZLname("厚度(米)"); break; } } ztBillboardmodellistDto.setTemplateBottomObj(TemplateBottom); } /** * word写出 * * @param response * @param temDir * @param wordName * @param template * @throws Exception */ private void writeWord(HttpServletResponse response, String temDir, String wordName, XWPFTemplate template) throws Exception { // 生成的word格式 String formatSuffix = ".docx"; // 拼接后的文件名 文件名.带后缀 String fileName = wordName + formatSuffix; //=================生成word到设置浏览默认下载地址================= // 设置强制下载不打开 response.setContentType("application/force-download"); response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); // 设置文件名 response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); OutputStream out = response.getOutputStream(); template.write(out); out.flush(); out.close(); template.close(); //删除临时文件 if(StringUtils.isNotEmpty(temDir)){ File file = new File(temDir + fileName); file.setWritable(true); file.delete(); } } }