Commit 70faf9ec4385d03d456e360f55492b40fa5f2364

Authored by shaofan
1 parent 2dfdc025

新增开放平台订单骑手位置查询接口,支持实时获取骑手经纬度与位置更新时间,完善相关服务与控制层逻辑

src/main/java/com/diligrp/rider/controller/OpenDeliveryOrderController.java
@@ -4,6 +4,7 @@ import com.diligrp.rider.common.result.Result; @@ -4,6 +4,7 @@ import com.diligrp.rider.common.result.Result;
4 import com.diligrp.rider.dto.DeliveryOrderCreateDTO; 4 import com.diligrp.rider.dto.DeliveryOrderCreateDTO;
5 import com.diligrp.rider.service.DeliveryOrderService; 5 import com.diligrp.rider.service.DeliveryOrderService;
6 import com.diligrp.rider.vo.DeliveryOrderCreateVO; 6 import com.diligrp.rider.vo.DeliveryOrderCreateVO;
  7 +import com.diligrp.rider.vo.OpenRiderLocationVO;
7 import jakarta.servlet.http.HttpServletRequest; 8 import jakarta.servlet.http.HttpServletRequest;
8 import jakarta.validation.Valid; 9 import jakarta.validation.Valid;
9 import lombok.RequiredArgsConstructor; 10 import lombok.RequiredArgsConstructor;
@@ -57,4 +58,16 @@ public class OpenDeliveryOrderController { @@ -57,4 +58,16 @@ public class OpenDeliveryOrderController {
57 deliveryOrderService.cancel(appKey, outOrderNo); 58 deliveryOrderService.cancel(appKey, outOrderNo);
58 return Result.success(); 59 return Result.success();
59 } 60 }
  61 +
  62 + /**
  63 + * 查询订单当前骑手的实时位置
  64 + * 仅在订单进行中(已接单/服务中)返回;接入方可轮询此接口绘制配送轨迹
  65 + */
  66 + @GetMapping("/rider-location")
  67 + public Result<OpenRiderLocationVO> riderLocation(
  68 + @RequestParam String outOrderNo,
  69 + HttpServletRequest request) {
  70 + String appKey = request.getHeader("X-App-Key");
  71 + return Result.success(deliveryOrderService.getRiderLocation(appKey, outOrderNo));
  72 + }
60 } 73 }
src/main/java/com/diligrp/rider/service/DeliveryOrderService.java
@@ -3,6 +3,7 @@ package com.diligrp.rider.service; @@ -3,6 +3,7 @@ package com.diligrp.rider.service;
3 import com.diligrp.rider.dto.DeliveryOrderCreateDTO; 3 import com.diligrp.rider.dto.DeliveryOrderCreateDTO;
4 import com.diligrp.rider.entity.Orders; 4 import com.diligrp.rider.entity.Orders;
5 import com.diligrp.rider.vo.DeliveryOrderCreateVO; 5 import com.diligrp.rider.vo.DeliveryOrderCreateVO;
  6 +import com.diligrp.rider.vo.OpenRiderLocationVO;
6 7
7 public interface DeliveryOrderService { 8 public interface DeliveryOrderService {
8 /** 9 /**
@@ -20,6 +21,12 @@ public interface DeliveryOrderService { @@ -20,6 +21,12 @@ public interface DeliveryOrderService {
20 /** 取消订单(仅 status=2 可取消) */ 21 /** 取消订单(仅 status=2 可取消) */
21 void cancel(String appKey, String outOrderNo); 22 void cancel(String appKey, String outOrderNo);
22 23
  24 + /**
  25 + * 查询订单当前承运骑手的实时位置(供接入方展示配送轨迹)
  26 + * 仅当订单 status=3 已接单 或 status=4 服务中时返回,其他状态抛业务异常
  27 + */
  28 + OpenRiderLocationVO getRiderLocation(String appKey, String outOrderNo);
  29 +
23 /** 后台查看配送订单详情 */ 30 /** 后台查看配送订单详情 */
24 DeliveryOrderCreateVO getAdminDetail(Orders order); 31 DeliveryOrderCreateVO getAdminDetail(Orders order);
25 32
src/main/java/com/diligrp/rider/service/RiderLocationService.java
1 package com.diligrp.rider.service; 1 package com.diligrp.rider.service;
2 2
3 import com.diligrp.rider.dto.LocationDTO; 3 import com.diligrp.rider.dto.LocationDTO;
  4 +import com.diligrp.rider.entity.RiderLocation;
4 import com.diligrp.rider.vo.AdminRiderDashboardVO; 5 import com.diligrp.rider.vo.AdminRiderDashboardVO;
5 import com.diligrp.rider.vo.AdminRiderLocationVO; 6 import com.diligrp.rider.vo.AdminRiderLocationVO;
6 import com.diligrp.rider.vo.NearbyRiderVO; 7 import com.diligrp.rider.vo.NearbyRiderVO;
@@ -15,6 +16,9 @@ public interface RiderLocationService { @@ -15,6 +16,9 @@ public interface RiderLocationService {
15 /** 获取骑手位置 */ 16 /** 获取骑手位置 */
16 LocationDTO getLocation(Long riderId); 17 LocationDTO getLocation(Long riderId);
17 18
  19 + /** 获取骑手最近一次位置记录(含更新时间),供 service 间内部调用 */
  20 + RiderLocation getLatestLocation(Long riderId);
  21 +
18 /** 查询商铺内最近活跃的骑手位置列表 */ 22 /** 查询商铺内最近活跃的骑手位置列表 */
19 List<AdminRiderLocationVO> listActiveByCity(Long cityId); 23 List<AdminRiderLocationVO> listActiveByCity(Long cityId);
20 24
src/main/java/com/diligrp/rider/service/impl/DeliveryOrderServiceImpl.java
@@ -9,6 +9,7 @@ import com.diligrp.rider.dto.DeliveryFeeCalcDTO; @@ -9,6 +9,7 @@ import com.diligrp.rider.dto.DeliveryFeeCalcDTO;
9 import com.diligrp.rider.dto.DeliveryOrderCreateDTO; 9 import com.diligrp.rider.dto.DeliveryOrderCreateDTO;
10 import com.diligrp.rider.entity.OpenApp; 10 import com.diligrp.rider.entity.OpenApp;
11 import com.diligrp.rider.entity.Orders; 11 import com.diligrp.rider.entity.Orders;
  12 +import com.diligrp.rider.entity.RiderLocation;
12 import com.diligrp.rider.mapper.OpenAppMapper; 13 import com.diligrp.rider.mapper.OpenAppMapper;
13 import com.diligrp.rider.mapper.OrdersMapper; 14 import com.diligrp.rider.mapper.OrdersMapper;
14 import com.diligrp.rider.service.DeliveryFeeService; 15 import com.diligrp.rider.service.DeliveryFeeService;
@@ -16,11 +17,13 @@ import com.diligrp.rider.service.DeliveryOrderService; @@ -16,11 +17,13 @@ import com.diligrp.rider.service.DeliveryOrderService;
16 import com.diligrp.rider.service.DispatchRuleService; 17 import com.diligrp.rider.service.DispatchRuleService;
17 import com.diligrp.rider.service.DispatchService; 18 import com.diligrp.rider.service.DispatchService;
18 import com.diligrp.rider.service.MerchantService; 19 import com.diligrp.rider.service.MerchantService;
  20 +import com.diligrp.rider.service.RiderLocationService;
19 import com.diligrp.rider.service.WebhookService; 21 import com.diligrp.rider.service.WebhookService;
20 import com.diligrp.rider.service.AdminMessageService; 22 import com.diligrp.rider.service.AdminMessageService;
21 import com.diligrp.rider.vo.DeliveryFeeResultVO; 23 import com.diligrp.rider.vo.DeliveryFeeResultVO;
22 import com.diligrp.rider.vo.DeliveryOrderCreateVO; 24 import com.diligrp.rider.vo.DeliveryOrderCreateVO;
23 import com.diligrp.rider.vo.DispatchRuleTemplateVO; 25 import com.diligrp.rider.vo.DispatchRuleTemplateVO;
  26 +import com.diligrp.rider.vo.OpenRiderLocationVO;
24 import lombok.RequiredArgsConstructor; 27 import lombok.RequiredArgsConstructor;
25 import lombok.extern.slf4j.Slf4j; 28 import lombok.extern.slf4j.Slf4j;
26 import org.springframework.stereotype.Service; 29 import org.springframework.stereotype.Service;
@@ -49,6 +52,7 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { @@ -49,6 +52,7 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService {
49 private final WebhookService webhookService; 52 private final WebhookService webhookService;
50 private final ObjectMapper objectMapper; 53 private final ObjectMapper objectMapper;
51 private final AdminMessageService adminMessageService; 54 private final AdminMessageService adminMessageService;
  55 + private final RiderLocationService riderLocationService;
52 56
53 @Override 57 @Override
54 @Transactional 58 @Transactional
@@ -209,6 +213,32 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { @@ -209,6 +213,32 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService {
209 } 213 }
210 214
211 @Override 215 @Override
  216 + public OpenRiderLocationVO getRiderLocation(String appKey, String outOrderNo) {
  217 + getApp(appKey);
  218 + Orders order = getOrderByOutNo(appKey, outOrderNo);
  219 + Integer status = order.getStatus();
  220 + if (status == null || (status != 3 && status != 4)) {
  221 + throw new BizException("订单当前状态无法获取骑手位置");
  222 + }
  223 + if (order.getRiderId() == null || order.getRiderId() <= 0) {
  224 + throw new BizException("订单尚未分配骑手");
  225 + }
  226 + OpenRiderLocationVO vo = new OpenRiderLocationVO();
  227 + vo.setOutOrderNo(order.getOutOrderNo());
  228 + vo.setStatus(status);
  229 + RiderLocation location = riderLocationService.getLatestLocation(order.getRiderId());
  230 + if (location != null) {
  231 + try {
  232 + vo.setLng(new BigDecimal(location.getLng()));
  233 + vo.setLat(new BigDecimal(location.getLat()));
  234 + } catch (Exception ignored) {
  235 + }
  236 + vo.setUpdateTime(location.getUpdateTime());
  237 + }
  238 + return vo;
  239 + }
  240 +
  241 + @Override
212 public DeliveryOrderCreateVO getAdminDetail(Orders order) { 242 public DeliveryOrderCreateVO getAdminDetail(Orders order) {
213 return toCreateVO(order, buildFeeVO(order)); 243 return toCreateVO(order, buildFeeVO(order));
214 } 244 }
src/main/java/com/diligrp/rider/service/impl/RiderLocationServiceImpl.java
@@ -83,6 +83,15 @@ public class RiderLocationServiceImpl implements RiderLocationService { @@ -83,6 +83,15 @@ public class RiderLocationServiceImpl implements RiderLocationService {
83 return dto; 83 return dto;
84 } 84 }
85 85
  86 + @Override
  87 + public RiderLocation getLatestLocation(Long riderId) {
  88 + if (riderId == null || riderId <= 0) {
  89 + return null;
  90 + }
  91 + return locationMapper.selectOne(new LambdaQueryWrapper<RiderLocation>()
  92 + .eq(RiderLocation::getUid, riderId));
  93 + }
  94 +
86 /** 95 /**
87 * 查询指定商铺最近活跃的骑手位置列表。 96 * 查询指定商铺最近活跃的骑手位置列表。
88 */ 97 */
src/main/java/com/diligrp/rider/vo/OpenRiderLocationVO.java 0 → 100644
  1 +package com.diligrp.rider.vo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.math.BigDecimal;
  6 +
  7 +/**
  8 + * 开放平台:订单维度的骑手实时位置
  9 + * 只在订单进行中(status=3 已接单 / 4 服务中)返回
  10 + * 骑手身份信息(姓名/手机)不对外暴露
  11 + */
  12 +@Data
  13 +public class OpenRiderLocationVO {
  14 + /** 外部业务系统订单号(回显) */
  15 + private String outOrderNo;
  16 + /** 订单状态:3=已接单 4=服务中 */
  17 + private Integer status;
  18 + /** 骑手位置经度,骑手尚未上报时为 null */
  19 + private BigDecimal lng;
  20 + /** 骑手位置纬度,骑手尚未上报时为 null */
  21 + private BigDecimal lat;
  22 + /** 位置最近一次上报时间(秒),骑手尚未上报时为 null */
  23 + private Long updateTime;
  24 +}