diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/goods/GoodsController.java b/ghy-admin/src/main/java/com/ghy/web/controller/goods/GoodsController.java index 338d96fe..19c17634 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/goods/GoodsController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/goods/GoodsController.java @@ -647,4 +647,156 @@ public class GoodsController extends BaseController { return AjaxResult.error(ExceptionUtil.getExceptionMessage(e)); } } + + /** + * 通过配件商品ID获取对应服务类目下的所有店铺信息 + * + * @return 店铺信息列表(包含距离信息) + */ + @PostMapping("/getShopsByGoodsId") + @ResponseBody + public AjaxResult getShopsByGoodsId(@RequestBody Map params) { + try { + Long goodsId = Long.valueOf(params.get("goodsId").toString()); + final Double latitude = params.get("latitude") != null ? Double.valueOf(params.get("latitude").toString()) : null; + final Double longitude = params.get("longitude") != null ? Double.valueOf(params.get("longitude").toString()) : null; + + // 1. 通过配件商品ID获取商品信息 + Goods goods = goodsService.selectById(goodsId); + if (goods == null) { + return AjaxResult.error("商品不存在"); + } + + // 2. 获取商品对应的服务类目ID + Long deptGoodsCategoryId = goods.getDeptGoodsCategoryId(); + if (deptGoodsCategoryId == null) { + return AjaxResult.error("商品未关联服务类目"); + } + + // 3. 通过类目ID获取当前类目下的所有店铺信息 + // 先获取类目信息,找到所有使用该类目的商品 + DeptGoodsCategory deptGoodsCategory = deptGoodsCategoryService.get(deptGoodsCategoryId); + if (deptGoodsCategory == null) { + return AjaxResult.error("服务类目不存在"); + } + + // 查询所有使用该服务类目的商品 + Goods queryGoods = new Goods(); + queryGoods.setDeptGoodsCategoryId(deptGoodsCategoryId); + queryGoods.setStatus(0); // 只查询上架的商品 + List goodsList = goodsService.selectGoodsList(queryGoods); + + // 提取所有店铺ID(去重) + Set shopIds = goodsList.stream() + .filter(g -> g.getShopId() != null) + .map(Goods::getShopId) + .collect(Collectors.toSet()); + + if (shopIds.isEmpty()) { + return AjaxResult.success("该服务类目下暂无店铺信息", new ArrayList<>()); + } + + // 4. 获取所有店铺信息 + List shops = new ArrayList<>(); + for (Long shopId : shopIds) { + Shop shop = shopService.getShop(shopId); + if (shop != null) { + // 5. 计算距离 + if (LocationUtils.isValidCoordinate(latitude, longitude) && + LocationUtils.isValidCoordinate(shop.getLatitude(), shop.getLongitude())) { + try { + double distanceInMeters = LocationUtils.getDistanceInMeters( + latitude, longitude, + shop.getLatitude(), shop.getLongitude() + ); + // 将距离信息添加到店铺对象中(可以创建一个新的DTO或者使用Map) + Map shopWithDistance = new HashMap<>(); + shopWithDistance.put("shop", shop); + shopWithDistance.put("distance", LocationUtils.formatDistance(distanceInMeters)); + shopWithDistance.put("distanceInMeters", distanceInMeters); + shops.add(shop); + } catch (Exception e) { + logger.warn("计算店铺[{}]距离失败: {}", shop.getShopName(), e.getMessage()); + shops.add(shop); + } + } else { + shops.add(shop); + } + } + } + + // 6. 按距离排序(如果提供了位置信息) + if (LocationUtils.isValidCoordinate(latitude, longitude)) { + shops.sort((shop1, shop2) -> { + try { + if (LocationUtils.isValidCoordinate(shop1.getLatitude(), shop1.getLongitude()) && + LocationUtils.isValidCoordinate(shop2.getLatitude(), shop2.getLongitude())) { + + double dist1 = LocationUtils.getDistanceInMeters( + latitude, longitude, + shop1.getLatitude(), shop1.getLongitude() + ); + double dist2 = LocationUtils.getDistanceInMeters( + latitude, longitude, + shop2.getLatitude(), shop2.getLongitude() + ); + return Double.compare(dist1, dist2); + } + } catch (Exception e) { + logger.warn("排序时计算距离失败: {}", e.getMessage()); + } + return 0; + }); + } + + // 7. 构建返回结果,包含距离信息 + List> result = new ArrayList<>(); + for (Shop shop : shops) { + Map shopInfo = new HashMap<>(); + shopInfo.put("shopId", shop.getShopId()); + shopInfo.put("shopName", shop.getShopName()); + shopInfo.put("imageUrl", shop.getImageUrl()); + shopInfo.put("workerId", shop.getWorkerId()); + shopInfo.put("provinceId", shop.getProvinceId()); + shopInfo.put("provinceName", shop.getProvinceName()); + shopInfo.put("cityId", shop.getCityId()); + shopInfo.put("cityName", shop.getCityName()); + shopInfo.put("countryId", shop.getCountryId()); + shopInfo.put("countryName", shop.getCountryName()); + shopInfo.put("streetId", shop.getStreetId()); + shopInfo.put("streetName", shop.getStreetName()); + shopInfo.put("address", shop.getAddress()); + shopInfo.put("phone", shop.getPhone()); + shopInfo.put("latitude", shop.getLatitude()); + shopInfo.put("longitude", shop.getLongitude()); + + // 计算并添加距离信息 + if (LocationUtils.isValidCoordinate(latitude, longitude) && + LocationUtils.isValidCoordinate(shop.getLatitude(), shop.getLongitude())) { + try { + double distanceInMeters = LocationUtils.getDistanceInMeters( + latitude, longitude, + shop.getLatitude(), shop.getLongitude() + ); + shopInfo.put("distance", LocationUtils.formatDistance(distanceInMeters)); + shopInfo.put("distanceInMeters", distanceInMeters); + } catch (Exception e) { + shopInfo.put("distance", null); + shopInfo.put("distanceInMeters", null); + } + } else { + shopInfo.put("distance", null); + shopInfo.put("distanceInMeters", null); + } + + result.add(shopInfo); + } + + return AjaxResult.success("获取成功", result); + + } catch (Exception e) { + logger.error("获取店铺信息失败: {}", e.getMessage(), e); + return AjaxResult.error("获取店铺信息失败: " + e.getMessage()); + } + } }