Commit 70faf9ec4385d03d456e360f55492b40fa5f2364
1 parent
2dfdc025
新增开放平台订单骑手位置查询接口,支持实时获取骑手经纬度与位置更新时间,完善相关服务与控制层逻辑
Showing
6 changed files
with
87 additions
and
0 deletions
src/main/java/com/diligrp/rider/controller/OpenDeliveryOrderController.java
| ... | ... | @@ -4,6 +4,7 @@ import com.diligrp.rider.common.result.Result; |
| 4 | 4 | import com.diligrp.rider.dto.DeliveryOrderCreateDTO; |
| 5 | 5 | import com.diligrp.rider.service.DeliveryOrderService; |
| 6 | 6 | import com.diligrp.rider.vo.DeliveryOrderCreateVO; |
| 7 | +import com.diligrp.rider.vo.OpenRiderLocationVO; | |
| 7 | 8 | import jakarta.servlet.http.HttpServletRequest; |
| 8 | 9 | import jakarta.validation.Valid; |
| 9 | 10 | import lombok.RequiredArgsConstructor; |
| ... | ... | @@ -57,4 +58,16 @@ public class OpenDeliveryOrderController { |
| 57 | 58 | deliveryOrderService.cancel(appKey, outOrderNo); |
| 58 | 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 | 3 | import com.diligrp.rider.dto.DeliveryOrderCreateDTO; |
| 4 | 4 | import com.diligrp.rider.entity.Orders; |
| 5 | 5 | import com.diligrp.rider.vo.DeliveryOrderCreateVO; |
| 6 | +import com.diligrp.rider.vo.OpenRiderLocationVO; | |
| 6 | 7 | |
| 7 | 8 | public interface DeliveryOrderService { |
| 8 | 9 | /** |
| ... | ... | @@ -20,6 +21,12 @@ public interface DeliveryOrderService { |
| 20 | 21 | /** 取消订单(仅 status=2 可取消) */ |
| 21 | 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 | 31 | DeliveryOrderCreateVO getAdminDetail(Orders order); |
| 25 | 32 | ... | ... |
src/main/java/com/diligrp/rider/service/RiderLocationService.java
| 1 | 1 | package com.diligrp.rider.service; |
| 2 | 2 | |
| 3 | 3 | import com.diligrp.rider.dto.LocationDTO; |
| 4 | +import com.diligrp.rider.entity.RiderLocation; | |
| 4 | 5 | import com.diligrp.rider.vo.AdminRiderDashboardVO; |
| 5 | 6 | import com.diligrp.rider.vo.AdminRiderLocationVO; |
| 6 | 7 | import com.diligrp.rider.vo.NearbyRiderVO; |
| ... | ... | @@ -15,6 +16,9 @@ public interface RiderLocationService { |
| 15 | 16 | /** 获取骑手位置 */ |
| 16 | 17 | LocationDTO getLocation(Long riderId); |
| 17 | 18 | |
| 19 | + /** 获取骑手最近一次位置记录(含更新时间),供 service 间内部调用 */ | |
| 20 | + RiderLocation getLatestLocation(Long riderId); | |
| 21 | + | |
| 18 | 22 | /** 查询商铺内最近活跃的骑手位置列表 */ |
| 19 | 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 | 9 | import com.diligrp.rider.dto.DeliveryOrderCreateDTO; |
| 10 | 10 | import com.diligrp.rider.entity.OpenApp; |
| 11 | 11 | import com.diligrp.rider.entity.Orders; |
| 12 | +import com.diligrp.rider.entity.RiderLocation; | |
| 12 | 13 | import com.diligrp.rider.mapper.OpenAppMapper; |
| 13 | 14 | import com.diligrp.rider.mapper.OrdersMapper; |
| 14 | 15 | import com.diligrp.rider.service.DeliveryFeeService; |
| ... | ... | @@ -16,11 +17,13 @@ import com.diligrp.rider.service.DeliveryOrderService; |
| 16 | 17 | import com.diligrp.rider.service.DispatchRuleService; |
| 17 | 18 | import com.diligrp.rider.service.DispatchService; |
| 18 | 19 | import com.diligrp.rider.service.MerchantService; |
| 20 | +import com.diligrp.rider.service.RiderLocationService; | |
| 19 | 21 | import com.diligrp.rider.service.WebhookService; |
| 20 | 22 | import com.diligrp.rider.service.AdminMessageService; |
| 21 | 23 | import com.diligrp.rider.vo.DeliveryFeeResultVO; |
| 22 | 24 | import com.diligrp.rider.vo.DeliveryOrderCreateVO; |
| 23 | 25 | import com.diligrp.rider.vo.DispatchRuleTemplateVO; |
| 26 | +import com.diligrp.rider.vo.OpenRiderLocationVO; | |
| 24 | 27 | import lombok.RequiredArgsConstructor; |
| 25 | 28 | import lombok.extern.slf4j.Slf4j; |
| 26 | 29 | import org.springframework.stereotype.Service; |
| ... | ... | @@ -49,6 +52,7 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { |
| 49 | 52 | private final WebhookService webhookService; |
| 50 | 53 | private final ObjectMapper objectMapper; |
| 51 | 54 | private final AdminMessageService adminMessageService; |
| 55 | + private final RiderLocationService riderLocationService; | |
| 52 | 56 | |
| 53 | 57 | @Override |
| 54 | 58 | @Transactional |
| ... | ... | @@ -209,6 +213,32 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { |
| 209 | 213 | } |
| 210 | 214 | |
| 211 | 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 | 242 | public DeliveryOrderCreateVO getAdminDetail(Orders order) { |
| 213 | 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 | 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 | +} | ... | ... |