DistrictService.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package com.izouma.awesomeAdmin.service;
  2. import com.alibaba.fastjson.JSON;
  3. import com.github.kevinsawicki.http.HttpRequest;
  4. import com.izouma.awesomeAdmin.domain.District;
  5. import com.izouma.awesomeAdmin.enums.DistrictLevel;
  6. import com.izouma.awesomeAdmin.repo.DistrictRepo;
  7. import com.izouma.awesomeAdmin.utils.amap.DistrictsItem;
  8. import com.izouma.awesomeAdmin.utils.amap.QueryDistrictResponse;
  9. import lombok.AllArgsConstructor;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.springframework.data.jpa.domain.Specification;
  12. import org.springframework.stereotype.Service;
  13. import javax.persistence.criteria.Predicate;
  14. import java.util.ArrayList;
  15. import java.util.Arrays;
  16. import java.util.List;
  17. import java.util.stream.Collectors;
  18. @Service
  19. @AllArgsConstructor
  20. public class DistrictService {
  21. private final DistrictRepo districtRepo;
  22. public List<District> get(DistrictLevel level, DistrictLevel maxLevel, Long parent) {
  23. return districtRepo.findAll((Specification<District>) (root, criteriaQuery, criteriaBuilder) -> {
  24. List<Predicate> predicates = new ArrayList<>();
  25. if (level != null) {
  26. predicates.add(criteriaBuilder.equal(root.get("level"), level));
  27. }
  28. if (parent != null) {
  29. predicates.add(criteriaBuilder.equal(root.get("parent"), parent));
  30. }
  31. if (maxLevel != null) {
  32. List<DistrictLevel> list = Arrays.stream(DistrictLevel.values())
  33. .filter(l -> l.getValue() <= maxLevel.getValue())
  34. .collect(Collectors.toList());
  35. if (list.isEmpty()) {
  36. predicates.add(criteriaBuilder.equal(root.get("level"), DistrictLevel.NONE));
  37. } else {
  38. predicates.add(root.get("level").in(list));
  39. }
  40. }
  41. return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
  42. }).stream().peek(district -> {
  43. if (maxLevel != null) {
  44. int childCount = 0;
  45. switch (maxLevel) {
  46. case PROVINCE:
  47. break;
  48. case CITY:
  49. childCount = district.getCityCount();
  50. break;
  51. case DISTRICT:
  52. childCount = district.getCityCount() + district.getDistrictCount();
  53. break;
  54. case STREET:
  55. childCount = district.getCityCount() + district.getDistrictCount() + district.getStreetCount();
  56. break;
  57. }
  58. district.setLeaf(childCount == 0);
  59. } else {
  60. district.setLeaf(district.getChildCount() == 0);
  61. }
  62. }).collect(Collectors.toList());
  63. }
  64. public void sync() {
  65. QueryDistrictResponse response = JSON.parseObject(HttpRequest.get("https://restapi.amap.com/v3/config/district?key=3d59fb422c5c13af59bf82a8b6f3ad54&subdistrict=4")
  66. .body(), QueryDistrictResponse.class);
  67. response.getDistricts().get(0).getDistricts().stream().parallel().forEach(item -> saveDistrict(item, null));
  68. }
  69. private void saveDistrict(DistrictsItem item, Long parentId) {
  70. District district = District.builder()
  71. .id(Long.parseLong(item.getAdcode()))
  72. .name(item.getName())
  73. .parent(parentId)
  74. .level(DistrictLevel.valueOf(item.getLevel().toUpperCase()))
  75. .build();
  76. if (district.getLevel() == DistrictLevel.STREET) {
  77. district.setId(Long.parseLong(district.getId() + String.format("%02d", item.getIdx())));
  78. }
  79. if (StringUtils.isNotBlank(item.getCenter())) {
  80. String[] arr = item.getCenter().split(",");
  81. district.setLng(Double.parseDouble(arr[0]));
  82. district.setLat(Double.parseDouble(arr[1]));
  83. }
  84. if (item.getCitycode() != null && item.getCitycode() instanceof String) {
  85. district.setCityCode((String) item.getCitycode());
  86. }
  87. if (item.getDistricts() != null) {
  88. district.setChildCount(item.getDistricts().size());
  89. district.setCityCount((int) item.getDistricts()
  90. .stream()
  91. .filter(d -> DistrictLevel.valueOf(d.getLevel().toUpperCase()) == DistrictLevel.CITY)
  92. .count());
  93. district.setDistrictCount((int) item.getDistricts()
  94. .stream()
  95. .filter(d -> DistrictLevel.valueOf(d.getLevel().toUpperCase()) == DistrictLevel.DISTRICT)
  96. .count());
  97. district.setStreetCount((int) item.getDistricts()
  98. .stream()
  99. .filter(d -> DistrictLevel.valueOf(d.getLevel().toUpperCase()) == DistrictLevel.STREET)
  100. .count());
  101. } else {
  102. district.setChildCount(0);
  103. }
  104. districtRepo.save(district);
  105. if (item.getDistricts() != null) {
  106. int[] idx = {1};
  107. item.getDistricts().stream().parallel().forEach(child -> {
  108. child.setIdx(idx[0]++);
  109. saveDistrict(child, district.getId());
  110. });
  111. }
  112. }
  113. }