Sfoglia il codice sorgente

feat: 实现不动产资源地图获取资源地图建筑列表接口

weijianghai 1 anno fa
parent
commit
f1d8046d65

+ 8 - 1
src/main/java/com/nokia/financeapi/controller/house/HouseResourceMapController.java

@@ -2,8 +2,10 @@ package com.nokia.financeapi.controller.house;
 
 import com.nokia.financeapi.common.R;
 import com.nokia.financeapi.pojo.dto.GetBuildingAreaStatDto;
+import com.nokia.financeapi.pojo.dto.GetBuildingMapDto;
 import com.nokia.financeapi.pojo.dto.GetLandBuildingStatDto;
 import com.nokia.financeapi.pojo.vo.GetBuildingAreaStatVo;
+import com.nokia.financeapi.pojo.vo.GetBuildingMapVo;
 import com.nokia.financeapi.pojo.vo.GetLandBuildingStatVo;
 import com.nokia.financeapi.pojo.vo.TreeAreaVo;
 import com.nokia.financeapi.service.house.HouseResourceMapService;
@@ -40,9 +42,14 @@ public class HouseResourceMapController {
     }
 
     @Operation(summary = "查询地区树形")
-    @PostMapping("treeArea")
+    @PostMapping("/treeArea")
     public R<TreeAreaVo> treeArea() {
         return houseResourceMapService.treeArea();
     }
 
+    @Operation(summary = "获取资源地图建筑列表")
+    @PostMapping("/getBuildingMap")
+    public R<List<GetBuildingMapVo>> getBuildingMap(@Valid @RequestBody GetBuildingMapDto dto) {
+        return houseResourceMapService.getBuildingMap(dto);
+    }
 }

+ 146 - 0
src/main/java/com/nokia/financeapi/dao/house/HouseResourceMapMapper.java

@@ -1,8 +1,10 @@
 package com.nokia.financeapi.dao.house;
 
 import com.nokia.financeapi.pojo.dto.GetBuildingAreaStatDto;
+import com.nokia.financeapi.pojo.dto.GetBuildingMapDto;
 import com.nokia.financeapi.pojo.dto.GetLandBuildingStatDto;
 import com.nokia.financeapi.pojo.vo.GetBuildingAreaStatVo;
+import com.nokia.financeapi.pojo.vo.GetBuildingMapVo;
 import com.nokia.financeapi.pojo.vo.GetLandBuildingStatVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -162,4 +164,148 @@ order by t1.area_name
 </script>
 """)
     List<GetLandBuildingStatVo> getDistrictLandBuildingStat(@Param("dto") GetLandBuildingStatDto dto);
+
+    /**
+     * 获取建筑数据最新的日期
+     */
+    @Select("""
+select max(year_month) from house.building_month
+""")
+    Integer getBuildingMonthMaxDate();
+
+    /**
+     * 获取区县最大面积建筑周围1000米的建筑,相同局址保留建筑面积最大的
+     */
+    @Select("""
+with
+t101 as (
+select
+    lng_bd09,
+    lat_bd09
+from
+    house.building_month
+where
+    lng_bd09 is not null
+    and lat_bd09 is not null
+    and year_month = #{dto.endDate}
+    and city = #{dto.city}
+    and district = #{dto.district}
+order by
+    building_area desc
+limit 1
+),
+t102 as (
+select
+    house.building_month.*
+from
+    house.building_month
+cross join t101
+where
+    year_month = #{dto.endDate}
+    and ST_DWithin(
+    ST_Point(t101.lng_bd09,
+    t101.lat_bd09)::geography,
+    ST_Point(house.building_month.lng_bd09,
+    house.building_month.lat_bd09)::geography,
+    1000
+)
+),
+t103 as (
+select
+    distinct on
+    (site_id) *
+from
+    t102
+order by
+    site_id,
+    building_area desc
+),
+t104 as (
+select
+    distinct on
+    (lng_bd09, lat_bd09) *
+from
+    t103
+order by
+    lng_bd09,
+    lat_bd09,
+    building_area desc
+)
+select
+    building_id,
+    address,
+    area_sector,
+    building_name,
+    acquisition_date,
+    building_use,
+    building_area,
+    building_area_idle,
+    building_area_rent,
+    lng_bd09 as lng,
+    lat_bd09 as lat
+from
+    t104
+order by
+    building_area desc
+limit 150
+""")
+    List<GetBuildingMapVo> getBuildingByDistrict(@Param("dto") GetBuildingMapDto dto);
+
+    /**
+     * 获取坐标范围内的建筑,相同局址保留建筑面积最大的
+     */
+    @Select("""
+with
+t101 as (
+select
+    *
+from
+    house.building_month
+where
+    year_month = #{dto.endDate}
+    and lng_bd09 >= #{dto.leftLng}
+    and lng_bd09 <= #{dto.rightLng}
+    and lat_bd09 >= #{dto.leftLat}
+    and lat_bd09 <= #{dto.rightLat}
+),
+t102 as (
+select
+    distinct on
+    (site_id) *
+from
+    t101
+order by
+    site_id,
+    building_area desc
+),
+t103 as (
+select
+    distinct on
+    (lng_bd09, lat_bd09) *
+from
+    t102
+order by
+    lng_bd09,
+    lat_bd09,
+    building_area desc
+)
+select
+    building_id,
+    address,
+    area_sector,
+    building_name,
+    acquisition_date,
+    building_use,
+    building_area,
+    building_area_idle,
+    building_area_rent,
+    lng_bd09 as lng,
+    lat_bd09 as lat
+from
+    t103
+order by
+    building_area desc
+limit 150
+""")
+    List<GetBuildingMapVo> getBuildingByCoordinate(@Param("dto") GetBuildingMapDto dto);
 }

+ 24 - 0
src/main/java/com/nokia/financeapi/pojo/dto/GetBuildingMapDto.java

@@ -0,0 +1,24 @@
+package com.nokia.financeapi.pojo.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class GetBuildingMapDto {
+    @Schema(description = "账期,不传默认最新", example = "202309")
+    private Integer endDate;
+    @Schema(description = "地市", example = "石家庄")
+    private String city;
+    @Schema(description = "区县", example = "长安区")
+    private String district;
+    @Schema(description = "左上角经度", example = "114.51725372562")
+    private BigDecimal leftLng;
+    @Schema(description = "左上角纬度", example = "38.04601307454851")
+    private BigDecimal leftLat;
+    @Schema(description = "右下角经度", example = "114.53074627437987")
+    private BigDecimal rightLng;
+    @Schema(description = "右下角角纬度", example = "38.05078693947483")
+    private BigDecimal rightLat;
+}

+ 42 - 0
src/main/java/com/nokia/financeapi/pojo/vo/GetBuildingMapVo.java

@@ -0,0 +1,42 @@
+package com.nokia.financeapi.pojo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@NoArgsConstructor
+@Data
+public class GetBuildingMapVo {
+    @Schema(description = "建筑id", example = "2019021222532737046698")
+    private String buildingId;
+    @Schema(description = "标准地址", example = "河北省石家庄市长安区广安大厦")
+    private String address;
+    @Schema(description = "地段", example = "核心商圈")
+    private String areaSector;
+    @Schema(description = "建筑别名", example = "广安大厦")
+    private String buildingName;
+    @Schema(description = "取得日期", example = "2005-04")
+    private String acquisitionDate;
+    @Schema(description = "建筑用途", example = "综合用房")
+    private String buildingUse;
+    @Schema(description = "建筑图片url")
+    private String buildingImg;
+    @Schema(description = "建筑面积(㎡)", example = "36069.1")
+    private BigDecimal buildingArea;
+    @Schema(description = "建筑面积-出租(㎡)", example = "11810")
+    private BigDecimal buildingAreaRent;
+    @Schema(description = "建筑面积-闲置(㎡)", example = "0")
+    private BigDecimal buildingAreaIdle;
+    @Schema(description = "产权年限", example = "40")
+    private Integer ownershipTerm;
+    @Schema(description = "维修费", example = "1221.23")
+    private BigDecimal maintenanceCost;
+    @Schema(description = "出租收入", example = "8000")
+    private BigDecimal rentalIncome;
+    @Schema(description = "经度", example = "114.53074627437987")
+    private BigDecimal lng;
+    @Schema(description = "纬度", example = "38.05078693947483")
+    private BigDecimal lat;
+}

+ 26 - 2
src/main/java/com/nokia/financeapi/service/house/HouseResourceMapService.java

@@ -4,9 +4,11 @@ import com.nokia.financeapi.common.R;
 import com.nokia.financeapi.dao.house.AreaDao;
 import com.nokia.financeapi.dao.house.HouseResourceMapMapper;
 import com.nokia.financeapi.pojo.dto.GetBuildingAreaStatDto;
+import com.nokia.financeapi.pojo.dto.GetBuildingMapDto;
 import com.nokia.financeapi.pojo.dto.GetLandBuildingStatDto;
 import com.nokia.financeapi.pojo.po.AreaPo;
 import com.nokia.financeapi.pojo.vo.GetBuildingAreaStatVo;
+import com.nokia.financeapi.pojo.vo.GetBuildingMapVo;
 import com.nokia.financeapi.pojo.vo.GetLandBuildingStatVo;
 import com.nokia.financeapi.pojo.vo.TreeAreaVo;
 import org.springframework.stereotype.Service;
@@ -75,11 +77,33 @@ public class HouseResourceMapService {
      */
     private Map<Integer, List<AreaPo>> getAreaParentMap(List<AreaPo> areas) {
         Map<Integer, List<AreaPo>> parentMap = new HashMap<>();
-        for (AreaPo t : areas)
-        {
+        for (AreaPo t : areas) {
             parentMap.putIfAbsent(t.getParentId(), new ArrayList<>());
             parentMap.get(t.getParentId()).add(t);
         }
         return parentMap;
     }
+
+    public R<List<GetBuildingMapVo>> getBuildingMap(GetBuildingMapDto dto) {
+        Integer endDate = dto.getEndDate();
+        // 账期为空则取最新的账期
+        if (dto.getEndDate() == null) {
+            endDate = houseResourceMapMapper.getBuildingMonthMaxDate();
+        }
+        if (endDate == null) {
+            return R.ok();
+        }
+        dto.setEndDate(endDate);
+//        LocalDate endLocalDate = LocalDate.parse(endDate + "01", DateTimeFormatter.ofPattern("yyyyMMdd"));
+//        LocalDate startLocalDate = endLocalDate.withDayOfYear(1);
+//        Integer startDate = Integer.valueOf(startLocalDate.format(DateTimeFormatter.ofPattern("yyyyMM")));
+        // 坐标为空根据区县获取建筑
+        if (dto.getLeftLng() == null || dto.getRightLng() == null || dto.getLeftLat() == null || dto.getRightLat() == null) {
+            List<GetBuildingMapVo> vo = houseResourceMapMapper.getBuildingByDistrict(dto);
+            return R.ok(vo);
+        }
+        // 查询坐标范围内的建筑
+        List<GetBuildingMapVo> vo = houseResourceMapMapper.getBuildingByCoordinate(dto);
+        return R.ok(vo);
+    }
 }

+ 14 - 2
src/test/java/com/nokia/financeapi/FinanceApiApplicationTests.java

@@ -1,10 +1,15 @@
 package com.nokia.financeapi;
 
+import com.nokia.financeapi.dao.house.HouseResourceMapMapper;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.test.context.ActiveProfiles;
+import org.springframework.util.StringUtils;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 
 @ActiveProfiles("test")
 @SpringBootTest
@@ -12,10 +17,17 @@ class FinanceApiApplicationTests {
 
     @Autowired
     JdbcTemplate jdbcTemplate;
+    @Autowired
+    HouseResourceMapMapper houseResourceMapMapper;
 
     @Test
     void contextLoads() {
-        String sql = "SELECT * FROM pg_database";
-        System.out.println(jdbcTemplate.queryForList(sql));
+        System.out.println(houseResourceMapMapper.getBuildingMonthMaxDate());
+    }
+
+    public static void main(String[] args) {
+        System.out.println(LocalDate.parse("20230901", DateTimeFormatter.ofPattern("yyyyMMdd")));
+        System.out.println(LocalDate.now().withDayOfYear(1));
+        System.out.println(StringUtils.delete("石家庄市", "市"));
     }
 }