Forráskód Böngészése

feat: 实现不动产报告定时任务

weijianghai 9 hónapja
szülő
commit
b7c57999f1
65 módosított fájl, 3039 hozzáadás és 14 törlés
  1. 21 1
      readme.md
  2. 39 0
      src/main/java/com/nokia/finance/tasks/config/HouseReportConfig.java
  3. 18 0
      src/main/java/com/nokia/finance/tasks/dao/car/CarReportDao.java
  4. 413 0
      src/main/java/com/nokia/finance/tasks/dao/house/HouseReportDao.java
  5. 8 0
      src/main/java/com/nokia/finance/tasks/enums/JobEnum.java
  6. 2 0
      src/main/java/com/nokia/finance/tasks/jobs/car/CarReportJob.java
  7. 3 3
      src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarFuWuFeiJob.java
  8. 246 0
      src/main/java/com/nokia/finance/tasks/jobs/house/HouseReportJob.java
  9. 83 0
      src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseBuildingHighSporadicRepairPo.java
  10. 343 0
      src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseBuildingIdleStrategyPo.java
  11. 88 0
      src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseBuildingSameRepairFrequencyPo.java
  12. 59 0
      src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseBuildingStatPo.java
  13. 38 0
      src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseFangWuWeiXiuZongTiQingKuangPo.java
  14. 44 0
      src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseNoticesPo.java
  15. 106 0
      src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseRentOutIncomeStatPo.java
  16. 21 0
      src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseReportsPo.java
  17. 18 4
      src/main/java/com/nokia/finance/tasks/pojo/vo/car_report/CarClfyVo.java
  18. 1 1
      src/main/java/com/nokia/finance/tasks/pojo/vo/car_report/CarWgycVo.java
  19. 1 1
      src/main/java/com/nokia/finance/tasks/pojo/vo/car_report/CarWzclycVo.java
  20. 1 1
      src/main/java/com/nokia/finance/tasks/pojo/vo/car_report/CarYcryfVo.java
  21. 4 2
      src/main/java/com/nokia/finance/tasks/pojo/vo/car_report/CarZlwxycVo.java
  22. 45 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseCqqfczhtjkclTableVo.java
  23. 44 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseCqqfczhtjkclVo.java
  24. 51 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseCzqfTableVo.java
  25. 88 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseCzsrTableVo.java
  26. 58 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseDelxwxjkclTableVo.java
  27. 27 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseDelxwxjkclVo.java
  28. 40 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseDeqfczhtjkclTableVo.java
  29. 34 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseDeqfczhtjkclVo.java
  30. 200 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFcczztqkVo.java
  31. 54 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFczyztsyxlTableVo.java
  32. 62 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFczyztsyxlVo.java
  33. 50 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFwwxztqkTableVo.java
  34. 120 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFwwxztqkVo.java
  35. 102 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFwxzjzmjjkclTableVo.java
  36. 51 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFwxzjzmjjkclVo.java
  37. 58 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseGpwxjkclTableVo.java
  38. 27 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseGpwxjkclVo.java
  39. 30 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HousePjczdjhlxclTableVo.java
  40. 24 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HousePjczdjhlxclVo.java
  41. 65 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseReportVo.java
  42. 59 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseZyztqkTableVo.java
  43. 98 0
      src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseZyztqkVo.java
  44. 10 1
      src/main/java/com/nokia/finance/tasks/service/JobService.java
  45. 16 0
      src/main/resources/application-dev.yml
  46. 16 0
      src/main/resources/application-prod.yml
  47. 21 0
      src/test/java/com/nokia/finance/tasks/house/HouseReportJobTests.java
  48. 2 0
      templates/house/report/docx/[Content_Types].xml
  49. 2 0
      templates/house/report/docx/_rels/.rels
  50. 2 0
      templates/house/report/docx/customXml/_rels/item1.xml.rels
  51. 1 0
      templates/house/report/docx/customXml/item1.xml
  52. 2 0
      templates/house/report/docx/customXml/itemProps1.xml
  53. 2 0
      templates/house/report/docx/docProps/app.xml
  54. 10 0
      templates/house/report/docx/docProps/core.xml
  55. 2 0
      templates/house/report/docx/docProps/custom.xml
  56. 2 0
      templates/house/report/docx/word/_rels/document.xml.rels
  57. 0 0
      templates/house/report/docx/word/document.xml
  58. 1 0
      templates/house/report/docx/word/fontTable.xml
  59. BIN
      templates/house/report/docx/word/media/image1.png
  60. 1 0
      templates/house/report/docx/word/numbering.xml
  61. 1 0
      templates/house/report/docx/word/settings.xml
  62. 1 0
      templates/house/report/docx/word/styles.xml
  63. 1 0
      templates/house/report/docx/word/theme/theme1.xml
  64. 2 0
      templates/house/report/docx/word/webSettings.xml
  65. 0 0
      templates/house/report/ftls/document.ftl

+ 21 - 1
readme.md

@@ -202,7 +202,17 @@ curl --location 'http://127.0.0.1:39110/jobs/runJob' \
 }'
 ```
 
-##### 车辆报告定时任务
+##### 河北成本管理系统车辆服务费数据入库定时任务
+
+```shell
+curl --location 'http://127.0.0.1:39110/jobs/runJob' \
+--header 'Content-Type: application/json' \
+--data '{
+    "jobName": "CAR_FU_WU_FEI_JOB"
+}'
+```
+
+#### 车辆报告定时任务
 
 ```shell
 curl --location 'http://127.0.0.1:39110/jobs/runJob' \
@@ -211,3 +221,13 @@ curl --location 'http://127.0.0.1:39110/jobs/runJob' \
     "jobName": "CAR_REPORT_JOB"
 }'
 ```
+
+#### 不动产报告定时任务
+
+```shell
+curl --location 'http://127.0.0.1:39110/jobs/runJob' \
+--header 'Content-Type: application/json' \
+--data '{
+    "jobName": "HOUSE_REPORT_JOB"
+}'
+```

+ 39 - 0
src/main/java/com/nokia/finance/tasks/config/HouseReportConfig.java

@@ -0,0 +1,39 @@
+package com.nokia.finance.tasks.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+@ConfigurationProperties("house-report")
+public class HouseReportConfig {
+    /**
+     * docx文件夹
+     */
+    private String docxDir;
+    /**
+     * 输出路径
+     */
+    private String outDir;
+    /**
+     * 输出docx路径
+     */
+    private String docx;
+    /**
+     * 输出pdf路径
+     */
+    private String pdf;
+    /**
+     * ftl文件夹
+     */
+    private String ftlDir;
+    /**
+     * document ftl路径
+     */
+    private String documentFtl;
+    /**
+     * document xml路径
+     */
+    private String documentXml;
+}

+ 18 - 0
src/main/java/com/nokia/finance/tasks/dao/car/CarReportDao.java

@@ -1305,4 +1305,22 @@ values
 </script>
 """)
     int insertBatchCarNotices(List<CarNoticesPo> list);
+
+    /**
+     * 删除公告
+     * @param endYearMonth 账期
+     */
+    @Update("""
+delete from car.notices where year_month = #{endYearMonth}
+""")
+    int deleteCarNotices(@Param("endYearMonth") Integer endYearMonth);
+
+    /**
+     * 删除报告
+     * @param endYearMonth 账期
+     */
+    @Update("""
+delete from car.car_reports where year_month = #{endYearMonth}
+""")
+    int deleteCarReports(@Param("endYearMonth") Integer endYearMonth);
 }

+ 413 - 0
src/main/java/com/nokia/finance/tasks/dao/house/HouseReportDao.java

@@ -0,0 +1,413 @@
+package com.nokia.finance.tasks.dao.house;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingHighSporadicRepairPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingIdleStrategyPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingSameRepairFrequencyPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingStatPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseFangWuWeiXiuZongTiQingKuangPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseNoticesPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseRentOutIncomeStatPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseReportsPo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+@Mapper
+public interface HouseReportDao {
+    /**
+     * 不动产建筑统计
+     * @param endYearMonth 账期
+     */
+    @Select("""
+with
+t101 as (
+select
+    area_no,
+    count(1) as fcsl,
+    sum(building_area) as zmj,
+    sum(case when area_sector = '核心商圈' then building_area else 0 end) as hxsq,
+    sum(case when area_sector not in ('核心商圈', '乡镇', '乡村') then building_area else 0 end) as ybsq,
+    sum(case when area_sector in ('乡镇', '乡村') then building_area else 0 end) as xzxc,
+    sum(building_area_self_use) as zymj,
+    sum(building_area_rent) as czmj,
+    sum(building_area_idle) as xzmj,
+    case
+        when (sum(building_area_idle) + sum(building_area_rent)) = 0 then 0
+        else round(sum(building_area_idle) / (sum(building_area_idle) + sum(building_area_rent)),
+        4)
+    end as xzl
+from
+    house.building_month
+where
+    year_month = #{endYearMonth}
+group by
+    area_no
+),
+t102 as (
+select
+    *,
+    row_number() over (
+    order by zmj desc) as zmj_rank
+from
+    t101
+),
+t103 as (
+select
+    a.id as area_no,
+    a.name as area_name,
+    b.fcsl,
+    b.zmj,
+    b.hxsq,
+    b.ybsq,
+    b.xzxc,
+    b.zymj,
+    b.czmj,
+    b.xzmj,
+    b.xzl,
+    b.zmj_rank
+from
+    common.organization a
+left join t102 b on
+    a.id = b.area_no
+where
+    a.grade = 1
+    and a.unhide = 1
+order by
+    a.order_num
+),
+t104 as (
+select
+    '018' as area_no,
+    '合计' as area_name,
+    sum(fcsl) as fcsl,
+    sum(zmj) as zmj,
+    sum(hxsq) as hxsq,
+    sum(ybsq) as ybsq,
+    sum(xzxc) as xzxc,
+    sum(zymj) as zymj,
+    sum(czmj) as czmj,
+    sum(xzmj) as xzmj,
+    case
+        when (sum(xzmj) + sum(czmj)) = 0 then 0
+        else round(sum(xzmj) / (sum(xzmj) + sum(czmj)),
+        4)
+    end as xzl,
+    0 as zmj_rank
+from
+    t103
+),
+t201 as (
+select
+    *
+from
+    t103
+union all
+select
+    *
+from
+    t104
+)
+select
+    area_no,
+    area_name,
+    coalesce(fcsl,
+    0) as fcsl,
+    coalesce(zmj,
+    0) as zmj,
+    coalesce(hxsq,
+    0) as hxsq,
+    coalesce(ybsq,
+    0) as ybsq,
+    coalesce(xzxc,
+    0) as xzxc,
+    coalesce(zymj,
+    0) as zymj,
+    coalesce(czmj,
+    0) as czmj,
+    coalesce(xzmj,
+    0) as xzmj,
+    coalesce(xzl,
+    0) as xzl,
+    case
+        when area_name = '石家庄' then 58339
+        when area_name = '唐山' then 21675
+        when area_name = '秦皇岛' then 19899
+        when area_name = '邯郸' then 35219
+        when area_name = '邢台' then 24820
+        when area_name = '保定' then 36923
+        when area_name = '张家口' then 21363
+        when area_name = '承德' then 22220
+        when area_name = '廊坊' then 20388
+        when area_name = '沧州' then 31558
+        when area_name = '衡水' then 16117
+        when area_name = '雄安' then 3582
+        when area_name = '省机动局' then 168516
+        when area_name = '省本部' then 30039
+        when area_name = '合计' then 510658
+    end as zcyz
+from
+    t201
+""")
+    List<HouseBuildingStatPo> getBuildingStat(@Param("endYearMonth") Integer endYearMonth);
+
+    /**
+     * 闲置建筑面积超过1000平米策略
+     * @param endYearMonth 账期
+     */
+    @Select("""
+select
+    *
+from
+    house.building_idle_strategy
+where
+    year_month = #{endYearMonth}
+order by
+    building_area_idle desc
+""")
+    List<HouseBuildingIdleStrategyPo> getBuildingIdleStrategy(@Param("endYearMonth") Integer endYearMonth);
+
+    /**
+     * 自有房产高额零星维修统计
+     * @param endYearMonth 账期
+     */
+    @Select("""
+select
+    *
+from
+    house.building_high_sporadic_repair
+where
+    year_month = #{endYearMonth}
+order by
+    amount desc
+limit 10
+""")
+    List<HouseBuildingHighSporadicRepairPo> getBuildingHighSporadicRepair(@Param("endYearMonth") Integer endYearMonth);
+
+    /**
+     * 不动产自有房产相同维修频次统计
+     * @param endYearMonth 账期
+     */
+    @Select("""
+select
+    *
+from
+    house.building_same_repair_frequency
+where
+    year_month = #{endYearMonth}
+order by
+    ty_total_rank
+""")
+    List<HouseBuildingSameRepairFrequencyPo> getBuildingSameRepairFrequency(@Param("endYearMonth") Integer endYearMonth);
+
+    /**
+     * 对外出租收入统计
+     * @param endYearMonth 账期
+     */
+    @Select("""
+with
+t101 as (
+select
+    area_name,
+    income_all,
+    income_ss,
+    income_cx,
+    budget_all,
+    budget_ss,
+    budget_cx,
+    budget_finish_rate,
+    last_year_income_all,
+    yoy,
+    yoy_percent,
+    contribution_rate,
+    budget_finish_rank,
+    increase_amplitude_rank,
+    sequential_progress,
+    sequential_progress_diff
+from
+    house.rent_out_income_stat
+where
+    year_month = #{endYearMonth}
+    and city_no = ''
+order by
+    area_no
+),
+t102 as (
+select
+    '全省' as area_name,
+    sum(income_all) as income_all,
+    sum(income_ss) as income_ss,
+    sum(income_cx) as income_cx,
+    sum(budget_all) as budget_all,
+    sum(budget_ss) as budget_ss,
+    sum(budget_cx) as budget_cx,
+    case
+        when sum(budget_all) = 0 then 0
+        else round(sum(income_all) / sum(budget_all),
+        4)
+    end as budget_finish_rate,
+    sum(last_year_income_all) as last_year_income_all,
+    sum(yoy) as yoy,
+    case
+        when sum(last_year_income_all) = 0 then 0
+        else round(sum(yoy) / sum(last_year_income_all),
+        4)
+    end as yoy_percent,
+    1 as contribution_rate,
+    null::int4 as budget_finish_rank,
+    null::int4 as increase_amplitude_rank,
+    max(sequential_progress) as sequential_progress
+from
+    t101
+),
+t103 as (
+select
+    area_name,
+    income_all,
+    income_ss,
+    income_cx,
+    budget_all,
+    budget_ss,
+    budget_cx,
+    budget_finish_rate,
+    last_year_income_all,
+    yoy,
+    yoy_percent,
+    contribution_rate,
+    budget_finish_rank,
+    increase_amplitude_rank,
+    sequential_progress,
+    budget_finish_rate - sequential_progress as sequential_progress_diff
+from
+    t102
+),
+t104 as (
+select
+    *
+from
+    t101
+union all
+select
+    *
+from
+    t103
+)
+select
+    area_name,
+    coalesce(income_all,
+    0) as income_all,
+    coalesce(income_ss,
+    0) as income_ss,
+    coalesce(income_cx,
+    0) as income_cx,
+    coalesce(budget_all,
+    0) as budget_all,
+    coalesce(budget_ss,
+    0) as budget_ss,
+    coalesce(budget_cx,
+    0) as budget_cx,
+    coalesce(budget_finish_rate,
+    0) as budget_finish_rate,
+    coalesce(last_year_income_all,
+    0) as last_year_income_all,
+    coalesce(yoy,
+    0) as yoy,
+    coalesce(yoy_percent,
+    0) as yoy_percent,
+    coalesce(contribution_rate,
+    0) as contribution_rate,
+    budget_finish_rank,
+    increase_amplitude_rank,
+    budget_finish_rank,
+    increase_amplitude_rank,
+    coalesce(sequential_progress,
+    0) as sequential_progress,
+    coalesce(sequential_progress_diff,
+    0) as sequential_progress_diff
+from
+    t104
+""")
+    List<HouseRentOutIncomeStatPo> getRentOutIncomeStat(@Param("endYearMonth") Integer endYearMonth);
+
+    /**
+     * 房屋维修总体情况
+     * @param endYearMonth 账期
+     */
+    @Select("""
+select
+    *
+from
+    house.fang_wu_wei_xiu_zong_ti_qing_kuang
+where
+    year_month = #{endYearMonth}
+""")
+    List<HouseFangWuWeiXiuZongTiQingKuangPo> fwwxztqk(@Param("endYearMonth") Integer endYearMonth);
+
+    /**
+     * 批量插入报告url
+     */
+    @Update("""
+<script>
+insert into house.house_reports
+(
+year_month,
+file_type,
+url
+)
+values
+<foreach collection="list" item="item" index="index" separator=",">
+(
+#{item.yearMonth},
+#{item.fileType},
+#{item.url}
+)
+</foreach>
+</script>
+""")
+    int insertBatchHouseReports(List<HouseReportsPo> list);
+
+    /**
+     * 批量插入公告
+     */
+    @Update("""
+<script>
+insert into house.notices
+(
+year_month,
+city,
+content,
+create_time
+)
+values
+<foreach collection="list" item="item" index="index" separator=",">
+(
+#{item.yearMonth},
+#{item.city},
+#{item.content},
+#{item.createTime}
+)
+</foreach>
+</script>
+""")
+    int insertBatchHouseNotices(List<HouseNoticesPo> list);
+
+    /**
+     * 删除公告
+     * @param endYearMonth 账期
+     */
+    @Update("""
+delete from house.notices where year_month = #{endYearMonth}
+""")
+    int deleteHouseNotices(@Param("endYearMonth") Integer endYearMonth);
+
+    /**
+     * 删除报告
+     * @param endYearMonth 账期
+     */
+    @Update("""
+delete from house.house_reports where year_month = #{endYearMonth}
+""")
+    int deleteHouseReports(@Param("endYearMonth") Integer endYearMonth);
+}

+ 8 - 0
src/main/java/com/nokia/finance/tasks/enums/JobEnum.java

@@ -73,6 +73,10 @@ public enum JobEnum {
      * 河北成本管理系统不动产租赁房产维修数据入库定时任务
      */
     HOUSE_RENT_IN_REPAIR_MONTH_JOB,
+    /**
+     * 河北成本管理系统车辆服务费数据入库定时任务
+     */
+    CAR_FU_WU_FEI_JOB,
     /**
      * 睿行车辆行驶里程日数据入库定时任务
      */
@@ -81,5 +85,9 @@ public enum JobEnum {
      * 车辆报告定时任务
      */
     CAR_REPORT_JOB,
+    /**
+     * 不动产报告定时任务
+     */
+    HOUSE_REPORT_JOB,
     ;
 }

+ 2 - 0
src/main/java/com/nokia/finance/tasks/jobs/car/CarReportJob.java

@@ -233,6 +233,7 @@ public class CarReportJob {
      */
     public void upload(CarReportVo vo) throws IOException {
         Integer endYearMonth = vo.getEndYearMonth();
+        carReportDao.deleteCarReports(endYearMonth);
         List<CarReportsPo> list = new ArrayList<>();
         byte[] bytes = Files.readAllBytes(Paths.get(carReportConfig.getDocx()));
         long objectSize = bytes.length;
@@ -263,6 +264,7 @@ public class CarReportJob {
      */
     public void updateNotices(CarReportVo vo) {
         Integer endYearMonth = vo.getEndYearMonth();
+        carReportDao.deleteCarNotices(endYearMonth);
         List<CarNoticesPo> list = new ArrayList<>();
         Map<String, String> map = new HashMap<>();
         StringSubstitutor substitutor = new StringSubstitutor(map);

+ 3 - 3
src/main/java/com/nokia/finance/tasks/jobs/car/chengben/CarFuWuFeiJob.java

@@ -34,7 +34,7 @@ public class CarFuWuFeiJob {
     @Scheduled(cron = "0 34 6 12 * ?")
     public void runJob() {
         // 数据目录
-        Path dir = Paths.get(jobConfig.getCarSiCheGongYongSourcePath());
+        Path dir = Paths.get(jobConfig.getCarFuWuFeiSourcePath());
         try (Stream<Path> stream = Files.list(dir)) {
             // 获取数据目录下的文件列表
             List<Path> pathList = stream.filter(t -> !t.toString().endsWith(".MD5")).sorted().toList();
@@ -80,10 +80,10 @@ public class CarFuWuFeiJob {
     public void move(Path path) throws Exception {
         if (Files.exists(Paths.get(path + ".MD5"))) {
             Files.move(Paths.get(path + ".MD5"),
-                    Paths.get(jobConfig.getCarSiCheGongYongHistoryPath(), path.getFileName().toString() + ".MD5"),
+                    Paths.get(jobConfig.getCarFuWuFeiHistoryPath(), path.getFileName().toString() + ".MD5"),
                     StandardCopyOption.REPLACE_EXISTING);
         }
-        Files.move(path, Paths.get(jobConfig.getCarSiCheGongYongHistoryPath(), path.getFileName().toString()),
+        Files.move(path, Paths.get(jobConfig.getCarFuWuFeiHistoryPath(), path.getFileName().toString()),
                 StandardCopyOption.REPLACE_EXISTING);
     }
 }

+ 246 - 0
src/main/java/com/nokia/finance/tasks/jobs/house/HouseReportJob.java

@@ -0,0 +1,246 @@
+package com.nokia.finance.tasks.jobs.house;
+
+import com.nokia.finance.tasks.common.exception.MyRuntimeException;
+import com.nokia.finance.tasks.config.HouseReportConfig;
+import com.nokia.finance.tasks.dao.house.HouseReportDao;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingHighSporadicRepairPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingIdleStrategyPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingSameRepairFrequencyPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingStatPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseFangWuWeiXiuZongTiQingKuangPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseNoticesPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseRentOutIncomeStatPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseReportsPo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseCqqfczhtjkclVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseDelxwxjkclVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseDeqfczhtjkclVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseFcczztqkVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseFczyztsyxlTableVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseFczyztsyxlVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseFwwxztqkVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseFwxzjzmjjkclVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseGpwxjkclVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HousePjczdjhlxclVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseReportVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseZyztqkTableVo;
+import com.nokia.finance.tasks.pojo.vo.house_report.HouseZyztqkVo;
+import com.nokia.finance.tasks.service.common.file.FileService;
+import com.nokia.finance.tasks.utils.OfficeUtil;
+import com.nokia.finance.tasks.utils.ZipUtil;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.text.StringSubstitutor;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 不动产报告定时任务
+ */
+@Slf4j
+@Service
+public class HouseReportJob {
+    private final HouseReportConfig houseReportConfig;
+    private final HouseReportDao houseReportDao;
+    private final FileService fileService;
+
+    public HouseReportJob(HouseReportConfig houseReportConfig, HouseReportDao houseReportDao, FileService fileService) {
+        this.houseReportConfig = houseReportConfig;
+        this.houseReportDao = houseReportDao;
+        this.fileService = fileService;
+    }
+
+    /**
+     * 执行任务
+     */
+    @Scheduled(cron = "0 35 0 13 * ?")
+    @Transactional(timeout = 300, rollbackFor = Exception.class)
+    public void runJob() {
+        try {
+            log.info("执行不动产报告定时任务");
+            HouseReportVo vo = getReportVo();
+            // 生成docx
+            generateDocx(vo);
+            // 生成pdf
+            OfficeUtil.toPdf(houseReportConfig.getOutDir(), houseReportConfig.getDocx(), 1L);
+            // 上传文件
+            upload(vo);
+            // 更新公告
+            updateNotices(vo);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            throw new MyRuntimeException("不动产报告定时任务失败");
+        }
+    }
+
+    public HouseReportVo getReportVo() {
+        LocalDate localDateNow = LocalDate.now();
+        LocalDate localDateEnd = localDateNow.minusMonths(1);
+        LocalDate localDateStart = localDateEnd.withDayOfYear(1);
+        Integer endYearMonth = Integer.valueOf(localDateEnd.format(DateTimeFormatter.ofPattern("yyyyMM")));
+        Integer startYearMonth = Integer.valueOf(localDateStart.format(DateTimeFormatter.ofPattern("yyyyMM")));
+        Integer endMonth = localDateEnd.getMonthValue();
+        HouseReportVo vo = new HouseReportVo();
+        vo.setReportYear(String.valueOf(localDateEnd.getYear()));
+        vo.setReportMonth(String.valueOf(endMonth));
+        vo.setCurrentYear(String.valueOf(localDateNow.getYear()));
+        vo.setCurrentMonth(String.valueOf(localDateNow.getMonthValue()));
+        vo.setEndYearMonth(endYearMonth);
+        // 资源总体情况、房产资源总体使用效率
+        List<HouseBuildingStatPo> houseBuildingStatPoList = houseReportDao.getBuildingStat(endYearMonth);
+        vo.setZyztqk(new HouseZyztqkVo(houseBuildingStatPoList));
+        vo.setFczyztsyxl(new HouseFczyztsyxlVo(houseBuildingStatPoList));
+        // todo: 房产出租总体情况
+        List<HouseRentOutIncomeStatPo> houseRentOutIncomeStatPoList = houseReportDao.getRentOutIncomeStat(endYearMonth);
+        vo.setFcczztqk(new HouseFcczztqkVo(houseRentOutIncomeStatPoList));
+        // todo: 房屋维修总体情况
+        List<HouseFangWuWeiXiuZongTiQingKuangPo> fangWuWeiXiuZongTiQingKuangPoList = houseReportDao.fwwxztqk(endYearMonth);
+        vo.setFwwxztqk(new HouseFwwxztqkVo(fangWuWeiXiuZongTiQingKuangPoList));
+        // 房屋闲置建筑面积监控策略
+        List<HouseBuildingIdleStrategyPo> houseBuildingIdleStrategyPoList
+                = houseReportDao.getBuildingIdleStrategy(endYearMonth);
+        vo.setFwxzjzmjjkcl(new HouseFwxzjzmjjkclVo(houseBuildingIdleStrategyPoList));
+        // todo: 长期欠费出租合同监控策略
+        vo.setCqqfczhtjkcl(new HouseCqqfczhtjkclVo());
+        // todo: 大额欠费出租合同监控策略
+        vo.setDeqfczhtjkcl(new HouseDeqfczhtjkclVo());
+        // 大额零星维修监控策略
+        List<HouseBuildingHighSporadicRepairPo> houseBuildingHighSporadicRepairPoList
+                = houseReportDao.getBuildingHighSporadicRepair(endYearMonth);
+        vo.setDelxwxjkcl(new HouseDelxwxjkclVo(houseBuildingHighSporadicRepairPoList));
+        // 高频维修监控策略
+        List<HouseBuildingSameRepairFrequencyPo> houseBuildingSameRepairFrequencyPoList
+                = houseReportDao.getBuildingSameRepairFrequency(endYearMonth);
+        vo.setGpwxjkcl(new HouseGpwxjkclVo(houseBuildingSameRepairFrequencyPoList));
+        // todo: 平均出租单价合理性策略
+        vo.setPjczhlxcl(new HousePjczdjhlxclVo());
+        return vo;
+    }
+
+    /**
+     * 生成docx
+     */
+    public void generateDocx(HouseReportVo vo) throws IOException, TemplateException {
+        Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
+        configuration.setDefaultEncoding(StandardCharsets.UTF_8.name());
+        configuration.setDirectoryForTemplateLoading(new File(houseReportConfig.getFtlDir()));
+        // 生成document.xml
+        try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(houseReportConfig.getDocumentXml()),
+                StandardCharsets.UTF_8)) {
+            Template template = configuration.getTemplate(houseReportConfig.getDocumentFtl(),
+                    StandardCharsets.UTF_8.name());
+            template.process(vo, writer);
+        }
+        Files.createDirectories(Paths.get(houseReportConfig.getOutDir()));
+        Path inputDir = Paths.get(houseReportConfig.getDocxDir());
+        Path outputFile = Paths.get(houseReportConfig.getDocx());
+        ZipUtil.zipDirNonSelf(inputDir, outputFile);
+    }
+
+    /**
+     * 上传文件
+     */
+    public void upload(HouseReportVo vo) throws IOException {
+        Integer endYearMonth = vo.getEndYearMonth();
+        houseReportDao.deleteHouseReports(endYearMonth);
+        List<HouseReportsPo> list = new ArrayList<>();
+        byte[] bytes = Files.readAllBytes(Paths.get(houseReportConfig.getDocx()));
+        long objectSize = bytes.length;
+        String object = "oss/reports/house/" + endYearMonth + ".docx";
+        fileService.putObject(object, new ByteArrayInputStream(bytes), objectSize, null);
+        HouseReportsPo po1 = new HouseReportsPo();
+        po1.setYearMonth(endYearMonth);
+        po1.setFileType("word");
+        po1.setUrl(object);
+        list.add(po1);
+        bytes = Files.readAllBytes(Paths.get(houseReportConfig.getPdf()));
+        objectSize = bytes.length;
+        object = "oss/reports/house/" + endYearMonth + ".pdf";
+        fileService.putObject(object, new ByteArrayInputStream(bytes), objectSize, null);
+        HouseReportsPo po2 = new HouseReportsPo();
+        po2.setYearMonth(endYearMonth);
+        po2.setFileType("pdf");
+        po2.setUrl(object);
+        list.add(po2);
+        int updateCount = houseReportDao.insertBatchHouseReports(list);
+        if (updateCount == 0) {
+            throw new MyRuntimeException("插入house.house_reports失败");
+        }
+    }
+
+    /**
+     * 更新公告
+     */
+    public void updateNotices(HouseReportVo vo) {
+        Integer endYearMonth = vo.getEndYearMonth();
+        houseReportDao.deleteHouseNotices(endYearMonth);
+        List<HouseNoticesPo> list = new ArrayList<>();
+        Map<String, String> map = new HashMap<>();
+        StringSubstitutor substitutor = new StringSubstitutor(map);
+        String template = "截止报告期,全省共有房产建筑物${fcsl}处,建筑面积${zmj}万平方米,原值${zcyz}亿元。其中核心商圈建筑面积${hxsq}万平方米,一般商圈${ybsq}万平方米。";
+        map.put("fcsl", vo.getZyztqk().getFcsl());
+        map.put("zmj", vo.getZyztqk().getZmj());
+        map.put("zcyz", vo.getZyztqk().getZcyz());
+        map.put("hxsq", vo.getZyztqk().getHxsq());
+        map.put("ybsq", vo.getZyztqk().getYbsq());
+        list.add(new HouseNoticesPo(endYearMonth, substitutor.replace(template)));
+        map.clear();
+        template = "全省房屋数量及建筑面积排名前5位的为${jzmjTopUnit},房屋建筑面积均超${jzmjTopMin}万平方米,合计占全省房屋建筑面积${jzmjTopPercent}。";
+        map.put("jzmjTopUnit", vo.getZyztqk().getJzmjTopUnit());
+        map.put("jzmjTopMin", vo.getZyztqk().getJzmjTopMin());
+        map.put("jzmjTopPercent", vo.getZyztqk().getJzmjTopPercent());
+        list.add(new HouseNoticesPo(endYearMonth, substitutor.replace(template)));
+        map.clear();
+        template = "全省房屋建筑面积闲置率超过20%的单位有${xzlGtCount}个,其中${xzlMaxUnit}闲置率较高,接近${xzlMaxPercent},对闲置率较高的单位可加大房产盘活力度。";
+        map.put("xzlGtCount", vo.getFczyztsyxl().getXzlGtCount());
+        map.put("xzlMaxUnit", vo.getFczyztsyxl().getXzlMaxUnit());
+        map.put("xzlMaxPercent", vo.getFczyztsyxl().getXzlMaxPercent());
+        list.add(new HouseNoticesPo(endYearMonth, substitutor.replace(template)));
+        map.clear();
+        for (HouseZyztqkTableVo t : vo.getZyztqk().getTable()) {
+            if ("合计".equals(t.getAreaName())) {
+                continue;
+            }
+            template = "截止报告期,${areaName}共有房产建筑物${fcsl}处,建筑面积${zmj}万平方米,原值${zcyz}亿元。其中核心商圈建筑面积${hxsq}万平方米,一般商圈${ybsq}万平方米。";
+            map.put("areaName", t.getAreaName());
+            map.put("fcsl", t.getFcsl());
+            map.put("zmj", t.getZmj());
+            map.put("zcyz", t.getZcyz());
+            map.put("hxsq", t.getHxsq());
+            map.put("ybsq", t.getYbsq());
+            list.add(new HouseNoticesPo(endYearMonth, t.getAreaName(), substitutor.replace(template)));
+            map.clear();
+        }
+        for (HouseFczyztsyxlTableVo t : vo.getFczyztsyxl().getTable()) {
+            if ("合计".equals(t.getAreaName())) {
+                continue;
+            }
+            template = "${areaName}建筑面积闲置率为${xzl}。";
+            map.put("areaName", t.getAreaName());
+            map.put("xzl", t.getXzl());
+            list.add(new HouseNoticesPo(endYearMonth, t.getAreaName(), substitutor.replace(template)));
+            map.clear();
+        }
+        int updateCount = houseReportDao.insertBatchHouseNotices(list);
+        if (updateCount == 0) {
+            throw new MyRuntimeException("插入house.notices失败");
+        }
+    }
+}

+ 83 - 0
src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseBuildingHighSporadicRepairPo.java

@@ -0,0 +1,83 @@
+package com.nokia.finance.tasks.pojo.po.house_report;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class HouseBuildingHighSporadicRepairPo {
+    /**
+     * 账期
+     */
+    private Integer yearMonth;
+
+    /**
+     * 建筑id
+     */
+    private String buildingId;
+
+    /**
+     * 建筑别名
+     */
+    private String buildingName;
+
+    /**
+     * 维修年月
+     */
+    private Integer repairYearMonth;
+
+    /**
+     * 维修类型
+     */
+    private String repairType;
+
+    /**
+     * 维修内容
+     */
+    private String repairContent;
+
+    /**
+     * 维修金额
+     */
+    private BigDecimal amount;
+
+    /**
+     * 本年超1万元次数
+     */
+    private Integer total;
+
+    /**
+     * 二级组织机构编码
+     */
+    private String areaNo;
+
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+
+    /**
+     * 三级组织机构编码
+     */
+    private String cityNo;
+
+    /**
+     * 三级组织机构名称
+     */
+    private String cityName;
+
+    /**
+     * 局址id
+     */
+    private String siteId;
+
+    /**
+     * 局址编号
+     */
+    private String siteNum;
+
+    /**
+     * 局址别名
+     */
+    private String siteName;
+}

+ 343 - 0
src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseBuildingIdleStrategyPo.java

@@ -0,0 +1,343 @@
+package com.nokia.finance.tasks.pojo.po.house_report;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class HouseBuildingIdleStrategyPo {
+    /**
+     * 数据年月
+     */
+    private Integer yearMonth;
+
+    /**
+     * 建筑ID
+     */
+    private String buildingId;
+
+    /**
+     * 资产所属单位(一级)
+     */
+    private String firstUnit;
+
+    /**
+     * 资产所属单位(二级)
+     */
+    private String secondUnit;
+
+    /**
+     * 资产所属单位(三级)
+     */
+    private String thirdUnit;
+
+    /**
+     * 局址编号
+     */
+    private String siteNum;
+
+    /**
+     * 局址别名
+     */
+    private String siteName;
+
+    /**
+     * 标准地址
+     */
+    private String address;
+
+    /**
+     * 城市等级
+     */
+    private String cityLevel;
+
+    /**
+     * 城市区域
+     */
+    private String cityRegion;
+
+    /**
+     * 地段
+     */
+    private String areaSector;
+
+    /**
+     * 是否有土地资产
+     */
+    private String hasLand;
+
+    /**
+     * 局址ID
+     */
+    private String siteId;
+
+    /**
+     * 建筑别名
+     */
+    private String buildingName;
+
+    /**
+     * 得房率
+     */
+    private BigDecimal housingAcquisitionRate;
+
+    /**
+     * 房屋来源
+     */
+    private String housingSource;
+
+    /**
+     * 取得日期
+     */
+    private String acquisitionDate;
+
+    /**
+     * 房龄开始年份
+     */
+    private Integer houseYearBegan;
+
+    /**
+     * 投资主体
+     */
+    private String investor;
+
+    /**
+     * 管理层级
+     */
+    private String managementLevel;
+
+    /**
+     * 房屋结构
+     */
+    private String buildingStructure;
+
+    /**
+     * 楼层总数
+     */
+    private String totalFloors;
+
+    /**
+     * 资产编号
+     */
+    private String assetsNum;
+
+    /**
+     * 资产标签号
+     */
+    private String assetsTagNum;
+
+    /**
+     * 使用状态
+     */
+    private String usageStatus;
+
+    /**
+     * 建筑用途
+     */
+    private String buildingUse;
+
+    /**
+     * 权属状态
+     */
+    private String ownershipStatus;
+
+    /**
+     * 建筑占地面积(㎡)
+     */
+    private BigDecimal floorArea;
+
+    /**
+     * 建筑面积(㎡)
+     */
+    private BigDecimal buildingArea;
+
+    /**
+     * 建筑面积-自用(㎡)
+     */
+    private BigDecimal buildingAreaSelfUse;
+
+    /**
+     * 建筑面积-出租(㎡)
+     */
+    private BigDecimal buildingAreaRent;
+
+    /**
+     * 建筑面积-闲置(㎡)
+     */
+    private BigDecimal buildingAreaIdle;
+
+    /**
+     * 建筑面积-不可使用(㎡)
+     */
+    private BigDecimal buildingAreaUnusable;
+
+    /**
+     * 使用面积(㎡)
+     */
+    private BigDecimal usableArea;
+
+    /**
+     * 使用面积-自用(㎡)
+     */
+    private BigDecimal usableAreaSelfUse;
+
+    /**
+     * 使用面积-出租(㎡)
+     */
+    private BigDecimal usableAreaRent;
+
+    /**
+     * 使用面积-闲置(㎡)
+     */
+    private BigDecimal usableAreaIdle;
+
+    /**
+     * 使用面积-不可使用(㎡)
+     */
+    private BigDecimal usableAreaUnusable;
+
+    /**
+     * 地市
+     */
+    private String city;
+
+    /**
+     * 区县
+     */
+    private String district;
+
+    /**
+     * 经度wgs84
+     */
+    private BigDecimal lngWgs84;
+
+    /**
+     * 纬度wgs84
+     */
+    private BigDecimal latWgs84;
+
+    /**
+     * 经度bd09
+     */
+    private BigDecimal lngBd09;
+
+    /**
+     * 纬度bd09
+     */
+    private BigDecimal latBd09;
+
+    /**
+     * 建筑图片
+     */
+    private String buildingImg;
+
+    /**
+     * 二级组织机构编码
+     */
+    private String areaNo;
+
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+
+    /**
+     * 三级组织机构编码
+     */
+    private String cityNo;
+
+    /**
+     * 三级组织机构名称
+     */
+    private String cityName;
+
+    /**
+     * 年
+     */
+    private Integer yearNo;
+
+    /**
+     * 月
+     */
+    private Integer monthNo;
+
+    /**
+     * 房龄
+     */
+    private Integer houseAge;
+
+    /**
+     * 上级土地名称
+     */
+    private String landName;
+
+    /**
+     * 是否临街
+     */
+    private String frontage;
+
+    /**
+     * 是否有院落
+     */
+    private String courtyard;
+
+    /**
+     * 整栋是否独有
+     */
+    private String wholeBuilding;
+
+    /**
+     * 是否有房产证
+     */
+    private String propertyOwnershipCertificate;
+
+    /**
+     * 无房产证原因
+     */
+    private String noPropertyOwnershipCertificateReason;
+
+    /**
+     * 未关联资产
+     */
+    private String unrelatedAssets;
+
+    /**
+     * 楼长姓名
+     */
+    private String communityAssistantName;
+
+    /**
+     * 楼长单位
+     */
+    private String communityAssistantUnit;
+
+    /**
+     * 经度集团
+     */
+    private BigDecimal lngJt;
+
+    /**
+     * 纬度集团
+     */
+    private BigDecimal latJt;
+
+    /**
+     * 实际产权人
+     */
+    private String propertyOwner;
+
+    /**
+     * 是否完成清查
+     */
+    private String checked;
+
+    /**
+     * 地市id
+     */
+    private String cityId;
+
+    /**
+     * 区县id
+     */
+    private String districtId;
+}

+ 88 - 0
src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseBuildingSameRepairFrequencyPo.java

@@ -0,0 +1,88 @@
+package com.nokia.finance.tasks.pojo.po.house_report;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class HouseBuildingSameRepairFrequencyPo {
+    /**
+     * 账期
+     */
+    private Integer yearMonth;
+
+    /**
+     * 建筑id
+     */
+    private String buildingId;
+
+    /**
+     * 二级组织机构编码
+     */
+    private String areaNo;
+
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+
+    /**
+     * 三级组织机构编码
+     */
+    private String cityNo;
+
+    /**
+     * 三级组织机构名称
+     */
+    private String cityName;
+
+    /**
+     * 建筑别名
+     */
+    private String buildingName;
+
+    /**
+     * 维修类型
+     */
+    private String repairType;
+
+    /**
+     * 维修类容分类
+     */
+    private String contentCategory;
+
+    /**
+     * 本年累计维修频次
+     */
+    private Integer tyTotal;
+
+    /**
+     * 本年累计维修频次排名
+     */
+    private Integer tyTotalRank;
+
+    /**
+     * 历史累计维修频次排名
+     */
+    private Integer historyTotal;
+
+    /**
+     * 本年累计维修费用
+     */
+    private BigDecimal finalCostSum;
+
+    /**
+     * 局址id
+     */
+    private String siteId;
+
+    /**
+     * 局址编号
+     */
+    private String siteNum;
+
+    /**
+     * 局址别名
+     */
+    private String siteName;
+}

+ 59 - 0
src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseBuildingStatPo.java

@@ -0,0 +1,59 @@
+package com.nokia.finance.tasks.pojo.po.house_report;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@NoArgsConstructor
+@Data
+public class HouseBuildingStatPo {
+    /**
+     * 二级组织机构编码
+     */
+    private String areaNo;
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+    /**
+     * 房产数量
+     */
+    private Integer fcsl;
+    /**
+     * 总面积
+     */
+    private BigDecimal zmj;
+    /**
+     * 核心商圈
+     */
+    private BigDecimal hxsq;
+    /**
+     * 一般商圈
+     */
+    private BigDecimal ybsq;
+    /**
+     * 乡镇乡村
+     */
+    private BigDecimal xzxc;
+    /**
+     * 自用面积
+     */
+    private BigDecimal zymj;
+    /**
+     * 出租面积
+     */
+    private BigDecimal czmj;
+    /**
+     * 闲置面积
+     */
+    private BigDecimal xzmj;
+    /**
+     * 闲置率
+     */
+    private BigDecimal xzl;
+    /**
+     * 资产原值
+     */
+    private BigDecimal zcyz;
+}

+ 38 - 0
src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseFangWuWeiXiuZongTiQingKuangPo.java

@@ -0,0 +1,38 @@
+package com.nokia.finance.tasks.pojo.po.house_report;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class HouseFangWuWeiXiuZongTiQingKuangPo {
+    /**
+     * 年月
+     */
+    private Integer yearMonth;
+
+    /**
+     * 单位
+     */
+    private String unit;
+
+    /**
+     * 累计维修费万元
+     */
+    private BigDecimal tyWx;
+
+    /**
+     * 上年同期维修费万元
+     */
+    private BigDecimal lyWx;
+
+    /**
+     * 同比增减
+     */
+    private BigDecimal yoy;
+
+    /**
+     * 同比百分比
+     */
+    private BigDecimal yoyPercent;
+}

+ 44 - 0
src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseNoticesPo.java

@@ -0,0 +1,44 @@
+package com.nokia.finance.tasks.pojo.po.house_report;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@NoArgsConstructor
+public class HouseNoticesPo {
+    /**
+     * 账期
+     */
+    private Integer yearMonth;
+
+    /**
+     * 地市
+     */
+    private String city;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    public HouseNoticesPo(Integer yearMonth, String content) {
+        this.yearMonth = yearMonth;
+        this.city = "全省";
+        this.content = content;
+        this.createTime = LocalDateTime.now();
+    }
+
+    public HouseNoticesPo(Integer yearMonth, String city, String content) {
+        this.yearMonth = yearMonth;
+        this.city = city;
+        this.content = content;
+        this.createTime = LocalDateTime.now();
+    }
+}

+ 106 - 0
src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseRentOutIncomeStatPo.java

@@ -0,0 +1,106 @@
+package com.nokia.finance.tasks.pojo.po.house_report;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class HouseRentOutIncomeStatPo {
+    /**
+     * 年月
+     */
+    private Integer yearMonth;
+
+    /**
+     * 二级组织机构编码
+     */
+    private String areaNo;
+
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+
+    /**
+     * 三级组织机构编码
+     */
+    private String cityNo;
+
+    /**
+     * 三级组织机构名称
+     */
+    private String cityName;
+
+    /**
+     * 本年累计出租收入万元合计
+     */
+    private BigDecimal incomeAll;
+
+    /**
+     * 本年累计出租收入万元上市
+     */
+    private BigDecimal incomeSs;
+
+    /**
+     * 本年累计出租收入万元存续
+     */
+    private BigDecimal incomeCx;
+
+    /**
+     * 本年出租收入预算万元合计
+     */
+    private BigDecimal budgetAll;
+
+    /**
+     * 本年出租收入预算万元上市
+     */
+    private BigDecimal budgetSs;
+
+    /**
+     * 本年出租收入预算万元存续
+     */
+    private BigDecimal budgetCx;
+
+    /**
+     * 预算完成率
+     */
+    private BigDecimal budgetFinishRate;
+
+    /**
+     * 上年同期累计出租收入万元合计
+     */
+    private BigDecimal lastYearIncomeAll;
+
+    /**
+     * 较上年同期增减额万元
+     */
+    private BigDecimal yoy;
+
+    /**
+     * 同比百分比
+     */
+    private BigDecimal yoyPercent;
+
+    /**
+     * 收入贡献率
+     */
+    private BigDecimal contributionRate;
+
+    /**
+     * 预算完成排名
+     */
+    private Integer budgetFinishRank;
+
+    /**
+     * 增幅排名
+     */
+    private Integer increaseAmplitudeRank;
+    /**
+     * 序时进度
+     */
+    private BigDecimal sequentialProgress;
+    /**
+     * 序时进度差距
+     */
+    private BigDecimal sequentialProgressDiff;
+}

+ 21 - 0
src/main/java/com/nokia/finance/tasks/pojo/po/house_report/HouseReportsPo.java

@@ -0,0 +1,21 @@
+package com.nokia.finance.tasks.pojo.po.house_report;
+
+import lombok.Data;
+
+@Data
+public class HouseReportsPo {
+    /**
+     * 报告年月
+     */
+    private Integer yearMonth;
+
+    /**
+     * 文件类型
+     */
+    private String fileType;
+
+    /**
+     * 报告url
+     */
+    private String url;
+}

+ 18 - 4
src/main/java/com/nokia/finance/tasks/pojo/vo/car_report/CarClfyVo.java

@@ -10,8 +10,10 @@ import lombok.Data;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -95,7 +97,6 @@ public class CarClfyVo {
             }
         } else {
             DecimalFormat integerFormat = new DecimalFormat("#,###");
-            BigDecimal qsTyZsb = BigDecimal.ZERO;
             for (int i = 0; i < unitListSize; i++) {
                 String firstUnit = unitList.get(i);
                 CarSnfyVo carSnfyVo = new CarSnfyVo(i + 1, firstUnit);
@@ -104,7 +105,6 @@ public class CarClfyVo {
                     if (firstUnit.equals(carSnfyPo.getSecondOrgName())) {
                         carSnfyVo.update(carSnfyPo);
                         if ("合计".equals(carSnfyPo.getSecondOrgName())) {
-                            qsTyZsb = carSnfyPo.getTyZsb();
                             this.qsfy = integerFormat.format(carSnfyPo.getTyFy());
                             BigDecimal tbzj = carSnfyPo.getTbzj();
                             this.tb = (tbzj.compareTo(BigDecimal.ZERO) >= 0 ? "增加" : "减少")
@@ -115,11 +115,25 @@ public class CarClfyVo {
                     }
                 }
             }
-            BigDecimal finalQsTyZsb = qsTyZsb;
+            BigDecimal median;
+            List<BigDecimal> l = snfyList.stream()
+                    .filter(t -> !t.getSecondOrgName().equals("合计") && t.getTyZsb() != null)
+                    .map(CarSnfyPo::getTyZsb).sorted().toList();
+            int size = l.size();
+            if (size % 2 == 0) {
+                int midIndex = size / 2;
+                BigDecimal firstMidValue = l.get(midIndex - 1);
+                BigDecimal secondMidValue = l.get(midIndex);
+                median = firstMidValue.add(secondMidValue).divide(new BigDecimal("2"), RoundingMode.HALF_UP);
+            } else {
+                int midIndex = size / 2;
+                median = l.get(midIndex);
+            }
             this.zsbjgdw = snfyList.stream()
                     .filter(t -> !t.getSecondOrgName().equals("合计")
                             && t.getTyZsb() != null
-                            && t.getTyZsb().compareTo(finalQsTyZsb) > 0)
+                            && t.getTyZsb().compareTo(median) > 0)
+                    .sorted(Comparator.comparing(CarSnfyPo::getTyZsb).reversed())
                     .map(CarSnfyPo::getSecondOrgName).collect(Collectors.joining("、"));
         }
         if (CollectionUtils.isEmpty(bszsbList)) {

+ 1 - 1
src/main/java/com/nokia/finance/tasks/pojo/vo/car_report/CarWgycVo.java

@@ -80,7 +80,7 @@ public class CarWgycVo {
                 cell.setCellValue(headers.get(i));
                 cell.setCellStyle(headerCellStyle);
                 // 根据内容长度设置列宽
-                int columnWidth = headers.get(i).length() * 256 * 2 + 256 * 10;
+                int columnWidth = headers.get(i).length() * 256 * 2 + 256 * 12;
                 sheet.setColumnWidth(i, columnWidth);
             }
             for (CarWgPo t : wgList) {

+ 1 - 1
src/main/java/com/nokia/finance/tasks/pojo/vo/car_report/CarWzclycVo.java

@@ -73,7 +73,7 @@ public class CarWzclycVo {
                 cell.setCellValue(headers.get(i));
                 cell.setCellStyle(headerCellStyle);
                 // 根据内容长度设置列宽
-                int columnWidth = headers.get(i).length() * 256 * 2 + 256 * 10;
+                int columnWidth = headers.get(i).length() * 256 * 2 + 256 * 12;
                 sheet.setColumnWidth(i, columnWidth);
             }
             for (CarWzPo t : wzList) {

+ 1 - 1
src/main/java/com/nokia/finance/tasks/pojo/vo/car_report/CarYcryfVo.java

@@ -60,7 +60,7 @@ public class CarYcryfVo {
             // 表头
             Row headerRow = sheet.createRow(rowIndex.getAndIncrement());
             List<String> headers = Stream.of("车牌号", "单位", "二级", "三级", "车辆所属单位", "车辆来源", "车辆类型",
-                    "车辆使用性质", "燃油", "里程", "百公里油费", "百公里油耗", "排名").toList();
+                    "车辆使用性质", "累计燃油", "累计里程", "百公里油费", "百公里油耗", "排名").toList();
             int headerSize = headers.size();
             for (int i = 0; i < headerSize; i++) {
                 Cell cell = headerRow.createCell(i);

+ 4 - 2
src/main/java/com/nokia/finance/tasks/pojo/vo/car_report/CarZlwxycVo.java

@@ -84,8 +84,10 @@ public class CarZlwxycVo {
         this.cheLiangSuoShuDanWei = carZlwxycPo.getCheLiangSuoShuDanWei();
         this.weiXiuSum = numberFormat.format(carZlwxycPo.getWeiXiuSum());
         this.weiXiuRank = integerFormat.format(carZlwxycPo.getWeiXiuRank());
-        this.dengJiRiQi = dateTimeFormatter.format(carZlwxycPo.getDengJiRiQi());
-        this.cheLing = integerFormat.format(carZlwxycPo.getCheLing().setScale(0, RoundingMode.CEILING));
+        this.dengJiRiQi = carZlwxycPo.getDengJiRiQi() == null ? ""
+                : dateTimeFormatter.format(carZlwxycPo.getDengJiRiQi());
+        this.cheLing = carZlwxycPo.getCheLing() == null ? ""
+                : integerFormat.format(carZlwxycPo.getCheLing().setScale(0, RoundingMode.CEILING));
         this.cheLiangLaiYuan = carZlwxycPo.getCheLiangLaiYuan();
         this.cheLiangLeiXing = carZlwxycPo.getCheLiangLeiXing();
         this.cheLiangShiYongXingZhi = carZlwxycPo.getCheLiangShiYongXingZhi();

+ 45 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseCqqfczhtjkclTableVo.java

@@ -0,0 +1,45 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import lombok.Data;
+
+@Data
+public class HouseCqqfczhtjkclTableVo {
+    /**
+     * 单位
+     */
+    private String unit;
+    /**
+     * 欠费超3个月出租房产数量上市
+     */
+    private String countSs;
+    /**
+     * 欠费金额上市
+     */
+    private String amountSs;
+    /**
+     * 欠费超3个月出租房产数量存续
+     */
+    private String countCx;
+    /**
+     * 欠费金额存续
+     */
+    private String amountCx;
+    /**
+     * 欠费超3个月出租房产数量合计
+     */
+    private String countHj;
+    /**
+     * 欠费金额合计
+     */
+    private String amountHj;
+
+    public HouseCqqfczhtjkclTableVo(String unit) {
+        this.unit = unit;
+        this.countSs = "";
+        this.amountSs = "";
+        this.countCx = "";
+        this.amountCx = "";
+        this.countHj = "";
+        this.amountHj = "";
+    }
+}

+ 44 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseCqqfczhtjkclVo.java

@@ -0,0 +1,44 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+@Data
+public class HouseCqqfczhtjkclVo {
+    /**
+     * 全省超3个月出租欠费总额
+     */
+    private String qfjzgt3;
+    /**
+     * 欠费较高单位
+     */
+    private String qfjgUnit;
+    /**
+     * 欠费客户主要为
+     */
+    private String qfkh;
+    /**
+     * 欠费账龄已超1年单位
+     */
+    private String qfgt12Unit;
+    /**
+     * 表格
+     */
+    private List<HouseCqqfczhtjkclTableVo> table;
+
+    public HouseCqqfczhtjkclVo() {
+        this.qfjzgt3 = HouseReportVo.PLACEHOLDER;
+        this.qfjgUnit = HouseReportVo.PLACEHOLDER;
+        this.qfkh = HouseReportVo.PLACEHOLDER;
+        this.qfgt12Unit = HouseReportVo.PLACEHOLDER;
+        this.table = new ArrayList<>();
+        List<String> unitList = Stream.of("石家庄", "唐山", "秦皇岛", "邯郸", "邢台", "保定", "张家口", "承德",
+                "廊坊", "沧州", "衡水", "雄安", "省机动局", "省本部", "全省").toList();
+        for (String unit : unitList) {
+            this.table.add(new HouseCqqfczhtjkclTableVo(unit));
+        }
+    }
+}

+ 51 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseCzqfTableVo.java

@@ -0,0 +1,51 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import lombok.Data;
+
+@Data
+public class HouseCzqfTableVo {
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+
+    /**
+     * 累计欠费
+     */
+    private String ljqf;
+
+    /**
+     * 3个月以上欠费
+     */
+    private String gt3;
+
+    /**
+     * 1年以上欠费
+     */
+    private String gt12;
+
+    /**
+     * 同比增减
+     */
+    private String tbzj;
+
+    /**
+     * 本年累计新增欠费
+     */
+    private String xzqf;
+
+    /**
+     * 本年累计收回欠费
+     */
+    private String shqf;
+
+    public HouseCzqfTableVo(String areaName) {
+        this.areaName = areaName;
+        this.ljqf = "";
+        this.gt3 = "";
+        this.gt12 = "";
+        this.tbzj = "";
+        this.xzqf = "";
+        this.shqf = "";
+    }
+}

+ 88 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseCzsrTableVo.java

@@ -0,0 +1,88 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseRentOutIncomeStatPo;
+import lombok.Data;
+
+import java.text.DecimalFormat;
+
+@Data
+public class HouseCzsrTableVo {
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+
+    /**
+     * 本年累计出租收入万元合计
+     */
+    private String incomeAll;
+
+    /**
+     * 本年出租收入预算万元合计
+     */
+    private String budgetAll;
+
+    /**
+     * 预算完成率
+     */
+    private String budgetFinishRate;
+
+    /**
+     * 上年同期累计出租收入万元合计
+     */
+    private String lastYearIncomeAll;
+
+    /**
+     * 较上年同期增减额万元
+     */
+    private String yoy;
+
+    /**
+     * 同比百分比
+     */
+    private String yoyPercent;
+
+    /**
+     * 收入贡献率
+     */
+    private String contributionRate;
+
+    /**
+     * 预算完成排名
+     */
+    private String budgetFinishRank;
+
+    /**
+     * 增幅排名
+     */
+    private String increaseAmplitudeRank;
+
+    public HouseCzsrTableVo(String areaName) {
+        this.areaName = areaName;
+        this.incomeAll = "";
+        this.budgetAll = "";
+        this.budgetFinishRate = "";
+        this.lastYearIncomeAll = "";
+        this.yoy = "";
+        this.yoyPercent = "";
+        this.contributionRate = "";
+        this.budgetFinishRank = "";
+        this.increaseAmplitudeRank = "";
+    }
+
+    public void  update(HouseRentOutIncomeStatPo po) {
+        DecimalFormat numberFormat = new DecimalFormat("#,##0.00");
+        DecimalFormat integerFormat = new DecimalFormat("#,###");
+        DecimalFormat percentFormat = new DecimalFormat("0.0%");
+        this.incomeAll = numberFormat.format(po.getIncomeAll());
+        this.budgetAll = integerFormat.format(po.getBudgetAll());
+        this.budgetFinishRate = percentFormat.format(po.getBudgetFinishRate());
+        this.lastYearIncomeAll = numberFormat.format(po.getLastYearIncomeAll());
+        this.yoy = numberFormat.format(po.getYoy());
+        this.yoyPercent = percentFormat.format(po.getYoyPercent());
+        this.contributionRate = percentFormat.format(po.getContributionRate());
+        this.budgetFinishRank = po.getBudgetFinishRank() == null ? "" : integerFormat.format(po.getBudgetFinishRank());
+        this.increaseAmplitudeRank = po.getIncreaseAmplitudeRank() == null ? ""
+                : integerFormat.format(po.getIncreaseAmplitudeRank());
+    }
+}

+ 58 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseDelxwxjkclTableVo.java

@@ -0,0 +1,58 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingHighSporadicRepairPo;
+import lombok.Data;
+
+import java.text.DecimalFormat;
+
+@Data
+public class HouseDelxwxjkclTableVo {
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+
+    /**
+     * 建筑别名
+     */
+    private String buildingName;
+
+    /**
+     * 维修年月
+     */
+    private String repairYearMonth;
+
+    /**
+     * 维修内容
+     */
+    private String repairContent;
+
+    /**
+     * 维修金额
+     */
+    private String amount;
+
+    /**
+     * 本年超1万元次数
+     */
+    private String total;
+
+    public HouseDelxwxjkclTableVo() {
+        this.areaName = "";
+        this.buildingName = "";
+        this.repairYearMonth = "";
+        this.repairContent = "";
+        this.amount = "";
+        this.total = "";
+    }
+
+    public HouseDelxwxjkclTableVo(HouseBuildingHighSporadicRepairPo po) {
+        DecimalFormat integerFormat = new DecimalFormat("#,###");
+        this.areaName = po.getAreaName();
+        this.buildingName = po.getBuildingName();
+        this.repairYearMonth = String.valueOf(po.getRepairYearMonth());
+        this.repairContent = po.getRepairContent();
+        this.amount = integerFormat.format(po.getAmount());
+        this.total = integerFormat.format(po.getTotal());
+    }
+}

+ 27 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseDelxwxjkclVo.java

@@ -0,0 +1,27 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingHighSporadicRepairPo;
+import lombok.Data;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class HouseDelxwxjkclVo {
+    /**
+     * 表格
+     */
+    private List<HouseDelxwxjkclTableVo> table;
+
+    public HouseDelxwxjkclVo(List<HouseBuildingHighSporadicRepairPo> list) {
+        this.table = new ArrayList<>();
+        if (CollectionUtils.isEmpty(list)) {
+            this.table.add(new HouseDelxwxjkclTableVo());
+            return;
+        }
+        for (HouseBuildingHighSporadicRepairPo t : list) {
+            this.table.add(new HouseDelxwxjkclTableVo(t));
+        }
+    }
+}

+ 40 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseDeqfczhtjkclTableVo.java

@@ -0,0 +1,40 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import lombok.Data;
+
+@Data
+public class HouseDeqfczhtjkclTableVo {
+    /**
+     * 统计月份
+     */
+    private String tjyf;
+    /**
+     * 地市
+     */
+    private String ds;
+    /**
+     * 县区
+     */
+    private String xq;
+    /**
+     * 用户名称
+     */
+    private String yhmc;
+    /**
+     * 租户属性
+     */
+    private String zhsx;
+    /**
+     * 欠费金额
+     */
+    private String qfje;
+
+    public HouseDeqfczhtjkclTableVo() {
+        this.tjyf = "";
+        this.ds = "";
+        this.xq = "";
+        this.yhmc = "";
+        this.zhsx = "";
+        this.qfje = "";
+    }
+}

+ 34 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseDeqfczhtjkclVo.java

@@ -0,0 +1,34 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class HouseDeqfczhtjkclVo {
+    /**
+     * 全省超5万元以上欠费出租项目
+     */
+    private String czqf5wqs;
+    /**
+     * 全省超5万元以上欠费出租项目政府及国企
+     */
+    private String czqf5wzfgq;
+    /**
+     * 全省超5万元以上欠费出租项目个人及个体工商户
+     */
+    private String czqf5wzfgrgt;
+    /**
+     * 表格
+     */
+    private List<HouseDeqfczhtjkclTableVo> table;
+
+    public HouseDeqfczhtjkclVo() {
+        this.czqf5wqs = HouseReportVo.PLACEHOLDER;
+        this.czqf5wzfgq = HouseReportVo.PLACEHOLDER;
+        this.czqf5wzfgrgt = HouseReportVo.PLACEHOLDER;
+        this.table = new ArrayList<>();
+        this.table.add(new HouseDeqfczhtjkclTableVo());
+    }
+}

+ 200 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFcczztqkVo.java

@@ -0,0 +1,200 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseFangWuWeiXiuZongTiQingKuangPo;
+import com.nokia.finance.tasks.pojo.po.house_report.HouseRentOutIncomeStatPo;
+import lombok.Data;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Data
+public class HouseFcczztqkVo {
+    /**
+     * 全省房产出租总收入
+     */
+    private String zsr;
+    /**
+     * 同比增减
+     */
+    private String czsrtbzj;
+    /**
+     * 预算完成率
+     */
+    private String yswcl;
+    /**
+     * 序时进度差距
+     */
+    private String xsjdcj;
+    /**
+     * 出租收入实现同比增长单位数量
+     */
+    private String czsrtbzzUnitCount;
+    /**
+     * 出租收入增加最多单位
+     */
+    private String czsrzjMaxUnit;
+    /**
+     * 出租收入同比下降单位数量
+     */
+    private String czsrtbxjUnitCount;
+    /**
+     * 出租收入同比下降较大单位
+     */
+    private String czsrtbxjjdUnit;
+    /**
+     * 出租收入预算完成率低于序时进度,且收入同比下降较大单位
+     */
+    private String czsrdyxsjdtbxjjdUnit;
+    /**
+     * 出租收入表格
+     */
+    private List<HouseCzsrTableVo> czsrTable;
+    /**
+     * 出租欠费表格
+     */
+    private List<HouseCzqfTableVo> czqfTable;
+    /**
+     * 存在较大金额欠费单位
+     */
+    private String czqfjdUnit;
+    /**
+     * 出租收入同比增长幅度加大,但存在较大金额欠费单位
+     */
+    private String czsrtbzzqfjdUnit;
+    /**
+     * 出租收入同比增长幅度加大,但存在较大金额欠费
+     */
+    private String czsrtbzzqfjd;
+    /**
+     * 出租收入预算完成率低于序时进度,同比下降,且累计欠费
+     */
+    private String czsrdyxsjdtbxjqf;
+
+    public HouseFcczztqkVo(List<HouseRentOutIncomeStatPo> rentOutIncomeStatPoList) {
+        this.czsrTable = new ArrayList<>();
+        this.czqfTable = new ArrayList<>();
+        List<String> unitList1 = Stream.of("石家庄", "唐山", "秦皇岛", "邯郸", "邢台", "保定", "张家口", "承德",
+                "廊坊", "沧州", "衡水", "雄安", "省机动局", "省本部", "全省").toList();
+        if (rentOutIncomeStatPoList.size() == 1) {
+            this.zsr = HouseReportVo.PLACEHOLDER;
+            this.czsrtbzj = HouseReportVo.PLACEHOLDER;
+            this.yswcl = HouseReportVo.PLACEHOLDER;
+            this.xsjdcj = HouseReportVo.PLACEHOLDER + "于序时进度" + HouseReportVo.PLACEHOLDER;
+            this.czsrtbzzUnitCount = HouseReportVo.PLACEHOLDER;
+            this.czsrzjMaxUnit = HouseReportVo.PLACEHOLDER + "公司出租收入增加最多,";
+            this.czsrtbxjUnitCount = HouseReportVo.PLACEHOLDER;
+            this.czsrtbxjjdUnit = ",其中" + HouseReportVo.PLACEHOLDER + "下降幅度较大";
+            this.czsrdyxsjdtbxjjdUnit = HouseReportVo.PLACEHOLDER;
+            for (String unit : unitList1) {
+                this.czsrTable.add(new HouseCzsrTableVo(unit));
+            }
+        } else {
+            for (String unit : unitList1) {
+                HouseCzsrTableVo t = new HouseCzsrTableVo(unit);
+                this.czsrTable.add(t);
+                for (HouseRentOutIncomeStatPo x : rentOutIncomeStatPoList) {
+                    if ("全省".equals(x.getAreaName())) {
+                        DecimalFormat numberFormat = new DecimalFormat("#,##0.0");
+                        DecimalFormat integerFormat = new DecimalFormat("#,###");
+                        DecimalFormat percentFormat = new DecimalFormat("0.0%");
+                        this.zsr = integerFormat.format(x.getIncomeAll());
+                        this.czsrtbzj = (x.getYoy().compareTo(BigDecimal.ZERO) >= 0 ? "增长" : "减少")
+                                + numberFormat.format(x.getYoy().abs());
+                        this.yswcl = percentFormat.format(x.getBudgetFinishRate());
+                        this.xsjdcj = (x.getSequentialProgressDiff().compareTo(BigDecimal.ZERO) >= 0 ? "高" : "低")
+                                + "于序时进度"
+                                + x.getSequentialProgressDiff().multiply(new BigDecimal("100"))
+                                .setScale(1, RoundingMode.HALF_UP).abs();
+                    }
+                    if (unit.equals(x.getAreaName())) {
+                        t.update(x);
+                        break;
+                    }
+                }
+            }
+            List<HouseRentOutIncomeStatPo> czsrtbzzList = rentOutIncomeStatPoList.stream()
+                    .filter(t -> !"全省".equals(t.getAreaName()) && t.getYoyPercent().compareTo(BigDecimal.ZERO) > 0)
+                    .sorted(Comparator.comparing(HouseRentOutIncomeStatPo::getYoyPercent).reversed()).toList();
+            this.czsrtbzzUnitCount = String.valueOf(czsrtbzzList.size());
+            if (CollectionUtils.isEmpty(czsrtbzzList)) {
+                this.czsrzjMaxUnit = "";
+            } else {
+                this.czsrzjMaxUnit = czsrtbzzList.get(0).getAreaName() +  "公司出租收入增加最多,";
+            }
+            List<HouseRentOutIncomeStatPo> czsrtbxjList = rentOutIncomeStatPoList.stream()
+                    .filter(t -> !"全省".equals(t.getAreaName()) && t.getYoyPercent().compareTo(BigDecimal.ZERO) < 0)
+                    .sorted(Comparator.comparing(HouseRentOutIncomeStatPo::getYoyPercent)).toList();
+            this.czsrtbxjUnitCount = String.valueOf(czsrtbxjList.size());
+            if (CollectionUtils.isEmpty(czsrtbxjList)) {
+                this.czsrtbxjjdUnit = "";
+            } else if (czsrtbxjList.size() == 1) {
+                this.czsrtbxjjdUnit = ",其中" + czsrtbxjList.get(0).getAreaName() + "下降幅度较大";
+            } else {
+                BigDecimal median;
+                List<BigDecimal> l = czsrtbxjList.stream().map(HouseRentOutIncomeStatPo::getYoyPercent).sorted().toList();
+                int size = l.size();
+                if (size % 2 == 0) {
+                    int midIndex = size / 2;
+                    BigDecimal firstMidValue = l.get(midIndex - 1);
+                    BigDecimal secondMidValue = l.get(midIndex);
+                    median = firstMidValue.add(secondMidValue).divide(new BigDecimal("2"), RoundingMode.HALF_UP);
+                } else {
+                    int midIndex = size / 2;
+                    median = l.get(midIndex);
+                }
+                this.czsrtbxjjdUnit = ",其中"
+                        + czsrtbxjList.stream().filter(t -> t.getYoyPercent().compareTo(median) < 0)
+                        .sorted(Comparator.comparing(HouseRentOutIncomeStatPo::getYoyPercent))
+                        .map(HouseRentOutIncomeStatPo::getAreaName).collect(Collectors.joining("、"))
+                        + "下降幅度较大";
+            }
+            List<HouseRentOutIncomeStatPo> czsrdyxsjdtbxjList = rentOutIncomeStatPoList.stream()
+                    .filter(t -> !"全省".equals(t.getAreaName())
+                            && t.getSequentialProgressDiff().compareTo(BigDecimal.ZERO) < 0
+                            && t.getYoyPercent().compareTo(BigDecimal.ZERO) < 0)
+                    .sorted(Comparator.comparing(HouseRentOutIncomeStatPo::getYoyPercent)).toList();
+            if (CollectionUtils.isEmpty(czsrdyxsjdtbxjList)) {
+                this.czsrdyxsjdtbxjjdUnit = "无";
+            } else if (czsrtbxjList.size() == 1) {
+                this.czsrdyxsjdtbxjjdUnit = czsrdyxsjdtbxjList.get(0).getAreaName();
+            } else {
+                BigDecimal median;
+                List<BigDecimal> l = czsrdyxsjdtbxjList.stream()
+                        .map(HouseRentOutIncomeStatPo::getYoyPercent).sorted().toList();
+                int size = l.size();
+                if (size % 2 == 0) {
+                    int midIndex = size / 2;
+                    BigDecimal firstMidValue = l.get(midIndex - 1);
+                    BigDecimal secondMidValue = l.get(midIndex);
+                    median = firstMidValue.add(secondMidValue).divide(new BigDecimal("2"), RoundingMode.HALF_UP);
+                } else {
+                    int midIndex = size / 2;
+                    median = l.get(midIndex);
+                }
+                this.czsrdyxsjdtbxjjdUnit = czsrdyxsjdtbxjList.stream()
+                        .filter(t -> t.getYoyPercent().compareTo(median) < 0)
+                        .sorted(Comparator.comparing(HouseRentOutIncomeStatPo::getYoyPercent))
+                        .map(HouseRentOutIncomeStatPo::getAreaName).collect(Collectors.joining("、"));
+            }
+        }
+        // todo: 出租欠费
+        List<String> unitList2 = Stream.of("石家庄", "唐山", "秦皇岛", "邯郸", "邢台", "保定", "张家口", "承德",
+                "廊坊", "沧州", "衡水", "雄安", "省机动局", "省本部", "全省合计").toList();
+        for (String unit : unitList2) {
+            this.czqfTable.add(new HouseCzqfTableVo(unit));
+        }
+        this.czqfjdUnit = HouseReportVo.PLACEHOLDER;
+        this.czsrtbzzqfjdUnit = HouseReportVo.PLACEHOLDER;
+        this.czsrtbzzqfjd = "其中" + HouseReportVo.PLACEHOLDER + "累计欠费" + HouseReportVo.PLACEHOLDER + "万元,";
+        this.czsrdyxsjdtbxjqf = HouseReportVo.PLACEHOLDER + "出租收入预算完成率低于序时进度,同比下降"
+                + HouseReportVo.PLACEHOLDER + ",且累计欠费" + HouseReportVo.PLACEHOLDER + "万元,"
+                + HouseReportVo.PLACEHOLDER + "公司应切实加强出租管理。";
+    }
+}

+ 54 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFczyztsyxlTableVo.java

@@ -0,0 +1,54 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingStatPo;
+import lombok.Data;
+
+import java.text.DecimalFormat;
+
+@Data
+public class HouseFczyztsyxlTableVo {
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+    /**
+     * 总面积
+     */
+    private String zmj;
+    /**
+     * 自用面积
+     */
+    private String zymj;
+    /**
+     * 出租面积
+     */
+    private String czmj;
+    /**
+     * 闲置面积
+     */
+    private String xzmj;
+    /**
+     * 闲置率
+     */
+    private String xzl;
+
+    public HouseFczyztsyxlTableVo(HouseBuildingStatPo po) {
+        DecimalFormat integerFormat = new DecimalFormat("#,###");
+        DecimalFormat percentFormat = new DecimalFormat("0.00%");
+        this.areaName = po.getAreaName();
+        this.zmj = integerFormat.format(po.getZmj());
+        this.zymj = integerFormat.format(po.getZymj());
+        this.czmj = integerFormat.format(po.getCzmj());
+        this.xzmj = integerFormat.format(po.getXzmj());
+        this.xzl = percentFormat.format(po.getXzl());
+    }
+
+    public HouseFczyztsyxlTableVo(String areaName) {
+        this.areaName = areaName;
+        this.zmj = "";
+        this.zymj = "";
+        this.czmj = "";
+        this.xzmj = "";
+        this.xzl = "";
+    }
+}

+ 62 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFczyztsyxlVo.java

@@ -0,0 +1,62 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingStatPo;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+@Data
+public class HouseFczyztsyxlVo {
+    /**
+     * 全省房屋建筑面积闲置率超过20%的单位个数
+     */
+    private String xzlGtCount;
+    /**
+     * 闲置率最高单位
+     */
+    private String xzlMaxUnit;
+    /**
+     * 最高闲置率
+     */
+    private String xzlMaxPercent;
+    /**
+     * 表格
+     */
+    private List<HouseFczyztsyxlTableVo> table;
+
+    public HouseFczyztsyxlVo(List<HouseBuildingStatPo> list) {
+        this.table = new ArrayList<>();
+        DecimalFormat integerFormat = new DecimalFormat("#,###");
+        DecimalFormat percentFormat = new DecimalFormat("0%");
+        BigDecimal jzmj = BigDecimal.ZERO;
+        for (HouseBuildingStatPo t : list) {
+            this.table.add(new HouseFczyztsyxlTableVo(t));
+            if ("合计".equals(t.getAreaName())) {
+                jzmj = t.getZmj();
+            }
+        }
+        if (jzmj.compareTo(BigDecimal.ZERO) == 0) {
+            this.xzlGtCount = HouseReportVo.PLACEHOLDER;
+            this.xzlMaxUnit = HouseReportVo.PLACEHOLDER;
+            this.xzlMaxPercent = HouseReportVo.PLACEHOLDER;
+            this.table = new ArrayList<>();
+            for (HouseBuildingStatPo t : list) {
+                this.table.add(new HouseFczyztsyxlTableVo(t.getAreaName()));
+            }
+            return;
+        }
+        this.xzlGtCount = integerFormat.format(list.stream()
+                .filter(t -> !"合计".equals(t.getAreaName()) && t.getXzl().compareTo(new BigDecimal("0.2")) > 0)
+                .count());
+        list.stream().filter(t -> !"合计".equals(t.getAreaName()))
+                .max(Comparator.comparing(HouseBuildingStatPo::getXzl)).ifPresent(t -> {
+            this.xzlMaxUnit = t.getAreaName();
+            this.xzlMaxPercent = percentFormat.format(t.getXzl().setScale(1, RoundingMode.HALF_UP));
+        });
+    }
+}

+ 50 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFwwxztqkTableVo.java

@@ -0,0 +1,50 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseFangWuWeiXiuZongTiQingKuangPo;
+import lombok.Data;
+
+import java.text.DecimalFormat;
+
+@Data
+public class HouseFwwxztqkTableVo {
+    /**
+     * 单位
+     */
+    String unit;
+    /**
+     * 累计维修费万元
+     */
+    private String tyWx;
+
+    /**
+     * 上年同期维修费万元
+     */
+    private String lyWx;
+
+    /**
+     * 同比增减
+     */
+    private String yoy;
+
+    /**
+     * 同比百分比
+     */
+    private String yoyPercent;
+
+    public HouseFwwxztqkTableVo(String unit) {
+        this.unit = unit;
+        this.tyWx = "";
+        this.lyWx = "";
+        this.yoy = "";
+        this.yoyPercent = "";
+    }
+
+    public void update(HouseFangWuWeiXiuZongTiQingKuangPo po) {
+        DecimalFormat numberFormat = new DecimalFormat("#,##0.00");
+        DecimalFormat percentFormat = new DecimalFormat("0%");
+        this.tyWx = numberFormat.format(po.getTyWx());
+        this.lyWx = numberFormat.format(po.getLyWx());
+        this.yoy = numberFormat.format(po.getYoy());
+        this.yoyPercent = percentFormat.format(po.getYoyPercent());
+    }
+}

+ 120 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFwwxztqkVo.java

@@ -0,0 +1,120 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseFangWuWeiXiuZongTiQingKuangPo;
+import lombok.Data;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Data
+public class HouseFwwxztqkVo {
+    /**
+     * 全省房屋维修费用
+     */
+    private String ljwxf;
+    /**
+     * 同比增减
+     */
+    private String tbzj;
+    /**
+     * 同比百分比
+     */
+    private String tbbfb;
+    /**
+     * 维修费同比下降单位数量
+     */
+    private String tbxjUnitCount;
+    /**
+     * 本年维修费同比增长
+     */
+    private String tbzzUnit;
+    /**
+     * 表格
+     */
+    private List<HouseFwwxztqkTableVo> table;
+    /**
+     * 整体同比
+     */
+    private String zttb;
+    /**
+     * 增长幅度较大单位
+     */
+    private String tbzzjdUnit;
+
+    public HouseFwwxztqkVo(List<HouseFangWuWeiXiuZongTiQingKuangPo> list) {
+        this.table = new ArrayList<>();
+        List<String> unitList = Stream.of("石家庄", "唐山", "秦皇岛", "邯郸", "邢台", "保定", "张家口", "承德",
+                "廊坊", "沧州", "衡水", "雄安", "本部(含传输局)", "全省").toList();
+        if (CollectionUtils.isEmpty(list)) {
+            this.ljwxf = HouseReportVo.PLACEHOLDER;
+            this.tbzj = HouseReportVo.PLACEHOLDER;
+            this.tbbfb = HouseReportVo.PLACEHOLDER;
+            this.tbxjUnitCount = HouseReportVo.PLACEHOLDER;
+            this.tbzzUnit = HouseReportVo.PLACEHOLDER;
+            this.zttb = HouseReportVo.PLACEHOLDER;
+            this.tbzzjdUnit = HouseReportVo.PLACEHOLDER;
+            for (String unit : unitList) {
+                this.table.add(new HouseFwwxztqkTableVo(unit));
+            }
+            return;
+        }
+        for (String unit : unitList) {
+            HouseFwwxztqkTableVo x = new HouseFwwxztqkTableVo(unit);
+            this.table.add(x);
+            for (HouseFangWuWeiXiuZongTiQingKuangPo t : list) {
+                if ("全省".equals(t.getUnit())) {
+                    DecimalFormat integerFormat = new DecimalFormat("#,###");
+                    DecimalFormat percentFormat = new DecimalFormat("0%");
+                    this.ljwxf = integerFormat.format(t.getTyWx());
+                    this.tbzj = (t.getYoy().compareTo(BigDecimal.ZERO) >= 0 ? "增长" : "减少")
+                            + integerFormat.format(t.getYoy().abs());
+                    this.tbbfb = (t.getYoyPercent().compareTo(BigDecimal.ZERO) >= 0 ? "增长" : "减少")
+                            + percentFormat.format(t.getYoyPercent().abs());
+                    this.zttb = (t.getYoy().compareTo(BigDecimal.ZERO) >= 0 ? "增长" : "下降");
+                }
+                if (unit.equals(t.getUnit())) {
+                    x.update(t);
+                    break;
+                }
+            }
+        }
+        this.tbxjUnitCount = String.valueOf(list.stream()
+                .filter(t -> !"全省".equals(t.getUnit()) && t.getYoy().compareTo(BigDecimal.ZERO) < 0).count());
+        List<HouseFangWuWeiXiuZongTiQingKuangPo> tbzzList = list.stream()
+                .filter(t -> !"全省".equals(t.getUnit()) && t.getYoyPercent().compareTo(BigDecimal.ZERO) > 0)
+                .sorted(Comparator.comparing(HouseFangWuWeiXiuZongTiQingKuangPo::getYoyPercent).reversed()).toList();
+        if (CollectionUtils.isEmpty(tbzzList)) {
+            this.tbzzUnit = "无单位";
+            this.tbzzjdUnit = "无单位";
+            return;
+        }
+        this.tbzzUnit = tbzzList.stream()
+                .map(HouseFangWuWeiXiuZongTiQingKuangPo::getUnit).collect(Collectors.joining("、"));
+        if (tbzzList.size() == 1) {
+            this.tbzzjdUnit = tbzzList.get(0).getUnit();
+        } else {
+            BigDecimal median;
+            List<BigDecimal> l = tbzzList.stream().map(HouseFangWuWeiXiuZongTiQingKuangPo::getYoyPercent).sorted().toList();
+            int size = l.size();
+            if (size % 2 == 0) {
+                int midIndex = size / 2;
+                BigDecimal firstMidValue = l.get(midIndex - 1);
+                BigDecimal secondMidValue = l.get(midIndex);
+                median = firstMidValue.add(secondMidValue).divide(new BigDecimal("2"), RoundingMode.HALF_UP);
+            } else {
+                int midIndex = size / 2;
+                median = l.get(midIndex);
+            }
+            this.tbzzjdUnit = tbzzList.stream().filter(t -> t.getYoyPercent().compareTo(median) > 0)
+                    .sorted(Comparator.comparing(HouseFangWuWeiXiuZongTiQingKuangPo::getYoyPercent).reversed())
+                    .map(HouseFangWuWeiXiuZongTiQingKuangPo::getUnit).collect(Collectors.joining("、"));
+        }
+    }
+}

+ 102 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFwxzjzmjjkclTableVo.java

@@ -0,0 +1,102 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingIdleStrategyPo;
+import lombok.Data;
+
+import java.text.DecimalFormat;
+
+@Data
+public class HouseFwxzjzmjjkclTableVo {
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+
+    /**
+     * 三级组织机构名称
+     */
+    private String cityName;
+
+    /**
+     * 建筑别名
+     */
+    private String buildingName;
+
+    /**
+     * 房龄开始年份
+     */
+    private String houseYearBegan;
+
+    /**
+     * 地段
+     */
+    private String areaSector;
+
+    /**
+     * 使用状态
+     */
+    private String usageStatus;
+
+    /**
+     * 建筑用途
+     */
+    private String buildingUse;
+
+    /**
+     * 建筑面积(㎡)
+     */
+    private String buildingArea;
+
+    /**
+     * 建筑面积-自用(㎡)
+     */
+    private String buildingAreaSelfUse;
+
+    /**
+     * 建筑面积-出租(㎡)
+     */
+    private String buildingAreaRent;
+
+    /**
+     * 建筑面积-闲置(㎡)
+     */
+    private String buildingAreaIdle;
+
+    /**
+     * 建筑面积-不可使用(㎡)
+     */
+    private String buildingAreaUnusable;
+
+    public HouseFwxzjzmjjkclTableVo() {
+        this.areaName = "";
+        this.cityName = "";
+        this.buildingName = "";
+        this.houseYearBegan = "";
+        this.areaSector = "";
+        this.usageStatus = "";
+        this.buildingUse = "";
+        this.buildingArea = "";
+        this.buildingAreaSelfUse = "";
+        this.buildingAreaRent = "";
+        this.buildingAreaIdle = "";
+        this.buildingAreaUnusable = "";
+    }
+
+    public HouseFwxzjzmjjkclTableVo(HouseBuildingIdleStrategyPo po) {
+        DecimalFormat integerFormat = new DecimalFormat("#,###");
+        this.areaName = po.getAreaName();
+        this.cityName = po.getCityName();
+        this.buildingName = po.getBuildingName();
+        this.houseYearBegan = po.getHouseYearBegan() == null ? "" : String.valueOf(po.getHouseYearBegan());
+        this.areaSector = po.getAreaSector();
+        this.usageStatus = po.getUsageStatus();
+        this.buildingUse = po.getBuildingUse();
+        this.buildingArea = po.getBuildingArea() == null ? "" : integerFormat.format(po.getBuildingArea());
+        this.buildingAreaSelfUse = po.getBuildingAreaSelfUse() == null ? ""
+                : integerFormat.format(po.getBuildingAreaSelfUse());
+        this.buildingAreaRent = po.getBuildingAreaRent() == null ? "" : integerFormat.format(po.getBuildingAreaRent());
+        this.buildingAreaIdle = po.getBuildingAreaIdle() == null ? "" : integerFormat.format(po.getBuildingAreaIdle());
+        this.buildingAreaUnusable = po.getBuildingAreaUnusable() == null ? ""
+                : integerFormat.format(po.getBuildingAreaUnusable());
+    }
+}

+ 51 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseFwxzjzmjjkclVo.java

@@ -0,0 +1,51 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingIdleStrategyPo;
+import lombok.Data;
+import org.springframework.util.CollectionUtils;
+
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+@Data
+public class HouseFwxzjzmjjkclVo {
+    /**
+     * 全省超1000平米闲置房产数量
+     */
+    private String qsxz;
+    /**
+     * 闲置房产所处核心商圈的单位
+     */
+    private String hxsqUnit;
+    /**
+     * 表格
+     */
+    private List<HouseFwxzjzmjjkclTableVo> table;
+
+    public HouseFwxzjzmjjkclVo(List<HouseBuildingIdleStrategyPo> list) {
+        this.table = new ArrayList<>();
+        if (CollectionUtils.isEmpty(list)) {
+            this.qsxz = "0";
+            this.hxsqUnit = "无";
+            this.table.add(new HouseFwxzjzmjjkclTableVo());
+            return;
+        }
+        DecimalFormat integerFormat = new DecimalFormat("#,###");
+        this.qsxz = integerFormat.format(list.size());
+        Set<String> set = new LinkedHashSet<>();
+        for (HouseBuildingIdleStrategyPo t : list) {
+            this.table.add(new HouseFwxzjzmjjkclTableVo(t));
+            if ("核心商圈".equals(t.getAreaSector())) {
+                set.add(t.getAreaName());
+            }
+        }
+        if (CollectionUtils.isEmpty(set)) {
+            this.hxsqUnit = "无";
+        } else {
+            this.hxsqUnit = String.join("、", set);
+        }
+    }
+}

+ 58 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseGpwxjkclTableVo.java

@@ -0,0 +1,58 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingSameRepairFrequencyPo;
+import lombok.Data;
+
+import java.text.DecimalFormat;
+
+@Data
+public class HouseGpwxjkclTableVo {
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+
+    /**
+     * 建筑别名
+     */
+    private String buildingName;
+
+    /**
+     * 维修类型
+     */
+    private String repairType;
+
+    /**
+     * 账期
+     */
+    private String yearMonth;
+
+    /**
+     * 本年累计维修频次
+     */
+    private String tyTotal;
+
+    /**
+     * 本年累计维修频次排名
+     */
+    private String tyTotalRank;
+
+    public HouseGpwxjkclTableVo() {
+        this.areaName = "";
+        this.buildingName = "";
+        this.repairType = "";
+        this.yearMonth = "";
+        this.tyTotal = "";
+        this.tyTotalRank = "";
+    }
+
+    public HouseGpwxjkclTableVo(HouseBuildingSameRepairFrequencyPo po) {
+        DecimalFormat integerFormat = new DecimalFormat("#,###");
+        this.areaName = po.getAreaName();
+        this.buildingName = po.getBuildingName();
+        this.repairType = po.getRepairType();
+        this.yearMonth = String.valueOf(po.getYearMonth());
+        this.tyTotal = integerFormat.format(po.getTyTotal());
+        this.tyTotalRank = integerFormat.format(po.getTyTotalRank());
+    }
+}

+ 27 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseGpwxjkclVo.java

@@ -0,0 +1,27 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingSameRepairFrequencyPo;
+import lombok.Data;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class HouseGpwxjkclVo {
+    /**
+     * 表格
+     */
+    private List<HouseGpwxjkclTableVo> table;
+
+    public HouseGpwxjkclVo(List<HouseBuildingSameRepairFrequencyPo> list) {
+        this.table = new ArrayList<>();
+        if (CollectionUtils.isEmpty(list)) {
+            this.table.add(new HouseGpwxjkclTableVo());
+            return;
+        }
+        for (HouseBuildingSameRepairFrequencyPo t : list) {
+            this.table.add(new HouseGpwxjkclTableVo(t));
+        }
+    }
+}

+ 30 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HousePjczdjhlxclTableVo.java

@@ -0,0 +1,30 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import lombok.Data;
+
+@Data
+public class HousePjczdjhlxclTableVo {
+    /**
+     * 单位
+     */
+    private String unit;
+    /**
+     * 出租收入
+     */
+    private String czsr;
+    /**
+     * 出租面积
+     */
+    private String czmj;
+    /**
+     * 出租单价
+     */
+    private String czdj;
+
+    public HousePjczdjhlxclTableVo(String unit) {
+        this.unit = unit;
+        this.czsr = "";
+        this.czmj = "";
+        this.czdj = "";
+    }
+}

+ 24 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HousePjczdjhlxclVo.java

@@ -0,0 +1,24 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+@Data
+public class HousePjczdjhlxclVo {
+    /**
+     * 表格
+     */
+    private List<HousePjczdjhlxclTableVo> table;
+
+    public HousePjczdjhlxclVo() {
+        this.table = new ArrayList<>();
+        List<String> unitList = Stream.of("省本部", "石家庄", "唐山", "秦皇岛", "邯郸", "邢台", "保定", "张家口",
+                "承德", "廊坊", "沧州", "衡水", "雄安", "省机动局", "全省").toList();
+        for (String unit : unitList) {
+            this.table.add(new HousePjczdjhlxclTableVo(unit));
+        }
+    }
+}

+ 65 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseReportVo.java

@@ -0,0 +1,65 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import lombok.Data;
+
+@Data
+public class HouseReportVo {
+    public static final String PLACEHOLDER = "X";
+    private Integer endYearMonth;
+    /**
+     * 报告年
+     */
+    private String reportYear;
+    /**
+     * 报告月
+     */
+    private String reportMonth;
+    /**
+     * 当前年
+     */
+    private String currentYear;
+    /**
+     * 当前月
+     */
+    private String currentMonth;
+    /**
+     * 资源总体情况
+     */
+    private HouseZyztqkVo zyztqk;
+    /**
+     * 房产资源总体使用效率
+     */
+    private HouseFczyztsyxlVo fczyztsyxl;
+    /**
+     * 房产出租总体情况
+     */
+    private HouseFcczztqkVo fcczztqk;
+    /**
+     * 房屋维修总体情况
+     */
+    private HouseFwwxztqkVo fwwxztqk;
+    /**
+     * 房屋闲置建筑面积监控策略
+     */
+    private HouseFwxzjzmjjkclVo fwxzjzmjjkcl;
+    /**
+     * 长期欠费出租合同监控策略
+     */
+    private HouseCqqfczhtjkclVo cqqfczhtjkcl;
+    /**
+     * 大额欠费出租合同监控策略
+     */
+    private HouseDeqfczhtjkclVo deqfczhtjkcl;
+    /**
+     * 大额零星维修监控策略
+     */
+    private HouseDelxwxjkclVo delxwxjkcl;
+    /**
+     * 高频维修监控策略
+     */
+    private HouseGpwxjkclVo gpwxjkcl;
+    /**
+     * 平均出租单价合理性策略
+     */
+    private HousePjczdjhlxclVo pjczhlxcl;
+}

+ 59 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseZyztqkTableVo.java

@@ -0,0 +1,59 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingStatPo;
+import lombok.Data;
+
+import java.text.DecimalFormat;
+
+@Data
+public class HouseZyztqkTableVo {
+    /**
+     * 二级组织机构名称
+     */
+    private String areaName;
+    /**
+     * 资产原值
+     */
+    private String zcyz;
+    /**
+     * 房产数量
+     */
+    private String fcsl;
+    /**
+     * 总面积
+     */
+    private String zmj;
+    /**
+     * 核心商圈
+     */
+    private String hxsq;
+    /**
+     * 一般商圈
+     */
+    private String ybsq;
+    /**
+     * 乡镇乡村
+     */
+    private String xzxc;
+
+    public HouseZyztqkTableVo(String areaName) {
+        this.areaName = areaName;
+        this.zcyz = "";
+        this.fcsl = "";
+        this.zmj = "";
+        this.hxsq = "";
+        this.ybsq = "";
+        this.xzxc = "";
+    }
+
+    public HouseZyztqkTableVo(HouseBuildingStatPo po) {
+        DecimalFormat integerFormat = new DecimalFormat("#,###");
+        this.areaName = po.getAreaName();
+        this.zcyz = integerFormat.format(po.getZcyz());
+        this.fcsl = integerFormat.format(po.getFcsl());
+        this.zmj = integerFormat.format(po.getZmj());
+        this.hxsq = integerFormat.format(po.getHxsq());
+        this.ybsq = integerFormat.format(po.getYbsq());
+        this.xzxc = integerFormat.format(po.getXzxc());
+    }
+}

+ 98 - 0
src/main/java/com/nokia/finance/tasks/pojo/vo/house_report/HouseZyztqkVo.java

@@ -0,0 +1,98 @@
+package com.nokia.finance.tasks.pojo.vo.house_report;
+
+import com.nokia.finance.tasks.pojo.po.house_report.HouseBuildingStatPo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Data
+@NoArgsConstructor
+public class HouseZyztqkVo {
+    /**
+     * 全省共有房产建筑物
+     */
+    private String fcsl;
+    /**
+     * 建筑面积
+     */
+    private String zmj;
+    /**
+     * 原值
+     */
+    private String zcyz;
+    /**
+     * 核心商圈建筑面积
+     */
+    private String hxsq;
+    /**
+     * 一般商圈
+     */
+    private String ybsq;
+    /**
+     * 全省房屋数量及建筑面积排名前5位的单位
+     */
+    private String jzmjTopUnit;
+    /**
+     * 房屋建筑面积均超
+     */
+    private String jzmjTopMin;
+    /**
+     * 合计占全省房屋建筑面积
+     */
+    private String jzmjTopPercent;
+    /**
+     * 统计表格
+     */
+    private List<HouseZyztqkTableVo> table;
+
+    public HouseZyztqkVo(List<HouseBuildingStatPo> list) {
+        this.table = new ArrayList<>();
+        DecimalFormat integerFormat = new DecimalFormat("#,###");
+        DecimalFormat numberFormat = new DecimalFormat("#,##0.0");
+        DecimalFormat percentFormat = new DecimalFormat("0%");
+        BigDecimal jzmj = BigDecimal.ZERO;
+        for (HouseBuildingStatPo t : list) {
+            this.table.add(new HouseZyztqkTableVo(t));
+            if ("合计".equals(t.getAreaName())) {
+                this.fcsl = integerFormat.format(t.getFcsl());
+                this.zmj = numberFormat.format(t.getZmj().divide(new BigDecimal("10000"), RoundingMode.HALF_UP));
+                this.zcyz = integerFormat.format(t.getZcyz().divide(new BigDecimal("10000"), RoundingMode.HALF_UP));
+                this.hxsq = integerFormat.format(t.getHxsq().divide(new BigDecimal("10000"), RoundingMode.HALF_UP));
+                this.ybsq = integerFormat.format(t.getYbsq().divide(new BigDecimal("10000"), RoundingMode.HALF_UP));
+                jzmj = t.getZmj();
+            }
+        }
+        if (jzmj.compareTo(BigDecimal.ZERO) == 0) {
+            this.fcsl = HouseReportVo.PLACEHOLDER;
+            this.zmj = HouseReportVo.PLACEHOLDER;
+            this.zcyz = HouseReportVo.PLACEHOLDER;
+            this.hxsq = HouseReportVo.PLACEHOLDER;
+            this.ybsq = HouseReportVo.PLACEHOLDER;
+            this.jzmjTopUnit = HouseReportVo.PLACEHOLDER;
+            this.jzmjTopMin = HouseReportVo.PLACEHOLDER;
+            this.jzmjTopPercent = HouseReportVo.PLACEHOLDER;
+            this.table = new ArrayList<>();
+            for (HouseBuildingStatPo t : list) {
+                this.table.add(new HouseZyztqkTableVo(t.getAreaName()));
+            }
+            return;
+        }
+        List<HouseBuildingStatPo> jzmjTopList = list.stream()
+                .filter(t -> !"合计".equals(t.getAreaName()))
+                .sorted(Comparator.comparing(HouseBuildingStatPo::getZmj).reversed()).limit(5).toList();
+        this.jzmjTopUnit = jzmjTopList.stream()
+                .map(HouseBuildingStatPo::getAreaName).collect(Collectors.joining("、"));
+        this.jzmjTopMin = integerFormat.format(jzmjTopList.get(4).getZmj()
+                .divide(new BigDecimal("10000"), RoundingMode.HALF_UP));
+        BigDecimal jzmjTopSum = jzmjTopList.stream()
+                .map(HouseBuildingStatPo::getZmj).reduce(BigDecimal.ZERO, BigDecimal::add);
+        this.jzmjTopPercent = percentFormat.format(jzmjTopSum.divide(jzmj, RoundingMode.HALF_UP));
+    }
+}

+ 10 - 1
src/main/java/com/nokia/finance/tasks/service/JobService.java

@@ -4,6 +4,7 @@ import com.nokia.finance.tasks.common.R;
 import com.nokia.finance.tasks.jobs.car.CarReportJob;
 import com.nokia.finance.tasks.jobs.car.chengben.CarBaoXianJob;
 import com.nokia.finance.tasks.jobs.car.chengben.CarDaWeiXiuJob;
+import com.nokia.finance.tasks.jobs.car.chengben.CarFuWuFeiJob;
 import com.nokia.finance.tasks.jobs.car.chengben.CarLuQiaoJob;
 import com.nokia.finance.tasks.jobs.car.chengben.CarNianJianFeiJob;
 import com.nokia.finance.tasks.jobs.car.chengben.CarQiTaJob;
@@ -19,6 +20,7 @@ import com.nokia.finance.tasks.jobs.car.ruixing.CarYongCheJob;
 import com.nokia.finance.tasks.jobs.car.ruixing.CarYueJieJob;
 import com.nokia.finance.tasks.jobs.car.shujucangku.CarFeeBsJob;
 import com.nokia.finance.tasks.jobs.car.shujucangku.CarFeeHbJob;
+import com.nokia.finance.tasks.jobs.house.HouseReportJob;
 import com.nokia.finance.tasks.jobs.house.chengben.HouseBuildingRepairMonthJob;
 import com.nokia.finance.tasks.jobs.house.chengben.HouseRentInRepairMonthJob;
 import com.nokia.finance.tasks.pojo.dto.RunJobDto;
@@ -44,8 +46,10 @@ public class JobService {
     private final HouseBuildingRepairMonthJob houseBuildingRepairMonthJob;
     private final CarLiChengDayJob carLiChengDayJob;
     private final CarSiCheGongYongJob carSiCheGongYongJob;
+    private final CarFuWuFeiJob carFuWuFeiJob;
     private final HouseRentInRepairMonthJob houseRentInRepairMonthJob;
     private final CarReportJob carReportJob;
+    private final HouseReportJob houseReportJob;
 
     public JobService(CarBaseDataDayJob carBaseDataDayJob, CarYueJieJob carYueJieJob, CarBaoFeiJob carBaoFeiJob,
                       CarLiChengMonthJob carLiChengMonthJob, CarWuDanYongCheJob carWuDanYongCheJob,
@@ -54,7 +58,8 @@ public class JobService {
                       CarNianJianFeiJob carNianJianFeiJob, CarQiTaJob carQiTaJob, CarFeeHbJob carFeeHbJob,
                       CarFeeBsJob carFeeBsJob, HouseBuildingRepairMonthJob houseBuildingRepairMonthJob,
                       CarLiChengDayJob carLiChengDayJob, CarSiCheGongYongJob carSiCheGongYongJob,
-                      HouseRentInRepairMonthJob houseRentInRepairMonthJob, CarReportJob carReportJob) {
+                      CarFuWuFeiJob carFuWuFeiJob, HouseRentInRepairMonthJob houseRentInRepairMonthJob,
+                      CarReportJob carReportJob, HouseReportJob houseReportJob) {
         this.carBaseDataDayJob = carBaseDataDayJob;
         this.carYueJieJob = carYueJieJob;
         this.carBaoFeiJob = carBaoFeiJob;
@@ -73,8 +78,10 @@ public class JobService {
         this.houseBuildingRepairMonthJob = houseBuildingRepairMonthJob;
         this.carLiChengDayJob = carLiChengDayJob;
         this.carSiCheGongYongJob = carSiCheGongYongJob;
+        this.carFuWuFeiJob = carFuWuFeiJob;
         this.houseRentInRepairMonthJob = houseRentInRepairMonthJob;
         this.carReportJob = carReportJob;
+        this.houseReportJob = houseReportJob;
     }
 
     public R<Object> runJob(RunJobDto dto) {
@@ -97,8 +104,10 @@ public class JobService {
             case HOUSE_BUILDING_REPAIR_MONTH_JOB -> houseBuildingRepairMonthJob.runJob();
             case CAR_LI_CHENG_DAY_JOB -> carLiChengDayJob.runJob();
             case CAR_SI_CHE_GONG_YONG_JOB -> carSiCheGongYongJob.runJob();
+            case CAR_FU_WU_FEI_JOB -> carFuWuFeiJob.runJob();
             case HOUSE_RENT_IN_REPAIR_MONTH_JOB -> houseRentInRepairMonthJob.runJob();
             case CAR_REPORT_JOB -> carReportJob.runJob();
+            case HOUSE_REPORT_JOB -> houseReportJob.runJob();
             default -> {}
         }
         return R.ok();

+ 16 - 0
src/main/resources/application-dev.yml

@@ -186,3 +186,19 @@ car-report:
   wg-xlsx: templates/car/report/docx/word/embeddings/Microsoft_Excel_Worksheet4.xlsx
   # 违章xlsx路径
   wz-xlsx: templates/car/report/docx/word/embeddings/Microsoft_Excel_Worksheet5.xlsx
+# 不动产报告配置
+house-report:
+  # docx文件夹
+  docx-dir: templates/house/report/docx
+  # 输出路径
+  out-dir: /app/libreoffice/
+  # 输出docx路径
+  docx: /app/libreoffice/house.docx
+  # 输出pdf路径
+  pdf: /app/libreoffice/house.pdf
+  # ftl文件夹
+  ftl-dir: templates/house/report/ftls
+  # document ftl路径
+  document-ftl: document.ftl
+  # document xml路径
+  document-xml: templates/house/report/docx/word/document.xml

+ 16 - 0
src/main/resources/application-prod.yml

@@ -177,3 +177,19 @@ car-report:
   wg-xlsx: templates/car/report/docx/word/embeddings/Microsoft_Excel_Worksheet4.xlsx
   # 违章xlsx路径
   wz-xlsx: templates/car/report/docx/word/embeddings/Microsoft_Excel_Worksheet5.xlsx
+# 不动产报告配置
+house-report:
+  # docx文件夹
+  docx-dir: templates/house/report/docx
+  # 输出路径
+  out-dir: /app/libreoffice/
+  # 输出docx路径
+  docx: /app/libreoffice/house.docx
+  # 输出pdf路径
+  pdf: /app/libreoffice/house.pdf
+  # ftl文件夹
+  ftl-dir: templates/house/report/ftls
+  # document ftl路径
+  document-ftl: document.ftl
+  # document xml路径
+  document-xml: templates/house/report/docx/word/document.xml

+ 21 - 0
src/test/java/com/nokia/finance/tasks/house/HouseReportJobTests.java

@@ -0,0 +1,21 @@
+package com.nokia.finance.tasks.house;
+
+import com.nokia.finance.tasks.jobs.house.HouseReportJob;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+
+@Slf4j
+@SpringBootTest
+@ActiveProfiles("dev")
+class HouseReportJobTests {
+    @Autowired
+    HouseReportJob houseReportJob;
+
+    @Test
+    void runJobTest() {
+        houseReportJob.runJob();
+    }
+}

+ 2 - 0
templates/house/report/docx/[Content_Types].xml

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="png" ContentType="image/png"/><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/><Override PartName="/customXml/itemProps1.xml" ContentType="application/vnd.openxmlformats-officedocument.customXmlProperties+xml"/><Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/><Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/><Override PartName="/word/settings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"/><Override PartName="/word/webSettings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml"/><Override PartName="/word/fontTable.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"/><Override PartName="/word/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/><Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/><Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/><Override PartName="/docProps/custom.xml" ContentType="application/vnd.openxmlformats-officedocument.custom-properties+xml"/></Types>

+ 2 - 0
templates/house/report/docx/_rels/.rels

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties" Target="docProps/custom.xml"/></Relationships>

+ 2 - 0
templates/house/report/docx/customXml/_rels/item1.xml.rels

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps" Target="itemProps1.xml"/></Relationships>

+ 1 - 0
templates/house/report/docx/customXml/item1.xml

@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><b:Sources xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" SelectedStyle="\APASixthEditionOfficeOnline.xsl" StyleName="APA" Version="6"/>

+ 2 - 0
templates/house/report/docx/customXml/itemProps1.xml

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<ds:datastoreItem ds:itemID="{D0F38DD2-2B05-48A7-9F3F-3039B13D8119}" xmlns:ds="http://schemas.openxmlformats.org/officeDocument/2006/customXml"><ds:schemaRefs><ds:schemaRef ds:uri="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"/></ds:schemaRefs></ds:datastoreItem>

+ 2 - 0
templates/house/report/docx/docProps/app.xml

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><Template>Normal.dotm</Template><TotalTime>1</TotalTime><Pages>12</Pages><Words>1371</Words><Characters>7819</Characters><DocSecurity>0</DocSecurity><Lines>65</Lines><Paragraphs>18</Paragraphs><ScaleCrop>false</ScaleCrop><Company></Company><LinksUpToDate>false</LinksUpToDate><CharactersWithSpaces>9172</CharactersWithSpaces><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>16.0000</AppVersion></Properties>

+ 10 - 0
templates/house/report/docx/docProps/core.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties"
+                   xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/"
+                   xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <dc:title></dc:title>
+    <dc:subject></dc:subject>
+    <dc:description></dc:description>
+    <dcterms:created xsi:type="dcterms:W3CDTF">2000-01-01T00:00:00Z</dcterms:created>
+    <dcterms:modified xsi:type="dcterms:W3CDTF">2000-01-01T00:00:00Z</dcterms:modified>
+</cp:coreProperties>

+ 2 - 0
templates/house/report/docx/docProps/custom.xml

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" name="ICV"><vt:lpwstr>3F971D0C351D48F7BD1FC2D6CDB4C005</vt:lpwstr></property><property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="3" name="KSOProductBuildVer"><vt:lpwstr>2052-12.1.0.16929</vt:lpwstr></property></Properties>

+ 2 - 0
templates/house/report/docx/word/_rels/document.xml.rels

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/><Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" Target="numbering.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml" Target="../customXml/item1.xml"/><Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png"/><Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings" Target="webSettings.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Target="settings.xml"/></Relationships>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
templates/house/report/docx/word/document.xml


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
templates/house/report/docx/word/fontTable.xml


BIN
templates/house/report/docx/word/media/image1.png


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
templates/house/report/docx/word/numbering.xml


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
templates/house/report/docx/word/settings.xml


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
templates/house/report/docx/word/styles.xml


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
templates/house/report/docx/word/theme/theme1.xml


+ 2 - 0
templates/house/report/docx/word/webSettings.xml

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<w:webSettings xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16du"/>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
templates/house/report/ftls/document.ftl


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott