From af8cab142a6b15c06e131a8474574dd5b00df982 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期四, 04 十二月 2025 22:09:58 +0800
Subject: [PATCH] feat: 改造微信accesstoken存放在系统配置表中
---
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java | 1285 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 1,267 insertions(+), 18 deletions(-)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
index 4db3d37..5d64960 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
@@ -1,11 +1,23 @@
package com.ruoyi.web.controller.system;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import java.io.ByteArrayInputStream;
+import java.util.*;
+import java.text.SimpleDateFormat;
+import java.text.ParseException;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
-import com.ruoyi.system.domain.TbVehicleOrder;
-import com.ruoyi.system.service.ITbVehicleOrderService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.system.domain.*;
+import com.ruoyi.system.service.*;
+import com.ruoyi.common.config.TencentMapConfig;
+import com.ruoyi.common.config.BaiduMapConfig;
+import com.ruoyi.common.config.TiandituMapConfig;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -22,10 +34,13 @@
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.system.domain.VehicleGps;
-import com.ruoyi.system.service.IVehicleGpsService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.utils.http.HttpUtils;
+
+
+import javax.annotation.Resource;
+
/**
* 杞﹁締GPS鍧愭爣Controller
@@ -39,6 +54,37 @@
@Autowired
private ITbVehicleOrderService tbVehicleOrderService;
+ @Autowired
+ private IDispatchOrdService dispatchOrdService;
+
+ @Autowired
+ private ITbOrdersService tbOrdersService;
+
+ @Autowired
+ private IGpsCollectService gpsCollectService;
+
+ @Autowired
+ private IVehicleInfoService vehicleInfoService;
+
+ @Autowired
+ private ICmsGpsCollectService cmsGpsCollectService;
+
+ @Autowired
+ private TencentMapConfig tencentMapConfig;
+
+ @Autowired
+ private BaiduMapConfig baiduMapConfig;
+
+ @Autowired
+ private TiandituMapConfig tiandituMapConfig;
+
+
+ @Resource(name = "tiandituMapService")
+ private IMapService tiandituMapService;
+
+ @Resource(name = "baiduMapService")
+ private IMapService baiduMapService;
+
/**
* 鏌ヨ杞﹁締GPS鍧愭爣鍒楄〃
*/
@@ -47,7 +93,12 @@
public TableDataInfo list(VehicleGps vehicleGps) {
startPage();
- // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+// String vehicleNo=vehicleGps.getVehicleNo();
+// String beginTime=vehicleGps.getBeginTime();
+// String endTime=vehicleGps.getEndTime();
+// return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
+//
+// // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
vehicleGps.setOrderByColumn("collect_time");
vehicleGps.setIsAsc("desc");
List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
@@ -72,16 +123,67 @@
if(!Objects.equals(tbVehicleOrder.getStatus(), "0"))
{
//闈�0琛ㄧず璁㈠崟瀹屾垚浜嗐��
- return getDataTable(new ArrayList<>());
- }
+ try {
+ TbOrders tbOrders = tbOrdersService.selectTbOrdersByOrderID(vehicleGps.getOrderId());
+ if (tbOrders == null) {
+ return getDataTable(new ArrayList<>());
+ }
- vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle());
- startPage();
- // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
- vehicleGps.setOrderByColumn("collect_time");
- vehicleGps.setIsAsc("desc");
- List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
- return getDataTable(list);
+
+ DispatchOrd dispatchOrd = dispatchOrdService.selectDispatchOrdByServiceOrdIDDt(tbOrders.getServiceOrdID());
+ if (dispatchOrd == null) {
+ return getDataTable(new ArrayList<>());
+ }
+
+ String vehicleNo = tbVehicleOrder.getVehicle();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ String beginTime= sdf.format(dispatchOrd.getDispatchOrdStartDate());
+ String endTime= sdf.format(dispatchOrd.getDispatchOrdUpdateTime());
+ //濡傛灉璁㈠崟娌″畬鎴愶紝 endTime涓哄綋鍓嶆椂闂达紱濡備綍璁㈠崟宸茬粡瀹屾垚浜嗭紝鐢ㄨ鍗曠殑缁撴潫鏃堕棿銆�
+
+ return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
+// Map<String, Object> params = new HashMap<>();
+// params.put("beginTime", dispatchOrd.getDispatchOrdStartDate());
+// params.put("endTime", dispatchOrd.getDispatchOrdUpdateTime());
+//
+// vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle());
+// startPage();
+// // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+// vehicleGps.setOrderByColumn("collect_time");
+// vehicleGps.setIsAsc("desc");
+// List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
+// return getDataTable(list);
+ }
+ catch (Exception ex)
+ {
+ logger.error("宸插畬鎴愮殑璁㈠崟鏌ヨ鍦板浘寮傚父锛歿}",ex.getMessage());
+ return getDataTable(new ArrayList<>());
+ }
+ }else{
+ TbOrders tbOrders = tbOrdersService.selectTbOrdersByOrderID(vehicleGps.getOrderId());
+ if (tbOrders == null) {
+ return getDataTable(new ArrayList<>());
+ }
+ DispatchOrd dispatchOrd = dispatchOrdService.selectDispatchOrdByServiceOrdIDDt(tbOrders.getServiceOrdID());
+ if (dispatchOrd == null) {
+ return getDataTable(new ArrayList<>());
+ }
+ String vehicleNo = tbVehicleOrder.getVehicle();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ String beginTime= sdf.format(dispatchOrd.getDispatchOrdStartDate());
+ String endTime= sdf.format(new Date());
+
+ logger.info("鏌ヨ杞﹁締杞ㄨ抗锛氳溅杈嗗彿锛歿}, 寮�濮嬫椂闂达細{}, 缁撴潫鏃堕棿锛歿}", vehicleNo, beginTime, endTime);
+ return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
+//
+// vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle());
+// startPage();
+// // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+// vehicleGps.setOrderByColumn("collect_time");
+// vehicleGps.setIsAsc("desc");
+// List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
+// return getDataTable(list);
+ }
}
/**
@@ -137,4 +239,1151 @@
public AjaxResult remove(@PathVariable Long[] gpsIds) {
return toAjax(vehicleGpsService.deleteVehicleGpsByIds(gpsIds));
}
-}
\ No newline at end of file
+
+ /**
+ * 鏌ヨ杞﹁締鍘嗗彶杞ㄨ抗
+ */
+ @PreAuthorize("@ss.hasPermi('system:gps:query')")
+ @GetMapping("/tracks")
+ public TableDataInfo getTracks(String vehicleNo, String beginTime, String endTime) {
+ return getAnonymousTracks(vehicleNo, beginTime, endTime);
+ }
+
+
+ /**
+ * 鍖垮悕鏌ヨ杞﹁締鍘嗗彶杞ㄨ抗
+ */
+ @Anonymous()
+ @GetMapping("/anonymousTracks")
+ public TableDataInfo getAnonymousTracks(String vehicleNo, String beginTime, String endTime) {
+ try {
+ // 閫氳繃杞︾墝鍙疯幏鍙栬澶嘔D
+ VehicleInfo vehicleInfo = vehicleInfoService.selectVehicleInfoByPlateNumber(vehicleNo);
+ if (vehicleInfo == null) {
+
+ // throw new Error("鏈壘鍒拌杞﹁締瀵瑰簲鐨凣PS璁惧");
+ return getDataTable(new ArrayList<>());
+ }
+
+ // 澶勭悊寮�濮嬫椂闂�
+ beginTime = beginTime.replace("T", " ");
+ if (beginTime.split(":").length == 2) { // 鍙湁灏忔椂鍜屽垎閽�
+ beginTime += ":00";
+ }
+
+ // 澶勭悊缁撴潫鏃堕棿
+// endTime = endTime.replace("T", " ").replace(" ","%20");
+ endTime = endTime.replace("T", " ");
+ if (endTime.split(":").length == 2) { // 鍙湁灏忔椂鍜屽垎閽�
+ endTime += ":59";
+ }
+
+ List<GpsTrackPoint> trackPoints = new ArrayList<>();
+
+ //濡傛灉骞冲彴鏄痗ms锛屽垯璋冪敤cms鐨勬帴鍙�
+ if(vehicleInfo.getPlatformCode().equals("CMS"))
+ {
+
+ CmsTrackDetailResponse response = cmsGpsCollectService.queryTrackDetail(
+ vehicleInfo.getDeviceId(), // 璁惧鍙�
+ beginTime, // 寮�濮嬫椂闂�
+ endTime, // 缁撴潫鏃堕棿
+ null, // 璺濈锛堝彲閫夛級
+ null, // 鍋滆溅鏃堕暱锛堝彲閫夛級
+ 1, // 瑙f瀽鍦扮悊浣嶇疆
+ null, // 褰撳墠椤电爜锛堝彲閫夛級
+ null, // 姣忛〉璁板綍鏁帮紙鍙�夛級
+ 2 // 鍦板浘绫诲瀷锛�2锛氱櫨搴﹀湴鍥撅級
+ );
+
+ if (response.getResult() != 0) {
+ throw new Error("鏌ヨCMS杞ㄨ抗澶辫触");
+ }
+
+ // 杞崲CMS杞ㄨ抗鐐逛负缁熶竴鏍煎紡
+ if (response.getTracks() != null) {
+ for (CmsTrackDetailResponse.CmsTrackPoint point : response.getTracks()) {
+ GpsTrackPoint trackPoint = new GpsTrackPoint();
+ trackPoint.setVehicleNo(point.getVid());
+ trackPoint.setDeviceId(point.getId());
+
+ //缁忓害绾害涓虹┖鏃讹紝璺宠繃
+ if(point.getMlng()==null || point.getMlat()==null)
+ {
+ continue;
+ }
+
+ // 缁忓害锛屼娇鐢ㄤ笁鍏冭繍绠楃
+ trackPoint.setLongitude(point.getMlng() != null ? Double.parseDouble(point.getMlng()) : 0.0);
+
+ // 绾害锛屼娇鐢ㄤ笁鍏冭繍绠楃
+ trackPoint.setLatitude(point.getMlat() != null ? Double.parseDouble(point.getMlat()) : 0.0);
+
+ // 閫熷害锛岀洿鎺ヤ娇鐢╥nt杞琩ouble
+ trackPoint.setSpeed(point.getSp() > 0 ? (double)point.getSp() : 0.0);
+
+ // 鏂瑰悜锛屼娇鐢ㄤ笁鍏冭繍绠楃澶勭悊
+ trackPoint.setCourse(point.getFt() > 0 ? point.getFt() : 0);
+
+ // ACC鐘舵�侊紝浣跨敤涓夊厓杩愮畻绗﹀鐞�
+ trackPoint.setAccStatus(point.getAc() > 0 ? point.getAc() : 0);
+
+ // 鍦ㄧ嚎鐘舵�侊紝浣跨敤涓夊厓杩愮畻绗﹀鐞�
+ trackPoint.setOnlineStatus(point.getNet() > 0 ? point.getNet() : 0);
+ trackPoint.setAddress(point.getPs());
+
+ // 涓婃姤鏃堕棿锛岀洿鎺ヤ娇鐢ㄥ瓧绗︿覆
+ trackPoint.setReportTime(point.getGt() != null ? point.getGt() : new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+
+ trackPoints.add(trackPoint);
+ }
+ }
+ }
+ else {
+
+ // 鏋勫缓鏌ヨ璇锋眰
+ GpsTrackQueryRequest request = new GpsTrackQueryRequest();
+ request.setDeviceid(vehicleInfo.getDeviceId());
+ request.setBegintime(beginTime);
+ request.setEndtime(endTime);
+ request.setTimezone(8); // 涓浗鏃跺尯
+
+ logger.info("鏌ヨ杞﹁締杞ㄨ抗锛氳溅杈嗗彿锛歿}, 璁惧ID锛歿}, 寮�濮嬫椂闂达細{}, 缁撴潫鏃堕棿锛歿}", vehicleNo, vehicleInfo.getDeviceId(), beginTime, endTime);
+ // 鏌ヨ杞ㄨ抗
+ GpsTrackQueryResponse response = gpsCollectService.queryTracks(request);
+ if (response.getStatus() != 0) {
+ logger.error("鏌ヨ杞ㄨ抗澶辫触锛岀姸鎬佺爜锛歿}, 閿欒淇℃伅锛歿}", response.getStatus(), response.getCause());
+ throw new Error("鏌ヨ杞ㄨ抗澶辫触锛�" + (response.getCause() != null ? response.getCause() : "鏈煡閿欒"));
+ }
+
+ // 杞崲GPS51杞ㄨ抗鐐逛负缁熶竴鏍煎紡
+ if (response.getRecords() != null) {
+ for (GpsTrackPoint point : response.getRecords()) {
+ GpsTrackPoint trackPoint = new GpsTrackPoint();
+ trackPoint.setVehicleNo(vehicleNo);
+ trackPoint.setDeviceId(vehicleInfo.getDeviceId());
+ trackPoint.setLongitude(point.getLongitude()); // 缁忓害
+ trackPoint.setLatitude(point.getLatitude()); // 绾害
+ trackPoint.setSpeed(point.getSpeed()); // 閫熷害
+ trackPoint.setCourse(point.getCourse()); // 鏂瑰悜
+ trackPoint.setReportTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(point.getUpdatetime()))); // 涓婃姤鏃堕棿
+ trackPoints.add(trackPoint);
+ }
+ }
+ }
+ //杞崲鎴怢ist<VehicleGps>
+ List<VehicleGps> vehicleGpsList = new ArrayList<>();
+ for(GpsTrackPoint trackPoint : trackPoints)
+ {
+ VehicleGps vehicleGps = new VehicleGps();
+ vehicleGps.setVehicleNo(trackPoint.getVehicleNo());
+ vehicleGps.setDeviceId(trackPoint.getDeviceId());
+ vehicleGps.setLongitude(trackPoint.getLongitude());
+ vehicleGps.setLatitude(trackPoint.getLatitude());
+ vehicleGps.setSpeed(trackPoint.getSpeed());
+ //鏂瑰悜
+ vehicleGps.setDirection(Double.valueOf(trackPoint.getCourse()));
+ //鍦板潃
+ vehicleGps.setAddress(trackPoint.getAddress());
+ vehicleGps.setCollectTime(trackPoint.getReportTime());
+ //GPS骞冲彴澶勭悊鏃堕棿
+ vehicleGps.setPlatformProcessTime(trackPoint.getReportTime());
+ vehicleGps.setDeviceReportTime(trackPoint.getReportTime());
+ vehicleGpsList.add(vehicleGps);
+ }
+ //鏃堕棿鍊掑簭鎺掑簭
+ vehicleGpsList.sort(Comparator.comparing(VehicleGps::getDeviceReportTime).reversed());
+
+ //杩斿洖杞﹁締Gps鍒楄〃
+ return getDataTable(vehicleGpsList);
+ // return success(vehicleGpsList);
+ } catch (Exception e) {
+ logger.error("鏌ヨ杞﹁締杞ㄨ抗寮傚父", e);
+ throw new Error("鏌ヨ杞﹁締杞ㄨ抗澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 鑵捐鍦板浘鍦板潃鎼滅储鎺ュ彛浠g悊
+ */
+ @Anonymous()
+ @GetMapping("/address/search")
+ public AjaxResult searchAddress(String keyword, String region) {
+ try {
+ // 鏋勫缓鑵捐鍦板浘鎼滅储API URL
+ String url = "https://apis.map.qq.com/ws/place/v1/search";
+ String params = "keyword=" + URLEncoder.encode(keyword, StandardCharsets.UTF_8.toString()) +
+ "&boundary=region(" + (region != null ? region : "骞垮窞") + ")" +
+ "&key=" + tencentMapConfig.getKey();
+
+ // 鍙戦�丠TTP璇锋眰
+ String response = HttpUtils.sendGet(url, params);
+
+ // 杩斿洖缁撴灉
+ return AjaxResult.success("鏌ヨ鎴愬姛", response);
+ } catch (Exception e) {
+ logger.error("鍦板潃鎼滅储澶辫触", e);
+ return AjaxResult.error("鍦板潃鎼滅储澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 鑵捐鍦板浘閫嗗湴鍧�瑙f瀽鎺ュ彛浠g悊
+ */
+ @Anonymous()
+ @GetMapping("/address/geocoder")
+ public AjaxResult reverseGeocoder(Double lat, Double lng) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ logger.info("閫嗗湴鍧�瑙f瀽璇锋眰鍙傛暟: lat={}, lng={}", lat, lng);
+
+ if (lat == null || lng == null) {
+ logger.warn("鍙傛暟涓嶅畬鏁达紝缂哄皯缁忕含搴﹀潗鏍�: lat={}, lng={}", lat, lng);
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯缁忕含搴﹀潗鏍�");
+ }
+
+ // 妫�鏌ュ弬鏁版湁鏁堟��
+ if (Double.isNaN(lat) || Double.isNaN(lng) ||
+ Double.isInfinite(lat) || Double.isInfinite(lng)) {
+ logger.warn("鍙傛暟鏃犳晥锛岀粡绾害鍧愭爣鍖呭惈闈炴硶鍊�: lat={}, lng={}", lat, lng);
+ return AjaxResult.error("鍙傛暟鏃犳晥锛岀粡绾害鍧愭爣鏍煎紡閿欒");
+ }
+
+ // 鏋勫缓鑵捐鍦板浘閫嗗湴鍧�瑙f瀽API URL
+ String url = "https://apis.map.qq.com/ws/geocoder/v1/";
+ String params = "location=" + lat + "," + lng +
+ "&key=" + tencentMapConfig.getKey() +
+ "&get_poi=1";
+
+ // 鍙戦�丠TTP璇锋眰
+ String response = HttpUtils.sendGet(url, params);
+
+ // 杩斿洖缁撴灉
+ return AjaxResult.success("鏌ヨ鎴愬姛", response);
+ } catch (Exception e) {
+ logger.error("閫嗗湴鍧�瑙f瀽澶辫触: lat={}, lng={}", lat, lng, e);
+ return AjaxResult.error("閫嗗湴鍧�瑙f瀽澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 鑵捐鍦板浘璺嚎瑙勫垝鎺ュ彛浠g悊锛堣绠椾袱鐐归棿璺濈锛�
+ */
+ @Anonymous()
+ @GetMapping("/route/distance")
+ public AjaxResult calculateDistance(Double fromLat, Double fromLng, Double toLat, Double toLng) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (fromLat == null || fromLng == null || toLat == null || toLng == null) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯璧风偣鎴栫粓鐐瑰潗鏍�");
+ }
+
+ // 鏋勫缓鑵捐鍦板浘璺嚎瑙勫垝API URL
+ String url = "https://apis.map.qq.com/ws/distance/v1/";
+ String params = "mode=driving" +
+ "&from=" + fromLat + "," + fromLng +
+ "&to=" + toLat + "," + toLng +
+ "&key=" + tencentMapConfig.getKey();
+
+ // 鍙戦�丠TTP璇锋眰
+ String response = HttpUtils.sendGet(url, params);
+
+ // 杩斿洖缁撴灉
+ return AjaxResult.success("璁$畻鎴愬姛", response);
+ } catch (Exception e) {
+ logger.error("璺濈璁$畻澶辫触", e);
+ return AjaxResult.error("璺濈璁$畻澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 鐧惧害鍦板浘閫嗗湴鍧�瑙f瀽鎺ュ彛浠g悊
+ */
+ @Anonymous()
+ @GetMapping("/baidu/reverseGeocoding")
+ public AjaxResult baiduResolveAddress(Double lng, Double lat) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (lat == null || lng == null) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯缁忕含搴﹀潗鏍�");
+ }
+
+ String response= baiduMapService.reverseGeocoding(lng, lat);
+ // 鍙戦�丠TTP璇锋眰
+ Map<String,String> objResult=new HashMap<>();
+ objResult.put("address",response);
+ return AjaxResult.success("鏌ヨ鎴愬姛", objResult);
+ }catch (Exception e){
+ logger.error("鐧惧害閫嗗湴鍧�瑙f瀽澶辫触: lat={}, lng={}", lat, lng, e);
+ return AjaxResult.error("鐧惧害閫嗗湴鍧�瑙f瀽澶辫触锛�" + e.getMessage());
+ }
+ }
+ /**
+ * 鐧惧害鍦板浘鍦扮悊缂栫爜鎺ュ彛浠g悊锛堝湴鍧�杞潗鏍囷級
+ */
+ @Anonymous()
+ @GetMapping("/baidu/geocoding")
+ public AjaxResult baiduGeocoding(String address, String city) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (address == null || address.trim().isEmpty()) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯鍦板潃淇℃伅");
+ }
+ Map<String,Double> objResult=baiduMapService.geocoding(address, city);
+
+
+ // 杩斿洖缁撴灉
+ return AjaxResult.success("鏌ヨ鎴愬姛", objResult);
+ } catch (Exception e) {
+ logger.error("鐧惧害鍦板浘鍦扮悊缂栫爜澶辫触", e);
+ return AjaxResult.error("鍦扮悊缂栫爜澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 鐧惧害鍦板浘璺嚎瑙勫垝鎺ュ彛浠g悊锛堣绠椾袱涓潗鏍囦箣闂寸殑椹捐溅璺濈锛�
+ */
+ @Anonymous()
+ @GetMapping("/baidu/route/driving")
+ public AjaxResult baiduRouteDriving(String origin, String destination) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (origin == null || origin.trim().isEmpty() ||
+ destination == null || destination.trim().isEmpty()) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯璧风偣鎴栫粓鐐瑰潗鏍�");
+ }
+
+ // 楠岃瘉鍧愭爣鏍煎紡锛堢含搴�,缁忓害锛�
+ String[] originParts = origin.split(",");
+ String[] destParts = destination.split(",");
+ if (originParts.length != 2 || destParts.length != 2) {
+ return AjaxResult.error("鍧愭爣鏍煎紡閿欒锛屽簲涓猴細绾害,缁忓害");
+ }
+
+ // 鏋勫缓鐧惧害鍦板浘璺嚎瑙勫垝API URL
+ String url = "https://api.map.baidu.com/directionlite/v1/driving";
+ String params = "origin=" + origin +
+ "&destination=" + destination +
+ "&ak=" + baiduMapConfig.getAk();
+
+ logger.info("鐧惧害鍦板浘璺嚎瑙勫垝璇锋眰: origin={}, destination={}", origin, destination);
+
+ // 鍙戦�丠TTP璇锋眰
+ String response = HttpUtils.sendGet(url, params);
+
+ // 杩斿洖缁撴灉
+ return AjaxResult.success("璁$畻鎴愬姛", response);
+ } catch (Exception e) {
+ logger.error("鐧惧害鍦板浘璺嚎瑙勫垝澶辫触", e);
+ return AjaxResult.error("璺嚎瑙勫垝澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 鐧惧害鍦板浘璁$畻涓や釜鍦板潃涔嬮棿鐨勮窛绂伙紙缁勫悎鎺ュ彛锛氬湴鍧�杞潗鏍� + 璺嚎瑙勫垝锛�
+ */
+ @Anonymous()
+ @GetMapping("/baidu/distance/byAddress")
+ public AjaxResult baiduDistanceByAddress(String fromAddress, String fromCity,
+ String toAddress, String toCity) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (fromAddress == null || fromAddress.trim().isEmpty() ||
+ toAddress == null || toAddress.trim().isEmpty()) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯璧风偣鎴栫粓鐐瑰湴鍧�");
+ }
+
+ logger.info("寮�濮嬭绠楀湴鍧�璺濈: fromAddress={}, fromCity={}, toAddress={}, toCity={}",
+ fromAddress, fromCity, toAddress, toCity);
+
+ // 绗竴姝ワ細璧风偣鍦板潃杞潗鏍�
+ String geocodingUrl1 = "https://api.map.baidu.com/geocoding/v3/";
+ String geocodingParams1 = "address=" + URLEncoder.encode(fromAddress, StandardCharsets.UTF_8.toString()) +
+ (fromCity != null && !fromCity.trim().isEmpty() ?
+ "&city=" + URLEncoder.encode(fromCity, StandardCharsets.UTF_8.toString()) : "") +
+ "&output=json" +
+ "&ak=" + baiduMapConfig.getAk();
+
+ String geocodingResponse1 = HttpUtils.sendGet(geocodingUrl1, geocodingParams1);
+ logger.info("璧风偣鍦扮悊缂栫爜鍝嶅簲: {}", geocodingResponse1);
+
+ // 瑙f瀽璧风偣鍧愭爣
+ com.alibaba.fastjson2.JSONObject geocodingJson1 = com.alibaba.fastjson2.JSONObject.parseObject(geocodingResponse1);
+ if (geocodingJson1.getInteger("status") != 0) {
+ logger.error("璧风偣鍦扮悊缂栫爜澶辫触: {}", geocodingResponse1);
+ return AjaxResult.error("璧风偣鍦板潃瑙f瀽澶辫触");
+ }
+ com.alibaba.fastjson2.JSONObject location1 = geocodingJson1.getJSONObject("result").getJSONObject("location");
+ double fromLat = location1.getDouble("lat");
+ double fromLng = location1.getDouble("lng");
+ logger.info("璧风偣鍧愭爣: lat={}, lng={}", fromLat, fromLng);
+
+ // 绗簩姝ワ細缁堢偣鍦板潃杞潗鏍�
+ String geocodingUrl2 = "https://api.map.baidu.com/geocoding/v3/";
+ String geocodingParams2 = "address=" + URLEncoder.encode(toAddress, StandardCharsets.UTF_8.toString()) +
+ (toCity != null && !toCity.trim().isEmpty() ?
+ "&city=" + URLEncoder.encode(toCity, StandardCharsets.UTF_8.toString()) : "") +
+ "&output=json" +
+ "&ak=" + baiduMapConfig.getAk();
+
+ String geocodingResponse2 = HttpUtils.sendGet(geocodingUrl2, geocodingParams2);
+ logger.info("缁堢偣鍦扮悊缂栫爜鍝嶅簲: {}", geocodingResponse2);
+
+ // 瑙f瀽缁堢偣鍧愭爣
+ com.alibaba.fastjson2.JSONObject geocodingJson2 = com.alibaba.fastjson2.JSONObject.parseObject(geocodingResponse2);
+ if (geocodingJson2.getInteger("status") != 0) {
+ logger.error("缁堢偣鍦扮悊缂栫爜澶辫触: {}", geocodingResponse2);
+ return AjaxResult.error("缁堢偣鍦板潃瑙f瀽澶辫触");
+ }
+ com.alibaba.fastjson2.JSONObject location2 = geocodingJson2.getJSONObject("result").getJSONObject("location");
+ double toLat = location2.getDouble("lat");
+ double toLng = location2.getDouble("lng");
+ logger.info("缁堢偣鍧愭爣: lat={}, lng={}", toLat, toLng);
+
+ // 绗笁姝ワ細璋冪敤璺嚎瑙勫垝鎺ュ彛璁$畻璺濈
+ String routeUrl = "https://api.map.baidu.com/directionlite/v1/driving";
+ String origin = fromLat + "," + fromLng;
+ String destination = toLat + "," + toLng;
+ String routeParams = "origin=" + origin +
+ "&destination=" + destination +
+ "&ak=" + baiduMapConfig.getAk();
+
+ logger.info("璺嚎瑙勫垝璇锋眰: origin={}, destination={}", origin, destination);
+ String routeResponse = HttpUtils.sendGet(routeUrl, routeParams);
+ logger.info("璺嚎瑙勫垝鍝嶅簲: {}", routeResponse);
+
+ // 瑙f瀽璺濈缁撴灉
+ com.alibaba.fastjson2.JSONObject routeJson = com.alibaba.fastjson2.JSONObject.parseObject(routeResponse);
+ if (routeJson.getInteger("status") != 0) {
+ logger.error("璺嚎瑙勫垝澶辫触: {}", routeResponse);
+ return AjaxResult.error("璺嚎瑙勫垝澶辫触");
+ }
+
+ // 鎻愬彇璺濈淇℃伅锛堝崟浣嶏細绫筹級
+ com.alibaba.fastjson2.JSONObject result = routeJson.getJSONObject("result");
+ com.alibaba.fastjson2.JSONArray routes = result.getJSONArray("routes");
+ if (routes == null || routes.isEmpty()) {
+ logger.error("鏈壘鍒拌矾绾夸俊鎭�");
+ return AjaxResult.error("鏈壘鍒拌矾绾夸俊鎭�");
+ }
+
+ com.alibaba.fastjson2.JSONObject route = routes.getJSONObject(0);
+ int distance = route.getInteger("distance"); // 璺濈锛屽崟浣嶏細绫�
+ int duration = route.getInteger("duration"); // 鏃堕暱锛屽崟浣嶏細绉�
+
+ logger.info("璁$畻鎴愬姛: 璺濈={}绫�, 鏃堕暱={}绉�", distance, duration);
+
+ // 鏋勫缓杩斿洖缁撴灉
+ Map<String, Object> resultMap = new HashMap<>();
+ resultMap.put("distance", distance); // 璺濈锛堢背锛�
+ resultMap.put("duration", duration); // 鏃堕暱锛堢锛�
+ resultMap.put("distanceKm", String.format("%.1f", distance / 1000.0)); // 璺濈锛堝叕閲岋級
+ resultMap.put("durationMin", duration / 60); // 鏃堕暱锛堝垎閽燂級
+
+ // 璧风偣鍧愭爣
+ Map<String, Object> fromLocation = new HashMap<>();
+ fromLocation.put("lat", fromLat);
+ fromLocation.put("lng", fromLng);
+ resultMap.put("fromLocation", fromLocation);
+
+ // 缁堢偣鍧愭爣
+ Map<String, Object> toLocation = new HashMap<>();
+ toLocation.put("lat", toLat);
+ toLocation.put("lng", toLng);
+ resultMap.put("toLocation", toLocation);
+
+ return AjaxResult.success("璁$畻鎴愬姛", resultMap);
+ } catch (Exception e) {
+ logger.error("璁$畻鍦板潃璺濈澶辫触", e);
+ return AjaxResult.error("璁$畻璺濈澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 鐧惧害鍦板浘鍦板潃鎼滅储鎻愮ずAPI锛堣緭鍏ヨ仈鎯筹級
+ * Place Suggestion API - 鐢ㄤ簬鍦板潃杈撳叆鏃剁殑鏅鸿兘鎻愮ず
+ */
+ @Anonymous()
+ @GetMapping("/baidu/place/suggestion")
+ public AjaxResult baiduPlaceSuggestion(String query, String region) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (query == null || query.trim().isEmpty()) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯鎼滅储鍏抽敭璇�");
+ }
+
+ // 鏋勫缓鐧惧害鍦板浘 Place Suggestion API URL
+ String url = "https://api.map.baidu.com/place/v2/suggestion";
+ String params = "query=" + URLEncoder.encode(query, StandardCharsets.UTF_8.toString()) +
+ (region != null && !region.trim().isEmpty() ?
+ "®ion=" + URLEncoder.encode(region, StandardCharsets.UTF_8.toString()) : "") +
+ "&output=json" +
+ "&ak=" + baiduMapConfig.getAk();
+
+ logger.info("鐧惧害鍦板浘鍦板潃鎼滅储鎻愮ず璇锋眰: query={}, region={}", query, region);
+
+ // 鍙戦�丠TTP璇锋眰
+ String response = HttpUtils.sendGet(url, params);
+ logger.debug("鐧惧害鍦板浘鍦板潃鎼滅储鎻愮ず鍝嶅簲: {}", response);
+
+ // 瑙f瀽鍝嶅簲
+ com.alibaba.fastjson2.JSONObject jsonResponse = com.alibaba.fastjson2.JSONObject.parseObject(response);
+ if (jsonResponse.getInteger("status") != 0) {
+ logger.error("鍦板潃鎼滅储鎻愮ず澶辫触: {}", response);
+ return AjaxResult.error("鍦板潃鎼滅储澶辫触");
+ }
+
+ // 鎻愬彇鎻愮ず鍒楄〃
+ com.alibaba.fastjson2.JSONArray results = jsonResponse.getJSONArray("result");
+ if (results == null || results.isEmpty()) {
+ logger.info("鏈壘鍒板尮閰嶇殑鍦板潃");
+ return AjaxResult.success("鏌ヨ鎴愬姛", new ArrayList<>());
+ }
+
+ // 鏋勫缓杩斿洖缁撴灉
+ List<Map<String, Object>> suggestions = new ArrayList<>();
+ for (int i = 0; i < results.size(); i++) {
+ com.alibaba.fastjson2.JSONObject item = results.getJSONObject(i);
+
+ Map<String, Object> suggestion = new HashMap<>();
+ suggestion.put("name", item.getString("name")); // 鍚嶇О
+ suggestion.put("address", item.getString("address")); // 鍦板潃
+ suggestion.put("province", item.getString("province")); // 鐪�
+ suggestion.put("city", item.getString("city")); // 甯�
+ suggestion.put("district", item.getString("district")); // 鍖�
+ suggestion.put("uid", item.getString("uid")); // 鍦扮偣UID
+
+ // 缁忕含搴︿俊鎭�
+ com.alibaba.fastjson2.JSONObject location = item.getJSONObject("location");
+ if (location != null) {
+ Map<String, Object> locationMap = new HashMap<>();
+ locationMap.put("lat", location.getDouble("lat"));
+ locationMap.put("lng", location.getDouble("lng"));
+ suggestion.put("location", locationMap);
+ }
+
+ suggestions.add(suggestion);
+ }
+
+ logger.info("鍦板潃鎼滅储鎻愮ず鎴愬姛: 鎵惧埌{} 鏉$粨鏋�", suggestions.size());
+ return AjaxResult.success("鏌ヨ鎴愬姛", suggestions);
+ } catch (Exception e) {
+ logger.error("鍦板潃鎼滅储鎻愮ず澶辫触", e);
+ return AjaxResult.error("鍦板潃鎼滅储澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ // ==================== 澶╁湴鍥炬帴鍙� ====================
+
+ /**
+ * 澶╁湴鍥惧湴鐞嗙紪鐮佹帴鍙d唬鐞嗭紙鍦板潃杞潗鏍囷級
+ * 鏂囨。锛歨ttps://lbs.tianditu.gov.cn/server/geocoding.html
+ */
+ @Anonymous()
+ @GetMapping("/tianditu/geocoding")
+ public AjaxResult tiandituGeocoding(String address) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (address == null || address.trim().isEmpty()) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯鍦板潃淇℃伅");
+ }
+ Map<String,Double> resultMap =tiandituMapService.geocoding(address,"");
+
+
+ // 杩斿洖缁撴灉
+ return AjaxResult.success("鏌ヨ鎴愬姛", resultMap);
+ } catch (Exception e) {
+ logger.error("澶╁湴鍥惧湴鐞嗙紪鐮佸け璐�", e);
+ return AjaxResult.error("鍦扮悊缂栫爜澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 澶╁湴鍥鹃�嗗湴鐞嗙紪鐮佹帴鍙d唬鐞嗭紙鍧愭爣杞湴鍧�锛�
+ * 鏂囨。锛歨ttps://lbs.tianditu.gov.cn/server/geocoding.html
+ */
+ @Anonymous()
+ @GetMapping("/tianditu/reverseGeocoding")
+ public AjaxResult tiandituReverseGeocoding(Double lon, Double lat) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (lat == null || lon == null) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯缁忕含搴﹀潗鏍�");
+ }
+
+ // 妫�鏌ュ弬鏁版湁鏁堟��
+ if (Double.isNaN(lat) || Double.isNaN(lon) ||
+ Double.isInfinite(lat) || Double.isInfinite(lon)) {
+ return AjaxResult.error("鍙傛暟鏃犳晥锛岀粡绾害鍧愭爣鏍煎紡閿欒");
+ }
+ String address=this.tiandituMapService.reverseGeocoding(lon, lat);
+
+
+ Map<String,String> resultMap = new HashMap<>();
+ resultMap.put("address",address);
+ // 杩斿洖缁撴灉
+ return AjaxResult.success("鏌ヨ鎴愬姛",resultMap);
+ } catch (Exception e) {
+ logger.error("澶╁湴鍥鹃�嗗湴鐞嗙紪鐮佸け璐�: lon={}, lat={}", lon, lat, e);
+ return AjaxResult.error("閫嗗湴鐞嗙紪鐮佸け璐ワ細" + e.getMessage());
+ }
+ }
+
+ /**
+ * 澶╁湴鍥惧湴鐐规悳绱㈡帴鍙d唬鐞嗭紙POI鎼滅储锛�
+ * 鏂囨。锛歨ttps://lbs.tianditu.gov.cn/server/search.html
+ */
+ @Anonymous()
+ @GetMapping("/tianditu/place/search")
+ public AjaxResult tiandituPlaceSearch(String keyWord, String queryType, String level,
+ String mapBound, Integer start, Integer count) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (keyWord == null || keyWord.trim().isEmpty()) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯鎼滅储鍏抽敭璇�");
+ }
+
+ // 璁剧疆榛樿鍊�
+ if (queryType == null || queryType.trim().isEmpty()) {
+ queryType = "1"; // 1-鏅�氭悳绱紝7-鍛ㄨ竟鎼滅储
+ }
+ if (start == null) {
+ start = 0;
+ }
+ if (count == null) {
+ count = 10;
+ }
+
+ // 鏋勫缓澶╁湴鍥綪OI鎼滅储API URL
+ String url = "http://api.tianditu.gov.cn/search";
+ StringBuilder paramsBuilder = new StringBuilder();
+ paramsBuilder.append("postStr={\"keyWord\":\"").append(keyWord).append("\"");
+ paramsBuilder.append(",\"queryType\":\"").append(queryType).append("\"");
+ if (level != null && !level.trim().isEmpty()) {
+ paramsBuilder.append(",\"level\":\"").append(level).append("\"");
+ }
+ if (mapBound != null && !mapBound.trim().isEmpty()) {
+ paramsBuilder.append(",\"mapBound\":\"").append(mapBound).append("\"");
+ }
+ paramsBuilder.append(",\"start\":\"").append(start).append("\"");
+ paramsBuilder.append(",\"count\":\"").append(count).append("\"");
+ paramsBuilder.append("}" );
+ paramsBuilder.append("&type=query");
+ paramsBuilder.append("&tk=").append(tiandituMapConfig.getTk());
+
+ String params = paramsBuilder.toString();
+
+ logger.info("澶╁湴鍥綪OI鎼滅储璇锋眰: keyWord={}, queryType={}", keyWord, queryType);
+
+ // 鍙戦�丠TTP璇锋眰
+ String response = HttpUtils.sendGet(url, params);
+
+ // 杩斿洖缁撴灉
+ return AjaxResult.success("鏌ヨ鎴愬姛", response);
+ } catch (Exception e) {
+ logger.error("澶╁湴鍥綪OI鎼滅储澶辫触", e);
+ return AjaxResult.error("POI鎼滅储澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 澶╁湴鍥捐矾绾胯鍒掓帴鍙d唬鐞嗭紙椹捐溅璺緞瑙勫垝锛�
+ * 鏂囨。锛歨ttps://lbs.tianditu.gov.cn/server/drive.html
+ */
+ @Anonymous()
+ @GetMapping("/tianditu/route/driving")
+ public AjaxResult tiandituRouteDriving(String orig, String dest, String mid, String style) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (orig == null || orig.trim().isEmpty() ||
+ dest == null || dest.trim().isEmpty()) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯璧风偣鎴栫粓鐐瑰潗鏍�");
+ }
+
+ // 楠岃瘉鍧愭爣鏍煎紡锛堢粡搴�,绾害锛�
+ String[] origParts = orig.split(",");
+ String[] destParts = dest.split(",");
+ if (origParts.length != 2 || destParts.length != 2) {
+ return AjaxResult.error("鍧愭爣鏍煎紡閿欒锛屽簲涓猴細缁忓害,绾害");
+ }
+
+ // 璁剧疆榛樿鍊�
+ if (style == null || style.trim().isEmpty()) {
+ style = "0"; // 0-鎺ㄨ崘锛�1-閬垮紑楂橀��
+ }
+
+ // 鏋勫缓澶╁湴鍥鹃┚杞﹁矾寰勮鍒扐PI URL
+ String url = "http://api.tianditu.gov.cn/drive";
+ StringBuilder paramsBuilder = new StringBuilder();
+ paramsBuilder.append("postStr={\"orig\":\"").append(orig).append("\"");
+ paramsBuilder.append(",\"dest\":\"").append(dest).append("\"");
+ if (mid != null && !mid.trim().isEmpty()) {
+ paramsBuilder.append(",\"mid\":\"").append(mid).append("\"");
+ }
+ paramsBuilder.append(",\"style\":\"").append(style).append("\"");
+ paramsBuilder.append("}" );
+ paramsBuilder.append("&tk=").append(tiandituMapConfig.getTk());
+
+ String params = paramsBuilder.toString();
+
+ logger.info("澶╁湴鍥鹃┚杞﹁矾寰勮鍒掕姹�: orig={}, dest={}", orig, dest);
+
+ // 鍙戦�丠TTP璇锋眰
+ String response = HttpUtils.sendGet(url, params);
+
+ // 杩斿洖缁撴灉
+ return AjaxResult.success("璁$畻鎴愬姛", response);
+ } catch (Exception e) {
+ logger.error("澶╁湴鍥鹃┚杞﹁矾寰勮鍒掑け璐�", e);
+ return AjaxResult.error("璺緞瑙勫垝澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 澶╁湴鍥捐绠椾袱涓湴鍧�涔嬮棿鐨勮窛绂伙紙缁勫悎鎺ュ彛锛氬湴鍧�杞潗鏍� + 璺緞瑙勫垝锛�
+ */
+ @Anonymous()
+ @GetMapping("/tianditu/distance/byAddress")
+ public AjaxResult tiandituDistanceByAddress(String fromAddress, String toAddress) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (fromAddress == null || fromAddress.trim().isEmpty() ||
+ toAddress == null || toAddress.trim().isEmpty()) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯璧风偣鎴栫粓鐐瑰湴鍧�");
+ }
+
+ Map<String,Double> fromLngLat= tiandituMapService.geocoding(fromAddress, null);
+
+ double fromLng = fromLngLat.get("lng");
+ double fromLat = fromLngLat.get("lat");
+ logger.info("璧风偣鍧愭爣: lon={}, lat={}", fromLng, fromLat);
+
+ Map<String,Double> toLngLat = tiandituMapService.geocoding(toAddress, null);
+ double toLon = toLngLat.get("lng");
+ double toLat = toLngLat.get("lat");
+ logger.info("缁堢偣鍧愭爣: lon={}, lat={}", toLon, toLat);
+
+ // 绗笁姝ワ細璋冪敤璺緞瑙勫垝鎺ュ彛璁$畻璺濈
+ String routeUrl = "http://api.tianditu.gov.cn/drive";
+ String orig = fromLng + "," + fromLat;
+ String dest = toLon + "," + toLat;
+ String routeParams = "postStr={\"orig\":\"" + orig + "\",\"dest\":\"" + dest + "\",\"style\":\"0\"}" +
+ "&tk=" + tiandituMapConfig.getTk();
+
+ logger.info("璺緞瑙勫垝璇锋眰: orig={}, dest={}", orig, dest);
+ String routeResponse = HttpUtils.sendGet(routeUrl, routeParams);
+ logger.info("璺緞瑙勫垝鍝嶅簲: {}", routeResponse);
+ //<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+ //<result dest="113.3472,23.16957" mid="" orig="113.373308,23.136699">
+ //
+ // <parameters>
+ //
+ // <orig>113.373308,23.136699</orig>
+ //
+ // <dest>113.3472,23.16957</dest>
+ //
+ // <mid/>
+ //
+ // <key/>
+ //
+ // <width>600</width>
+ //
+ // <height>400</height>
+ //
+ // <style>0</style>
+ //
+ // <version/>
+ //
+ // <sort/>
+ //
+ // </parameters>
+ //
+ // <routes count="9" time="0.0">
+ //
+ // <item id="0">
+ //
+ // <strguide>浠庢瀹夎矾鍚戣タ鍑哄彂,娌挎瀹夎矾璧�100绫冲苟宸﹁浆,</strguide>
+ //
+ // <signage/>
+ //
+ // <streetName>妫犲畨璺�</streetName>
+ //
+ // <nextStreetName/>
+ //
+ // <tollStatus>0</tollStatus>
+ //
+ // <turnlatlon>113.37323,23.13677</turnlatlon>
+ //
+ // </item>
+ //
+ // <item id="1">
+ //
+ // <strguide>璧�100绫冲苟鍚戝箍鍥揩閫�/鐪侀亾303/鍗庡崡蹇��/鐪侀亾81/鐜煄楂橀��/鍗庤璺�/宀戞潙/鐪侀亾3/骞挎繁娌挎睙鏂瑰悜杩涘叆绉戦煹涓矾,</strguide>
+ //
+ // <signage>骞垮洯蹇��/鐪侀亾303/鍗庡崡蹇��/鐪侀亾81/鐜煄楂橀��/鍗庤璺�/宀戞潙/鐪侀亾3/骞挎繁娌挎睙</signage>
+ //
+ // <streetName/>
+ //
+ // <nextStreetName>绉戦煹涓矾</nextStreetName>
+ //
+ // <tollStatus>0</tollStatus>
+ //
+ // <turnlatlon>113.37185,23.13699</turnlatlon>
+ //
+ // </item>
+ //
+ // <item id="2">
+ //
+ // <strguide>娌跨闊典腑璺蛋0.6鍏噷骞跺悜骞垮洯蹇��(瑗胯)/鐪侀亾303/鍗庡崡蹇�熸柟鍚戣繘鍏ュ箍鍥揩閫熻矾,</strguide>
+ //
+ // <signage>骞垮洯蹇��(瑗胯)/鐪侀亾303/鍗庡崡蹇��</signage>
+ //
+ // <streetName>绉戦煹涓矾</streetName>
+ //
+ // <nextStreetName>骞垮洯蹇�熻矾</nextStreetName>
+ //
+ // <tollStatus>0</tollStatus>
+ //
+ // <turnlatlon>113.37107,23.13648</turnlatlon>
+ //
+ // </item>
+ //
+ // <item id="3">
+ //
+ // <strguide>娌垮箍鍥揩閫熻矾璧�1.9鍏噷骞朵粠鍗庡崡蹇��/骞垮窞鍗楃珯/骞垮窞鍖楃珯/鐜煄楂橀��(鍖楃幆)/骞垮窞闀块殕/甯藉嘲灞�/鍗庡崡蹇��(鍖楄)/鍥介亾4/骞垮窞鐜煄楂橀��/鍗庡崡蹇��(瑗�)/浜腐婢抽珮閫�/骞垮窞鏈哄満楂橀��/骞挎渤楂橀��/闊跺叧/鐪侀亾81/鐪侀亾8鏂瑰悜鍖濋亾杩涘叆鍗庡崡绔嬩氦妗�,</strguide>
+ //
+ // <signage>鍗庡崡蹇��/骞垮窞鍗楃珯/骞垮窞鍖楃珯/鐜煄楂橀��(鍖楃幆)/骞垮窞闀块殕/甯藉嘲灞�/鍗庡崡蹇��(鍖楄)/鍥介亾4/骞垮窞鐜煄楂橀��/鍗庡崡蹇��(瑗�)/浜腐婢抽珮閫�/骞垮窞鏈哄満楂橀��/骞挎渤楂橀��/闊跺叧/鐪侀亾81/鐪侀亾8鏂瑰悜鍖濋亾</signage>
+ //
+ // <streetName>骞垮洯蹇�熻矾</streetName>
+ //
+ // <nextStreetName>鍗庡崡绔嬩氦妗�</nextStreetName>
+ //
+ // <tollStatus>0</tollStatus>
+ //
+ // <turnlatlon>113.37139,23.14206</turnlatlon>
+ //
+ // </item>
+ //
+ // <item id="4">
+ //
+ // <strguide>娌垮崕鍗楃珛浜ゆˉ鐩樻ˉ鍚戝寳璧�0.6鍏噷骞剁洿琛屽埌鐪侀亾4/鍗庡崡蹇��,</strguide>
+ //
+ // <signage/>
+ //
+ // <streetName>鍗庡崡绔嬩氦妗�</streetName>
+ //
+ // <nextStreetName>鐪侀亾4/鍗庡崡蹇��</nextStreetName>
+ //
+ // <tollStatus>0</tollStatus>
+ //
+ // <turnlatlon>113.35685,23.14669</turnlatlon>
+ //
+ // </item>
+ //
+ // <item id="5">
+ //
+ // <strguide>娌跨渷閬�4/鍗庡崡蹇�熻蛋0.6鍏噷骞朵粠澶╂渤瀹㈣繍绔�/鐪侀亾15/鍏冨矖/浣涘北/娣卞湷/骞垮窞鐜煄楂橀��/娌堟捣楂橀�熸敮绾�/鍗庡崡蹇�熺鐞嗕腑蹇�/宀戞潙绔嬩氦/鐪侀亾81鏂瑰悜鍖濋亾杩涘叆宀戞潙绔嬩氦,</strguide>
+ //
+ // <signage>澶╂渤瀹㈣繍绔�/鐪侀亾15/鍏冨矖/浣涘北/娣卞湷/骞垮窞鐜煄楂橀��/娌堟捣楂橀�熸敮绾�/鍗庡崡蹇�熺鐞嗕腑蹇�/宀戞潙绔嬩氦/鐪侀亾81鏂瑰悜鍖濋亾</signage>
+ //
+ // <streetName>鐪侀亾4/鍗庡崡蹇��</streetName>
+ //
+ // <nextStreetName>宀戞潙绔嬩氦</nextStreetName>
+ //
+ // <tollStatus>1</tollStatus>
+ //
+ // <turnlatlon>113.35518,23.15157</turnlatlon>
+ //
+ // </item>
+ //
+ // <item id="6">
+ //
+ // <strguide>娌垮矐鏉戠珛浜ょ洏妗ュ悜瑗垮寳璧�0.5鍏噷骞朵粠澶╂渤瀹㈣繍绔�/鍏冨矖/骞挎睍璺�/宀戞潙璺�/甯備氦璀︽敮闃熷嚭鍙i┒绂诲苟杩涘叆闀垮叴璺�,</strguide>
+ //
+ // <signage>澶╂渤瀹㈣繍绔�/鍏冨矖/骞挎睍璺�/宀戞潙璺�/甯備氦璀︽敮闃熷嚭鍙�</signage>
+ //
+ // <streetName>宀戞潙绔嬩氦</streetName>
+ //
+ // <nextStreetName>闀垮叴璺�</nextStreetName>
+ //
+ // <tollStatus>1</tollStatus>
+ //
+ // <turnlatlon>113.35731,23.15636</turnlatlon>
+ //
+ // </item>
+ //
+ // <item id="7">
+ //
+ // <strguide>娌块暱鍏磋矾璧�2.8鍏噷骞跺彸杞埌闀挎勾涓矾,</strguide>
+ //
+ // <signage/>
+ //
+ // <streetName>闀垮叴璺�</streetName>
+ //
+ // <nextStreetName>闀挎勾涓矾</nextStreetName>
+ //
+ // <tollStatus>0</tollStatus>
+ //
+ // <turnlatlon>113.35829,23.16086</turnlatlon>
+ //
+ // </item>
+ //
+ // <item id="8">
+ //
+ // <strguide>娌块暱婀翠腑璺蛋100绫冲埌杈剧洰鐨勫湴銆�</strguide>
+ //
+ // <signage/>
+ //
+ // <streetName>闀挎勾涓矾</streetName>
+ //
+ // <nextStreetName/>
+ //
+ // <tollStatus>0</tollStatus>
+ //
+ // <turnlatlon>113.34714,23.17047</turnlatlon>
+ //
+ // </item>
+ //
+ // </routes>
+ //
+ // <simple>
+ //
+ // <item id="0">
+ //
+ // <strguide>浠庢瀹夎矾鍑哄彂,杩涘叆绉戦煹涓矾銆�</strguide>
+ //
+ // <streetNames>妫犲畨璺�</streetNames>
+ //
+ // <lastStreetName/>
+ //
+ // <linkStreetName>绉戦煹涓矾</linkStreetName>
+ //
+ // <signage/>
+ //
+ // <tollStatus>0</tollStatus>
+ //
+ // <turnlatlon>113.37323,23.13677</turnlatlon>
+ //
+ // <streetLatLon>113.37323,23.13677;113.37291,23.13683;113.37272,23.13687;113.37272,23.13687;113.37265,23.13688;113.37265,23.13688;113.37227,23.13696;113.37227,23.13696;113.37209,23.13699;113.37201,23.13696;113.37201,23.13696;113.37185,23.13699;</streetLatLon>
+ //
+ // <streetDistance>144.0</streetDistance>
+ //
+ // <segmentNumber>0</segmentNumber>
+ //
+ // </item>
+ //
+ // <item id="1">
+ //
+ // <strguide>娌跨闊典腑璺椹�,鍚戝箍鍥揩閫�(瑗胯)/鐪侀亾303/鍗庡崡蹇�熸柟鍚�,杩涘叆鐪侀亾4/鍗庡崡蹇�熴��</strguide>
+ //
+ // <streetNames/>
+ //
+ // <lastStreetName>绉戦煹涓矾</lastStreetName>
+ //
+ // <linkStreetName>鐪侀亾4/鍗庡崡蹇��</linkStreetName>
+ //
+ // <signage>骞垮洯蹇��(瑗胯)/鐪侀亾303/鍗庡崡蹇��</signage>
+ //
+ // <tollStatus>0</tollStatus>
+ //
+ // <turnlatlon>113.37107,23.13648</turnlatlon>
+ //
+ // <streetLatLon>113.37185,23.13699;113.37174,23.13683;113.3714,23.13649;113.37134,23.13645;113.37126,23.13643;113.37116,23.13644;113.37107,23.13648;113.37107,23.13648;113.37103,23.13657;113.37091,23.13683;113.37091,23.13683;113.37086,23.13693;113.3708,23.13705;113.3708,23.13705;113.37075,23.13717;113.37075,23.13717;113.37069,23.1373;113.37069,23.1373;113.37067,23.13735;113.37067,23.13735;113.3706,23.13755;113.37057,23.13765;113.37055,23.13779;113.37054,23.13794;113.37054,23.13804;113.37054,23.13814;113.37054,23.13831;113.37055,23.13844;113.37055,23.13844;113.37056,23.13855;113.37058,23.13865;113.3706,23.13878;113.37062,23.13884;113.37068,23.13911;113.37073,23.13935;113.37075,23.13944;113.37079,23.1396;113.3708,23.13964;113.37083,23.13975;113.37083,23.13975;113.37084,23.1398;113.37084,23.1398;113.37087,23.13998;113.3709,23.1401;113.37097,23.14039;113.371,23.14051;113.371,23.14051;113.3711,23.1409;113.37114,23.14105;113.37116,23.14115;113.3712,23.14127;113.37121,23.14135;113.37124,23.14146;113.37125,23.14153;113.37126,23.14155;113.37129,23.14167;113.37129,23.14167;113.37134,23.14187;113.37136,23.14194;113.37139,23.14206;</streetLatLon>
+ //
+ // <streetDistance>748.0</streetDistance>
+ //
+ // <segmentNumber>1-2</segmentNumber>
+ //
+ // </item>
+ //
+ // <item id="2">
+ //
+ // <strguide>娌跨渷閬�4/鍗庡崡蹇��,宀戞潙绔嬩氦,琛岄┒鍒板箍鍥揩閫熻矾,鍦ㄥぉ娌冲杩愮珯/鍏冨矖/骞挎睍璺�/宀戞潙璺�/甯備氦璀︽敮闃熷嚭鍙i┒绂�,杩涘叆闀挎勾涓矾銆�</strguide>
+ //
+ // <streetNames>鐪侀亾4/鍗庡崡蹇��,宀戞潙绔嬩氦,</streetNames>
+ //
+ // <lastStreetName>骞垮洯蹇�熻矾</lastStreetName>
+ //
+ // <linkStreetName>闀挎勾涓矾</linkStreetName>
+ //
+ // <signage>澶╂渤瀹㈣繍绔�/鍏冨矖/骞挎睍璺�/宀戞潙璺�/甯備氦璀︽敮闃熷嚭鍙�</signage>
+ //
+ // <tollStatus>2</tollStatus>
+ //
+ // <turnlatlon>113.35731,23.15636</turnlatlon>
+ //
+ // <streetLatLon>113.37139,23.14206;113.37145,23.14219;113.37151,23.1423;113.37157,23.14241;113.37164,23.14249;113.37171,23.14256;113.37175,23.1426;113.37179,23.14263;113.37182,23.14265;113.37186,23.14267;113.37192,23.14269;113.37196,23.1427;113.37206,23.14271;113.37216,23.14269;113.37222,23.14267;113.37229,23.14264;113.37234,23.14261;113.37239,23.14257;113.37243,23.14251;113.37247,23.14246;113.3725,23.14237;113.37251,23.14231;113.37251,23.14226;113.37251,23.14222;113.37249,23.14215;113.37248,23.14212;113.37247,23.14208;113.37245,23.14203;113.37242,23.14198;113.37235,23.14191;113.37226,23.14182;113.37215,23.14174;113.37206,23.14169;113.37202,23.14167;113.37183,23.1416;113.37169,23.14157;113.37157,23.14155;113.37145,23.14153;113.37131,23.14151;113.37131,23.14151;113.37125,23.14153;113.37115,23.14156;113.37049,23.14178;113.37036,23.14183;113.37022,23.14188;113.37006,23.14194;113.36995,23.14197;113.36995,23.14197;113.36986,23.14199;113.36979,23.142;113.36956,23.14203;113.36956,23.14203;113.36949,23.14205;113.36949,23.14205;113.3693,23.14213;113.3693,23.14213;113.3692,23.14218;113.3692,23.14218;113.3691,23.14223;113.3691,23.14223;113.36837,23.1425;113.36837,23.1425;113.36735,23.14293;113.36735,23.14293;113.36683,23.14314;113.36683,23.14314;113.36454,23.14409;113.36454,23.14409;113.36432,23.14418;113.36413,23.14426;113.3637,23.14444;113.3637,23.14444;113.36214,23.14505;113.36138,23.14532;113.36138,23.14532;113.36131,23.14535;113.36131,23.14535;113.36113,23.14541;113.36113,23.14541;113.36101,23.14545;113.36089,23.1455;113.36071,23.14556;113.36071,23.14556;113.36062,23.14559;113.36052,23.14562;113.36052,23.14562;113.36024,23.1457;113.36015,23.14573;113.36015,23.14573;113.35987,23.14581;113.35969,23.14587;113.35818,23.1463;113.35818,23.1463;113.35777,23.14642;113.35777,23.14642;113.35766,23.14645;113.35766,23.14645;113.35762,23.14647;113.35762,23.14647;113.35736,23.14655;113.35736,23.14655;113.35685,23.14669;113.35685,23.14669;113.35657,23.14695;113.35642,23.14713;113.35642,23.14713;113.35637,23.14718;113.3562,23.14738;113.35586,23.14787;113.35582,23.14793;113.35572,23.14812;113.35572,23.14812;113.35557,23.14838;113.35554,23.14844;113.35554,23.14844;113.35545,23.14854;113.35533,23.14872;113.35533,23.14872;113.35529,23.14878;113.35529,23.14878;113.355,23.14912;113.35492,23.14923;113.35486,23.1493;113.35483,23.14936;113.3548,23.14942;113.3548,23.14942;113.35473,23.14964;113.35472,23.14973;113.35472,23.14973;113.35471,23.14981;113.35473,23.15003;113.35485,23.15044;113.35509,23.1512;113.35517,23.15145;113.35518,23.15151;113.35518,23.15157;113.35518,23.15157;113.35523,23.15169;113.35523,23.15169;113.35526,23.15178;113.35526,23.15178;113.35531,23.15192;113.35531,23.15192;113.35534,23.15199;113.35541,23.15216;113.35547,23.15233;113.35554,23.1525;113.35568,23.15287;113.35584,23.15323;113.35591,23.15342;113.35598,23.15358;113.35609,23.15379;113.35617,23.15394;113.35629,23.15421;113.35646,23.15457;113.35648,23.15461;113.35652,23.15471;113.35654,23.15475;113.35673,23.15515;113.35677,23.15524;113.35677,23.15524;113.35693,23.15556;113.35697,23.15564;113.35709,23.1559;113.35709,23.1559;113.35731,23.15636;113.35731,23.15636;113.35756,23.15669;113.35775,23.15697;113.3579,23.15725;113.35805,23.15752;113.35805,23.15752;113.35841,23.15824;113.35865,23.15872;113.3587,23.15889;113.3587,23.15889;113.35879,23.15912;113.35883,23.15927;113.35885,23.15938;113.35886,23.15948;113.35884,23.1596;113.35882,23.15978;113.35878,23.15994;113.35868,23.16016;113.35859,23.16034;113.35855,23.16041;113.35849,23.1605;113.35843,23.16062;113.35829,23.16086;</streetLatLon>
+ //
+ // <streetDistance>3669.0</streetDistance>
+ //
+ // <segmentNumber>3-6</segmentNumber>
+ //
+ // </item>
+ //
+ // <item id="3">
+ //
+ // <strguide>娌块暱婀翠腑璺椹跺埌鐩殑鍦般��</strguide>
+ //
+ // <streetNames>闀挎勾涓矾</streetNames>
+ //
+ // <lastStreetName/>
+ //
+ // <linkStreetName/>
+ //
+ // <signage/>
+ //
+ // <tollStatus>0</tollStatus>
+ //
+ // <turnlatlon>113.34714,23.17047</turnlatlon>
+ //
+ // <streetLatLon>113.34714,23.17047;113.34711,23.1703;113.34708,23.16988;113.34708,23.16988;113.34705,23.16957;</streetLatLon>
+ //
+ // <streetDistance>101.0</streetDistance>
+ //
+ // <segmentNumber>7-8</segmentNumber>
+ //
+ // </item>
+ //
+ // </simple>
+ //
+ // <distance>7.48</distance>
+ //
+ // <duration>548.0</duration>
+ //
+ // <routelatlon>113.373308,23.136699;113.37323,23.13677;113.37272,23.13687;113.37265,23.13688;113.37227,23.13696;113.37209,23.13699;113.37201,23.13696;113.37185,23.13699;113.37185,23.13699;113.3714,23.13649;113.37126,23.13643;113.37116,23.13644;113.37107,23.13648;113.37107,23.13648;113.37091,23.13683;113.37075,23.13717;113.37057,23.13765;113.37054,23.13794;113.37055,23.13844;113.3706,23.13878;113.3708,23.13964;113.37083,23.13975;113.371,23.14051;113.37125,23.14153;113.37129,23.14167;113.37139,23.14206;113.37139,23.14206;113.37164,23.14249;113.37182,23.14265;113.37206,23.14271;113.37222,23.14267;113.37234,23.14261;113.3725,23.14237;113.37249,23.14215;113.37242,23.14198;113.37206,23.14169;113.37183,23.1416;113.37131,23.14151;113.37049,23.14178;113.36995,23.14197;113.36956,23.14203;113.36949,23.14205;113.3693,23.14213;113.3692,23.14218;113.3691,23.14223;113.36837,23.1425;113.36735,23.14293;113.36683,23.14314;113.36454,23.14409;113.3637,23.14444;113.36138,23.14532;113.36113,23.14541;113.36052,23.14562;113.35818,23.1463;113.35766,23.14645;113.35762,23.14647;113.35685,23.14669;113.35685,23.14669;113.35642,23.14713;113.35637,23.14718;113.35572,23.14812;113.35554,23.14844;113.35533,23.14872;113.35529,23.14878;113.35486,23.1493;113.3548,23.14942;113.35473,23.14964;113.35473,23.15003;113.35518,23.15151;113.35518,23.15157;113.35518,23.15157;113.35526,23.15178;113.35554,23.1525;113.35598,23.15358;113.35652,23.15471;113.35731,23.15636;113.35731,23.15636;113.35805,23.15752;113.3587,23.15889;113.35885,23.15938;113.35878,23.15994;113.35855,23.16041;113.35829,23.16086;113.35829,23.16086;113.35774,23.16199;113.35695,23.16368;113.35625,23.1651;113.35567,23.16616;113.35546,23.16638;113.35484,23.1669;113.3547,23.16697;113.35444,23.1671;113.35392,23.16726;113.35328,23.16732;113.35126,23.16726;113.35046,23.16736;113.34949,23.16765;113.34651,23.16884;113.34571,23.16921;113.34393,23.17017;113.34387,23.17021;113.34252,23.17092;113.34213,23.17112;113.34192,23.17139;113.34177,23.17169;113.34261,23.17145;113.34427,23.17102;113.34559,23.17069;113.34714,23.17047;113.34714,23.17047;113.34708,23.16988;113.34708,23.16988;113.34705,23.16957;113.3472,23.16957;</routelatlon>
+ //
+ // <mapinfo>
+ //
+ // <center>113.35754,23.15406</center>
+ //
+ // <scale>10</scale>
+ //
+ // </mapinfo>
+ //</result>
+ //瑙f瀽杩欎釜xml 鎷垮埌distance鍜宒uration
+ if(routeResponse!=null) {
+ org.dom4j.Document doc = DocumentHelper.parseText(routeResponse);
+
+ // 2. 鑾峰彇鏍硅妭鐐� <result>
+ Element rootElement = doc.getRootElement();
+
+ // 3. 鐩存帴鑾峰彇鏍硅妭鐐逛笅鐨� <distance> 瀛愯妭鐐规枃鏈��
+ String distance = rootElement.elementText("distance");
+
+ // 鍙�夛細杞负Double绫诲瀷锛堣嫢闇�鏁板�艰绠楋級
+ Double distanceValue = Double.parseDouble(distance);
+ Map<String, Double> resultMap = new HashMap<>();
+ resultMap.put("distance", distanceValue*1000);
+
+ // 4. 鐩存帴鑾峰彇鏍硅妭鐐逛笅鐨� <duration> 瀛愯妭鐐规枃鏈��
+ return AjaxResult.success("璁$畻鎴愬姛", resultMap);
+ }
+ else{
+ return AjaxResult.error("璁$畻璺濈澶辫触锛氭棤杩斿洖缁撴灉");
+ }
+ } catch (Exception e) {
+ logger.error("璁$畻鍦板潃璺濈澶辫触", e);
+ return AjaxResult.error("璁$畻璺濈澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 澶╁湴鍥捐緭鍏ユ彁绀烘帴鍙d唬鐞嗭紙鍦板潃鑱旀兂锛�
+ * 鏂囨。锛歨ttps://lbs.tianditu.gov.cn/server/suggestion.html
+ */
+ @Anonymous()
+ @GetMapping("/tianditu/place/suggestion")
+ public AjaxResult tiandituPlaceSuggestion(String keyWord, String region, String city, Integer count) {
+ try {
+ // 妫�鏌ュ繀闇�鍙傛暟
+ if (keyWord == null || keyWord.trim().isEmpty()) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯鎼滅储鍏抽敭璇�(keyWord)");
+ }
+
+ // 璁剧疆榛樿鍊�
+ if (count == null) {
+ count = 10;
+ }
+
+ // 鏋勫缓澶╁湴鍥炬櫘閫氭悳绱PI URL
+ String url = "http://api.tianditu.gov.cn/v2/search";
+ StringBuilder paramsBuilder = new StringBuilder();
+ paramsBuilder.append("postStr={\"keyWord\":\"").append(keyWord).append("\"");
+ // 纭紪鐮佷腑鍥藉湴鍥捐寖鍥�
+ paramsBuilder.append(",\"mapBound\":\"").append("73.66,3.86,135.05,53.55").append("\"");
+ // 榛樿绾у埆涓�18
+ paramsBuilder.append(",\"level\":\"").append("18").append("\"");
+ // 榛樿鏌ヨ绫诲瀷涓烘櫘閫氭悳绱�
+ paramsBuilder.append(",\"queryType\":\"").append("1").append("\"");
+ // 榛樿璧峰浣嶇疆涓�0
+ paramsBuilder.append(",\"start\":\"").append("0").append("\"");
+ paramsBuilder.append(",\"count\":\"").append(count).append("\"");
+
+ // 娣诲姞鍙�夊弬鏁�
+ if (region != null && !region.trim().isEmpty()) {
+ paramsBuilder.append(",\"specify\":\"").append(region).append("\"");
+ }
+ if (city != null && !city.trim().isEmpty()) {
+ paramsBuilder.append(",\"dataTypes\":\"").append(city).append("\"");
+ }
+
+ paramsBuilder.append("}");
+ paramsBuilder.append("&type=query");
+ paramsBuilder.append("&tk=").append(tiandituMapConfig.getTk());
+
+ String params = paramsBuilder.toString();
+
+ logger.info("澶╁湴鍥炬櫘閫氭悳绱㈣姹�: keyWord={}, count={}", keyWord, count);
+ logger.debug("鍦板浘璇锋眰鎺ュ彛鍙傛暟锛歿}", params);
+
+ // 鍙戦�丠TTP璇锋眰
+ String response = HttpUtils.sendGet(url, params);
+ logger.debug("澶╁湴鍥炬櫘閫氭悳绱㈠搷搴�: {}", response);
+ // {"count":27,"resultType":1,"prompt":[{"type":4,"admins":[{"adminName":"骞垮窞甯�","adminCode":156440100}]}],
+ //"pois":[{"address":"骞夸笢鐪佸箍宸炲競澶╂渤鍖烘涓嬭閬撳瓙鍗堥澶╂渤妫犱笅搴�","phone":"","poiType":"101","name":"瀛愬崍棣�(澶╂渤妫犱笅搴�)","source":"0","hotPointID":"17163AD907B29F24","lonlat":"113.36952,23.134056"},{"address":"鍗氭眹琛�6鍙�","phone":"","poiType":"101","name":"澶╂渤妫犱笅路鏅烘眹park","source":"0","hotPointID":"C2635A7054C1EBB7","lonlat":"113.37003,23.14308"},{"address":"绉戞柊璺�143~147鍙�","phone":"020-88524715","poiType":"101","name":"閲嶅簡寰峰簞鐏攨(澶╂渤妫犱笅搴�)","source":"0","hotPointID":"6919E1CFA6F6EF20","lonlat":"113.37627,23.127416"},{"address":"鍗氭眹琛�6鍙�","phone":"020-87085713","poiType":"101","name":"澶╂渤妫犱笅路鏅烘眹PAPK鍋滆溅鍦�","source":"0","hotPointID":"4AC84F8E1CB34C4E","lonlat":"113.36925,23.14256"},{"address":"骞垮洯涓滆矾鍗氭眹琛�6鍙峰ぉ娌虫涓嬄锋櫤姹嘝APK鍦颁笅鍋滆溅鍦�","phone":"020-87085713","poiType":"101","name":"澶╂渤妫犱笅路鏅烘眹PAPK鐗规柉鎷夎秴绾у厖鐢电珯","source":"0","hotPointID":"70FC2D0A2D061E4B","lonlat":"113.3705,23.14359"},{"address":"妫犲痉鍗楄矾321","phone":"","poiType":"101","name":"绯栧洯澶╂渤妫犱笅搴�","source":"0","hotPointID":"B97F4B20719EEBD1","lonlat":"113.38009,23.13434"},{"address":"涓北澶ч亾妫犱笅璺笢闂稿ぇ琛楄嚜缂�98鍙�2鍙峰簵","phone":"13590139682","poiType":"101","name":"鑺辩敳鐜嬪ぉ娌虫涓嬪簵","source":"0","hotPointID":"174C40E7FBAE1187","lonlat":"113.37556,23.12844"},{"address":"妫犱笅浜岀ぞ娑岃竟璺�69鍙峰厜杈夊ぇ鍘�","phone":"020-66351119","poiType":"101","name":"绱㈢壒鏉ユ枃鑹洪厭搴楀ぉ娌虫涓嬪簵","source":"0","hotPointID":"362052A27B9A1AC8","lonlat":"113.37161,23.12794"},{"address":"涓北澶ч亾瑗�493鍙�","phone":"020-38288788","poiType":"101","name":"涓浗鐢典俊澶╂渤妫犱笅绂忓杽钀ヤ笟鍘�","source":"0","hotPointID":"D50C7774CFC6AA09","lonlat":"113.37455,23.12855"},{"address":"骞夸笢鐪佸箍宸炲競澶╂渤鍖烘涓嬭閬撴効杈捐瑷�鍩硅涓績澶╂渤妫犱笅鏍″尯","phone":"","poiType":"101","name":"鎰胯揪璇█鍩硅涓績澶╂渤妫犱笅鏍″尯","source":"0","hotPointID":"3CEE80F76558BDE4","lonlat":"113.373743,23.128796"}],"lineData":[],"status":{"cndesc":"鏈嶅姟姝e父","infocode":1000},"keyWord":"骞垮窞澶╂渤妫犱笅"}
+ com.alibaba.fastjson.JSONObject jsonResponse = com.alibaba.fastjson.JSONObject.parseObject(response);
+ JSONObject objStatus=jsonResponse.getJSONObject("status");
+ if (objStatus == null || objStatus.getInteger("infocode") != 1000) {
+ logger.error("澶╁湴鍥炬櫘閫氭悳绱㈠け璐�: {}", response);
+ return AjaxResult.error("鍦板潃鎼滅储澶辫触");
+ }
+
+ JSONArray results = jsonResponse.getJSONArray("pois");
+
+
+ // 鏋勫缓杩斿洖缁撴灉
+ List<Map<String, Object>> suggestions = new ArrayList<>();
+ for (int i = 0; i < results.size(); i++) {
+ JSONObject item = results.getJSONObject(i);
+
+ Map<String, Object> suggestion = new HashMap<>();
+ suggestion.put("name", item.getString("name")); // 鍚嶇О
+ suggestion.put("address", item.getString("address")); // 鍦板潃
+ suggestion.put("province", item.getString("prov")); // 鐪�
+ suggestion.put("city", item.getString("city")); // 甯�
+ suggestion.put("district", item.getString("county")); // 鍖哄幙
+ suggestion.put("tel", item.getString("tel")); // 鐢佃瘽
+ suggestion.put("postcode", item.getString("postcode")); // 閭紪
+ suggestion.put("type", item.getString("type")); // 绫诲瀷
+
+ // 缁忕含搴︿俊鎭�
+ String location = item.getString("lonlat");
+ if (location != null) {
+ Map<String, Object> locationMap = new HashMap<>();
+ String[] locationArray = location.split(",");
+ locationMap.put("lng",Double.parseDouble(locationArray[0]));
+ locationMap.put("lat",Double.parseDouble(locationArray[1]));
+ suggestion.put("location", locationMap);
+ }
+
+ suggestions.add(suggestion);
+ }
+
+ logger.info("鍦板潃鎼滅储鎴愬姛: 鎵惧埌{}鏉$粨鏋�", suggestions.size());
+ return AjaxResult.success("鏌ヨ鎴愬姛", suggestions);
+ } catch (Exception e) {
+ logger.error("鍦板潃鎼滅储澶辫触", e);
+ return AjaxResult.error("鍦板潃鎼滅储澶辫触锛�" + e.getMessage());
+ }
+ }
+}
\ No newline at end of file
--
Gitblit v1.9.1