Commit fdd2cde4444884e3aba5d525424b314029814945

Authored by 王彪总
1 parent 58121e4c

feat(garden): GIS数据核对导出按道路名称合并十谱绿地数据

同一道路关联多个十谱绿地时,导出Excel按道路名称分组合并:
- 十谱绿地名称和面积用顿号拼接展示
- 道路面积求和
- 差异面积 = 十谱绿地面积合计 - 道路面积合计
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/gis/GisRoadController.java
... ... @@ -17,6 +17,7 @@ import java.io.IOException;
17 17 import java.time.LocalDate;
18 18 import java.time.format.DateTimeFormatter;
19 19 import java.util.*;
  20 +import java.util.stream.Collectors;
20 21  
21 22 import com.zteits.urbanops.framework.common.pojo.PageResult;
22 23 import com.zteits.urbanops.framework.common.pojo.CommonResult;
... ... @@ -70,35 +71,102 @@ public class GisRoadController {
70 71 HttpServletResponse response) throws IOException {
71 72 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
72 73 List<GisRoadRespVO> list = gisRoadService.getGisRoadPage(pageReqVO).getList();
73   - List<GisRoadExportVO> exportList = new ArrayList<>();
  74 +
  75 + // 按道路名称分组
  76 + Map<String, List<GisRoadRespVO>> groupedByRoad = new LinkedHashMap<>();
  77 + List<GisRoadRespVO> unassociatedList = new ArrayList<>();
74 78 for (GisRoadRespVO vo : list) {
  79 + if (vo.getRoadName() == null || vo.getRoadName().isEmpty()) {
  80 + unassociatedList.add(vo);
  81 + } else {
  82 + groupedByRoad.computeIfAbsent(vo.getRoadName(), k -> new ArrayList<>()).add(vo);
  83 + }
  84 + }
  85 +
  86 + List<GisRoadExportVO> exportList = new ArrayList<>();
  87 +
  88 + // 未关联的记录:保持原样
  89 + for (GisRoadRespVO vo : unassociatedList) {
75 90 GisRoadExportVO exportVO = new GisRoadExportVO();
76 91 exportVO.setGisPlotName(vo.getGisPlotName());
77 92 exportVO.setRoadName(vo.getRoadName());
78   - exportVO.setGisPlotArea(vo.getGisPlotArea());
  93 + exportVO.setGisPlotArea(vo.getGisPlotArea() != null ? String.format("%.2f", vo.getGisPlotArea()) : null);
79 94 exportVO.setTotalArea(vo.getTotalArea());
80   - exportVO.setGisIsRelatedStr(vo.getGisIsRelated() != null && vo.getGisIsRelated() == 1 ? "已关联" : "未关联");
  95 + exportVO.setGisIsRelatedStr("未关联");
81 96 exportVO.setGisDiffArea(vo.getGisDiffArea());
82 97 exportVO.setCompanyName(vo.getCompanyName());
83 98 exportVO.setDeptName(vo.getDeptName());
84   - // 位置信息:起点描述 ~ 终点描述
85   - String positionInfo = "";
86   - if (vo.getStartingRemark() != null) {
87   - positionInfo += vo.getStartingRemark();
  99 + String positionInfo = buildPositionInfo(vo);
  100 + exportVO.setPositionInfo(positionInfo.isEmpty() ? null : positionInfo);
  101 + exportList.add(exportVO);
  102 + }
  103 +
  104 + // 已关联的记录:按道路名称合并
  105 + for (Map.Entry<String, List<GisRoadRespVO>> entry : groupedByRoad.entrySet()) {
  106 + List<GisRoadRespVO> group = entry.getValue();
  107 + GisRoadRespVO first = group.get(0);
  108 +
  109 + GisRoadExportVO exportVO = new GisRoadExportVO();
  110 + exportVO.setRoadName(entry.getKey());
  111 +
  112 + // 十谱绿地名称:用顿号拼接
  113 + exportVO.setGisPlotName(group.stream()
  114 + .map(GisRoadRespVO::getGisPlotName)
  115 + .filter(Objects::nonNull)
  116 + .collect(Collectors.joining("、")));
  117 +
  118 + // 十谱绿地面积:一一对应拼接,不求和
  119 + exportVO.setGisPlotArea(group.stream()
  120 + .map(v -> v.getGisPlotArea() != null ? String.format("%.2f", v.getGisPlotArea()) : "0.00")
  121 + .collect(Collectors.joining("、")));
  122 +
  123 + // 道路面积:求和
  124 + float sumTotalArea = 0;
  125 + for (GisRoadRespVO v : group) {
  126 + if (v.getTotalArea() != null) {
  127 + sumTotalArea += v.getTotalArea();
  128 + }
88 129 }
89   - if (vo.getEndRemark() != null) {
90   - if (!positionInfo.isEmpty()) {
91   - positionInfo += " ~ ";
  130 + exportVO.setTotalArea(sumTotalArea);
  131 +
  132 + // 十谱绿地面积求和(用于计算差异面积)
  133 + float sumGisPlotArea = 0;
  134 + for (GisRoadRespVO v : group) {
  135 + if (v.getGisPlotArea() != null) {
  136 + sumGisPlotArea += v.getGisPlotArea();
92 137 }
93   - positionInfo += vo.getEndRemark();
94 138 }
  139 +
  140 + // 差异面积:十谱绿地面积合计 - 道路面积合计
  141 + exportVO.setGisDiffArea(sumGisPlotArea - sumTotalArea);
  142 +
  143 + exportVO.setGisIsRelatedStr("已关联");
  144 + exportVO.setCompanyName(first.getCompanyName());
  145 + exportVO.setDeptName(first.getDeptName());
  146 + // 位置信息:起点描述 ~ 终点描述
  147 + String positionInfo = buildPositionInfo(first);
95 148 exportVO.setPositionInfo(positionInfo.isEmpty() ? null : positionInfo);
96 149 exportList.add(exportVO);
97 150 }
  151 +
98 152 String filename = "十谱绿地核对" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + ".xls";
99 153 ExcelUtils.write(response, filename, "数据", GisRoadExportVO.class, exportList);
100 154 }
101 155  
  156 + private String buildPositionInfo(GisRoadRespVO vo) {
  157 + String positionInfo = "";
  158 + if (vo.getStartingRemark() != null) {
  159 + positionInfo += vo.getStartingRemark();
  160 + }
  161 + if (vo.getEndRemark() != null) {
  162 + if (!positionInfo.isEmpty()) {
  163 + positionInfo += " ~ ";
  164 + }
  165 + positionInfo += vo.getEndRemark();
  166 + }
  167 + return positionInfo;
  168 + }
  169 +
102 170 @PostMapping("/associate")
103 171 @Operation(summary = "关联道路到 GIS 图斑")
104 172 // @PreAuthorize("@ss.hasPermission('garden:gis-road:query')")
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/gis/vo/GisRoadExportVO.java
... ... @@ -22,8 +22,7 @@ public class GisRoadExportVO {
22 22  
23 23 @Schema(description = "十谱绿地面积")
24 24 @ExcelProperty("十谱绿地面积(㎡)")
25   - @JsonSerialize(using = TwoDecimalFloatSerializer.class)
26   - private Float gisPlotArea;
  25 + private String gisPlotArea;
27 26  
28 27 @Schema(description = "道路面积")
29 28 @ExcelProperty("道路面积(㎡)")
... ...