zhangchen 1 сар өмнө
parent
commit
e17a200800

+ 9 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreInfoVo.java

@@ -75,6 +75,12 @@ public class StoreInfoVo extends StoreInfo {
     @ApiModelProperty(value = "门店坐标纬度")
     private String storePositionLatitude;
 
+    @ApiModelProperty(value = "门店经度")
+    private String longitude;
+
+    @ApiModelProperty(value = "门店纬度")
+    private String latitude;
+
     @ApiModelProperty(value = "token")
     private String token;
 
@@ -145,6 +151,9 @@ public class StoreInfoVo extends StoreInfo {
     @ApiModelProperty(value = "最近地铁站距离")
     private double distance2;
 
+    @ApiModelProperty(value = "门店位置/地址(与 getClientStoreDetail 一致,即门店地址)")
+    private String storeLocation;
+
     @ApiModelProperty(value = "是否收藏")
     private Integer collection;
 

+ 11 - 5
alien-store/src/main/java/shop/alien/store/controller/UserReservationController.java

@@ -227,16 +227,22 @@ public class UserReservationController {
     /**
      * 根据订单ID查询详情:门店信息、预订信息、定桌信息
      */
-    @ApiOperation("根据订单ID查询详情(门店+预订+定桌)")
+    @ApiOperation("根据订单ID查询详情(门店+预订+定桌,门店信息含 distance、distance2、subwayName、storeLocation)")
     @ApiOperationSupport(order = 11)
-    @ApiImplicitParam(name = "orderId", value = "预订订单ID(user_reservation_order.id)", dataType = "Integer", paramType = "query", required = true)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "orderId", value = "预订订单ID(user_reservation_order.id)", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "jingdu", value = "经度(可选,与 weidu 同时传入时返回用户到门店距离)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "weidu", value = "纬度(可选)", dataType = "String", paramType = "query")
+    })
     @GetMapping("/orderDetail")
-    public R<ReservationOrderDetailVo> orderDetail(@RequestParam Integer orderId) {
-        log.info("UserReservationController.orderDetail?orderId={}", orderId);
+    public R<ReservationOrderDetailVo> orderDetail(@RequestParam Integer orderId,
+                                                    @RequestParam(required = false) String jingdu,
+                                                    @RequestParam(required = false) String weidu) {
+        log.info("UserReservationController.orderDetail?orderId={},jingdu={},weidu={}", orderId, jingdu, weidu);
         if (orderId == null) {
             return R.fail("订单ID不能为空");
         }
-        ReservationOrderDetailVo vo = userReservationService.getOrderDetailByOrderId(orderId);
+        ReservationOrderDetailVo vo = userReservationService.getOrderDetailByOrderId(orderId, jingdu, weidu);
         if (vo == null) {
             return R.fail("订单不存在");
         }

+ 11 - 0
alien-store/src/main/java/shop/alien/store/service/StoreInfoService.java

@@ -449,6 +449,17 @@ public interface StoreInfoService extends IService<StoreInfo> {
     StoreInfoVo getClientStoreDetail(String storeId, String userId, String jingdu, String weidu);
 
     /**
+     * 仅填充门店基础信息及距离相关字段(distance、distance2、subwayName、storeLocation),供预订订单详情等使用。
+     * 逻辑与 getClientStoreDetail 中对应部分一致。
+     *
+     * @param storeId 门店ID
+     * @param jingdu  经度(可选,与 weidu 同时传入时计算 distance)
+     * @param weidu   纬度(可选)
+     * @return StoreInfoVo 含基础门店信息及 distance/distance2/subwayName/storeLocation,无则 null
+     */
+    StoreInfoVo getStoreInfoVoWithDistanceFields(Integer storeId, String jingdu, String weidu);
+
+    /**
      * 获取店铺营业状态
      * 判断店铺当前是否在营业时间内,返回营业状态和营业时间信息
      *

+ 4 - 2
alien-store/src/main/java/shop/alien/store/service/UserReservationService.java

@@ -174,12 +174,14 @@ public interface UserReservationService extends IService<UserReservation> {
     void setReservationOrderPaymentTimeoutByOrderId(Integer orderId);
 
     /**
-     * 根据订单ID查询详情:门店信息、预订信息、定桌信息
+     * 根据订单ID查询详情:门店信息(含 distance、distance2、subwayName、storeLocation)、预订信息、定桌信息
      *
      * @param orderId 预订订单ID user_reservation_order.id
+     * @param jingdu  经度(可选,与 weidu 同时传入时返回用户到门店距离 distance)
+     * @param weidu   纬度(可选)
      * @return 详情 VO,订单不存在返回 null
      */
-    ReservationOrderDetailVo getOrderDetailByOrderId(Integer orderId);
+    ReservationOrderDetailVo getOrderDetailByOrderId(Integer orderId, String jingdu, String weidu);
 
     /**
      * 定时任务:将「预约结束时间已过」且「订单状态为待使用」的预订标记为已过期/未到店超时。

+ 56 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java

@@ -6163,6 +6163,62 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
     }
 
     @Override
+    public StoreInfoVo getStoreInfoVoWithDistanceFields(Integer storeId, String jingdu, String weidu) {
+        if (storeId == null) {
+            return null;
+        }
+        StoreInfo storeInfo = storeInfoMapper.selectById(storeId);
+        if (storeInfo == null) {
+            return null;
+        }
+        StoreInfoVo result = new StoreInfoVo();
+        BeanUtils.copyProperties(storeInfo, result);
+        String storePosition = result.getStorePosition();
+        if (StringUtils.isNotEmpty(storePosition) && storePosition.contains(",")) {
+            String[] pos = storePosition.split(",");
+            result.setStorePositionLongitude(pos[0]);
+            result.setStorePositionLatitude(pos[1]);
+            result.setLongitude(pos[0]);
+            result.setLatitude(pos[1]);
+        }
+        // 用户经纬度存在时设置与用户距离(与 getClientStoreDetail 一致)
+        if ((jingdu != null && !jingdu.isEmpty()) && (weidu != null && !weidu.isEmpty())) {
+            Double distance = storeInfoMapper.getStoreDistance(jingdu + "," + weidu, result.getId());
+            result.setDistance(distance != null ? distance : 0);
+        }
+        // 店铺到最近地铁站距离及地铁名(与 getClientStoreDetail 一致)
+        if (StringUtils.isNotEmpty(storePosition) && storePosition.contains(",")) {
+            String[] pos = storePosition.split(",");
+            JSONObject nearbySubway = gaoDeMapUtil.getNearbySubway(pos[0], pos[1]);
+            String subWayName = nearbySubway != null ? nearbySubway.getString("name") : null;
+            result.setSubwayName(subWayName);
+            String subWayJing = null;
+            String subWayWei = null;
+            if (nearbySubway != null && nearbySubway.getString("location") != null) {
+                String[] loc = nearbySubway.getString("location").split(",");
+                if (loc.length >= 2) {
+                    subWayJing = loc[0];
+                    subWayWei = loc[1];
+                }
+            }
+            if (subWayJing != null && !subWayJing.isEmpty() && subWayWei != null && !subWayWei.isEmpty()) {
+                double storeJing = Double.parseDouble(pos[0]);
+                double storeWei = Double.parseDouble(pos[1]);
+                double storeDistance2 = DistanceUtil.haversineCalculateDistance(Double.parseDouble(subWayJing), Double.parseDouble(subWayWei), storeJing, storeWei);
+                result.setDistance2(storeDistance2);
+            } else {
+                result.setDistance2(0);
+            }
+        } else {
+            result.setSubwayName(null);
+            result.setDistance2(0);
+        }
+        // 门店位置/地址(与 getClientStoreDetail 及 LifeUserStoreService 一致)
+        result.setStoreLocation(result.getStoreAddress());
+        return result;
+    }
+
+    @Override
     public StoreBusinessStatusVo getStoreBusinessStatus(String storeId) {
         log.info("StoreInfoServiceImpl.getStoreBusinessStatus?storeId={}", storeId);
         StoreBusinessStatusVo result = new StoreBusinessStatusVo();

+ 2 - 2
alien-store/src/main/java/shop/alien/store/service/impl/UserReservationServiceImpl.java

@@ -996,7 +996,7 @@ public class UserReservationServiceImpl extends ServiceImpl<UserReservationMappe
     }
 
     @Override
-    public ReservationOrderDetailVo getOrderDetailByOrderId(Integer orderId) {
+    public ReservationOrderDetailVo getOrderDetailByOrderId(Integer orderId, String jingdu, String weidu) {
         if (orderId == null) {
             return null;
         }
@@ -1008,7 +1008,7 @@ public class UserReservationServiceImpl extends ServiceImpl<UserReservationMappe
         vo.setOrder(order);
 
         if (order.getStoreId() != null) {
-            vo.setStoreInfo(storeInfoService.getById(order.getStoreId()));
+            vo.setStoreInfo(storeInfoService.getStoreInfoVoWithDistanceFields(order.getStoreId(), jingdu, weidu));
             vo.setStoreBookingSettings(storeBookingSettingsService.getByStoreId(order.getStoreId()));
         }
         if (order.getReservationId() != null) {

+ 3 - 3
alien-store/src/main/java/shop/alien/store/vo/ReservationOrderDetailVo.java

@@ -5,8 +5,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import shop.alien.entity.store.StoreBookingSettings;
-import shop.alien.entity.store.StoreInfo;
 import shop.alien.entity.store.UserReservationOrder;
+import shop.alien.entity.store.vo.StoreInfoVo;
 import shop.alien.entity.store.vo.UserReservationVo;
 
 import java.math.BigDecimal;
@@ -25,8 +25,8 @@ public class ReservationOrderDetailVo {
     @ApiModelProperty(value = "预订订单(user_reservation_order)")
     private UserReservationOrder order;
 
-    @ApiModelProperty(value = "门店信息")
-    private StoreInfo storeInfo;
+    @ApiModelProperty(value = "门店信息(含 distance、distance2、subwayName、storeLocation)")
+    private StoreInfoVo storeInfo;
 
     @ApiModelProperty(value = "门店预订设置(store_booking_settings)")
     private StoreBookingSettings storeBookingSettings;