DataCallBackService.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package com.skyversation.poiaddr.service;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.skyversation.poiaddr.addquery.AddressQueryEngine;
  5. import com.skyversation.poiaddr.addquery.AddressTools;
  6. import com.skyversation.poiaddr.addquery.Constant;
  7. import com.skyversation.poiaddr.addquery.TransfromDataTool;
  8. import com.skyversation.poiaddr.bean.AddressResult;
  9. import com.skyversation.poiaddr.bean.GeoJsonBean;
  10. import com.skyversation.poiaddr.util.address_spliter.SplitAddress;
  11. import com.skyversation.poiaddr.util.CoordTransform2;
  12. import com.skyversation.poiaddr.util.address_spliter.ShanghaiAddressSplitUtil;
  13. import com.skyversation.poiaddr.bean.TAddressCallback;
  14. import com.skyversation.poiaddr.bean.YyszAddressQp;
  15. import com.skyversation.poiaddr.repository.TAddressCallbackRep;
  16. import com.skyversation.poiaddr.repository.YyszAddressQpRep;
  17. import com.skyversation.poiaddr.util.net.AddressNetTools;
  18. import com.skyversation.poiaddr.util.status.AddressLevel;
  19. import com.skyversation.poiaddr.util.status.AddressResultEnum;
  20. import lombok.Getter;
  21. import org.springframework.data.domain.Page;
  22. import org.springframework.data.domain.PageRequest;
  23. import org.springframework.http.ResponseEntity;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.transaction.PlatformTransactionManager;
  26. import org.springframework.transaction.TransactionStatus;
  27. import org.springframework.transaction.support.TransactionCallbackWithoutResult;
  28. import org.springframework.transaction.support.TransactionTemplate;
  29. import org.springframework.util.StringUtils;
  30. import javax.annotation.Resource;
  31. import java.time.Instant;
  32. import java.util.*;
  33. import java.util.concurrent.ExecutorService;
  34. import java.util.concurrent.Executors;
  35. import java.util.regex.Matcher;
  36. import java.util.regex.Pattern;
  37. @Service
  38. public class DataCallBackService {
  39. private DataCallBackService(){};
  40. @Getter
  41. private static final DataCallBackService instance = new DataCallBackService();
  42. private final ExecutorService successES = Executors.newSingleThreadExecutor();
  43. private final ExecutorService failES = Executors.newSingleThreadExecutor();
  44. @Resource
  45. private TAddressCallbackRep tAddressCallbackRep;
  46. @Resource
  47. private YyszAddressQpRep yyszAddressQpRep;
  48. @Resource
  49. private ShanghaiAddressSplitUtil shanghaiAddressSplitUtil;
  50. @Resource
  51. private AddressQueryEngine addressQueryEngine;
  52. @Resource
  53. private PlatformTransactionManager transactionManager;
  54. private static final Map<String, String> CHINESE_TO_ARABIC = new HashMap<>();
  55. static {
  56. CHINESE_TO_ARABIC.put("第一", "01");
  57. CHINESE_TO_ARABIC.put("第二", "02");
  58. CHINESE_TO_ARABIC.put("第三", "03");
  59. CHINESE_TO_ARABIC.put("第四", "04");
  60. CHINESE_TO_ARABIC.put("第五", "05");
  61. CHINESE_TO_ARABIC.put("第六", "06");
  62. CHINESE_TO_ARABIC.put("第七", "07");
  63. CHINESE_TO_ARABIC.put("第八", "08");
  64. CHINESE_TO_ARABIC.put("第九", "09");
  65. }
  66. /**
  67. * 成功数据入库
  68. */
  69. public void successDataCallBack(AddressResult addressResult){
  70. for (AddressResult.ContentBean bean :addressResult.getData()){
  71. successES.execute(() -> {
  72. TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
  73. transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  74. @Override
  75. protected void doInTransactionWithoutResult(TransactionStatus status) {
  76. try {
  77. System.out.println("回流有结果数据:" + bean.getSearchAddress());
  78. YyszAddressQp yyszAddressQp = new YyszAddressQp();
  79. yyszAddressQp.setSourceaddress(bean.getSearchAddress());
  80. yyszAddressQp.setId(yyszAddressQpRep.findMaxId().orElse(0) + 1);
  81. yyszAddressQp.setLon(bean.getLon());
  82. yyszAddressQp.setLat(bean.getLat());
  83. SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(bean.getSearchAddress());
  84. yyszAddressQp.setAddress(splitAddress.getAddr());
  85. yyszAddressQp.setCity(splitAddress.getCity());
  86. yyszAddressQp.setCounty(splitAddress.getDistrict());
  87. yyszAddressQp.setTown(splitAddress.getStreet());
  88. yyszAddressQp.setCommunity(splitAddress.getCommunity());
  89. yyszAddressQp.setCityCode(splitAddress.getCityCode());
  90. yyszAddressQp.setCountyCode(splitAddress.getDistrictCode());
  91. yyszAddressQp.setTownCode(splitAddress.getStreetCode());
  92. yyszAddressQp.setCommunityCode(splitAddress.getCommunityCode());
  93. yyszAddressQp.setIsHistory(0);
  94. yyszAddressQp.setSignatureCheckState(0);
  95. yyszAddressQp.setSecurityGrade(0);
  96. yyszAddressQp.setModelType(0);
  97. yyszAddressQp.setIsDelete(0);
  98. yyszAddressQp.setLv(0);
  99. yyszAddressQp.setIsMulti(0);
  100. yyszAddressQp.setRoomOfFloor(0);
  101. yyszAddressQp.setSource("标准地址");
  102. yyszAddressQp.setUpdatetime(Instant.now());
  103. yyszAddressQp.setCreatetime(Instant.now());
  104. String regex = "([^0-9]*[路道街])(\\d+[弄号])?(.*)";
  105. Pattern pattern = Pattern.compile(regex);
  106. Matcher matcher = pattern.matcher(splitAddress.getAddr());
  107. if (matcher.matches()) {
  108. String road = matcher.group(1);
  109. String alley = matcher.group(2);
  110. String additionalInfo = matcher.group(3);
  111. yyszAddressQp.setStreet(road);
  112. yyszAddressQp.setDoor(alley);
  113. }
  114. if (yyszAddressQp.getLon()!=null&&yyszAddressQp.getLat()!=null){
  115. double[] result = CoordTransform2.getInstance().wgs84_to_shcj(yyszAddressQp.getLon(),yyszAddressQp.getLat());
  116. yyszAddressQp.setX(String.valueOf(result[0]));
  117. yyszAddressQp.setY(String.valueOf(result[1]));
  118. GeoJsonBean geoJsonBean = AreaService.getInstance().isInGridPolygon(yyszAddressQp.getLon(),yyszAddressQp.getLat());
  119. if (geoJsonBean!=null){
  120. yyszAddressQp.setCounty(geoJsonBean.getProperties().getString("所属区县"));
  121. yyszAddressQp.setTown(geoJsonBean.getProperties().getString("所属街道"));
  122. yyszAddressQp.setGridName(geoJsonBean.getProperties().getString("网格名称"));
  123. if (yyszAddressQp.getGridName()!=null&&yyszAddressQp.getTownCode()!=null&&!yyszAddressQp.getTownCode().isEmpty()){
  124. for (String key:CHINESE_TO_ARABIC.keySet()){
  125. if (yyszAddressQp.getGridName().startsWith(key)){
  126. yyszAddressQp.setGridCode(yyszAddressQp.getTownCode()+CHINESE_TO_ARABIC.get(key));
  127. break;
  128. }
  129. }
  130. }
  131. }
  132. }
  133. yyszAddressQpRep.save(yyszAddressQp);
  134. if (yyszAddressQp.getLon()!=null&&yyszAddressQp.getLat()!=null){
  135. yyszAddressQpRep.updateLocation(yyszAddressQp.getId(), String.format("POINT(%f %f)", yyszAddressQp.getLon(), yyszAddressQp.getLat()));
  136. }
  137. } catch (Exception e) {
  138. status.setRollbackOnly();
  139. e.printStackTrace();
  140. }
  141. }
  142. });
  143. });
  144. }
  145. }
  146. /**
  147. * 失败数据入库
  148. */
  149. public void failDataCallBack(List<String> addr){
  150. for (String addrStr:addr){
  151. failES.execute(()->{
  152. System.out.println("尝试回流无结果数据:"+addrStr);
  153. SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addrStr);
  154. if (splitAddress.getStatus()==3||splitAddress.getStatus()==-1){
  155. System.out.println("拒绝回流,检测到非地址");
  156. return;
  157. }
  158. int id = tAddressCallbackRep.findMaxId().orElse(0)+1;
  159. TAddressCallback tAddressCallback = new TAddressCallback(id, Instant.now(),addrStr, splitAddress.getAddr(),
  160. splitAddress.getProvince(),splitAddress.getCity(),splitAddress.getStreet(), splitAddress.getCommunity(),
  161. (short) 0, (short) 0);
  162. tAddressCallbackRep.save(tAddressCallback);
  163. System.out.println("回流成功,等待进一检查处理");
  164. });
  165. }
  166. }
  167. /**
  168. * 用于将失败数据调高德接口回流
  169. */
  170. public void dbFailDataCallBackTask(){
  171. int pageNum = 0;
  172. int pageSize = 1000;
  173. Page<String> page;
  174. TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
  175. do {
  176. page = tAddressCallbackRep.findAllInNative(PageRequest.of(pageNum,pageSize ));
  177. pageNum++;
  178. for (String tAddressCallback : page.getContent()) {
  179. transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  180. @Override
  181. protected void doInTransactionWithoutResult(TransactionStatus status) {
  182. try {
  183. System.out.println("尝试从高德接口获取地址:" + tAddressCallback);
  184. AddressResult addressResult = addressQueryEngine.gdV3MultiSearch(Collections.singletonList(tAddressCallback),AddressLevel.LEVEL_1);
  185. if (addressResult ==null) {
  186. System.out.println("无结果:" + tAddressCallback);
  187. tAddressCallbackRep.updateAllProcessStatus(tAddressCallback,1);
  188. }else {
  189. System.out.println("有结果,回流:" + tAddressCallback);
  190. tAddressCallbackRep.updateAllProcessStatus(tAddressCallback,2);
  191. successDataCallBack(addressResult);
  192. }
  193. } catch (Exception e) {
  194. status.setRollbackOnly();
  195. e.printStackTrace();
  196. }
  197. }
  198. });
  199. }
  200. } while (page.hasNext());
  201. }
  202. }