Commit 14b32640adba2e67f69626070c076741cc3a1ea0

Authored by 王彪总
1 parent 2a5db419

feat(garden): 添加GIS道路管理和坐标转换功能

- 新增GIS道路管理相关控制器、服务和数据对象
- 实现WGS84到GCJ02坐标转换算法和工具类
- 添加GIS道路关联和取消关联功能
- 实现GIS道路坐标批量转换功能
- 添加GIS道路数据导入导出功能
- 新增问题类型级联查询接口优化前端展示
- 配置本地调试Mock认证支持
- 更新部署脚本和数据库表结构变更SQL
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/gis/GisRoadController.java
... ... @@ -17,7 +17,6 @@ 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;
21 20  
22 21 import com.zteits.urbanops.framework.common.pojo.PageResult;
23 22 import com.zteits.urbanops.framework.common.pojo.CommonResult;
... ... @@ -68,105 +67,38 @@ public class GisRoadController {
68 67 @PreAuthorize("@ss.hasPermission('garden:gis-road:export')")
69 68 @ApiAccessLog(operateType = EXPORT)
70 69 public void exportGisRoadExcel(@Valid GisRoadPageReqVO pageReqVO,
71   - HttpServletResponse response) throws IOException {
  70 + HttpServletResponse response) throws IOException {
72 71 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
73 72 List<GisRoadRespVO> list = gisRoadService.getGisRoadPage(pageReqVO).getList();
74   -
75   - // 按道路名称分组
76   - Map<String, List<GisRoadRespVO>> groupedByRoad = new LinkedHashMap<>();
77   - List<GisRoadRespVO> unassociatedList = new ArrayList<>();
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 73 List<GisRoadExportVO> exportList = new ArrayList<>();
87   -
88   - // 未关联的记录:保持原样
89   - for (GisRoadRespVO vo : unassociatedList) {
  74 + for (GisRoadRespVO vo : list) {
90 75 GisRoadExportVO exportVO = new GisRoadExportVO();
91 76 exportVO.setGisPlotName(vo.getGisPlotName());
92 77 exportVO.setRoadName(vo.getRoadName());
93   - exportVO.setGisPlotArea(vo.getGisPlotArea() != null ? String.format("%.2f", vo.getGisPlotArea()) : null);
  78 + exportVO.setGisPlotArea(vo.getGisPlotArea());
94 79 exportVO.setTotalArea(vo.getTotalArea());
95   - exportVO.setGisIsRelatedStr("未关联");
  80 + exportVO.setGisIsRelatedStr(vo.getGisIsRelated() != null && vo.getGisIsRelated() == 1 ? "已关联" : "未关联");
96 81 exportVO.setGisDiffArea(vo.getGisDiffArea());
97 82 exportVO.setCompanyName(vo.getCompanyName());
98 83 exportVO.setDeptName(vo.getDeptName());
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   - }
  84 + // 位置信息:起点描述 ~ 终点描述
  85 + String positionInfo = "";
  86 + if (vo.getStartingRemark() != null) {
  87 + positionInfo += vo.getStartingRemark();
129 88 }
130   - exportVO.setTotalArea(sumTotalArea);
131   -
132   - // 十谱绿地面积求和(用于计算差异面积)
133   - float sumGisPlotArea = 0;
134   - for (GisRoadRespVO v : group) {
135   - if (v.getGisPlotArea() != null) {
136   - sumGisPlotArea += v.getGisPlotArea();
  89 + if (vo.getEndRemark() != null) {
  90 + if (!positionInfo.isEmpty()) {
  91 + positionInfo += " ~ ";
137 92 }
  93 + positionInfo += vo.getEndRemark();
138 94 }
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);
148 95 exportVO.setPositionInfo(positionInfo.isEmpty() ? null : positionInfo);
149 96 exportList.add(exportVO);
150 97 }
151   -
152 98 String filename = "十谱绿地核对" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + ".xls";
153 99 ExcelUtils.write(response, filename, "数据", GisRoadExportVO.class, exportList);
154 100 }
155 101  
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   -
170 102 @PostMapping("/associate")
171 103 @Operation(summary = "关联道路到 GIS 图斑")
172 104 // @PreAuthorize("@ss.hasPermission('garden:gis-road:query')")
... ... @@ -193,3 +125,5 @@ public class GisRoadController {
193 125 }
194 126  
195 127 }
  128 +
  129 +
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/gis/vo/GisRoadExportVO.java
... ... @@ -22,7 +22,8 @@ public class GisRoadExportVO {
22 22  
23 23 @Schema(description = "十谱绿地面积")
24 24 @ExcelProperty("十谱绿地面积(㎡)")
25   - private String gisPlotArea;
  25 + @JsonSerialize(using = TwoDecimalFloatSerializer.class)
  26 + private Float gisPlotArea;
26 27  
27 28 @Schema(description = "道路面积")
28 29 @ExcelProperty("道路面积(㎡)")
... ...