LandService.java 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package com.sysu.admin.controller.aland;
  2. import com.querydsl.core.types.Predicate;
  3. import com.querydsl.core.types.dsl.BooleanExpression;
  4. import com.sysu.admin.controller.city.CityRepository;
  5. import com.sysu.admin.controller.city.DistrictRepository;
  6. import com.sysu.admin.controller.city.DistrictService;
  7. import com.sysu.admin.controller.city.TownService;
  8. import com.sysu.admin.support.base.BaseService;
  9. import com.sysu.admin.utils.MySimpleDateFormat;
  10. import com.sysu.admin.utils.TextUtil;
  11. import com.xiesx.fastboot.core.jpa.JpaPlusRepository;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.data.domain.PageRequest;
  15. import org.springframework.data.domain.Pageable;
  16. import org.springframework.data.domain.Sort;
  17. import org.springframework.stereotype.Service;
  18. import java.util.*;
  19. @Service("LandService2")
  20. public class LandService extends BaseService<Land,Long> {
  21. @Autowired
  22. LandRepository landRepository;
  23. @Autowired
  24. TownService townService;
  25. @Autowired
  26. DistrictService districtService;
  27. @Autowired
  28. DistrictRepository districtRepository;
  29. @Autowired
  30. CityRepository cityRepository;
  31. public List<TownStat> getLandAreaStat(Date date, String districtCode, String city){
  32. Double percent = getPercent(date);
  33. List<Object[]> res = null;
  34. Map<Integer,String> namesMap = null;
  35. if(districtCode != null){
  36. namesMap = townService.getNames(districtCode);
  37. res = landRepository.statTownParcelTypeAll(districtCode);
  38. return getLandAreaStat(res,percent,namesMap);
  39. }
  40. if(city != null){
  41. namesMap = districtService.getNames(city);
  42. res = landRepository.statDistrictParcelTypeAll(city.substring(0,4) + "%");
  43. return getLandAreaStat(res,percent,namesMap);
  44. }
  45. throw new RuntimeException("district 和 city 至少需要一个");
  46. }
  47. public List<TownStat> getLandAreaStat(List<Object[]> res ,Double percent, Map<Integer,String> namesMap){
  48. List<TownStat> townStatList = new ArrayList<>(30);
  49. TownStat sumStat = new TownStat();
  50. sumStat.setTownName("汇总信息");
  51. townStatList.add(sumStat);
  52. Integer currentTownId = null;
  53. TownStat townStat = null;
  54. HashMap<String,LandAreaStat > sumMap = new HashMap<>();
  55. for(Object[] o : res){
  56. if(currentTownId == null || !o[0].toString().equals(currentTownId.toString())){
  57. townStat = new TownStat();
  58. townStat.setList(new ArrayList<>());
  59. currentTownId = Integer.valueOf(o[0].toString());
  60. townStat.setTownId(currentTownId);
  61. townStat.setTownName(namesMap.get(currentTownId));
  62. townStatList.add(townStat);
  63. }
  64. LandAreaStat bean = new LandAreaStat();
  65. bean.setParcelType(Integer.valueOf(o[1].toString()));
  66. bean.setColor(LandAreaStat.castColor(bean.getParcelType()));
  67. bean.setName(LandAreaStat.castName(bean.getParcelType()));
  68. Double area = (Double)o[2];
  69. bean.setArea((area + area / 2) / 1000);
  70. bean.setArea(bean.getArea() * percent);
  71. bean.setCount(Integer.valueOf(o[3].toString()));
  72. townStat.getList().add(bean);
  73. //汇总信息
  74. LandAreaStat sum = sumMap.get(bean.getParcelType());
  75. if(sum == null){
  76. sum = new LandAreaStat(bean.getParcelType(), bean.getName(), bean.getColor());
  77. sumMap.put(bean.getParcelType().toString(), sum);
  78. }
  79. sum.setArea(sum.getArea() + bean.getArea());
  80. sum.setCount(sum.getCount() + bean.getCount());
  81. }
  82. //组装汇总List
  83. LandAreaStat[] sumArrays = new LandAreaStat[sumMap.size()];
  84. for(String key : sumMap.keySet()){
  85. sumArrays[Integer.valueOf(key)] = sumMap.get(key);
  86. }
  87. sumStat.setList(Arrays.asList(sumArrays));
  88. return townStatList;
  89. }
  90. public Double getPercent(Date date){
  91. if(date == null){
  92. return 1.0;
  93. }
  94. String mm = TextUtil.leftSubstring("-",TextUtil.rightSubstring("-", MySimpleDateFormat.formatDate(date)));
  95. Double percent = Double.parseDouble("1." + Integer.parseInt(mm) % 5);
  96. return percent;
  97. }
  98. public List<TownStatCrop> getCropAreaStat(Date date, String districtCode, String city){
  99. Double percent = getPercent(date);
  100. List<Object[]> res = null;
  101. Map<Integer,String> namesMap = null;
  102. if(districtCode != null){
  103. namesMap = townService.getNames(districtCode);
  104. res = landRepository.statTownCropTypeAll(districtCode);
  105. return getCropAreaStat(res,percent,namesMap);
  106. }
  107. if(city != null){
  108. namesMap = districtService.getNames(city);
  109. res = landRepository.statDistrictCropTypeAll(city.substring(0,4) + "%");
  110. return getCropAreaStat(res,percent,namesMap);
  111. }
  112. throw new RuntimeException("district 和 city 至少需要一个");
  113. }
  114. public List<TownStatCrop> getCropAreaStat(List<Object[]> res ,Double percent, Map<Integer,String> namesMap){
  115. List<TownStatCrop> townStatList = new ArrayList<>(30);
  116. TownStatCrop sumStat = new TownStatCrop();
  117. sumStat.setTownName("汇总信息");
  118. townStatList.add(sumStat);
  119. Integer currentTownId = null;
  120. TownStatCrop townStat = null;
  121. HashMap<String,CropAreaStat > sumMap = new HashMap<>();
  122. for(Object[] o : res){
  123. if(currentTownId == null || !o[0].toString().equals(currentTownId.toString())){
  124. townStat = new TownStatCrop();
  125. townStat.setList(new ArrayList<>());
  126. currentTownId = Integer.valueOf(o[0].toString());
  127. townStat.setTownId(currentTownId);
  128. townStat.setTownName(namesMap.get(currentTownId));
  129. townStatList.add(townStat);
  130. }
  131. CropAreaStat bean = new CropAreaStat();
  132. bean.setCropType(o[1].toString());
  133. bean.setColor(CropAreaStat.castColor(bean.getCropType()));
  134. bean.setName(CropAreaStat.castName(bean.getCropType()));
  135. Double area = (Double)o[2];
  136. bean.setArea((area + area / 2) / 1000);
  137. bean.setArea(bean.getArea() * percent);
  138. bean.setCount(Integer.valueOf(o[3].toString()));
  139. townStat.getList().add(bean);
  140. //汇总信息
  141. CropAreaStat sum = sumMap.get(bean.getCropType());
  142. if(sum == null){
  143. sum = new CropAreaStat(bean.getCropType(), bean.getName(), bean.getColor());
  144. sumMap.put(bean.getCropType(), sum);
  145. }
  146. sum.setArea(sum.getArea() + bean.getArea());
  147. sum.setCount(sum.getCount() + bean.getCount());
  148. }
  149. //组装汇总List
  150. CropAreaStat[] sumArrays = new CropAreaStat[sumMap.size()];
  151. for(String key : sumMap.keySet()){
  152. sumArrays[CropAreaStat.getCropTypeIndex(key)] = sumMap.get(key);
  153. }
  154. sumStat.setList(Arrays.asList(sumArrays));
  155. return townStatList;
  156. }
  157. public List<Land> list(String district, Integer townId, Integer limit, String cropType){
  158. limit = limit == null ? 50 : limit;
  159. String wkt = null;
  160. if(townId != null) {
  161. wkt = townService.findWktById(townId);
  162. }else if(StringUtils.isNotBlank(district)) {
  163. wkt = districtRepository.findWktByCode(district);
  164. }
  165. if(wkt == null) {
  166. Predicate predicate = null;
  167. Pageable pageable = PageRequest.of(1, limit, Sort.by(Land.FIELDS.id));
  168. QLand qLand = QLand.land;
  169. if(StringUtils.isNotBlank(cropType)){
  170. return landRepository.findAll(qLand.crop_type.eq(cropType), pageable).toList();
  171. }else{
  172. return landRepository.findAll(pageable).toList();
  173. }
  174. }else{
  175. return StringUtils.isNotBlank(cropType) ?
  176. landRepository.findListByWktAndCropType(wkt, cropType, limit) :
  177. landRepository.findListByWkt(wkt, limit);
  178. }
  179. }
  180. public Land findByPoint(Double[] point){
  181. return landRepository.findByPoint("Point("+point[0]+" "+point[1]+")");
  182. }
  183. @Override
  184. public JpaPlusRepository<Land, Long> r() {
  185. return landRepository;
  186. }
  187. }