SanYaController.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. package com.onemap.sanya.controller;
  2. import com.alibaba.nacos.shaded.com.google.common.reflect.TypeToken;
  3. import com.alibaba.nacos.shaded.com.google.gson.Gson;
  4. import com.deepoove.poi.XWPFTemplate;
  5. import com.deepoove.poi.config.Configure;
  6. import com.deepoove.poi.data.PictureRenderData;
  7. import com.deepoove.poi.data.PictureType;
  8. import com.deepoove.poi.data.Pictures;
  9. import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
  10. import com.fasterxml.jackson.core.type.TypeReference;
  11. import com.fasterxml.jackson.databind.ObjectMapper;
  12. import com.onemap.common.core.utils.StringUtils;
  13. import com.onemap.common.core.utils.bean.BeanUtils;
  14. import com.onemap.common.core.web.controller.BaseController;
  15. import com.onemap.sanya.domain.*;
  16. import com.onemap.sanya.domain.CQBC.CompensateEstimateReport;
  17. import com.onemap.sanya.domain.GGP.*;
  18. import com.onemap.sanya.domain.business.ZtBillboardJt;
  19. import com.onemap.sanya.domain.business.ZtBillboardinfolist;
  20. import com.onemap.sanya.domain.business.ZtBillboardmodellist;
  21. import com.onemap.sanya.domain.business.ZtBillboardmodellisthistory;
  22. import com.onemap.sanya.domain.mergeCell.JZDJTableRenderPolicy;
  23. import com.onemap.sanya.service.IZtBillboardJtService;
  24. import com.onemap.sanya.service.IZtBillboardmodellistService;
  25. import com.onemap.sanya.service.IZtBillboardmodellisthistoryService;
  26. import org.slf4j.Logger;
  27. import org.slf4j.LoggerFactory;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.core.io.ClassPathResource;
  30. import org.springframework.web.bind.annotation.*;
  31. import javax.servlet.http.HttpServletRequest;
  32. import javax.servlet.http.HttpServletResponse;
  33. import java.io.*;
  34. import java.lang.reflect.Type;
  35. import java.net.URLEncoder;
  36. import java.text.DecimalFormat;
  37. import java.text.SimpleDateFormat;
  38. import java.util.*;
  39. import java.util.stream.Collectors;
  40. /**
  41. * @author Zzz
  42. */
  43. @RestController
  44. @RequestMapping("/exportWord")
  45. public class SanYaController extends BaseController {
  46. private static final Logger log = LoggerFactory.getLogger(SanYaController.class);
  47. @Autowired
  48. private IZtBillboardmodellistService ztBillboardmodellistService;
  49. @Autowired
  50. private IZtBillboardJtService ztBillboardJtService;
  51. @Autowired
  52. private IZtBillboardmodellisthistoryService ztBillboardmodellisthistoryService;
  53. /**
  54. * 导出征收补偿预估报告word
  55. * @param request
  56. * @param response
  57. */
  58. @PostMapping("/exportWord3")
  59. private void exportWord3(@RequestBody CompensateEstimateReport compensateEstimateReport, HttpServletRequest request, HttpServletResponse response) {
  60. try {
  61. // CompensateEstimateReport compensateEstimateReport = setWordData3();
  62. if (compensateEstimateReport == null) {
  63. log.info("征收补偿预估报告数据为空,导出失败!");
  64. return;
  65. }
  66. //总费用预估
  67. Double feeETC=compensateEstimateReport.getZdResult().getTotalPay()+compensateEstimateReport.getQmResult().getTotalPay()+compensateEstimateReport.getCqResult().getTotalPay();
  68. compensateEstimateReport.setFeeETC(feeETC);
  69. //房屋拆迁补偿费预估
  70. compensateEstimateReport.setFeeECLA(compensateEstimateReport.getZdResult().getTotalPay());
  71. //征地费用预估
  72. compensateEstimateReport.setFeeECHD(compensateEstimateReport.getCqResult().getTotalPay());
  73. //青苗补偿费预估
  74. compensateEstimateReport.setFeeECYC(compensateEstimateReport.getQmResult().getTotalPay());
  75. ClassPathResource classPathResource = new ClassPathResource("template/word/"+"03-征收补偿预估报告-02.docx");
  76. InputStream inputStream = classPathResource.getInputStream();
  77. Configure configure = Configure.builder()
  78. .bind("cqZBData.BCBZ", new LoopRowTableRenderPolicy())
  79. .bind("cqResult.list", new LoopRowTableRenderPolicy())
  80. .build();
  81. // 通过 XWPFTemplate 编译文件并渲染数据到模板中
  82. XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(compensateEstimateReport);
  83. //生成临时文件存放地址
  84. //String temDir = basePath;
  85. //生成文件名
  86. // String wordName = "03-征收补偿预估报告-02" + "-" + System.currentTimeMillis();
  87. String wordName =compensateEstimateReport.getName();
  88. writeWord(response, null, wordName, template);
  89. } catch (Exception e) {
  90. e.printStackTrace();
  91. log.error("征收补偿预估报告导出异常,{}" + e);
  92. }
  93. }
  94. /**
  95. * 导出基准地价报告word
  96. * @param request
  97. * @param response
  98. */
  99. @PostMapping("/exportWord4")
  100. private void exportWord4(@RequestBody BenchmarkLandPriceReport benchmarkLandPriceReport, HttpServletRequest request, HttpServletResponse response) {
  101. try {
  102. if (benchmarkLandPriceReport == null) {
  103. log.info("基准地价报告数据为空,导出失败!");
  104. return ;
  105. }
  106. List<PicData> picList = new ArrayList<>();
  107. if(benchmarkLandPriceReport.getPicBase64List()!=null&&!benchmarkLandPriceReport.getPicBase64List().isEmpty()){
  108. ObjectMapper objectMapper=new ObjectMapper();
  109. List<String> picBase64List=objectMapper.readValue(benchmarkLandPriceReport.getPicBase64List(), new TypeReference<List<String>>(){});
  110. //将base64图片转为PictureRenderData
  111. for (String base64ImageData:picBase64List) {
  112. PictureRenderData pictureRenderData =Pictures.ofBase64(base64ImageData, PictureType.JPEG).size(400, 300).create();
  113. picList.add(new PicData(pictureRenderData));
  114. }
  115. benchmarkLandPriceReport.setPicList(picList);
  116. }
  117. //组合地块价格详情
  118. ClassPathResource classPathResource = new ClassPathResource("template/word/"+"04-基准地价报告-02.docx");
  119. InputStream inputStream = classPathResource.getInputStream();
  120. List<LandPriceEstimation> landPriceEstimationList = new ArrayList<>();
  121. Gson gson = new Gson();
  122. Type listType = new TypeToken<List<ghdkDetailedDjList>>() {}.getType();
  123. List<ghdkDetailedDjList> myObjects = gson.fromJson(benchmarkLandPriceReport.getGhdkDetailedDjList(), listType);
  124. for (ghdkDetailedDjList ghdkDetailedDj: myObjects){
  125. for (LandPriceEstimation landPriceEstimation :ghdkDetailedDj.getZytdList()){
  126. landPriceEstimation.setDkbm(ghdkDetailedDj.getDkbm());
  127. landPriceEstimation.setGhyt(ghdkDetailedDj.getGhyt());
  128. landPriceEstimationList.add(landPriceEstimation);
  129. }
  130. }
  131. benchmarkLandPriceReport.setDetailedDJList(landPriceEstimationList);
  132. //组合地块类型分组计算分组总价
  133. Map<String, Double[]> groupSums = new HashMap<>();
  134. // 遍历数组并按groupName分组,同时初始化value1和value2的和为0
  135. for (LandPriceEstimation item : landPriceEstimationList) {
  136. groupSums.putIfAbsent(item.getGhyt(), new Double[]{0.0, 0.0});
  137. Double[] sums = groupSums.get(item.getGhyt());
  138. sums[0] += item.getArea(); // 更新value1的和
  139. sums[1] += item.getZdj(); // 更新value2的和
  140. }
  141. // 将Map转换为ArrayList
  142. List<BenchmarkLandPriceTotal> benchmarkLandPriceTotals = new ArrayList<>();
  143. for (Map.Entry<String, Double[]> entry : groupSums.entrySet()) {
  144. DecimalFormat format = new DecimalFormat("#.00");
  145. String str0 = format.format(entry.getValue()[0]);
  146. double Value0 = Double.parseDouble(str0);
  147. String str1 = format.format(entry.getValue()[1]);
  148. double Value1 = Double.parseDouble(str1);
  149. benchmarkLandPriceTotals.add(new BenchmarkLandPriceTotal(entry.getKey(), Value0, Value1));
  150. }
  151. benchmarkLandPriceReport.setBenchmarkLandPriceTotalList(benchmarkLandPriceTotals);
  152. Double ParticipationAreaSum=benchmarkLandPriceTotals.stream().mapToDouble(BenchmarkLandPriceTotal::getJStotalArea).sum();
  153. DecimalFormat decimalFormat = new DecimalFormat("#.##");
  154. String ParticipationArea = decimalFormat.format(ParticipationAreaSum);
  155. benchmarkLandPriceReport.setParticipationArea(ParticipationArea);
  156. //导入表格渲染配置
  157. Configure configure = Configure.builder()
  158. .bind("benchmarkLandPriceTotalList", new LoopRowTableRenderPolicy())
  159. .bind("DetailedDJList", new JZDJTableRenderPolicy()).build();
  160. // 通过 XWPFTemplate 编译文件并渲染数据到模板中
  161. XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(benchmarkLandPriceReport);
  162. //生成文件名
  163. // String wordName = "04-基准地价报告-02" + "-" + System.currentTimeMillis();
  164. String wordName = benchmarkLandPriceReport.getProjectName();
  165. writeWord(response, null, wordName, template);
  166. } catch (Exception e) {
  167. e.printStackTrace();
  168. log.error("基准地价报告导出异常,{}" + e);
  169. }
  170. }
  171. /**
  172. * 导出广告牌报告word
  173. * @param request
  174. * @param response
  175. */
  176. @PostMapping("/exportGGPWord")
  177. private void exportGGPWord(@RequestBody ZtBillboardinfolist ztBillboardinfolist, HttpServletRequest request, HttpServletResponse response) {
  178. try {
  179. if (ztBillboardinfolist == null) {
  180. log.info("广告牌报告数据为空,导出失败!");
  181. return ;
  182. }
  183. ZtBillboardinfolistDto ztBillboardinfolistDto=new ZtBillboardinfolistDto();
  184. BeanUtils.copyProperties(ztBillboardinfolist,ztBillboardinfolistDto );
  185. if (ztBillboardinfolist.getCheckDate() != null && ztBillboardinfolist.getCheckDate() instanceof Date) {
  186. // 将Date对象格式化为所需的字符串格式
  187. // 例如: "yyyy-MM-dd HH:mm:ss"
  188. String d= new SimpleDateFormat("yyyy-MM-dd").format((Date) ztBillboardinfolist.getCheckDate());
  189. ztBillboardinfolistDto.setCheckDate(d);
  190. }
  191. //获取项目下的广告牌
  192. ZtBillboardmodellist ztBillboardmodel=new ZtBillboardmodellist();
  193. ztBillboardmodel.setBillboardInfoId(ztBillboardinfolistDto.getId());
  194. List<ZtBillboardmodellist> ztBillboardmodellists = ztBillboardmodellistService.selectZtBillboardmodellistList(ztBillboardmodel);
  195. //项目广告牌总数
  196. ztBillboardinfolistDto.setGgpSum(ztBillboardmodellists.stream().count());
  197. ztBillboardinfolistDto.setCensored(ztBillboardmodellists.stream().filter(obj -> obj.getresults() != null && ! obj.getresults().isEmpty()).count());
  198. ztBillboardinfolistDto.setUncensored(ztBillboardmodellists.stream().filter(obj -> obj.getresults() == null || obj.getresults().toString().isEmpty()).count());
  199. ztBillboardinfolistDto.setPassedSum(ztBillboardmodellists.stream().filter(c->"已通过".equals(c.getReviewStatus())).count());
  200. ztBillboardinfolistDto.setUnPassedSum(ztBillboardmodellists.stream().filter(c->"未通过".equals(c.getReviewStatus())).count());
  201. //组织审查条件数据
  202. List<ZtBillboardmodellistDto> ztBillboardmodellistDtos = new ArrayList<>();
  203. BeanUtils.copyProperties(ztBillboardmodellists,ztBillboardmodellistDtos);
  204. for (int i = 0; i < ztBillboardmodellists.size(); i++) {
  205. ZtBillboardmodellistDto ztBillboardmodellistDto=new ZtBillboardmodellistDto();
  206. BeanUtils.copyProperties(ztBillboardmodellists.get(i), ztBillboardmodellistDto);
  207. if (ztBillboardmodellists.get(i).getreview_date() != null && ztBillboardmodellists.get(i).getreview_date() instanceof Date) {
  208. // 将Date对象格式化为所需的字符串格式
  209. // 例如: "yyyy-MM-dd HH:mm:ss"
  210. String d= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) ztBillboardmodellists.get(i).getreview_date());
  211. ztBillboardmodellistDto.setReview_date(d);
  212. }
  213. if(ztBillboardmodellists.get(i).getReviewStatus()==null || "".equals(ztBillboardmodellists.get(i).getReviewStatus())){
  214. ztBillboardmodellistDto.setIsReview("未审查");
  215. }else{
  216. ztBillboardmodellistDto.setIsReview("已审查");
  217. }
  218. Type AttachedDtoTypes = new TypeToken<List<AttachedDto>>() {}.getType();
  219. List<AttachedDto> attachedDtos = new ArrayList<>();
  220. if(ztBillboardmodellists.get(i).getAttachedData()!=null&&!"".equals(ztBillboardmodellists.get(i).getAttachedData())&&!"{}".equals(ztBillboardmodellists.get(i).getAttachedData())){
  221. Gson gson = new Gson();
  222. attachedDtos=gson.fromJson(ztBillboardmodellists.get(i).getAttachedData(), AttachedDtoTypes);
  223. }
  224. ztBillboardmodellistDto.setAttachedDatas(attachedDtos);
  225. ztBillboardmodellistDtos.add(ztBillboardmodellistDto);
  226. // 注意:BeanUtils.copyProperties的源对象和目标对象参数顺序是反的,即先目标后源
  227. }
  228. for (ZtBillboardmodellistDto ztBillboardmodellistDto : ztBillboardmodellistDtos) {
  229. Gson gson = new Gson();
  230. Type listType = new TypeToken<List<ggpresultDto>>() {}.getType();
  231. List<ggpresultDto> ggpresultDtoList = gson.fromJson(ztBillboardmodellistDto.getResults(), listType);
  232. if(ggpresultDtoList!=null && ggpresultDtoList.size()>0){
  233. int ind=0;
  234. for (ggpresultDto ggpresultDto : ggpresultDtoList) {
  235. if("true".equals(ggpresultDto.getRuleResult())){
  236. ggpresultDto.setRuleResult("符合");
  237. }else{
  238. ggpresultDto.setRuleResult("不符合");
  239. }
  240. ind+=1;
  241. ggpresultDto.setIndex(String.valueOf(ind));
  242. }
  243. ztBillboardmodellistDto.setGgpresultList(ggpresultDtoList);
  244. }
  245. ZtBillboardJt ztBillboardJt = new ZtBillboardJt();
  246. ztBillboardJt.setModelid(ztBillboardmodellistDto.getId());
  247. List<ZtBillboardJt> ztBillboardJtList=ztBillboardJtService.selectZtBillboardJtList(ztBillboardJt);
  248. List<PicData> DataList=new ArrayList<>();
  249. //将base64图片转为PictureRenderData
  250. for (ZtBillboardJt ztBillboardJt1 : ztBillboardJtList) {
  251. PictureRenderData pictureRenderData =Pictures.ofBase64(ztBillboardJt1.getJtBase(), PictureType.JPEG).size(400, 300).create();
  252. DataList.add(new PicData(pictureRenderData));
  253. }
  254. if(ztBillboardmodellistDto.getIsAddModel()){
  255. //最新修改的参数
  256. templateParameter(ztBillboardmodellistDto);
  257. //历史修改参数
  258. ZtBillboardmodellisthistory ztBillboardmodellisthistory=new ZtBillboardmodellisthistory();
  259. ztBillboardmodellisthistory.setId(ztBillboardmodellistDto.getId());
  260. List<ZtBillboardmodellisthistory> ztBillboardmodellisthistoryList=ztBillboardmodellisthistoryService.selectZtBillboardmodellisthistoryList(ztBillboardmodellisthistory);
  261. if(ztBillboardmodellisthistoryList.stream().count()>0){
  262. List<ZtBillboardmodellistDto> ztBillboardmodellistDtoList=new ArrayList<>();
  263. for (ZtBillboardmodellisthistory ztBillboardmodellisthistory1:ztBillboardmodellisthistoryList){
  264. ZtBillboardmodellistDto ztBillboardmodellisthistoryDto=new ZtBillboardmodellistDto();
  265. BeanUtils.copyProperties(ztBillboardmodellisthistory1, ztBillboardmodellisthistoryDto);
  266. if (ztBillboardmodellisthistory1.getCreateTime() != null && ztBillboardmodellisthistory1.getCreateTime() instanceof Date) {
  267. // 将Date对象格式化为所需的字符串格式
  268. // 例如: "yyyy-MM-dd HH:mm:ss"
  269. String d= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) ztBillboardmodellisthistory1.getCreateTime());
  270. ztBillboardmodellisthistoryDto.setCreateTimeString(d);
  271. }
  272. templateParameter(ztBillboardmodellisthistoryDto);
  273. ztBillboardmodellistDtoList.add(ztBillboardmodellisthistoryDto);
  274. }
  275. if(ztBillboardmodellistDtoList.size()>0){
  276. ztBillboardmodellistDto.setZtBillboardmodellisthistoryDtoList(ztBillboardmodellistDtoList);
  277. }
  278. }
  279. }
  280. ztBillboardmodellistDto.setJTList(DataList);
  281. }
  282. ztBillboardinfolistDto.setZtBillboardmodellistDtoList(ztBillboardmodellistDtos);
  283. ClassPathResource classPathResource = new ClassPathResource("template/word/"+"广告牌审查意见.docx");
  284. InputStream inputStream = classPathResource.getInputStream();
  285. Configure configure = Configure.builder().useSpringEL()
  286. .bind("ggpresultList", new LoopRowTableRenderPolicy()).build();
  287. // 通过 XWPFTemplate 编译文件并渲染数据到模板中
  288. XWPFTemplate template = XWPFTemplate.compile(inputStream,configure).render(ztBillboardinfolistDto);
  289. //生成文件名
  290. String wordName = ztBillboardinfolistDto.getProjectname();
  291. writeWord(response, null, wordName, template);
  292. } catch (Exception e) {
  293. e.printStackTrace();
  294. log.error("广告牌报告导出异常,{}" + e);
  295. }
  296. }
  297. /**
  298. * 处理广告模板
  299. */
  300. private void templateParameter(ZtBillboardmodellistDto ztBillboardmodellistDto ){
  301. Gson gson = new Gson();
  302. Type templateParameterType = new TypeToken<templateParameterDto>() {}.getType();
  303. templateParameterDto TemplateTop = null;
  304. if(ztBillboardmodellistDto.getTemplateTop()!=null&&!"{}".equals(ztBillboardmodellistDto.getTemplateTop())){
  305. TemplateTop=gson.fromJson(ztBillboardmodellistDto.getTemplateTop(), templateParameterType);
  306. }
  307. templateParameterDto TemplateCentre =null;
  308. if(ztBillboardmodellistDto.getTemplateCentre()!=null&&!"{}".equals(ztBillboardmodellistDto.getTemplateCentre())){
  309. TemplateCentre=gson.fromJson(ztBillboardmodellistDto.getTemplateCentre(), templateParameterType);
  310. }
  311. templateParameterDto TemplateBottom =null;
  312. if(ztBillboardmodellistDto.getTemplateBottom()!=null&&!"{}".equals(ztBillboardmodellistDto.getTemplateBottom())){
  313. TemplateBottom=gson.fromJson(ztBillboardmodellistDto.getTemplateBottom(), templateParameterType);
  314. }
  315. if(TemplateTop != null&& TemplateTop.getTemplateType()!=null){
  316. switch (TemplateTop.getTemplateType()){
  317. case "billboard":
  318. case "box":
  319. TemplateTop.setXLname("长(米)");
  320. TemplateTop.setYLname("高(米)");
  321. TemplateTop.setZLname("厚度(米)");
  322. break;
  323. case "model":
  324. TemplateTop.setScaleLname("缩放比例");
  325. TemplateTop.setXLname("长(米)");
  326. TemplateTop.setYLname("高(米)");
  327. TemplateTop.setZLname("厚度(米)");
  328. break;
  329. }
  330. }
  331. if(TemplateTop.getTemplateType()==null){
  332. TemplateTop.setXLname("长(米)");
  333. TemplateTop.setYLname("高(米)");
  334. TemplateTop.setZLname("厚度(米)");
  335. }
  336. ztBillboardmodellistDto.setTemplateTopObj(TemplateTop);
  337. if(TemplateCentre!= null && TemplateCentre.getTemplateType()!=null){
  338. switch (TemplateCentre.getTemplateType()){
  339. case "cylinder":
  340. TemplateCentre.setYLname("高(米)");
  341. TemplateCentre.setRLname("半径(米)");
  342. break;
  343. }
  344. }
  345. ztBillboardmodellistDto.setTemplateCentreObj(TemplateCentre);
  346. if(TemplateBottom!= null && TemplateBottom.getTemplateType()!=null){
  347. switch (TemplateBottom.getTemplateType()){
  348. case "box":
  349. TemplateBottom.setXLname("长(米)");
  350. TemplateBottom.setYLname("高(米)");
  351. TemplateBottom.setZLname("厚度(米)");
  352. break;
  353. }
  354. }
  355. ztBillboardmodellistDto.setTemplateBottomObj(TemplateBottom);
  356. }
  357. /**
  358. * word写出
  359. *
  360. * @param response
  361. * @param temDir
  362. * @param wordName
  363. * @param template
  364. * @throws Exception
  365. */
  366. private void writeWord(HttpServletResponse response, String temDir, String wordName, XWPFTemplate template) throws Exception {
  367. // 生成的word格式
  368. String formatSuffix = ".docx";
  369. // 拼接后的文件名 文件名.带后缀
  370. String fileName = wordName + formatSuffix;
  371. //=================生成word到设置浏览默认下载地址=================
  372. // 设置强制下载不打开
  373. response.setContentType("application/force-download");
  374. response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
  375. // 设置文件名
  376. response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
  377. OutputStream out = response.getOutputStream();
  378. template.write(out);
  379. out.flush();
  380. out.close();
  381. template.close();
  382. //删除临时文件
  383. if(StringUtils.isNotEmpty(temDir)){
  384. File file = new File(temDir + fileName);
  385. file.setWritable(true);
  386. file.delete();
  387. }
  388. }
  389. }