| 
					
				 | 
			
			
				@@ -1,15 +1,21 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.sysu.admin.controller.crop; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.alibaba.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.querydsl.core.BooleanBuilder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.querydsl.core.types.Predicate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.querydsl.core.types.dsl.BooleanExpression; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.querydsl.core.types.dsl.PathBuilder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.querydsl.jpa.impl.JPAUpdateClause; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.sysu.admin.api.crop.CropVo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.sysu.admin.controller.city.District; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.sysu.admin.controller.city.DistrictRepository; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.sysu.admin.controller.city.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.sysu.admin.controller.crop.CropLand; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.sysu.admin.controller.crop.CropLandService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.sysu.admin.controller.crop.CropLandVo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.sysu.admin.controller.geo.land.LandTaskStatus; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.sysu.admin.support.base.BaseVo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.sysu.admin.support.base.ServiceContext; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.sysu.admin.support.shiro.ShiroService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.sysu.admin.utils.GenericsUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.sysu.admin.utils.shape.GeoCastUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.xiesx.fastboot.base.result.BaseResult; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.xiesx.fastboot.base.result.R; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -17,21 +23,25 @@ import com.xiesx.fastboot.utils.CopyUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.locationtech.jts.geom.MultiPolygon; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.BeanUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.data.domain.Sort; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Controller; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.web.bind.annotation.RequestMapping; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.web.bind.annotation.ResponseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.web.bind.annotation.RestController; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import javax.transaction.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.ArrayList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Date; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.Executor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.Executors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 读取地图数据信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @RequestMapping("/crop") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Controller 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-public class CropLandController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class CropLandController extends ServiceContext { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     CropLandService cityLandService; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -39,6 +49,8 @@ public class CropLandController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ShiroService shiroService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     DistrictRepository districtRepository; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    CityRepository cityRepository; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @RequestMapping("/getInfo") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @ResponseBody 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -72,6 +84,18 @@ public class CropLandController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return R.succ(bean); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @RequestMapping("/publish") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @ResponseBody 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public BaseResult publish(CropLandVo vo){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        CropLand bean = cityLandService.findOne(vo.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(bean.getStatus().intValue() != LandTaskStatus.unpublished.ordinal()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return R.fail("不是未发布的地块!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        bean.setStatus(LandTaskStatus.published.ordinal()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        cityLandService.save(bean); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return R.succ(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @RequestMapping("/publish_index") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -81,8 +105,27 @@ public class CropLandController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @RequestMapping("/batchPublish") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @ResponseBody 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Transactional 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public BaseResult batchPublish(CropLandVo vo){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        QCropLand qCropLand = QCropLand.cropLand; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JPAUpdateClause jpaUpdateClause = mJPAQueryFactory.update(qCropLand); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        jpaUpdateClause.set(qCropLand.status, LandTaskStatus.published.ordinal()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        jpaUpdateClause.set(qCropLand.updateDate, new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Predicate predicate = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(vo.getProvinceId() != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            predicate = qCropLand.province.eq(vo.getProvinceId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(vo.getCityId() != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            predicate = qCropLand.city.eq(vo.getCityId()).and(predicate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(vo.getDistrictId() != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            predicate = qCropLand.district.eq(vo.getDistrictId()).and(predicate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(predicate != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            predicate = qCropLand.status.eq(LandTaskStatus.unpublished.ordinal()).and(predicate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            jpaUpdateClause.where(predicate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            jpaUpdateClause.execute(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return R.succ(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -101,17 +144,67 @@ public class CropLandController { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return R.succ(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @Transactional 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public BaseResult saveTest(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        new Thread(new Runnable() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            public void run() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                cityLandService.saveCityAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Executor executor = Executors.newFixedThreadPool(10); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    int size = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @RequestMapping("/saveTestAll") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @ResponseBody 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public BaseResult saveTestAll(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        QCropLand qCropLand = QCropLand.cropLand; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<CropLand> landList = cityLandService.findAll(qCropLand.district.isNull()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<District> districtList = districtRepository.findAll(Sort.by(District.FIELDS.code)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<City> cityList = cityRepository.findAll(Sort.by(City.FIELDS.code)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        int i=0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(City city : cityList){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<District> districts = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            while(i < districtList.size()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(city.getCode() / 100 == districtList.get(i).getCode() / 100){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    districts.add(districtList.get(i)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    i++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            city.setDistrictList(districts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        size = landList.size(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        System.out.println("landList load finnish"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        GenericsUtil<CropLand> genericsUtil = new GenericsUtil<>(CropLand.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<List<CropLand>> list = genericsUtil.subListBySegment(landList, 10); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(List<CropLand> cropLandList : list){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            executor.execute(() -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for(CropLand bean : cropLandList){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    District district = withinDistrict(cityList, bean); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(district != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        cityLandService.setCity(bean, district); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        cityLandService.save(bean); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        synchronized (this) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            System.out.println("剩余:" + (--size)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return R.succ(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private District withinDistrict(List<City> cityList, CropLand bean){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(City city : cityList){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(bean.getCenterPoint() == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                bean.setCenterPoint(cityLandService.getCenterPoint(bean.getGeom())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(bean.getCenterPoint().within(city.getGeom())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for(District district : city.getDistrictList()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(bean.getCenterPoint().within(district.getGeom())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return district; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |