瀏覽代碼

036 组详情接收骑手经纬度并返回逐店juli距离

/groups/{groupId} 增加可选 longitude/latitude 参数,传入后 members[].juli 按
骑手定位到订单坐标计算(同列表口径),不传保持 null;经纬度只传其一时拒绝。
列表接口本就支持该参数,两端现在口径一致;接入文档 6.3 同步。
qmj 1 天之前
父節點
當前提交
5fa924e8c6

+ 6 - 2
ruoyi-admin/src/main/java/com/ruoyi/app/order/MultiStoreCheckoutQueryController.java

@@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /** 新版 App 的组合只读入口;身份从 token 获取,不能由请求参数指定。 */
@@ -67,10 +68,13 @@ public class MultiStoreCheckoutQueryController extends BaseController {
     @GetMapping("/groups/{groupId}")
     public AjaxResult groupDetail(@RequestHeader String token,
                                   @RequestHeader(value = MultiStoreCheckoutAppCapability.HEADER, required = false)
-                                  String capability, @PathVariable Long groupId) {
+                                  String capability, @PathVariable Long groupId,
+                                  @RequestParam(required = false) BigDecimal longitude,
+                                  @RequestParam(required = false) BigDecimal latitude) {
         if (!MultiStoreCheckoutAppCapability.supports(capability))
             return MultiStoreCheckoutAppCapability.upgradeRequired();
-        return AjaxResult.success(queries.groupDetail(groupId, identity(token), newTaskDistanceLimitMeters()));
+        return AjaxResult.success(queries.groupDetail(groupId, identity(token), newTaskDistanceLimitMeters(),
+                longitude, latitude));
     }
 
     private Long identity(String token) {

+ 4 - 3
ruoyi-admin/src/main/java/com/ruoyi/app/order/MultiStoreCheckoutQueryService.java

@@ -96,11 +96,12 @@ public class MultiStoreCheckoutQueryService {
         return result;
     }
 
-    public MultiStoreCardView groupDetail(Long groupId, Long riderId, Long limitMeters) {
-        if (groupId == null || riderId == null) throw invalid();
+    public MultiStoreCardView groupDetail(Long groupId, Long riderId, Long limitMeters,
+                                          BigDecimal longitude, BigDecimal latitude) {
+        if (groupId == null || riderId == null || (longitude == null) != (latitude == null)) throw invalid();
         CheckoutCardRow row = mapper.selectGroupForRider(groupId, riderId, limitMeters);
         if (row == null) throw invalid();
-        return assemble(List.of(row), null, null).get(0);
+        return assemble(List.of(row), longitude, latitude).get(0);
     }
 
     private List<MultiStoreCardView> assemble(List<CheckoutCardRow> rows, BigDecimal longitude,

+ 1 - 1
ruoyi-admin/src/test/java/com/ruoyi/app/order/MultiStoreCheckoutQueryControllerTest.java

@@ -21,7 +21,7 @@ class MultiStoreCheckoutQueryControllerTest {
             messages.when(() -> MessageUtils.message("multi.store.checkout.upgrade.required"))
                     .thenReturn("upgrade");
             AjaxResult batch = controller.batchDetail(JwtUtil.token("21", "user"), null, 9L);
-            AjaxResult group = controller.groupDetail(JwtUtil.token("33", "rider"), null, 7L);
+            AjaxResult group = controller.groupDetail(JwtUtil.token("33", "rider"), null, 7L, null, null);
             assertEquals("UPGRADE_REQUIRED", batch.get("errorCode"));
             assertEquals("UPGRADE_REQUIRED", group.get("errorCode"));
             verifyNoInteractions(queries);

+ 24 - 4
ruoyi-admin/src/test/java/com/ruoyi/app/order/MultiStoreCheckoutQueryServiceTest.java

@@ -72,7 +72,7 @@ class MultiStoreCheckoutQueryServiceTest {
         when(mapper.selectMembersForBatches(List.of(7L))).thenReturn(List.of(
                 member(7L, 71L, 3L, "ONLINE_PAID", 100, 100), unpicked));
 
-        MultiStoreCardView detail = service.groupDetail(4L, 33L, 1000L);
+        MultiStoreCardView detail = service.groupDetail(4L, 33L, 1000L, null, null);
 
         assertEquals("toPickup", detail.getPrimaryTab());
         assertEquals(1, detail.getPickedUpCount());
@@ -90,7 +90,7 @@ class MultiStoreCheckoutQueryServiceTest {
         when(mapper.selectMembersForBatches(List.of(7L)))
                 .thenReturn(List.of(member(7L, 71L, 3L, "ONLINE_PAID", 100, 100)));
 
-        assertEquals("completed", service.groupDetail(4L, 33L, 1000L).getPrimaryTab());
+        assertEquals("completed", service.groupDetail(4L, 33L, 1000L, null, null).getPrimaryTab());
 
         CheckoutCardRow cancelled = card("GROUP", 5L, "GROUP:5");
         cancelled.setBatchId(8L);
@@ -100,7 +100,7 @@ class MultiStoreCheckoutQueryServiceTest {
         cancelledMember.setState(4L);
         when(mapper.selectMembersForBatches(List.of(8L))).thenReturn(List.of(cancelledMember));
 
-        assertEquals("cancelled", service.groupDetail(5L, 33L, 1000L).getPrimaryTab());
+        assertEquals("cancelled", service.groupDetail(5L, 33L, 1000L, null, null).getPrimaryTab());
     }
 
     @Test
@@ -222,7 +222,7 @@ class MultiStoreCheckoutQueryServiceTest {
         when(ordinaryOrders.listByIds(List.of(71L))).thenReturn(List.of(order));
 
         var detail = new com.fasterxml.jackson.databind.ObjectMapper().valueToTree(
-                service.groupDetail(4L, 33L, 1000L));
+                service.groupDetail(4L, 33L, 1000L, null, null));
         var member = detail.path("members").get(0);
         assertTrue(member.has("juli"));
         assertTrue(member.path("juli").isNull()); // 与旧普通订单详情一样,未传定位时为空。
@@ -230,6 +230,26 @@ class MultiStoreCheckoutQueryServiceTest {
         assertEquals(5.0, member.path("legacyOrder").path("jvli").asDouble());
     }
 
+    @Test
+    void groupDetailComputesMemberJuliFromRequestCoords() {
+        CheckoutCardRow group = card("GROUP", 4L, "GROUP:4");
+        group.setBatchId(7L);
+        group.setGroupStatus("ACCEPTED");
+        when(mapper.selectGroupForRider(4L, 33L, 1000L)).thenReturn(group);
+        when(mapper.selectMembersForBatches(List.of(7L)))
+                .thenReturn(List.of(member(7L, 71L, 1L, "COD_CONFIRMED", 80, 0)));
+        PosOrder order = new PosOrder();
+        order.setId(71L);
+        order.setLongitude(new BigDecimal("108.30"));
+        order.setLatitude(new BigDecimal("22.90"));
+        when(ordinaryOrders.listByIds(List.of(71L))).thenReturn(List.of(order));
+
+        MultiStoreCardView detail = service.groupDetail(4L, 33L, 1000L,
+                new BigDecimal("108.30"), new BigDecimal("22.90"));
+
+        assertEquals(0.0, detail.getMembers().get(0).getJuli());
+    }
+
     @Test
     void invalidPaginationIsRejectedBeforeQuery() {
         try (org.mockito.MockedStatic<com.ruoyi.common.utils.MessageUtils> messages =

+ 2 - 2
specs/036-multi-store-checkout/frontend-app-integration.md

@@ -435,10 +435,10 @@ GET /system/multiStoreCheckout/rider/taskCount?longitude=121.5&latitude=25.03
 ### 6.3 组详情
 
 ```http
-GET /system/multiStoreCheckout/groups/{groupId}
+GET /system/multiStoreCheckout/groups/{groupId}?longitude=121.5&latitude=25.03
 ```
 
-路径参数 `groupId`。响应 `data` 为组卡对象(见 7.1/7.2),关键字段:
+路径参数 `groupId`;可选 `longitude`/`latitude`(骑手定位,传入后 `members[].juli` 按定位计算,不传为 null)。响应 `data` 为组卡对象(见 7.1/7.2),关键字段:
 
 - `groupStatus`:`WAITING` 待抢 / `ACCEPTED` 已接 / `FINISHED` 已结束 / `CANCELLED` 已取消。
 - `version`:整组接单的乐观锁版本。