Browse Source

feat: 实现不动产数据稽查建筑面积变化统计和异常数据稽核表接口

weijianghai 1 year ago
parent
commit
f877a07288

+ 39 - 0
src/main/java/com/nokia/financeapi/controller/house/HouseDataCheckController.java

@@ -0,0 +1,39 @@
+package com.nokia.financeapi.controller.house;
+
+import com.nokia.financeapi.common.R;
+import com.nokia.financeapi.pojo.dto.GetBuildingAreaDiffDto;
+import com.nokia.financeapi.pojo.dto.GetHouseAbnormalDataDto;
+import com.nokia.financeapi.pojo.vo.GetBuildingAreaDiffVo;
+import com.nokia.financeapi.pojo.vo.GetHouseAbnormalDataVo;
+import com.nokia.financeapi.service.house.HouseDataCheckService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+@Tag(name = "不动产数据稽查")
+@RestController
+@RequestMapping("/house-car/house/data-check/api")
+public class HouseDataCheckController {
+    private final HouseDataCheckService houseDataCheckService;
+
+    public HouseDataCheckController(HouseDataCheckService houseDataCheckService) {
+        this.houseDataCheckService = houseDataCheckService;
+    }
+
+    @Operation(summary = "建筑面积变化统计")
+    @PostMapping("/getBuildingAreaDiff")
+    public R<GetBuildingAreaDiffVo> getBuildingAreaDiff(@Valid @RequestBody GetBuildingAreaDiffDto dto) {
+        return houseDataCheckService.getBuildingAreaDiff(dto);
+    }
+
+    @Operation(summary = "异常数据稽核表")
+    @PostMapping("/getHouseAbnormalData")
+    public R<GetHouseAbnormalDataVo> getHouseAbnormalData(@Valid @RequestBody GetHouseAbnormalDataDto dto) {
+        return houseDataCheckService.getHouseAbnormalData(dto);
+    }
+}

+ 346 - 0
src/main/java/com/nokia/financeapi/dao/house/HouseDataCheckMapper.java

@@ -0,0 +1,346 @@
+package com.nokia.financeapi.dao.house;
+
+import com.nokia.financeapi.pojo.dto.GetHouseAbnormalDataDto;
+import com.nokia.financeapi.pojo.vo.GetBuildingAreaDiffVo;
+import com.nokia.financeapi.pojo.vo.GetHouseAbnormalDataVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface HouseDataCheckMapper {
+    /**
+     * 全省建筑面积变化
+     */
+    @Select("""
+with
+t101 as (
+select
+    sum(building_area) as building_area_sum_last,
+    sum(building_area_self_use) as building_area_self_use_sum_last,
+    sum(building_area_idle) as building_area_idle_sum_last
+from
+    house.building_month
+where
+    year_month = (
+    select
+        max(year_month)
+    from
+        house.building_month
+    where
+        year_no = 2023
+        )
+),
+t102 as (
+select
+    sum(building_area) as building_area_sum_now,
+    sum(building_area_self_use) as building_area_self_use_sum_now,
+    sum(building_area_idle) as building_area_idle_sum_now
+from
+    house.building_month
+where
+    year_month = (
+    select
+        max(year_month)
+    from
+        house.building_month
+    where
+        year_no = 2024
+        )
+),
+t103 as (
+select
+    '全省' as unit_name,
+    round(t101.building_area_sum_last, 2) as building_area_sum_last,
+    round(t101.building_area_self_use_sum_last, 2) as building_area_self_use_sum_last,
+    round(t101.building_area_idle_sum_last, 2) as building_area_idle_sum_last,
+    round(t102.building_area_sum_now, 2) as building_area_sum_now,
+    round(t102.building_area_self_use_sum_now, 2) as building_area_self_use_sum_now,
+    round(t102.building_area_idle_sum_now, 2) as building_area_idle_sum_now,
+    case
+        when t101.building_area_sum_last = 0 then null
+        else round((t102.building_area_sum_now - t101.building_area_sum_last) / t101.building_area_sum_last * 100, 2)
+    end as building_area_diff,
+    case
+        when t101.building_area_self_use_sum_last = 0 then null
+        else round((t102.building_area_self_use_sum_now - t101.building_area_self_use_sum_last) / t101.building_area_self_use_sum_last * 100, 2)
+    end as building_area_self_use_diff,
+    case
+        when t101.building_area_idle_sum_last = 0 then null
+        else round((t102.building_area_idle_sum_now - t101.building_area_idle_sum_last) / t101.building_area_idle_sum_last * 100, 2)
+    end as building_area_idle_diff
+from
+    t101
+cross join t102
+)
+select
+    *
+from
+    t103
+""")
+    GetBuildingAreaDiffVo getFirstUnitBuildingAreaDiff();
+
+    /**
+     * 二级单位建筑面积变化
+     */
+    @Select("""
+with
+t201 as (
+select
+    area_name,
+    sum(building_area) as building_area_sum_last,
+    sum(building_area_self_use) as building_area_self_use_sum_last,
+    sum(building_area_idle) as building_area_idle_sum_last
+from
+    house.building_month
+where
+    year_month = (
+    select
+        max(year_month)
+    from
+        house.building_month
+    where
+        year_no = 2023
+        )
+group by
+    area_name
+),
+t202 as (
+select
+    area_name,
+    sum(building_area) as building_area_sum_now,
+    sum(building_area_self_use) as building_area_self_use_sum_now,
+    sum(building_area_idle) as building_area_idle_sum_now
+from
+    house.building_month
+where
+    year_month = (
+    select
+        max(year_month)
+    from
+        house.building_month
+    where
+        year_no = 2024
+        )
+group by
+    area_name
+),
+t203 as (
+select
+    coalesce(t201.area_name,
+    t202.area_name) as unit_name,
+    coalesce(t201.area_name,
+    t202.area_name) as area_name,
+    round(t201.building_area_sum_last,
+    2) as building_area_sum_last,
+    round(t201.building_area_self_use_sum_last,
+    2) as building_area_self_use_sum_last,
+    round(t201.building_area_idle_sum_last,
+    2) as building_area_idle_sum_last,
+    round(t202.building_area_sum_now,
+    2) as building_area_sum_now,
+    round(t202.building_area_self_use_sum_now,
+    2) as building_area_self_use_sum_now,
+    round(t202.building_area_idle_sum_now,
+    2) as building_area_idle_sum_now,
+    case
+        when t201.building_area_sum_last = 0 then null
+        else round((t202.building_area_sum_now - t201.building_area_sum_last) / t201.building_area_sum_last * 100,
+        2)
+    end as building_area_diff,
+    case
+        when t201.building_area_self_use_sum_last = 0 then null
+        else round((t202.building_area_self_use_sum_now - t201.building_area_self_use_sum_last) / t201.building_area_self_use_sum_last * 100,
+        2)
+    end as building_area_self_use_diff,
+    case
+        when t201.building_area_idle_sum_last = 0 then null
+        else round((t202.building_area_idle_sum_now - t201.building_area_idle_sum_last) / t201.building_area_idle_sum_last * 100,
+        2)
+    end as building_area_idle_diff
+from
+    t201
+full join t202 on
+    t201.area_name = t202.area_name
+),
+t204 as (
+select
+    *
+from
+    t203
+left join house.second_unit_sort on
+    t203.area_name = house.second_unit_sort.second_unit
+order by
+    house.second_unit_sort.sort desc
+)
+select
+    *
+from
+    t204
+""")
+    List<GetBuildingAreaDiffVo> getSecondUnitBuildingAreaDiff();
+
+    /**
+     * 三级单位建筑面积变化
+     */
+    @Select("""
+with
+t301 as (
+select
+    area_name,
+    city_name,
+    sum(building_area) as building_area_sum_last,
+    sum(building_area_self_use) as building_area_self_use_sum_last,
+    sum(building_area_idle) as building_area_idle_sum_last
+from
+    house.building_month
+where
+    year_month = (
+    select
+        max(year_month)
+    from
+        house.building_month
+    where
+        year_no = 2023
+        )
+group by
+    area_name,
+    city_name
+),
+t302 as (
+select
+    area_name,
+    city_name,
+    sum(building_area) as building_area_sum_now,
+    sum(building_area_self_use) as building_area_self_use_sum_now,
+    sum(building_area_idle) as building_area_idle_sum_now
+from
+    house.building_month
+where
+    year_month = (
+    select
+        max(year_month)
+    from
+        house.building_month
+    where
+        year_no = 2024
+        )
+group by
+    area_name,
+    city_name
+),
+t303 as (
+select
+    coalesce(t301.city_name, t302.city_name) as unit_name,
+    coalesce(t301.area_name, t302.area_name) as area_name,
+    coalesce(t301.city_name, t302.city_name) as city_name,
+    round(t301.building_area_sum_last, 2) as building_area_sum_last,
+    round(t301.building_area_self_use_sum_last, 2) as building_area_self_use_sum_last,
+    round(t301.building_area_idle_sum_last, 2) as building_area_idle_sum_last,
+    round(t302.building_area_sum_now, 2) as building_area_sum_now,
+    round(t302.building_area_self_use_sum_now, 2) as building_area_self_use_sum_now,
+    round(t302.building_area_idle_sum_now, 2) as building_area_idle_sum_now,
+    case
+        when t301.building_area_sum_last = 0 then null
+        else round((t302.building_area_sum_now - t301.building_area_sum_last) / t301.building_area_sum_last * 100, 2)
+    end as building_area_diff,
+    case
+        when t301.building_area_self_use_sum_last = 0 then null
+        else round((t302.building_area_self_use_sum_now - t301.building_area_self_use_sum_last) / t301.building_area_self_use_sum_last * 100, 2)
+    end as building_area_self_use_diff,
+    case
+        when t301.building_area_idle_sum_last = 0 then null
+        else round((t302.building_area_idle_sum_now - t301.building_area_idle_sum_last) / t301.building_area_idle_sum_last * 100, 2)
+    end as building_area_idle_diff
+from
+    t301
+full join t302 on t301.area_name = t302.area_name and t301.city_name = t302.city_name
+)
+select
+    *
+from
+    t303
+order by area_name, city_name
+""")
+    List<GetBuildingAreaDiffVo> getThirdUnitBuildingAreaDiff();
+
+    /**
+     * 获取不动产异常数据稽核最新的日期
+     */
+    @Select("""
+select max(year_month) from house.abnormal_data
+""")
+    Integer getAbnormalDataMaxDate();
+
+    /**
+     * 全省不动产异常数据稽核
+     */
+    @Select("""
+select
+    '全省' as unit_name,
+    sum(wei_guan_lian_ju_zhi) as wei_guan_lian_ju_zhi_sum,
+    sum(xian_zhi_jian_zhu_mian_ji) as xian_zhi_jian_zhu_mian_ji_sum
+from
+    house.abnormal_data
+where
+    year_month = #{dto.endDate}
+""")
+    GetHouseAbnormalDataVo getFirstUnitAbnormalData(@Param("dto") GetHouseAbnormalDataDto dto);
+
+    /**
+     * 二级单位不动产异常数据稽核
+     */
+    @Select("""
+with
+t101 as (
+select
+    second_unit as unit_name,
+    second_unit,
+    sum(wei_guan_lian_ju_zhi) as wei_guan_lian_ju_zhi_sum,
+    sum(xian_zhi_jian_zhu_mian_ji) as xian_zhi_jian_zhu_mian_ji_sum
+from
+    house.abnormal_data
+where
+    year_month = #{dto.endDate}
+group by
+    second_unit
+),
+t102 as (
+select
+    *
+from
+    t101
+left join house.second_unit_sort on
+    t101.second_unit = house.second_unit_sort.second_unit
+order by
+    house.second_unit_sort.sort desc
+)
+select
+    *
+from
+    t102
+""")
+    List<GetHouseAbnormalDataVo> getSecondUnitAbnormalData(@Param("dto") GetHouseAbnormalDataDto dto);
+
+    /**
+     * 三级单位不动产异常数据稽核
+     */
+    @Select("""
+select
+    third_unit as unit_name,
+    second_unit,
+    third_unit,
+    wei_guan_lian_ju_zhi as wei_guan_lian_ju_zhi_sum,
+    xian_zhi_jian_zhu_mian_ji as xian_zhi_jian_zhu_mian_ji_sum
+from
+    house.abnormal_data
+where
+    year_month = #{dto.endDate}
+order by
+    second_unit,
+    third_unit
+""")
+    List<GetHouseAbnormalDataVo> getThirdUnitAbnormalData(@Param("dto") GetHouseAbnormalDataDto dto);
+}

+ 10 - 0
src/main/java/com/nokia/financeapi/pojo/dto/GetBuildingAreaDiffDto.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 GetBuildingAreaDiffDto {
+    @Schema(description = "账期", example = "202307")
+    private Integer endDate;
+}

+ 10 - 0
src/main/java/com/nokia/financeapi/pojo/dto/GetHouseAbnormalDataDto.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 GetHouseAbnormalDataDto {
+    @Schema(description = "账期", example = "202307")
+    private Integer endDate;
+}

+ 40 - 0
src/main/java/com/nokia/financeapi/pojo/vo/GetBuildingAreaDiffVo.java

@@ -0,0 +1,40 @@
+package com.nokia.financeapi.pojo.vo;
+
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class GetBuildingAreaDiffVo {
+    @Hidden
+    private String areaName;
+    @Hidden
+    private String cityName;
+    @Schema(description = "单位名称", example = "全省")
+    private String unitName;
+    @Schema(description = "上年建筑面积", example = "3345429.01")
+    private BigDecimal buildingAreaSumLast;
+    @Schema(description = "上年建筑面积自用", example = "3345429.01")
+    private BigDecimal buildingAreaSelfUseSumLast;
+    @Schema(description = "上年建筑面积闲置", example = "3345429.01")
+    private BigDecimal buildingAreaIdleSumLast;
+    @Schema(description = "当月建筑面积", example = "3345429.01")
+    private BigDecimal buildingAreaSumNow;
+    @Schema(description = "当月建筑面积自用", example = "3345429.01")
+    private BigDecimal buildingAreaSelfUseSumNow;
+    @Schema(description = "当月建筑面积闲置", example = "3345429.01")
+    private BigDecimal buildingAreaIdleSumNow;
+    @Schema(description = "建筑面积变化%", example = "12.34")
+    private BigDecimal buildingAreaDiff;
+    @Schema(description = "自用面积变化%", example = "12.34")
+    private BigDecimal buildingAreaSelfUseDiff;
+    @Schema(description = "闲置面积变化%", example = "-12.34")
+    private BigDecimal buildingAreaIdleDiff;
+    @Schema(description = "子列表")
+    private List<GetBuildingAreaDiffVo> children;
+}

+ 26 - 0
src/main/java/com/nokia/financeapi/pojo/vo/GetHouseAbnormalDataVo.java

@@ -0,0 +1,26 @@
+package com.nokia.financeapi.pojo.vo;
+
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class GetHouseAbnormalDataVo {
+    @Hidden
+    private String secondUnit;
+    @Hidden
+    private String thirdUnit;
+    @Schema(description = "单位名称", example = "全省")
+    private String unitName;
+    @Schema(description = "既未对应土地又未对应建筑的局址数量", example = "3")
+    private Integer weiGuanLianJuZhiSum;
+    @Schema(description = "闲置建筑面积", example = "23432.55")
+    private BigDecimal xianZhiJianZhuMianJiSum;
+    @Schema(description = "子列表")
+    private List<GetHouseAbnormalDataVo> children;
+}

+ 64 - 0
src/main/java/com/nokia/financeapi/service/house/HouseDataCheckService.java

@@ -0,0 +1,64 @@
+package com.nokia.financeapi.service.house;
+
+import com.nokia.financeapi.common.R;
+import com.nokia.financeapi.dao.house.HouseDataCheckMapper;
+import com.nokia.financeapi.pojo.dto.GetBuildingAreaDiffDto;
+import com.nokia.financeapi.pojo.dto.GetHouseAbnormalDataDto;
+import com.nokia.financeapi.pojo.vo.GetBuildingAreaDiffVo;
+import com.nokia.financeapi.pojo.vo.GetHouseAbnormalDataVo;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class HouseDataCheckService {
+    private final HouseDataCheckMapper houseDataCheckMapper;
+
+    public HouseDataCheckService(HouseDataCheckMapper houseDataCheckMapper) {
+        this.houseDataCheckMapper = houseDataCheckMapper;
+    }
+
+    public R<GetBuildingAreaDiffVo> getBuildingAreaDiff(GetBuildingAreaDiffDto dto) {
+        GetBuildingAreaDiffVo vo = houseDataCheckMapper.getFirstUnitBuildingAreaDiff();
+        List<GetBuildingAreaDiffVo> l2 = houseDataCheckMapper.getSecondUnitBuildingAreaDiff();
+        vo.setChildren(l2);
+        List<GetBuildingAreaDiffVo> l3 = houseDataCheckMapper.getThirdUnitBuildingAreaDiff();
+        for (GetBuildingAreaDiffVo second : l2) {
+            List<GetBuildingAreaDiffVo> l33 = new ArrayList<>();
+            second.setChildren(l33);
+            for (GetBuildingAreaDiffVo third : l3) {
+                if (second.getAreaName().equals(third.getAreaName())) {
+                    l33.add(third);
+                }
+            }
+        }
+        return R.ok(vo);
+    }
+
+    public R<GetHouseAbnormalDataVo> getHouseAbnormalData(GetHouseAbnormalDataDto dto) {
+        Integer endDate = dto.getEndDate();
+        // 账期为空则取最新的账期
+        if (dto.getEndDate() == null) {
+            endDate = houseDataCheckMapper.getAbnormalDataMaxDate();
+        }
+        if (endDate == null) {
+            return R.ok();
+        }
+        dto.setEndDate(endDate);
+        GetHouseAbnormalDataVo vo = houseDataCheckMapper.getFirstUnitAbnormalData(dto);
+        List<GetHouseAbnormalDataVo> l2 = houseDataCheckMapper.getSecondUnitAbnormalData(dto);
+        vo.setChildren(l2);
+        List<GetHouseAbnormalDataVo> l3 = houseDataCheckMapper.getThirdUnitAbnormalData(dto);
+        for (GetHouseAbnormalDataVo second : l2) {
+            List<GetHouseAbnormalDataVo> l33 = new ArrayList<>();
+            second.setChildren(l33);
+            for (GetHouseAbnormalDataVo third : l3) {
+                if (second.getSecondUnit().equals(third.getSecondUnit())) {
+                    l33.add(third);
+                }
+            }
+        }
+        return R.ok(vo);
+    }
+}