From 8b005a808d6ab8fae1480ed57bdfd68af2dafcd4 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期六, 01 十一月 2025 23:07:49 +0800
Subject: [PATCH] feat:输入出入地址时,会自动计算距离
---
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java | 586 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 579 insertions(+), 7 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 f5116b2..ac0efe6 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,7 +1,16 @@
package com.ruoyi.web.controller.system;
-import java.util.List;
+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.*;
+import com.ruoyi.system.service.*;
+import com.ruoyi.common.config.TencentMapConfig;
+import com.ruoyi.common.config.BaiduMapConfig;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -18,10 +27,9 @@
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;
/**
* 杞﹁締GPS鍧愭爣Controller
@@ -32,16 +40,129 @@
@Autowired
private IVehicleGpsService vehicleGpsService;
- @Anonymous
- /**
+ @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;
+
+ /**
* 鏌ヨ杞﹁締GPS鍧愭爣鍒楄〃
- */
+ */
@PreAuthorize("@ss.hasPermi('system:gps:list')")
@GetMapping("/list")
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);
return getDataTable(list);
+ }
+ @Anonymous(needSign=true)
+ @GetMapping("/anonymousList")
+ public TableDataInfo anonymousList(VehicleGps vehicleGps) {
+
+ if(vehicleGps.getOrderId()==null)
+ {
+ return getDataTable(new ArrayList<>());
+ }
+
+ //鏌ヨ璁㈠崟
+ TbVehicleOrder tbVehicleOrder = tbVehicleOrderService.selectTbVehicleOrderById(vehicleGps.getOrderId());
+ if(tbVehicleOrder==null)
+ {
+ return getDataTable(new ArrayList<>());
+ }
+
+ if(!Objects.equals(tbVehicleOrder.getStatus(), "0"))
+ {
+ //闈�0琛ㄧず璁㈠崟瀹屾垚浜嗐��
+ try {
+ 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(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);
+ }
}
/**
@@ -51,6 +172,9 @@
@Log(title = "杞﹁締GPS鍧愭爣", businessType = BusinessType.EXPORT)
@GetMapping("/export")
public AjaxResult export(VehicleGps vehicleGps) {
+ // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+ vehicleGps.setOrderByColumn("collect_time");
+ vehicleGps.setIsAsc("desc");
List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
ExcelUtil<VehicleGps> util = new ExcelUtil<VehicleGps>(VehicleGps.class);
return util.exportExcel(list, "杞﹁締GPS鍧愭爣鏁版嵁");
@@ -94,4 +218,452 @@
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());
+ }
+ }
+
+ /**
+ * 鐧惧害鍦板浘鍦扮悊缂栫爜鎺ュ彛浠g悊锛堝湴鍧�杞潗鏍囷級
+ */
+ @Anonymous()
+ @GetMapping("/baidu/geocoding")
+ public AjaxResult baiduGeocoding(String address, String city) {
+ try {
+ // 妫�鏌ュ弬鏁�
+ if (address == null || address.trim().isEmpty()) {
+ return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯鍦板潃淇℃伅");
+ }
+
+ // 鏋勫缓鐧惧害鍦板浘鍦扮悊缂栫爜API URL
+ String url = "https://api.map.baidu.com/geocoding/v3/";
+ String params = "address=" + URLEncoder.encode(address, StandardCharsets.UTF_8.toString()) +
+ (city != null && !city.trim().isEmpty() ?
+ "&city=" + URLEncoder.encode(city, StandardCharsets.UTF_8.toString()) : "") +
+ "&output=json" +
+ "&ak=" + baiduMapConfig.getAk();
+
+ logger.info("鐧惧害鍦板浘鍦扮悊缂栫爜璇锋眰: address={}, city={}", address, city);
+
+ // 鍙戦�丠TTP璇锋眰
+ String response = HttpUtils.sendGet(url, params);
+
+ // 杩斿洖缁撴灉
+ return AjaxResult.success("鏌ヨ鎴愬姛", response);
+ } 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());
+ }
+ }
+}
\ No newline at end of file
--
Gitblit v1.9.1