Administrator %!s(int64=2) %!d(string=hai) anos
pai
achega
05106c02b9

+ 1 - 1
src/main/java/com/sysu/admin/api/crop/ApiLandController.java

@@ -23,7 +23,7 @@ public class ApiLandController extends BaseComponent {
 
     @RequestMapping("/land_area_stat")
     public BaseResult getLandAreaStat(@RequestBody CommonVo commonVo){
-        return R.succ(landService.getLandAreaStat(commonVo.getDistrict(),commonVo.getTown(), commonVo.getDate()));
+        return R.succ(landService.getLandAreaStat(commonVo.getDate(),"440882"));
     }
 
     @RequestMapping("/crop_area_stat")

+ 13 - 3
src/main/java/com/sysu/admin/controller/aland/LandAreaStat.java

@@ -2,13 +2,23 @@ package com.sysu.admin.controller.aland;
 
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 public class LandAreaStat {
-    private Integer id;
+    private Integer parcelType;
     private String name;
-    private Double area;
+    private Double area = 0.0;
     private String color;
-    private Integer count;
+    private Integer count = 0;
+
+    public LandAreaStat(){}
+
+    public LandAreaStat(Integer parcelType, String name, String color) {
+        this.parcelType = parcelType;
+        this.name = name;
+        this.color = color;
+    }
 
     /**
      * 0其它 1水田  2水浇地  3旱地  4果园

+ 1 - 4
src/main/java/com/sysu/admin/controller/aland/LandRepository.java

@@ -13,12 +13,9 @@ public interface LandRepository extends JpaPlusRepository<Land, Long> {
     @Query(value = "select crop_type,sum(area),count(id) from  leizhou_land where St_within(geom,st_geomfromtext(?1,4326)) group by crop_type",nativeQuery = true)
     List<Object[]> statCropType(String wkt);
 
-    @Query(value = "select parcel_type,sum(area),count(id) from  leizhou_land  group by parcel_type",nativeQuery = true)
+    @Query(value = "select town_id,parcel_type,sum(area),count(id) from leizhou_land where town_id is not null group by town_id,parcel_type",nativeQuery = true)
     List<Object[]> statParcelTypeAll();
 
-    @Query(value = "select parcel_type,sum(area),count(id) from  leizhou_land where St_within(geom,st_geomfromtext(?1,4326)) group by parcel_type",nativeQuery = true)
-    List<Object[]> statParcelType(String wkt);
-
     @Query(value = "select * from  leizhou_land where St_within(geom,st_geomfromtext(?1,4326)) limit ?2",nativeQuery = true)
     List<Land> findListByWkt(String wkt,Integer limit);
 

+ 43 - 27
src/main/java/com/sysu/admin/controller/aland/LandService.java

@@ -4,6 +4,7 @@ import com.querydsl.core.types.Predicate;
 import com.sysu.admin.controller.city.CityRepository;
 import com.sysu.admin.controller.city.DistrictRepository;
 import com.sysu.admin.controller.city.TownRepository;
+import com.sysu.admin.controller.city.TownService;
 import com.sysu.admin.support.base.BaseService;
 import com.sysu.admin.utils.MySimpleDateFormat;
 import com.sysu.admin.utils.TextUtil;
@@ -15,47 +16,62 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+
 @Service("LandService2")
 public class LandService extends BaseService<Land,Long> {
     @Autowired
     LandRepository landRepository;
     @Autowired
-    TownRepository townRepository;
+    TownService townService;
     @Autowired
     DistrictRepository districtRepository;
     @Autowired
     CityRepository cityRepository;
 
 
-    public List<LandAreaStat> getLandAreaStat(String district, Integer townId, Date date){
+    public List<TownStat> getLandAreaStat(Date date, String districtCode){
         Double percent = getPercent(date);
+        List<Object[]> res = landRepository.statParcelTypeAll();
+        List<TownStat> townStatList = new ArrayList<>(30);
+        Integer currentTownId = null;
+        TownStat townStat = null;
+        Map<Integer,String> namesMap = townService.getNames(districtCode);
+        TownStat sumStat = new TownStat();
+        sumStat.setTownName("汇总信息");
+        sumStat.setSumMap(new HashMap<>());
+        townStatList.add(sumStat);
+
+        for(Object[] o : res){
+            if(currentTownId == null || !o[0].toString().equals(currentTownId.toString())){
+                townStat = new TownStat();
+                townStat.setList(new ArrayList<>());
+                currentTownId = Integer.valueOf(o[0].toString());
+                townStat.setTownId(currentTownId);
+                townStat.setTownName(namesMap.get(currentTownId));
+                townStatList.add(townStat);
+            }
 
-        List<LandAreaStat> list = new ArrayList<>();
-        List<Object[]> res = null;
-        if(townId != null) {
-            String wkt = townRepository.findWktById(townId);
-            res = landRepository.statParcelType(wkt);
-        }else if(StringUtils.isNotBlank(district)) {
-            String wkt = districtRepository.findWktByCode(district);
-            res = landRepository.statParcelType(wkt);
-        }else{
-            res = landRepository.statParcelTypeAll();
-        }
-        res.stream().forEach(o -> {
-            Double area = (Double)o[1];
             LandAreaStat bean = new LandAreaStat();
-            bean.setId(Integer.valueOf(o[0].toString()));
-            bean.setColor(LandAreaStat.castColor(bean.getId()));
-            bean.setName(LandAreaStat.castName(bean.getId()));
+            bean.setParcelType(Integer.valueOf(o[1].toString()));
+            bean.setColor(LandAreaStat.castColor(bean.getParcelType()));
+            bean.setName(LandAreaStat.castName(bean.getParcelType()));
+            Double area = (Double)o[2];
             bean.setArea((area + area / 2) / 1000);
             bean.setArea(bean.getArea() * percent);
-            bean.setCount(Integer.valueOf(o[2].toString()));
-            list.add(bean);
-        });
-        return list;
+            bean.setCount(Integer.valueOf(o[3].toString()));
+            townStat.getList().add(bean);
+            //汇总信息
+            LandAreaStat sum = sumStat.getSumMap().get(bean.getParcelType());
+            if(sum == null){
+                sum = new LandAreaStat(bean.getParcelType(), bean.getName(), bean.getColor());
+                sumStat.getSumMap().put(bean.getParcelType(), sum);
+            }
+            sum.setArea(sum.getArea() + bean.getArea());
+            sum.setCount(sum.getCount() + bean.getCount());
+        }
+
+        return townStatList;
     }
 
 
@@ -74,7 +90,7 @@ public class LandService extends BaseService<Land,Long> {
         List<CropAreaStat> list = new ArrayList<>();
         List<Object[]> res = null;
         if(townId != null) {
-            String wkt = townRepository.findWktById(townId);
+            String wkt = townService.findWktById(townId);
             res = landRepository.statCropType(wkt);
         }else if(StringUtils.isNotBlank(district)) {
             String wkt = districtRepository.findWktByCode(district);
@@ -99,7 +115,7 @@ public class LandService extends BaseService<Land,Long> {
         limit = limit == null ? 50 : limit;
         String wkt = null;
         if(townId != null) {
-             wkt = townRepository.findWktById(townId);
+             wkt = townService.findWktById(townId);
         }else if(StringUtils.isNotBlank(district)) {
              wkt = districtRepository.findWktByCode(district);
         }

+ 18 - 0
src/main/java/com/sysu/admin/controller/aland/TownStat.java

@@ -0,0 +1,18 @@
+package com.sysu.admin.controller.aland;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class TownStat {
+    @JSONField(ordinal = 0)
+    private Integer townId;
+    @JSONField(ordinal = 1)
+    private String townName;
+    @JSONField(ordinal = 2)
+    List<LandAreaStat> list;
+    Map<Integer, LandAreaStat> sumMap;
+}

+ 5 - 0
src/main/java/com/sysu/admin/controller/city/Town.java

@@ -23,6 +23,11 @@ import javax.persistence.*;
 @DynamicUpdate
 public class Town {
     public Town(){}
+    public Town(String name, Integer id, Double area){
+        this.name = name;
+        this.id = id;
+        this.area = area;
+    }
 
     public Town(String name, Integer id, Double area, Geometry geom) {
         this.name = name;

+ 4 - 0
src/main/java/com/sysu/admin/controller/city/TownRepository.java

@@ -11,7 +11,11 @@ public interface TownRepository extends JpaPlusRepository<Town, Integer> {
     @Query(value = "Select new Town(p.name,p.id,p.area,p.geom) from Town p where p.districtCode = ?1 ")
     List<Town> findList(String districtCode);
 
+    @Query(value = "Select new Town(p.name,p.id,p.area) from Town p where p.districtCode = ?1 ")
+    List<Town> findInfoList(String districtCode);
+
     @Query(value = "select st_astext(geom) from p_town where id = ?1" ,nativeQuery = true)
     String findWktById(Integer id);
 
+
 }

+ 34 - 0
src/main/java/com/sysu/admin/controller/city/TownService.java

@@ -0,0 +1,34 @@
+package com.sysu.admin.controller.city;
+
+import com.sysu.admin.support.base.BaseService;
+import com.xiesx.fastboot.core.jpa.JpaPlusRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class TownService extends BaseService<Town,Integer> {
+    @Autowired
+    TownRepository townRepository;
+
+    public Map<Integer, String> getNames(String districtCode){
+        List<Town> list = townRepository.findInfoList(districtCode);
+        Map<Integer, String> map = new HashMap<>();
+        list.stream().forEach(town -> {
+            map.put(town.getId(),town.getName());
+        });
+        return map;
+    }
+
+    public String findWktById(Integer id){
+        return townRepository.findWktById(id);
+    }
+
+    @Override
+    public JpaPlusRepository<Town, Integer> r() {
+        return townRepository;
+    }
+}