CropLandController.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package com.sysu.admin.controller.crop;
  2. import com.alibaba.fastjson.JSON;
  3. import com.querydsl.core.BooleanBuilder;
  4. import com.querydsl.core.types.Predicate;
  5. import com.querydsl.core.types.dsl.BooleanExpression;
  6. import com.querydsl.core.types.dsl.PathBuilder;
  7. import com.querydsl.jpa.impl.JPAUpdateClause;
  8. import com.sysu.admin.api.crop.CropVo;
  9. import com.sysu.admin.api.interceptor.LogAspect;
  10. import com.sysu.admin.controller.city.*;
  11. import com.sysu.admin.controller.crop.CropLand;
  12. import com.sysu.admin.controller.crop.CropLandService;
  13. import com.sysu.admin.controller.crop.CropLandVo;
  14. import com.sysu.admin.controller.crop.range.LandRangeIndexService;
  15. import com.sysu.admin.controller.geo.land.LandTaskStatus;
  16. import com.sysu.admin.support.base.BaseVo;
  17. import com.sysu.admin.support.base.ServiceContext;
  18. import com.sysu.admin.support.shiro.ShiroService;
  19. import com.sysu.admin.utils.GenericsUtil;
  20. import com.sysu.admin.utils.shape.GeoCastUtil;
  21. import com.xiesx.fastboot.base.result.BaseResult;
  22. import com.xiesx.fastboot.base.result.R;
  23. import com.xiesx.fastboot.utils.CopyUtils;
  24. import org.locationtech.jts.geom.MultiPolygon;
  25. import org.springframework.beans.BeanUtils;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.data.domain.Sort;
  28. import org.springframework.stereotype.Controller;
  29. import org.springframework.web.bind.annotation.RequestMapping;
  30. import org.springframework.web.bind.annotation.ResponseBody;
  31. import org.springframework.web.bind.annotation.RestController;
  32. import javax.transaction.Transactional;
  33. import java.util.*;
  34. import java.util.concurrent.Executor;
  35. import java.util.concurrent.Executors;
  36. /**
  37. * 读取地图数据信息
  38. */
  39. @RequestMapping("/crop")
  40. @Controller
  41. public class CropLandController extends ServiceContext {
  42. @Autowired
  43. CropLandService cityLandService;
  44. @Autowired
  45. ShiroService shiroService;
  46. @Autowired
  47. LandRangeIndexService mLandRangeIndexService;
  48. @Autowired
  49. DistrictRepository districtRepository;
  50. @Autowired
  51. CityRepository cityRepository;
  52. @RequestMapping("/getInfo")
  53. @ResponseBody
  54. public BaseResult getInfo(Double x, Double y){
  55. CropLand cityLand = cityLandService.findByPoint(new Double[]{x,y});
  56. if(cityLand == null){
  57. return R.fail();
  58. }
  59. cityLand.setWkt(GeoCastUtil.geomToWkt(cityLand.getGeom()));
  60. return R.succ(cityLand);
  61. }
  62. @RequestMapping("/getGeoJson")
  63. @ResponseBody
  64. public BaseResult getGeojson(String tableNames, Double x1, Double y1,Double x2, Double y2){
  65. // String[] tableNames = mLandRangeIndexService.getTableNames(x1,y1,x2,y2);
  66. List<CropPoint> cropLandList = cityLandService.findCropLandNoGeomByTableNamesAndBBox(tableNames, x1,y1,x2,y2);
  67. return R.succ(cropLandList);
  68. }
  69. @RequestMapping("/getBuffer")
  70. @ResponseBody
  71. public BaseResult getBuffer(Double x, Double y, Integer m){
  72. return R.succ(cityLandService.getBuffer(new Double[]{x, y}, m));
  73. }
  74. @RequestMapping("/save")
  75. @ResponseBody
  76. public BaseResult save(CropLandVo vo){
  77. CropLand bean = cityLandService.findOne(vo.getId());
  78. if(bean.getStatus().intValue() == LandTaskStatus.unpublished.ordinal()){
  79. bean.setCreator(shiroService.getPrincipalId());
  80. bean.setCreateDate(new Date());
  81. }
  82. BeanUtils.copyProperties(vo, bean, CopyUtils.nullNames(vo));
  83. bean.setWkt(GeoCastUtil.geomToWkt(bean.getGeom()));
  84. bean.setCenterPoint(cityLandService.getCenterPoint(bean.getId()));
  85. bean.getCenterPoint().setSRID(4326);
  86. District district = districtRepository.findByPoint(bean.getCenterPoint());
  87. if(district != null){
  88. cityLandService.setCity(bean, district);
  89. }
  90. cityLandService.save(bean);
  91. return R.succ(bean);
  92. }
  93. @RequestMapping("/publish")
  94. @ResponseBody
  95. public BaseResult publish(CropLandVo vo){
  96. CropLand bean = cityLandService.findOne(vo.getId());
  97. if(bean.getStatus().intValue() != LandTaskStatus.unpublished.ordinal()){
  98. return R.fail("不是未发布的地块!");
  99. }
  100. if(bean.getDistrict() == null || bean.getCenterPoint() == null){
  101. bean.setCenterPoint(cityLandService.getCenterPoint(bean.getGeom()));
  102. bean.getCenterPoint().setSRID(4326);
  103. District district = districtRepository.findByPoint(bean.getCenterPoint());
  104. if(district != null){
  105. cityLandService.setCity(bean, district);
  106. }
  107. }
  108. bean.setStatus(LandTaskStatus.published.ordinal());
  109. cityLandService.save(bean);
  110. return R.succ();
  111. }
  112. @RequestMapping("/publish_index")
  113. public String publishIndex(){
  114. return "page/publish_task";
  115. }
  116. @RequestMapping("/batchPublish")
  117. @ResponseBody
  118. @Transactional
  119. public BaseResult batchPublish(CropLandVo vo){
  120. QCropLand qCropLand = QCropLand.cropLand;
  121. JPAUpdateClause jpaUpdateClause = mJPAQueryFactory.update(qCropLand);
  122. jpaUpdateClause.set(qCropLand.status, LandTaskStatus.published.ordinal());
  123. jpaUpdateClause.set(qCropLand.updateDate, new Date());
  124. Predicate predicate = null;
  125. if(vo.getProvinceId() != null){
  126. predicate = qCropLand.province.eq(vo.getProvinceId());
  127. }
  128. if(vo.getCityId() != null){
  129. predicate = qCropLand.city.eq(vo.getCityId()).and(predicate);
  130. }
  131. if(vo.getDistrictId() != null){
  132. predicate = qCropLand.district.eq(vo.getDistrictId()).and(predicate);
  133. }
  134. if(predicate != null){
  135. predicate = qCropLand.status.eq(LandTaskStatus.unpublished.ordinal()).and(predicate);
  136. jpaUpdateClause.where(predicate);
  137. jpaUpdateClause.execute();
  138. }
  139. return R.succ();
  140. }
  141. @RequestMapping("/addTest")
  142. @ResponseBody
  143. public BaseResult addTest(String wkt){
  144. CropLand bean = new CropLand().setGeom((MultiPolygon)GeoCastUtil.wktToGeom(wkt))
  145. .setGridcode(2L).setStatus(LandTaskStatus.unpublished.ordinal());
  146. bean.setCenterPoint(cityLandService.getCenterPoint(bean.getGeom()));
  147. bean.getCenterPoint().setSRID(4326);
  148. District district = districtRepository.findByPoint(bean.getCenterPoint());
  149. if(district != null) {
  150. cityLandService.setCity(bean, district);
  151. }
  152. cityLandService.save(bean);
  153. return R.succ();
  154. }
  155. Executor executor = Executors.newFixedThreadPool(10);
  156. int size = 0;
  157. @RequestMapping("/saveTestAll")
  158. @ResponseBody
  159. public BaseResult saveTestAll(){
  160. QCropLand qCropLand = QCropLand.cropLand;
  161. List<CropLand> landList = cityLandService.findAll(qCropLand.district.isNull());
  162. List<District> districtList = districtRepository.findAll(Sort.by(District.FIELDS.code));
  163. List<City> cityList = cityRepository.findAll(Sort.by(City.FIELDS.code));
  164. int i=0;
  165. for(City city : cityList){
  166. List<District> districts = new ArrayList<>();
  167. while(i < districtList.size()){
  168. if(city.getCode() / 100 == districtList.get(i).getCode() / 100){
  169. districts.add(districtList.get(i));
  170. i++;
  171. }else{
  172. break;
  173. }
  174. }
  175. city.setDistrictList(districts);
  176. }
  177. size = landList.size();
  178. System.out.println("landList load finnish");
  179. GenericsUtil<CropLand> genericsUtil = new GenericsUtil<>(CropLand.class);
  180. List<List<CropLand>> list = genericsUtil.subListBySegment(landList, 10);
  181. for(List<CropLand> cropLandList : list){
  182. executor.execute(() -> {
  183. for(CropLand bean : cropLandList){
  184. District district = withinDistrict(cityList, bean);
  185. if(district != null){
  186. cityLandService.setCity(bean, district);
  187. cityLandService.save(bean);
  188. synchronized (this) {
  189. System.out.println("剩余:" + (--size));
  190. }
  191. }
  192. }
  193. });
  194. }
  195. return R.succ();
  196. }
  197. private District withinDistrict(List<City> cityList, CropLand bean){
  198. for(City city : cityList){
  199. if(bean.getCenterPoint() == null){
  200. bean.setCenterPoint(cityLandService.getCenterPoint(bean.getGeom()));
  201. }
  202. if(bean.getCenterPoint().within(city.getGeom())){
  203. for(District district : city.getDistrictList()){
  204. if(bean.getCenterPoint().within(district.getGeom())){
  205. return district;
  206. }
  207. }
  208. }
  209. }
  210. return null;
  211. }
  212. }