From 080778a62ec384b90fc9f111f99b6b63481c6fde Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 12 Jan 2026 15:27:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E6=90=9C=E7=B4=A2=E8=B7=9D?= =?UTF-8?q?=E7=A6=BB=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/utils/DistanceCalculatorUtils.java | 98 +++++++++++++++++++ .../impl/ShopProductBaseServiceImpl.java | 46 +++++++-- 2 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 mall-common/src/main/java/com/suisung/mall/common/utils/DistanceCalculatorUtils.java diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/DistanceCalculatorUtils.java b/mall-common/src/main/java/com/suisung/mall/common/utils/DistanceCalculatorUtils.java new file mode 100644 index 00000000..babbb9ae --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/DistanceCalculatorUtils.java @@ -0,0 +1,98 @@ +package com.suisung.mall.common.utils; + +import cn.hutool.core.convert.Convert; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class DistanceCalculatorUtils { + // 地球半径(千米) + private static final double EARTH_RADIUS = 6371.0; + + /** + * 计算两个经纬度坐标之间的距离(Haversine公式) + * @param lat1 第一个点的纬度 + * @param lon1 第一个点的经度 + * @param lat2 第二个点的纬度 + * @param lon2 第二个点的经度 + * @return 距离(千米) + */ + public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) { + // 将角度转换为弧度 + double lat1Rad = Math.toRadians(lat1); + double lon1Rad = Math.toRadians(lon1); + double lat2Rad = Math.toRadians(lat2); + double lon2Rad = Math.toRadians(lon2); + + // 计算差值 + double deltaLat = lat2Rad - lat1Rad; + double deltaLon = lon2Rad - lon1Rad; + + // Haversine公式 + double a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + + Math.cos(lat1Rad) * Math.cos(lat2Rad) * + Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2); + + double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + + return EARTH_RADIUS * c; + } + + /** + * 重载方法:返回不同单位的距离 + * @param unit 单位:"km"=千米, "m"=米, "mile"=英里 + */ + public static double calculateDistance(double lat1, double lon1, double lat2, double lon2, String unit) { + double distanceKm = calculateDistance(lat1, lon1, lat2, lon2); + + switch (unit.toLowerCase()) { + case "km": + return distanceKm; + case "m": + return distanceKm * 1000; + case "mile": + return distanceKm * 0.621371; + case "nautical": // 海里 + return distanceKm * 0.539957; + default: + return distanceKm; + } + } + + // 使用示例 + public static void main(String[] args) { + // 示例:北京(39.9042, 116.4074)到上海(31.2304, 121.4737) + double lat1 = 23.212212; + double lon1 = 110.23232332; + double lat2 = 23.332099038755167; + double lon2 = 110.08853179682197; + + double distanceKm = calculateDistance(lat1, lon1, lat2, lon2); + double distanceM = calculateDistance(lat1, lon1, lat2, lon2, "m"); + double distanceMile = calculateDistance(lat1, lon1, lat2, lon2, "mile"); + + System.out.println("北京到上海的距离:"); + System.out.printf("千米: %.2f km\n", distanceKm); + System.out.printf("米: %.2f m\n", distanceM); + System.out.printf("英里: %.2f miles\n", distanceMile); + + List product_base_rows=new ArrayList<>(); + Map base=new HashMap<>(); + base.put("store_id",111); + product_base_rows.add(base); + base.put("store_id",22); + product_base_rows.add(base); + base.put("store_id",33); + product_base_rows.add(base); + base.put("store_id",44); + product_base_rows.add(base); + base.put("store_id",44); + product_base_rows.add(base); + System.out.println(product_base_rows); + List storeIds= product_base_rows.stream().map(map -> Convert.toInt(map.get("store_id"))).distinct().collect(Collectors.toList()); + System.out.println(storeIds); + } +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java index 082107a7..6c03ee71 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java @@ -62,6 +62,7 @@ import com.suisung.mall.shop.product.service.*; import com.suisung.mall.shop.sixun.service.SxSyncGoodsService; import com.suisung.mall.shop.store.service.*; import com.suisung.mall.shop.user.service.*; +import org.apache.commons.collections.map.HashedMap; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -408,7 +409,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl spec_id_row = new ArrayList<>(); for (Object spec_jo : spec_array) { cn.hutool.json.JSONObject item = (cn.hutool.json.JSONObject) spec_jo; @@ -988,7 +989,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl spec_item_ids = new ArrayList<>(); List item_names = new ArrayList<>(); Long item_id; @@ -1361,7 +1362,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl spec_item_ids = new ArrayList<>(); List item_names = new ArrayList<>(); @@ -2063,6 +2064,30 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl distanceMap=new HashedMap(); + String lat1 = getParameter("userLat");//维度 + String lon1=getParameter("userLng");//经度 + boolean isCaculateDistance=false;//是否要计算距离 + if(StringUtils.isNotEmpty(lat1)&&StringUtils.isNotEmpty(lon1)){ + List storeIds= product_base_rows.stream().map(map ->Convert.toInt(map.get("store_id"))).distinct().collect(Collectors.toList()); + if(!storeIds.isEmpty()){ + isCaculateDistance=true; + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("store_id",storeIds); + List shopStoreBases= shopStoreBaseService.list(queryWrapper); + for (ShopStoreBase shopStoreBase : shopStoreBases) { + String store_latitude=shopStoreBase.getStore_latitude(); + String store_longitude=shopStoreBase.getStore_longitude(); + if(StringUtils.isNotEmpty(store_latitude)&&StringUtils.isNotEmpty(store_longitude)){ + double distance=DistanceCalculatorUtils.calculateDistance(Convert.toDouble(lat1),Convert.toDouble(lon1),Convert.toDouble(store_latitude),Convert.toDouble(store_longitude)); + distanceMap.put(shopStoreBase.getStore_id(),NumberUtil.round(distance,2).doubleValue()); + } + } + } + } + //end 计算店铺距离 + //List productIndexList = shopProductIndexService.gets(product_id_row); //过滤过期的活动商品 start List productIndexList = filterEndActivity(product_id_row); @@ -2078,6 +2103,11 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl reduction_item_ids = Convert.toList(Long.class, item); if (CollUtil.isNotEmpty(reduction_item_ids)) { @@ -4985,7 +5015,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl spec_item_ids = new ArrayList<>(); List item_names = new ArrayList<>(); @@ -6027,7 +6057,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl spec_item_ids = new ArrayList<>(); List item_names = new ArrayList<>(); for (Object josn_item_spec : array_item_spec) { @@ -6508,7 +6538,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl