Explorar el Código

Merge branch 'dev-excel0521' into dev-to-user-1

DESKTOP-2K9OVK9\siwei hace 1 mes
padre
commit
a6692789c7

+ 53 - 272
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/cadastre/StorageController.java

@@ -1,14 +1,19 @@
 package com.siwei.apply.controller.cadastre;
 
-import com.siwei.apply.domain.res.*;
+import com.siwei.apply.domain.res.StorageYearStatisticsRes;
+import com.siwei.apply.domain.res.TrendStatisticsData;
+import com.siwei.apply.domain.res.TrendStatisticsRes;
+import com.siwei.apply.domain.res.TrendUseStatisticsData;
 import com.siwei.apply.domain.vo.LandSupplyProjectVO;
-import com.siwei.apply.service.cadastre.ISupplyService;
-import com.siwei.apply.service.cadastre.IZymlService;
 import com.siwei.apply.service.cadastre.impl.StorageServiceImpl;
 import com.siwei.common.core.domain.R;
 import com.siwei.common.core.web.controller.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.HashMap;
 import java.util.List;
@@ -16,9 +21,7 @@ import java.util.Map;
 
 /**
  * 地籍土地收储模块
- *
  */
-
 @RestController
 @RequestMapping("/cadastre/storage")
 public class StorageController extends BaseController {
@@ -26,226 +29,28 @@ public class StorageController extends BaseController {
     @Autowired
     private StorageServiceImpl storageServiceImpl;
 
-
-    @Autowired
-    private ISupplyService supplyService;
-
-
     /**
      * 年度统计
      */
     @GetMapping("/yearStatistics/{year}")
     public R<StorageYearStatisticsRes> getYearStatistics(@PathVariable String year) {
         try {
-            StorageYearStatisticsRes res = new StorageYearStatisticsRes();
-            if (year.equalsIgnoreCase("2024")) {
-                StorageRateRes storageRate = new StorageRateRes();
-
-                List<LandUseRes> landUseStatisticsList = new java.util.ArrayList<>(List.of()); // 用途分析
-
-                List<ProjectSupplyRes> projectSupplyList = new java.util.ArrayList<>(List.of()); // 供应方式
-                storageRate.setCompleteRate(63 + (int) (Math.random() * 10));
-                storageRate.setPlanProjectCount(33 + (int) (Math.random() * 5));
-                storageRate.setCompleteProjectCount(21 + (int) (Math.random() * 5));
-
-                storageRate.setPlanArea((float) (Math.round((788.6f + (float) (Math.random() * 100)) * 100) / 100.0));
-                storageRate.setCompleteArea((float) (Math.round((548.2f + (float) (Math.random() * 100)) * 100) / 100.0));
-                storageRate.setGdUnit("亩");
-                storageRate.setEstimatedCost(349338.6f);
-                storageRate.setExpenditureCost(109300.3f);
-                res.setStorageRate(storageRate);
-
-                // --------------土地用途分析----------------------
-
-                LandUseRes landUse1 = new LandUseRes();
-                landUse1.setLandUseTypeName("城镇住宅用地");
-                landUse1.setPlanLandUseArea(700);
-                landUse1.setCompleteLandUseArea(300);
-
-                LandUseRes landUse2 = new LandUseRes();
-                landUse2.setLandUseTypeName("教育用地");
-                landUse2.setPlanLandUseArea(900);
-                landUse2.setCompleteLandUseArea(600);
-
-                landUseStatisticsList.addAll(List.of(landUse1, landUse2));
-                res.setLandUseStatisticsList(landUseStatisticsList);
-                // --------------供应方式----------------------
-
-                ProjectSupplyRes projectSupply1 = new ProjectSupplyRes();
-                projectSupply1.setGdArea(263.12f);
-                projectSupply1.setGdType("征用");
-                projectSupply1.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply2 = new ProjectSupplyRes();
-                projectSupply2.setGdArea(220.12f);
-                projectSupply2.setGdType("收回");
-                projectSupply2.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply3 = new ProjectSupplyRes();
-                projectSupply3.setGdArea(190.12f);
-                projectSupply3.setGdType("收购");
-                projectSupply3.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply4 = new ProjectSupplyRes();
-                projectSupply4.setGdArea(390.12f);
-                projectSupply4.setGdType("置换");
-                projectSupply4.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply5 = new ProjectSupplyRes();
-                projectSupply5.setGdArea(250.12f);
-                projectSupply5.setGdType("其它");
-                projectSupply5.setGdUnit("亩");
-
-                projectSupplyList.addAll(List.of(projectSupply1, projectSupply2, projectSupply3, projectSupply4, projectSupply5));
-                res.setProjectSupplyList(projectSupplyList);
-
-            } else if (year.equalsIgnoreCase("2025") ) {
-                StorageRateRes storageRate = new StorageRateRes();
-                List<LandUseRes> landUseStatisticsList = new java.util.ArrayList<>(List.of()); // 用途分析
-
-
-                List<ProjectSupplyRes> projectSupplyList = new java.util.ArrayList<>(List.of()); // 供应方式
-                storageRate.setCompleteRate(46);
-                storageRate.setPlanProjectCount(15);
-                storageRate.setCompleteProjectCount(7);
-
-                storageRate.setPlanArea(1788.6f);
-                storageRate.setCompleteArea(445.2f);
-                storageRate.setGdUnit("亩");
-                storageRate.setEstimatedCost(149338.6f);
-                storageRate.setExpenditureCost(89338.3f);
-                res.setStorageRate(storageRate);
-
-
-
-
-
-
-
-
-
-                // --------------土地用途分析----------------------
-                // 城镇住宅用地,教育用地,商业用地,工业用地,物流仓储用地,公路用地,工业绿地
-                String[] landTypes = { "城镇住宅用地", "教育用地", "商业用地", "工业用地", "物流仓储用地", "公路用地", "工业绿地" };
-                for (String type : landTypes) {
-                    LandUseRes landUse = new LandUseRes();
-                    landUse.setLandUseTypeName(type);
-                    // 随机生成面积
-                    landUse.setPlanLandUseArea(Integer.parseInt(String.valueOf(500 + (int) (Math.random() * 500))));
-                    landUse.setCompleteLandUseArea(Integer.parseInt(String.valueOf(300 + (int) (Math.random() * 300))));
-                    landUseStatisticsList.add(landUse);
-                }
-                res.setLandUseStatisticsList(landUseStatisticsList);
-
-                // --------------供应方式----------------------
-                ProjectSupplyRes projectSupply1 = new ProjectSupplyRes();
-                projectSupply1.setGdArea((float) (Math.round((263.12f + (float) (Math.random() * 100)) * 100) / 100.0));
-                projectSupply1.setGdType("征用");
-                projectSupply1.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply2 = new ProjectSupplyRes();
-
-                projectSupply2.setGdArea((float) (Math.round((220.12f + (float) (Math.random() * 100)) * 100) / 100.0));
-                projectSupply2.setGdType("收回");
-                projectSupply2.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply3 = new ProjectSupplyRes();
-                projectSupply3.setGdArea((float) (Math.round((190.12f + (float) (Math.random() * 100)) * 100) / 100.0));
-                projectSupply3.setGdType("收购");
-                projectSupply3.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply4 = new ProjectSupplyRes();
-                projectSupply4.setGdArea(390.12f);
-                projectSupply4.setGdType("置换");
-                projectSupply4.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply5 = new ProjectSupplyRes();
-                projectSupply5.setGdArea(250.12f);
-                projectSupply5.setGdType("其它");
-                projectSupply5.setGdUnit("亩");
-
-                projectSupplyList.addAll(List.of(projectSupply1, projectSupply2, projectSupply3, projectSupply4, projectSupply5));
-                res.setProjectSupplyList(projectSupplyList);
-            }else if (year.equalsIgnoreCase("2022")) {
-                StorageRateRes storageRate = new StorageRateRes();
-                List<LandUseRes> landUseStatisticsList = new java.util.ArrayList<>(List.of()); // 用途分析
-                List<ProjectSupplyRes> projectSupplyList = new java.util.ArrayList<>(List.of()); // 供应方式
-                storageRate.setCompleteRate(78 + (int) (Math.random() * 10));
-                storageRate.setPlanProjectCount(35 + (int) (Math.random() * 5));
-                storageRate.setCompleteProjectCount(21 + (int) (Math.random() * 5));
-                storageRate.setPlanArea((float) (Math.round((788.6f + (float) (Math.random() * 100)) * 100) / 100.0));
-                storageRate.setCompleteArea((float) (Math.round((548.2f + (float) (Math.random() * 100)) * 100) / 100.0));
-                storageRate.setGdUnit("亩");
-                storageRate.setEstimatedCost(1254.6f);
-                storageRate.setExpenditureCost(1000.3f);
-                res.setStorageRate(storageRate);
-
-                // --------------土地用途分析----------------------
-                // 城镇住宅用地,教育用地,商业用地,工业用地,物流仓储用地,公路用地,工业绿地
-                String[] landTypes = { "城镇住宅用地", "教育用地", "商业用地", "工业用地", "物流仓储用地", "公路用地", "工业绿地" };
-                for (String type : landTypes) {
-                    LandUseRes landUse = new LandUseRes();
-                    landUse.setLandUseTypeName(type);
-                    // 随机生成面积
-                    landUse.setPlanLandUseArea(Integer.parseInt(String.valueOf(500 + (int) (Math.random() * 500))));
-                    landUse.setCompleteLandUseArea(Integer.parseInt(String.valueOf(300 + (int) (Math.random() * 300))));
-                    landUseStatisticsList.add(landUse);
-                }
-                res.setLandUseStatisticsList(landUseStatisticsList);
-
-                // --------------供应方式----------------------
-                ProjectSupplyRes projectSupply1 = new ProjectSupplyRes();
-                projectSupply1.setGdArea((float) (Math.round((263.12f + (float) (Math.random() * 100)) * 100) / 100.0));
-                projectSupply1.setGdType("征用");
-                projectSupply1.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply2 = new ProjectSupplyRes();
-
-                projectSupply2.setGdArea((float) (Math.round((220.12f + (float) (Math.random() * 100)) * 100) / 100.0));
-                projectSupply2.setGdType("收回");
-                projectSupply2.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply3 = new ProjectSupplyRes();
-                projectSupply3.setGdArea((float) (Math.round((190.12f + (float) (Math.random() * 100)) * 100) / 100.0));
-                projectSupply3.setGdType("收购");
-                projectSupply3.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply4 = new ProjectSupplyRes();
-                projectSupply4.setGdArea(390.12f);
-                projectSupply4.setGdType("置换");
-                projectSupply4.setGdUnit("亩");
-
-                ProjectSupplyRes projectSupply5 = new ProjectSupplyRes();
-                projectSupply5.setGdArea(250.12f);
-                projectSupply5.setGdType("其它");
-                projectSupply5.setGdUnit("亩");
-
-                projectSupplyList.addAll(List.of(projectSupply1, projectSupply2, projectSupply3, projectSupply4, projectSupply5));
-                res.setProjectSupplyList(projectSupplyList);
-
-            }
-
-
-
-            return R.ok(res);
+            return R.ok(storageServiceImpl.getYearStatistics(year));
         } catch (Exception e) {
             e.printStackTrace();
             return R.fail(e.getMessage());
         }
     }
 
-
     /**
-     *
      * 趋势统计
-     *
      */
     @GetMapping("/trendStatistics/{landType}")
     public R<TrendStatisticsRes> getTrendStatistics(@PathVariable String landType) {
         try {
             TrendStatisticsRes res = new TrendStatisticsRes();
-            List<Map<String, Object>> areaTrendStatisticsList = new java.util.ArrayList<>(List.of()); // 面积趋势分析list
-            List<Map<String, Object>> supplyModeStatisticsList = new java.util.ArrayList<>(List.of()); // 供应方式分析list
+            List<Map<String, Object>> areaTrendStatisticsList = new java.util.ArrayList<>(List.of());
+            List<Map<String, Object>> supplyModeStatisticsList = new java.util.ArrayList<>(List.of());
 
             Map<String, Object> map1 = new HashMap<>();
             map1.put("year", 2023);
@@ -261,26 +66,25 @@ public class StorageController extends BaseController {
             areaTrendStatisticsList.addAll(List.of(map1, map2, map3));
             res.setAreaTrendStatisticsList(areaTrendStatisticsList);
 
-            // --------------下面为供地方式list----------------------
             Map<String, Object> modeMap1 = new HashMap<>();
             modeMap1.put("year", 2023);
-            modeMap1.put("transferArea", 587.7); // 出让
-            modeMap1.put("allocateArea", 500.5); // 划拨区域
-            modeMap1.put("otherArea", 498.23); // 其它区域面积
+            modeMap1.put("transferArea", 587.7);
+            modeMap1.put("allocateArea", 500.5);
+            modeMap1.put("otherArea", 498.23);
             supplyModeStatisticsList.add(modeMap1);
 
             Map<String, Object> modeMap2 = new HashMap<>();
             modeMap2.put("year", 2024);
-            modeMap2.put("transferArea", 487.7); // 出让
-            modeMap2.put("allocateArea", 400.5); // 划拨区域
-            modeMap2.put("otherArea", 398.23); // 其它区域面积
+            modeMap2.put("transferArea", 487.7);
+            modeMap2.put("allocateArea", 400.5);
+            modeMap2.put("otherArea", 398.23);
             supplyModeStatisticsList.add(modeMap2);
 
             Map<String, Object> modeMap3 = new HashMap<>();
             modeMap3.put("year", 2025);
-            modeMap3.put("transferArea", 487.7); // 出让
-            modeMap3.put("allocateArea", 400.5); // 划拨区域
-            modeMap3.put("otherArea", 398.23); // 其它区域面积
+            modeMap3.put("transferArea", 487.7);
+            modeMap3.put("allocateArea", 400.5);
+            modeMap3.put("otherArea", 398.23);
             supplyModeStatisticsList.add(modeMap3);
             res.setSupplyModeStatisticsList(supplyModeStatisticsList);
             return R.ok(res);
@@ -289,24 +93,20 @@ public class StorageController extends BaseController {
         }
     }
 
-
-
     /**
-     *
-     * 趋势统计
-     *
+     * 出入库趋势统计
      */
     @GetMapping("/trendStatistics/getData1")
     public R<List<TrendStatisticsData>> getData1() {
         try {
             List<TrendStatisticsData> areaTrendStatisticsList = storageServiceImpl.getData1();
-            for(TrendStatisticsData obj : areaTrendStatisticsList) {
-                if(obj.getYear().equals("2022")) {
-                    obj.setOutDataArea(String.valueOf(384+9.5f));
-                }else if(obj.getYear().equals("2023")) {
-                    obj.setOutDataArea(String.valueOf(110+5.5f));
+            for (TrendStatisticsData obj : areaTrendStatisticsList) {
+                if (obj.getYear().equals("2022")) {
+                    obj.setOutDataArea(String.valueOf(384 + 9.5f));
+                } else if (obj.getYear().equals("2023")) {
+                    obj.setOutDataArea(String.valueOf(110 + 5.5f));
                 } else if (obj.getYear().equals("2024")) {
-                    obj.setOutDataArea(String.valueOf(25+44.5f));
+                    obj.setOutDataArea(String.valueOf(25 + 44.5f));
                 } else if (obj.getYear().equals("2025")) {
                     obj.setOutDataArea(String.valueOf(16.f));
                 }
@@ -317,56 +117,29 @@ public class StorageController extends BaseController {
         }
     }
 
-
-//  实际
-//            2025  16
-//            2024 25
-//            2023 110
-//            2022 384
-//
-//          存量
-//            2022  9
-//            2023  5
-//            2024  44
-//            2025 0
-
-
-
-
-
     /**
-     * 根据年份,统计每一年的用途的面积
-     * year 为0或者为空字符串,表示查询所有年份的数据
-     * @param year
-     * @return
+     * 根据年份统计用途面积
      */
     @GetMapping("/trendStatistics/getData2/{year}")
     public R<List<TrendUseStatisticsData>> getData2(@PathVariable String year) {
         try {
-            //todo  这里参考 R<List<TrendStatisticsData>> getData1() 方法实现,调用service层方法获取数据并封装到res对象中
-            //   FROM vector.gj_shiji_shouchu  表字段:  年份(scnd - 类似 2020) 用途(ytdyt)
-            // 完善当前方法,可以自由改动,最终结果正确就可以
             List<TrendUseStatisticsData> useAreaTrendStatisticsList = storageServiceImpl.getData2(year);
             return R.ok(useAreaTrendStatisticsList);
         } catch (Exception e) {
             return R.fail(e.getMessage());
         }
-
     }
 
-
-
-
     /**
-     * 根据年份和供地类型查询土地供应统计报表数据
-     * @param year
-     * @param supplyType (1-计划,2-完成)
-     * @return
+     * 根据年份和类型查询土地收储统计项目列表
+     * supplyType: 0-全部,1-计划,2-完成
      */
     @GetMapping("/projectList")
-    public R<List<LandSupplyProjectVO>> getProjectList(@RequestParam(required = false) String year, @RequestParam Integer supplyType) {
+    public R<List<LandSupplyProjectVO>> getProjectList(@RequestParam(required = false) String year,
+                                                       @RequestParam Integer supplyType,
+                                                       @RequestParam(required = false) String keyWord) {
         try {
-            List<LandSupplyProjectVO> resList =  storageServiceImpl.projectList(year,supplyType);
+            List<LandSupplyProjectVO> resList = storageServiceImpl.projectList(year, supplyType, keyWord);
             return R.ok(resList);
         } catch (Exception e) {
             e.printStackTrace();
@@ -374,23 +147,31 @@ public class StorageController extends BaseController {
         }
     }
 
+    /**
+     * 获取计划收储详情
+     */
+    @GetMapping("/getPlanProject")
+    public R<Map<String, Object>> getPlanProject(@RequestParam String propertyId) {
+        try {
+            Map<String, Object> res = storageServiceImpl.getPlanProject(propertyId);
+            return R.ok(res);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.fail(e.getMessage());
+        }
+    }
 
-
-    //获取详情接口
+    /**
+     * 获取实际收储详情
+     */
     @GetMapping("/getActualProject")
-    public R<Map<String,Object>> getActualProject(@RequestParam String propertyId) {
+    public R<Map<String, Object>> getActualProject(@RequestParam String propertyId) {
         try {
-            //todo  参照 com.siwei.apply.controller.cadastre.SupplyController.getActualProject 方法,完成下面方法
-            // 根据 表vector.gj_shiji_shouchu 的gid字段,获取详情。
-            Map<String,Object> res =  storageServiceImpl.getActualProject(propertyId);
+            Map<String, Object> res = storageServiceImpl.getActualProject(propertyId);
             return R.ok(res);
         } catch (Exception e) {
             e.printStackTrace();
             return R.fail(e.getMessage());
         }
     }
-
-
-
-
 }

+ 22 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/mapper/GjShouchuJihuaMapper.java

@@ -0,0 +1,22 @@
+package com.siwei.apply.mapper;
+
+import com.siwei.apply.domain.res.TdgyStatisticsRes;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface GjShouchuJihuaMapper {
+
+    Map<String, Object> getPlanSummaryByYear(@Param("year") String year);
+
+    List<Map<String, Object>> getPlanStatsByLandUse(@Param("year") String year);
+
+    List<Map<String, Object>> getPlanStatsByMethod(@Param("year") String year);
+
+    List<TdgyStatisticsRes> getPlanListByYear(@Param("year") String year, @Param("keyWord") String keyWord);
+
+    Map<String, Object> getPlanProject(@Param("gid") String gid);
+}

+ 176 - 142
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/cadastre/impl/StorageServiceImpl.java

@@ -1,40 +1,28 @@
 package com.siwei.apply.service.cadastre.impl;
 
-import com.siwei.apply.domain.GongdiJihua;
 import com.siwei.apply.domain.cadastre.LandSupplyReportDTO;
 import com.siwei.apply.domain.res.*;
-
-import com.siwei.apply.domain.vo.GongdiJihuaFilterVo;
 import com.siwei.apply.domain.vo.LandSupplyProjectVO;
 import com.siwei.apply.mapper.GjShijiShouchuMapper;
-import com.siwei.apply.mapper.GongdiJihuaMapper;
-import com.siwei.apply.mapper.LandTypeMapper;
-import com.siwei.apply.mapper.TdgyMapper;
+import com.siwei.apply.mapper.GjShouchuJihuaMapper;
 import com.siwei.common.core.utils.StringUtils;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
-
 @Service
 public class StorageServiceImpl {
 
-    @Autowired
-    private GongdiJihuaMapper gongdiJihuaMapper;
-
     @Autowired
     private GjShijiShouchuMapper gjShijiShouchuMapper;
 
     @Autowired
-    private LandTypeMapper landTypeMapper;
-
-    @Autowired
-    private TdgyMapper dgyMapper;
+    private GjShouchuJihuaMapper gjShouchuJihuaMapper;
 
     //统计分析
     public List<TrendStatisticsData> getData1() {
@@ -52,9 +40,8 @@ public class StorageServiceImpl {
         return res;
     }
 
-
     public List<TrendUseStatisticsData> getData2(String year) {
-        if("0".equals(year)){
+        if ("0".equals(year)) {
             year = null;
         }
         List<Map<String, Object>> statsList = gjShijiShouchuMapper.getStatsByYearAndUse(year);
@@ -71,125 +58,65 @@ public class StorageServiceImpl {
         return res;
     }
 
+    public StorageYearStatisticsRes getYearStatistics(String year) {
+        StorageYearStatisticsRes res = new StorageYearStatisticsRes();
 
-    public List<LandSupplyProjectVO>  projectList(String year, Integer supplyType) {
-        List<LandSupplyProjectVO> resList = new ArrayList<>();
-        if(supplyType== 1){
-            GongdiJihuaFilterVo filterVo = new GongdiJihuaFilterVo();
-            filterVo.setYear(year);
-            filterVo.setPageSize(21);
-            List<GongdiJihua> planList = gongdiJihuaMapper.getList(filterVo);
-            AtomicInteger i= new AtomicInteger();
-            resList = planList.stream().map(item -> {
-                LandSupplyProjectVO vo = new LandSupplyProjectVO();
-                vo.setProjectPropertyId(String.valueOf(item.getGid()));
-                vo.setProjectName(item.getXmmc());
-                vo.setCompanyName("暂无");
-                if(i.incrementAndGet()/5 == 0){
-                    vo.setSupplyMethod("收购");
-                }else {
-                    vo.setSupplyMethod("征地");
-                }
-                vo.setSupplyType(supplyType.toString());
-                vo.setDateType(supplyType.toString());
-                vo.setGeom(item.getGeom());
-                String area = String.format("%.2f", item.getMjMu() == null ? BigDecimal.ZERO : item.getMjMu());
-                vo.setArea(area);
-                vo.setYear(item.getGysj());
-                return vo;
-            }).collect(Collectors.toList());
-        }else if(supplyType == 2){
-            //这里合并两部分数据
-            List<TdgyStatisticsRes> completeList = new ArrayList<>();
-            if(year!=null && !year.equals("2025")){
-                year = null;
-            }
-            List<TdgyStatisticsRes> sjgdList = gjShijiShouchuMapper.gjShijiShouchuListByYear(year, null, null, null);
-            if (CollectionUtils.isNotEmpty(sjgdList)) {
-                completeList.addAll(sjgdList);
-            }
-
-            AtomicInteger i= new AtomicInteger();
-            resList = completeList.stream().map(item -> {
-                LandSupplyProjectVO vo = new LandSupplyProjectVO();
-                vo.setProjectPropertyId(item.getProjectId());
-                vo.setProjectName(item.getXmmc());
-                vo.setCompanyName(item.getCompany());
-                vo.setSupplyType(supplyType.toString());
-                vo.setDateType(supplyType.toString());
-                if(StringUtils.isBlank(item.getProjectId())){
-                    vo.setDateType("3");
-                }
-                vo.setNodeId(item.getNodeId());
-                if(StringUtils.isBlank(item.getProjectId())){
-                    vo.setSupplyMethod("收购");
-                }else {
-                    vo.setSupplyMethod(item.getGyfs());
-                }
-                vo.setGeom(item.getGeom());
-                vo.setYear(item.getGysj());
-                vo.setArea(String.valueOf(item.getMjMu()));
-                return vo;
-            }).collect(Collectors.toList());
-        } else if(supplyType == 0){
-
-            GongdiJihuaFilterVo filterVo = new GongdiJihuaFilterVo();
-            filterVo.setYear(year);
-            filterVo.setPageSize(100000);
-
-            List<GongdiJihua> planList = gongdiJihuaMapper.getList(filterVo);
-            List<LandSupplyProjectVO> resList1 = planList.stream().map(item -> {
-                LandSupplyProjectVO vo = new LandSupplyProjectVO();
-                vo.setProjectPropertyId(String.valueOf(item.getGid()));
-                vo.setProjectName(item.getXmmc());
-                vo.setCompanyName("暂无");
-                vo.setSupplyMethod(item.getGyfs());
-                vo.setSupplyType("1");
-                vo.setDateType("1");
-                vo.setGeom(item.getGeom());
-                return vo;
-            }).collect(Collectors.toList());
-            //这里合并两部分数据
-            List<TdgyStatisticsRes> completeList = new ArrayList<>();
-            List<TdgyStatisticsRes> completeBusinessStatusList = dgyMapper.getListByYear(year, null, null, null);
-            List<TdgyStatisticsRes> completeSjgdList = dgyMapper.getSjgdListByYear(year, null, null, null);
-            if(CollectionUtils.isNotEmpty(completeBusinessStatusList)){
-                completeList.addAll(completeBusinessStatusList);
-            }
-            if(CollectionUtils.isNotEmpty(completeSjgdList)){
-                completeList.addAll(completeSjgdList);
-            }
-            List<LandSupplyProjectVO> resList2 = completeList.stream().map(item -> {
-                LandSupplyProjectVO vo = new LandSupplyProjectVO();
-                vo.setProjectPropertyId(item.getProjectId());
-                vo.setProjectName(item.getXmmc());
-                vo.setCompanyName(item.getCompany());
-                vo.setSupplyMethod(item.getGyfs());
-                vo.setSupplyType("2");
-                vo.setDateType("2");
-                if(StringUtils.isBlank(item.getProjectId())){
-                    vo.setDateType("3");
-                }
-                vo.setNodeId(item.getNodeId());
-                vo.setGeom(item.getGeom());
-                return vo;
-            }).collect(Collectors.toList());
-            if(CollectionUtils.isNotEmpty(resList1)) {
-                resList.addAll(resList1);
-            }
-            if(CollectionUtils.isNotEmpty(resList2)) {
-                resList.addAll(resList2);
-            }
-        }
-        return resList;
-    }
-
+        Map<String, Object> planSummary = gjShouchuJihuaMapper.getPlanSummaryByYear(year);
+        List<TdgyStatisticsRes> completeList = gjShijiShouchuMapper.gjShijiShouchuListByYear(year, null, null, null);
+        BigDecimal planArea = toBigDecimal(planSummary == null ? null : planSummary.get("plan_area"));
+        int planCount = toInteger(planSummary == null ? null : planSummary.get("plan_project_count"));
+        BigDecimal completeArea = sumArea(completeList);
+        int completeCount = CollectionUtils.isEmpty(completeList) ? 0 : completeList.size();
 
+        StorageRateRes storageRate = new StorageRateRes();
+        storageRate.setPlanProjectCount(planCount);
+        storageRate.setCompleteProjectCount(completeCount);
+        storageRate.setCompleteRate(planArea.compareTo(BigDecimal.ZERO) == 0 ? 0 :
+                completeArea.multiply(BigDecimal.valueOf(100)).divide(planArea, 0, RoundingMode.HALF_UP).intValue());
+        storageRate.setPlanArea(planArea.floatValue());
+        storageRate.setCompleteArea(completeArea.floatValue());
+        storageRate.setGdUnit("亩");
+        storageRate.setEstimatedCost(0f);
+        storageRate.setExpenditureCost(0f);
 
+        res.setStorageRate(storageRate);
+        res.setLandUseStatisticsList(buildLandUseStatistics(year));
+        res.setProjectSupplyList(buildMethodStatistics(year));
+        return res;
+    }
 
+    public List<LandSupplyProjectVO> projectList(String year, Integer supplyType) {
+        return projectList(year, supplyType, null);
+    }
 
+    public List<LandSupplyProjectVO> projectList(String year, Integer supplyType, String keyWord) {
+        List<LandSupplyProjectVO> resList = new ArrayList<>();
+        if (supplyType == 1) {
+            return buildPlanProjectList(year, keyWord);
+        } else if (supplyType == 2) {
+            return buildCompleteProjectList(year);
+        } else if (supplyType == 0) {
+            resList.addAll(buildPlanProjectList(year, keyWord));
+            resList.addAll(buildCompleteProjectList(year));
+        }
+        return resList;
+    }
 
+    public Map<String, Object> getPlanProject(String id) {
+        Map<String, Object> res = null;
+        if (StringUtils.isNumeric(id)) {
+            res = gjShouchuJihuaMapper.getPlanProject(id);
+        }
+        return res;
+    }
 
+    public Map<String, Object> getActualProject(String id) {
+        Map<String, Object> res = null;
+        if (StringUtils.isNumeric(id)) {
+            res = gjShijiShouchuMapper.getActualProject(id);
+        }
+        return res;
+    }
 
     public LandSupplyReportDTO.CompletedDTO buildCompletedDTO(Double area, Integer count, Integer transfer, Integer allocation, Integer other) {
         LandSupplyReportDTO.CompletedDTO completed = new LandSupplyReportDTO.CompletedDTO();
@@ -201,29 +128,132 @@ public class StorageServiceImpl {
         return completed;
     }
 
-    private String convertCategory(String category) {
-        if (category == null || category.equals("未知")) {
-            return "其他";
+    private List<LandSupplyProjectVO> buildPlanProjectList(String year, String keyWord) {
+        List<TdgyStatisticsRes> planList = gjShouchuJihuaMapper.getPlanListByYear(year, keyWord);
+        if (CollectionUtils.isEmpty(planList)) {
+            return new ArrayList<>();
         }
-        return category;
+        return planList.stream().map(item -> {
+            LandSupplyProjectVO vo = new LandSupplyProjectVO();
+            vo.setProjectPropertyId(item.getProjectId());
+            vo.setNodeId(item.getNodeId());
+            vo.setProjectName(item.getXmmc());
+            vo.setCompanyName("暂无");
+            vo.setSupplyMethod(item.getGyfs());
+            vo.setSupplyType("1");
+            vo.setDateType("1");
+            vo.setGeom(item.getGeom());
+            vo.setYear(item.getGysj());
+            vo.setArea(String.format("%.2f", item.getMjMu() == null ? BigDecimal.ZERO : item.getMjMu()));
+            return vo;
+        }).collect(Collectors.toList());
     }
 
-    public Map<String, Object> getActualProject(String id) {
-        Map<String, Object> res = null;
-        if (StringUtils.isNumeric(id)) {
-            res = gjShijiShouchuMapper.getActualProject(id);
+    private List<LandSupplyProjectVO> buildCompleteProjectList(String year) {
+        List<TdgyStatisticsRes> completeList = gjShijiShouchuMapper.gjShijiShouchuListByYear(year, null, null, null);
+        if (CollectionUtils.isEmpty(completeList)) {
+            return new ArrayList<>();
+        }
+        return completeList.stream().map(item -> {
+            LandSupplyProjectVO vo = new LandSupplyProjectVO();
+            vo.setProjectPropertyId(item.getProjectId());
+            vo.setProjectName(item.getXmmc());
+            vo.setCompanyName(item.getCompany());
+            vo.setSupplyType("2");
+            vo.setDateType(StringUtils.isBlank(item.getProjectId()) ? "3" : "2");
+            vo.setNodeId(item.getNodeId());
+            vo.setSupplyMethod(StringUtils.isBlank(item.getProjectId()) ? "收购" : item.getGyfs());
+            vo.setGeom(item.getGeom());
+            vo.setYear(item.getGysj());
+            vo.setArea(String.valueOf(item.getMjMu()));
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    private List<LandUseRes> buildLandUseStatistics(String year) {
+        Map<String, LandUseRes> result = new LinkedHashMap<>();
+        List<Map<String, Object>> planStats = gjShouchuJihuaMapper.getPlanStatsByLandUse(year);
+        if (CollectionUtils.isNotEmpty(planStats)) {
+            for (Map<String, Object> stat : planStats) {
+                String category = convertCategory(String.valueOf(stat.get("category")));
+                LandUseRes item = result.computeIfAbsent(category, this::newLandUseRes);
+                item.setPlanLandUseArea(toRoundedInt(stat.get("plan_area")));
+            }
+        }
+
+        List<Map<String, Object>> completeStats = gjShijiShouchuMapper.getStatsByYearAndUse(year);
+        if (CollectionUtils.isNotEmpty(completeStats)) {
+            for (Map<String, Object> stat : completeStats) {
+                String category = convertCategory(String.valueOf(stat.get("use_name")));
+                LandUseRes item = result.computeIfAbsent(category, this::newLandUseRes);
+                item.setCompleteLandUseArea(toRoundedInt(stat.get("in_data_area")));
+            }
+        }
+        return new ArrayList<>(result.values());
+    }
+
+    private List<ProjectSupplyRes> buildMethodStatistics(String year) {
+        List<Map<String, Object>> planStats = gjShouchuJihuaMapper.getPlanStatsByMethod(year);
+        List<ProjectSupplyRes> res = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(planStats)) {
+            for (Map<String, Object> stat : planStats) {
+                ProjectSupplyRes item = new ProjectSupplyRes();
+                item.setGdType(convertCategory(String.valueOf(stat.get("category"))));
+                item.setGdUnit("亩");
+                Float area = toBigDecimal(stat.get("plan_area")).floatValue();
+                item.setGdArea(area);
+                item.setPlanArea(area);
+                item.setCompleteArea(0f);
+                res.add(item);
+            }
         }
         return res;
     }
 
-    private Double toDouble(Object value) {
+    private LandUseRes newLandUseRes(String category) {
+        LandUseRes landUseRes = new LandUseRes();
+        landUseRes.setLandUseTypeName(category);
+        landUseRes.setPlanLandUseArea(0);
+        landUseRes.setCompleteLandUseArea(0);
+        return landUseRes;
+    }
+
+    private BigDecimal sumArea(List<TdgyStatisticsRes> list) {
+        BigDecimal sum = BigDecimal.ZERO;
+        if (CollectionUtils.isNotEmpty(list)) {
+            for (TdgyStatisticsRes item : list) {
+                sum = sum.add(item.getMjMu() == null ? BigDecimal.ZERO : item.getMjMu());
+            }
+        }
+        return sum.setScale(2, RoundingMode.HALF_UP);
+    }
+
+    private Integer toRoundedInt(Object value) {
+        return toBigDecimal(value).setScale(0, RoundingMode.HALF_UP).intValue();
+    }
+
+    private BigDecimal toBigDecimal(Object value) {
         if (value == null) {
-            return 0.0;
+            return BigDecimal.ZERO;
+        }
+        if (value instanceof BigDecimal) {
+            return (BigDecimal) value;
         }
         if (value instanceof Number) {
-            return ((Number) value).doubleValue();
+            return BigDecimal.valueOf(((Number) value).doubleValue());
+        }
+        try {
+            return new BigDecimal(String.valueOf(value));
+        } catch (Exception e) {
+            return BigDecimal.ZERO;
         }
-        return 0.0;
+    }
+
+    private String convertCategory(String category) {
+        if (category == null || category.equals("未知") || category.equals("null") || category.trim().isEmpty()) {
+            return "其他";
+        }
+        return category;
     }
 
     private Integer toInteger(Object value) {
@@ -233,6 +263,10 @@ public class StorageServiceImpl {
         if (value instanceof Number) {
             return ((Number) value).intValue();
         }
-        return 0;
+        try {
+            return Integer.parseInt(String.valueOf(value));
+        } catch (Exception e) {
+            return 0;
+        }
     }
 }

+ 119 - 0
siwei-modules/siwei-apply/src/main/resources/mapper/GjShouchuJihuaMapper.xml

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.siwei.apply.mapper.GjShouchuJihuaMapper">
+
+    <select id="getPlanSummaryByYear" resultType="map">
+        SELECT
+            COUNT(*) AS plan_project_count,
+            ROUND(COALESCE(SUM(mj_mu), 0), 2) AS plan_area
+        FROM vector.gj_shouchu_jihua
+        WHERE 1=1
+        <if test="year != null and year != '' and year != '0'">
+            AND scnd = #{year}
+        </if>
+    </select>
+
+    <select id="getPlanStatsByLandUse" resultType="map">
+        SELECT
+            COALESCE(tdyt, '其他') AS category,
+            ROUND(COALESCE(SUM(mj_mu), 0), 2) AS plan_area
+        FROM vector.gj_shouchu_jihua
+        WHERE 1=1
+        <if test="year != null and year != '' and year != '0'">
+            AND scnd = #{year}
+        </if>
+        GROUP BY COALESCE(tdyt, '其他')
+        ORDER BY plan_area DESC
+    </select>
+
+    <select id="getPlanStatsByMethod" resultType="map">
+        SELECT
+            COALESCE(scfs, '其他') AS category,
+            ROUND(COALESCE(SUM(mj_mu), 0), 2) AS plan_area
+        FROM vector.gj_shouchu_jihua
+        WHERE 1=1
+        <if test="year != null and year != '' and year != '0'">
+            AND scnd = #{year}
+        </if>
+        GROUP BY COALESCE(scfs, '其他')
+        ORDER BY plan_area DESC
+    </select>
+
+    <select id="getPlanListByYear" resultType="com.siwei.apply.domain.res.TdgyStatisticsRes">
+        SELECT
+            CAST(gid AS VARCHAR) AS projectId,
+            CAST(gid AS VARCHAR) AS nodeId,
+            '暂无' AS company,
+            mj_pfm AS mjPfm,
+            ROUND(COALESCE(mj_mu, 0), 2) AS mjMu,
+            COALESCE(xmmc, htmc, xssmc, dzjgh, CONCAT('收储计划-', gid)) AS xmmc,
+            tdyt,
+            scfs AS gyfs,
+            COALESCE(qdrq, TO_DATE(scnd || '-01-01', 'YYYY-MM-DD')) AS gysj,
+            bz,
+            ST_AsEWKT(geom) AS geom
+        FROM vector.gj_shouchu_jihua
+        WHERE 1=1
+        <if test="year != null and year != '' and year != '0'">
+            AND scnd = #{year}
+        </if>
+        <if test="keyWord != null and keyWord != ''">
+            AND (
+                COALESCE(xmmc, '') LIKE CONCAT('%', #{keyWord}, '%')
+                OR COALESCE(htmc, '') LIKE CONCAT('%', #{keyWord}, '%')
+                OR COALESCE(xssmc, '') LIKE CONCAT('%', #{keyWord}, '%')
+                OR COALESCE(dzjgh, '') LIKE CONCAT('%', #{keyWord}, '%')
+                OR COALESCE(tdyt, '') LIKE CONCAT('%', #{keyWord}, '%')
+                OR COALESCE(scfs, '') LIKE CONCAT('%', #{keyWord}, '%')
+            )
+        </if>
+        ORDER BY gid
+    </select>
+
+    <select id="getPlanProject" resultType="Map">
+        SELECT
+            gid,
+            scnd,
+            scfs,
+            COALESCE(xmmc, htmc, xssmc, dzjgh, CONCAT('收储计划-', gid)) AS xmmc,
+            tdyt,
+            mj_pfm,
+            mj_mu,
+            bz,
+            xzqdm,
+            xzqmc,
+            dzjgh,
+            sqsmc,
+            xssmc,
+            htbh,
+            htmc,
+            gdfs,
+            qdrq,
+            yddgrq,
+            ydjgrq,
+            sjkgsj,
+            sjjgsj,
+            lrxztdnf,
+            czfs,
+            dgzpzt,
+            sgxkzt,
+            nybz,
+            jk,
+            gdmj,
+            objectid,
+            fid,
+            shape_leng,
+            shape_area,
+            source_file,
+            source_layer,
+            source_id,
+            raw_props::text AS raw_props,
+            ST_AsEWKT(geom) AS geom
+        FROM vector.gj_shouchu_jihua
+        WHERE gid::varchar = #{gid}
+        LIMIT 1
+    </select>
+
+</mapper>