Prechádzať zdrojové kódy

update ChartMapService

reghao 7 mesiacov pred
rodič
commit
2384345c67

+ 7 - 39
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/controller/ChartMapController.java

@@ -1,15 +1,9 @@
 package cn.reghao.tnb.content.app.geo.controller;
 
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
 import cn.reghao.jutil.web.WebResult;
-import cn.reghao.tnb.content.app.geo.db.mapper.GeoChinaMapper;
-import cn.reghao.tnb.content.app.geo.model.po.GeoJson;
 import cn.reghao.tnb.content.app.geo.model.vo.ChartMap;
-import cn.reghao.tnb.content.app.geo.model.vo.ChartMapData;
 import cn.reghao.tnb.content.app.geo.model.vo.SelectOption;
-import cn.reghao.tnb.content.app.util.RandomUtil;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
+import cn.reghao.tnb.content.app.geo.service.ChartMapService;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -17,60 +11,34 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @author reghao
  * @date 2025-08-19 15:59:13
  */
-@Tag(name = "地图接口")
+@Tag(name = "数据地图接口")
 @RestController
 @RequestMapping("/api/geo/chartmap")
 public class ChartMapController {
-    private final GeoChinaMapper geoChinaMapper;
+    private final ChartMapService chartMapService;
 
-    public ChartMapController(GeoChinaMapper geoChinaMapper) {
-        this.geoChinaMapper = geoChinaMapper;
+    public ChartMapController(ChartMapService chartMapService) {
+        this.chartMapService = chartMapService;
     }
 
     @GetMapping(value = "/area", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getGeoJsonList() {
-        List<GeoJson> list = geoChinaMapper.findGeoJsonObject();
-        List<SelectOption> selectOptionList = list.stream().map(geoJson -> {
-            String name = geoJson.getName();
-            int areaCode = geoJson.getAreaCode();
-            int deep = geoJson.getDeep();
-            String label = String.format("%s-%s", name, deep);
-            String value = String.format("%s-%s", areaCode, deep);
-            return new SelectOption(label, value);
-        }).collect(Collectors.toList());
+        List<SelectOption> selectOptionList = chartMapService.getAreaNameValue();
         return WebResult.success(selectOptionList);
     }
 
     @GetMapping(value = "/geojson", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getGeoJson(@RequestParam("areaCode") String areaCodeStr) {
-        // /chartmap/geojson
         String[] arr = areaCodeStr.split("-");
         int areaCode = Integer.parseInt(arr[0]);
         int deep = Integer.parseInt(arr[1]);
-        String geoJson = geoChinaMapper.findGeoJson(areaCode, deep);
-        List<ChartMapData> chartMapDataList = parseGeoJson(geoJson);
-        ChartMap chartMap = new ChartMap(geoJson, chartMapDataList);
+        ChartMap chartMap = chartMapService.getChartMap(areaCode, deep);
         return WebResult.success(chartMap);
     }
-
-    private List<ChartMapData> parseGeoJson(String geoJson) {
-        List<ChartMapData> list = new ArrayList<>();
-        JsonObject jsonObject = JsonConverter.jsonToJsonElement(geoJson).getAsJsonObject();
-        for (JsonElement jsonElement : jsonObject.get("features").getAsJsonArray()) {
-            JsonObject propertiesObject = jsonElement.getAsJsonObject().get("properties").getAsJsonObject();
-            int adcode = propertiesObject.get("adcode").getAsInt();
-            String name = propertiesObject.get("name").getAsString();
-            list.add(new ChartMapData(name, RandomUtil.getRandomNumber(1000)));
-        }
-
-        return list;
-    }
 }

+ 2 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/db/mapper/CameraPhotoMapper.java

@@ -2,6 +2,7 @@ package cn.reghao.tnb.content.app.geo.db.mapper;
 
 import cn.reghao.jutil.jdk.db.BaseMapper;
 import cn.reghao.tnb.content.app.geo.model.po.CameraPhoto;
+import cn.reghao.tnb.content.app.geo.model.vo.AreaCount;
 import cn.reghao.tnb.content.app.geo.model.vo.MapMarker;
 import cn.reghao.tnb.content.app.geo.model.vo.MapPoint;
 import cn.reghao.tnb.content.app.geo.model.vo.MarkerInfo;
@@ -29,4 +30,5 @@ public interface CameraPhotoMapper extends BaseMapper<CameraPhoto> {
     MarkerInfo findMallReplyInfo(int id);
     MarkerInfo findMarkerInfo(int id);
     List<MapMarker> findByDistance(@Param("mapPoint") MapPoint mapPoint, @Param("distance") int distance);
+    List<AreaCount> findAreaCountByGroup(String areaCode);
 }

+ 13 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/model/vo/AreaCount.java

@@ -0,0 +1,13 @@
+package cn.reghao.tnb.content.app.geo.model.vo;
+
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2025-08-18 22:49:30
+ */
+@Getter
+public class AreaCount {
+    private int areaCode;
+    private String albumIds;
+}

+ 6 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/model/vo/ChartMap.java

@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -11,9 +12,13 @@ import java.util.List;
  * @date 2025-08-19 15:17:32
  */
 @AllArgsConstructor
-@NoArgsConstructor
 @Getter
 public class ChartMap {
     private String geoJson;
     private List<ChartMapData> list;
+
+    public ChartMap() {
+        this.geoJson = "{}";
+        this.list = Collections.emptyList();
+    }
 }

+ 116 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/service/ChartMapService.java

@@ -0,0 +1,116 @@
+package cn.reghao.tnb.content.app.geo.service;
+
+import cn.reghao.jutil.jdk.serializer.JsonConverter;
+import cn.reghao.jutil.jdk.text.TextFile;
+import cn.reghao.tnb.content.app.geo.db.mapper.CameraPhotoMapper;
+import cn.reghao.tnb.content.app.geo.db.mapper.GeoChinaMapper;
+import cn.reghao.tnb.content.app.geo.model.po.GeoJson;
+import cn.reghao.tnb.content.app.geo.model.vo.*;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2025-08-18 22:49:55
+ */
+@Slf4j
+@Service
+public class ChartMapService {
+    private final GeoChinaMapper geoChinaMapper;
+    private final CameraPhotoMapper cameraPhotoMapper;
+    private final TextFile textFile = new TextFile();
+    private String china3GeoJson = "";
+
+    public ChartMapService(GeoChinaMapper geoChinaMapper, CameraPhotoMapper cameraPhotoMapper) {
+        this.geoChinaMapper = geoChinaMapper;
+        this.cameraPhotoMapper = cameraPhotoMapper;
+    }
+
+    @PostConstruct
+    public void load() {
+        //china3GeoJson = textFile.readFile("china3.json");
+    }
+
+    public List<SelectOption> getAreaNameValue() {
+        List<GeoJson> list = geoChinaMapper.findGeoJsonObject();
+        return list.stream().map(geoJson -> {
+            String name = geoJson.getName();
+            int areaCode = geoJson.getAreaCode();
+            int deep = geoJson.getDeep();
+            String label = String.format("%s-%s", name, deep);
+            String value = String.format("%s-%s", areaCode, deep);
+            return new SelectOption(label, value);
+        }).collect(Collectors.toList());
+    }
+
+    public ChartMap getChartMap(int areaCode, int deep) {
+        String geoJson = geoChinaMapper.findGeoJson(areaCode, deep);
+        if (areaCode == 10 && deep == 3) {
+            //geoJson = china3GeoJson;
+            return new ChartMap();
+        }
+
+        List<AreaCount> areaCountList;
+        if (areaCode == 10) {
+            areaCountList = cameraPhotoMapper.findAreaCountByGroup("");
+        } else {
+            areaCountList = cameraPhotoMapper.findAreaCountByGroup(""+areaCode);
+        }
+
+        Map<Integer, String> areaMap = getAreaMap(geoJson, deep);
+        List<ChartMapData> chartMapDataList = new ArrayList<>();
+        areaCountList.forEach(areaCount -> {
+            int areaId = areaCount.getAreaCode();
+            String areaIdStr = ""+areaId;
+            Set<Long> set = Arrays.stream(areaCount.getAlbumIds().split(","))
+                    .map(Long::parseLong)
+                    .collect(Collectors.toSet());
+
+            if (deep == 3) {
+                String areaName = areaMap.get(areaId);
+                if (areaName != null) {
+                    chartMapDataList.add(new ChartMapData(areaName, set.size()));
+                }
+            } else {
+                for (int code : areaMap.keySet()) {
+                    String codeStr = ""+code;
+                    if (areaIdStr.startsWith(codeStr)) {
+                        String areaName = areaMap.get(code);
+                        chartMapDataList.add(new ChartMapData(areaName, set.size()));
+                    } else {
+                        // log.error("{} not matched", areaIdStr);
+                    }
+                }
+            }
+        });
+
+        return new ChartMap(geoJson, chartMapDataList);
+    }
+
+    private Map<Integer, String> getAreaMap(String geoJson, int deep) {
+        Map<Integer, String> map = new HashMap<>();
+        JsonObject jsonObject = JsonConverter.jsonToJsonElement(geoJson).getAsJsonObject();
+        for (JsonElement jsonElement : jsonObject.get("features").getAsJsonArray()) {
+            JsonObject propertiesObject = jsonElement.getAsJsonObject().get("properties").getAsJsonObject();
+            int adcode = propertiesObject.get("adcode").getAsInt();
+            String name = propertiesObject.get("name").getAsString();
+            if (deep == 3) {
+                map.put(adcode, name);
+            } else if (deep == 2) {
+                String adcodeStr = (""+adcode).substring(0, 4);
+                map.put(Integer.parseInt(adcodeStr), name);
+            } else if (deep == 1) {
+                String adcodeStr = (""+adcode).substring(0, 2);
+                map.put(Integer.parseInt(adcodeStr), name);
+            }
+        }
+
+        return map;
+    }
+}

+ 6 - 0
content/content-service/src/main/resources/mapper/geo/CameraPhotoMapper.xml

@@ -130,4 +130,10 @@
         order by distance
         limit 1000
     </select>
+    <select id="findAreaCountByGroup" resultType="cn.reghao.tnb.content.app.geo.model.vo.AreaCount">
+        select area_code as areaCode, group_concat(album_id) as albumIds
+        from geo_camera_photo
+        where album_type='MallReply' and area_code like concat(#{areaCode},'%')
+        group by area_code
+    </select>
 </mapper>