浏览代码

feat: 实现不动产资源地图获取房屋维修统计、获取公告列表、获取出租收入统计接口

weijianghai 1 年之前
父节点
当前提交
77289aa2df

+ 23 - 0
src/main/java/com/nokia/financeapi/controller/house/HouseResourceMapController.java

@@ -3,10 +3,15 @@ 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.GetBuildingRepairStatDto;
+import com.nokia.financeapi.pojo.dto.GetHouseNoticeDto;
 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.GetBuildingRepairStatVo;
+import com.nokia.financeapi.pojo.vo.GetHouseNoticeVo;
 import com.nokia.financeapi.pojo.vo.GetLandBuildingStatVo;
+import com.nokia.financeapi.pojo.vo.GetRentOutStatVo;
 import com.nokia.financeapi.pojo.vo.TreeAreaVo;
 import com.nokia.financeapi.service.house.HouseResourceMapService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -52,4 +57,22 @@ public class HouseResourceMapController {
     public R<List<GetBuildingMapVo>> getBuildingMap(@Valid @RequestBody GetBuildingMapDto dto) {
         return houseResourceMapService.getBuildingMap(dto);
     }
+
+    @Operation(summary = "获取房屋维修统计")
+    @PostMapping("/getBuildingRepairStat")
+    public R<List<GetBuildingRepairStatVo>> getBuildingRepairStat(@Valid @RequestBody GetBuildingRepairStatDto dto) {
+        return houseResourceMapService.getBuildingRepairStat(dto);
+    }
+
+    @Operation(summary = "获取公告列表")
+    @PostMapping("/getNotice")
+    public R<List<GetHouseNoticeVo>> getNotice(@Valid @RequestBody GetHouseNoticeDto dto) {
+        return houseResourceMapService.getNotice(dto);
+    }
+
+    @Operation(summary = "获取出租收入统计")
+    @PostMapping("/getRentOutStat")
+    public R<List<GetRentOutStatVo>> getRentOutStat() {
+        return houseResourceMapService.getRentOutStat();
+    }
 }

+ 116 - 3
src/main/java/com/nokia/financeapi/dao/house/HouseResourceMapMapper.java

@@ -2,9 +2,13 @@ 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.GetBuildingRepairStatDto;
+import com.nokia.financeapi.pojo.dto.GetHouseNoticeDto;
 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.GetBuildingRepairStatVo;
+import com.nokia.financeapi.pojo.vo.GetHouseNoticeVo;
 import com.nokia.financeapi.pojo.vo.GetLandBuildingStatVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -15,7 +19,7 @@ import java.util.List;
 @Mapper
 public interface HouseResourceMapMapper {
     /**
-     * 获取全省或地市的建筑面积统计
+     * 获取最新月份全省或地市的建筑面积统计
      */
     @Select("""
 <script>
@@ -63,7 +67,7 @@ from t1
     GetBuildingAreaStatVo getBuildingAreaStat(@Param("dto") GetBuildingAreaStatDto dto);
 
     /**
-     * 统计各个地市的建筑和土地数量
+     * 统计最新月份各个地市的建筑和土地数量
      */
     @Select("""
 with
@@ -111,7 +115,7 @@ order by
     List<GetLandBuildingStatVo> getCityLandBuildingStat();
 
     /**
-     * 统计某地市各个区县的建筑和土地数量
+     * 统计最新月份某地市各个区县的建筑和土地数量
      */
     @Select("""
 <script>
@@ -308,4 +312,113 @@ order by
 limit 150
 """)
     List<GetBuildingMapVo> getBuildingByCoordinate(@Param("dto") GetBuildingMapDto dto);
+
+    /**
+     * 统计最新年份各个地市的维修费
+     */
+    @Select("""
+with
+t1 as (
+select
+    city,
+    sum(case when repair_type = '零星维修' then amount else 0 end) as odd_sum,
+    sum(amount) as total_sum
+from
+    house.building_repair_main_month
+where
+    repair_type != '财务预提冲销'
+    and year_num = (
+    select
+        max(year_num)
+    from
+        house.building_repair_main_month)
+group by
+    city
+),
+t2 as (
+select
+    *,
+    case
+        when total_sum = 0 then 0
+        else odd_sum / total_sum * 100
+    end as odd_percent
+from
+    t1
+)
+select
+    city as area_name,
+    round(odd_sum,
+    2) as odd_sum,
+    round(total_sum,
+    2) as total_sum,
+    round(odd_percent,
+    2) as odd_percent
+from
+    t2
+order by
+    city
+""")
+    List<GetBuildingRepairStatVo> getCityRepairStat();
+
+    /**
+     * 统计最新年份某个地市的各个区县的维修费
+     */
+    @Select("""
+with
+t1 as (
+select
+    city,
+    district,
+    sum(case when repair_type = '零星维修' then amount else 0 end) as odd_sum,
+    sum(amount) as total_sum
+from
+    house.building_repair_main_month
+where
+    repair_type != '财务预提冲销'
+    and year_num = (
+    select
+        max(year_num)
+    from
+        house.building_repair_main_month)
+    and district is not null
+    and district != ''
+    and city = #{dto.city}
+group by
+    city,
+    district
+),
+t2 as (
+select
+    *,
+    case
+        when total_sum = 0 then 0
+        else odd_sum / total_sum * 100
+    end as odd_percent
+from
+    t1
+)
+select
+    district as area_name,
+    round(odd_sum,
+    2) as odd_sum,
+    round(total_sum,
+    2) as total_sum,
+    round(odd_percent,
+    2) as odd_percent
+from
+    t2
+order by
+    district
+""")
+    List<GetBuildingRepairStatVo> getDistrictRepairStat(@Param("dto") GetBuildingRepairStatDto dto);
+
+    /**
+     * 获取不动产公告
+     */
+    @Select("""
+select * from house.notices
+where city = #{dto.city}
+order by create_time desc
+""")
+    List<GetHouseNoticeVo> getNotice(@Param("dto") GetHouseNoticeDto dto);
 }

+ 10 - 0
src/main/java/com/nokia/financeapi/pojo/dto/GetBuildingRepairStatDto.java

@@ -0,0 +1,10 @@
+package com.nokia.financeapi.pojo.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class GetBuildingRepairStatDto {
+    @Schema(description = "地市,不传默认全省", example = "石家庄")
+    private String city;
+}

+ 10 - 0
src/main/java/com/nokia/financeapi/pojo/dto/GetHouseNoticeDto.java

@@ -0,0 +1,10 @@
+package com.nokia.financeapi.pojo.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class GetHouseNoticeDto {
+    @Schema(description = "地市,不传默认全省", example = "石家庄")
+    private String city;
+}

+ 3 - 3
src/main/java/com/nokia/financeapi/pojo/vo/GetBuildingAreaStatVo.java

@@ -7,11 +7,11 @@ import java.math.BigDecimal;
 
 @Data
 public class GetBuildingAreaStatVo {
-    @Schema(description = "自用面积")
+    @Schema(description = "自用面积(平方米)")
     private BigDecimal areaSelfUse;
-    @Schema(description = "出租面积")
+    @Schema(description = "出租面积(平方米)")
     private BigDecimal areaRent;
-    @Schema(description = "未利用面积")
+    @Schema(description = "未利用面积(平方米)")
     private BigDecimal areaUnused;
     @Schema(description = "综合用房占比")
     private BigDecimal percentSynthesis;

+ 20 - 0
src/main/java/com/nokia/financeapi/pojo/vo/GetBuildingRepairStatVo.java

@@ -0,0 +1,20 @@
+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 GetBuildingRepairStatVo {
+    @Schema(description = "地区名称", example = "石家庄")
+    private String areaName;
+    @Schema(description = "零星维修费用(元)", example = "1587943.12")
+    private BigDecimal oddSum;
+    @Schema(description = "总维修费用(元)", example = "3153148.81")
+    private BigDecimal totalSum;
+    @Schema(description = "零星维修占比", example = "50.36")
+    private BigDecimal oddPercent;
+}

+ 12 - 0
src/main/java/com/nokia/financeapi/pojo/vo/GetHouseNoticeVo.java

@@ -0,0 +1,12 @@
+package com.nokia.financeapi.pojo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@Data
+public class GetHouseNoticeVo {
+    @Schema(description = "内容", example = "石家庄本年维修费同比增长。")
+    private String content;
+}

+ 18 - 0
src/main/java/com/nokia/financeapi/pojo/vo/GetRentOutStatVo.java

@@ -0,0 +1,18 @@
+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 GetRentOutStatVo {
+    @Schema(description = "单位", example = "石家庄")
+    private String unit;
+    @Schema(description = "本年累计收入(万元)", example = "1058.74")
+    private BigDecimal income;
+    @Schema(description = "预算完成率", example = "57.00")
+    private BigDecimal finishingRate;
+}

+ 115 - 3
src/main/java/com/nokia/financeapi/service/house/HouseResourceMapService.java

@@ -1,19 +1,27 @@
 package com.nokia.financeapi.service.house;
 
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
 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.GetBuildingRepairStatDto;
+import com.nokia.financeapi.pojo.dto.GetHouseNoticeDto;
 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.GetBuildingRepairStatVo;
+import com.nokia.financeapi.pojo.vo.GetHouseNoticeVo;
 import com.nokia.financeapi.pojo.vo.GetLandBuildingStatVo;
+import com.nokia.financeapi.pojo.vo.GetRentOutStatVo;
 import com.nokia.financeapi.pojo.vo.TreeAreaVo;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import javax.validation.Valid;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -30,14 +38,17 @@ public class HouseResourceMapService {
     }
 
     public R<GetBuildingAreaStatVo> getBuildingAreaStat(GetBuildingAreaStatDto dto) {
-        return R.ok(houseResourceMapMapper.getBuildingAreaStat(dto));
+        GetBuildingAreaStatVo vo = houseResourceMapMapper.getBuildingAreaStat(dto);
+        return R.ok(vo);
     }
 
     public R<List<GetLandBuildingStatVo>> getLandBuildingStat(GetLandBuildingStatDto dto) {
         if (StringUtils.hasText(dto.getCity())) {
-            return R.ok(houseResourceMapMapper.getDistrictLandBuildingStat(dto));
+            List<GetLandBuildingStatVo> vo = houseResourceMapMapper.getDistrictLandBuildingStat(dto);
+            return R.ok(vo);
         }
-        return R.ok(houseResourceMapMapper.getCityLandBuildingStat());
+        List<GetLandBuildingStatVo> vo = houseResourceMapMapper.getCityLandBuildingStat();
+        return R.ok(vo);
     }
 
     public R<TreeAreaVo> treeArea() {
@@ -106,4 +117,105 @@ public class HouseResourceMapService {
         List<GetBuildingMapVo> vo = houseResourceMapMapper.getBuildingByCoordinate(dto);
         return R.ok(vo);
     }
+
+    public R<List<GetBuildingRepairStatVo>> getBuildingRepairStat(@Valid GetBuildingRepairStatDto dto) {
+        if (StringUtils. hasText(dto.getCity())) {
+            List<GetBuildingRepairStatVo> vo = houseResourceMapMapper.getDistrictRepairStat(dto);
+            return R.ok(vo);
+        }
+        List<GetBuildingRepairStatVo> vo = houseResourceMapMapper.getCityRepairStat();
+        return R.ok(vo);
+    }
+
+    public R<List<GetHouseNoticeVo>> getNotice(GetHouseNoticeDto dto) {
+        if (!StringUtils.hasText(dto.getCity())) {
+            dto.setCity("全省");
+        }
+        List<GetHouseNoticeVo> vo = houseResourceMapMapper.getNotice(dto);
+        return R.ok(vo);
+    }
+
+    public R<List<GetRentOutStatVo>> getRentOutStat() {
+        String s = """
+[
+    {
+        "unit": "石家庄",
+        "income": "1058.74",
+        "finishingRate": 57.00
+    },
+    {
+        "unit": "唐山",
+        "income": "1214.61",
+        "finishingRate": "55.30"
+    },
+    {
+        "unit": "秦皇岛",
+        "income": "402.7",
+        "finishingRate": "63.70"
+    },
+    {
+        "unit": "邯郸",
+        "income": "508.25",
+        "finishingRate": "52.20"
+    },
+    {
+        "unit": "邢台",
+        "income": "441.54",
+        "finishingRate": "57.70"
+    },
+    {
+        "unit": "保定",
+        "income": "1361.7",
+        "finishingRate": "68.70"
+    },
+    {
+        "unit": "张家口",
+        "income": "534.46",
+        "finishingRate": "45.40"
+    },
+    {
+        "unit": "承德",
+        "income": "480.68",
+        "finishingRate": "49.40"
+    },
+    {
+        "unit": "廊坊",
+        "income": "490.37",
+        "finishingRate": "53.00"
+    },
+    {
+        "unit": "沧州",
+        "income": "1008.13",
+        "finishingRate": "54.20"
+    },
+    {
+        "unit": "衡水",
+        "income": "368.94",
+        "finishingRate": "52.60"
+    },
+    {
+        "unit": "雄安",
+        "income": "28.52",
+        "finishingRate": "66.20"
+    },
+    {
+        "unit": "传输局",
+        "income": "269.96",
+        "finishingRate": "52.10"
+    },
+    {
+        "unit": "省本部",
+        "income": "1044.94",
+        "finishingRate": "62.10"
+    },
+    {
+        "unit": "全省",
+        "income": "9213.54",
+        "finishingRate": "56.60"
+    }
+]
+                """;
+        return R.ok(new Gson().fromJson(s, new TypeToken<List<GetRentOutStatVo>>() {
+        }.getType()));
+    }
 }