Commit fdd2cde4444884e3aba5d525424b314029814945
1 parent
58121e4c
feat(garden): GIS数据核对导出按道路名称合并十谱绿地数据
同一道路关联多个十谱绿地时,导出Excel按道路名称分组合并: - 十谱绿地名称和面积用顿号拼接展示 - 道路面积求和 - 差异面积 = 十谱绿地面积合计 - 道路面积合计
Showing
2 changed files
with
80 additions
and
13 deletions
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("道路面积(㎡)") | ... | ... |