| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453 |
- 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<PicData> picList = new ArrayList<>();
- if(benchmarkLandPriceReport.getPicBase64List()!=null&&!benchmarkLandPriceReport.getPicBase64List().isEmpty()){
- ObjectMapper objectMapper=new ObjectMapper();
- List<String> picBase64List=objectMapper.readValue(benchmarkLandPriceReport.getPicBase64List(), new TypeReference<List<String>>(){});
- //将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<LandPriceEstimation> landPriceEstimationList = new ArrayList<>();
- Gson gson = new Gson();
- Type listType = new TypeToken<List<ghdkDetailedDjList>>() {}.getType();
- List<ghdkDetailedDjList> 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<String, Double[]> 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<BenchmarkLandPriceTotal> benchmarkLandPriceTotals = new ArrayList<>();
- for (Map.Entry<String, Double[]> 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<ZtBillboardmodellist> 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<ZtBillboardmodellistDto> 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<List<AttachedDto>>() {}.getType();
- List<AttachedDto> 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<List<ggpresultDto>>() {}.getType();
- List<ggpresultDto> 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<ZtBillboardJt> ztBillboardJtList=ztBillboardJtService.selectZtBillboardJtList(ztBillboardJt);
- List<PicData> 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<ZtBillboardmodellisthistory> ztBillboardmodellisthistoryList=ztBillboardmodellisthistoryService.selectZtBillboardmodellisthistoryList(ztBillboardmodellisthistory);
- if(ztBillboardmodellisthistoryList.stream().count()>0){
- List<ZtBillboardmodellistDto> 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<templateParameterDto>() {}.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();
- }
- }
- }
|