From e9771921dbf4a8a7108957199da16ff112d09bba Mon Sep 17 00:00:00 2001 From: cb <275647614@qq.com> Date: Thu, 11 Sep 2025 17:57:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=A4=E8=B4=A7=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=A4=87=E6=B3=A8=E4=BB=A5=E5=8F=8A=E5=BA=97=E9=93=BA?= =?UTF-8?q?=E5=92=8C=E5=BA=97=E9=93=BA=E8=B7=9D=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/OrderDetailController.java | 122 +++++++++++++++++- .../order/OrderMasterController.java | 111 +++++++++++++++- 2 files changed, 231 insertions(+), 2 deletions(-) diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java index 3c9412aa..8437cd65 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java @@ -30,6 +30,7 @@ import com.ghy.shop.service.ShopService; import com.ghy.system.domain.SysArea; import com.ghy.system.service.ISysAreaService; import com.ghy.system.service.IWxMsgService; +import com.ghy.common.utils.BaiduMapUtils; import com.ghy.web.pojo.vo.OrderChangePriceRequest; import com.ghy.web.pojo.vo.OrderListResponse; import com.ghy.web.pojo.vo.OrderStandard; @@ -131,6 +132,9 @@ public class OrderDetailController extends BaseController { @Resource private AdapayService adapayService; + + @Autowired + private BaiduMapUtils baiduMapUtils; @RequiresPermissions("order:detail:view") @GetMapping() @@ -509,7 +513,11 @@ public class OrderDetailController extends BaseController { } logger.info("所有的加价订单{}",financialChangeRecords); - Shop shop=shopService.getShop(goods.getShopId()); + Shop shop=shopService.getShop(goods.getShopId()); + + // 计算主单地址与店铺的距离 + shop = calculateShopDistance(customerAddress, shop); + orderListResponse.setShop(shop); // 编辑返回属性 orderListResponse.setTrackingNumber(orderMaster.getTrackingNumber()); @@ -1701,4 +1709,116 @@ public class OrderDetailController extends BaseController { return AjaxResult.error("保存子单师傅备注失败:" + e.getMessage()); } } + + /** + * 计算商家与客户地址之间的距离 + * @param customerAddress 客户地址信息 + * @param shop 商家信息 + * @param string + * @return 带有距离信息的商家对象 + */ + private Shop calculateShopDistance(CustomerAddress customerAddress, Shop shop) { + try { + // 检查客户地址经纬度是否有效 + if (customerAddress.getLongitude() != null && customerAddress.getLatitude() != null && + customerAddress.getLongitude().compareTo(BigDecimal.ZERO) != 0 && + customerAddress.getLatitude().compareTo(BigDecimal.ZERO) != 0) { + + // 使用已有的经纬度计算距离 + if (shop.getLongitude() != null && shop.getLatitude() != null ) { + + double distance = LocationUtils.getDistanceInMeters( + customerAddress.getLatitude().doubleValue(), + customerAddress.getLongitude().doubleValue(), + shop.getLatitude().doubleValue(), + shop.getLongitude().doubleValue() + ); + + String distanceStr = String.format("%.2f", distance); + shop.setDistance(distanceStr); + logger.info("使用已有经纬度计算距离成功,商家[{}]与客户地址距离:{}km", shop.getShopName(), distanceStr); + } + } else { + // 客户地址经纬度为空,尝试通过地址获取经纬度 + logger.info("客户地址经纬度为空,尝试通过地址获取经纬度"); + + StringBuilder fullAddress = new StringBuilder(); + + // 构建完整地址 + if (customerAddress.getProvinceId() != null) { + SysArea province = sysAreaService.selectById(customerAddress.getProvinceId()); + if (province != null) { + fullAddress.append(province.getAreaName()); + } + } + + if (customerAddress.getCityId() != null) { + SysArea city = sysAreaService.selectById(customerAddress.getCityId()); + if (city != null) { + fullAddress.append(city.getAreaName()); + } + } + + if (customerAddress.getCountryId() != null) { + SysArea area = sysAreaService.selectById(customerAddress.getCountryId()); + if (area != null) { + fullAddress.append(area.getAreaName()); + } + } + + if (customerAddress.getStreetId() != null) { + SysArea street = sysAreaService.selectById(customerAddress.getStreetId()); + if (street != null) { + fullAddress.append(street.getAreaName()); + } + } + + if (StringUtils.isNotEmpty(customerAddress.getAddress())) { + fullAddress.append(customerAddress.getAddress()); + } + + String addressStr = fullAddress.toString(); + logger.info("构建的完整地址:{}", addressStr); + + if (StringUtils.isNotEmpty(addressStr)) { + // 调用百度地图API获取经纬度 + Map coordinates = baiduMapUtils.getCoordinatesByAddress(shop.getProvinceName(), shop.getCityName(), shop.getCountryName(), shop.getStreetName(), addressStr); + + if (coordinates != null && coordinates.containsKey("longitude") && coordinates.containsKey("latitude")) { + BigDecimal lng = new BigDecimal(coordinates.get("longitude").toString()); + BigDecimal lat = new BigDecimal(coordinates.get("latitude").toString()); + + logger.info("通过地址获取到经纬度:longitude={}, latitude={}", lng, lat); + + // 计算距离 + if (shop.getLongitude() != null && shop.getLatitude() != null ) { + + double distance = LocationUtils.getDistanceInMeters( + lat.doubleValue(), + lng.doubleValue(), + shop.getLatitude().doubleValue(), + shop.getLongitude().doubleValue() + ); + + String distanceStr = String.format("%.2f", distance); + shop.setDistance(distanceStr); + logger.info("通过地址获取经纬度后计算距离成功,商家[{}]与客户地址距离:{}km", shop.getShopName(), distanceStr); + } + } else { + logger.warn("通过地址[{}]获取经纬度失败", addressStr); + } + } else { + logger.warn("无法构建完整地址,跳过距离计算"); + } + } + } catch (Exception e) { + logger.error("计算商家与客户地址距离时发生异常", e); + } + + return shop; + } } + + + + diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java index 9d6383c4..4e330a6b 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java @@ -122,7 +122,8 @@ public class OrderMasterController extends BaseController { private InsuranceService insuranceService; @Resource private ShopService shopService; - + @Autowired + private BaiduMapUtils baiduMapUtils; @Resource private IInsuranceManagerService insuranceManagerService; @@ -1847,6 +1848,7 @@ public class OrderMasterController extends BaseController { serverMoney=serverMoney.add(leaderMoney); logger.info("大师傅的服务金额{}大师傅的分成{}",serverMoney,leaderMoney); Shop shop=shopService.getShop(goods.getShopId()); + shop = calculateShopDistance(customerAddress, shop); // 编辑返回属性 orderListResponse.setDeliveryType(orderMaster.getDeliveryType()); orderListResponse.setDeliveryRemark(orderMaster.getDeliveryRemark()); @@ -2551,4 +2553,111 @@ public class OrderMasterController extends BaseController { } } + + /** + * 计算商家与客户地址之间的距离 + * @param customerAddress 客户地址信息 + * @param shop 商家信息 + * @return 带有距离信息的商家对象 + */ + private Shop calculateShopDistance(CustomerAddress customerAddress, Shop shop) { + try { + // 检查客户地址经纬度是否有效 + if (customerAddress.getLongitude() != null && customerAddress.getLatitude() != null && + customerAddress.getLongitude().compareTo(BigDecimal.ZERO) != 0 && + customerAddress.getLatitude().compareTo(BigDecimal.ZERO) != 0) { + + // 使用已有的经纬度计算距离 + if (shop.getLongitude() != null && shop.getLatitude() != null ) { + + double distance = LocationUtils.getDistanceInMeters( + customerAddress.getLatitude().doubleValue(), + customerAddress.getLongitude().doubleValue(), + shop.getLatitude().doubleValue(), + shop.getLongitude().doubleValue() + ); + + String distanceStr = String.format("%.2f", distance); + shop.setDistance(distanceStr); + logger.info("使用已有经纬度计算距离成功,商家[{}]与客户地址距离:{}km", shop.getShopName(), distanceStr); + } + } else { + // 客户地址经纬度为空,尝试通过地址获取经纬度 + logger.info("客户地址经纬度为空,尝试通过地址获取经纬度"); + + StringBuilder fullAddress = new StringBuilder(); + + // 构建完整地址 + if (customerAddress.getProvinceId() != null) { + SysArea province = sysAreaService.selectById(customerAddress.getProvinceId()); + if (province != null) { + fullAddress.append(province.getAreaName()); + } + } + + if (customerAddress.getCityId() != null) { + SysArea city = sysAreaService.selectById(customerAddress.getCityId()); + if (city != null) { + fullAddress.append(city.getAreaName()); + } + } + + if (customerAddress.getCountryId() != null) { + SysArea area = sysAreaService.selectById(customerAddress.getCountryId()); + if (area != null) { + fullAddress.append(area.getAreaName()); + } + } + + if (customerAddress.getStreetId() != null) { + SysArea street = sysAreaService.selectById(customerAddress.getStreetId()); + if (street != null) { + fullAddress.append(street.getAreaName()); + } + } + + if (StringUtils.isNotEmpty(customerAddress.getAddress())) { + fullAddress.append(customerAddress.getAddress()); + } + + String addressStr = fullAddress.toString(); + logger.info("构建的完整地址:{}", addressStr); + + if (StringUtils.isNotEmpty(addressStr)) { + // 调用百度地图API获取经纬度 + Map coordinates = baiduMapUtils.getCoordinatesByAddress(shop.getProvinceName(), shop.getCityName(), shop.getCountryName(), shop.getStreetName(), addressStr); + + if (coordinates != null && coordinates.containsKey("longitude") && coordinates.containsKey("latitude")) { + BigDecimal lng = new BigDecimal(coordinates.get("longitude").toString()); + BigDecimal lat = new BigDecimal(coordinates.get("latitude").toString()); + + logger.info("通过地址获取到经纬度:longitude={}, latitude={}", lng, lat); + + // 计算距离 + if (shop.getLongitude() != null && shop.getLatitude() != null ) { + + double distance = LocationUtils.getDistanceInMeters( + lat.doubleValue(), + lng.doubleValue(), + shop.getLatitude().doubleValue(), + shop.getLongitude().doubleValue() + ); + + String distanceStr = String.format("%.2f", distance); + shop.setDistance(distanceStr); + logger.info("通过地址获取经纬度后计算距离成功,商家[{}]与客户地址距离:{}km", shop.getShopName(), distanceStr); + } + } else { + logger.warn("通过地址[{}]获取经纬度失败", addressStr); + } + } else { + logger.warn("无法构建完整地址,跳过距离计算"); + } + } + } catch (Exception e) { + logger.error("计算商家与客户地址距离时发生异常", e); + } + + return shop; + } }